Gebaut auf Vercels UI SDK 0.1.0-beta.1. Die API kann sich ändern.
Color picker
Ein Farbwähler auf Vercels UI SDK mit Sättigungsfläche, Farbton- und Alpha-Slidern, eintippbaren CSS-Farben, Vorgaben und Pipette.
- Formularkomponenten
- 15 Teilen
- 11 Beispielen
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-color-picker.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/ui-sdk-color-picker.tsx Passe die Importpfade an dein Projekt-Setup an.
UI SDK bringt etwas eigenes CSS in einem Cascade Layer namens ui-sdk mit. Deklariere diesen Layer ganz oben im globalen Stylesheet, über dem Tailwind-Import, damit deine Klassen gewinnen.
Der Wert ist ein CSS-Farbstring. Alle Teile ändern dieselbe Farbe, also nutze nur die Teile, die du brauchst. ColorPickerArea und ColorPickerSlider rendern ihren Thumb selbst. Benenne den Wähler mit aria-label oder mit dem Label eines umgebenden Felds.
Rendere die Teile direkt, ohne Popover, für eine Einstellungsseite oder eine Seitenleiste.
Ein Slider mit channel="alpha" ändert die Deckkraft. Spur und Farbfeld zeichnen ein Schachbrett unter die Farbe, sodass eine durchscheinende Farbe auch so aussieht.
Mit space="oklch" malt ColorPickerAreaCanvas die Fläche. Farben außerhalb des Bildschirm-Gamuts bleiben leer, und ein dorthin gezogener Thumb springt beim Loslassen auf die nächste Farbe im Gamut.
ColorPickerSwatches ist ein einziger Tab-Stopp mit Pfeiltasten zwischen den Vorgaben, und eine Vorgabe bleibt ausgewählt, egal wie der Wert geschrieben ist. ColorPickerChannelInput ändert einen Kanal als Zahl. Die Pipette blendet sich in Browsern aus, die nicht vom Bildschirm aufnehmen können.
Setze orientation="vertical" auf einen Slider, um ihn neben die Fläche zu stellen.
onValueChange läuft bei jedem Schritt eines Ziehens und onValueCommit einmal am Ende, also speichere dort. Ein Controller aus createColorPickerController() setzt die Farbe von überall.
Ein verstecktes Input sendet den Wert unter name, und ein Formular-Reset kehrt zu defaultValue zurück.
Ein deaktivierter Farbwähler lässt sich weder fokussieren noch ändern und sendet nichts.
Mit readOnly bleiben die Thumbs fokussierbar und der Wert wird gesendet, aber Ziehen, Tasten und Tippen lassen die Farbe in Ruhe.
UI SDK liest die Richtung von der Seite, daher werden Fläche, Slider und Pfeiltasten gespiegelt. Die Inputs wählen ihre eigene Richtung, sodass ein Hex-Wert weiter von links nach rechts läuft.
| Taste | Aktion |
|---|---|
| ←→↑↓ | Bewegt einen Thumb um einen Schritt. Auf der Fläche bewegen links und rechts quer, hoch und runter nach oben und unten. |
| Shift + arrow | Bewegt um zehn Schritte. |
| Page UpPage Down | Bewegt um ein Zehntel des Bereichs, auf der Fläche nach oben oder entlang eines Sliders. |
| HomeEnd | Springt an den Anfang oder das Ende. |
| Enter | Übernimmt den Text im Input oder wählt die fokussierte Vorgabe. |
| Esc | Setzt den Text im Input auf den Wert zurück oder schließt das Popover. |
Kein WAI-ARIA-Muster deckt einen Farbwähler ab, deshalb baut UI SDK ihn aus Mustern, die es gibt. Der Wähler ist eine Gruppe. Der Thumb der Fläche und jeder Slider-Thumb sind Slider, und der Thumb der Fläche nennt beide Kanäle, etwa „Sättigung 76 %, Helligkeit 96 %“. Die Vorgaben sind eine Listbox, und jede Vorgabe und das Farbfeld werden nach ihrer Farbe benannt, etwa „kräftiges Blau“.
Der Trigger im Popover-Beispiel nennt die aktuelle Farbe in seinem Namen. Thumbs wachsen beim Ziehen nur, wenn Bewegung erlaubt ist, und Schachbrett, Ringe und Fokusrahmen wechseln im Modus „Erzwungene Farben“ zu Systemfarben.
Jeder Teil umhüllt den gleichnamigen UI-SDK-Teil und nimmt alle seine Props an, auch render und einen className, der eine Funktion des Zustands sein kann.
| Prop | Typ | Standard |
|---|---|---|
value | string | – |
defaultValue | string | "black" |
onValueChangeLäuft bei jedem Schritt eines Ziehens, jedem Tastendruck, jeder eingetippten Farbe oder Vorgabe. | (value: string, details: ChangeDetails) => void | – |
onValueCommitLäuft einmal, wenn ein Ziehen, ein Tastendruck oder eine eingetippte Farbe endet. | (value: string, details: ChangeDetails) => void | – |
spaceWelche Kanäle die Teile ändern. | "hsv" | "hsl" | "srgb" | "oklch" | "hsv" |
formatWie der Wert geschrieben wird. Hex bei hsv, sonst die CSS-Syntax des Farbraums. | ColorFormat | – |
gamut | "srgb" | "p3" | false | "srgb" |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerAus createColorPickerController(). | ColorPickerController | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="color-picker" | Das Root in CSS ansprechen. |
data-disabled | Vorhanden, wenn deaktiviert. |
data-readonly | Vorhanden, wenn schreibgeschützt. |
data-required | Vorhanden, wenn erforderlich. |
data-out-of-gamut | Auf jedem Teil vorhanden, solange ein Ziehen eine Farbe außerhalb des Gamuts hält. |
--color-picker-color | Die Farbe als CSS. Thumbs und Farbfelder werden damit gefüllt. |
| Prop | Typ | Standard |
|---|---|---|
xDer Kanal quer. Je nach Farbraum Sättigung, Rot oder Chroma. | ColorChannel | – |
yDer Kanal nach oben. Je nach Farbraum Helligkeit, Luminanz oder Grün. | ColorChannel | – |
children | ReactNode | <ColorPickerAreaThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="color-picker-area" | Spricht die Fläche in CSS an. |
--color-area-background | Die Verläufe, die die Fläche zeichnen. Nicht gesetzt, wenn ein Canvas sie malt. |
--color-picker-radius | Der Eckenradius der Fläche. ColorPickerContent setzt ihn, damit die Ecken konzentrisch sind. |
| Attribut | Beschreibung |
|---|---|
data-slot="color-picker-area-thumb" | Spricht den Thumb in CSS an. |
--area-x | Wo der Thumb quer auf der Fläche steht, von 0 bis 1. |
--area-y | Wo der Thumb auf der Fläche nach oben steht, von 0 bis 1. |
| Prop | Typ | Standard |
|---|---|---|
channelStandardmäßig der Farbton, in sRGB Blau. | ColorChannel | – |
orientation | "horizontal" | "vertical" | "horizontal" |
children | ReactNode | <ColorPickerSliderThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="color-picker-slider" | Spricht den Slider in CSS an. |
data-channel | Der Kanal, den er ändert, etwa Farbton oder Alpha. |
data-orientation | horizontal oder vertical. |
--color-slider-background | Ein Verlauf durch den Kanal. |
| Prop | Typ | Standard |
|---|---|---|
channelDer zu ändernde Kanal, in den Einheiten, in denen man ihn liest. | ColorChannel | – |
render | ReactElement | (props, state) => ReactElement | <input> |
| Prop | Typ | Standard |
|---|---|---|
valuePflicht. Die Farbe der Vorgabe. | string | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Beschreibung |
|---|---|
data-slot="color-picker-swatch-item" | Spricht Vorgaben in CSS an. |
data-selected | Vorhanden, solange der Wert die Farbe dieser Vorgabe ist. |
| Prop | Typ | Standard |
|---|---|---|
children | ReactNode | <IconColorPicker /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Beschreibung |
|---|---|
data-unsupported | Vorhanden, wenn der Browser kein EyeDropper hat. Der Button wird dann ausgeblendet. |
ColorPickerPopover, ColorPickerTrigger und ColorPickerContent umhüllen das UI-SDK-Popover. Der Inhalt öffnet im Top Layer des Browsers und braucht daher kein Portal.
| Prop | Typ | Standard |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "start" | "end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Attribut | Beschreibung |
|---|---|
data-slot="popover-content" | Von UI SDK am Popup gesetzt. Damit in CSS ansprechen. |
data-starting-style | Vorhanden, solange das Popup einblendet. |
data-ending-style | Vorhanden, solange das Popup ausblendet. |
- CalendarEin Datumsraster für Einzel-, Bereichs- und Mehrfachauswahl, mit gleitenden Monaten, Bereichsvorschau und Tagen in Touch-Größe.
- CheckboxEine Checkbox, deren Häkchen sich einzeichnet, mit unbestimmten übergeordneten Elementen, Gruppen und Labels, die ihren Hover teilen.
- ComboboxEin filterbares Select mit Chips, Gruppen und asynchronen Ergebnissen, in einem Popup, das sich beim Tippen anpasst.
- Date pickerEin Button, der einen Kalender in einem Popover öffnet, auf Smartphones als Bottom Sheet, für einzelne Daten und Zeiträume.
- FieldLabels, Beschreibungen und Fehler, mit ihrem Steuerelement verbunden, mit Validierungszuständen und Layouts für Formulare.
- InputEin Texteingabefeld mit drei Größen, ungültigen und schreibgeschützten Zuständen, nativem Validierungsstyling und einer 16-px-Schrift für Touch, damit Smartphones nie hineinzoomen.