Forms
Componentes de entrada y control: Button, IconButton, Input, Textarea, Select, Checkbox, Radio, Switch. Dirección Soft & Airy, densidad densa (32px default). Nombres e interfaz alineados con la librería React onaris-ui.
Input
<Input />Campo de texto de una línea. Soporta todos los type HTML (text, number, password, email, search, tel, url). Acepta prefix y suffix para unidades, iconos o acciones. Siempre se usa envuelto en <Field> con label y hint opcional.
<Field label="Nombre" hint="Aparecerá en la ficha">
<Input placeholder="Camiseta algodón" />
</Field>
<Field label="Precio">
<Input type="number" prefix="€" />
</Field>
<Field label="Email" error="Formato no válido">
<Input type="email" />
</Field>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| type | 'text' | 'number' | 'password' | 'email' | 'search' | 'tel' | 'url' | 'text' | Tipo nativo HTML. |
| size | 'sm' | 'md' | 'lg' | 'md' | 28 / 32 / 40 px. |
| prefix | ReactNode | — | Contenido en el borde izquierdo (unidad, icono…). |
| suffix | ReactNode | — | Contenido en el borde derecho. |
| value | string | — | Valor controlado. |
| onChange | (e) => void | — | Handler de cambio. |
| placeholder | string | — | Texto de ayuda inline. |
| disabled | boolean | false | Desactiva el input. |
| readOnly | boolean | false | Solo lectura. |
| invalid | boolean | false | Aplica estilo de error. |
| clearable | boolean | false | Muestra el botón ✕ al enfocar si hay texto. Lo borra de un clic. |
PasswordInput
<PasswordInput />Campo de contraseña con botón para mostrar/ocultar el texto, usando los iconos ojo / ojo-oculto de Onaris. Por defecto oculta el contenido.
<Field label="Contraseña">
<PasswordInput value={pw} onChange={setPw} />
</Field>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| value | string | — | Valor controlado. |
| onChange | (e) => void | — | Handler de cambio. |
| defaultVisible | boolean | false | Empieza mostrando el texto. |
| size | 'sm' | 'md' | 'lg' | 'md' | Altura del campo. |
| disabled | boolean | false | Desactiva el campo. |
Textarea
<Textarea />Campo de texto multilínea, redimensionable en vertical. Mismas convenciones que Input: se usa dentro de Field con label y hint.
<Field label="Descripción">
<Textarea rows={4} placeholder="Describe el artículo…" />
</Field>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| rows | number | 3 | Alto inicial en líneas. |
| maxLength | number | — | Límite de caracteres. |
| resize | 'none' | 'vertical' | 'both' | 'vertical' | Comportamiento de redimensionado. |
| value | string | — | Valor controlado. |
| onChange | (e) => void | — | Handler de cambio. |
| disabled | boolean | false | Desactiva el campo. |
| invalid | boolean | false | Aplica estilo de error. |
Select
<Select />Desplegable de selección única. Es un combobox custom, no un <select> nativo: así el menú desplegado usa los mismos tokens que el resto del sistema en todos los navegadores. Prueba a abrir cualquiera de los ejemplos — el menú es idéntico al documentado abajo.
is-open, con la opción seleccionada marcada<Field label="Categoría">
<Select value={category} onChange={setCategory}>
<Select.Option value="camisetas">Camisetas</Select.Option>
<Select.Option value="pantalones">Pantalones</Select.Option>
</Select>
</Field>
// Con búsqueda
<Select searchable options={cats} />
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| value | string | number | — | Opción seleccionada. |
| onChange | (value) => void | — | Handler de cambio. |
| options | { value, label }[] | — | Alternativa a children. |
| searchable | boolean | false | Activa combobox con filtro. |
| clearable | boolean | false | Botón para limpiar selección. |
| size | 'sm' | 'md' | 'lg' | 'md' | Altura del control. |
| placeholder | string | — | Texto cuando no hay selección. |
| disabled | boolean | false | Desactiva el control. |
| invalid | boolean | false | Aplica estilo de error. |
DatePicker
<DatePicker />Selección de fecha con icono calendario de Onaris. Al enfocar despliega un calendario; admite rango con range. El input es editable manualmente respetando el formato.
<DatePicker value={date} onChange={setDate} format="dd/MM/yyyy" />
<DatePicker range value={[from, to]} onChange={setRange} />
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| value | Date | [Date, Date] | — | Fecha o rango seleccionado. |
| onChange | (value) => void | — | Handler de cambio. |
| range | boolean | false | Selección de rango. |
| format | string | 'dd/MM/yyyy' | Formato de visualización. |
| min / max | Date | — | Límites seleccionables. |
| disabled | boolean | false | Desactiva el campo. |
TimePicker
<TimePicker />Selección de hora con icono reloj de Onaris. Formato 24h por defecto, con paso configurable (minutos).
<TimePicker value={time} onChange={setTime} step={15} />
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| value | string | — | Hora en formato 'HH:mm'. |
| onChange | (value) => void | — | Handler de cambio. |
| format | '24h' | '12h' | '24h' | Formato horario. |
| step | number | 30 | Intervalo en minutos. |
| disabled | boolean | false | Desactiva el campo. |
ColorPicker
<ColorPicker />Selección de color con muestra (swatch) a la izquierda y valor hexadecimal editable. Al abrir despliega un selector. Útil para marcar familias, etiquetas o temas de catálogo.
<ColorPicker value={color} onChange={setColor} />
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| value | string | — | Color en hex (#RRGGBB). |
| onChange | (value) => void | — | Handler de cambio. |
| presets | string[] | — | Colores predefinidos (paleta de marca). |
| format | 'hex' | 'rgb' | 'hex' | Formato del valor. |
| disabled | boolean | false | Desactiva el campo. |
Checkbox
<Checkbox />Selección múltiple. Admite estado indeterminate para headers de tabla que controlan la selección de todas las filas. Label clickeable por defecto.
<Checkbox checked={value} onChange={setValue}>
Destacar en catálogo
</Checkbox>
<Checkbox indeterminate>Todos</Checkbox>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| checked | boolean | false | Estado controlado. |
| defaultChecked | boolean | false | Estado inicial no controlado. |
| indeterminate | boolean | false | Tercer estado (ni on ni off). |
| onChange | (checked) => void | — | Handler de cambio. |
| disabled | boolean | false | Desactiva el checkbox. |
| children | ReactNode | — | Etiqueta inline (clickeable). |
Radio
<Radio /> · <RadioGroup />Selección única exclusiva. Siempre se usa dentro de RadioGroup, que coordina el estado y el name del grupo.
<RadioGroup name="visibilidad" value={value} onChange={setValue}>
<Radio value="clientes">Solo clientes</Radio>
<Radio value="todos">Todos</Radio>
<Radio value="admin">Privado</Radio>
</RadioGroup>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| RadioGroup | |||
| name | string | — | Nombre del grupo (para accesibilidad). |
| value | string | — | Valor seleccionado. |
| onChange | (value) => void | — | Handler de cambio. |
| orientation | 'vertical' | 'horizontal' | 'vertical' | Dirección de layout. |
| Radio | |||
| value | string | — | Valor que representa este radio. |
| disabled | boolean | false | Desactiva este radio. |
| children | ReactNode | — | Etiqueta. |
Switch
<Switch />Toggle de activación instantánea. Usar para ajustes que se aplican en el momento (modo oscuro, visibilidad, notificaciones). Para opciones que se confirman con submit, usar Checkbox.
<Switch checked={dark} onChange={setDark}>
Modo oscuro
</Switch>
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| checked | boolean | false | Estado controlado. |
| defaultChecked | boolean | false | Estado inicial no controlado. |
| onChange | (checked) => void | — | Handler de cambio. |
| size | 'md' | 'lg' | 'md' | 28×16 o 36×20 px. |
| disabled | boolean | false | Desactiva el switch. |
| children | ReactNode | — | Label inline (clickeable). |