Feito sobre o UI SDK 0.1.0-beta.1 da Vercel. A API pode mudar.
Image cropper
Um recortador de imagens sobre o UI SDK da Vercel com seleção redimensionável, proporções, moldura redonda para avatar, zoom, rotação e espelhamento.
- Componente
- 10 partes
- 6 exemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-image-cropper.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/ui-sdk-image-cropper.tsx components/ui/button.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
O UI SDK adiciona um pouco de CSS próprio em uma camada de cascata chamada ui-sdk. Declare essa camada no topo da sua folha de estilos global, acima do import do Tailwind, para que suas classes vençam.
O recorte é um retângulo nos pixels da própria imagem, com rotação e espelhamento. Passe-o para cropImage para obter um arquivo que você pode enviar. Uma imagem de outro site precisa de CORS, ou o navegador não deixa a página ler seus pixels.
Com mode="frame", a seleção fica parada e você move e amplia a imagem por baixo. shape="circle" a arredonda, então passe também shape: "circle" para cropImage.
ImageCropperRotate gira a imagem um quarto no sentido horário e ImageCropperFlip a espelha. Sem filhos, são botões de ícone com rótulos em inglês.
Recorte uma foto de um input de arquivo com uma URL de objeto. Dê ao recortador uma key para que uma foto nova comece um recorte novo.
onCropCommit roda quando um arraste ou tecla termina, então salve ali. Um controlador de createImageCropperController() define o recorte de qualquer lugar.
Um recortador desativado não recebe foco nem muda, e seu zoom e botões ficam desativados.
| Tecla | Ação |
|---|---|
| ←→↑↓ | Move a seleção ou, em uma alça, move suas bordas. |
| Shift← | Move dez vezes mais. |
| +- | Amplia ou reduz a partir do centro do recorte. |
| R | Gira a imagem um quarto no sentido horário, ou de volta com Shift. |
| Esc | Durante um arraste, devolve o recorte para onde o arraste começou. |
O recortador é um grupo nomeado por aria-label. A seleção e cada alça são sliders que dizem o recorte em palavras, como “300 by 300 pixels, at 50, 0”, e o zoom diz seu nível, como “125%”. Esses nomes estão em inglês, então passe aria-label para cada parte no idioma da sua página.
A grade só aparece enquanto você arrasta, e nunca com movimento reduzido. As alças ganham uma área de toque maior em telas de toque, a página não rola durante um arraste, e no modo de cores forçadas a seleção ganha uma borda na cor do sistema.
Cada parte envolve a parte do UI SDK de mesmo nome e aceita todas as suas props, incluindo render e um className que pode ser uma função do estado da parte.
| Prop | Tipo | Padrão |
|---|---|---|
src | string | – |
cropO recorte em pixels da imagem, com rotation, flipX e flipY. | ImageCrop | – |
defaultCrop | ImageCrop | – |
onCropChange | (crop, details) => void | – |
onCropCommitRoda quando um arraste, tecla ou roda termina. | (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 | Descrição |
|---|---|
data-slot="image-cropper" | Seleciona o recortador no CSS. |
data-mode | box ou frame. |
data-shape | rectangle ou circle. |
data-loading | Presente até a imagem carregar. |
data-error | Presente quando a imagem falhou ao carregar. |
data-dragging | Presente enquanto um ponteiro arrasta. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="image-cropper-viewport" | Seleciona o viewport no CSS. |
--image-cropper-aspect-ratio | A largura da imagem dividida pela altura depois de carregar. O viewport a usa como proporção. |
| Prop | Tipo | Padrão |
|---|---|---|
altObrigatório. | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Prop | Tipo | Padrão |
|---|---|---|
aria-label | string | "Crop" |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="image-cropper-selection" | Seleciona a seleção no CSS. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, linhas em terços. | ReactNode | – |
| Prop | Tipo | Padrão |
|---|---|---|
positionA borda ou o canto que redimensiona. | "n" | "e" | "s" | "w" | "ne" | "nw" | "se" | "sw" | – |
ImageCropperHandles renderiza as oito. As alças não aparecem no modo frame.
Um input range nativo de 1, o maior recorte, até maxZoom.
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, um ícone com o rótulo Rotate. Com filhos, é um botão de texto pequeno. | ReactNode | – |
| Prop | Tipo | Padrão |
|---|---|---|
direction | "horizontal" | "vertical" | "horizontal" |
childrenPor padrão, um ícone com rótulo em inglês. | ReactNode | – |
- ButtonBotões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
- Video playerUm player de vídeo com barra de busca arrastável, controles que se ocultam sozinhos, atalhos de teclado, velocidade, picture in picture e tela cheia.