Saltar al contenido
El Muestrario

componente · @solu30/ui-kit/input

ImageUpload

Subida de imágenes con grilla de miniaturas y borrado, agnóstica de dónde se guarden los archivos.

Seguir leyendo — 2 párrafos más

Storage-agnostic image upload widget.

Renders a dropzone / thumbnail grid + optional gallery-picker trigger. All storage concerns (tRPC, Cloudflare, S3…) live in the onUpload prop.

4 sitios de import en 3 de 15 verticales — un archivo que la importa cuenta una vez, monte una instancia o veinte.

  • gestorsalon
  • luigi
  • raquetea

El componente, montado

Cargando el espécimen…

Cómo se usa

import { ImageUpload } from '@solu30/ui-kit/input'

Props

11 props declaradas en los tipos de la versión instalada.
PropRequeridaTipoQué hace
imagessíImageItem[]Currently persisted images
onUploadsí(file: File) => Promise<ImageItem>Called when the user drops / selects a file. Must upload the file and return the resulting { id, url }.
onDeleteopcional(id: string) => Promise<void>Called when the user clicks the delete button on a thumbnail
onReorderopcional(ids: string[]) => void@deprecated NO HACE NADA. El reordenamiento por arrastre nunca se implementó: no hay `draggable`, ni handlers de drag, ni nada que pueda invocar este callback — se recibe y se descarta. Hasta 5.11.0 la grilla además dibujaba un asa de arrastre (`GripVertical`) al pasar el mouse, que prometía en pantalla lo que el componente no hacía; se quitó junto con esta deprecación. Si necesitás reordenar, ordená `images` desde el host y volvé a pasarlo. Se elimina en el próximo major.
maxImagesopcionalnumberMaximum number of images allowed (default 10)
acceptopcionalstringAccepted MIME types joined as accept string (default 'image/*')
multipleopcionalbooleanAllow selecting multiple files at once (default true)
compactopcionalbooleanCompact row mode: thumbnails + inline add button instead of full dropzone
showGalleryButtonopcionalbooleanWhen true, renders an "Open gallery" button below the dropzone. The button just fires onGalleryOpen — the host decides what dialog to show.
onGalleryOpenopcional() => void—
classNameopcionalstring—

Ejemplo del paquete

<ImageUpload
  images={images}
  onUpload={async (file) => {
    const result = await trpc.images.upload.mutateAsync(file)
    return { id: result.id, url: result.url }
  }}
  onDelete={async (id) => { await trpc.images.delete.mutateAsync({ id }) }}
  maxImages={6}
/>

Del @example del JSDoc de @solu30/ui-kit, sin editar: son 65 de los 541 símbolos. La sangría y los renglones en blanco son los del paquete.