Construit sur l’UI SDK 0.1.0-beta.1 de Vercel. Son API peut changer.
Color picker
Un sélecteur de couleur sur l’UI SDK de Vercel, avec une zone de saturation, des curseurs de teinte et d’alpha, des couleurs CSS saisies, des préréglages et une pipette.
- Composants de formulaire
- 15 parties
- 11 exemples
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-color-picker.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cnCopiez et collez le code suivant dans votre projet.
components/ui/ui-sdk-color-picker.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
UI SDK ajoute un peu de CSS dans une couche de cascade nommée ui-sdk. Déclarez cette couche en haut de votre feuille de style globale, au-dessus de l’import Tailwind, pour que vos classes l’emportent.
La valeur est une chaîne de couleur CSS. Toutes les parties modifient la même couleur, utilisez donc seulement celles dont vous avez besoin. ColorPickerArea et ColorPickerSlider affichent leur curseur pour vous. Nommez le sélecteur avec aria-label ou avec le libellé d’un champ qui l’entoure.
Affichez les parties sur place, sans popover, pour une page de réglages ou une barre latérale.
Un curseur avec channel="alpha" modifie l’opacité. Sa piste et l’échantillon dessinent un damier sous la couleur, pour qu’une couleur transparente paraisse transparente.
Avec space="oklch", ajoutez ColorPickerAreaCanvas pour peindre la zone. Les couleurs hors du gamut de l’écran restent vides, et un curseur glissé là se cale sur la couleur la plus proche à l’intérieur quand vous lâchez.
ColorPickerSwatches est un seul arrêt de tabulation avec les flèches entre les préréglages, et un préréglage reste sélectionné quelle que soit l’écriture de la valeur. ColorPickerChannelInput modifie un canal sous forme de nombre. La pipette se masque dans les navigateurs qui ne peuvent pas prélever à l’écran.
Mettez orientation="vertical" sur un curseur pour le placer à côté de la zone.
onValueChange s’exécute à chaque pas d’un glissement et onValueCommit une fois à la fin, enregistrez donc là. Un contrôleur issu de createColorPickerController() règle la couleur depuis n’importe où.
Un input caché envoie la valeur sous name, et la réinitialisation du formulaire revient à defaultValue.
Un sélecteur désactivé ne prend pas le focus, ne change pas et n’envoie rien.
Avec readOnly, les curseurs restent focalisables et la valeur est envoyée, mais glisser, les touches et la saisie ne touchent pas à la couleur.
UI SDK lit la direction de la page, donc la zone, les curseurs et les flèches sont inversés. Les inputs choisissent leur propre direction, ainsi une valeur hex se lit toujours de gauche à droite.
| Touche | Action |
|---|---|
| ←→↑↓ | Déplace un curseur d’un pas. Sur la zone, gauche et droite déplacent en largeur, haut et bas en hauteur. |
| Shift + arrow | Déplace de dix pas. |
| Page UpPage Down | Déplace d’un dixième de la plage, vers le haut de la zone ou le long d’un curseur. |
| HomeEnd | Va au début ou à la fin. |
| Enter | Lit le texte de l’input, ou choisit le préréglage qui a le focus. |
| Esc | Remet le texte de l’input à la valeur, ou ferme le popover. |
Aucun motif WAI-ARIA ne couvre un sélecteur de couleur, donc UI SDK le construit à partir de ceux qui existent. Le sélecteur est un groupe. Le curseur de la zone et chaque curseur de slider sont des sliders, et celui de la zone nomme ses deux canaux, comme « Saturation 76 %, Luminosité 96 % ». Les préréglages forment une listbox, et chaque préréglage et l’échantillon sont nommés par leur couleur, comme « bleu vif ».
Le déclencheur de l’exemple avec popover donne la couleur actuelle dans son nom. Les curseurs grossissent pendant le glissement seulement si l’animation est autorisée, et le damier, les anneaux et les contours de focus passent aux couleurs système en mode couleurs forcées.
Chaque partie enveloppe la partie UI SDK du même nom et accepte toutes ses props, y compris render et un className qui peut être une fonction de son état.
| Prop | Type | Par défaut |
|---|---|---|
value | string | – |
defaultValue | string | "black" |
onValueChangeS’exécute à chaque pas d’un glissement, chaque touche, couleur saisie ou préréglage. | (value: string, details: ChangeDetails) => void | – |
onValueCommitS’exécute une fois à la fin d’un glissement, d’une touche ou d’une couleur saisie. | (value: string, details: ChangeDetails) => void | – |
spaceLes canaux que modifient les parties. | "hsv" | "hsl" | "srgb" | "oklch" | "hsv" |
formatComment la valeur est écrite. Hex pour hsv, sinon la syntaxe CSS propre à l’espace. | ColorFormat | – |
gamut | "srgb" | "p3" | false | "srgb" |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerIssu de createColorPickerController(). | ColorPickerController | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="color-picker" | Ciblez la racine en CSS. |
data-disabled | Présent lorsque l’élément est désactivé. |
data-readonly | Présent en lecture seule. |
data-required | Présent lorsqu’elle est requise. |
data-out-of-gamut | Présent sur chaque partie tant qu’un glissement tient une couleur hors gamut. |
--color-picker-color | La couleur en CSS. Les curseurs et échantillons en sont remplis. |
| Prop | Type | Par défaut |
|---|---|---|
xLe canal en largeur. Saturation, rouge ou chroma, selon l’espace. | ColorChannel | – |
yLe canal en hauteur. Luminosité, clarté ou vert, selon l’espace. | ColorChannel | – |
children | ReactNode | <ColorPickerAreaThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="color-picker-area" | Pour cibler la zone en CSS. |
--color-area-background | Les dégradés qui dessinent la zone. Non défini quand un canvas la peint. |
--color-picker-radius | Le rayon des coins de la zone. Défini par ColorPickerContent pour des coins concentriques. |
| Attribut | Description |
|---|---|
data-slot="color-picker-area-thumb" | Pour cibler le bouton du curseur en CSS. |
--area-x | La position du curseur en largeur dans la zone, de 0 à 1. |
--area-y | La position du curseur en hauteur dans la zone, de 0 à 1. |
| Prop | Type | Par défaut |
|---|---|---|
channelPar défaut la teinte, ou le bleu en sRGB. | ColorChannel | – |
orientation | "horizontal" | "vertical" | "horizontal" |
children | ReactNode | <ColorPickerSliderThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="color-picker-slider" | Pour cibler le curseur en CSS. |
data-channel | Le canal modifié, comme la teinte ou l’alpha. |
data-orientation | horizontal ou vertical. |
--color-slider-background | Un dégradé le long du canal. |
| Prop | Type | Par défaut |
|---|---|---|
channelLe canal à modifier, dans les unités où on le lit. | ColorChannel | – |
render | ReactElement | (props, state) => ReactElement | <input> |
| Prop | Type | Par défaut |
|---|---|---|
valueRequis. La couleur du préréglage. | string | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-slot="color-picker-swatch-item" | Pour cibler les préréglages en CSS. |
data-selected | Présent tant que la valeur est la couleur de ce préréglage. |
| Prop | Type | Par défaut |
|---|---|---|
children | ReactNode | <IconColorPicker /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-unsupported | Présent quand le navigateur n’a pas d’EyeDropper. Le bouton est alors masqué. |
ColorPickerPopover, ColorPickerTrigger et ColorPickerContent enveloppent le popover d’UI SDK. Le contenu s’ouvre dans la top layer du navigateur, il n’a donc pas besoin de portail.
| Prop | Type | Par défaut |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "start" | "end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Attribut | Description |
|---|---|
data-slot="popover-content" | Posé par UI SDK sur le popup. Ciblez-le en CSS. |
data-starting-style | Présent pendant l'animation d'entrée de la popup. |
data-ending-style | Présent pendant l'animation de sortie de la popup. |
- CalendarUne grille de dates pour la sélection simple, de plage et multiple, avec des mois qui défilent, des aperçus de plage et des jours à taille tactile.
- CheckboxUne case à cocher dont la coche se dessine, avec des parents indéterminés, des groupes et des libellés qui partagent son survol.
- ComboboxUn select filtrable avec chips, groupes et résultats asynchrones, dans un popup qui se redimensionne pendant la saisie.
- Date pickerUn bouton qui ouvre un calendrier dans un popover, ou une bottom sheet sur mobile, pour des dates simples et des plages.
- FieldDes libellés, descriptions et erreurs reliés à leur contrôle, avec états de validation et mises en page pour les formulaires.
- InputUn champ de saisie texte en trois tailles, avec états invalide et lecture seule, style de validation natif et police tactile de 16px pour que les téléphones ne zooment jamais.