Hecho sobre el UI SDK 0.1.0-beta.2 de Vercel. Su API puede cambiar.
Number input
Un campo numérico sobre el UI SDK de Vercel con botones que repiten al mantenerlos, formatos de moneda, porcentaje y unidades en cualquier idioma, y un control para arrastrar.
- Componentes de formulario
- 8 partes
- 13 ejemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-number-input.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.2 @ui-sdk/core@0.1.0-beta.2 @tabler/icons-react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/ui-sdk-number-input.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 un número, o null cuando el campo está vacío, y el campo lo muestra con formato. Escribir actualiza el valor en cuanto el texto es un número válido. Enter o salir del campo lo confirma: el texto se lee, se mantiene entre min y max, se ajusta al paso y se vuelve a formatear.
Un botón se desactiva en su límite. Un valor escrito fuera de los límites se ajusta al confirmarlo.
step es el incremento habitual. Shift, Re Pág y Av Pág mueven en largeStep, y Alt u Option con una flecha en smallStep. Mantén un botón para repetir.
format acepta opciones de Intl.NumberFormat. Se puede escribir en el mismo formato, y un porcentaje es una fracción, así que 15% es 0.15. El grupo variant="stacked" pone flechas pequeñas al final.
locale elige separadores, símbolos y agrupación de dígitos, para mostrar y para escribir. Sin él, el campo sigue el idioma de la página cuando es interactivo, y el servidor muestra inglés.
Arrastra un NumberInputScrubArea hacia los lados para cambiar el valor, como en una herramienta de diseño. Donde el navegador permite bloquear el puntero, el arrastre puede pasar el borde de la pantalla, y NumberInputScrubAreaCursor dibuja el cursor.
Con wheel, desplazar sobre el campo enfocado cambia el valor. Está desactivado por defecto, así que una página que se desplaza por encima del campo nunca lo cambia.
onValueChange se ejecuta en cada cambio válido, y onValueCommit al terminar una interacción, que es en el que conviene guardar. Un controlador cambia o fija el valor desde cualquier botón.
Con un name, el número se envía tal cual, como 1250, nunca con formato. required bloquea un campo vacío, y restablecer el formulario vuelve al valor por defecto.
invalid marca el campo y pone aria-invalid en el input, para comprobaciones propias como el stock.
Un campo desactivado no se puede enfocar ni cambiar, y no se envía.
Un campo de solo lectura se puede enfocar y se envía, pero los botones, el arrastre y la escritura no lo cambian.
Los botones cambian de lado, y el idioma fija los dígitos y la moneda.
| Key | Acción |
|---|---|
| ↑↓ | Cambia el valor en step. |
| ShiftPageUpPageDown | Cambia en largeStep, diez pasos por defecto. Shift funciona con las flechas, los botones, la rueda y el arrastre. |
| Alt | Con una flecha, cambia en smallStep, una décima de paso por defecto. |
| HomeEnd | Va al mínimo o al máximo, si están definidos. |
| Enter | Confirma y formatea lo escrito. |
El campo sigue el teclado del patrón spinbutton de WAI-ARIA sobre un input de texto nativo, así que la edición de texto normal sigue funcionando. Nombra el input con una etiqueta o aria-label. Los botones se llaman “Increase” y “Decrease” por defecto, apuntan al input y quedan fuera del orden de tabulación porque las flechas hacen lo mismo.
Un campo con decimales pide un teclado decimal en los móviles, y los botones crecen en pantallas táctiles. Solo se encogen al pulsarlos si se permite el movimiento.
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 | number | null | – |
defaultValue | number | null | – |
onValueChange | (value: number | null, details) => void | – |
onValueCommitSe ejecuta al terminar una interacción. Para guardar. | (value: number | null, details) => void | – |
min | number | – |
max | number | – |
step | number | 1 |
largeStep | number | step × 10 |
smallStep | number | step ÷ 10 |
format | Intl.NumberFormatOptions | – |
localePor defecto, el idioma de la página. | string | – |
wheel | boolean | false |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerDe createNumberInputController(). | NumberInputController | – |
| Atributo | Descripción |
|---|---|
data-slot="number-input" | Para apuntar al campo numérico en CSS. |
data-scrubbing | Presente mientras un arrastre cambia el valor. |
data-invalid | Presente cuando no es válido. |
data-disabled | Presente cuando está deshabilitado. |
data-readonly | Presente cuando es de solo lectura. |
data-required | Presente cuando es obligatorio. |
| Prop | Tipo | Predeterminado |
|---|---|---|
variantBotones a ambos lados, flechas apiladas al final o sin botones, para un control de arrastre. | "split" | "stacked" | "plain" | "split" |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="number-input-group" | Para apuntar a la caja del campo en CSS. |
data-variant | La variante: split, stacked o plain. |
| Prop | Tipo | Predeterminado |
|---|---|---|
id | string | – |
placeholder | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
aria-label | string | "Increase" |
disabledDesactiva solo este botón. | boolean | – |
childrenPor defecto, un signo más, o una flecha en la variante stacked. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="number-input-increment" | Apunta al botón en CSS. |
data-at-bound | Presente cuando el valor está en max. |
data-disabled | Presente cuando el botón no puede cambiar el valor. |
| Prop | Tipo | Predeterminado |
|---|---|---|
aria-label | string | "Decrease" |
disabledDesactiva solo este botón. | boolean | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="number-input-decrement" | Apunta al botón en CSS. |
data-at-bound | Presente cuando el valor está en min. |
Apila el botón de aumentar sobre el de disminuir al final de un grupo stacked.
| Prop | Tipo | Predeterminado |
|---|---|---|
orientationDerecha y arriba aumentan el valor. | "horizontal" | "vertical" | "horizontal" |
pixelsPerStepCuánto se mueve el puntero por cada paso. | number | – |
controllerConecta un área de arrastre fuera del campo numérico, como un icono en una barra de herramientas. | NumberInputController | – |
| Atributo | Descripción |
|---|---|
data-slot="number-input-scrub-area" | Para apuntar al área de arrastre en CSS. |
data-orientation | horizontal o vertical. |
data-scrubbing | Presente mientras un arrastre cambia el valor. |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenPor defecto, una flecha horizontal centrada en el puntero. | ReactNode | – |
- 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.