Champ
Le champ de saisie est l'élément de base de tout formulaire. Il supporte différents types de données, des messages contextuels (helper, erreur) et une icône pour renforcer la lisibilité. Son état communique la disponibilité et la validité de la valeur saisie.
Types
Le champ accepte tous les types HTML natifs via la prop type.
Par défaut text. Utiliser le type approprié permet au navigateur
d'afficher le bon clavier sur mobile et d'activer les validations natives.
<twig:Field>
<twig:Field:Label for="email">Email</twig:Field:Label>
<twig:Input id="email" type="email" placeholder="vous@sudalys.fr" />
</twig:Field>
États
Chaque état a un rôle précis : required signale une obligation,
helper guide l'utilisateur, error l'informe d'une valeur
invalide, disabled verrouille le champ. Ne jamais simuler ces états
par du CSS inline, toujours passer par les props.
Votre nom complet tel qu'il apparaîtra.
* rouge dans le label et pose required sur l'input.
error si les deux sont présents.
aria-invalid="true".
<twig:Field>
<twig:Field:Label for="nom">Nom</twig:Field:Label>
<twig:Input id="nom" />
<twig:Field:Description>Votre nom complet.</twig:Field:Description>
</twig:Field>
<twig:Field>
<twig:Field:Label for="email" required>Email</twig:Field:Label>
<twig:Input id="email" type="email" aria-invalid />
<twig:Field:Error>Email invalide.</twig:Field:Error>
</twig:Field>
<twig:Field>
<twig:Field:Label for="ref">Référence</twig:Field:Label>
<twig:Input id="ref" disabled />
</twig:Field>
Avec icône
Une icône peut être positionnée à gauche (défaut) ou à droite du champ.
Elle est purement décorative et marquée aria-hidden. Le padding
de l'input s'adapte automatiquement pour ne pas chevaucher le texte.
<twig:Field>
<twig:Field:Label for="search">Recherche</twig:Field:Label>
<twig:InputGroup>
<twig:InputGroup:Addon align="inline-start">{{ ux_icon('bi:search') }}</twig:InputGroup:Addon>
<twig:InputGroup:Input id="search" type="text" placeholder="Rechercher..." />
</twig:InputGroup>
</twig:Field>
Les icônes utilisent le système UX Icons. Préfixe bi: pour Bootstrap Icons,
material-symbols: pour Material. Voir la liste complète sur
ux.symfony.com/icons.
API du composant
Le champ est composé de plusieurs sous-composants autonomes. Chacun accepte
les attributs HTML natifs via {{ attributes }}.
<twig:Field>
| Prop | Type | Défaut | Valeurs acceptées | Description |
|---|---|---|---|---|
orientation |
string | 'vertical' |
vertical horizontal responsive |
Disposition du label et du champ. responsive bascule en horizontal à partir de @md. |
<twig:Field:Label>
| Prop | Type | Défaut | Valeurs acceptées | Description |
|---|---|---|---|---|
required |
bool | false |
true false |
Affiche un * rouge après le libellé. Passer aussi required sur twig:Input pour la validation native. |
for |
string | Identifiant de l'input | Attribut HTML for. Doit correspondre à l'id de twig:Input. |
<twig:Input>
| Attribut HTML | Type | Défaut | Description |
|---|---|---|---|
id |
string | Lie l'input à son label via for. Doit être unique dans la page. |
|
type |
string | 'text' |
Type HTML : text email password search tel… |
placeholder |
string | Texte indicatif affiché quand le champ est vide. | |
value |
string | Valeur pré-remplie. | |
disabled |
bool | Verrouille le champ. Fond grisé, curseur interdit. | |
required |
bool | Active la validation native du navigateur. | |
aria-invalid |
bool | Passe la bordure en rouge. À utiliser avec twig:Field:Error. |
Sous-composants de contenu
| Composant | Rôle | Props |
|---|---|---|
twig:Field:Description |
Message d'aide affiché sous le champ (texte secondaire). | |
twig:Field:Error |
Message d'erreur affiché sous le champ (texte rouge). À combiner avec aria-invalid sur l'input. |
<twig:InputGroup> champ avec icône
| Composant | Prop | Valeurs | Description |
|---|---|---|---|
twig:InputGroup |
Wrapper qui regroupe l'icône et l'input dans un même bloc avec focus ring unifié. | ||
twig:InputGroup:Addon |
align |
inline-start inline-end |
Conteneur pour l'icône. inline-start = gauche, inline-end = droite. |
twig:InputGroup:Input |
Input adapté au contexte de groupe (sans bordure propre, sans focus ring individuel). |
Do & Don't
-
Donner un
idunique àtwig:Inputet le lier viaforsurtwig:Field:Label -
Utiliser
twig:Field:Error+aria-invalidsur l'input après validation serveur ou client -
Ajouter
twig:Field:Descriptionpour préciser le format attendu -
Choisir le
typeHTML adapté à la donnée saisie -
Marquer
requiredsur le label et sur l'input pour tous les champs obligatoires
-
Écrire un
<input>manuellement avec des classesds-field__* -
Simuler l'état d'erreur avec une bordure en CSS inline au lieu de
aria-invalid -
Afficher
twig:Field:Descriptionettwig:Field:Errorsimultanément -
Omettre
twig:Field:Labelen comptant sur leplaceholderpour identifier le champ - Utiliser une icône pour véhiculer une information essentielle (invisible pour les lecteurs d'écran)
Règles
Toujours utiliser <twig:Field>. Ne jamais écrire
un <input> manuellement avec des classes ds-field__*.
Un label est obligatoire pour l'accessibilité. Le
placeholder seul n'est pas un substitut : il disparaît
dès que l'utilisateur commence à saisir.
twig:Field:Error doit toujours être accompagné d'un message
explicite expliquant pourquoi la valeur est invalide.
Ne jamais désactiver un champ sans expliquer à l'utilisateur
(via twig:Field:Description ou une info-bulle) pourquoi
il ne peut pas saisir.