Boutons
Chaque bouton de Hodi vient de l'un de ces quatre composants. Un plugin qui les utilise a donc des boutons de la même hauteur, de la même couleur et avec le même survol que le reste de l'app, dans les trois thèmes.
Button
Le bouton avec un texte, et au besoin une icône Lucide avant ce texte. Il fait 44 px de haut, ou 34 px avec compact. Sur un écran, le bouton de l'action principale prend le look primary, et un bouton qui efface prend le look danger.
import { Button } from 'hodi:sdk'
import { Check } from 'lucide-react'
<Button
look="primary"
icon={Check}
onClick={save}
>
Enregistrer
</Button>childrenReactNodeLe texte du bouton.
look?'neutral' | 'primary' | 'danger' | 'ai'La couleur du bouton : neutral par défaut, primary pour l'action principale, danger pour effacer, ai pour l'IA.
icon?ComponentTypeUne icône Lucide, affichée à 16 px avant le texte.
busy?booleanLe bouton attend le serveur : son icône devient un rond qui tourne, et il ne se presse plus.
compact?booleanLe bouton fait 34 px de haut, pour tenir dans une ligne ou un en-tête.
wide?booleanLe bouton prend toute la largeur de son parent.
href?stringFait du bouton un lien vers cette adresse. Une adresse de Hodi vient de usePluginLinks().
external?booleanAvec href : le lien s'ouvre dans un nouvel onglet.
…ButtonHTMLAttributesTout ce qu'un <button> accepte, comme onClick ou disabled.
RoundButton
Le bouton rond, avec une seule icône et sans texte. Son label dit ce que fait le bouton : les lecteurs d'écran le lisent, et il s'affiche au survol.
import { RoundButton } from 'hodi:sdk'
import { Pencil } from 'lucide-react'
<RoundButton
icon={Pencil}
label="Modifier"
size={44}
onClick={edit}
/>iconLucideIconL'icône du bouton, une icône Lucide.
labelstringCe que fait le bouton, pour les lecteurs d'écran et au survol.
size?28 | 34 | 38 | 44Le diamètre du bouton, en px : 28 dans une carte, 34 dans un en-tête, 38 dans une ligne de réglage sur un téléphone, 44 pour un bouton qu'on touche du doigt.
variant?'default' | 'on' | 'danger' | 'primary' | 'ai' | 'glass' | 'image'La couleur du bouton. on le montre allumé, comme un filtre choisi. glass et image servent pour un bouton posé sur une photo.
filled?booleanRemplit l'icône, par exemple pour montrer qu'un article est enregistré.
busy?booleanFait tourner l'icône, qui doit donc être une icône de chargement.
href?stringFait du bouton un lien vers cette adresse.
external?booleanAvec href : le lien s'ouvre dans un nouvel onglet.
AiButton
Le bouton violet. C'est le seul moyen pour un plugin de poser une question à l'IA du foyer. Chaque clic lance une fois l'action du même nom dans aiActions, côté serveur, et renvoie sa réponse à onAnswer.
Hodi cache ce bouton pour un ado, un enfant ou un foyer sans IA. Il le grise quand le foyer a atteint sa limite du jour. Le contexte serveur explique le côté serveur.
import { AiButton } from 'hodi:sdk'
<AiButton
action="summary"
input={{ id: article.id }}
onAnswer={answer => setSummary(String(answer))}
>
Résumer
</AiButton>actionstringLe nom de l'action à lancer, tel qu'il est écrit dans aiActions de la partie serveur.
input?unknownLa valeur que l'action reçoit dans request.input, 16 Ko de JSON au plus.
onAnswer(answer: unknown) => voidReçoit ce que l'action a répondu.
onError?(error: AiButtonError) => voidAppelé quand la question échoue, à la place du toast d'erreur de Hodi. L'erreur vaut unavailable, off, limited, refused ou failed.
childrenReactNodeLe texte du bouton, un verbe comme Résumer ou Traduire.
compact?booleanLe bouton fait 34 px de haut au lieu de 44.
wide?booleanLe bouton prend toute la largeur de son parent.
disabled?booleanLe bouton est grisé et ne se presse pas.
ReaderButton
Le petit bouton qui se place au bout d'un article, à côté de Lire l'original. C'est le bouton à utiliser dans l'emplacement readerAction.
import { ReaderButton } from 'hodi:sdk'
import { Flag } from 'lucide-react'
<ReaderButton icon={<Flag size={12} />} onClick={report}>Signaler</ReaderButton>childrenReactNodeLe texte du bouton.
onClick() => voidCe que fait un clic sur le bouton.
icon?ReactNodeUne icône Lucide à 12 px, affichée avant le texte.
done?booleanMontre que l'action est déjà faite pour cet article.
label?stringUn nom plus complet que le texte, pour les lecteurs d'écran.