Hecho sobre el UI SDK 0.1.0-beta.1 de Vercel. Su API puede cambiar.
Color picker
Un selector de color sobre el UI SDK de Vercel, con área de saturación, sliders de tono y alfa, colores CSS escritos a mano, presets y cuentagotas.
- Componentes de formulario
- 15 partes
- 11 ejemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-color-picker.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cnCopia y pega el siguiente código en tu proyecto.
components/ui/ui-sdk-color-picker.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
UI SDK añade un poco de CSS propio en una capa de cascada llamada ui-sdk. Declara esa capa al principio de tu hoja de estilos global, encima del import de Tailwind, para que tus clases ganen.
El valor es una cadena de color CSS. Todas las partes editan el mismo color, así que usa solo las que necesites. ColorPickerArea y ColorPickerSlider renderizan su thumb por ti. Nombra el selector con aria-label o con la etiqueta de un campo que lo rodee.
Renderiza las partes en su sitio, sin popover, para una página de ajustes o una barra lateral.
Un slider con channel="alpha" edita la opacidad. Su pista y la muestra dibujan un damero bajo el color, así un color translúcido se ve translúcido.
Con space="oklch", añade ColorPickerAreaCanvas para pintar el área. Los colores fuera del gamut de la pantalla quedan vacíos, y un thumb arrastrado allí se asienta en el color más cercano dentro al soltarlo.
ColorPickerSwatches es una sola parada de Tab con flechas entre presets, y un preset sigue seleccionado se escriba como se escriba el valor. ColorPickerChannelInput edita un canal como número. El cuentagotas se oculta en navegadores que no pueden tomar colores de la pantalla.
Pon orientation="vertical" en un slider para colocarlo junto al área.
onValueChange se ejecuta en cada paso de un arrastre y onValueCommit una vez al terminar, así que guarda ahí. Un controlador de createColorPickerController() fija el color desde cualquier parte.
Un input oculto envía el valor con name, y al reiniciar el formulario vuelve a defaultValue.
Un selector deshabilitado no recibe foco ni cambia, y no envía nada.
Con readOnly, los thumbs siguen recibiendo foco y el valor se envía, pero arrastrar, las teclas y escribir no cambian el color.
UI SDK lee la dirección de la página, así que el área, los sliders y las flechas se invierten. Los inputs eligen su propia dirección, así un valor hex se sigue leyendo de izquierda a derecha.
| Key | Acción |
|---|---|
| ←→↑↓ | Mueve un thumb un paso. En el área, izquierda y derecha mueven en horizontal, arriba y abajo en vertical. |
| Shift + arrow | Mueve diez pasos. |
| Page UpPage Down | Mueve una décima parte del rango, hacia arriba en el área o a lo largo de un slider. |
| HomeEnd | Mueve al inicio o al final. |
| Enter | Lee el texto del input, o elige el preset con foco. |
| Esc | Devuelve el texto del input al valor, o cierra el popover. |
Ningún patrón WAI-ARIA cubre un selector de color, así que UI SDK lo arma con los que sí existen. El selector es un grupo. El thumb del área y cada thumb de slider son sliders, y el del área nombra sus dos canales, como “Saturación 76%, Brillo 96%”. Los presets son un listbox, y cada preset y la muestra se nombran por su color, como “azul vivo”.
El trigger del ejemplo con popover dice el color actual en su nombre. Los thumbs crecen al arrastrar solo si se permite el movimiento, y el damero, los anillos y los contornos de foco pasan a colores del sistema en el modo de colores forzados.
Cada parte envuelve la parte de UI SDK del mismo nombre y acepta todas sus props, incluidas render y un className que puede ser una función del estado de la parte.
| Prop | Tipo | Predeterminado |
|---|---|---|
value | string | – |
defaultValue | string | "black" |
onValueChangeSe ejecuta en cada paso de un arrastre, una tecla, un color escrito o un preset. | (value: string, details: ChangeDetails) => void | – |
onValueCommitSe ejecuta una vez cuando termina un arrastre, una tecla o un color escrito. | (value: string, details: ChangeDetails) => void | – |
spaceQué canales editan las partes. | "hsv" | "hsl" | "srgb" | "oklch" | "hsv" |
formatCómo se escribe el valor. Hex para hsv; si no, la sintaxis CSS propia del espacio. | ColorFormat | – |
gamut | "srgb" | "p3" | false | "srgb" |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerDe createColorPickerController(). | ColorPickerController | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="color-picker" | Apunta a la raíz en CSS. |
data-disabled | Presente cuando está deshabilitado. |
data-readonly | Presente cuando es de solo lectura. |
data-required | Presente cuando es obligatorio. |
data-out-of-gamut | Presente en cada parte mientras un arrastre deja un color fuera del gamut. |
--color-picker-color | El color como CSS. Los thumbs y las muestras se rellenan con él. |
| Prop | Tipo | Predeterminado |
|---|---|---|
xEl canal horizontal. Saturación, rojo o croma, según el espacio. | ColorChannel | – |
yEl canal vertical. Brillo, luminosidad o verde, según el espacio. | ColorChannel | – |
children | ReactNode | <ColorPickerAreaThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="color-picker-area" | Para apuntar al área en CSS. |
--color-area-background | Los degradados que dibujan el área. Sin valor cuando la pinta un canvas. |
--color-picker-radius | El radio de las esquinas del área. Lo fija ColorPickerContent para que las esquinas sean concéntricas. |
| Atributo | Descripción |
|---|---|
data-slot="color-picker-area-thumb" | Para apuntar al thumb en CSS. |
--area-x | La posición horizontal del thumb en el área, de 0 a 1. |
--area-y | La posición vertical del thumb en el área, de 0 a 1. |
| Prop | Tipo | Predeterminado |
|---|---|---|
channelPor defecto, el tono, o el azul en sRGB. | ColorChannel | – |
orientation | "horizontal" | "vertical" | "horizontal" |
children | ReactNode | <ColorPickerSliderThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descripción |
|---|---|
data-slot="color-picker-slider" | Para apuntar al slider en CSS. |
data-channel | El canal que edita, como el tono o el alfa. |
data-orientation | horizontal o vertical. |
--color-slider-background | Un degradado a lo largo del canal. |
| Prop | Tipo | Predeterminado |
|---|---|---|
channelEl canal que se edita, en las unidades en que se lee. | ColorChannel | – |
render | ReactElement | (props, state) => ReactElement | <input> |
| Prop | Tipo | Predeterminado |
|---|---|---|
valueObligatorio. El color del preset. | string | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descripción |
|---|---|
data-slot="color-picker-swatch-item" | Para apuntar a los presets en CSS. |
data-selected | Presente mientras el valor es el color de este preset. |
| Prop | Tipo | Predeterminado |
|---|---|---|
children | ReactNode | <IconColorPicker /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descripción |
|---|---|
data-unsupported | Presente donde el navegador no tiene EyeDropper. El botón se oculta entonces. |
ColorPickerPopover, ColorPickerTrigger y ColorPickerContent envuelven el popover de UI SDK. El contenido se abre en la top layer del navegador, así que no necesita portal.
| Prop | Tipo | Predeterminado |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "start" | "end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Atributo | Descripción |
|---|---|
data-slot="popover-content" | UI SDK lo pone en el popup. Úsalo en CSS. |
data-starting-style | Presente mientras el popup se anima al entrar. |
data-ending-style | Presente mientras el popup se anima al salir. |
- CalendarUna cuadrícula de fechas para selección única, de rango y múltiple, con meses deslizantes, vistas previas de rango y días de tamaño táctil.
- CheckboxUna casilla de verificación cuya marca se dibuja, con padres indeterminados, grupos y etiquetas que comparten su hover.
- ComboboxUn select filtrable con chips, grupos y resultados asíncronos, en un popup que cambia de tamaño mientras escribes.
- Date pickerUn botón que abre un calendario en un popover, o en una hoja inferior en móviles, para fechas únicas y rangos.
- FieldEtiquetas, descripciones y errores conectados a su control, con estados de validación y diseños para formularios.
- InputUn campo de texto con tres tamaños, estados inválido y de solo lectura, estilos de validación nativos y una fuente táctil de 16px para que los móviles nunca hagan zoom.