Aller au contenu principal

Composants

Les composants se rendent avec la syntaxe Symfony UX Twig Component :

API publique

La documentation référence les composants Twig à utiliser directement. Évitez les include de templates internes : les sous-composants publics couvrent les cas de composition maintenables.

<twig:dsfr:button label="Enregistrer" />

Passez les tableaux avec la syntaxe Twig : :

<twig:dsfr:breadcrumb :items="[
{label: 'Accueil', href: '/'},
{label: 'Dossier', current: true}
]" />

Les composants composables utilisent leurs sous-composants. N'utilisez pas de blocs Twig nommés comme footer, rows, panels, image ou options : ces slots ne font pas partie de l'API publique.

Catalogue détaillé

La section Catalogue des composants contient une page par composant DSFR disponible dans le bundle, avec les composants Twig à utiliser, un exemple, les règles d’usage importantes et un tableau de configuration.

Règles d'intégration

  • Utilisez uniquement les composants Twig UX publics : pas de macro, pas d'include de template interne.
  • Passez les collections avec : pour conserver les tableaux PHP/Twig.
  • Les composants composables se construisent avec leurs sous-composants : carte, modale, tableau, onglets, en-tête, pied de page et navigation.
  • Les attributs HTML non consommés sont transmis au nœud racine quand le template le permet ; utilisez-les pour data-*, aria-*, class et id spécifiques à votre application.
  • Gardez les libellés accessibles explicites : ariaLabel, label, title, caption, legend et alternatives d'image ne doivent pas être vides quand ils portent l'information.

Community

Ces composants sont utilisables sans licence Pro :

  • dsfr:button
  • dsfr:link
  • dsfr:tag
  • dsfr:badge
  • dsfr:alert
  • dsfr:highlight
  • dsfr:breadcrumb
  • dsfr:pagination
  • dsfr:stepper
  • dsfr:skip:links
  • dsfr:container
  • dsfr:grid:row
  • dsfr:grid:col

Exemples rapides

Boutons

<twig:dsfr:button label="Primaire" />
<twig:dsfr:button label="Secondaire" variant="secondary" />
<twig:dsfr:button label="Lien" href="/tableau-de-bord" />
<twig:dsfr:button label="Ajouter" icon="fr-icon-add-line" />
<twig:dsfr:button label="Favori" icon="fr-icon-star-line" iconOnly />

Un bouton avec href rend un lien <a class="fr-btn">. Sans href, il rend un <button type="button">.

Groupes de boutons

<twig:dsfr:button:group inline iconPlace="left">
<twig:dsfr:button label="Enregistrer" icon="fr-icon-save-line" />
<twig:dsfr:button label="Annuler" variant="secondary" />
</twig:dsfr:button:group>

Quand des boutons avec icône sont dans un groupe DSFR, définissez iconPlace sur le groupe pour conserver le libellé visible.

Feedback

<twig:dsfr:alert title="Succès" text="La demande est enregistrée." type="success" />
<twig:dsfr:badge label="Nouveau" type="new" />
<twig:dsfr:highlight text="Information importante." accent="blue-cumulus" />
<twig:dsfr:pagination currentPage="2" totalPages="8" urlPattern="/page/%d" />
<twig:dsfr:stepper title="Informations" currentStep="2" stepCount="4" nextStep="Validation" />

Choisir un composant

Besoin développeurComposant à utiliser
Structurer une page ou un dashboarddsfr:container, dsfr:grid:row, dsfr:grid:col
Déclencher une actiondsfr:button ou dsfr:button:group
Naviguer vers une pagedsfr:link, dsfr:breadcrumb, dsfr:pagination, dsfr:nav
Afficher un statutdsfr:badge, dsfr:alert, dsfr:notice
Collecter une saisiedsfr:input, dsfr:select, dsfr:checkbox, dsfr:radio, dsfr:toggle
Montrer un contenu richedsfr:card, dsfr:tile, dsfr:table, dsfr:tabs, dsfr:accordion
Ouvrir une surcouchedsfr:modal avec dsfr:modal:title, content et footer
Gérer un consentementdsfr:consent et dsfr:consent:placeholder

Support rapide

Problème courantVérification
Un composant Pro ne s'affiche pas en productionVérifiez la licence avec php bin/console dsfr:license:validate.
Un menu, une modale ou un accordéon ne s'ouvre pasVérifiez que le JavaScript DSFR est chargé et que id, aria-controls et les cibles existent.
Les props tableau ne sont pas luesUtilisez le préfixe Twig : : :items="[]", :links="[]", :options="[]".
Une option booléenne ne produit rienUtilisez dismissible, expanded, checked ou disabled sans valeur, ou passez une vraie valeur booléenne.
Le rendu casse la mise en pageCommencez par dsfr:container, puis dsfr:grid:row gutters, puis des colonnes responsives.
Une erreur d'accessibilité apparaît dans le profilerCorrigez d'abord les titres, caption, legend, alternatives d'image et relations aria-*.

Pro

Les composants non listés dans la section Community sont en Pro. En environnement local, ils restent visibles pour développer. En production, une licence valide est requise.

Composition recommandée

