Feito sobre o UI SDK 0.1.0-beta.1 da Vercel. A API pode mudar.
Color picker
Um seletor de cor sobre o UI SDK da Vercel, com área de saturação, sliders de matiz e alfa, cores CSS digitadas, presets e conta-gotas.
- Componentes de formulário
- 15 partes
- 11 exemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-color-picker.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cnCopie e cole o código a seguir no seu projeto.
components/ui/ui-sdk-color-picker.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
O UI SDK adiciona um pouco de CSS próprio em uma camada de cascata chamada ui-sdk. Declare essa camada no topo da sua folha de estilos global, acima do import do Tailwind, para que suas classes vençam.
O valor é uma string de cor CSS. Todas as partes editam a mesma cor, então use só as que precisar. ColorPickerArea e ColorPickerSlider renderizam o thumb para você. Nomeie o seletor com aria-label ou com o rótulo de um campo ao redor.
Renderize as partes no lugar, sem popover, para uma página de configurações ou uma barra lateral.
Um slider com channel="alpha" edita a opacidade. A trilha e a amostra desenham um xadrez sob a cor, então uma cor translúcida parece translúcida.
Com space="oklch", adicione ColorPickerAreaCanvas para pintar a área. Cores fora do gamut da tela ficam vazias, e um thumb arrastado até lá se ajusta à cor mais próxima dentro ao soltar.
ColorPickerSwatches é uma só parada de Tab com setas entre os presets, e um preset continua selecionado não importa como o valor esteja escrito. ColorPickerChannelInput edita um canal como número. O conta-gotas se oculta em navegadores que não capturam cores da tela.
Defina orientation="vertical" em um slider para colocá-lo ao lado da área.
onValueChange executa a cada passo de um arraste e onValueCommit uma vez ao final, então salve ali. Um controlador de createColorPickerController() define a cor de qualquer lugar.
Um input oculto envia o valor em name, e o reset do formulário volta para defaultValue.
Um seletor desativado não recebe foco nem muda, e não envia nada.
Com readOnly, os thumbs continuam recebendo foco e o valor é enviado, mas arrastar, teclas e digitação não mudam a cor.
O UI SDK lê a direção da página, então a área, os sliders e as setas se espelham. Os inputs escolhem a própria direção, então um valor hex continua sendo lido da esquerda para a direita.
| Tecla | Ação |
|---|---|
| ←→↑↓ | Move um thumb um passo. Na área, esquerda e direita movem na horizontal, cima e baixo na vertical. |
| Shift + arrow | Move dez passos. |
| Page UpPage Down | Move um décimo do intervalo, para cima na área ou ao longo de um slider. |
| HomeEnd | Move para o início ou o fim. |
| Enter | Lê o texto do input, ou escolhe o preset com foco. |
| Esc | Volta o texto do input para o valor, ou fecha o popover. |
Nenhum padrão WAI-ARIA cobre um seletor de cor, então o UI SDK o monta com os que existem. O seletor é um grupo. O thumb da área e cada thumb de slider são sliders, e o da área nomeia seus dois canais, como “Saturação 76%, Brilho 96%”. Os presets são um listbox, e cada preset e a amostra são nomeados pela cor, como “azul vivo”.
O trigger do exemplo com popover diz a cor atual no nome. Os thumbs crescem ao arrastar só quando o movimento é permitido, e o xadrez, os anéis e os contornos de foco passam a cores do sistema no modo de cores forçadas.
Cada parte envolve a parte do UI SDK de mesmo nome e aceita todas as suas props, incluindo render e um className que pode ser uma função do estado da parte.
| Prop | Tipo | Padrão |
|---|---|---|
value | string | – |
defaultValue | string | "black" |
onValueChangeExecuta a cada passo de um arraste, tecla, cor digitada ou preset. | (value: string, details: ChangeDetails) => void | – |
onValueCommitExecuta uma vez quando um arraste, tecla ou cor digitada termina. | (value: string, details: ChangeDetails) => void | – |
spaceQuais canais as partes editam. | "hsv" | "hsl" | "srgb" | "oklch" | "hsv" |
formatComo o valor é escrito. Hex para hsv; caso contrário, a sintaxe CSS do próprio espaço. | 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 | Descrição |
|---|---|
data-slot="color-picker" | Selecione a raiz no CSS. |
data-disabled | Presente quando desabilitado. |
data-readonly | Presente quando somente leitura. |
data-required | Presente quando obrigatório. |
data-out-of-gamut | Presente em cada parte enquanto um arraste mantém uma cor fora do gamut. |
--color-picker-color | A cor como CSS. Thumbs e amostras são preenchidos com ela. |
| Prop | Tipo | Padrão |
|---|---|---|
xO canal na horizontal. Saturação, vermelho ou croma, conforme o espaço. | ColorChannel | – |
yO canal na vertical. Brilho, luminosidade ou verde, conforme o espaço. | ColorChannel | – |
children | ReactNode | <ColorPickerAreaThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="color-picker-area" | Para selecionar a área no CSS. |
--color-area-background | Os gradientes que desenham a área. Sem valor quando um canvas a pinta. |
--color-picker-radius | O raio dos cantos da área. Definido por ColorPickerContent para que os cantos sejam concêntricos. |
| Atributo | Descrição |
|---|---|
data-slot="color-picker-area-thumb" | Para selecionar o thumb no CSS. |
--area-x | A posição horizontal do thumb na área, de 0 a 1. |
--area-y | A posição vertical do thumb na área, de 0 a 1. |
| Prop | Tipo | Padrão |
|---|---|---|
channelPor padrão, o matiz, ou o azul em sRGB. | ColorChannel | – |
orientation | "horizontal" | "vertical" | "horizontal" |
children | ReactNode | <ColorPickerSliderThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="color-picker-slider" | Para selecionar o slider no CSS. |
data-channel | O canal que edita, como matiz ou alfa. |
data-orientation | horizontal ou vertical. |
--color-slider-background | Um gradiente ao longo do canal. |
| Prop | Tipo | Padrão |
|---|---|---|
channelO canal a editar, nas unidades em que as pessoas o leem. | ColorChannel | – |
render | ReactElement | (props, state) => ReactElement | <input> |
| Prop | Tipo | Padrão |
|---|---|---|
valueObrigatório. A cor do preset. | string | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-slot="color-picker-swatch-item" | Para selecionar os presets no CSS. |
data-selected | Presente enquanto o valor é a cor deste preset. |
| Prop | Tipo | Padrão |
|---|---|---|
children | ReactNode | <IconColorPicker /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| Atributo | Descrição |
|---|---|
data-unsupported | Presente onde o navegador não tem EyeDropper. O botão fica oculto nesse caso. |
ColorPickerPopover, ColorPickerTrigger e ColorPickerContent envolvem o popover do UI SDK. O conteúdo abre na top layer do navegador, então não precisa de portal.
| Prop | Tipo | Padrão |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "start" | "end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Atributo | Descrição |
|---|---|
data-slot="popover-content" | Definido pelo UI SDK no popup. Use-o no CSS. |
data-starting-style | Presente enquanto o popup anima a entrada. |
data-ending-style | Presente enquanto o popup anima a saída. |
- CalendarUma grade de datas para seleção única, de intervalo e múltipla, com meses deslizantes, prévias de intervalo e dias com tamanho adequado ao toque.
- CheckboxUma caixa de seleção cujo check é desenhado na tela, com pais indeterminados, grupos e rótulos que compartilham seu hover.
- ComboboxUm select filtrável com chips, grupos e resultados assíncronos, em um popup que se redimensiona conforme você digita.
- Date pickerUm botão que abre um calendário em um popover, ou em um bottom sheet no celular, para datas únicas e intervalos.
- FieldRótulos, descrições e erros ligados ao seu controle, com estados de validação e layouts para formulários.
- InputUm campo de texto com três tamanhos, estados inválido e somente leitura, estilo de validação nativa e fonte de 16px no toque para que os celulares nunca façam zoom.