@webiny/admin-ui 0.0.0-unstable.7be00a75a9 → 0.0.0-unstable.7c2def32a7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Accordion/Accordion.d.ts +7 -6
- package/Accordion/Accordion.stories.d.ts +1 -1
- package/Accordion/Accordion.stories.js.map +1 -1
- package/Accordion/components/AccordionContent.js +4 -1
- package/Accordion/components/AccordionContent.js.map +1 -1
- package/Accordion/components/AccordionItem.d.ts +8 -6
- package/Accordion/components/AccordionItem.js.map +1 -1
- package/Accordion/components/AccordionItemAction.d.ts +7 -6
- package/Accordion/components/AccordionItemDragHandle.d.ts +2 -1
- package/Accordion/components/AccordionItemDragHandle.js +2 -1
- package/Accordion/components/AccordionItemDragHandle.js.map +1 -1
- package/Accordion/components/AccordionItemIcon.d.ts +7 -6
- package/Accordion/components/AccordionItemSeparator.d.ts +7 -6
- package/Accordion/components/AccordionTrigger.js +4 -2
- package/Accordion/components/AccordionTrigger.js.map +1 -1
- package/Alert/Alert.d.ts +21 -19
- package/Alert/Alert.stories.d.ts +1 -1
- package/Alert/Alert.stories.js.map +1 -1
- package/AutoComplete/AutoComplete.d.ts +7 -6
- package/AutoComplete/AutoComplete.stories.d.ts +1 -1
- package/AutoComplete/AutoComplete.stories.js.map +1 -1
- package/AutoComplete/primitives/AutoCompletePrimitive.d.ts +13 -6
- package/AutoComplete/primitives/AutoCompletePrimitive.js +1 -0
- package/AutoComplete/primitives/AutoCompletePrimitive.js.map +1 -1
- package/AutoComplete/primitives/AutoCompletePrimitive.stories.d.ts +1 -1
- package/AutoComplete/primitives/AutoCompletePrimitive.stories.js.map +1 -1
- package/Avatar/Avatar.d.ts +9 -8
- package/Avatar/Avatar.stories.d.ts +1 -1
- package/Avatar/Avatar.stories.js.map +1 -1
- package/Avatar/components/AvatarFallback.d.ts +7 -6
- package/Avatar/components/AvatarImage.d.ts +7 -6
- package/BetaBadge/BetaBadge.d.ts +6 -0
- package/BetaBadge/BetaBadge.js +7 -0
- package/BetaBadge/BetaBadge.js.map +1 -0
- package/Breadcrumbs/Breadcrumbs.d.ts +54 -0
- package/Breadcrumbs/Breadcrumbs.js +66 -0
- package/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/Breadcrumbs/Breadcrumbs.stories.d.ts +9 -0
- package/Breadcrumbs/Breadcrumbs.stories.js +71 -0
- package/Breadcrumbs/Breadcrumbs.stories.js.map +1 -0
- package/Breadcrumbs/index.d.ts +1 -0
- package/Breadcrumbs/index.js +1 -0
- package/Button/Button.d.ts +10 -9
- package/Button/Button.js +7 -0
- package/Button/Button.js.map +1 -1
- package/Button/Button.mdx +13 -0
- package/Button/Button.stories.d.ts +2 -1
- package/Button/Button.stories.js +9 -2
- package/Button/Button.stories.js.map +1 -1
- package/Button/CopyButton.d.ts +7 -6
- package/Button/IconButton.d.ts +10 -9
- package/Button/IconButton.stories.d.ts +1 -1
- package/Button/IconButton.stories.js.map +1 -1
- package/Calendar/Calendar.d.ts +7 -6
- package/Calendar/calendarClassNames.js +1 -1
- package/Calendar/calendarClassNames.js.map +1 -1
- package/Card/Card.d.ts +8 -22
- package/Card/Card.stories.d.ts +1 -1
- package/Card/Card.stories.js.map +1 -1
- package/Card/components/CancelAction.d.ts +8 -6
- package/Card/components/CardContent.d.ts +6 -6
- package/Card/components/CardTitle.d.ts +2 -2
- package/Card/components/ConfirmAction.d.ts +8 -6
- package/Card/components/Icon.d.ts +7 -6
- package/Checkbox/Checkbox.d.ts +7 -6
- package/Checkbox/Checkbox.stories.d.ts +1 -1
- package/Checkbox/Checkbox.stories.js.map +1 -1
- package/Checkbox/primitives/CheckboxPrimitive.d.ts +17 -12
- package/Checkbox/primitives/CheckboxPrimitive.stories.d.ts +1 -1
- package/Checkbox/primitives/CheckboxPrimitive.stories.js.map +1 -1
- package/CheckboxGroup/CheckboxGroup.d.ts +7 -6
- package/CheckboxGroup/CheckboxGroup.stories.d.ts +1 -1
- package/CheckboxGroup/CheckboxGroup.stories.js.map +1 -1
- package/CheckboxGroup/primitives/CheckboxGroupPrimitive.d.ts +20 -12
- package/CheckboxGroup/primitives/CheckboxGroupPrimitive.stories.d.ts +1 -1
- package/CheckboxGroup/primitives/CheckboxGroupPrimitive.stories.js.map +1 -1
- package/CodeEditor/CodeEditor.d.ts +7 -6
- package/CodeEditor/CodeEditor.stories.d.ts +1 -1
- package/CodeEditor/CodeEditor.stories.js.map +1 -1
- package/CodeEditor/CodeEditorPrimitive.d.ts +7 -6
- package/CodeEditor/CodeEditorPrimitive.js +3 -1
- package/CodeEditor/CodeEditorPrimitive.js.map +1 -1
- package/CodeEditor/CodeEditorPrimitive.stories.d.ts +1 -1
- package/CodeEditor/CodeEditorPrimitive.stories.js.map +1 -1
- package/ColorPicker/ColorPicker.d.ts +7 -6
- package/ColorPicker/ColorPicker.stories.d.ts +1 -1
- package/ColorPicker/ColorPicker.stories.js.map +1 -1
- package/ColorPicker/primitives/ColorPickerPrimitive.d.ts +7 -6
- package/ColorPicker/primitives/ColorPickerPrimitive.stories.d.ts +1 -1
- package/ColorPicker/primitives/ColorPickerPrimitive.stories.js.map +1 -1
- package/Command/Command.d.ts +10 -8
- package/Command/components/List.d.ts +1 -1
- package/Command/components/List.js +9 -5
- package/Command/components/List.js.map +1 -1
- package/DataList/DataListModal.d.ts +6 -3
- package/DataTable/DataTable.d.ts +23 -12
- package/DataTable/DataTable.js +18 -7
- package/DataTable/DataTable.js.map +1 -1
- package/DataTable/DataTable.stories.d.ts +1 -1
- package/DataTable/DataTable.stories.js.map +1 -1
- package/DataTable/components/ColumnsVisibility.d.ts +5 -4
- package/DataTable/components/ColumnsVisibility.js +7 -3
- package/DataTable/components/ColumnsVisibility.js.map +1 -1
- package/DatePicker/DatePicker.d.ts +11 -7
- package/DatePicker/DatePicker.js +10 -2
- package/DatePicker/DatePicker.js.map +1 -1
- package/DatePicker/DatePicker.stories.d.ts +11 -1
- package/DatePicker/DatePicker.stories.js +44 -1
- package/DatePicker/DatePicker.stories.js.map +1 -1
- package/DatePicker/primitives/BirthdayPicker.d.ts +13 -0
- package/DatePicker/primitives/BirthdayPicker.js +355 -0
- package/DatePicker/primitives/BirthdayPicker.js.map +1 -0
- package/DatePicker/primitives/BirthdayPickerCell.d.ts +14 -0
- package/DatePicker/primitives/BirthdayPickerCell.js +19 -0
- package/DatePicker/primitives/BirthdayPickerCell.js.map +1 -0
- package/DatePicker/primitives/BirthdayPickerSegments.d.ts +9 -0
- package/DatePicker/primitives/BirthdayPickerSegments.js +43 -0
- package/DatePicker/primitives/BirthdayPickerSegments.js.map +1 -0
- package/DatePicker/primitives/DateOnlyPicker.js +2 -2
- package/DatePicker/primitives/DateOnlyPicker.js.map +1 -1
- package/DatePicker/primitives/DatePickerPrimitive.d.ts +7 -6
- package/DatePicker/primitives/DatePickerPrimitive.js +3 -0
- package/DatePicker/primitives/DatePickerPrimitive.js.map +1 -1
- package/DatePicker/primitives/DateRangePicker.js +3 -3
- package/DatePicker/primitives/DateRangePicker.js.map +1 -1
- package/DatePicker/primitives/DateTimePicker.d.ts +1 -1
- package/DatePicker/primitives/DateTimePicker.js +26 -18
- package/DatePicker/primitives/DateTimePicker.js.map +1 -1
- package/DatePicker/primitives/MultipleDatesPicker.js +3 -3
- package/DatePicker/primitives/MultipleDatesPicker.js.map +1 -1
- package/DatePicker/primitives/components/DatePickerTrigger.js +2 -2
- package/DatePicker/primitives/components/DatePickerTrigger.js.map +1 -1
- package/DatePicker/utils/birthdayHelpers.d.ts +77 -0
- package/DatePicker/utils/birthdayHelpers.js +145 -0
- package/DatePicker/utils/birthdayHelpers.js.map +1 -0
- package/DatePicker/utils/birthdayHelpers.test.d.ts +1 -0
- package/DatePicker/utils/birthdayHelpers.test.js +394 -0
- package/DatePicker/utils/birthdayHelpers.test.js.map +1 -0
- package/DatePicker/utils/dateHelpers.d.ts +6 -1
- package/DatePicker/utils/dateHelpers.js +13 -5
- package/DatePicker/utils/dateHelpers.js.map +1 -1
- package/DatePicker/utils/dateHelpers.test.d.ts +1 -0
- package/DatePicker/utils/dateHelpers.test.js +32 -0
- package/DatePicker/utils/dateHelpers.test.js.map +1 -0
- package/DatePicker/utils/index.d.ts +1 -0
- package/DatePicker/utils/index.js +1 -0
- package/DatePicker/utils/timezoneHelpers.d.ts +3 -0
- package/DatePicker/utils/timezoneHelpers.js +32 -0
- package/DatePicker/utils/timezoneHelpers.js.map +1 -0
- package/DatePicker/utils/types.d.ts +15 -2
- package/Dialog/Dialog.d.ts +8 -22
- package/Dialog/Dialog.stories.d.ts +1 -1
- package/Dialog/Dialog.stories.js.map +1 -1
- package/Dialog/components/CancelAction.d.ts +8 -6
- package/Dialog/components/ConfirmAction.d.ts +8 -6
- package/Dialog/components/DialogContent.d.ts +1 -1
- package/Dialog/components/DialogFooter.d.ts +1 -1
- package/Dialog/components/DialogTitle.d.ts +1 -1
- package/Dialog/components/Icon.d.ts +7 -6
- package/DragCursor/DragCursor.d.ts +7 -0
- package/DragCursor/DragCursor.js +21 -0
- package/DragCursor/DragCursor.js.map +1 -0
- package/DragCursor/DragCursor.stories.d.ts +10 -0
- package/DragCursor/DragCursor.stories.js +97 -0
- package/DragCursor/DragCursor.stories.js.map +1 -0
- package/DragCursor/index.d.ts +1 -0
- package/DragCursor/index.js +1 -0
- package/Drawer/Drawer.d.ts +18 -28
- package/Drawer/Drawer.js +2 -1
- package/Drawer/Drawer.js.map +1 -1
- package/Drawer/Drawer.stories.d.ts +2 -1
- package/Drawer/Drawer.stories.js +21 -2
- package/Drawer/Drawer.stories.js.map +1 -1
- package/Drawer/components/CancelButton.d.ts +8 -6
- package/Drawer/components/ConfirmButton.d.ts +8 -6
- package/Drawer/components/DrawerContent.d.ts +1 -1
- package/Drawer/components/DrawerHeader.d.ts +2 -2
- package/Drawer/components/DrawerHeader.js +11 -8
- package/Drawer/components/DrawerHeader.js.map +1 -1
- package/Drawer/components/Icon.d.ts +7 -6
- package/Drawer/components/Icon.js +3 -4
- package/Drawer/components/Icon.js.map +1 -1
- package/DropdownMenu/DropdownMenu.stories.d.ts +1 -1
- package/DropdownMenu/DropdownMenu.stories.js.map +1 -1
- package/DropdownMenu/components/DropdownMenuItem.d.ts +8 -2
- package/DropdownMenu/components/DropdownMenuItem.js +11 -3
- package/DropdownMenu/components/DropdownMenuItem.js.map +1 -1
- package/DropdownMenu/components/DropdownMenuLink.d.ts +9 -8
- package/DropdownMenu/components/DropdownMenuSeparator.d.ts +7 -6
- package/EditableTitle/EditableTitle.d.ts +67 -0
- package/EditableTitle/EditableTitle.js +73 -0
- package/EditableTitle/EditableTitle.js.map +1 -0
- package/EditableTitle/index.d.ts +1 -0
- package/EditableTitle/index.js +1 -0
- package/EmptyState/EmptyState.d.ts +43 -0
- package/EmptyState/EmptyState.js +93 -0
- package/EmptyState/EmptyState.js.map +1 -0
- package/EmptyState/EmptyState.stories.d.ts +13 -0
- package/EmptyState/EmptyState.stories.js +136 -0
- package/EmptyState/EmptyState.stories.js.map +1 -0
- package/EmptyState/illustrations/ContentIllustration.d.ts +2 -0
- package/EmptyState/illustrations/ContentIllustration.js +100 -0
- package/EmptyState/illustrations/ContentIllustration.js.map +1 -0
- package/EmptyState/illustrations/LayoutIllustration.d.ts +2 -0
- package/EmptyState/illustrations/LayoutIllustration.js +93 -0
- package/EmptyState/illustrations/LayoutIllustration.js.map +1 -0
- package/EmptyState/illustrations/ListingIllustration.d.ts +2 -0
- package/EmptyState/illustrations/ListingIllustration.js +92 -0
- package/EmptyState/illustrations/ListingIllustration.js.map +1 -0
- package/EmptyState/illustrations/SelectIllustration.d.ts +2 -0
- package/EmptyState/illustrations/SelectIllustration.js +100 -0
- package/EmptyState/illustrations/SelectIllustration.js.map +1 -0
- package/EmptyState/illustrations/TableIllustration.d.ts +2 -0
- package/EmptyState/illustrations/TableIllustration.js +233 -0
- package/EmptyState/illustrations/TableIllustration.js.map +1 -0
- package/EmptyState/illustrations/UploadIllustration.d.ts +2 -0
- package/EmptyState/illustrations/UploadIllustration.js +77 -0
- package/EmptyState/illustrations/UploadIllustration.js.map +1 -0
- package/EmptyState/illustrations/index.d.ts +6 -0
- package/EmptyState/illustrations/index.js +6 -0
- package/EmptyState/index.d.ts +1 -0
- package/EmptyState/index.js +1 -0
- package/FilePicker/FilePicker.d.ts +19 -18
- package/FilePicker/FilePicker.stories.d.ts +7 -1
- package/FilePicker/FilePicker.stories.js +24 -1
- package/FilePicker/FilePicker.stories.js.map +1 -1
- package/FilePicker/primitives/FilePickerPrimitive.d.ts +20 -19
- package/FilePicker/primitives/FilePickerPrimitive.stories.d.ts +1 -1
- package/FilePicker/primitives/FilePickerPrimitive.stories.js.map +1 -1
- package/FilePicker/primitives/components/Trigger.d.ts +1 -1
- package/FilePicker/primitives/components/previews/ImagePreview/ImagePreview.d.ts +19 -7
- package/FilePicker/primitives/components/previews/ImagePreview/ImagePreview.js +15 -6
- package/FilePicker/primitives/components/previews/ImagePreview/ImagePreview.js.map +1 -1
- package/FilePicker/primitives/components/previews/ItemActions.js +1 -1
- package/FilePicker/primitives/components/previews/ItemActions.js.map +1 -1
- package/FilePicker/primitives/components/previews/ItemDescription.js +1 -1
- package/FilePicker/primitives/components/previews/ItemDescription.js.map +1 -1
- package/FilePicker/primitives/components/previews/RichItemPreview/FileType.d.ts +5 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/FileType.js +45 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/FileType.js.map +1 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/Placeholder.d.ts +5 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/Placeholder.js +14 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/Placeholder.js.map +1 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/RichItemPreview.d.ts +12 -6
- package/FilePicker/primitives/components/previews/RichItemPreview/RichItemPreview.js +54 -12
- package/FilePicker/primitives/components/previews/RichItemPreview/RichItemPreview.js.map +1 -1
- package/FilePicker/primitives/components/previews/RichItemPreview/RichItemThumbnail.d.ts +11 -1
- package/FilePicker/primitives/components/previews/RichItemPreview/RichItemThumbnail.js +8 -61
- package/FilePicker/primitives/components/previews/RichItemPreview/RichItemThumbnail.js.map +1 -1
- package/FilePicker/primitives/components/previews/RichItemPreview/Thumbnail.d.ts +11 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/Thumbnail.js +24 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/Thumbnail.js.map +1 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/ThumbnailActions.d.ts +10 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/ThumbnailActions.js +46 -0
- package/FilePicker/primitives/components/previews/RichItemPreview/ThumbnailActions.js.map +1 -0
- package/FilePicker/primitives/components/previews/TextOnlyPreview/TextOnlyPreview.d.ts +7 -6
- package/FilePicker/primitives/components/previews/TruncatedFileName.d.ts +7 -0
- package/FilePicker/primitives/components/previews/TruncatedFileName.js +20 -0
- package/FilePicker/primitives/components/previews/TruncatedFileName.js.map +1 -0
- package/FilePicker/primitives/components/previews/fileName.d.ts +4 -0
- package/FilePicker/primitives/components/previews/fileName.js +26 -0
- package/FilePicker/primitives/components/previews/fileName.js.map +1 -0
- package/FilePicker/primitives/components/previews/index.d.ts +1 -0
- package/FilePicker/primitives/components/previews/index.js +1 -0
- package/FilePicker/primitives/components/previews/variants.d.ts +1 -1
- package/FillViewport/FillViewport.d.ts +63 -0
- package/FillViewport/FillViewport.js +67 -0
- package/FillViewport/FillViewport.js.map +1 -0
- package/FillViewport/index.d.ts +1 -0
- package/FillViewport/index.js +1 -0
- package/FormComponent/Description.d.ts +7 -6
- package/FormComponent/ErrorMessage.d.ts +7 -6
- package/FormComponent/Label.d.ts +7 -6
- package/FormComponent/Note.d.ts +7 -6
- package/Grid/Grid.d.ts +25 -23
- package/Grid/Grid.js.map +1 -1
- package/Grid/Grid.stories.d.ts +1 -1
- package/Grid/Grid.stories.js.map +1 -1
- package/HeaderBar/HeaderBar.d.ts +7 -6
- package/HeaderBar/HeaderBar.stories.d.ts +1 -1
- package/HeaderBar/HeaderBar.stories.js.map +1 -1
- package/Heading/Heading.d.ts +8 -7
- package/Heading/Heading.stories.d.ts +1 -1
- package/Heading/Heading.stories.js.map +1 -1
- package/Icon/Icon.d.ts +9 -8
- package/Icon/Icon.stories.d.ts +1 -1
- package/Icon/Icon.stories.js.map +1 -1
- package/IconPicker/IconPicker.d.ts +7 -6
- package/IconPicker/IconPicker.stories.d.ts +1 -1
- package/IconPicker/IconPicker.stories.js.map +1 -1
- package/IconPicker/primitives/IconPickerPrimitive.d.ts +1 -1
- package/IconPicker/primitives/IconPickerPrimitive.js +1 -2
- package/IconPicker/primitives/IconPickerPrimitive.js.map +1 -1
- package/IconPicker/primitives/IconPickerPrimitive.stories.d.ts +1 -1
- package/IconPicker/primitives/IconPickerPrimitive.stories.js.map +1 -1
- package/IconPicker/primitives/components/IconPickerTrigger.d.ts +1 -1
- package/ImageEditor/AspectRatioPreview.d.ts +16 -0
- package/ImageEditor/AspectRatioPreview.js +26 -0
- package/ImageEditor/AspectRatioPreview.js.map +1 -0
- package/ImageEditor/CropHotspotEditor.d.ts +22 -0
- package/ImageEditor/CropHotspotEditor.js +402 -0
- package/ImageEditor/CropHotspotEditor.js.map +1 -0
- package/ImageEditor/ImageEditor.d.ts +18 -0
- package/ImageEditor/ImageEditor.js +151 -0
- package/ImageEditor/ImageEditor.js.map +1 -0
- package/ImageEditor/ImageEditor.stories.d.ts +6 -0
- package/ImageEditor/ImageEditor.stories.js +42 -0
- package/ImageEditor/ImageEditor.stories.js.map +1 -0
- package/ImageEditor/MetaFields.d.ts +12 -0
- package/ImageEditor/MetaFields.js +20 -0
- package/ImageEditor/MetaFields.js.map +1 -0
- package/ImageEditor/SectionLabel.d.ts +8 -0
- package/ImageEditor/SectionLabel.js +7 -0
- package/ImageEditor/SectionLabel.js.map +1 -0
- package/ImageEditor/geometry.d.ts +46 -0
- package/ImageEditor/geometry.js +126 -0
- package/ImageEditor/geometry.js.map +1 -0
- package/ImageEditor/index.d.ts +3 -0
- package/ImageEditor/index.js +3 -0
- package/ImageEditor/types.d.ts +52 -0
- package/ImageEditor/types.js +35 -0
- package/ImageEditor/types.js.map +1 -0
- package/Input/Input.d.ts +7 -6
- package/Input/Input.stories.d.ts +1 -1
- package/Input/Input.stories.js.map +1 -1
- package/Input/InputPrimitive.d.ts +9 -8
- package/Input/InputPrimitive.stories.d.ts +1 -1
- package/Input/InputPrimitive.stories.js.map +1 -1
- package/Label/Label.d.ts +8 -7
- package/Label/Label.stories.d.ts +1 -1
- package/Label/Label.stories.js.map +1 -1
- package/Label/components/LabelValue.d.ts +1 -1
- package/Link/Link.d.ts +3 -3
- package/Link/Link.js +1 -1
- package/Link/Link.js.map +1 -1
- package/Link/Link.stories.d.ts +1 -1
- package/Link/Link.stories.js.map +1 -1
- package/List/List.d.ts +8 -7
- package/List/List.stories.d.ts +1 -1
- package/List/List.stories.js.map +1 -1
- package/List/components/ListItem.d.ts +7 -6
- package/List/components/ListItemAction.d.ts +7 -6
- package/List/components/ListItemHandle.d.ts +7 -6
- package/List/components/ListItemIcon.d.ts +7 -6
- package/List/components/ListItemSeparator.d.ts +7 -6
- package/Loader/Loader.d.ts +9 -8
- package/Loader/Loader.stories.d.ts +1 -1
- package/Loader/Loader.stories.js.map +1 -1
- package/Loader/OverlayLoader.d.ts +7 -6
- package/Loader/OverlayLoader.stories.d.ts +1 -1
- package/Loader/OverlayLoader.stories.js.map +1 -1
- package/Markdown/Markdown.d.ts +47 -0
- package/Markdown/Markdown.js +17 -0
- package/Markdown/Markdown.js.map +1 -0
- package/Markdown/index.d.ts +1 -0
- package/Markdown/index.js +1 -0
- package/MultiAutoComplete/MultiAutoComplete.d.ts +7 -6
- package/MultiAutoComplete/MultiAutoComplete.stories.d.ts +1 -1
- package/MultiAutoComplete/MultiAutoComplete.stories.js.map +1 -1
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.d.ts +13 -6
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.js +1 -0
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.js.map +1 -1
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.stories.d.ts +1 -1
- package/MultiAutoComplete/primitives/MultiAutoCompletePrimitive.stories.js.map +1 -1
- package/MultiAutoComplete/primitives/presenters/MultiAutoCompletePresenterWithFreeInput.d.ts +3 -3
- package/MultiAutoComplete/primitives/useMultiAutoComplete.d.ts +3 -3
- package/MultiFilePicker/MultiFilePicker.d.ts +19 -18
- package/MultiFilePicker/MultiFilePicker.stories.d.ts +1 -1
- package/MultiFilePicker/MultiFilePicker.stories.js.map +1 -1
- package/MultiFilePicker/primitives/MultiFilePickerPrimitive.d.ts +19 -18
- package/MultiFilePicker/primitives/MultiFilePickerPrimitive.stories.d.ts +1 -1
- package/MultiFilePicker/primitives/MultiFilePickerPrimitive.stories.js.map +1 -1
- package/MultiSelect/MultiSelect.d.ts +7 -6
- package/MultiSelect/MultiSelect.stories.d.ts +1 -1
- package/MultiSelect/MultiSelect.stories.js.map +1 -1
- package/MultiSelect/primitives/MultiSelectPrimitive.d.ts +10 -6
- package/MultiSelect/primitives/MultiSelectPrimitive.js +12 -5
- package/MultiSelect/primitives/MultiSelectPrimitive.js.map +1 -1
- package/Popover/Popover.d.ts +7 -6
- package/Popover/Popover.stories.d.ts +8 -1
- package/Popover/Popover.stories.js +24 -1
- package/Popover/Popover.stories.js.map +1 -1
- package/Popover/primitives/PopoverPrimitive.d.ts +7 -7
- package/Popover/primitives/components/PopoverContent.js +6 -1
- package/Popover/primitives/components/PopoverContent.js.map +1 -1
- package/ProgressBar/ProgressBar.d.ts +7 -6
- package/ProgressBar/ProgressBar.stories.d.ts +1 -1
- package/ProgressBar/ProgressBar.stories.js.map +1 -1
- package/RadioGroup/RadioGroup.d.ts +7 -6
- package/RadioGroup/RadioGroup.stories.d.ts +1 -1
- package/RadioGroup/RadioGroup.stories.js.map +1 -1
- package/RadioGroup/primitives/Radio.d.ts +7 -6
- package/RadioGroup/primitives/RadioGroupPrimitive.d.ts +5 -1
- package/RadioGroup/primitives/RadioGroupPrimitive.stories.d.ts +1 -1
- package/RadioGroup/primitives/RadioGroupPrimitive.stories.js.map +1 -1
- package/RangeSlider/RangeSlider.d.ts +7 -6
- package/RangeSlider/RangeSlider.stories.d.ts +1 -1
- package/RangeSlider/RangeSlider.stories.js.map +1 -1
- package/RangeSlider/primitives/RangeSliderPrimitive.stories.d.ts +1 -1
- package/RangeSlider/primitives/RangeSliderPrimitive.stories.js.map +1 -1
- package/ScrollArea/ScrollArea.d.ts +16 -2
- package/ScrollArea/ScrollArea.js +25 -11
- package/ScrollArea/ScrollArea.js.map +1 -1
- package/ScrollArea/ScrollArea.stories.d.ts +1 -1
- package/ScrollArea/ScrollArea.stories.js.map +1 -1
- package/SegmentedControl/SegmentedControl.d.ts +11 -6
- package/SegmentedControl/SegmentedControl.js +6 -2
- package/SegmentedControl/SegmentedControl.js.map +1 -1
- package/SegmentedControl/SegmentedControl.stories.d.ts +5 -1
- package/SegmentedControl/SegmentedControl.stories.js +100 -2
- package/SegmentedControl/SegmentedControl.stories.js.map +1 -1
- package/SegmentedControl/SegmentedControlTab.d.ts +10 -0
- package/SegmentedControl/SegmentedControlTab.js +21 -0
- package/SegmentedControl/SegmentedControlTab.js.map +1 -0
- package/SegmentedControl/SegmentedControlTabs.d.ts +14 -0
- package/SegmentedControl/SegmentedControlTabs.js +71 -0
- package/SegmentedControl/SegmentedControlTabs.js.map +1 -0
- package/SegmentedControl/SegmentedControlTabsContext.d.ts +19 -0
- package/SegmentedControl/SegmentedControlTabsContext.js +11 -0
- package/SegmentedControl/SegmentedControlTabsContext.js.map +1 -0
- package/SegmentedControl/index.d.ts +2 -0
- package/SegmentedControl/index.js +2 -0
- package/SegmentedControl/primitives/SegmentedControlPrimitive.d.ts +6 -2
- package/SegmentedControl/primitives/SegmentedControlPrimitive.js +4 -3
- package/SegmentedControl/primitives/SegmentedControlPrimitive.js.map +1 -1
- package/SegmentedControl/primitives/SegmentedControlPrimitive.stories.d.ts +2 -1
- package/SegmentedControl/primitives/SegmentedControlPrimitive.stories.js +8 -1
- package/SegmentedControl/primitives/SegmentedControlPrimitive.stories.js.map +1 -1
- package/Select/Select.d.ts +7 -6
- package/Select/Select.stories.d.ts +1 -1
- package/Select/Select.stories.js.map +1 -1
- package/Select/primitives/SelectPrimitive.stories.d.ts +1 -1
- package/Select/primitives/SelectPrimitive.stories.js.map +1 -1
- package/Select/primitives/components/SelectContent.js +4 -6
- package/Select/primitives/components/SelectContent.js.map +1 -1
- package/Select/primitives/components/SelectTrigger.d.ts +2 -2
- package/Separator/Separator.d.ts +9 -8
- package/Separator/Separator.stories.d.ts +1 -1
- package/Separator/Separator.stories.js.map +1 -1
- package/Sidebar/Sidebar.d.ts +9 -6
- package/Sidebar/Sidebar.stories.d.ts +1 -1
- package/Sidebar/Sidebar.stories.js.map +1 -1
- package/Sidebar/components/SidebarContent.js +1 -1
- package/Sidebar/components/SidebarContent.js.map +1 -1
- package/Sidebar/components/SidebarIcon.d.ts +7 -6
- package/Sidebar/components/SidebarProvider.d.ts +4 -4
- package/Sidebar/components/SidebarRoot.js +1 -1
- package/Sidebar/components/SidebarRoot.js.map +1 -1
- package/Sidebar/components/items/SidebarMenuGroup.d.ts +9 -8
- package/Sidebar/components/items/SidebarMenuItem.d.ts +13 -9
- package/Sidebar/components/items/SidebarMenuItem.js +3 -1
- package/Sidebar/components/items/SidebarMenuItem.js.map +1 -1
- package/Sidebar/components/items/SidebarMenuItemBadge.d.ts +6 -0
- package/Sidebar/components/items/SidebarMenuItemBadge.js +7 -0
- package/Sidebar/components/items/SidebarMenuItemBadge.js.map +1 -0
- package/Sidebar/components/items/SidebarMenuItemIcon.d.ts +7 -6
- package/Sidebar/components/items/SidebarMenuLink.d.ts +12 -9
- package/Sidebar/components/items/SidebarMenuLink.js +3 -1
- package/Sidebar/components/items/SidebarMenuLink.js.map +1 -1
- package/Sidebar/components/items/SidebarMenuProvider.d.ts +4 -4
- package/Sidebar/components/items/SidebarMenuRootButton.d.ts +1 -1
- package/Sidebar/components/items/SidebarMenuRootButton.js +8 -3
- package/Sidebar/components/items/SidebarMenuRootButton.js.map +1 -1
- package/Sidebar/components/items/SidebarMenuRootItem.d.ts +9 -7
- package/Sidebar/components/items/SidebarMenuSubButton.d.ts +1 -1
- package/Sidebar/components/items/SidebarMenuSubButton.js +14 -6
- package/Sidebar/components/items/SidebarMenuSubButton.js.map +1 -1
- package/Sidebar/components/items/SidebarMenuSubItem.js +3 -3
- package/Sidebar/components/items/SidebarMenuSubItem.js.map +1 -1
- package/Sidebar/components/items/SidebarMenuSubItemIndentation.js +2 -1
- package/Sidebar/components/items/SidebarMenuSubItemIndentation.js.map +1 -1
- package/Skeleton/Skeleton.d.ts +9 -7
- package/Skeleton/Skeleton.js +10 -4
- package/Skeleton/Skeleton.js.map +1 -1
- package/Skeleton/Skeleton.stories.d.ts +3 -1
- package/Skeleton/Skeleton.stories.js +28 -2
- package/Skeleton/Skeleton.stories.js.map +1 -1
- package/Slider/Slider.d.ts +7 -6
- package/Slider/Slider.stories.d.ts +1 -1
- package/Slider/Slider.stories.js.map +1 -1
- package/Slider/primitives/SliderPrimitive.stories.d.ts +1 -1
- package/Slider/primitives/SliderPrimitive.stories.js.map +1 -1
- package/SteppedProgress/SteppedProgress.d.ts +7 -6
- package/SteppedProgress/SteppedProgress.stories.d.ts +1 -1
- package/SteppedProgress/SteppedProgress.stories.js.map +1 -1
- package/SteppedProgress/SteppedProgressItem.d.ts +7 -6
- package/Switch/Switch.d.ts +10 -9
- package/Switch/Switch.js +21 -7
- package/Switch/Switch.js.map +1 -1
- package/Switch/Switch.stories.d.ts +1 -1
- package/Switch/Switch.stories.js.map +1 -1
- package/Switch/domains/SwitchItemDto.d.ts +1 -1
- package/Switch/primitives/SwitchPrimitive.d.ts +10 -6
- package/Switch/primitives/SwitchPrimitive.js +4 -3
- package/Switch/primitives/SwitchPrimitive.js.map +1 -1
- package/Switch/primitives/SwitchPrimitive.stories.d.ts +1 -1
- package/Switch/primitives/SwitchPrimitive.stories.js.map +1 -1
- package/Table/Table.d.ts +12 -10
- package/Table/components/Direction.d.ts +1 -1
- package/Tabs/Tabs.d.ts +14 -7
- package/Tabs/Tabs.js +32 -11
- package/Tabs/Tabs.js.map +1 -1
- package/Tabs/Tabs.mdx +27 -0
- package/Tabs/Tabs.stories.d.ts +2 -1
- package/Tabs/Tabs.stories.js +19 -1
- package/Tabs/Tabs.stories.js.map +1 -1
- package/Tabs/components/Content.d.ts +1 -1
- package/Tabs/components/List.d.ts +2 -2
- package/Tabs/components/Tab.d.ts +7 -6
- package/Tabs/components/Trigger.d.ts +3 -2
- package/Tabs/components/Trigger.js +8 -3
- package/Tabs/components/Trigger.js.map +1 -1
- package/Tag/Tag.d.ts +8 -7
- package/Tag/Tag.stories.d.ts +1 -1
- package/Tag/Tag.stories.js.map +1 -1
- package/Tags/Tags.d.ts +7 -6
- package/Tags/Tags.stories.d.ts +1 -1
- package/Tags/Tags.stories.js.map +1 -1
- package/Tags/primitives/TagsPrimitive.d.ts +7 -6
- package/Tags/primitives/TagsPrimitive.stories.d.ts +1 -1
- package/Tags/primitives/TagsPrimitive.stories.js.map +1 -1
- package/Text/Text.d.ts +8 -7
- package/Text/Text.stories.d.ts +1 -1
- package/Text/Text.stories.js.map +1 -1
- package/Textarea/Textarea.d.ts +7 -6
- package/Textarea/Textarea.stories.d.ts +1 -1
- package/Textarea/Textarea.stories.js.map +1 -1
- package/Textarea/TextareaPrimitive.d.ts +9 -8
- package/Textarea/TextareaPrimitive.stories.d.ts +1 -1
- package/Textarea/TextareaPrimitive.stories.js.map +1 -1
- package/TimeAgo/TimeAgo.stories.d.ts +1 -1
- package/TimeAgo/TimeAgo.stories.js.map +1 -1
- package/TimeAgo/getElapsedSeconds.js +3 -3
- package/TimeAgo/getElapsedSeconds.js.map +1 -1
- package/Toast/Toast.d.ts +7 -6
- package/Toast/components/ToastActions.d.ts +7 -6
- package/Toast/components/ToastDescription.d.ts +7 -6
- package/Toast/components/ToastTitle.d.ts +7 -6
- package/Toast/useToast.stories.d.ts +1 -1
- package/Toast/useToast.stories.js.map +1 -1
- package/Toggle/Toggle.d.ts +7 -6
- package/Toggle/Toggle.stories.d.ts +1 -1
- package/Toggle/Toggle.stories.js.map +1 -1
- package/Toggle/primitives/TogglePrimitive.d.ts +13 -9
- package/Toggle/primitives/TogglePrimitive.stories.d.ts +1 -1
- package/Toggle/primitives/TogglePrimitive.stories.js.map +1 -1
- package/ToggleGroup/ToggleGroup.d.ts +7 -6
- package/ToggleGroup/ToggleGroup.stories.d.ts +1 -1
- package/ToggleGroup/ToggleGroup.stories.js.map +1 -1
- package/ToggleGroup/domains/ToggleGroupItem.d.ts +3 -0
- package/ToggleGroup/domains/ToggleGroupItem.js +6 -1
- package/ToggleGroup/domains/ToggleGroupItem.js.map +1 -1
- package/ToggleGroup/domains/ToggleGroupItemFormatted.d.ts +1 -0
- package/ToggleGroup/domains/ToggleGroupItemFormatter.js +2 -1
- package/ToggleGroup/domains/ToggleGroupItemFormatter.js.map +1 -1
- package/ToggleGroup/domains/ToggleGroupItemParams.d.ts +1 -0
- package/ToggleGroup/primitives/ToggleGroupPrimitive.d.ts +13 -9
- package/ToggleGroup/primitives/ToggleGroupPrimitive.js +12 -3
- package/ToggleGroup/primitives/ToggleGroupPrimitive.js.map +1 -1
- package/ToggleGroup/primitives/ToggleGroupPrimitive.stories.d.ts +1 -1
- package/ToggleGroup/primitives/ToggleGroupPrimitive.stories.js.map +1 -1
- package/Tooltip/Tooltip.d.ts +7 -6
- package/Tooltip/Tooltip.stories.d.ts +1 -1
- package/Tooltip/Tooltip.stories.js.map +1 -1
- package/Tree/Tree.d.ts +7 -6
- package/Tree/Tree.stories.d.ts +1 -1
- package/Tree/Tree.stories.js.map +1 -1
- package/Tree/components/Item.d.ts +7 -6
- package/Tree/components/ItemCollapseTrigger.d.ts +7 -6
- package/Tree/components/ItemContent.d.ts +8 -6
- package/Tree/components/ItemDragHandle.d.ts +7 -6
- package/Tree/components/ItemIcon.d.ts +7 -6
- package/Tree/components/ItemPlaceholder.d.ts +7 -6
- package/Tree/components/ItemSubIndentation.d.ts +7 -6
- package/Tree/useTree.js +6 -2
- package/Tree/useTree.js.map +1 -1
- package/Widget/Widget.d.ts +8 -22
- package/Widget/Widget.stories.d.ts +1 -1
- package/Widget/Widget.stories.js.map +1 -1
- package/Widget/components/Icon.d.ts +7 -6
- package/Widget/components/WidgetAction.d.ts +8 -6
- package/Widget/components/WidgetContent.d.ts +5 -5
- package/exports/admin/ui.d.ts +3 -0
- package/exports/admin/ui.js +3 -0
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +1 -0
- package/hooks/useEscapeScrollLock.d.ts +13 -0
- package/hooks/useEscapeScrollLock.js +21 -0
- package/hooks/useEscapeScrollLock.js.map +1 -0
- package/index.d.ts +8 -0
- package/index.js +8 -0
- package/package.json +33 -35
- package/theme.css +52 -0
- package/utils.js +53 -34
- package/utils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconPicker/primitives/IconPickerPrimitive.stories.js","sources":["../../../src/IconPicker/primitives/IconPickerPrimitive.stories.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react
|
|
1
|
+
{"version":3,"file":"IconPicker/primitives/IconPickerPrimitive.stories.js","sources":["../../../src/IconPicker/primitives/IconPickerPrimitive.stories.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\nimport { fas } from \"@fortawesome/free-solid-svg-icons\";\nimport { IconPickerPrimitive } from \"./IconPickerPrimitive.js\";\n\nconst meta: Meta<typeof IconPickerPrimitive> = {\n title: \"Components/Form Primitives/IconPicker\",\n component: IconPickerPrimitive,\n argTypes: {\n onChange: { action: \"onChange\" }\n },\n render: args => {\n const [value, setValue] = useState(args.value);\n return (\n <div className={\"w-full\"}>\n <IconPickerPrimitive {...args} value={value} onChange={setValue} />\n <div className={\"mt-4 text-center\"}>\n Current selected value: <pre>{value}</pre>\n </div>\n </div>\n );\n },\n parameters: {\n layout: \"padded\"\n }\n};\n\nlibrary.add(fas);\n\nexport default meta;\ntype Story = StoryObj<typeof IconPickerPrimitive>;\n\nexport const Default: Story = {\n args: {\n icons: [\n { prefix: \"fas\", name: \"trash-restore-alt\" },\n { prefix: \"fas\", name: \"trash-can-arrow-up\" },\n { prefix: \"fas\", name: \"naira-sign\" },\n { prefix: \"fas\", name: \"cart-arrow-down\" },\n { prefix: \"fas\", name: \"walkie-talkie\" },\n { prefix: \"fas\", name: \"file-edit\" },\n { prefix: \"fas\", name: \"file-pen\" },\n { prefix: \"fas\", name: \"receipt\" },\n { prefix: \"fas\", name: \"pen-square\" },\n { prefix: \"fas\", name: \"pencil-square\" },\n { prefix: \"fas\", name: \"square-pen\" },\n { prefix: \"fas\", name: \"suitcase-rolling\" },\n { prefix: \"fas\", name: \"person-circle-exclamation\" },\n { prefix: \"fas\", name: \"chevron-down\" },\n { prefix: \"fas\", name: \"battery\" },\n { prefix: \"fas\", name: \"battery-5\" },\n { prefix: \"fas\", name: \"battery-full\" },\n { prefix: \"fas\", name: \"skull-crossbones\" },\n { prefix: \"fas\", name: \"code-compare\" },\n { prefix: \"fas\", name: \"list-dots\" },\n { prefix: \"fas\", name: \"list-ul\" },\n { prefix: \"fas\", name: \"school-lock\" },\n { prefix: \"fas\", name: \"tower-cell\" },\n { prefix: \"fas\", name: \"long-arrow-alt-down\" },\n { prefix: \"fas\", name: \"down-long\" },\n { prefix: \"fas\", name: \"ranking-star\" },\n { prefix: \"fas\", name: \"chess-king\" },\n { prefix: \"fas\", name: \"person-harassing\" },\n { prefix: \"fas\", name: \"brazilian-real-sign\" },\n { prefix: \"fas\", name: \"landmark-alt\" },\n { prefix: \"fas\", name: \"landmark-dome\" },\n { prefix: \"fas\", name: \"arrow-up\" },\n { prefix: \"fas\", name: \"television\" },\n { prefix: \"fas\", name: \"tv-alt\" },\n { prefix: \"fas\", name: \"tv\" },\n { prefix: \"fas\", name: \"shrimp\" },\n { prefix: \"fas\", name: \"tasks\" },\n { prefix: \"fas\", name: \"list-check\" },\n { prefix: \"fas\", name: \"jug-detergent\" },\n { prefix: \"fas\", name: \"user-circle\" },\n { prefix: \"fas\", name: \"circle-user\" },\n { prefix: \"fas\", name: \"user-shield\" },\n { prefix: \"fas\", name: \"wind\" },\n { prefix: \"fas\", name: \"car-crash\" },\n { prefix: \"fas\", name: \"car-burst\" },\n { prefix: \"fas\", name: \"y\" },\n { prefix: \"fas\", name: \"snowboarding\" },\n { prefix: \"fas\", name: \"person-snowboarding\" },\n { prefix: \"fas\", name: \"shipping-fast\" },\n { prefix: \"fas\", name: \"truck-fast\" }\n ]\n }\n};\n\nexport const WithDefaultValue: Story = {\n args: {\n ...Default.args,\n value: \"fas/panorama\"\n }\n};\n\nexport const MediumSize: Story = {\n args: {\n ...Default.args,\n size: \"md\"\n }\n};\n\nexport const LargeSize: Story = {\n args: {\n ...Default.args,\n size: \"lg\"\n }\n};\n\nexport const ExtraLargeSize: Story = {\n args: {\n ...Default.args,\n size: \"xl\"\n }\n};\n\nexport const PrimaryVariant: Story = {\n args: {\n ...Default.args,\n variant: \"primary\"\n }\n};\n\nexport const PrimaryVariantDisabled: Story = {\n args: {\n ...PrimaryVariant.args,\n disabled: true\n }\n};\n\nexport const PrimaryVariantInvalid: Story = {\n args: {\n ...PrimaryVariant.args,\n invalid: true\n }\n};\n\nexport const SecondaryVariant: Story = {\n args: {\n ...Default.args,\n variant: \"secondary\"\n }\n};\n\nexport const SecondaryVariantDisabled: Story = {\n args: {\n ...SecondaryVariant.args,\n disabled: true\n }\n};\n\nexport const SecondaryVariantInvalid: Story = {\n args: {\n ...SecondaryVariant.args,\n invalid: true\n }\n};\n\nexport const GhostVariant: Story = {\n args: {\n ...Default.args,\n variant: \"ghost\"\n }\n};\n\nexport const GhostVariantDisabled: Story = {\n args: {\n ...GhostVariant.args,\n disabled: true\n }\n};\n\nexport const GhostVariantInvalid: Story = {\n args: {\n ...GhostVariant.args,\n invalid: true\n }\n};\n"],"names":["meta","IconPickerPrimitive","args","value","setValue","useState","library","fas","Default","WithDefaultValue","MediumSize","LargeSize","ExtraLargeSize","PrimaryVariant","PrimaryVariantDisabled","PrimaryVariantInvalid","SecondaryVariant","SecondaryVariantDisabled","SecondaryVariantInvalid","GhostVariant","GhostVariantDisabled","GhostVariantInvalid"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { type VariantProps } from "../../../utils.js";
|
|
3
3
|
declare const iconPickerTriggerVariants: (props?: ({
|
|
4
|
-
size?: "
|
|
4
|
+
size?: "lg" | "md" | "xl" | null | undefined;
|
|
5
5
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
6
|
interface IconPickerTriggerProps extends VariantProps<typeof iconPickerTriggerVariants> {
|
|
7
7
|
value?: string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ImageEditorAspectRatio, ImageEditorCrop, ImageEditorHotspot } from "./types.js";
|
|
3
|
+
interface AspectRatioPreviewProps {
|
|
4
|
+
src: string;
|
|
5
|
+
imageWidth: number;
|
|
6
|
+
imageHeight: number;
|
|
7
|
+
crop: ImageEditorCrop | undefined;
|
|
8
|
+
hotspot: ImageEditorHotspot | undefined;
|
|
9
|
+
aspectRatio: ImageEditorAspectRatio;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A single live preview showing how the current crop + hotspot renders at one
|
|
13
|
+
* target aspect ratio. Uses the shared preview geometry so it matches the site.
|
|
14
|
+
*/
|
|
15
|
+
export declare const AspectRatioPreview: ({ src, imageWidth, imageHeight, crop, hotspot, aspectRatio }: AspectRatioPreviewProps) => React.JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import react from "react";
|
|
2
|
+
import { getPreviewStyles } from "./geometry.js";
|
|
3
|
+
const PREVIEW_HEIGHT = 120;
|
|
4
|
+
const AspectRatioPreview = ({ src, imageWidth, imageHeight, crop, hotspot, aspectRatio })=>{
|
|
5
|
+
const styles = getPreviewStyles(imageWidth, imageHeight, crop, hotspot, aspectRatio.ratio);
|
|
6
|
+
const width = Math.round(PREVIEW_HEIGHT * aspectRatio.ratio);
|
|
7
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
8
|
+
className: "flex flex-col items-center gap-xs"
|
|
9
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
10
|
+
className: "relative overflow-hidden rounded-sm border border-neutral-dimmed bg-neutral-light",
|
|
11
|
+
style: {
|
|
12
|
+
width: `${width}px`,
|
|
13
|
+
height: `${PREVIEW_HEIGHT}px`
|
|
14
|
+
}
|
|
15
|
+
}, /*#__PURE__*/ react.createElement("img", {
|
|
16
|
+
src: src,
|
|
17
|
+
alt: "",
|
|
18
|
+
style: styles.image,
|
|
19
|
+
draggable: false
|
|
20
|
+
})), /*#__PURE__*/ react.createElement("span", {
|
|
21
|
+
className: "text-sm text-neutral-strong"
|
|
22
|
+
}, aspectRatio.label));
|
|
23
|
+
};
|
|
24
|
+
export { AspectRatioPreview };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=AspectRatioPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageEditor/AspectRatioPreview.js","sources":["../../src/ImageEditor/AspectRatioPreview.tsx"],"sourcesContent":["import React from \"react\";\nimport { getPreviewStyles } from \"./geometry.js\";\nimport type { ImageEditorAspectRatio, ImageEditorCrop, ImageEditorHotspot } from \"./types.js\";\n\ninterface AspectRatioPreviewProps {\n src: string;\n imageWidth: number;\n imageHeight: number;\n crop: ImageEditorCrop | undefined;\n hotspot: ImageEditorHotspot | undefined;\n aspectRatio: ImageEditorAspectRatio;\n}\n\n// Fixed preview height (px). Each thumbnail keeps this height regardless of how\n// many are shown; the width is derived from the aspect ratio.\nconst PREVIEW_HEIGHT = 120;\n\n/**\n * A single live preview showing how the current crop + hotspot renders at one\n * target aspect ratio. Uses the shared preview geometry so it matches the site.\n */\nexport const AspectRatioPreview = ({\n src,\n imageWidth,\n imageHeight,\n crop,\n hotspot,\n aspectRatio\n}: AspectRatioPreviewProps) => {\n const styles = getPreviewStyles(imageWidth, imageHeight, crop, hotspot, aspectRatio.ratio);\n const width = Math.round(PREVIEW_HEIGHT * aspectRatio.ratio);\n\n return (\n <div className={\"flex flex-col items-center gap-xs\"}>\n <div\n className={\n \"relative overflow-hidden rounded-sm border border-neutral-dimmed bg-neutral-light\"\n }\n style={{ width: `${width}px`, height: `${PREVIEW_HEIGHT}px` }}\n >\n <img src={src} alt={\"\"} style={styles.image} draggable={false} />\n </div>\n <span className={\"text-sm text-neutral-strong\"}>{aspectRatio.label}</span>\n </div>\n );\n};\n"],"names":["PREVIEW_HEIGHT","AspectRatioPreview","src","imageWidth","imageHeight","crop","hotspot","aspectRatio","styles","getPreviewStyles","width","Math"],"mappings":";;AAeA,MAAMA,iBAAiB;AAMhB,MAAMC,qBAAqB,CAAC,EAC/BC,GAAG,EACHC,UAAU,EACVC,WAAW,EACXC,IAAI,EACJC,OAAO,EACPC,WAAW,EACW;IACtB,MAAMC,SAASC,iBAAiBN,YAAYC,aAAaC,MAAMC,SAASC,YAAY,KAAK;IACzF,MAAMG,QAAQC,KAAK,KAAK,CAACX,iBAAiBO,YAAY,KAAK;IAE3D,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QACG,WACI;QAEJ,OAAO;YAAE,OAAO,GAAGG,MAAM,EAAE,CAAC;YAAE,QAAQ,GAAGV,eAAe,EAAE,CAAC;QAAC;qBAE5D,oBAAC;QAAI,KAAKE;QAAK,KAAK;QAAI,OAAOM,OAAO,KAAK;QAAE,WAAW;uBAE5D,oBAAC;QAAK,WAAW;OAAgCD,YAAY,KAAK;AAG9E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { ImageEditorCrop, ImageEditorHotspot, ImageEditorImage } from "./types.js";
|
|
3
|
+
interface CropHotspotEditorProps {
|
|
4
|
+
image: ImageEditorImage;
|
|
5
|
+
crop: ImageEditorCrop | undefined;
|
|
6
|
+
hotspot: ImageEditorHotspot | undefined;
|
|
7
|
+
/** Currently selected crop shape id ("free" or a preset id). Controlled by the parent. */
|
|
8
|
+
aspectId: string;
|
|
9
|
+
onChangeAspect: (id: string) => void;
|
|
10
|
+
onChangeCrop: (crop: ImageEditorCrop) => void;
|
|
11
|
+
onChangeHotspot: (hotspot: ImageEditorHotspot) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const FREE = "free";
|
|
14
|
+
/**
|
|
15
|
+
* Infer which crop-shape preset a saved crop corresponds to, by comparing the
|
|
16
|
+
* crop's on-screen (pixel) aspect ratio against the presets. The crop stores only
|
|
17
|
+
* edge insets — not the shape used to draw it — so on reopen we recover the shape
|
|
18
|
+
* here; a crop drawn with a preset matches it closely, while a free crop won't.
|
|
19
|
+
*/
|
|
20
|
+
export declare const inferAspectId: (crop: ImageEditorCrop | undefined, width: number, height: number) => string;
|
|
21
|
+
export declare const CropHotspotEditor: ({ image, crop, hotspot, aspectId, onChangeAspect, onChangeCrop, onChangeHotspot }: CropHotspotEditorProps) => React.JSX.Element;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import react, { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { Select } from "../Select/index.js";
|
|
3
|
+
import { Text } from "../Text/index.js";
|
|
4
|
+
import { SectionLabel } from "./SectionLabel.js";
|
|
5
|
+
import { DEFAULT_ASPECT_RATIOS } from "./types.js";
|
|
6
|
+
const MIN = 0.05;
|
|
7
|
+
const FREE = "free";
|
|
8
|
+
const inferAspectId = (crop, width, height)=>{
|
|
9
|
+
if (!crop || !width || !height) return FREE;
|
|
10
|
+
const cropWidth = Math.max(0, 1 - (crop.left ?? 0) - (crop.right ?? 0));
|
|
11
|
+
const cropHeight = Math.max(0, 1 - (crop.top ?? 0) - (crop.bottom ?? 0));
|
|
12
|
+
if (cropWidth <= 0 || cropHeight <= 0) return FREE;
|
|
13
|
+
const displayRatio = cropWidth * width / (cropHeight * height);
|
|
14
|
+
const match = DEFAULT_ASPECT_RATIOS.find((ar)=>Math.abs(ar.ratio - displayRatio) < 0.02);
|
|
15
|
+
return match?.id ?? FREE;
|
|
16
|
+
};
|
|
17
|
+
const MAX_CANVAS_WIDTH = 640;
|
|
18
|
+
const MAX_CANVAS_HEIGHT = 460;
|
|
19
|
+
const clamp01 = (n)=>Math.min(1, Math.max(0, n));
|
|
20
|
+
const cropToEdges = (crop)=>({
|
|
21
|
+
left: clamp01(crop?.left ?? 0),
|
|
22
|
+
top: clamp01(crop?.top ?? 0),
|
|
23
|
+
right: 1 - clamp01(crop?.right ?? 0),
|
|
24
|
+
bottom: 1 - clamp01(crop?.bottom ?? 0)
|
|
25
|
+
});
|
|
26
|
+
const edgesToCrop = (e)=>({
|
|
27
|
+
top: e.top,
|
|
28
|
+
left: e.left,
|
|
29
|
+
bottom: 1 - e.bottom,
|
|
30
|
+
right: 1 - e.right
|
|
31
|
+
});
|
|
32
|
+
const HANDLE_EDGES = {
|
|
33
|
+
nw: [
|
|
34
|
+
"top",
|
|
35
|
+
"left"
|
|
36
|
+
],
|
|
37
|
+
n: [
|
|
38
|
+
"top"
|
|
39
|
+
],
|
|
40
|
+
ne: [
|
|
41
|
+
"top",
|
|
42
|
+
"right"
|
|
43
|
+
],
|
|
44
|
+
e: [
|
|
45
|
+
"right"
|
|
46
|
+
],
|
|
47
|
+
se: [
|
|
48
|
+
"bottom",
|
|
49
|
+
"right"
|
|
50
|
+
],
|
|
51
|
+
s: [
|
|
52
|
+
"bottom"
|
|
53
|
+
],
|
|
54
|
+
sw: [
|
|
55
|
+
"bottom",
|
|
56
|
+
"left"
|
|
57
|
+
],
|
|
58
|
+
w: [
|
|
59
|
+
"left"
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
const CORNER_HANDLES = [
|
|
63
|
+
"nw",
|
|
64
|
+
"ne",
|
|
65
|
+
"se",
|
|
66
|
+
"sw"
|
|
67
|
+
];
|
|
68
|
+
const EDGE_HANDLES = [
|
|
69
|
+
"n",
|
|
70
|
+
"e",
|
|
71
|
+
"s",
|
|
72
|
+
"w"
|
|
73
|
+
];
|
|
74
|
+
const clampHotspot = (h, e)=>({
|
|
75
|
+
x: Math.min(e.right, Math.max(e.left, h?.x ?? (e.left + e.right) / 2)),
|
|
76
|
+
y: Math.min(e.bottom, Math.max(e.top, h?.y ?? (e.top + e.bottom) / 2)),
|
|
77
|
+
width: h?.width ?? 1,
|
|
78
|
+
height: h?.height ?? 1
|
|
79
|
+
});
|
|
80
|
+
const CropHotspotEditor = ({ image, crop, hotspot, aspectId, onChangeAspect, onChangeCrop, onChangeHotspot })=>{
|
|
81
|
+
const surfaceRef = useRef(null);
|
|
82
|
+
const dragRef = useRef(null);
|
|
83
|
+
const wrapperRef = useRef(null);
|
|
84
|
+
const [availWidth, setAvailWidth] = useState(0);
|
|
85
|
+
useLayoutEffect(()=>{
|
|
86
|
+
const el = wrapperRef.current;
|
|
87
|
+
if (!el) return;
|
|
88
|
+
const measure = ()=>setAvailWidth(el.getBoundingClientRect().width);
|
|
89
|
+
measure();
|
|
90
|
+
if ("u" < typeof ResizeObserver) return;
|
|
91
|
+
const ro = new ResizeObserver(measure);
|
|
92
|
+
ro.observe(el);
|
|
93
|
+
return ()=>ro.disconnect();
|
|
94
|
+
}, []);
|
|
95
|
+
const imageRatio = (image.width || 1) / (image.height || 1);
|
|
96
|
+
const surfaceStyle = useMemo(()=>{
|
|
97
|
+
if (availWidth <= 0) return {
|
|
98
|
+
width: "100%",
|
|
99
|
+
aspectRatio: `${image.width || 1} / ${image.height || 1}`,
|
|
100
|
+
maxHeight: `${MAX_CANVAS_HEIGHT}px`
|
|
101
|
+
};
|
|
102
|
+
let width = Math.min(availWidth, MAX_CANVAS_WIDTH);
|
|
103
|
+
let height = width / imageRatio;
|
|
104
|
+
if (height > MAX_CANVAS_HEIGHT) {
|
|
105
|
+
height = MAX_CANVAS_HEIGHT;
|
|
106
|
+
width = height * imageRatio;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
width: `${width}px`,
|
|
110
|
+
height: `${height}px`
|
|
111
|
+
};
|
|
112
|
+
}, [
|
|
113
|
+
availWidth,
|
|
114
|
+
imageRatio,
|
|
115
|
+
image.width,
|
|
116
|
+
image.height
|
|
117
|
+
]);
|
|
118
|
+
const edges = useMemo(()=>cropToEdges(crop), [
|
|
119
|
+
crop
|
|
120
|
+
]);
|
|
121
|
+
const ratio = DEFAULT_ASPECT_RATIOS.find((ar)=>ar.id === aspectId)?.ratio ?? null;
|
|
122
|
+
const aspectOptions = useMemo(()=>[
|
|
123
|
+
{
|
|
124
|
+
label: "Free",
|
|
125
|
+
value: FREE
|
|
126
|
+
},
|
|
127
|
+
...DEFAULT_ASPECT_RATIOS.map((ar)=>({
|
|
128
|
+
label: ar.label,
|
|
129
|
+
value: ar.id
|
|
130
|
+
}))
|
|
131
|
+
], []);
|
|
132
|
+
const toNorm = useCallback((clientX, clientY)=>{
|
|
133
|
+
const rect = surfaceRef.current.getBoundingClientRect();
|
|
134
|
+
return {
|
|
135
|
+
x: clamp01((clientX - rect.left) / rect.width),
|
|
136
|
+
y: clamp01((clientY - rect.top) / rect.height)
|
|
137
|
+
};
|
|
138
|
+
}, []);
|
|
139
|
+
const commitEdges = useCallback((next)=>{
|
|
140
|
+
onChangeCrop(edgesToCrop(next));
|
|
141
|
+
onChangeHotspot(clampHotspot(hotspot, next));
|
|
142
|
+
}, [
|
|
143
|
+
onChangeCrop,
|
|
144
|
+
onChangeHotspot,
|
|
145
|
+
hotspot
|
|
146
|
+
]);
|
|
147
|
+
const resizeFree = (handle, p)=>{
|
|
148
|
+
const moves = HANDLE_EDGES[handle];
|
|
149
|
+
const next = {
|
|
150
|
+
...edges
|
|
151
|
+
};
|
|
152
|
+
if (moves.includes("left")) next.left = Math.min(p.x, next.right - MIN);
|
|
153
|
+
if (moves.includes("right")) next.right = Math.max(p.x, next.left + MIN);
|
|
154
|
+
if (moves.includes("top")) next.top = Math.min(p.y, next.bottom - MIN);
|
|
155
|
+
if (moves.includes("bottom")) next.bottom = Math.max(p.y, next.top + MIN);
|
|
156
|
+
return next;
|
|
157
|
+
};
|
|
158
|
+
const resizeLocked = (handle, p, r)=>{
|
|
159
|
+
const moves = HANDLE_EDGES[handle];
|
|
160
|
+
const rNorm = r / imageRatio;
|
|
161
|
+
const anchorX = moves.includes("left") ? edges.right : edges.left;
|
|
162
|
+
const anchorY = moves.includes("top") ? edges.bottom : edges.top;
|
|
163
|
+
const dirX = moves.includes("left") ? -1 : 1;
|
|
164
|
+
const dirY = moves.includes("top") ? -1 : 1;
|
|
165
|
+
const maxW = dirX > 0 ? 1 - anchorX : anchorX;
|
|
166
|
+
const maxH = dirY > 0 ? 1 - anchorY : anchorY;
|
|
167
|
+
let w = Math.abs(p.x - anchorX);
|
|
168
|
+
let h = w / rNorm;
|
|
169
|
+
if (h > Math.abs(p.y - anchorY)) {
|
|
170
|
+
h = Math.abs(p.y - anchorY);
|
|
171
|
+
w = h * rNorm;
|
|
172
|
+
}
|
|
173
|
+
w = Math.min(w, maxW);
|
|
174
|
+
h = w / rNorm;
|
|
175
|
+
if (h > maxH) {
|
|
176
|
+
h = maxH;
|
|
177
|
+
w = h * rNorm;
|
|
178
|
+
}
|
|
179
|
+
w = Math.max(w, MIN);
|
|
180
|
+
h = Math.max(h, MIN);
|
|
181
|
+
const next = {
|
|
182
|
+
...edges
|
|
183
|
+
};
|
|
184
|
+
if (dirX > 0) {
|
|
185
|
+
next.left = anchorX;
|
|
186
|
+
next.right = anchorX + w;
|
|
187
|
+
} else {
|
|
188
|
+
next.right = anchorX;
|
|
189
|
+
next.left = anchorX - w;
|
|
190
|
+
}
|
|
191
|
+
if (dirY > 0) {
|
|
192
|
+
next.top = anchorY;
|
|
193
|
+
next.bottom = anchorY + h;
|
|
194
|
+
} else {
|
|
195
|
+
next.bottom = anchorY;
|
|
196
|
+
next.top = anchorY - h;
|
|
197
|
+
}
|
|
198
|
+
return next;
|
|
199
|
+
};
|
|
200
|
+
const moveCrop = (startEdges, dx, dy)=>{
|
|
201
|
+
const w = startEdges.right - startEdges.left;
|
|
202
|
+
const h = startEdges.bottom - startEdges.top;
|
|
203
|
+
const left = Math.min(Math.max(startEdges.left + dx, 0), 1 - w);
|
|
204
|
+
const top = Math.min(Math.max(startEdges.top + dy, 0), 1 - h);
|
|
205
|
+
return {
|
|
206
|
+
left,
|
|
207
|
+
top,
|
|
208
|
+
right: left + w,
|
|
209
|
+
bottom: top + h
|
|
210
|
+
};
|
|
211
|
+
};
|
|
212
|
+
const onPointerMove = useCallback((e)=>{
|
|
213
|
+
const drag = dragRef.current;
|
|
214
|
+
if (!drag) return;
|
|
215
|
+
const p = toNorm(e.clientX, e.clientY);
|
|
216
|
+
if ("focal" === drag.mode) return void onChangeHotspot(clampHotspot({
|
|
217
|
+
x: p.x,
|
|
218
|
+
y: p.y,
|
|
219
|
+
width: 1,
|
|
220
|
+
height: 1
|
|
221
|
+
}, edges));
|
|
222
|
+
if ("move" === drag.mode) {
|
|
223
|
+
const dx = p.x - drag.startPointer.x;
|
|
224
|
+
const dy = p.y - drag.startPointer.y;
|
|
225
|
+
commitEdges(moveCrop(drag.startEdges, dx, dy));
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const handle = drag.mode.slice(7);
|
|
229
|
+
commitEdges(null === ratio ? resizeFree(handle, p) : resizeLocked(handle, p, ratio));
|
|
230
|
+
}, [
|
|
231
|
+
toNorm,
|
|
232
|
+
onChangeHotspot,
|
|
233
|
+
edges,
|
|
234
|
+
commitEdges,
|
|
235
|
+
ratio
|
|
236
|
+
]);
|
|
237
|
+
const startMoveCrop = useCallback((e)=>{
|
|
238
|
+
dragRef.current = {
|
|
239
|
+
mode: "move",
|
|
240
|
+
startPointer: toNorm(e.clientX, e.clientY),
|
|
241
|
+
startEdges: edges
|
|
242
|
+
};
|
|
243
|
+
surfaceRef.current?.setPointerCapture(e.pointerId);
|
|
244
|
+
}, [
|
|
245
|
+
toNorm,
|
|
246
|
+
edges
|
|
247
|
+
]);
|
|
248
|
+
const startFocal = useCallback((e)=>{
|
|
249
|
+
e.stopPropagation();
|
|
250
|
+
dragRef.current = {
|
|
251
|
+
mode: "focal"
|
|
252
|
+
};
|
|
253
|
+
surfaceRef.current?.setPointerCapture(e.pointerId);
|
|
254
|
+
}, []);
|
|
255
|
+
const startResize = useCallback((handle)=>(e)=>{
|
|
256
|
+
e.stopPropagation();
|
|
257
|
+
dragRef.current = {
|
|
258
|
+
mode: `resize:${handle}`
|
|
259
|
+
};
|
|
260
|
+
surfaceRef.current?.setPointerCapture(e.pointerId);
|
|
261
|
+
}, []);
|
|
262
|
+
const endDrag = useCallback((e)=>{
|
|
263
|
+
dragRef.current = null;
|
|
264
|
+
surfaceRef.current?.releasePointerCapture(e.pointerId);
|
|
265
|
+
}, []);
|
|
266
|
+
const onSelectAspect = useCallback((value)=>{
|
|
267
|
+
onChangeAspect(value);
|
|
268
|
+
const r = DEFAULT_ASPECT_RATIOS.find((ar)=>ar.id === value)?.ratio;
|
|
269
|
+
if (value === FREE || !r) return;
|
|
270
|
+
const rNorm = r / imageRatio;
|
|
271
|
+
const cw = edges.right - edges.left;
|
|
272
|
+
const ch = edges.bottom - edges.top;
|
|
273
|
+
let w = cw;
|
|
274
|
+
let h = w / rNorm;
|
|
275
|
+
if (h > ch) {
|
|
276
|
+
h = ch;
|
|
277
|
+
w = h * rNorm;
|
|
278
|
+
}
|
|
279
|
+
const cx = (edges.left + edges.right) / 2;
|
|
280
|
+
const cy = (edges.top + edges.bottom) / 2;
|
|
281
|
+
commitEdges({
|
|
282
|
+
left: clamp01(cx - w / 2),
|
|
283
|
+
right: clamp01(cx + w / 2),
|
|
284
|
+
top: clamp01(cy - h / 2),
|
|
285
|
+
bottom: clamp01(cy + h / 2)
|
|
286
|
+
});
|
|
287
|
+
}, [
|
|
288
|
+
edges,
|
|
289
|
+
commitEdges,
|
|
290
|
+
imageRatio,
|
|
291
|
+
onChangeAspect
|
|
292
|
+
]);
|
|
293
|
+
const activeHotspot = clampHotspot(hotspot, edges);
|
|
294
|
+
const handles = null === ratio ? [
|
|
295
|
+
...CORNER_HANDLES,
|
|
296
|
+
...EDGE_HANDLES
|
|
297
|
+
] : CORNER_HANDLES;
|
|
298
|
+
const handlePosition = (handle)=>{
|
|
299
|
+
const cx = (edges.left + edges.right) / 2;
|
|
300
|
+
const cy = (edges.top + edges.bottom) / 2;
|
|
301
|
+
const x = handle.includes("w") ? edges.left : handle.includes("e") ? edges.right : cx;
|
|
302
|
+
const y = handle.includes("n") ? edges.top : handle.includes("s") ? edges.bottom : cy;
|
|
303
|
+
return {
|
|
304
|
+
left: `${100 * x}%`,
|
|
305
|
+
top: `${100 * y}%`
|
|
306
|
+
};
|
|
307
|
+
};
|
|
308
|
+
const cursorFor = (handle)=>{
|
|
309
|
+
const map = {
|
|
310
|
+
nw: "nwse-resize",
|
|
311
|
+
se: "nwse-resize",
|
|
312
|
+
ne: "nesw-resize",
|
|
313
|
+
sw: "nesw-resize",
|
|
314
|
+
n: "ns-resize",
|
|
315
|
+
s: "ns-resize",
|
|
316
|
+
e: "ew-resize",
|
|
317
|
+
w: "ew-resize"
|
|
318
|
+
};
|
|
319
|
+
return map[handle];
|
|
320
|
+
};
|
|
321
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
322
|
+
className: "flex flex-col gap-sm"
|
|
323
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
324
|
+
className: "flex items-end justify-between gap-md"
|
|
325
|
+
}, /*#__PURE__*/ react.createElement(SectionLabel, null, "Crop & focal point"), /*#__PURE__*/ react.createElement("div", {
|
|
326
|
+
className: "w-[200px] shrink-0"
|
|
327
|
+
}, /*#__PURE__*/ react.createElement(Select, {
|
|
328
|
+
label: "Crop shape",
|
|
329
|
+
value: aspectId,
|
|
330
|
+
options: aspectOptions,
|
|
331
|
+
onChange: onSelectAspect,
|
|
332
|
+
displayResetAction: false
|
|
333
|
+
}))), /*#__PURE__*/ react.createElement("div", {
|
|
334
|
+
className: "flex justify-center rounded-md bg-neutral-dark p-lg"
|
|
335
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
336
|
+
ref: wrapperRef,
|
|
337
|
+
className: "w-full"
|
|
338
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
339
|
+
ref: surfaceRef,
|
|
340
|
+
onPointerMove: onPointerMove,
|
|
341
|
+
onPointerUp: endDrag,
|
|
342
|
+
className: "relative mx-auto touch-none select-none overflow-hidden rounded-sm",
|
|
343
|
+
style: surfaceStyle
|
|
344
|
+
}, /*#__PURE__*/ react.createElement("img", {
|
|
345
|
+
src: image.src,
|
|
346
|
+
alt: "",
|
|
347
|
+
draggable: false,
|
|
348
|
+
className: "pointer-events-none absolute inset-0 h-full w-full object-cover"
|
|
349
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
350
|
+
onPointerDown: startMoveCrop,
|
|
351
|
+
className: "absolute cursor-move border border-white/90",
|
|
352
|
+
style: {
|
|
353
|
+
left: `${100 * edges.left}%`,
|
|
354
|
+
top: `${100 * edges.top}%`,
|
|
355
|
+
width: `${(edges.right - edges.left) * 100}%`,
|
|
356
|
+
height: `${(edges.bottom - edges.top) * 100}%`,
|
|
357
|
+
boxShadow: "0 0 0 1px rgba(0, 0, 0, 0.55), 0 0 0 9999px rgba(0, 0, 0, 0.45)"
|
|
358
|
+
}
|
|
359
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
360
|
+
className: "pointer-events-none absolute inset-0"
|
|
361
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
362
|
+
className: "absolute inset-y-0 left-1/3 w-px bg-white/30"
|
|
363
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
364
|
+
className: "absolute inset-y-0 left-2/3 w-px bg-white/30"
|
|
365
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
366
|
+
className: "absolute inset-x-0 top-1/3 h-px bg-white/30"
|
|
367
|
+
}), /*#__PURE__*/ react.createElement("div", {
|
|
368
|
+
className: "absolute inset-x-0 top-2/3 h-px bg-white/30"
|
|
369
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
370
|
+
onPointerDown: startFocal,
|
|
371
|
+
className: "absolute flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 cursor-grab touch-none items-center justify-center active:cursor-grabbing",
|
|
372
|
+
style: {
|
|
373
|
+
left: `${(activeHotspot.x - edges.left) / Math.max(MIN, edges.right - edges.left) * 100}%`,
|
|
374
|
+
top: `${(activeHotspot.y - edges.top) / Math.max(MIN, edges.bottom - edges.top) * 100}%`
|
|
375
|
+
}
|
|
376
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
377
|
+
className: "pointer-events-none relative h-6 w-6 rounded-full border-2 border-white bg-white/25 shadow-lg"
|
|
378
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
379
|
+
className: "absolute left-1/2 top-1/2 h-1.5 w-1.5 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white"
|
|
380
|
+
})))), handles.map((handle)=>{
|
|
381
|
+
const pos = handlePosition(handle);
|
|
382
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
383
|
+
key: handle,
|
|
384
|
+
onPointerDown: startResize(handle),
|
|
385
|
+
className: "absolute flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 touch-none items-center justify-center",
|
|
386
|
+
style: {
|
|
387
|
+
left: pos.left,
|
|
388
|
+
top: pos.top,
|
|
389
|
+
cursor: cursorFor(handle)
|
|
390
|
+
}
|
|
391
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
392
|
+
className: "pointer-events-none h-3 w-3 rounded-sm border border-neutral-dark bg-white shadow"
|
|
393
|
+
}));
|
|
394
|
+
})))), /*#__PURE__*/ react.createElement(Text, {
|
|
395
|
+
as: "div",
|
|
396
|
+
size: "sm",
|
|
397
|
+
className: "text-neutral-strong"
|
|
398
|
+
}, "Drag the handles to crop, drag inside to reposition, and drag the circle to set the focal point."));
|
|
399
|
+
};
|
|
400
|
+
export { CropHotspotEditor, FREE, inferAspectId };
|
|
401
|
+
|
|
402
|
+
//# sourceMappingURL=CropHotspotEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageEditor/CropHotspotEditor.js","sources":["../../src/ImageEditor/CropHotspotEditor.tsx"],"sourcesContent":["import React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { Select } from \"~/Select/index.js\";\nimport { Text } from \"~/Text/index.js\";\nimport { SectionLabel } from \"./SectionLabel.js\";\nimport { DEFAULT_ASPECT_RATIOS } from \"./types.js\";\nimport type { ImageEditorCrop, ImageEditorHotspot, ImageEditorImage } from \"./types.js\";\n\ninterface CropHotspotEditorProps {\n image: ImageEditorImage;\n crop: ImageEditorCrop | undefined;\n hotspot: ImageEditorHotspot | undefined;\n /** Currently selected crop shape id (\"free\" or a preset id). Controlled by the parent. */\n aspectId: string;\n onChangeAspect: (id: string) => void;\n onChangeCrop: (crop: ImageEditorCrop) => void;\n onChangeHotspot: (hotspot: ImageEditorHotspot) => void;\n}\n\n/** Crop rectangle in edge positions (0..1): left/top/right/bottom, left<right, top<bottom. */\ninterface Edges {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ntype Handle = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\nconst MIN = 0.05;\nexport const FREE = \"free\";\n\n/**\n * Infer which crop-shape preset a saved crop corresponds to, by comparing the\n * crop's on-screen (pixel) aspect ratio against the presets. The crop stores only\n * edge insets — not the shape used to draw it — so on reopen we recover the shape\n * here; a crop drawn with a preset matches it closely, while a free crop won't.\n */\nexport const inferAspectId = (\n crop: ImageEditorCrop | undefined,\n width: number,\n height: number\n): string => {\n if (!crop || !width || !height) {\n return FREE;\n }\n const cropWidth = Math.max(0, 1 - (crop.left ?? 0) - (crop.right ?? 0));\n const cropHeight = Math.max(0, 1 - (crop.top ?? 0) - (crop.bottom ?? 0));\n if (cropWidth <= 0 || cropHeight <= 0) {\n return FREE;\n }\n const displayRatio = (cropWidth * width) / (cropHeight * height);\n const match = DEFAULT_ASPECT_RATIOS.find(ar => Math.abs(ar.ratio - displayRatio) < 0.02);\n return match?.id ?? FREE;\n};\n\n// Canvas fits within this box (px), preserving the image aspect ratio, so tall\n// images don't take up the full screen height.\nconst MAX_CANVAS_WIDTH = 640;\nconst MAX_CANVAS_HEIGHT = 460;\n\nconst clamp01 = (n: number) => Math.min(1, Math.max(0, n));\n\nconst cropToEdges = (crop: ImageEditorCrop | undefined): Edges => ({\n left: clamp01(crop?.left ?? 0),\n top: clamp01(crop?.top ?? 0),\n right: 1 - clamp01(crop?.right ?? 0),\n bottom: 1 - clamp01(crop?.bottom ?? 0)\n});\n\nconst edgesToCrop = (e: Edges): ImageEditorCrop => ({\n top: e.top,\n left: e.left,\n bottom: 1 - e.bottom,\n right: 1 - e.right\n});\n\n// Which edges each handle moves.\nconst HANDLE_EDGES: Record<Handle, Array<keyof Edges>> = {\n nw: [\"top\", \"left\"],\n n: [\"top\"],\n ne: [\"top\", \"right\"],\n e: [\"right\"],\n se: [\"bottom\", \"right\"],\n s: [\"bottom\"],\n sw: [\"bottom\", \"left\"],\n w: [\"left\"]\n};\n\nconst CORNER_HANDLES: Handle[] = [\"nw\", \"ne\", \"se\", \"sw\"];\nconst EDGE_HANDLES: Handle[] = [\"n\", \"e\", \"s\", \"w\"];\n\nconst clampHotspot = (h: ImageEditorHotspot | undefined, e: Edges): ImageEditorHotspot => ({\n x: Math.min(e.right, Math.max(e.left, h?.x ?? (e.left + e.right) / 2)),\n y: Math.min(e.bottom, Math.max(e.top, h?.y ?? (e.top + e.bottom) / 2)),\n width: h?.width ?? 1,\n height: h?.height ?? 1\n});\n\nexport const CropHotspotEditor = ({\n image,\n crop,\n hotspot,\n aspectId,\n onChangeAspect,\n onChangeCrop,\n onChangeHotspot\n}: CropHotspotEditorProps) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<\n | { mode: \"focal\" }\n | { mode: `resize:${Handle}` }\n | { mode: \"move\"; startPointer: { x: number; y: number }; startEdges: Edges }\n | null\n >(null);\n\n // Measure the available width so we can fit the canvas into a max box while\n // preserving the image aspect ratio (keeps the box == image aspect, which the\n // pointer coordinate mapping relies on).\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [availWidth, setAvailWidth] = useState(0);\n\n useLayoutEffect(() => {\n const el = wrapperRef.current;\n if (!el) {\n return;\n }\n const measure = () => setAvailWidth(el.getBoundingClientRect().width);\n measure();\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const imageRatio = (image.width || 1) / (image.height || 1);\n const surfaceStyle = useMemo<React.CSSProperties>(() => {\n if (availWidth <= 0) {\n return {\n width: \"100%\",\n aspectRatio: `${image.width || 1} / ${image.height || 1}`,\n maxHeight: `${MAX_CANVAS_HEIGHT}px`\n };\n }\n let width = Math.min(availWidth, MAX_CANVAS_WIDTH);\n let height = width / imageRatio;\n if (height > MAX_CANVAS_HEIGHT) {\n height = MAX_CANVAS_HEIGHT;\n width = height * imageRatio;\n }\n return { width: `${width}px`, height: `${height}px` };\n }, [availWidth, imageRatio, image.width, image.height]);\n\n const edges = useMemo(() => cropToEdges(crop), [crop]);\n const ratio = DEFAULT_ASPECT_RATIOS.find(ar => ar.id === aspectId)?.ratio ?? null;\n\n const aspectOptions = useMemo(\n () => [\n { label: \"Free\", value: FREE },\n ...DEFAULT_ASPECT_RATIOS.map(ar => ({ label: ar.label, value: ar.id }))\n ],\n []\n );\n\n const toNorm = useCallback((clientX: number, clientY: number) => {\n const rect = surfaceRef.current!.getBoundingClientRect();\n return {\n x: clamp01((clientX - rect.left) / rect.width),\n y: clamp01((clientY - rect.top) / rect.height)\n };\n }, []);\n\n const commitEdges = useCallback(\n (next: Edges) => {\n onChangeCrop(edgesToCrop(next));\n // Keep the focal point inside the (new) crop.\n onChangeHotspot(clampHotspot(hotspot, next));\n },\n [onChangeCrop, onChangeHotspot, hotspot]\n );\n\n const resizeFree = (handle: Handle, p: { x: number; y: number }): Edges => {\n const moves = HANDLE_EDGES[handle];\n const next = { ...edges };\n if (moves.includes(\"left\")) {\n next.left = Math.min(p.x, next.right - MIN);\n }\n if (moves.includes(\"right\")) {\n next.right = Math.max(p.x, next.left + MIN);\n }\n if (moves.includes(\"top\")) {\n next.top = Math.min(p.y, next.bottom - MIN);\n }\n if (moves.includes(\"bottom\")) {\n next.bottom = Math.max(p.y, next.top + MIN);\n }\n return next;\n };\n\n const resizeLocked = (handle: Handle, p: { x: number; y: number }, r: number): Edges => {\n const moves = HANDLE_EDGES[handle];\n // `r` is a display (pixel) aspect ratio, but the crop is stored in normalized\n // image coordinates. Convert so the on-screen crop actually has ratio `r`.\n const rNorm = r / imageRatio;\n // Anchor is the opposite corner (fixed).\n const anchorX = moves.includes(\"left\") ? edges.right : edges.left;\n const anchorY = moves.includes(\"top\") ? edges.bottom : edges.top;\n const dirX = moves.includes(\"left\") ? -1 : 1;\n const dirY = moves.includes(\"top\") ? -1 : 1;\n\n const maxW = dirX > 0 ? 1 - anchorX : anchorX;\n const maxH = dirY > 0 ? 1 - anchorY : anchorY;\n\n let w = Math.abs(p.x - anchorX);\n let h = w / rNorm;\n if (h > Math.abs(p.y - anchorY)) {\n // The vertical drag is the limiting axis.\n h = Math.abs(p.y - anchorY);\n w = h * rNorm;\n }\n // Fit inside the image while keeping the ratio.\n w = Math.min(w, maxW);\n h = w / rNorm;\n if (h > maxH) {\n h = maxH;\n w = h * rNorm;\n }\n w = Math.max(w, MIN);\n h = Math.max(h, MIN);\n\n const next = { ...edges };\n if (dirX > 0) {\n next.left = anchorX;\n next.right = anchorX + w;\n } else {\n next.right = anchorX;\n next.left = anchorX - w;\n }\n if (dirY > 0) {\n next.top = anchorY;\n next.bottom = anchorY + h;\n } else {\n next.bottom = anchorY;\n next.top = anchorY - h;\n }\n return next;\n };\n\n const moveCrop = (startEdges: Edges, dx: number, dy: number): Edges => {\n const w = startEdges.right - startEdges.left;\n const h = startEdges.bottom - startEdges.top;\n const left = Math.min(Math.max(startEdges.left + dx, 0), 1 - w);\n const top = Math.min(Math.max(startEdges.top + dy, 0), 1 - h);\n return { left, top, right: left + w, bottom: top + h };\n };\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n if (!drag) {\n return;\n }\n const p = toNorm(e.clientX, e.clientY);\n if (drag.mode === \"focal\") {\n onChangeHotspot(clampHotspot({ x: p.x, y: p.y, width: 1, height: 1 }, edges));\n return;\n }\n if (drag.mode === \"move\") {\n const dx = p.x - drag.startPointer.x;\n const dy = p.y - drag.startPointer.y;\n commitEdges(moveCrop(drag.startEdges, dx, dy));\n return;\n }\n const handle = drag.mode.slice(\"resize:\".length) as Handle;\n commitEdges(ratio === null ? resizeFree(handle, p) : resizeLocked(handle, p, ratio));\n },\n [toNorm, onChangeHotspot, edges, commitEdges, ratio]\n );\n\n // Drag inside the crop rectangle repositions the whole crop window.\n const startMoveCrop = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n dragRef.current = {\n mode: \"move\",\n startPointer: toNorm(e.clientX, e.clientY),\n startEdges: edges\n };\n surfaceRef.current?.setPointerCapture(e.pointerId);\n },\n [toNorm, edges]\n );\n\n // Dragging the marker itself moves the focal point (and only that).\n const startFocal = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.stopPropagation();\n dragRef.current = { mode: \"focal\" };\n surfaceRef.current?.setPointerCapture(e.pointerId);\n }, []);\n\n const startResize = useCallback(\n (handle: Handle) => (e: React.PointerEvent<HTMLDivElement>) => {\n e.stopPropagation();\n dragRef.current = { mode: `resize:${handle}` };\n surfaceRef.current?.setPointerCapture(e.pointerId);\n },\n []\n );\n\n const endDrag = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n dragRef.current = null;\n surfaceRef.current?.releasePointerCapture(e.pointerId);\n }, []);\n\n const onSelectAspect = useCallback(\n (value: string) => {\n onChangeAspect(value);\n const r = DEFAULT_ASPECT_RATIOS.find(ar => ar.id === value)?.ratio;\n if (value === FREE || !r) {\n return;\n }\n // `r` is a display (pixel) aspect ratio; convert to a normalized ratio\n // so the crop, stored in normalized image coordinates, renders as `r`.\n const rNorm = r / imageRatio;\n // Re-fit the current crop to the chosen ratio, centered within it.\n const cw = edges.right - edges.left;\n const ch = edges.bottom - edges.top;\n let w = cw;\n let h = w / rNorm;\n if (h > ch) {\n h = ch;\n w = h * rNorm;\n }\n const cx = (edges.left + edges.right) / 2;\n const cy = (edges.top + edges.bottom) / 2;\n commitEdges({\n left: clamp01(cx - w / 2),\n right: clamp01(cx + w / 2),\n top: clamp01(cy - h / 2),\n bottom: clamp01(cy + h / 2)\n });\n },\n [edges, commitEdges, imageRatio, onChangeAspect]\n );\n\n const activeHotspot = clampHotspot(hotspot, edges);\n const handles = ratio === null ? [...CORNER_HANDLES, ...EDGE_HANDLES] : CORNER_HANDLES;\n\n const handlePosition = (handle: Handle): { left: string; top: string } => {\n const cx = (edges.left + edges.right) / 2;\n const cy = (edges.top + edges.bottom) / 2;\n const x = handle.includes(\"w\") ? edges.left : handle.includes(\"e\") ? edges.right : cx;\n const y = handle.includes(\"n\") ? edges.top : handle.includes(\"s\") ? edges.bottom : cy;\n return { left: `${x * 100}%`, top: `${y * 100}%` };\n };\n\n const cursorFor = (handle: Handle): string => {\n const map: Record<Handle, string> = {\n nw: \"nwse-resize\",\n se: \"nwse-resize\",\n ne: \"nesw-resize\",\n sw: \"nesw-resize\",\n n: \"ns-resize\",\n s: \"ns-resize\",\n e: \"ew-resize\",\n w: \"ew-resize\"\n };\n return map[handle];\n };\n\n return (\n <div className={\"flex flex-col gap-sm\"}>\n <div className={\"flex items-end justify-between gap-md\"}>\n <SectionLabel>Crop & focal point</SectionLabel>\n <div className={\"w-[200px] shrink-0\"}>\n <Select\n label={\"Crop shape\"}\n value={aspectId}\n options={aspectOptions}\n onChange={onSelectAspect}\n displayResetAction={false}\n />\n </div>\n </div>\n\n {/* Dark editing stage: the image sits centered on a near-black backdrop\n (like a pro image editor), so letterboxing around portrait images\n reads as intentional and the image stays the focal element. */}\n <div className={\"flex justify-center rounded-md bg-neutral-dark p-lg\"}>\n <div ref={wrapperRef} className={\"w-full\"}>\n <div\n ref={surfaceRef}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n className={\n \"relative mx-auto touch-none select-none overflow-hidden rounded-sm\"\n }\n style={surfaceStyle}\n >\n <img\n src={image.src}\n alt={\"\"}\n draggable={false}\n className={\n \"pointer-events-none absolute inset-0 h-full w-full object-cover\"\n }\n />\n\n {/* Crop rectangle: dims outside via box-shadow; interior drag moves the\n crop. The border is two-tone (white edge + a 1px dark ring) so it stays\n visible over both light and dark image areas. */}\n <div\n onPointerDown={startMoveCrop}\n className={\"absolute cursor-move border border-white/90\"}\n style={{\n left: `${edges.left * 100}%`,\n top: `${edges.top * 100}%`,\n width: `${(edges.right - edges.left) * 100}%`,\n height: `${(edges.bottom - edges.top) * 100}%`,\n boxShadow:\n \"0 0 0 1px rgba(0, 0, 0, 0.55), 0 0 0 9999px rgba(0, 0, 0, 0.45)\"\n }}\n >\n {/* Rule-of-thirds guides — a compositional aid and a cue for placing\n the focal point. */}\n <div className={\"pointer-events-none absolute inset-0\"}>\n <div className={\"absolute inset-y-0 left-1/3 w-px bg-white/30\"} />\n <div className={\"absolute inset-y-0 left-2/3 w-px bg-white/30\"} />\n <div className={\"absolute inset-x-0 top-1/3 h-px bg-white/30\"} />\n <div className={\"absolute inset-x-0 top-2/3 h-px bg-white/30\"} />\n </div>\n\n {/* Focal marker — the visible ring is small, but the draggable hit\n area around it is larger for easier grabbing. */}\n <div\n onPointerDown={startFocal}\n className={\n \"absolute flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 cursor-grab touch-none items-center justify-center active:cursor-grabbing\"\n }\n style={{\n left: `${((activeHotspot.x - edges.left) / Math.max(MIN, edges.right - edges.left)) * 100}%`,\n top: `${((activeHotspot.y - edges.top) / Math.max(MIN, edges.bottom - edges.top)) * 100}%`\n }}\n >\n <div\n className={\n \"pointer-events-none relative h-6 w-6 rounded-full border-2 border-white bg-white/25 shadow-lg\"\n }\n >\n <div\n className={\n \"absolute left-1/2 top-1/2 h-1.5 w-1.5 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white\"\n }\n />\n </div>\n </div>\n </div>\n\n {/* Resize handles — small visible dot inside a larger transparent hit\n area so the corners/edges are easy to grab. */}\n {handles.map(handle => {\n const pos = handlePosition(handle);\n return (\n <div\n key={handle}\n onPointerDown={startResize(handle)}\n className={\n \"absolute flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 touch-none items-center justify-center\"\n }\n style={{\n left: pos.left,\n top: pos.top,\n cursor: cursorFor(handle)\n }}\n >\n <div\n className={\n \"pointer-events-none h-3 w-3 rounded-sm border border-neutral-dark bg-white shadow\"\n }\n />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-strong\"}>\n Drag the handles to crop, drag inside to reposition, and drag the circle to set the\n focal point.\n </Text>\n </div>\n );\n};\n"],"names":["MIN","FREE","inferAspectId","crop","width","height","cropWidth","Math","cropHeight","displayRatio","match","DEFAULT_ASPECT_RATIOS","ar","MAX_CANVAS_WIDTH","MAX_CANVAS_HEIGHT","clamp01","n","cropToEdges","edgesToCrop","e","HANDLE_EDGES","CORNER_HANDLES","EDGE_HANDLES","clampHotspot","h","CropHotspotEditor","image","hotspot","aspectId","onChangeAspect","onChangeCrop","onChangeHotspot","surfaceRef","useRef","dragRef","wrapperRef","availWidth","setAvailWidth","useState","useLayoutEffect","el","measure","ResizeObserver","ro","imageRatio","surfaceStyle","useMemo","edges","ratio","aspectOptions","toNorm","useCallback","clientX","clientY","rect","commitEdges","next","resizeFree","handle","p","moves","resizeLocked","r","rNorm","anchorX","anchorY","dirX","dirY","maxW","maxH","w","moveCrop","startEdges","dx","dy","left","top","onPointerMove","drag","startMoveCrop","startFocal","startResize","endDrag","onSelectAspect","value","cw","ch","cx","cy","activeHotspot","handles","handlePosition","x","y","cursorFor","map","SectionLabel","Select","pos","Text"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type ImageEditorAspectRatio, type ImageEditorImage, type ImageEditorValue } from "./types.js";
|
|
3
|
+
export interface ImageEditorProps {
|
|
4
|
+
open: boolean;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
/** The source image to edit. */
|
|
7
|
+
image: ImageEditorImage;
|
|
8
|
+
/** The current edit (crop/hotspot/alt/caption), if any. */
|
|
9
|
+
value?: ImageEditorValue;
|
|
10
|
+
/** Called with the new edit when the user saves. */
|
|
11
|
+
onSave: (value: ImageEditorValue) => void;
|
|
12
|
+
/** Preview ratios shown in the strip. Defaults to square / 4:3 / 16:9. */
|
|
13
|
+
aspectRatios?: ImageEditorAspectRatio[];
|
|
14
|
+
showAlt?: boolean;
|
|
15
|
+
showCaption?: boolean;
|
|
16
|
+
title?: React.ReactNode;
|
|
17
|
+
}
|
|
18
|
+
export declare const ImageEditor: ({ open, onClose, image, value, onSave, aspectRatios, showAlt, showCaption, title }: ImageEditorProps) => React.JSX.Element;
|