roosterjs-content-model-plugins 9.4.1 → 9.5.1
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/README.md +10 -10
- package/lib/autoFormat/hyphen/transformHyphen.d.ts +2 -2
- package/lib/autoFormat/hyphen/transformHyphen.js.map +1 -1
- package/lib/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
- package/lib/autoFormat/link/createLinkAfterSpace.js.map +1 -1
- package/lib/autoFormat/list/keyboardListTrigger.d.ts +2 -2
- package/lib/autoFormat/list/keyboardListTrigger.js.map +1 -1
- package/lib/autoFormat/numbers/transformFraction.d.ts +2 -2
- package/lib/autoFormat/numbers/transformFraction.js.map +1 -1
- package/lib/autoFormat/numbers/transformOrdinals.d.ts +2 -2
- package/lib/autoFormat/numbers/transformOrdinals.js.map +1 -1
- package/lib/customReplace/CustomReplacePlugin.d.ts +2 -2
- package/lib/customReplace/CustomReplacePlugin.js.map +1 -1
- package/lib/edit/EditPlugin.d.ts +10 -0
- package/lib/edit/EditPlugin.js +39 -0
- package/lib/edit/EditPlugin.js.map +1 -1
- package/lib/edit/deleteSteps/deleteAllSegmentBefore.js +2 -1
- package/lib/edit/deleteSteps/deleteAllSegmentBefore.js.map +1 -1
- package/lib/edit/deleteSteps/deleteCollapsedSelection.js +5 -4
- package/lib/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
- package/lib/edit/deleteSteps/deleteEmptyQuote.js +33 -29
- package/lib/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
- package/lib/edit/deleteSteps/deleteWordSelection.js +1 -1
- package/lib/edit/deleteSteps/deleteWordSelection.js.map +1 -1
- package/lib/edit/handleKeyboardEventCommon.d.ts +2 -2
- package/lib/edit/handleKeyboardEventCommon.js.map +1 -1
- package/lib/edit/inputSteps/handleEnterOnList.js +32 -56
- package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
- package/lib/edit/inputSteps/handleEnterOnParagraph.d.ts +5 -0
- package/lib/edit/inputSteps/handleEnterOnParagraph.js +22 -0
- package/lib/edit/inputSteps/handleEnterOnParagraph.js.map +1 -0
- package/lib/edit/keyboardDelete.js +1 -1
- package/lib/edit/keyboardDelete.js.map +1 -1
- package/lib/edit/keyboardEnter.d.ts +5 -0
- package/lib/edit/keyboardEnter.js +44 -0
- package/lib/edit/keyboardEnter.js.map +1 -0
- package/lib/edit/keyboardInput.js +4 -18
- package/lib/edit/keyboardInput.js.map +1 -1
- package/lib/edit/keyboardTab.js.map +1 -1
- package/lib/edit/tabUtils/handleTabOnList.d.ts +2 -2
- package/lib/edit/tabUtils/handleTabOnList.js.map +1 -1
- package/lib/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
- package/lib/edit/tabUtils/handleTabOnParagraph.js +9 -7
- package/lib/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
- package/lib/edit/tabUtils/handleTabOnTable.d.ts +2 -2
- package/lib/edit/tabUtils/handleTabOnTable.js.map +1 -1
- package/lib/edit/tabUtils/handleTabOnTableCell.d.ts +2 -2
- package/lib/edit/tabUtils/handleTabOnTableCell.js +5 -4
- package/lib/edit/tabUtils/handleTabOnTableCell.js.map +1 -1
- package/lib/edit/utils/getLeafSiblingBlock.d.ts +5 -5
- package/lib/edit/utils/getLeafSiblingBlock.js.map +1 -1
- package/lib/edit/utils/splitParagraph.d.ts +9 -0
- package/lib/edit/utils/splitParagraph.js +29 -0
- package/lib/edit/utils/splitParagraph.js.map +1 -0
- package/lib/imageEdit/Cropper/createImageCropper.d.ts +10 -0
- package/lib/imageEdit/Cropper/createImageCropper.js +80 -0
- package/lib/imageEdit/Cropper/createImageCropper.js.map +1 -0
- package/lib/imageEdit/Cropper/cropperContext.d.ts +8 -0
- package/lib/imageEdit/Cropper/cropperContext.js +73 -0
- package/lib/imageEdit/Cropper/cropperContext.js.map +1 -0
- package/lib/imageEdit/ImageEditPlugin.d.ts +66 -0
- package/lib/imageEdit/ImageEditPlugin.js +328 -0
- package/lib/imageEdit/ImageEditPlugin.js.map +1 -0
- package/lib/imageEdit/Resizer/createImageResizer.d.ts +12 -0
- package/lib/imageEdit/Resizer/createImageResizer.js +89 -0
- package/lib/imageEdit/Resizer/createImageResizer.js.map +1 -0
- package/lib/imageEdit/Resizer/resizerContext.d.ts +8 -0
- package/lib/imageEdit/Resizer/resizerContext.js +61 -0
- package/lib/imageEdit/Resizer/resizerContext.js.map +1 -0
- package/lib/imageEdit/Resizer/updateSideHandlesVisibility.d.ts +4 -0
- package/lib/imageEdit/Resizer/updateSideHandlesVisibility.js +17 -0
- package/lib/imageEdit/Resizer/updateSideHandlesVisibility.js.map +1 -0
- package/lib/imageEdit/Rotator/createImageRotator.d.ts +6 -0
- package/lib/imageEdit/Rotator/createImageRotator.js +76 -0
- package/lib/imageEdit/Rotator/createImageRotator.js.map +1 -0
- package/lib/imageEdit/Rotator/rotatorContext.d.ts +8 -0
- package/lib/imageEdit/Rotator/rotatorContext.js +36 -0
- package/lib/imageEdit/Rotator/rotatorContext.js.map +1 -0
- package/lib/imageEdit/Rotator/updateRotateHandle.d.ts +7 -0
- package/lib/imageEdit/Rotator/updateRotateHandle.js +55 -0
- package/lib/imageEdit/Rotator/updateRotateHandle.js.map +1 -0
- package/lib/imageEdit/constants/constants.d.ts +73 -0
- package/lib/imageEdit/constants/constants.js +81 -0
- package/lib/imageEdit/constants/constants.js.map +1 -0
- package/lib/imageEdit/types/DragAndDropContext.d.ts +39 -0
- package/lib/imageEdit/types/DragAndDropContext.js +3 -0
- package/lib/imageEdit/types/DragAndDropContext.js.map +1 -0
- package/lib/imageEdit/types/GeneratedImageSize.d.ts +33 -0
- package/lib/imageEdit/types/GeneratedImageSize.js +3 -0
- package/lib/imageEdit/types/GeneratedImageSize.js.map +1 -0
- package/lib/imageEdit/types/ImageEditElementClass.d.ts +30 -0
- package/lib/imageEdit/types/ImageEditElementClass.js +35 -0
- package/lib/imageEdit/types/ImageEditElementClass.js.map +1 -0
- package/lib/imageEdit/types/ImageEditOptions.d.ts +55 -0
- package/lib/imageEdit/types/ImageEditOptions.js +3 -0
- package/lib/imageEdit/types/ImageEditOptions.js.map +1 -0
- package/lib/imageEdit/types/ImageHtmlOptions.d.ts +18 -0
- package/lib/imageEdit/types/ImageHtmlOptions.js +3 -0
- package/lib/imageEdit/types/ImageHtmlOptions.js.map +1 -0
- package/lib/imageEdit/utils/applyChange.d.ts +12 -0
- package/lib/imageEdit/utils/applyChange.js +77 -0
- package/lib/imageEdit/utils/applyChange.js.map +1 -0
- package/lib/imageEdit/utils/canRegenerateImage.d.ts +8 -0
- package/lib/imageEdit/utils/canRegenerateImage.js +32 -0
- package/lib/imageEdit/utils/canRegenerateImage.js.map +1 -0
- package/lib/imageEdit/utils/checkEditInfoState.d.ts +41 -0
- package/lib/imageEdit/utils/checkEditInfoState.js +54 -0
- package/lib/imageEdit/utils/checkEditInfoState.js.map +1 -0
- package/lib/imageEdit/utils/createImageWrapper.d.ts +18 -0
- package/lib/imageEdit/utils/createImageWrapper.js +87 -0
- package/lib/imageEdit/utils/createImageWrapper.js.map +1 -0
- package/lib/imageEdit/utils/doubleCheckResize.d.ts +12 -0
- package/lib/imageEdit/utils/doubleCheckResize.js +36 -0
- package/lib/imageEdit/utils/doubleCheckResize.js.map +1 -0
- package/lib/imageEdit/utils/generateDataURL.d.ts +13 -0
- package/lib/imageEdit/utils/generateDataURL.js +50 -0
- package/lib/imageEdit/utils/generateDataURL.js.map +1 -0
- package/lib/imageEdit/utils/generateImageSize.d.ts +15 -0
- package/lib/imageEdit/utils/generateImageSize.js +46 -0
- package/lib/imageEdit/utils/generateImageSize.js.map +1 -0
- package/lib/imageEdit/utils/getDropAndDragHelpers.d.ts +10 -0
- package/lib/imageEdit/utils/getDropAndDragHelpers.js +24 -0
- package/lib/imageEdit/utils/getDropAndDragHelpers.js.map +1 -0
- package/lib/imageEdit/utils/getHTMLImageOptions.d.ts +7 -0
- package/lib/imageEdit/utils/getHTMLImageOptions.js +22 -0
- package/lib/imageEdit/utils/getHTMLImageOptions.js.map +1 -0
- package/lib/imageEdit/utils/getSelectedContentModelImage.d.ts +5 -0
- package/lib/imageEdit/utils/getSelectedContentModelImage.js +16 -0
- package/lib/imageEdit/utils/getSelectedContentModelImage.js.map +1 -0
- package/lib/imageEdit/utils/imageEditUtils.d.ts +39 -0
- package/lib/imageEdit/utils/imageEditUtils.js +102 -0
- package/lib/imageEdit/utils/imageEditUtils.js.map +1 -0
- package/lib/imageEdit/utils/updateHandleCursor.d.ts +7 -0
- package/lib/imageEdit/utils/updateHandleCursor.js +34 -0
- package/lib/imageEdit/utils/updateHandleCursor.js.map +1 -0
- package/lib/imageEdit/utils/updateImageEditInfo.d.ts +10 -0
- package/lib/imageEdit/utils/updateImageEditInfo.js +49 -0
- package/lib/imageEdit/utils/updateImageEditInfo.js.map +1 -0
- package/lib/imageEdit/utils/updateWrapper.d.ts +6 -0
- package/lib/imageEdit/utils/updateWrapper.js +87 -0
- package/lib/imageEdit/utils/updateWrapper.js.map +1 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -3
- package/lib/index.js.map +1 -1
- package/lib/paste/DefaultSanitizers.d.ts +10 -0
- package/lib/paste/DefaultSanitizers.js +25 -0
- package/lib/paste/DefaultSanitizers.js.map +1 -0
- package/lib/paste/PastePlugin.d.ts +4 -2
- package/lib/paste/PastePlugin.js +26 -1
- package/lib/paste/PastePlugin.js.map +1 -1
- package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js +13 -0
- package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib/paste/utils/chainSanitizerCallback.d.ts +9 -0
- package/lib/paste/utils/chainSanitizerCallback.js +36 -0
- package/lib/paste/utils/chainSanitizerCallback.js.map +1 -0
- package/lib/picker/getQueryString.d.ts +2 -2
- package/lib/picker/getQueryString.js.map +1 -1
- package/lib/pluginUtils/splitTextSegment.d.ts +2 -2
- package/lib/pluginUtils/splitTextSegment.js.map +1 -1
- package/lib/tableEdit/editors/TableEditor.d.ts +3 -0
- package/lib/tableEdit/editors/TableEditor.js +4 -0
- package/lib/tableEdit/editors/TableEditor.js.map +1 -1
- package/lib/tableEdit/editors/features/CellResizer.d.ts +39 -1
- package/lib/tableEdit/editors/features/CellResizer.js +27 -11
- package/lib/tableEdit/editors/features/CellResizer.js.map +1 -1
- package/lib/tableEdit/editors/features/TableInserter.d.ts +17 -0
- package/lib/tableEdit/editors/features/TableInserter.js +6 -1
- package/lib/tableEdit/editors/features/TableInserter.js.map +1 -1
- package/lib/tableEdit/editors/features/TableMover.d.ts +2 -2
- package/lib/tableEdit/editors/features/TableMover.js +4 -4
- package/lib/tableEdit/editors/features/TableMover.js.map +1 -1
- package/lib/tableEdit/editors/features/TableResizer.d.ts +40 -1
- package/lib/tableEdit/editors/features/TableResizer.js +25 -7
- package/lib/tableEdit/editors/features/TableResizer.js.map +1 -1
- package/lib/tableEdit/editors/utils/getTableFromContentModel.d.ts +2 -2
- package/lib/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -1
- package/lib-amd/autoFormat/hyphen/transformHyphen.d.ts +2 -2
- package/lib-amd/autoFormat/hyphen/transformHyphen.js.map +1 -1
- package/lib-amd/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
- package/lib-amd/autoFormat/link/createLinkAfterSpace.js.map +1 -1
- package/lib-amd/autoFormat/list/keyboardListTrigger.d.ts +2 -2
- package/lib-amd/autoFormat/list/keyboardListTrigger.js.map +1 -1
- package/lib-amd/autoFormat/numbers/transformFraction.d.ts +2 -2
- package/lib-amd/autoFormat/numbers/transformFraction.js.map +1 -1
- package/lib-amd/autoFormat/numbers/transformOrdinals.d.ts +2 -2
- package/lib-amd/autoFormat/numbers/transformOrdinals.js.map +1 -1
- package/lib-amd/customReplace/CustomReplacePlugin.d.ts +2 -2
- package/lib-amd/customReplace/CustomReplacePlugin.js.map +1 -1
- package/lib-amd/edit/EditPlugin.d.ts +10 -0
- package/lib-amd/edit/EditPlugin.js +38 -1
- package/lib-amd/edit/EditPlugin.js.map +1 -1
- package/lib-amd/edit/deleteSteps/deleteAllSegmentBefore.js +2 -1
- package/lib-amd/edit/deleteSteps/deleteAllSegmentBefore.js.map +1 -1
- package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js +5 -4
- package/lib-amd/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
- package/lib-amd/edit/deleteSteps/deleteEmptyQuote.js +33 -30
- package/lib-amd/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
- package/lib-amd/edit/deleteSteps/deleteWordSelection.js +1 -1
- package/lib-amd/edit/deleteSteps/deleteWordSelection.js.map +1 -1
- package/lib-amd/edit/handleKeyboardEventCommon.d.ts +2 -2
- package/lib-amd/edit/handleKeyboardEventCommon.js.map +1 -1
- package/lib-amd/edit/inputSteps/handleEnterOnList.js +32 -57
- package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
- package/lib-amd/edit/inputSteps/handleEnterOnParagraph.d.ts +5 -0
- package/lib-amd/edit/inputSteps/handleEnterOnParagraph.js +22 -0
- package/lib-amd/edit/inputSteps/handleEnterOnParagraph.js.map +1 -0
- package/lib-amd/edit/keyboardDelete.js +1 -1
- package/lib-amd/edit/keyboardDelete.js.map +1 -1
- package/lib-amd/edit/keyboardEnter.d.ts +5 -0
- package/lib-amd/edit/keyboardEnter.js +42 -0
- package/lib-amd/edit/keyboardEnter.js.map +1 -0
- package/lib-amd/edit/keyboardInput.js +5 -17
- package/lib-amd/edit/keyboardInput.js.map +1 -1
- package/lib-amd/edit/keyboardTab.js.map +1 -1
- package/lib-amd/edit/tabUtils/handleTabOnList.d.ts +2 -2
- package/lib-amd/edit/tabUtils/handleTabOnList.js.map +1 -1
- package/lib-amd/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
- package/lib-amd/edit/tabUtils/handleTabOnParagraph.js +9 -7
- package/lib-amd/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
- package/lib-amd/edit/tabUtils/handleTabOnTable.d.ts +2 -2
- package/lib-amd/edit/tabUtils/handleTabOnTable.js.map +1 -1
- package/lib-amd/edit/tabUtils/handleTabOnTableCell.d.ts +2 -2
- package/lib-amd/edit/tabUtils/handleTabOnTableCell.js +5 -4
- package/lib-amd/edit/tabUtils/handleTabOnTableCell.js.map +1 -1
- package/lib-amd/edit/utils/getLeafSiblingBlock.d.ts +5 -5
- package/lib-amd/edit/utils/getLeafSiblingBlock.js.map +1 -1
- package/lib-amd/edit/utils/splitParagraph.d.ts +9 -0
- package/lib-amd/edit/utils/splitParagraph.js +29 -0
- package/lib-amd/edit/utils/splitParagraph.js.map +1 -0
- package/lib-amd/imageEdit/Cropper/createImageCropper.d.ts +10 -0
- package/lib-amd/imageEdit/Cropper/createImageCropper.js +78 -0
- package/lib-amd/imageEdit/Cropper/createImageCropper.js.map +1 -0
- package/lib-amd/imageEdit/Cropper/cropperContext.d.ts +8 -0
- package/lib-amd/imageEdit/Cropper/cropperContext.js +73 -0
- package/lib-amd/imageEdit/Cropper/cropperContext.js.map +1 -0
- package/lib-amd/imageEdit/ImageEditPlugin.d.ts +66 -0
- package/lib-amd/imageEdit/ImageEditPlugin.js +315 -0
- package/lib-amd/imageEdit/ImageEditPlugin.js.map +1 -0
- package/lib-amd/imageEdit/Resizer/createImageResizer.d.ts +12 -0
- package/lib-amd/imageEdit/Resizer/createImageResizer.js +86 -0
- package/lib-amd/imageEdit/Resizer/createImageResizer.js.map +1 -0
- package/lib-amd/imageEdit/Resizer/resizerContext.d.ts +8 -0
- package/lib-amd/imageEdit/Resizer/resizerContext.js +61 -0
- package/lib-amd/imageEdit/Resizer/resizerContext.js.map +1 -0
- package/lib-amd/imageEdit/Resizer/updateSideHandlesVisibility.d.ts +4 -0
- package/lib-amd/imageEdit/Resizer/updateSideHandlesVisibility.js +19 -0
- package/lib-amd/imageEdit/Resizer/updateSideHandlesVisibility.js.map +1 -0
- package/lib-amd/imageEdit/Rotator/createImageRotator.d.ts +6 -0
- package/lib-amd/imageEdit/Rotator/createImageRotator.js +74 -0
- package/lib-amd/imageEdit/Rotator/createImageRotator.js.map +1 -0
- package/lib-amd/imageEdit/Rotator/rotatorContext.d.ts +8 -0
- package/lib-amd/imageEdit/Rotator/rotatorContext.js +36 -0
- package/lib-amd/imageEdit/Rotator/rotatorContext.js.map +1 -0
- package/lib-amd/imageEdit/Rotator/updateRotateHandle.d.ts +7 -0
- package/lib-amd/imageEdit/Rotator/updateRotateHandle.js +56 -0
- package/lib-amd/imageEdit/Rotator/updateRotateHandle.js.map +1 -0
- package/lib-amd/imageEdit/constants/constants.d.ts +73 -0
- package/lib-amd/imageEdit/constants/constants.js +83 -0
- package/lib-amd/imageEdit/constants/constants.js.map +1 -0
- package/lib-amd/imageEdit/types/DragAndDropContext.d.ts +39 -0
- package/lib-amd/imageEdit/types/DragAndDropContext.js +5 -0
- package/lib-amd/imageEdit/types/DragAndDropContext.js.map +1 -0
- package/lib-amd/imageEdit/types/GeneratedImageSize.d.ts +33 -0
- package/lib-amd/imageEdit/types/GeneratedImageSize.js +5 -0
- package/lib-amd/imageEdit/types/GeneratedImageSize.js.map +1 -0
- package/lib-amd/imageEdit/types/ImageEditElementClass.d.ts +30 -0
- package/lib-amd/imageEdit/types/ImageEditElementClass.js +37 -0
- package/lib-amd/imageEdit/types/ImageEditElementClass.js.map +1 -0
- package/lib-amd/imageEdit/types/ImageEditOptions.d.ts +55 -0
- package/lib-amd/imageEdit/types/ImageEditOptions.js +5 -0
- package/lib-amd/imageEdit/types/ImageEditOptions.js.map +1 -0
- package/lib-amd/imageEdit/types/ImageHtmlOptions.d.ts +18 -0
- package/lib-amd/imageEdit/types/ImageHtmlOptions.js +5 -0
- package/lib-amd/imageEdit/types/ImageHtmlOptions.js.map +1 -0
- package/lib-amd/imageEdit/utils/applyChange.d.ts +12 -0
- package/lib-amd/imageEdit/utils/applyChange.js +75 -0
- package/lib-amd/imageEdit/utils/applyChange.js.map +1 -0
- package/lib-amd/imageEdit/utils/canRegenerateImage.d.ts +8 -0
- package/lib-amd/imageEdit/utils/canRegenerateImage.js +34 -0
- package/lib-amd/imageEdit/utils/canRegenerateImage.js.map +1 -0
- package/lib-amd/imageEdit/utils/checkEditInfoState.d.ts +41 -0
- package/lib-amd/imageEdit/utils/checkEditInfoState.js +55 -0
- package/lib-amd/imageEdit/utils/checkEditInfoState.js.map +1 -0
- package/lib-amd/imageEdit/utils/createImageWrapper.d.ts +18 -0
- package/lib-amd/imageEdit/utils/createImageWrapper.js +86 -0
- package/lib-amd/imageEdit/utils/createImageWrapper.js.map +1 -0
- package/lib-amd/imageEdit/utils/doubleCheckResize.d.ts +12 -0
- package/lib-amd/imageEdit/utils/doubleCheckResize.js +38 -0
- package/lib-amd/imageEdit/utils/doubleCheckResize.js.map +1 -0
- package/lib-amd/imageEdit/utils/generateDataURL.d.ts +13 -0
- package/lib-amd/imageEdit/utils/generateDataURL.js +51 -0
- package/lib-amd/imageEdit/utils/generateDataURL.js.map +1 -0
- package/lib-amd/imageEdit/utils/generateImageSize.d.ts +15 -0
- package/lib-amd/imageEdit/utils/generateImageSize.js +48 -0
- package/lib-amd/imageEdit/utils/generateImageSize.js.map +1 -0
- package/lib-amd/imageEdit/utils/getDropAndDragHelpers.d.ts +10 -0
- package/lib-amd/imageEdit/utils/getDropAndDragHelpers.js +24 -0
- package/lib-amd/imageEdit/utils/getDropAndDragHelpers.js.map +1 -0
- package/lib-amd/imageEdit/utils/getHTMLImageOptions.d.ts +7 -0
- package/lib-amd/imageEdit/utils/getHTMLImageOptions.js +23 -0
- package/lib-amd/imageEdit/utils/getHTMLImageOptions.js.map +1 -0
- package/lib-amd/imageEdit/utils/getSelectedContentModelImage.d.ts +5 -0
- package/lib-amd/imageEdit/utils/getSelectedContentModelImage.js +17 -0
- package/lib-amd/imageEdit/utils/getSelectedContentModelImage.js.map +1 -0
- package/lib-amd/imageEdit/utils/imageEditUtils.d.ts +39 -0
- package/lib-amd/imageEdit/utils/imageEditUtils.js +103 -0
- package/lib-amd/imageEdit/utils/imageEditUtils.js.map +1 -0
- package/lib-amd/imageEdit/utils/updateHandleCursor.d.ts +7 -0
- package/lib-amd/imageEdit/utils/updateHandleCursor.js +36 -0
- package/lib-amd/imageEdit/utils/updateHandleCursor.js.map +1 -0
- package/lib-amd/imageEdit/utils/updateImageEditInfo.d.ts +10 -0
- package/lib-amd/imageEdit/utils/updateImageEditInfo.js +48 -0
- package/lib-amd/imageEdit/utils/updateImageEditInfo.js.map +1 -0
- package/lib-amd/imageEdit/utils/updateWrapper.d.ts +6 -0
- package/lib-amd/imageEdit/utils/updateWrapper.js +82 -0
- package/lib-amd/imageEdit/utils/updateWrapper.js.map +1 -0
- package/lib-amd/index.d.ts +2 -1
- package/lib-amd/index.js +3 -3
- package/lib-amd/index.js.map +1 -1
- package/lib-amd/paste/DefaultSanitizers.d.ts +10 -0
- package/lib-amd/paste/DefaultSanitizers.js +27 -0
- package/lib-amd/paste/DefaultSanitizers.js.map +1 -0
- package/lib-amd/paste/PastePlugin.d.ts +4 -2
- package/lib-amd/paste/PastePlugin.js +24 -2
- package/lib-amd/paste/PastePlugin.js.map +1 -1
- package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js +13 -0
- package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib-amd/paste/utils/chainSanitizerCallback.d.ts +9 -0
- package/lib-amd/paste/utils/chainSanitizerCallback.js +38 -0
- package/lib-amd/paste/utils/chainSanitizerCallback.js.map +1 -0
- package/lib-amd/picker/getQueryString.d.ts +2 -2
- package/lib-amd/picker/getQueryString.js.map +1 -1
- package/lib-amd/pluginUtils/splitTextSegment.d.ts +2 -2
- package/lib-amd/pluginUtils/splitTextSegment.js.map +1 -1
- package/lib-amd/tableEdit/editors/TableEditor.d.ts +3 -0
- package/lib-amd/tableEdit/editors/TableEditor.js +4 -0
- package/lib-amd/tableEdit/editors/TableEditor.js.map +1 -1
- package/lib-amd/tableEdit/editors/features/CellResizer.d.ts +39 -1
- package/lib-amd/tableEdit/editors/features/CellResizer.js +27 -11
- package/lib-amd/tableEdit/editors/features/CellResizer.js.map +1 -1
- package/lib-amd/tableEdit/editors/features/TableInserter.d.ts +17 -0
- package/lib-amd/tableEdit/editors/features/TableInserter.js +6 -1
- package/lib-amd/tableEdit/editors/features/TableInserter.js.map +1 -1
- package/lib-amd/tableEdit/editors/features/TableMover.d.ts +2 -2
- package/lib-amd/tableEdit/editors/features/TableMover.js +4 -4
- package/lib-amd/tableEdit/editors/features/TableMover.js.map +1 -1
- package/lib-amd/tableEdit/editors/features/TableResizer.d.ts +40 -1
- package/lib-amd/tableEdit/editors/features/TableResizer.js +25 -7
- package/lib-amd/tableEdit/editors/features/TableResizer.js.map +1 -1
- package/lib-amd/tableEdit/editors/utils/getTableFromContentModel.d.ts +2 -2
- package/lib-amd/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -1
- package/lib-mjs/autoFormat/hyphen/transformHyphen.d.ts +2 -2
- package/lib-mjs/autoFormat/hyphen/transformHyphen.js.map +1 -1
- package/lib-mjs/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
- package/lib-mjs/autoFormat/link/createLinkAfterSpace.js.map +1 -1
- package/lib-mjs/autoFormat/list/keyboardListTrigger.d.ts +2 -2
- package/lib-mjs/autoFormat/list/keyboardListTrigger.js.map +1 -1
- package/lib-mjs/autoFormat/numbers/transformFraction.d.ts +2 -2
- package/lib-mjs/autoFormat/numbers/transformFraction.js.map +1 -1
- package/lib-mjs/autoFormat/numbers/transformOrdinals.d.ts +2 -2
- package/lib-mjs/autoFormat/numbers/transformOrdinals.js.map +1 -1
- package/lib-mjs/customReplace/CustomReplacePlugin.d.ts +2 -2
- package/lib-mjs/customReplace/CustomReplacePlugin.js.map +1 -1
- package/lib-mjs/edit/EditPlugin.d.ts +10 -0
- package/lib-mjs/edit/EditPlugin.js +39 -0
- package/lib-mjs/edit/EditPlugin.js.map +1 -1
- package/lib-mjs/edit/deleteSteps/deleteAllSegmentBefore.js +3 -2
- package/lib-mjs/edit/deleteSteps/deleteAllSegmentBefore.js.map +1 -1
- package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js +5 -4
- package/lib-mjs/edit/deleteSteps/deleteCollapsedSelection.js.map +1 -1
- package/lib-mjs/edit/deleteSteps/deleteEmptyQuote.js +34 -30
- package/lib-mjs/edit/deleteSteps/deleteEmptyQuote.js.map +1 -1
- package/lib-mjs/edit/deleteSteps/deleteWordSelection.js +2 -2
- package/lib-mjs/edit/deleteSteps/deleteWordSelection.js.map +1 -1
- package/lib-mjs/edit/handleKeyboardEventCommon.d.ts +2 -2
- package/lib-mjs/edit/handleKeyboardEventCommon.js.map +1 -1
- package/lib-mjs/edit/inputSteps/handleEnterOnList.js +33 -57
- package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
- package/lib-mjs/edit/inputSteps/handleEnterOnParagraph.d.ts +5 -0
- package/lib-mjs/edit/inputSteps/handleEnterOnParagraph.js +18 -0
- package/lib-mjs/edit/inputSteps/handleEnterOnParagraph.js.map +1 -0
- package/lib-mjs/edit/keyboardDelete.js +1 -1
- package/lib-mjs/edit/keyboardDelete.js.map +1 -1
- package/lib-mjs/edit/keyboardEnter.d.ts +5 -0
- package/lib-mjs/edit/keyboardEnter.js +40 -0
- package/lib-mjs/edit/keyboardEnter.js.map +1 -0
- package/lib-mjs/edit/keyboardInput.js +4 -18
- package/lib-mjs/edit/keyboardInput.js.map +1 -1
- package/lib-mjs/edit/keyboardTab.js.map +1 -1
- package/lib-mjs/edit/tabUtils/handleTabOnList.d.ts +2 -2
- package/lib-mjs/edit/tabUtils/handleTabOnList.js.map +1 -1
- package/lib-mjs/edit/tabUtils/handleTabOnParagraph.d.ts +2 -2
- package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js +9 -7
- package/lib-mjs/edit/tabUtils/handleTabOnParagraph.js.map +1 -1
- package/lib-mjs/edit/tabUtils/handleTabOnTable.d.ts +2 -2
- package/lib-mjs/edit/tabUtils/handleTabOnTable.js.map +1 -1
- package/lib-mjs/edit/tabUtils/handleTabOnTableCell.d.ts +2 -2
- package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js +6 -5
- package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js.map +1 -1
- package/lib-mjs/edit/utils/getLeafSiblingBlock.d.ts +5 -5
- package/lib-mjs/edit/utils/getLeafSiblingBlock.js.map +1 -1
- package/lib-mjs/edit/utils/splitParagraph.d.ts +9 -0
- package/lib-mjs/edit/utils/splitParagraph.js +25 -0
- package/lib-mjs/edit/utils/splitParagraph.js.map +1 -0
- package/lib-mjs/imageEdit/Cropper/createImageCropper.d.ts +10 -0
- package/lib-mjs/imageEdit/Cropper/createImageCropper.js +75 -0
- package/lib-mjs/imageEdit/Cropper/createImageCropper.js.map +1 -0
- package/lib-mjs/imageEdit/Cropper/cropperContext.d.ts +8 -0
- package/lib-mjs/imageEdit/Cropper/cropperContext.js +70 -0
- package/lib-mjs/imageEdit/Cropper/cropperContext.js.map +1 -0
- package/lib-mjs/imageEdit/ImageEditPlugin.d.ts +66 -0
- package/lib-mjs/imageEdit/ImageEditPlugin.js +325 -0
- package/lib-mjs/imageEdit/ImageEditPlugin.js.map +1 -0
- package/lib-mjs/imageEdit/Resizer/createImageResizer.d.ts +12 -0
- package/lib-mjs/imageEdit/Resizer/createImageResizer.js +85 -0
- package/lib-mjs/imageEdit/Resizer/createImageResizer.js.map +1 -0
- package/lib-mjs/imageEdit/Resizer/resizerContext.d.ts +8 -0
- package/lib-mjs/imageEdit/Resizer/resizerContext.js +58 -0
- package/lib-mjs/imageEdit/Resizer/resizerContext.js.map +1 -0
- package/lib-mjs/imageEdit/Resizer/updateSideHandlesVisibility.d.ts +4 -0
- package/lib-mjs/imageEdit/Resizer/updateSideHandlesVisibility.js +13 -0
- package/lib-mjs/imageEdit/Resizer/updateSideHandlesVisibility.js.map +1 -0
- package/lib-mjs/imageEdit/Rotator/createImageRotator.d.ts +6 -0
- package/lib-mjs/imageEdit/Rotator/createImageRotator.js +72 -0
- package/lib-mjs/imageEdit/Rotator/createImageRotator.js.map +1 -0
- package/lib-mjs/imageEdit/Rotator/rotatorContext.d.ts +8 -0
- package/lib-mjs/imageEdit/Rotator/rotatorContext.js +33 -0
- package/lib-mjs/imageEdit/Rotator/rotatorContext.js.map +1 -0
- package/lib-mjs/imageEdit/Rotator/updateRotateHandle.d.ts +7 -0
- package/lib-mjs/imageEdit/Rotator/updateRotateHandle.js +51 -0
- package/lib-mjs/imageEdit/Rotator/updateRotateHandle.js.map +1 -0
- package/lib-mjs/imageEdit/constants/constants.d.ts +73 -0
- package/lib-mjs/imageEdit/constants/constants.js +78 -0
- package/lib-mjs/imageEdit/constants/constants.js.map +1 -0
- package/lib-mjs/imageEdit/types/DragAndDropContext.d.ts +39 -0
- package/lib-mjs/imageEdit/types/DragAndDropContext.js +2 -0
- package/lib-mjs/imageEdit/types/DragAndDropContext.js.map +1 -0
- package/lib-mjs/imageEdit/types/GeneratedImageSize.d.ts +33 -0
- package/lib-mjs/imageEdit/types/GeneratedImageSize.js +2 -0
- package/lib-mjs/imageEdit/types/GeneratedImageSize.js.map +1 -0
- package/lib-mjs/imageEdit/types/ImageEditElementClass.d.ts +30 -0
- package/lib-mjs/imageEdit/types/ImageEditElementClass.js +32 -0
- package/lib-mjs/imageEdit/types/ImageEditElementClass.js.map +1 -0
- package/lib-mjs/imageEdit/types/ImageEditOptions.d.ts +55 -0
- package/lib-mjs/imageEdit/types/ImageEditOptions.js +2 -0
- package/lib-mjs/imageEdit/types/ImageEditOptions.js.map +1 -0
- package/lib-mjs/imageEdit/types/ImageHtmlOptions.d.ts +18 -0
- package/lib-mjs/imageEdit/types/ImageHtmlOptions.js +2 -0
- package/lib-mjs/imageEdit/types/ImageHtmlOptions.js.map +1 -0
- package/lib-mjs/imageEdit/utils/applyChange.d.ts +12 -0
- package/lib-mjs/imageEdit/utils/applyChange.js +73 -0
- package/lib-mjs/imageEdit/utils/applyChange.js.map +1 -0
- package/lib-mjs/imageEdit/utils/canRegenerateImage.d.ts +8 -0
- package/lib-mjs/imageEdit/utils/canRegenerateImage.js +28 -0
- package/lib-mjs/imageEdit/utils/canRegenerateImage.js.map +1 -0
- package/lib-mjs/imageEdit/utils/checkEditInfoState.d.ts +41 -0
- package/lib-mjs/imageEdit/utils/checkEditInfoState.js +50 -0
- package/lib-mjs/imageEdit/utils/checkEditInfoState.js.map +1 -0
- package/lib-mjs/imageEdit/utils/createImageWrapper.d.ts +18 -0
- package/lib-mjs/imageEdit/utils/createImageWrapper.js +83 -0
- package/lib-mjs/imageEdit/utils/createImageWrapper.js.map +1 -0
- package/lib-mjs/imageEdit/utils/doubleCheckResize.d.ts +12 -0
- package/lib-mjs/imageEdit/utils/doubleCheckResize.js +32 -0
- package/lib-mjs/imageEdit/utils/doubleCheckResize.js.map +1 -0
- package/lib-mjs/imageEdit/utils/generateDataURL.d.ts +13 -0
- package/lib-mjs/imageEdit/utils/generateDataURL.js +46 -0
- package/lib-mjs/imageEdit/utils/generateDataURL.js.map +1 -0
- package/lib-mjs/imageEdit/utils/generateImageSize.d.ts +15 -0
- package/lib-mjs/imageEdit/utils/generateImageSize.js +42 -0
- package/lib-mjs/imageEdit/utils/generateImageSize.js.map +1 -0
- package/lib-mjs/imageEdit/utils/getDropAndDragHelpers.d.ts +10 -0
- package/lib-mjs/imageEdit/utils/getDropAndDragHelpers.js +20 -0
- package/lib-mjs/imageEdit/utils/getDropAndDragHelpers.js.map +1 -0
- package/lib-mjs/imageEdit/utils/getHTMLImageOptions.d.ts +7 -0
- package/lib-mjs/imageEdit/utils/getHTMLImageOptions.js +18 -0
- package/lib-mjs/imageEdit/utils/getHTMLImageOptions.js.map +1 -0
- package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.d.ts +5 -0
- package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.js +12 -0
- package/lib-mjs/imageEdit/utils/getSelectedContentModelImage.js.map +1 -0
- package/lib-mjs/imageEdit/utils/imageEditUtils.d.ts +39 -0
- package/lib-mjs/imageEdit/utils/imageEditUtils.js +91 -0
- package/lib-mjs/imageEdit/utils/imageEditUtils.js.map +1 -0
- package/lib-mjs/imageEdit/utils/updateHandleCursor.d.ts +7 -0
- package/lib-mjs/imageEdit/utils/updateHandleCursor.js +30 -0
- package/lib-mjs/imageEdit/utils/updateHandleCursor.js.map +1 -0
- package/lib-mjs/imageEdit/utils/updateImageEditInfo.d.ts +10 -0
- package/lib-mjs/imageEdit/utils/updateImageEditInfo.js +44 -0
- package/lib-mjs/imageEdit/utils/updateImageEditInfo.js.map +1 -0
- package/lib-mjs/imageEdit/utils/updateWrapper.d.ts +6 -0
- package/lib-mjs/imageEdit/utils/updateWrapper.js +83 -0
- package/lib-mjs/imageEdit/utils/updateWrapper.js.map +1 -0
- package/lib-mjs/index.d.ts +2 -1
- package/lib-mjs/index.js +1 -1
- package/lib-mjs/index.js.map +1 -1
- package/lib-mjs/paste/DefaultSanitizers.d.ts +10 -0
- package/lib-mjs/paste/DefaultSanitizers.js +21 -0
- package/lib-mjs/paste/DefaultSanitizers.js.map +1 -0
- package/lib-mjs/paste/PastePlugin.d.ts +4 -2
- package/lib-mjs/paste/PastePlugin.js +27 -2
- package/lib-mjs/paste/PastePlugin.js.map +1 -1
- package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js +13 -0
- package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib-mjs/paste/utils/chainSanitizerCallback.d.ts +9 -0
- package/lib-mjs/paste/utils/chainSanitizerCallback.js +32 -0
- package/lib-mjs/paste/utils/chainSanitizerCallback.js.map +1 -0
- package/lib-mjs/picker/getQueryString.d.ts +2 -2
- package/lib-mjs/picker/getQueryString.js.map +1 -1
- package/lib-mjs/pluginUtils/splitTextSegment.d.ts +2 -2
- package/lib-mjs/pluginUtils/splitTextSegment.js.map +1 -1
- package/lib-mjs/tableEdit/editors/TableEditor.d.ts +3 -0
- package/lib-mjs/tableEdit/editors/TableEditor.js +4 -0
- package/lib-mjs/tableEdit/editors/TableEditor.js.map +1 -1
- package/lib-mjs/tableEdit/editors/features/CellResizer.d.ts +39 -1
- package/lib-mjs/tableEdit/editors/features/CellResizer.js +27 -14
- package/lib-mjs/tableEdit/editors/features/CellResizer.js.map +1 -1
- package/lib-mjs/tableEdit/editors/features/TableInserter.d.ts +17 -0
- package/lib-mjs/tableEdit/editors/features/TableInserter.js +5 -0
- package/lib-mjs/tableEdit/editors/features/TableInserter.js.map +1 -1
- package/lib-mjs/tableEdit/editors/features/TableMover.d.ts +2 -2
- package/lib-mjs/tableEdit/editors/features/TableMover.js +5 -5
- package/lib-mjs/tableEdit/editors/features/TableMover.js.map +1 -1
- package/lib-mjs/tableEdit/editors/features/TableResizer.d.ts +40 -1
- package/lib-mjs/tableEdit/editors/features/TableResizer.js +25 -10
- package/lib-mjs/tableEdit/editors/features/TableResizer.js.map +1 -1
- package/lib-mjs/tableEdit/editors/utils/getTableFromContentModel.d.ts +2 -2
- package/lib-mjs/tableEdit/editors/utils/getTableFromContentModel.js.map +1 -1
- package/package.json +5 -5
- package/lib/pluginUtils/Rect/getDOMInsertPointRect.d.ts +0 -7
- package/lib/pluginUtils/Rect/getDOMInsertPointRect.js +0 -57
- package/lib/pluginUtils/Rect/getDOMInsertPointRect.js.map +0 -1
- package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.d.ts +0 -7
- package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.js +0 -58
- package/lib-amd/pluginUtils/Rect/getDOMInsertPointRect.js.map +0 -1
- package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.d.ts +0 -7
- package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.js +0 -53
- package/lib-mjs/pluginUtils/Rect/getDOMInsertPointRect.js.map +0 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
|
+
import { applyChange } from './utils/applyChange';
|
|
3
|
+
import { canRegenerateImage } from './utils/canRegenerateImage';
|
|
4
|
+
import { checkIfImageWasResized, isASmallImage } from './utils/imageEditUtils';
|
|
5
|
+
import { createImageWrapper } from './utils/createImageWrapper';
|
|
6
|
+
import { Cropper } from './Cropper/cropperContext';
|
|
7
|
+
import { getDropAndDragHelpers } from './utils/getDropAndDragHelpers';
|
|
8
|
+
import { getHTMLImageOptions } from './utils/getHTMLImageOptions';
|
|
9
|
+
import { getSelectedImageMetadata } from './utils/updateImageEditInfo';
|
|
10
|
+
import { ImageEditElementClass } from './types/ImageEditElementClass';
|
|
11
|
+
import { Resizer } from './Resizer/resizerContext';
|
|
12
|
+
import { Rotator } from './Rotator/rotatorContext';
|
|
13
|
+
import { updateRotateHandle } from './Rotator/updateRotateHandle';
|
|
14
|
+
import { updateWrapper } from './utils/updateWrapper';
|
|
15
|
+
import { getSelectedSegmentsAndParagraphs, isElementOfType, isNodeOfType, mutateSegment, unwrap, } from 'roosterjs-content-model-dom';
|
|
16
|
+
var DefaultOptions = {
|
|
17
|
+
borderColor: '#DB626C',
|
|
18
|
+
minWidth: 10,
|
|
19
|
+
minHeight: 10,
|
|
20
|
+
preserveRatio: true,
|
|
21
|
+
disableRotate: false,
|
|
22
|
+
disableSideResize: false,
|
|
23
|
+
onSelectState: 'resize',
|
|
24
|
+
};
|
|
25
|
+
var IMAGE_EDIT_CHANGE_SOURCE = 'ImageEdit';
|
|
26
|
+
/**
|
|
27
|
+
* ImageEdit plugin handles the following image editing features:
|
|
28
|
+
* - Resize image
|
|
29
|
+
* - Crop image
|
|
30
|
+
* - Rotate image
|
|
31
|
+
* - Flip image
|
|
32
|
+
*/
|
|
33
|
+
var ImageEditPlugin = /** @class */ (function () {
|
|
34
|
+
function ImageEditPlugin(options) {
|
|
35
|
+
if (options === void 0) { options = DefaultOptions; }
|
|
36
|
+
this.options = options;
|
|
37
|
+
this.editor = null;
|
|
38
|
+
this.shadowSpan = null;
|
|
39
|
+
this.selectedImage = null;
|
|
40
|
+
this.wrapper = null;
|
|
41
|
+
this.imageEditInfo = null;
|
|
42
|
+
this.imageHTMLOptions = null;
|
|
43
|
+
this.dndHelpers = [];
|
|
44
|
+
this.clonedImage = null;
|
|
45
|
+
this.lastSrc = null;
|
|
46
|
+
this.wasImageResized = false;
|
|
47
|
+
this.isCropMode = false;
|
|
48
|
+
this.resizers = [];
|
|
49
|
+
this.rotators = [];
|
|
50
|
+
this.croppers = [];
|
|
51
|
+
this.zoomScale = 1;
|
|
52
|
+
this.disposer = null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get name of this plugin
|
|
56
|
+
*/
|
|
57
|
+
ImageEditPlugin.prototype.getName = function () {
|
|
58
|
+
return 'ImageEdit';
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* The first method that editor will call to a plugin when editor is initializing.
|
|
62
|
+
* It will pass in the editor instance, plugin should take this chance to save the
|
|
63
|
+
* editor reference so that it can call to any editor method or format API later.
|
|
64
|
+
* @param editor The editor object
|
|
65
|
+
*/
|
|
66
|
+
ImageEditPlugin.prototype.initialize = function (editor) {
|
|
67
|
+
var _this = this;
|
|
68
|
+
this.editor = editor;
|
|
69
|
+
this.disposer = editor.attachDomEvent({
|
|
70
|
+
blur: {
|
|
71
|
+
beforeDispatch: function () {
|
|
72
|
+
_this.formatImageWithContentModel(editor, true /* shouldSelectImage */, true /* shouldSelectAsImageSelection*/);
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* The last method that editor will call to a plugin before it is disposed.
|
|
79
|
+
* Plugin can take this chance to clear the reference to editor. After this method is
|
|
80
|
+
* called, plugin should not call to any editor method since it will result in error.
|
|
81
|
+
*/
|
|
82
|
+
ImageEditPlugin.prototype.dispose = function () {
|
|
83
|
+
this.editor = null;
|
|
84
|
+
this.cleanInfo();
|
|
85
|
+
if (this.disposer) {
|
|
86
|
+
this.disposer();
|
|
87
|
+
this.disposer = null;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Core method for a plugin. Once an event happens in editor, editor will call this
|
|
92
|
+
* method of each plugin to handle the event as long as the event is not handled
|
|
93
|
+
* exclusively by another plugin.
|
|
94
|
+
* @param event The event to handle:
|
|
95
|
+
*/
|
|
96
|
+
ImageEditPlugin.prototype.onPluginEvent = function (_event) { };
|
|
97
|
+
ImageEditPlugin.prototype.startEditing = function (editor, image, apiOperation) {
|
|
98
|
+
var imageSpan = image.parentElement;
|
|
99
|
+
if (!imageSpan || (imageSpan && !isElementOfType(imageSpan, 'span'))) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.imageEditInfo = getSelectedImageMetadata(editor, image);
|
|
103
|
+
this.lastSrc = image.getAttribute('src');
|
|
104
|
+
this.imageHTMLOptions = getHTMLImageOptions(editor, this.options, this.imageEditInfo);
|
|
105
|
+
var _a = createImageWrapper(editor, image, imageSpan, this.options, this.imageEditInfo, this.imageHTMLOptions, apiOperation || this.options.onSelectState), resizers = _a.resizers, rotators = _a.rotators, wrapper = _a.wrapper, shadowSpan = _a.shadowSpan, imageClone = _a.imageClone, croppers = _a.croppers;
|
|
106
|
+
this.shadowSpan = shadowSpan;
|
|
107
|
+
this.selectedImage = image;
|
|
108
|
+
this.wrapper = wrapper;
|
|
109
|
+
this.clonedImage = imageClone;
|
|
110
|
+
this.wasImageResized = checkIfImageWasResized(image);
|
|
111
|
+
this.resizers = resizers;
|
|
112
|
+
this.rotators = rotators;
|
|
113
|
+
this.croppers = croppers;
|
|
114
|
+
this.zoomScale = editor.getDOMHelper().calculateZoomScale();
|
|
115
|
+
editor.setEditorStyle('imageEdit', "outline-style:none!important;", [
|
|
116
|
+
"span:has(>img#" + this.selectedImage.id + ")",
|
|
117
|
+
]);
|
|
118
|
+
};
|
|
119
|
+
ImageEditPlugin.prototype.startRotateAndResize = function (editor, image, apiOperation) {
|
|
120
|
+
var _this = this;
|
|
121
|
+
var _a;
|
|
122
|
+
if (this.wrapper && this.selectedImage && this.shadowSpan) {
|
|
123
|
+
this.removeImageWrapper();
|
|
124
|
+
}
|
|
125
|
+
this.startEditing(editor, image, apiOperation);
|
|
126
|
+
if (this.selectedImage && this.imageEditInfo && this.wrapper && this.clonedImage) {
|
|
127
|
+
this.dndHelpers = __spreadArray(__spreadArray([], __read(getDropAndDragHelpers(this.wrapper, this.imageEditInfo, this.options, ImageEditElementClass.ResizeHandle, Resizer, function () {
|
|
128
|
+
if (_this.imageEditInfo &&
|
|
129
|
+
_this.selectedImage &&
|
|
130
|
+
_this.wrapper &&
|
|
131
|
+
_this.clonedImage) {
|
|
132
|
+
updateWrapper(_this.imageEditInfo, _this.options, _this.selectedImage, _this.clonedImage, _this.wrapper, _this.resizers);
|
|
133
|
+
_this.wasImageResized = true;
|
|
134
|
+
}
|
|
135
|
+
}, this.zoomScale)), false), __read(getDropAndDragHelpers(this.wrapper, this.imageEditInfo, this.options, ImageEditElementClass.RotateHandle, Rotator, function () {
|
|
136
|
+
var _a;
|
|
137
|
+
if (_this.imageEditInfo &&
|
|
138
|
+
_this.selectedImage &&
|
|
139
|
+
_this.wrapper &&
|
|
140
|
+
_this.clonedImage) {
|
|
141
|
+
updateWrapper(_this.imageEditInfo, _this.options, _this.selectedImage, _this.clonedImage, _this.wrapper, _this.rotators);
|
|
142
|
+
_this.updateRotateHandleState(editor, _this.selectedImage, _this.wrapper, _this.rotators, (_a = _this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad);
|
|
143
|
+
}
|
|
144
|
+
}, this.zoomScale)), false);
|
|
145
|
+
updateWrapper(this.imageEditInfo, this.options, this.selectedImage, this.clonedImage, this.wrapper, this.resizers);
|
|
146
|
+
this.updateRotateHandleState(editor, this.selectedImage, this.wrapper, this.rotators, (_a = this.imageEditInfo) === null || _a === void 0 ? void 0 : _a.angleRad);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
ImageEditPlugin.prototype.updateRotateHandleState = function (editor, image, wrapper, rotators, angleRad) {
|
|
150
|
+
var viewport = editor.getVisibleViewport();
|
|
151
|
+
var smallImage = isASmallImage(image.width, image.height);
|
|
152
|
+
if (viewport && rotators && rotators.length > 0) {
|
|
153
|
+
var rotator = rotators[0];
|
|
154
|
+
var rotatorHandle = rotator.firstElementChild;
|
|
155
|
+
if (isNodeOfType(rotatorHandle, 'ELEMENT_NODE') &&
|
|
156
|
+
isElementOfType(rotatorHandle, 'div')) {
|
|
157
|
+
updateRotateHandle(viewport, angleRad !== null && angleRad !== void 0 ? angleRad : 0, wrapper, rotator, rotatorHandle, smallImage);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
ImageEditPlugin.prototype.isOperationAllowed = function (operation) {
|
|
162
|
+
return operation === 'resize' || operation === 'rotate' || operation === 'flip';
|
|
163
|
+
};
|
|
164
|
+
ImageEditPlugin.prototype.canRegenerateImage = function (image) {
|
|
165
|
+
return canRegenerateImage(image);
|
|
166
|
+
};
|
|
167
|
+
ImageEditPlugin.prototype.cropImage = function () {
|
|
168
|
+
var _this = this;
|
|
169
|
+
var _a, _b;
|
|
170
|
+
var selection = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDOMSelection();
|
|
171
|
+
if (!this.editor || !selection || selection.type !== 'image') {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
var image = selection.image;
|
|
175
|
+
if (this.wrapper && this.selectedImage && this.shadowSpan) {
|
|
176
|
+
image = (_b = this.removeImageWrapper()) !== null && _b !== void 0 ? _b : image;
|
|
177
|
+
}
|
|
178
|
+
this.startEditing(this.editor, image, 'crop');
|
|
179
|
+
if (!this.selectedImage || !this.imageEditInfo || !this.wrapper || !this.clonedImage) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
this.dndHelpers = __spreadArray([], __read(getDropAndDragHelpers(this.wrapper, this.imageEditInfo, this.options, ImageEditElementClass.CropHandle, Cropper, function () {
|
|
183
|
+
if (_this.imageEditInfo &&
|
|
184
|
+
_this.selectedImage &&
|
|
185
|
+
_this.wrapper &&
|
|
186
|
+
_this.clonedImage) {
|
|
187
|
+
updateWrapper(_this.imageEditInfo, _this.options, _this.selectedImage, _this.clonedImage, _this.wrapper, undefined, _this.croppers);
|
|
188
|
+
_this.isCropMode = true;
|
|
189
|
+
}
|
|
190
|
+
}, this.zoomScale)), false);
|
|
191
|
+
updateWrapper(this.imageEditInfo, this.options, this.selectedImage, this.clonedImage, this.wrapper, undefined, this.croppers);
|
|
192
|
+
};
|
|
193
|
+
ImageEditPlugin.prototype.editImage = function (editor, image, apiOperation, operation) {
|
|
194
|
+
var _a;
|
|
195
|
+
if (this.wrapper && this.selectedImage && this.shadowSpan) {
|
|
196
|
+
image = (_a = this.removeImageWrapper()) !== null && _a !== void 0 ? _a : image;
|
|
197
|
+
}
|
|
198
|
+
this.startEditing(editor, image, apiOperation);
|
|
199
|
+
if (!this.selectedImage || !this.imageEditInfo || !this.wrapper || !this.clonedImage) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
operation(this.imageEditInfo);
|
|
203
|
+
updateWrapper(this.imageEditInfo, this.options, this.selectedImage, this.clonedImage, this.wrapper);
|
|
204
|
+
this.formatImageWithContentModel(editor, true /* shouldSelect*/, true /* shouldSelectAsImageSelection*/);
|
|
205
|
+
};
|
|
206
|
+
ImageEditPlugin.prototype.cleanInfo = function () {
|
|
207
|
+
var _a;
|
|
208
|
+
(_a = this.editor) === null || _a === void 0 ? void 0 : _a.setEditorStyle('imageEdit', null);
|
|
209
|
+
this.selectedImage = null;
|
|
210
|
+
this.shadowSpan = null;
|
|
211
|
+
this.wrapper = null;
|
|
212
|
+
this.imageEditInfo = null;
|
|
213
|
+
this.imageHTMLOptions = null;
|
|
214
|
+
this.dndHelpers.forEach(function (helper) { return helper.dispose(); });
|
|
215
|
+
this.dndHelpers = [];
|
|
216
|
+
this.clonedImage = null;
|
|
217
|
+
this.lastSrc = null;
|
|
218
|
+
this.wasImageResized = false;
|
|
219
|
+
this.isCropMode = false;
|
|
220
|
+
this.resizers = [];
|
|
221
|
+
this.rotators = [];
|
|
222
|
+
this.croppers = [];
|
|
223
|
+
};
|
|
224
|
+
ImageEditPlugin.prototype.formatImageWithContentModel = function (editor, shouldSelectImage, shouldSelectAsImageSelection) {
|
|
225
|
+
var _this = this;
|
|
226
|
+
if (this.lastSrc &&
|
|
227
|
+
this.selectedImage &&
|
|
228
|
+
this.imageEditInfo &&
|
|
229
|
+
this.clonedImage &&
|
|
230
|
+
this.shadowSpan) {
|
|
231
|
+
editor.formatContentModel(function (model) {
|
|
232
|
+
var selectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs(model, false);
|
|
233
|
+
if (!selectedSegmentsAndParagraphs[0]) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
var segment = selectedSegmentsAndParagraphs[0][0];
|
|
237
|
+
var paragraph = selectedSegmentsAndParagraphs[0][1];
|
|
238
|
+
if (paragraph && segment.segmentType == 'Image') {
|
|
239
|
+
mutateSegment(paragraph, segment, function (image) {
|
|
240
|
+
if (_this.lastSrc &&
|
|
241
|
+
_this.selectedImage &&
|
|
242
|
+
_this.imageEditInfo &&
|
|
243
|
+
_this.clonedImage) {
|
|
244
|
+
applyChange(editor, _this.selectedImage, image, _this.imageEditInfo, _this.lastSrc, _this.wasImageResized || _this.isCropMode, _this.clonedImage);
|
|
245
|
+
image.isSelected = shouldSelectImage;
|
|
246
|
+
image.isSelectedAsImageSelection = shouldSelectAsImageSelection;
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
return false;
|
|
252
|
+
}, {
|
|
253
|
+
changeSource: IMAGE_EDIT_CHANGE_SOURCE,
|
|
254
|
+
onNodeCreated: function () {
|
|
255
|
+
_this.cleanInfo();
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
ImageEditPlugin.prototype.removeImageWrapper = function () {
|
|
261
|
+
var image = null;
|
|
262
|
+
if (this.shadowSpan && this.shadowSpan.parentElement) {
|
|
263
|
+
if (this.shadowSpan.firstElementChild &&
|
|
264
|
+
isNodeOfType(this.shadowSpan.firstElementChild, 'ELEMENT_NODE') &&
|
|
265
|
+
isElementOfType(this.shadowSpan.firstElementChild, 'img')) {
|
|
266
|
+
image = this.shadowSpan.firstElementChild;
|
|
267
|
+
}
|
|
268
|
+
unwrap(this.shadowSpan);
|
|
269
|
+
this.shadowSpan = null;
|
|
270
|
+
this.wrapper = null;
|
|
271
|
+
}
|
|
272
|
+
return image;
|
|
273
|
+
};
|
|
274
|
+
ImageEditPlugin.prototype.flipImage = function (direction) {
|
|
275
|
+
var _a;
|
|
276
|
+
var selection = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDOMSelection();
|
|
277
|
+
if (!this.editor || !selection || selection.type !== 'image') {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
var image = selection.image;
|
|
281
|
+
if (this.editor) {
|
|
282
|
+
this.editImage(this.editor, image, 'flip', function (imageEditInfo) {
|
|
283
|
+
var angleRad = imageEditInfo.angleRad || 0;
|
|
284
|
+
var isInVerticalPostion = (angleRad >= Math.PI / 2 && angleRad < (3 * Math.PI) / 4) ||
|
|
285
|
+
(angleRad <= -Math.PI / 2 && angleRad > (-3 * Math.PI) / 4);
|
|
286
|
+
if (isInVerticalPostion) {
|
|
287
|
+
if (direction === 'horizontal') {
|
|
288
|
+
imageEditInfo.flippedVertical = !imageEditInfo.flippedVertical;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
imageEditInfo.flippedHorizontal = !imageEditInfo.flippedHorizontal;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
if (direction === 'vertical') {
|
|
296
|
+
imageEditInfo.flippedVertical = !imageEditInfo.flippedVertical;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
imageEditInfo.flippedHorizontal = !imageEditInfo.flippedHorizontal;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
ImageEditPlugin.prototype.rotateImage = function (angleRad) {
|
|
306
|
+
var _a;
|
|
307
|
+
var selection = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDOMSelection();
|
|
308
|
+
if (!this.editor || !selection || selection.type !== 'image') {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
var image = selection.image;
|
|
312
|
+
if (this.editor) {
|
|
313
|
+
this.editImage(this.editor, image, 'rotate', function (imageEditInfo) {
|
|
314
|
+
imageEditInfo.angleRad = (imageEditInfo.angleRad || 0) + angleRad;
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
//EXPOSED FOR TEST ONLY
|
|
319
|
+
ImageEditPlugin.prototype.getWrapper = function () {
|
|
320
|
+
return this.wrapper;
|
|
321
|
+
};
|
|
322
|
+
return ImageEditPlugin;
|
|
323
|
+
}());
|
|
324
|
+
export { ImageEditPlugin };
|
|
325
|
+
//# sourceMappingURL=ImageEditPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageEditPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/ImageEditPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyChange } from './utils/applyChange';\nimport { canRegenerateImage } from './utils/canRegenerateImage';\nimport { checkIfImageWasResized, isASmallImage } from './utils/imageEditUtils';\nimport { createImageWrapper } from './utils/createImageWrapper';\nimport { Cropper } from './Cropper/cropperContext';\nimport { getDropAndDragHelpers } from './utils/getDropAndDragHelpers';\nimport { getHTMLImageOptions } from './utils/getHTMLImageOptions';\nimport { getSelectedImageMetadata } from './utils/updateImageEditInfo';\nimport { ImageEditElementClass } from './types/ImageEditElementClass';\nimport { Resizer } from './Resizer/resizerContext';\nimport { Rotator } from './Rotator/rotatorContext';\nimport { updateRotateHandle } from './Rotator/updateRotateHandle';\nimport { updateWrapper } from './utils/updateWrapper';\nimport {\n getSelectedSegmentsAndParagraphs,\n isElementOfType,\n isNodeOfType,\n mutateSegment,\n unwrap,\n} from 'roosterjs-content-model-dom';\nimport type { DragAndDropHelper } from '../pluginUtils/DragAndDrop/DragAndDropHelper';\nimport type { DragAndDropContext } from './types/DragAndDropContext';\nimport type { ImageHtmlOptions } from './types/ImageHtmlOptions';\nimport type { ImageEditOptions } from './types/ImageEditOptions';\nimport type {\n EditorPlugin,\n IEditor,\n ImageEditOperation,\n ImageEditor,\n ImageMetadataFormat,\n PluginEvent,\n} from 'roosterjs-content-model-types';\n\nconst DefaultOptions: Partial<ImageEditOptions> = {\n borderColor: '#DB626C',\n minWidth: 10,\n minHeight: 10,\n preserveRatio: true,\n disableRotate: false,\n disableSideResize: false,\n onSelectState: 'resize',\n};\n\nconst IMAGE_EDIT_CHANGE_SOURCE = 'ImageEdit';\n\n/**\n * ImageEdit plugin handles the following image editing features:\n * - Resize image\n * - Crop image\n * - Rotate image\n * - Flip image\n */\nexport class ImageEditPlugin implements ImageEditor, EditorPlugin {\n protected editor: IEditor | null = null;\n private shadowSpan: HTMLSpanElement | null = null;\n private selectedImage: HTMLImageElement | null = null;\n public wrapper: HTMLSpanElement | null = null;\n private imageEditInfo: ImageMetadataFormat | null = null;\n private imageHTMLOptions: ImageHtmlOptions | null = null;\n private dndHelpers: DragAndDropHelper<DragAndDropContext, any>[] = [];\n private clonedImage: HTMLImageElement | null = null;\n private lastSrc: string | null = null;\n private wasImageResized: boolean = false;\n private isCropMode: boolean = false;\n private resizers: HTMLDivElement[] = [];\n private rotators: HTMLDivElement[] = [];\n private croppers: HTMLDivElement[] = [];\n private zoomScale: number = 1;\n private disposer: (() => void) | null = null;\n\n constructor(protected options: ImageEditOptions = DefaultOptions) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'ImageEdit';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n this.disposer = editor.attachDomEvent({\n blur: {\n beforeDispatch: () => {\n this.formatImageWithContentModel(\n editor,\n true /* shouldSelectImage */,\n true /* shouldSelectAsImageSelection*/\n );\n },\n },\n });\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n this.cleanInfo();\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(_event: PluginEvent) {}\n\n private startEditing(\n editor: IEditor,\n image: HTMLImageElement,\n apiOperation?: ImageEditOperation\n ) {\n const imageSpan = image.parentElement;\n if (!imageSpan || (imageSpan && !isElementOfType(imageSpan, 'span'))) {\n return;\n }\n this.imageEditInfo = getSelectedImageMetadata(editor, image);\n this.lastSrc = image.getAttribute('src');\n this.imageHTMLOptions = getHTMLImageOptions(editor, this.options, this.imageEditInfo);\n const {\n resizers,\n rotators,\n wrapper,\n shadowSpan,\n imageClone,\n croppers,\n } = createImageWrapper(\n editor,\n image,\n imageSpan,\n this.options,\n this.imageEditInfo,\n this.imageHTMLOptions,\n apiOperation || this.options.onSelectState\n );\n this.shadowSpan = shadowSpan;\n this.selectedImage = image;\n this.wrapper = wrapper;\n this.clonedImage = imageClone;\n this.wasImageResized = checkIfImageWasResized(image);\n this.resizers = resizers;\n this.rotators = rotators;\n this.croppers = croppers;\n this.zoomScale = editor.getDOMHelper().calculateZoomScale();\n\n editor.setEditorStyle('imageEdit', `outline-style:none!important;`, [\n `span:has(>img#${this.selectedImage.id})`,\n ]);\n }\n\n public startRotateAndResize(\n editor: IEditor,\n image: HTMLImageElement,\n apiOperation?: 'resize' | 'rotate'\n ) {\n if (this.wrapper && this.selectedImage && this.shadowSpan) {\n this.removeImageWrapper();\n }\n this.startEditing(editor, image, apiOperation);\n if (this.selectedImage && this.imageEditInfo && this.wrapper && this.clonedImage) {\n this.dndHelpers = [\n ...getDropAndDragHelpers(\n this.wrapper,\n this.imageEditInfo,\n this.options,\n ImageEditElementClass.ResizeHandle,\n Resizer,\n () => {\n if (\n this.imageEditInfo &&\n this.selectedImage &&\n this.wrapper &&\n this.clonedImage\n ) {\n updateWrapper(\n this.imageEditInfo,\n this.options,\n this.selectedImage,\n this.clonedImage,\n this.wrapper,\n this.resizers\n );\n this.wasImageResized = true;\n }\n },\n this.zoomScale\n ),\n ...getDropAndDragHelpers(\n this.wrapper,\n this.imageEditInfo,\n this.options,\n ImageEditElementClass.RotateHandle,\n Rotator,\n () => {\n if (\n this.imageEditInfo &&\n this.selectedImage &&\n this.wrapper &&\n this.clonedImage\n ) {\n updateWrapper(\n this.imageEditInfo,\n this.options,\n this.selectedImage,\n this.clonedImage,\n this.wrapper,\n this.rotators\n );\n this.updateRotateHandleState(\n editor,\n this.selectedImage,\n this.wrapper,\n this.rotators,\n this.imageEditInfo?.angleRad\n );\n }\n },\n this.zoomScale\n ),\n ];\n\n updateWrapper(\n this.imageEditInfo,\n this.options,\n this.selectedImage,\n this.clonedImage,\n this.wrapper,\n this.resizers\n );\n\n this.updateRotateHandleState(\n editor,\n this.selectedImage,\n this.wrapper,\n this.rotators,\n this.imageEditInfo?.angleRad\n );\n }\n }\n\n private updateRotateHandleState(\n editor: IEditor,\n image: HTMLImageElement,\n wrapper: HTMLSpanElement,\n rotators: HTMLDivElement[],\n angleRad: number | undefined\n ) {\n const viewport = editor.getVisibleViewport();\n const smallImage = isASmallImage(image.width, image.height);\n if (viewport && rotators && rotators.length > 0) {\n const rotator = rotators[0];\n const rotatorHandle = rotator.firstElementChild;\n if (\n isNodeOfType(rotatorHandle, 'ELEMENT_NODE') &&\n isElementOfType(rotatorHandle, 'div')\n ) {\n updateRotateHandle(\n viewport,\n angleRad ?? 0,\n wrapper,\n rotator,\n rotatorHandle,\n smallImage\n );\n }\n }\n }\n\n public isOperationAllowed(operation: ImageEditOperation): boolean {\n return operation === 'resize' || operation === 'rotate' || operation === 'flip';\n }\n\n public canRegenerateImage(image: HTMLImageElement): boolean {\n return canRegenerateImage(image);\n }\n\n public cropImage() {\n const selection = this.editor?.getDOMSelection();\n if (!this.editor || !selection || selection.type !== 'image') {\n return;\n }\n let image = selection.image;\n if (this.wrapper && this.selectedImage && this.shadowSpan) {\n image = this.removeImageWrapper() ?? image;\n }\n\n this.startEditing(this.editor, image, 'crop');\n if (!this.selectedImage || !this.imageEditInfo || !this.wrapper || !this.clonedImage) {\n return;\n }\n this.dndHelpers = [\n ...getDropAndDragHelpers(\n this.wrapper,\n this.imageEditInfo,\n this.options,\n ImageEditElementClass.CropHandle,\n Cropper,\n () => {\n if (\n this.imageEditInfo &&\n this.selectedImage &&\n this.wrapper &&\n this.clonedImage\n ) {\n updateWrapper(\n this.imageEditInfo,\n this.options,\n this.selectedImage,\n this.clonedImage,\n this.wrapper,\n undefined,\n this.croppers\n );\n this.isCropMode = true;\n }\n },\n this.zoomScale\n ),\n ];\n\n updateWrapper(\n this.imageEditInfo,\n this.options,\n this.selectedImage,\n this.clonedImage,\n this.wrapper,\n undefined,\n this.croppers\n );\n }\n\n private editImage(\n editor: IEditor,\n image: HTMLImageElement,\n apiOperation: ImageEditOperation,\n operation: (imageEditInfo: ImageMetadataFormat) => void\n ) {\n if (this.wrapper && this.selectedImage && this.shadowSpan) {\n image = this.removeImageWrapper() ?? image;\n }\n this.startEditing(editor, image, apiOperation);\n if (!this.selectedImage || !this.imageEditInfo || !this.wrapper || !this.clonedImage) {\n return;\n }\n\n operation(this.imageEditInfo);\n\n updateWrapper(\n this.imageEditInfo,\n this.options,\n this.selectedImage,\n this.clonedImage,\n this.wrapper\n );\n\n this.formatImageWithContentModel(\n editor,\n true /* shouldSelect*/,\n true /* shouldSelectAsImageSelection*/\n );\n }\n\n private cleanInfo() {\n this.editor?.setEditorStyle('imageEdit', null);\n this.selectedImage = null;\n this.shadowSpan = null;\n this.wrapper = null;\n this.imageEditInfo = null;\n this.imageHTMLOptions = null;\n this.dndHelpers.forEach(helper => helper.dispose());\n this.dndHelpers = [];\n this.clonedImage = null;\n this.lastSrc = null;\n this.wasImageResized = false;\n this.isCropMode = false;\n this.resizers = [];\n this.rotators = [];\n this.croppers = [];\n }\n\n private formatImageWithContentModel(\n editor: IEditor,\n shouldSelectImage: boolean,\n shouldSelectAsImageSelection: boolean\n ) {\n if (\n this.lastSrc &&\n this.selectedImage &&\n this.imageEditInfo &&\n this.clonedImage &&\n this.shadowSpan\n ) {\n editor.formatContentModel(\n model => {\n const selectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs(\n model,\n false\n );\n if (!selectedSegmentsAndParagraphs[0]) {\n return false;\n }\n\n const segment = selectedSegmentsAndParagraphs[0][0];\n const paragraph = selectedSegmentsAndParagraphs[0][1];\n\n if (paragraph && segment.segmentType == 'Image') {\n mutateSegment(paragraph, segment, image => {\n if (\n this.lastSrc &&\n this.selectedImage &&\n this.imageEditInfo &&\n this.clonedImage\n ) {\n applyChange(\n editor,\n this.selectedImage,\n image,\n this.imageEditInfo,\n this.lastSrc,\n this.wasImageResized || this.isCropMode,\n this.clonedImage\n );\n image.isSelected = shouldSelectImage;\n image.isSelectedAsImageSelection = shouldSelectAsImageSelection;\n }\n });\n return true;\n }\n\n return false;\n },\n {\n changeSource: IMAGE_EDIT_CHANGE_SOURCE,\n onNodeCreated: () => {\n this.cleanInfo();\n },\n }\n );\n }\n }\n\n private removeImageWrapper() {\n let image: HTMLImageElement | null = null;\n if (this.shadowSpan && this.shadowSpan.parentElement) {\n if (\n this.shadowSpan.firstElementChild &&\n isNodeOfType(this.shadowSpan.firstElementChild, 'ELEMENT_NODE') &&\n isElementOfType(this.shadowSpan.firstElementChild, 'img')\n ) {\n image = this.shadowSpan.firstElementChild;\n }\n unwrap(this.shadowSpan);\n this.shadowSpan = null;\n this.wrapper = null;\n }\n\n return image;\n }\n\n public flipImage(direction: 'horizontal' | 'vertical') {\n const selection = this.editor?.getDOMSelection();\n if (!this.editor || !selection || selection.type !== 'image') {\n return;\n }\n const image = selection.image;\n if (this.editor) {\n this.editImage(this.editor, image, 'flip', imageEditInfo => {\n const angleRad = imageEditInfo.angleRad || 0;\n const isInVerticalPostion =\n (angleRad >= Math.PI / 2 && angleRad < (3 * Math.PI) / 4) ||\n (angleRad <= -Math.PI / 2 && angleRad > (-3 * Math.PI) / 4);\n if (isInVerticalPostion) {\n if (direction === 'horizontal') {\n imageEditInfo.flippedVertical = !imageEditInfo.flippedVertical;\n } else {\n imageEditInfo.flippedHorizontal = !imageEditInfo.flippedHorizontal;\n }\n } else {\n if (direction === 'vertical') {\n imageEditInfo.flippedVertical = !imageEditInfo.flippedVertical;\n } else {\n imageEditInfo.flippedHorizontal = !imageEditInfo.flippedHorizontal;\n }\n }\n });\n }\n }\n\n public rotateImage(angleRad: number) {\n const selection = this.editor?.getDOMSelection();\n if (!this.editor || !selection || selection.type !== 'image') {\n return;\n }\n const image = selection.image;\n if (this.editor) {\n this.editImage(this.editor, image, 'rotate', imageEditInfo => {\n imageEditInfo.angleRad = (imageEditInfo.angleRad || 0) + angleRad;\n });\n }\n }\n\n //EXPOSED FOR TEST ONLY\n public getWrapper() {\n return this.wrapper;\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CreateElementData } from '../../pluginUtils/CreateElement/CreateElementData';
|
|
2
|
+
import type { DNDDirectionX, DnDDirectionY } from '../types/DragAndDropContext';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export interface OnShowResizeHandle {
|
|
7
|
+
(elementData: CreateElementData, x: DNDDirectionX, y: DnDDirectionY): void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare function createImageResizer(doc: Document, onShowResizeHandle?: OnShowResizeHandle): HTMLDivElement[];
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
|
+
import { createElement } from '../../pluginUtils/CreateElement/createElement';
|
|
3
|
+
import { ImageEditElementClass } from '../types/ImageEditElementClass';
|
|
4
|
+
import { isElementOfType, isNodeOfType } from 'roosterjs-content-model-dom';
|
|
5
|
+
import { Xs, Ys } from '../constants/constants';
|
|
6
|
+
var RESIZE_HANDLE_MARGIN = 6;
|
|
7
|
+
var RESIZE_HANDLE_SIZE = 10;
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export function createImageResizer(doc, onShowResizeHandle) {
|
|
12
|
+
var cornerElements = getCornerResizeHTML(onShowResizeHandle);
|
|
13
|
+
var sideElements = getSideResizeHTML(onShowResizeHandle);
|
|
14
|
+
var handles = __spreadArray(__spreadArray([], __read(cornerElements), false), __read(sideElements), false).map(function (element) {
|
|
15
|
+
var handle = createElement(element, doc);
|
|
16
|
+
if (isNodeOfType(handle, 'ELEMENT_NODE') && isElementOfType(handle, 'div')) {
|
|
17
|
+
return handle;
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
.filter(function (element) { return !!element; });
|
|
21
|
+
return handles;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @internal
|
|
25
|
+
* Get HTML for resize handles at the corners
|
|
26
|
+
*/
|
|
27
|
+
function getCornerResizeHTML(onShowResizeHandle) {
|
|
28
|
+
var result = [];
|
|
29
|
+
Xs.forEach(function (x) {
|
|
30
|
+
return Ys.forEach(function (y) {
|
|
31
|
+
var elementData = (x == '') == (y == '') ? getResizeHandleHTML(x, y) : null;
|
|
32
|
+
if (onShowResizeHandle && elementData) {
|
|
33
|
+
onShowResizeHandle(elementData, x, y);
|
|
34
|
+
}
|
|
35
|
+
if (elementData) {
|
|
36
|
+
result.push(elementData);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
* Get HTML for resize handles on the sides
|
|
45
|
+
*/
|
|
46
|
+
function getSideResizeHTML(onShowResizeHandle) {
|
|
47
|
+
var result = [];
|
|
48
|
+
Xs.forEach(function (x) {
|
|
49
|
+
return Ys.forEach(function (y) {
|
|
50
|
+
var elementData = (x == '') != (y == '') ? getResizeHandleHTML(x, y) : null;
|
|
51
|
+
if (onShowResizeHandle && elementData) {
|
|
52
|
+
onShowResizeHandle(elementData, x, y);
|
|
53
|
+
}
|
|
54
|
+
if (elementData) {
|
|
55
|
+
result.push(elementData);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
var createHandleStyle = function (direction, topOrBottom, leftOrRight) {
|
|
62
|
+
return "position:relative;width:" + RESIZE_HANDLE_SIZE + "px;height:" + RESIZE_HANDLE_SIZE + "px;background-color: #FFFFFF;cursor:" + direction + "-resize;" + topOrBottom + ":-" + RESIZE_HANDLE_MARGIN + "px;" + leftOrRight + ":-" + RESIZE_HANDLE_MARGIN + "px;border-radius:100%;border: 2px solid #bfbfbf;box-shadow: 0px 0.36316px 1.36185px rgba(100, 100, 100, 0.25);";
|
|
63
|
+
};
|
|
64
|
+
function getResizeHandleHTML(x, y) {
|
|
65
|
+
var leftOrRight = x == 'w' ? 'left' : 'right';
|
|
66
|
+
var topOrBottom = y == 'n' ? 'top' : 'bottom';
|
|
67
|
+
var leftOrRightValue = x == '' ? '50%' : '0px';
|
|
68
|
+
var topOrBottomValue = y == '' ? '50%' : '0px';
|
|
69
|
+
var direction = y + x;
|
|
70
|
+
return x == '' && y == ''
|
|
71
|
+
? null
|
|
72
|
+
: {
|
|
73
|
+
tag: 'div',
|
|
74
|
+
style: "position:absolute;" + leftOrRight + ":" + leftOrRightValue + ";" + topOrBottom + ":" + topOrBottomValue,
|
|
75
|
+
children: [
|
|
76
|
+
{
|
|
77
|
+
tag: 'div',
|
|
78
|
+
style: createHandleStyle(direction, topOrBottom, leftOrRight),
|
|
79
|
+
className: ImageEditElementClass.ResizeHandle,
|
|
80
|
+
dataset: { x: x, y: y },
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=createImageResizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createImageResizer.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/Resizer/createImageResizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from '../../pluginUtils/CreateElement/createElement';\nimport { ImageEditElementClass } from '../types/ImageEditElementClass';\nimport { isElementOfType, isNodeOfType } from 'roosterjs-content-model-dom';\nimport { Xs, Ys } from '../constants/constants';\nimport type { CreateElementData } from '../../pluginUtils/CreateElement/CreateElementData';\nimport type { DNDDirectionX, DnDDirectionY } from '../types/DragAndDropContext';\n/**\n * @internal\n */\nexport interface OnShowResizeHandle {\n (elementData: CreateElementData, x: DNDDirectionX, y: DnDDirectionY): void;\n}\n\nconst RESIZE_HANDLE_MARGIN = 6;\nconst RESIZE_HANDLE_SIZE = 10;\n\n/**\n * @internal\n */\nexport function createImageResizer(\n doc: Document,\n onShowResizeHandle?: OnShowResizeHandle\n): HTMLDivElement[] {\n const cornerElements = getCornerResizeHTML(onShowResizeHandle);\n const sideElements = getSideResizeHTML(onShowResizeHandle);\n const handles = [...cornerElements, ...sideElements]\n .map(element => {\n const handle = createElement(element, doc);\n if (isNodeOfType(handle, 'ELEMENT_NODE') && isElementOfType(handle, 'div')) {\n return handle;\n }\n })\n .filter(element => !!element) as HTMLDivElement[];\n return handles;\n}\n\n/**\n * @internal\n * Get HTML for resize handles at the corners\n */\nfunction getCornerResizeHTML(onShowResizeHandle?: OnShowResizeHandle): CreateElementData[] {\n const result: CreateElementData[] = [];\n\n Xs.forEach(x =>\n Ys.forEach(y => {\n const elementData = (x == '') == (y == '') ? getResizeHandleHTML(x, y) : null;\n if (onShowResizeHandle && elementData) {\n onShowResizeHandle(elementData, x, y);\n }\n if (elementData) {\n result.push(elementData);\n }\n })\n );\n return result;\n}\n\n/**\n * @internal\n * Get HTML for resize handles on the sides\n */\nfunction getSideResizeHTML(onShowResizeHandle?: OnShowResizeHandle): CreateElementData[] {\n const result: CreateElementData[] = [];\n Xs.forEach(x =>\n Ys.forEach(y => {\n const elementData = (x == '') != (y == '') ? getResizeHandleHTML(x, y) : null;\n if (onShowResizeHandle && elementData) {\n onShowResizeHandle(elementData, x, y);\n }\n if (elementData) {\n result.push(elementData);\n }\n })\n );\n return result;\n}\n\nconst createHandleStyle = (direction: string, topOrBottom: string, leftOrRight: string) => {\n return `position:relative;width:${RESIZE_HANDLE_SIZE}px;height:${RESIZE_HANDLE_SIZE}px;background-color: #FFFFFF;cursor:${direction}-resize;${topOrBottom}:-${RESIZE_HANDLE_MARGIN}px;${leftOrRight}:-${RESIZE_HANDLE_MARGIN}px;border-radius:100%;border: 2px solid #bfbfbf;box-shadow: 0px 0.36316px 1.36185px rgba(100, 100, 100, 0.25);`;\n};\n\nfunction getResizeHandleHTML(x: DNDDirectionX, y: DnDDirectionY): CreateElementData | null {\n const leftOrRight = x == 'w' ? 'left' : 'right';\n const topOrBottom = y == 'n' ? 'top' : 'bottom';\n const leftOrRightValue = x == '' ? '50%' : '0px';\n const topOrBottomValue = y == '' ? '50%' : '0px';\n const direction = y + x;\n return x == '' && y == ''\n ? null\n : {\n tag: 'div',\n style: `position:absolute;${leftOrRight}:${leftOrRightValue};${topOrBottom}:${topOrBottomValue}`,\n children: [\n {\n tag: 'div',\n style: createHandleStyle(direction, topOrBottom, leftOrRight),\n className: ImageEditElementClass.ResizeHandle,\n dataset: { x, y },\n },\n ],\n };\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DragAndDropHandler } from '../../pluginUtils/DragAndDrop/DragAndDropHandler';
|
|
2
|
+
import type { ImageResizeMetadataFormat } from 'roosterjs-content-model-types';
|
|
3
|
+
import type { DragAndDropContext } from '../types/DragAndDropContext';
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
* The resize drag and drop handler
|
|
7
|
+
*/
|
|
8
|
+
export declare const Resizer: DragAndDropHandler<DragAndDropContext, ImageResizeMetadataFormat>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { __assign, __read } from "tslib";
|
|
2
|
+
import { rotateCoordinate } from '../utils/imageEditUtils';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
* The resize drag and drop handler
|
|
6
|
+
*/
|
|
7
|
+
export var Resizer = {
|
|
8
|
+
onDragStart: function (_a) {
|
|
9
|
+
var editInfo = _a.editInfo;
|
|
10
|
+
return (__assign({}, editInfo));
|
|
11
|
+
},
|
|
12
|
+
onDragging: function (_a, e, base, deltaX, deltaY) {
|
|
13
|
+
var _b;
|
|
14
|
+
var _c;
|
|
15
|
+
var x = _a.x, y = _a.y, editInfo = _a.editInfo, options = _a.options;
|
|
16
|
+
if (base.heightPx &&
|
|
17
|
+
base.widthPx &&
|
|
18
|
+
options.minWidth !== undefined &&
|
|
19
|
+
options.minHeight !== undefined) {
|
|
20
|
+
var ratio = base.widthPx > 0 && base.heightPx > 0 ? (base.widthPx * 1.0) / base.heightPx : 0;
|
|
21
|
+
_b = __read(rotateCoordinate(deltaX, deltaY, (_c = editInfo.angleRad) !== null && _c !== void 0 ? _c : 0), 2), deltaX = _b[0], deltaY = _b[1];
|
|
22
|
+
var horizontalOnly = x == '';
|
|
23
|
+
var verticalOnly = y == '';
|
|
24
|
+
var shouldPreserveRatio = !(horizontalOnly || verticalOnly) && (options.preserveRatio || e.shiftKey);
|
|
25
|
+
var newWidth = horizontalOnly
|
|
26
|
+
? base.widthPx
|
|
27
|
+
: Math.max(base.widthPx + deltaX * (x == 'w' ? -1 : 1), options.minWidth);
|
|
28
|
+
var newHeight = verticalOnly
|
|
29
|
+
? base.heightPx
|
|
30
|
+
: Math.max(base.heightPx + deltaY * (y == 'n' ? -1 : 1), options.minHeight);
|
|
31
|
+
if (shouldPreserveRatio && ratio > 0) {
|
|
32
|
+
if (ratio > 1) {
|
|
33
|
+
// first sure newHeight is right,calculate newWidth
|
|
34
|
+
newWidth = newHeight * ratio;
|
|
35
|
+
if (newWidth < options.minWidth) {
|
|
36
|
+
newWidth = options.minWidth;
|
|
37
|
+
newHeight = newWidth / ratio;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// first sure newWidth is right,calculate newHeight
|
|
42
|
+
newHeight = newWidth / ratio;
|
|
43
|
+
if (newHeight < options.minHeight) {
|
|
44
|
+
newHeight = options.minHeight;
|
|
45
|
+
newWidth = newHeight * ratio;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
editInfo.widthPx = newWidth;
|
|
50
|
+
editInfo.heightPx = newHeight;
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=resizerContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resizerContext.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/Resizer/resizerContext.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D;;;GAGG;AACH,MAAM,CAAC,IAAM,OAAO,GAAsE;IACtF,WAAW,EAAE,UAAC,EAAY;YAAV,QAAQ,cAAA;QAAO,OAAA,cAAM,QAAQ,EAAG;IAAjB,CAAiB;IAChD,UAAU,EAAE,UAAC,EAA2B,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM;;;YAAlD,CAAC,OAAA,EAAE,CAAC,OAAA,EAAE,QAAQ,cAAA,EAAE,OAAO,aAAA;QAClC,IACI,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,OAAO;YACZ,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC9B,OAAO,CAAC,SAAS,KAAK,SAAS,EACjC;YACE,IAAM,KAAK,GACP,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,KAAA,OAAmB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAA,QAAQ,CAAC,QAAQ,mCAAI,CAAC,CAAC,IAAA,EAA1E,MAAM,QAAA,EAAE,MAAM,QAAA,CAA6D;YAC5E,IAAM,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAM,YAAY,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAM,mBAAmB,GACrB,CAAC,CAAC,cAAc,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC/E,IAAI,QAAQ,GAAG,cAAc;gBACzB,CAAC,CAAC,IAAI,CAAC,OAAO;gBACd,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9E,IAAI,SAAS,GAAG,YAAY;gBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACf,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAEhF,IAAI,mBAAmB,IAAI,KAAK,GAAG,CAAC,EAAE;gBAClC,IAAI,KAAK,GAAG,CAAC,EAAE;oBACX,mDAAmD;oBACnD,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;oBAC7B,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE;wBAC7B,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;wBAC5B,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;qBAChC;iBACJ;qBAAM;oBACH,mDAAmD;oBACnD,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAC;oBAC7B,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE;wBAC/B,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;wBAC9B,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;qBAChC;iBACJ;aACJ;YAED,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;YAC5B,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC9B,OAAO,IAAI,CAAC;SACf;aAAM;YACH,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;CACJ,CAAC","sourcesContent":["import { rotateCoordinate } from '../utils/imageEditUtils';\nimport type { DragAndDropHandler } from '../../pluginUtils/DragAndDrop/DragAndDropHandler';\nimport type { ImageResizeMetadataFormat } from 'roosterjs-content-model-types';\nimport type { DragAndDropContext } from '../types/DragAndDropContext';\n\n/**\n * @internal\n * The resize drag and drop handler\n */\nexport const Resizer: DragAndDropHandler<DragAndDropContext, ImageResizeMetadataFormat> = {\n onDragStart: ({ editInfo }) => ({ ...editInfo }),\n onDragging: ({ x, y, editInfo, options }, e, base, deltaX, deltaY) => {\n if (\n base.heightPx &&\n base.widthPx &&\n options.minWidth !== undefined &&\n options.minHeight !== undefined\n ) {\n const ratio =\n base.widthPx > 0 && base.heightPx > 0 ? (base.widthPx * 1.0) / base.heightPx : 0;\n [deltaX, deltaY] = rotateCoordinate(deltaX, deltaY, editInfo.angleRad ?? 0);\n const horizontalOnly = x == '';\n const verticalOnly = y == '';\n const shouldPreserveRatio =\n !(horizontalOnly || verticalOnly) && (options.preserveRatio || e.shiftKey);\n let newWidth = horizontalOnly\n ? base.widthPx\n : Math.max(base.widthPx + deltaX * (x == 'w' ? -1 : 1), options.minWidth);\n let newHeight = verticalOnly\n ? base.heightPx\n : Math.max(base.heightPx + deltaY * (y == 'n' ? -1 : 1), options.minHeight);\n\n if (shouldPreserveRatio && ratio > 0) {\n if (ratio > 1) {\n // first sure newHeight is right,calculate newWidth\n newWidth = newHeight * ratio;\n if (newWidth < options.minWidth) {\n newWidth = options.minWidth;\n newHeight = newWidth / ratio;\n }\n } else {\n // first sure newWidth is right,calculate newHeight\n newHeight = newWidth / ratio;\n if (newHeight < options.minHeight) {\n newHeight = options.minHeight;\n newWidth = newHeight * ratio;\n }\n }\n }\n\n editInfo.widthPx = newWidth;\n editInfo.heightPx = newHeight;\n return true;\n } else {\n return false;\n }\n },\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal
|
|
3
|
+
*/
|
|
4
|
+
export function updateSideHandlesVisibility(handles, isSmall) {
|
|
5
|
+
handles.forEach(function (handle) {
|
|
6
|
+
var _a = handle.dataset, y = _a.y, x = _a.x;
|
|
7
|
+
var coordinate = (y !== null && y !== void 0 ? y : '') + (x !== null && x !== void 0 ? x : '');
|
|
8
|
+
var directions = ['n', 's', 'e', 'w'];
|
|
9
|
+
var isSideHandle = directions.indexOf(coordinate) > -1;
|
|
10
|
+
handle.style.display = isSideHandle && isSmall ? 'none' : '';
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=updateSideHandlesVisibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateSideHandlesVisibility.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/imageEdit/Resizer/updateSideHandlesVisibility.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAAyB,EAAE,OAAgB;IACnF,OAAO,CAAC,OAAO,CAAC,UAAA,MAAM;QACZ,IAAA,KAAW,MAAM,CAAC,OAAO,EAAvB,CAAC,OAAA,EAAE,CAAC,OAAmB,CAAC;QAChC,IAAM,UAAU,GAAG,CAAC,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,EAAE,CAAC,GAAG,CAAC,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,EAAE,CAAC,CAAC;QACzC,IAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACxC,IAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["/**\n * @internal\n */\nexport function updateSideHandlesVisibility(handles: HTMLDivElement[], isSmall: boolean) {\n handles.forEach(handle => {\n const { y, x } = handle.dataset;\n const coordinate = (y ?? '') + (x ?? '');\n const directions = ['n', 's', 'e', 'w'];\n const isSideHandle = directions.indexOf(coordinate) > -1;\n handle.style.display = isSideHandle && isSmall ? 'none' : '';\n });\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ImageHtmlOptions } from '../types/ImageHtmlOptions';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
* Get HTML for rotate elements, including the rotate handle with icon, and a line between the handle and the image
|
|
5
|
+
*/
|
|
6
|
+
export declare function createImageRotator(doc: Document, htmlOptions: ImageHtmlOptions): HTMLDivElement[];
|