Hecho sobre el UI SDK 0.1.0-beta.1 de Vercel. Su API puede cambiar.
Image cropper
Un recortador de imágenes sobre el UI SDK de Vercel con selección redimensionable, proporciones, marco redondo para avatar, zoom, rotación y volteo.
- Componente
- 10 partes
- 6 ejemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-image-cropper.jsonAñade el componente, los tokens del tema de HextaUI y los componentes de HextaUI de los que depende.
Añade los tokens del tema a tu CSS global, si aún no lo has hecho.
Instala las dependencias.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cnCopia y pega el siguiente código en tu proyecto.
components/ui/ui-sdk-image-cropper.tsx components/ui/button.tsx Actualiza las rutas de importación para que coincidan con la configuración de tu proyecto.
UI SDK añade un poco de CSS propio en una capa de cascada llamada ui-sdk. Declara esa capa al principio de tu hoja de estilos global, encima del import de Tailwind, para que tus clases ganen.
El recorte es un rectángulo en los píxeles propios de la imagen, con su rotación y volteo. Pásalo a cropImage para obtener un archivo que puedes subir. Una imagen de otro sitio necesita CORS, o el navegador no dejará que la página lea sus píxeles.
Con mode="frame", la selección queda fija y mueves y amplías la imagen debajo. shape="circle" la redondea, así que pasa también shape: "circle" a cropImage.
ImageCropperRotate gira la imagen un cuarto en sentido horario y ImageCropperFlip la refleja. Sin hijos son botones de icono con etiquetas en inglés.
Recorta una foto de un input de archivo con una URL de objeto. Da al recortador una key para que una foto nueva empiece un recorte nuevo.
onCropCommit se ejecuta al terminar un arrastre o una tecla, así que guarda ahí. Un controlador de createImageCropperController() fija el recorte desde cualquier lugar.
Un recortador deshabilitado no recibe foco ni cambia, y su zoom y botones quedan deshabilitados.
| Key | Acción |
|---|---|
| ←→↑↓ | Mueve la selección o, en un tirador, mueve sus bordes. |
| Shift← | Mueve diez veces más. |
| +- | Amplía o reduce desde el centro del recorte. |
| R | Gira la imagen un cuarto en sentido horario, o al revés con Shift. |
| Esc | Durante un arrastre, devuelve el recorte a donde empezó. |
El recortador es un grupo nombrado por aria-label. La selección y cada tirador son sliders que dicen el recorte en palabras, como “300 by 300 pixels, at 50, 0”, y el zoom dice su nivel, como “125%”. Esos nombres están en inglés, así que pasa aria-label a cada parte para nombrarla en el idioma de tu página.
La cuadrícula solo aparece mientras arrastras, y nunca con movimiento reducido. Los tiradores tienen un área táctil mayor en pantallas táctiles, la página no se desplaza durante un arrastre, y en modo de colores forzados la selección tiene un borde del color del sistema.
Cada parte envuelve la parte de UI SDK del mismo nombre y acepta todas sus props, incluidas render y un className que puede ser una función del estado de la parte.
| Prop | Tipo | Predeterminado |
|---|---|---|
src | string | – |
cropEl recorte en píxeles de la imagen, con rotation, flipX y flipY. | ImageCrop | – |
defaultCrop | ImageCrop | – |
onCropChange | (crop, details) => void | – |
onCropCommitSe ejecuta al terminar un arrastre, una tecla o la rueda. | (crop, details) => void | – |
mode | "box" | "frame" | "box" |
aspectRatio | number | – |
shape | "rectangle" | "circle" | "rectangle" |
minWidth | number | – |
minHeight | number | – |
maxZoom | number | 10 |
disabled | boolean | false |
controllerDe createImageCropperController(). | ImageCropperController | – |
| Atributo | Descripción |
|---|---|
data-slot="image-cropper" | Selecciona el recortador en CSS. |
data-mode | box o frame. |
data-shape | rectangle o circle. |
data-loading | Presente hasta que carga la imagen. |
data-error | Presente cuando la imagen no se pudo cargar. |
data-dragging | Presente mientras un puntero arrastra. |
| Prop | Tipo | Predeterminado |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="image-cropper-viewport" | Selecciona el viewport en CSS. |
--image-cropper-aspect-ratio | El ancho de la imagen entre su alto una vez cargada. El viewport la usa como proporción. |
| Prop | Tipo | Predeterminado |
|---|---|---|
altObligatorio. | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
aria-label | string | "Crop" |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descripción |
|---|---|
data-slot="image-cropper-selection" | Selecciona la selección en CSS. |
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenPor defecto, líneas en tercios. | ReactNode | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
positionEl borde o la esquina que redimensiona. | "n" | "e" | "s" | "w" | "ne" | "nw" | "se" | "sw" | – |
ImageCropperHandles renderiza los ocho. Los tiradores no aparecen en modo frame.
Un input range nativo de 1, el recorte más grande, a maxZoom.
| Prop | Tipo | Predeterminado |
|---|---|---|
childrenPor defecto, un icono con la etiqueta Rotate. Con hijos es un botón de texto pequeño. | ReactNode | – |
| Prop | Tipo | Predeterminado |
|---|---|---|
direction | "horizontal" | "vertical" | "horizontal" |
childrenPor defecto, un icono con una etiqueta en inglés. | ReactNode | – |
- ButtonBotones en todas las variantes y tamaños, con un flujo integrado de carga, éxito y error que omite el spinner en las peticiones rápidas.
- Video playerUn reproductor de vídeo con barra de búsqueda arrastrable, controles que se ocultan solos, atajos de teclado, velocidad, imagen en imagen y pantalla completa.