03 · Components

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.

Button

<Button />

Acciones primarias y secundarias. Seis variantes semánticas, tres tamaños, cinco estados. El variante primary es el CTA global; secondary para acciones neutras; ghost para acciones terciarias; danger para destructivas; link para navegación inline. Todos los tamaños por defecto son de 32px para maximizar densidad en backoffice.

Variantes primary · secondary · ghost · danger · soft-accent · link
Tamaños sm (28) · md (32, default) · lg (40)
Estados · Primary
Default
Hover
Focus
Active
Disabled
Estados · Secondary
Default
Hover
Focus
Active
Disabled
Loading y block
// Uso básico
<Button variant="primary">Guardar</Button>
<Button variant="secondary" size="sm">Cancelar</Button>
<Button variant="danger" loading>Eliminar</Button>
<Button variant="primary" block>Continuar</Button>
PropTipoDefaultDescripción
variant'primary' | 'secondary' | 'ghost' | 'danger' | 'soft-accent' | 'link''primary'Estilo visual y semántica.
size'sm' | 'md' | 'lg''md'Altura del botón. md = 32px.
loadingbooleanfalseMuestra spinner y bloquea clicks.
disabledbooleanfalseDesactiva el botón (opacity 0.5, no cursor).
blockbooleanfalseOcupa todo el ancho disponible.
type'button' | 'submit' | 'reset''button'Tipo nativo HTML.
onClick(e) => void—Handler de click.
childrenReactNode—Contenido del botón.

IconButton

<IconButton />

Botón cuadrado de icono puro. Para barras de acciones densas, toolbars y controles inline donde el texto ocuparía demasiado. Requiere aria-label obligatorio. Cuando se use junto a iconos de Onaris UI, el contenedor aplica color vía currentColor.

Variantes ghost · outline · primary · circle
Tamañossm (28) · md (32) · lg (40)
<IconButton variant="ghost" aria-label="Editar">
  <IconLapiz />
</IconButton>
PropTipoDefaultDescripción
variant'ghost' | 'outline' | 'primary''ghost'Estilo visual.
size'sm' | 'md' | 'lg''md'28 / 32 / 40 px.
shape'square' | 'circle''square'Forma del contenedor.
aria-labelstring— (requerido)Etiqueta accesible. Obligatoria.
disabledbooleanfalseDesactiva el botón.

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.

Estructura baseLabel + Input + Hint
Aparecerá en la ficha pública y el PDF.
Tamañossm (28) · md (32, default) · lg (40)
Estados
Default
Hover
Focus
Disabled
Error
Con prefix / suffix
€
g
Con botón de limpiaraparece al enfocar un campo con texto
Enfoca el campo: el icono de limpiar (✕) borra el contenido de un clic.
Error
Formato de email no válido.
<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>
PropTipoDefaultDescripción
type'text' | 'number' | 'password' | 'email' | 'search' | 'tel' | 'url''text'Tipo nativo HTML.
size'sm' | 'md' | 'lg''md'28 / 32 / 40 px.
prefixReactNode—Contenido en el borde izquierdo (unidad, icono…).
suffixReactNode—Contenido en el borde derecho.
valuestring—Valor controlado.
onChange(e) => void—Handler de cambio.
placeholderstring—Texto de ayuda inline.
disabledbooleanfalseDesactiva el input.
readOnlybooleanfalseSolo lectura.
invalidbooleanfalseAplica estilo de error.
clearablebooleanfalseMuestra 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.

Oculta / visible
<Field label="Contraseña">
  <PasswordInput value={pw} onChange={setPw} />
</Field>
PropTipoDefaultDescripción
valuestring—Valor controlado.
onChange(e) => void—Handler de cambio.
defaultVisiblebooleanfalseEmpieza mostrando el texto.
size'sm' | 'md' | 'lg''md'Altura del campo.
disabledbooleanfalseDesactiva 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.

Estados
Default
Focus
Disabled
Error
<Field label="Descripción">
  <Textarea rows={4} placeholder="Describe el artículo…" />
</Field>
PropTipoDefaultDescripción
rowsnumber3Alto inicial en líneas.
maxLengthnumber—Límite de caracteres.
resize'none' | 'vertical' | 'both''vertical'Comportamiento de redimensionado.
valuestring—Valor controlado.
onChange(e) => void—Handler de cambio.
disabledbooleanfalseDesactiva el campo.
invalidbooleanfalseAplica 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.