<twig:dsfr:modal id="example-modal">
<twig:dsfr:modal:content>
<twig:dsfr:modal:title modalId="example-modal">Confirmer l'action</twig:dsfr:modal:title>
<p>Le contenu de la modale reste dans le composant de contenu.</p>
</twig:dsfr:modal:content>
<twig:dsfr:modal:footer>
<twig:dsfr:button label="Confirmer" type="button" />
<twig:dsfr:button label="Annuler" variant="secondary" type="button" />
</twig:dsfr:modal:footer>
</twig:dsfr:modal>
<twig:dsfr:table id="agents-table" caption="Agents" bordered>
<twig:dsfr:table:head>
<twig:dsfr:table:row>
<twig:dsfr:table:head:cell>Nom</twig:dsfr:table:head:cell>
<twig:dsfr:table:head:cell>Statut</twig:dsfr:table:head:cell>
</twig:dsfr:table:row>
</twig:dsfr:table:head>
<twig:dsfr:table:body>
<twig:dsfr:table:row>
<twig:dsfr:table:cell>Alice Martin</twig:dsfr:table:cell>
<twig:dsfr:table:cell>Actif</twig:dsfr:table:cell>
</twig:dsfr:table:row>
</twig:dsfr:table:body>
</twig:dsfr:table>

Catalogue DSFR

DSFRComposant Twig
Accordéondsfr:accordion, dsfr:accordion:group
Ajout de fichierdsfr:upload
Alertedsfr:alert
Badgedsfr:badge, dsfr:badge:group
Bandeau d'information importantedsfr:notice
Barre de recherchedsfr:search:bar
Bloc marquedsfr:logo
Boutondsfr:button, dsfr:button:group
Bouton FranceConnectdsfr:france:connect
Bouton radiodsfr:radio
Cartedsfr:card, dsfr:card:header, dsfr:card:body, dsfr:card:content, dsfr:card:title, dsfr:card:description, dsfr:card:footer
Case à cocherdsfr:checkbox
Champ de saisiedsfr:input, dsfr:textarea
Citationdsfr:quote
Contenu médiasdsfr:media:content
Contrôle segmentédsfr:segmented
Curseurdsfr:range
En-têtedsfr:header, dsfr:header:brand, dsfr:header:tools
Fil d'Arianedsfr:breadcrumb, dsfr:breadcrumb:item
FormulaireTypes Symfony Dsfr*Type et thème @Dsfr/form/dsfr_form_theme.html.twig
Gestionnaire de consentementdsfr:consent, dsfr:consent:placeholder
Grille et conteneurdsfr:container, dsfr:grid:row, dsfr:grid:col
Indicateur d’étapesdsfr:stepper
Infobulledsfr:tooltip
Interrupteurdsfr:toggle, dsfr:toggle:group
Lettre d'information et réseaux sociauxdsfr:follow
Liendsfr:link, dsfr:links:group
Liens d'évitementdsfr:skip:links
Liste déroulantedsfr:select
Liste déroulante richedsfr:combobox
Menu déroulantdsfr:dropdown
Menu latéraldsfr:sidemenu
Mise en avantdsfr:callout
Mise en exerguedsfr:highlight
Modaledsfr:modal, dsfr:modal:title, dsfr:modal:content, dsfr:modal:footer
Mot de passedsfr:password
Navigation principaledsfr:nav, dsfr:nav:item, dsfr:nav:menu, dsfr:nav:mega
Navigation tertiairedsfr:tabnav
Ongletdsfr:tabs, dsfr:tabs:list, dsfr:tabs:tab, dsfr:tabs:panel
Paginationdsfr:pagination
Paramètres d'affichagedsfr:display
Partagedsfr:share
Pied de pagedsfr:footer, dsfr:footer:top, dsfr:footer:brand, dsfr:footer:content, dsfr:footer:partners, dsfr:footer:bottom
Sélecteur de languesdsfr:translate
Sommairedsfr:summary
Tableaudsfr:table, dsfr:table:head, dsfr:table:body, dsfr:table:row, dsfr:table:cell, dsfr:table:head:cell
Tagdsfr:tag, dsfr:tag:group
Téléchargement de fichierdsfr:download
Transcriptiondsfr:transcription
Tuiledsfr:tile
Zone d’expression visuelledsfr:composition

Exemples utiles

<twig:dsfr:container>
<twig:dsfr:grid:row gutters>
<twig:dsfr:grid:col cols="12" md="6">Colonne gauche</twig:dsfr:grid:col>
<twig:dsfr:grid:col cols="12" md="6">Colonne droite</twig:dsfr:grid:col>
</twig:dsfr:grid:row>
</twig:dsfr:container>

<twig:dsfr:upload id="document" label="Ajouter un justificatif" name="document" />
<twig:dsfr:password id="password" label="Mot de passe" name="password" />
<twig:dsfr:range id="progress" label="Avancement" min="0" max="100" value="40" />
<twig:dsfr:segmented id="period" legend="Période" name="period" :options="[
{value: 'day', label: 'Jour', checked: true},
{value: 'week', label: 'Semaine'}
]" />
<twig:dsfr:sidemenu title="Documentation" :items="[
{label: 'Composants', href: '/docs/components', active: true}
]" />
<twig:dsfr:summary :links="[
{label: 'Installation', href: '#installation'}
]" />
<twig:dsfr:download title="Télécharger le dossier" href="/files/dossier.pdf" detail="PDF - 240 Ko" />