Campos, selects, calendarios, edición en línea y los editores de arreglos. Acá vive el piso de safety: validación y estados de error no se simplifican en ningún nivel de minimalidad.
pers.
US$
El salón admite hasta 180 invitados
Quedan 2 lugares: confirmá antes de zarpar
El equipo de salón lo ve antes de armar el timeline.
Se necesita el comentario antes de cerrar el zarpe.
CurrencyInput no tiene error — KIT-021.
8
Elegí una categoría antes de publicar el combo
Tenés que aceptar los términos para reservar
RadioGroupRoot no expone error: no hay forma de marcar el grupo inválido — KIT-023.
Confirmación automática
Reservas de hasta 20 invitados se aprueban solas
Salón abierto hoy
Sincronizando con el calendario del catamarán
No hay proveedores habilitados para esta fecha
Dulce de leche
glutenfrutos secos
TagInput no tiene error: una lista mal cargada no se puede marcar en rojo — KIT-023.
August 2026
Su
Mo
Tu
We
Th
Fr
Sa
20/08/2026
→
22/08/2026
Sin disabled ni error: no bloquea fechas tomadas ni marca un rango inválido — KIT-023.
Nombre del salón
Salón Jardín
Capacidad máxima
180
InlineText
InlineText · disabled
InlineTextField (celda de tabla)
InlineNumberField · con sufijo (celda de tabla)
pers.
#1
#2
Todavía no cargaste beneficios para este charter.
El DNI tiene que tener 8 dígitos
Sin código de país: puede fallar el WhatsApp de confirmación
Visible solo para el equipo de guardia
44 piezas de Entrada que GestorSalon usa y esta galería no mostraba
Medido, no elegido: sale de cruzar los 254 símbolos del kit que aparecen en el código de GestorSalon contra los que estos especímenes montaban. Cada ficha trae el especificador de import y las props que el producto realmente le pasa.
FormField
@solu30/ui-kit/forms187 usos · 30 archivos
Las cinco piezas del formulario validado del kit, que son —después de Button— los cinco símbolos más usados de @solu30/ui-kit en todo GestorSalon: 187, 187, 181, 176 y 159 usos en 30 archivos. Viven en un subpath que la raíz NO reexporta, así que importarlas desde '@solu30/ui-kit' no compila, y ninguna funciona suelta: FormLabel fuera de un FormField tira «useFormField should be used within FormField» y voltea la ruta entera.
control ×187
name ×187
render ×187
Sin formulario, sin contexto y sin validación. Cuando no hay un FormField arriba, ésta es la etiqueta que va.
Separator
@solu30/ui-kit/input100 usos · 51 archivos
La línea divisoria, horizontal o vertical. 51 archivos la usan y la galería no la mostraba porque no llama la atención — que es justo por lo que se reescribe a mano con un `border-t` cada vez.
className ×13
Datos del evento
180 invitados21:00Los Álamos
Collapsible
@solu30/ui-kit/input27 usos · 22 archivos
El plegable en piezas, para cuando el disparador es markup propio. `CollapsibleSection` —la de abajo en el mismo espécimen— es la versión con encabezado armado: título, subtítulo, insignia y acciones a la derecha.
open ×22
onOpenChange ×22
className ×5
defaultOpen ×2
Servicios contratados4 de 7 confirmadosparcial
Catering, barra, DJ y fotografía. Faltan ambientación, transporte y seguridad.
IconButton
@solu30/ui-kit/input26 usos · 13 archivos
Botón de sólo ícono con área táctil correcta y `aria-label` obligatorio. Cuatro variantes y tres tamaños; `tooltip` le pone el texto flotante sin montar un Tooltip aparte.
icon ×26
variant ×26
aria-label ×26
size ×25
tooltip ×20
onClick ×19
OptionCardItem
@solu30/ui-kit/input17 usos · 7 archivos
Radio group con forma de tarjeta: título, descripción e ícono por opción, y una sola seleccionada. `OptionCard` (la de abajo) es la tarjeta suelta que alterna sola, para cuando no hay grupo.
value ×17
title ×17
description ×17
icon ×9
disabled ×1
Slider
@solu30/ui-kit/input8 usos · 7 archivos
Deslizador simple o de rango. El de rango pide `dual` y una tupla como valor — no dos sliders puestos al lado.
value ×8
onChange ×8
min ×8
max ×8
className ×7
size ×6
Invitados estimados: 140
20300
Capacidad del salón: 80 a 220
ColorPicker
@solu30/ui-kit/input4 usos · 3 archivos
Paleta de swatches para elegir un color de entidad — una temporada, una categoría, un proveedor.
colors ×4
value ×4
onChange ×4
aria-label ×4
size ×2
La paleta sale de `SEASON_COLORS`, del propio kit. La API de esta pieza pide hex sueltos — es la única del kit que lo hace, y por eso conviene alimentarla con la constante publicada en vez de un arreglo escrito a mano en cada vertical.
ChipToggle
@solu30/ui-kit/input1 usos · 1 archivos
Interruptor con forma de ficha, en grilla. El `onChange` acepta una promesa: si falla, el estado visual vuelve solo — que es la parte que un `useState` a mano nunca implementa.
label ×1
checked ×1
onChange ×1
Extras del paquete
Cada uno suma al presupuesto del evento
Barra libre
Ambientación
Transporte
Fotografía
ClickableRow
@solu30/ui-kit/input1 usos · 1 archivos
La fila entera como botón, sin perder la semántica: es un `<button>` de verdad, con foco y teclado, no un `<div onClick>`.
onClick ×1
InlineSelect
@solu30/ui-kit2 usos · 2 archivos
Edición en línea de un valor de lista, moneda o costo. Los tres viven sólo en la raíz del paquete: ningún subpath los expone.
value ×2
options ×2
onSave ×2
disabled ×2
Modalidad
Seña cobrada
Costo por cubierto
$
AccordionList
@solu30/ui-kit/input1 usos · 1 archivos
La lista de acordeón completa: descriptores como dato, apertura controlada y contenido por función de render. `dimInactive` apaga las que no están abiertas.
items ×1
openItems ×1
onToggle ×1
renderContent ×1
Detalle de la etapa «Seña».
FormSection
@solu30/ui-kit27 usos · 7 archivos
Bloque de formulario con título, ícono y plegado opcional. Es el andamiaje que GestorSalon repite en 27 lugares.
title ×27
icon ×27
collapsible ×5
defaultOpen ×5
FormSheet
@solu30/ui-kit14 usos · 12 archivos
Panel lateral con formulario adentro: encabezado, cuerpo, pie con enviar y cancelar, estado de envío y de deshabilitado. Es `SheetRoot` + `SheetContent` + pie, ya armado.
open ×14
onOpenChange ×14
title ×14
icon ×14
onSubmit ×14
submitLabel ×14
addDurationToTime
@solu30/ui-kit/input4 usos · 2 archivos
Aritmética de horarios que cruza la medianoche. Vive en `input` y no en `utils`, que es parte de por qué nadie la encuentra — y su hermana `calcDurationMinutes` trabaja en otra unidad, que es la otra parte.
Las dos cruzan la medianoche sin que el consumidor tenga que pensarlo — que es el cálculo que un salón de eventos hace en cada ficha, y el que se escribe mal la primera vez en cada vertical. Ojo con las unidades: la que suma toma HORAS y la que resta devuelve MINUTOS. Están una al lado de la otra en el mismo módulo y nada en el nombre lo dice; el 5.5 de arriba es media hora, no cinco minutos y medio. Y la segunda devuelve null cuando no puede parsear, así que el resultado se lee antes de usarlo.
Las quince partes que acompañan a los especímenes de arriba
Todas están montadas y funcionando en los especímenes de esta misma página; van en tabla y no en ficha propia porque ninguna se usa sola. `CollapsibleContent` fuera de `Collapsible` no tiene dónde renderizarse, y `OptionCardItem` fuera de su grupo no tiene con quién ser mutuamente excluyente.
title ×5 · description ×5 · active ×5 · onClick ×5 · icon ×1
ChipToggleGroup
@solu30/ui-kit/input
1
title ×1 · columns ×1
FilterChip
@solu30/ui-kit/input
3
label ×3 · onRemove ×3 · variant ×2
InlineCurrency
@solu30/ui-kit
1
value ×1 · onSave ×1 · disabled ×1
InlineCostInput
@solu30/ui-kit
1
value ×1 · onSave ×1 · disabled ×1
calcDurationMinutes
@solu30/ui-kit/input
1
—
Las quince que no se demuestran en vivo, y por qué
Existen, se importan igual y el especificador de la tabla es el bueno. No se montan porque la demostración costaría más de lo que enseña, o mentiría: las cuatro de imágenes piden un backend de subida y un diálogo que sin él no hace nada; el selector de emojis arrastra su propio paquete de datos por una pieza que aparece una vez en todo el producto; los tres chevrones son las flechas internas del calendario, que ya se ven en el espécimen del calendario; las dos fábricas de clases devuelven strings que se ven aplicados en Button y en Calendar; y los dos hooks de formulario necesitan un esquema y una mutación de verdad para que su comportamiento signifique algo.