Construit sur l’UI SDK 0.1.0-beta.1 de Vercel. Son API peut changer.
Image cropper
Un recadreur d’image sur l’UI SDK de Vercel avec sélection redimensionnable, formats, cadre d’avatar rond, zoom, rotation et retournement.
- Composant
- 10 parties
- 6 exemples
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-image-cropper.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/ui-sdk-image-cropper.tsx components/ui/button.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
UI SDK ajoute un peu de CSS dans une couche de cascade nommée ui-sdk. Déclarez cette couche en haut de votre feuille de style globale, au-dessus de l’import Tailwind, pour que vos classes l’emportent.
Le recadrage est un rectangle dans les pixels de l’image, avec sa rotation et son retournement. Passez-le à cropImage pour obtenir un fichier à envoyer. Une image d’un autre site a besoin de CORS, sinon le navigateur empêche la page de lire ses pixels.
Avec mode="frame", la sélection reste fixe et vous déplacez et zoomez l’image dessous. shape="circle" l’arrondit : passez aussi shape: "circle" à cropImage.
ImageCropperRotate tourne l’image d’un quart dans le sens horaire et ImageCropperFlip la retourne. Sans enfants, ce sont des boutons icône aux libellés anglais.
Recadrez une photo issue d’un input de fichier avec une URL d’objet. Donnez une key au recadreur pour qu’une nouvelle photo reparte de zéro.
onCropCommit s’exécute à la fin d’un glissement ou d’une touche : enregistrez-y. Un contrôleur issu de createImageCropperController() définit le recadrage depuis n’importe où.
Un recadreur désactivé ne prend pas le focus et ne change pas, et son zoom et ses boutons sont désactivés.
| Touche | Action |
|---|---|
| ←→↑↓ | Déplace la sélection, ou sur une poignée, déplace ses bords. |
| Shift← | Déplace dix fois plus loin. |
| +- | Zoome ou dézoome autour du centre du recadrage. |
| R | Tourne l’image d’un quart dans le sens horaire, ou en arrière avec Maj. |
| Esc | Pendant un glissement, remet le recadrage là où il a commencé. |
Le recadreur est un groupe nommé par aria-label. La sélection et chaque poignée sont des sliders qui énoncent le recadrage, comme « 300 by 300 pixels, at 50, 0 », et le zoom son niveau, comme « 125% ». Ces noms sont en anglais : passez un aria-label à chaque partie dans la langue de votre page.
La grille n’apparaît que pendant un glissement, et jamais si le mouvement est réduit. Les poignées ont une zone tactile plus grande sur écran tactile, la page ne défile pas pendant un glissement, et en mode couleurs forcées la sélection reçoit une bordure aux couleurs du système.
Chaque partie enveloppe la partie UI SDK du même nom et accepte toutes ses props, y compris render et un className qui peut être une fonction de son état.
| Prop | Type | Par défaut |
|---|---|---|
src | string | – |
cropLe recadrage en pixels de l’image, avec rotation, flipX et flipY. | ImageCrop | – |
defaultCrop | ImageCrop | – |
onCropChange | (crop, details) => void | – |
onCropCommitS’exécute à la fin d’un glissement, d’une touche ou de la molette. | (crop, details) => void | – |
mode | "box" | "frame" | "box" |
aspectRatio | number | – |
shape | "rectangle" | "circle" | "rectangle" |
minWidth | number | – |
minHeight | number | – |
maxZoom | number | 10 |
disabled | boolean | false |
controllerIssu de createImageCropperController(). | ImageCropperController | – |
| Attribut | Description |
|---|---|
data-slot="image-cropper" | Cible le recadreur en CSS. |
data-mode | box ou frame. |
data-shape | rectangle ou circle. |
data-loading | Présent jusqu’au chargement de l’image. |
data-error | Présent lorsque l’image n’a pas pu se charger. |
data-dragging | Présent pendant un glissement du pointeur. |
| Prop | Type | Par défaut |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="image-cropper-viewport" | Cible le viewport en CSS. |
--image-cropper-aspect-ratio | La largeur de l’image sur sa hauteur une fois chargée. Le viewport la prend comme format. |
| Prop | Type | Par défaut |
|---|---|---|
altRequis. | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Prop | Type | Par défaut |
|---|---|---|
aria-label | string | "Crop" |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="image-cropper-selection" | Cible la sélection en CSS. |
| Prop | Type | Par défaut |
|---|---|---|
childrenPar défaut, des lignes en tiers. | ReactNode | – |
| Prop | Type | Par défaut |
|---|---|---|
positionLe bord ou le coin qu’elle redimensionne. | "n" | "e" | "s" | "w" | "ne" | "nw" | "se" | "sw" | – |
ImageCropperHandles affiche les huit. Les poignées n’apparaissent pas en mode frame.
Un input range natif de 1, le plus grand recadrage, à maxZoom.
| Prop | Type | Par défaut |
|---|---|---|
childrenPar défaut, une icône avec le libellé Rotate. Avec des enfants, c’est un petit bouton texte. | ReactNode | – |
| Prop | Type | Par défaut |
|---|---|---|
direction | "horizontal" | "vertical" | "horizontal" |
childrenPar défaut, une icône avec un libellé anglais. | ReactNode | – |
- ButtonDes boutons dans toutes les variantes et tailles, avec un flux de chargement, de succès et d’erreur intégré qui évite le spinner pour les requêtes rapides.
- Video playerUn lecteur vidéo avec une barre de recherche déplaçable, des contrôles qui se masquent automatiquement, des raccourcis clavier, la vitesse, l'image dans l'image et le plein écran.