Champs
Les champs où la personne tape ou choisit quelque chose. Ils ont la même hauteur qu'un bouton : un champ et un bouton posés côte à côte s'alignent.
TextField
Un champ de texte sur une ligne, en forme de pilule, avec une icône au début. Il n'a pas de titre visible : son aria-label le nomme pour les lecteurs d'écran.
Un champ refusé prend aria-invalid : sa bordure, son fond et son texte passent aux couleurs du danger. La raison va juste en dessous, dans un StatusLine en tone="error", alignée sur l'icône du champ.
import { TextField } from 'hodi:sdk'
import { Mail } from 'lucide-react'
<TextField
icon={Mail}
aria-label="E-mail"
placeholder="toi@exemple.be"
value={email}
onChange={e => setEmail(e.target.value)}
/>iconLucideIconL'icône au début du champ, une icône Lucide.
aria-labelstringLe nom du champ, pour les lecteurs d'écran.
onClear?() => voidPour une recherche : une croix ronde apparaît dès que le champ contient du texte, et un clic sur elle appelle cette fonction.
aria-invalid?booleanMet le champ aux couleurs du danger, quand ce qui est tapé a été refusé.
…InputHTMLAttributesTout ce qu'un <input> accepte : value, onChange, type, placeholder…
PasswordField
Un champ de mot de passe, avec un œil pour afficher ce qui est tapé. Pour un nouveau mot de passe, PasswordRing remplace le cadenas et montre sa force, et PasswordGauge se place sous le champ.
Trop court · Encore 2 caractères.
import { PasswordField, PasswordGauge, PasswordRing } from 'hodi:sdk'
<PasswordField
aria-label="Mot de passe"
value={password}
onChange={e => setPassword(e.target.value)}
lead={<PasswordRing password={password} />}
/>
<PasswordGauge password={password} />aria-labelstringLe nom du champ, pour les lecteurs d'écran.
icon?LucideIconL'icône au début du champ. C'est un cadenas par défaut.
invalid?booleanMet le champ aux couleurs du danger, quand le mot de passe a été refusé. La raison va dessous, dans un StatusLine, à la place de PasswordGauge.
lead?ReactNodeUn élément à la place de l'icône, comme un PasswordRing.
…InputHTMLAttributesTout ce qu'un <input> accepte, sauf type.
PasswordGauge
La ligne sous un nouveau mot de passe. Elle dit sa force et ce qui le rendrait plus fort, et disparaît dès qu'il est assez fort. PasswordRing prend la même prop.
passwordstringLe mot de passe tapé, dont la ligne mesure la force.
PinField
Un champ de code, avec une case par caractère. Dès que le dernier caractère est tapé, le code se vérifie tout seul, sans bouton.
import { PinField } from 'hodi:sdk'
<PinField
label="Code"
length={6}
value={code}
onChange={setCode}
onComplete={check}
align="start"
/>labelstringLe nom du champ, pour les lecteurs d'écran.
lengthnumberLe nombre de caractères du code : 8 pour les codes de J'ai un code, 6 pour une appli d'authentification.
valuestringCe qui est tapé jusqu'ici.
onChange(value: string) => voidAppelé à chaque caractère tapé ou effacé.
onComplete?(value: string) => voidAppelé quand le code est tapé en entier, pour le vérifier.
state?'idle' | 'wrong' | 'right'wrong met les cases en rouge, right les met en vert.
align?'center' | 'start'start aligne les cases à gauche, dans un formulaire. center les centre, quand le code a son propre écran.
masked?booleanMontre des points à la place des caractères.
characters?RegExpLes caractères acceptés. Par défaut, seulement les chiffres.
disabled?booleanLe champ est grisé et ne se remplit pas.
autoFocus?booleanPlace le curseur dans la première case dès l'affichage.
Toggle
L'interrupteur, pour un réglage qui s'allume ou s'éteint. Dans une page de réglages, il se place au bout d'une SettingRow.
import { Toggle } from 'hodi:sdk'
<Toggle
checked={morning}
label="Saluer le matin"
onChange={setMorning}
/>checkedbooleantrue quand l'interrupteur est allumé.
labelstringCe que l'interrupteur allume, pour les lecteurs d'écran.
onChange(checked: boolean) => voidAppelé à chaque bascule, avec le nouvel état.
disabled?booleanL'interrupteur est grisé et ne bascule pas.
Checkbox
Une case à cocher suivie d'une phrase, pour un accord, comme accepter des conditions.
import { Checkbox } from 'hodi:sdk'
<Checkbox checked={keep} onChange={setKeep}>Garder mes salutations</Checkbox>checkedbooleantrue quand la case est cochée.
onChange(checked: boolean) => voidAppelé à chaque clic, avec le nouvel état.
childrenReactNodeLa phrase à côté de la case.
disabled?booleanLa case est grisée et ne se coche pas.
AgeCheckbox
La case J'ai au moins 13 ans, suivie du texte que chaque plugin ajoute avec ageConsent. Tout formulaire qui crée un compte a cette case.
import { AgeCheckbox } from 'hodi:sdk'
<AgeCheckbox checked={adult} onChange={setAdult} />checkedbooleantrue quand la case est cochée.
onChange(checked: boolean) => voidAppelé à chaque clic, avec le nouvel état.
Segmented
Un choix entre quelques options, dans une pilule, comme Clair · Sombre · Système. Dans une page de réglages, il se passe à la prop choice d'une SettingRow.
import { Segmented } from 'hodi:sdk'
<Segmented
label="Moment"
value={moment}
options={[
{ value: 'morning', label: 'Matin' },
{ value: 'noon', label: 'Midi' },
{ value: 'evening', label: 'Soir' }
]}
onChange={setMoment}
/>labelstringLe nom du choix, pour les lecteurs d'écran.
valuestring | numberLa valeur de l'option choisie.
options{ value; label; title? }[]Les options, dans l'ordre. Chacune a une valeur et un texte ; son title s'affiche au survol.
onChange(value) => voidAppelé quand la personne choisit une option, avec sa valeur.
wide?booleanLe choix prend toute la largeur, partagée à parts égales entre les options.