Saltar al contenido
El Muestrario
02

Entrada

input · Entrada

113 exports

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

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

glutenfrutos secos
TagInput no tiene error: una lista mal cargada no se puede marcar en rojo — KIT-023.
August 2026

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.

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

Es el nombre que ve el cliente en el presupuesto y en el contrato.

Ninguna de las cinco piezas recibe el error como prop: lo leen del contexto que abre FormField. Y ahí está el problema — probalo.

Defecto medido en la 5.8.1, no una advertencia teórica. Vaciá el campo y tocá Guardar tres veces: no aparece el mensaje y el campo sigue diciendo aria-invalid="false". Escribí un nombre válido: ahí se pone en rojo y aparece «El salón necesita un nombre», sobre un campo que ya está bien. El estado de error va un render atrasado, y como un campo inválido no provoca más renders, nunca se muestra mientras está mal — y sí se muestra una vez cuando se arregla. Un lector de pantalla recibe lo contrario de la verdad en los dos momentos. Está reportado; hasta que se corrija, este espécimen lo enseña en vez de esconderlo.

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 invitados
21:00
Los Á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

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.

addDurationToTime(21:00, 5.5) = 02:30calcDurationMinutes(21:00, 02:30) = 330

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.

SímboloDe dóndeUsosProps que le pasa GestorSalon
FormItem@solu30/ui-kit/forms187className ×10
FormControl@solu30/ui-kit/forms181
FormLabel@solu30/ui-kit/forms176className ×33 · htmlFor ×17
FormMessage@solu30/ui-kit/forms159
FormDescription@solu30/ui-kit/forms7className ×1
CollapsibleTrigger@solu30/ui-kit/input27className ×15 · asChild ×12 · aria-label ×3
CollapsibleContent@solu30/ui-kit/input27className ×15
CollapsibleSection@solu30/ui-kit/input24title ×24 · isOpen ×16 · onToggle ×16 · icon ×15 · compact ×14 · badge ×13
OptionCardGroup@solu30/ui-kit/input7value ×7 · onValueChange ×7 · className ×7 · aria-label ×7 · disabled ×1
OptionCard@solu30/ui-kit/input5title ×5 · description ×5 · active ×5 · onClick ×5 · icon ×1
ChipToggleGroup@solu30/ui-kit/input1title ×1 · columns ×1
FilterChip@solu30/ui-kit/input3label ×3 · onRemove ×3 · variant ×2
InlineCurrency@solu30/ui-kit1value ×1 · onSave ×1 · disabled ×1
InlineCostInput@solu30/ui-kit1value ×1 · onSave ×1 · disabled ×1
calcDurationMinutes@solu30/ui-kit/input1

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.

SímboloDe dóndeUsosProps que le pasa GestorSalon
useSheetForm@solu30/ui-kit/forms5
useCollapsibleSections@solu30/ui-kit/input2
buttonVariants@solu30/ui-kit/input3
calendarVariants@solu30/ui-kit/input2
ChevronLeftIcon@solu30/ui-kit/input2className ×1
ChevronRightIcon@solu30/ui-kit/input2className ×1
ChevronDownIcon@solu30/ui-kit/input1className ×1
EmojiPicker@solu30/ui-kit/input1onEmojiSelect ×1 · autoFocus ×1
ImageUpload@solu30/ui-kit/input1images ×1 · onUpload ×1 · onDelete ×1 · maxImages ×1 · compact ×1 · showGalleryButton ×1
ImageUrlInput@solu30/ui-kit1value ×1 · onChange ×1 · onUpload ×1 · galleryImages ×1 · galleryLoading ×1 · placeholder ×1
ImagePickerDialog@solu30/ui-kit1open ×1 · onOpenChange ×1 · tabs ×1 · onSelect ×1 · isPending ×1 · title ×1
ImageItemsólo tipo1
ImagePickerTabsólo tipo0
GalleryImagesólo tipo0
AccordionItemsólo tipo0