TamañosS (28) · M (32, default) · L (40) — clicables
Camisetas
Pantalones
Accesorios
Camisetas
Pantalones
Accesorios
Camisetas
Pantalones
Accesorios
Estados
Default
Focus
Disabled
Error
Desplegable abiertoestado is-open, con la opción seleccionada marcada
Accesorios
Calzado
Camisetas
Pantalones
Sudaderas
Vestidos
<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} />
PropTipoDefaultDescripción
valuestring | number—Opción seleccionada.
onChange(value) => void—Handler de cambio.
options{ value, label }[]—Alternativa a children.
searchablebooleanfalseActiva combobox con filtro.
clearablebooleanfalseBotón para limpiar selección.
size'sm' | 'md' | 'lg''md'Altura del control.
placeholderstring—Texto cuando no hay selección.
disabledbooleanfalseDesactiva el control.
invalidbooleanfalseAplica 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.

Campo
<DatePicker value={date} onChange={setDate} format="dd/MM/yyyy" />
<DatePicker range value={[from, to]} onChange={setRange} />
PropTipoDefaultDescripción
valueDate | [Date, Date]—Fecha o rango seleccionado.
onChange(value) => void—Handler de cambio.
rangebooleanfalseSelección de rango.
formatstring'dd/MM/yyyy'Formato de visualización.
min / maxDate—Límites seleccionables.
disabledbooleanfalseDesactiva el campo.

TimePicker

<TimePicker />

Selección de hora con icono reloj de Onaris. Formato 24h por defecto, con paso configurable (minutos).

Campo
<TimePicker value={time} onChange={setTime} step={15} />
PropTipoDefaultDescripción
valuestring—Hora en formato 'HH:mm'.
onChange(value) => void—Handler de cambio.
format'24h' | '12h''24h'Formato horario.
stepnumber30Intervalo en minutos.
disabledbooleanfalseDesactiva 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.

Campo
<ColorPicker value={color} onChange={setColor} />
PropTipoDefaultDescripción
valuestring—Color en hex (#RRGGBB).
onChange(value) => void—Handler de cambio.
presetsstring[]—Colores predefinidos (paleta de marca).
format'hex' | 'rgb''hex'Formato del valor.
disabledbooleanfalseDesactiva 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.

Variantes
Estados
Default
Hover
Focus
Checked
Disabled
Grupo vertical
<Checkbox checked={value} onChange={setValue}>
  Destacar en catálogo
</Checkbox>

<Checkbox indeterminate>Todos</Checkbox>
PropTipoDefaultDescripción
checkedbooleanfalseEstado controlado.
defaultCheckedbooleanfalseEstado inicial no controlado.
indeterminatebooleanfalseTercer estado (ni on ni off).
onChange(checked) => void—Handler de cambio.
disabledbooleanfalseDesactiva el checkbox.
childrenReactNode—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.

Estados
Default
Hover
Focus
Checked
Disabled
Grupo vertical
<RadioGroup name="visibilidad" value={value} onChange={setValue}>
  <Radio value="clientes">Solo clientes</Radio>
  <Radio value="todos">Todos</Radio>
  <Radio value="admin">Privado</Radio>
</RadioGroup>
PropTipoDefaultDescripción
RadioGroup
namestring—Nombre del grupo (para accesibilidad).
valuestring—Valor seleccionado.
onChange(value) => void—Handler de cambio.
orientation'vertical' | 'horizontal''vertical'Dirección de layout.
Radio
valuestring—Valor que representa este radio.
disabledbooleanfalseDesactiva este radio.
childrenReactNode—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.

Estados
Off
On
Focus
Disabled off
Disabled on
Con label inline
<Switch checked={dark} onChange={setDark}>
  Modo oscuro
</Switch>
PropTipoDefaultDescripción
checkedbooleanfalseEstado controlado.
defaultCheckedbooleanfalseEstado inicial no controlado.
onChange(checked) => void—Handler de cambio.
size'md' | 'lg''md'28×16 o 36×20 px.
disabledbooleanfalseDesactiva el switch.
childrenReactNode—Label inline (clickeable).