@bigbluebutton/tldraw 2.0.0-alpha.33 → 2.0.0-alpha.35
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/dist-cjs/index.js +4 -4
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/lib/Tldraw.js +1 -2
- package/dist-cjs/lib/Tldraw.js.map +1 -1
- package/dist-cjs/lib/canvas/TldrawHandles.js +1 -2
- package/dist-cjs/lib/canvas/TldrawHandles.js.map +1 -1
- package/dist-cjs/lib/canvas/TldrawHoveredShapeIndicator.js +1 -2
- package/dist-cjs/lib/canvas/TldrawHoveredShapeIndicator.js.map +1 -1
- package/dist-cjs/lib/canvas/TldrawScribble.js +1 -2
- package/dist-cjs/lib/canvas/TldrawScribble.js.map +1 -1
- package/dist-cjs/lib/canvas/TldrawSelectionBackground.js +1 -2
- package/dist-cjs/lib/canvas/TldrawSelectionBackground.js.map +1 -1
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js +1 -2
- package/dist-cjs/lib/canvas/TldrawSelectionForeground.js.map +1 -1
- package/dist-cjs/lib/defaultExternalContentHandlers.js +3 -6
- package/dist-cjs/lib/defaultExternalContentHandlers.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +7 -14
- package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js +1 -2
- package/dist-cjs/lib/shapes/arrow/toolStates/Idle.js.map +1 -1
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js +6 -12
- package/dist-cjs/lib/shapes/arrow/toolStates/Pointing.js.map +1 -1
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js +12 -24
- package/dist-cjs/lib/shapes/draw/toolStates/Drawing.js.map +1 -1
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -2
- package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeTool.js +4 -8
- package/dist-cjs/lib/shapes/frame/FrameShapeTool.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +3 -6
- package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -2
- package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +1 -1
- package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +4 -8
- package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +1 -1
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js +1 -2
- package/dist-cjs/lib/shapes/geo/toolStates/Idle.js.map +1 -1
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js +2 -4
- package/dist-cjs/lib/shapes/geo/toolStates/Pointing.js.map +1 -1
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +5 -10
- package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +1 -1
- package/dist-cjs/lib/shapes/line/components/svg.js +1 -2
- package/dist-cjs/lib/shapes/line/components/svg.js.map +1 -1
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js +5 -10
- package/dist-cjs/lib/shapes/line/toolStates/Pointing.js.map +1 -1
- package/dist-cjs/lib/shapes/poll/components/CustomizedAxisTick.js +1 -2
- package/dist-cjs/lib/shapes/poll/components/CustomizedAxisTick.js.map +1 -1
- package/dist-cjs/lib/shapes/poll/components/poll-content.js +1 -2
- package/dist-cjs/lib/shapes/poll/components/poll-content.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/TextHelpers.js +2 -4
- package/dist-cjs/lib/shapes/shared/TextHelpers.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/createTextSvgElementFromSpans.js +1 -2
- package/dist-cjs/lib/shapes/shared/createTextSvgElementFromSpans.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js +8 -16
- package/dist-cjs/lib/shapes/shared/defaultStyleDefs.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js +6 -12
- package/dist-cjs/lib/shapes/shared/freehand/getStrokePoints.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js +1 -2
- package/dist-cjs/lib/shapes/shared/freehand/setStrokePointRadii.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/freehand/svgInk.js +2 -4
- package/dist-cjs/lib/shapes/shared/freehand/svgInk.js.map +1 -1
- package/dist-cjs/lib/shapes/shared/useEditableText.js +5 -10
- package/dist-cjs/lib/shapes/shared/useEditableText.js.map +1 -1
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js +6 -12
- package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +1 -1
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js +1 -2
- package/dist-cjs/lib/shapes/text/toolStates/Idle.js.map +1 -1
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js +1 -2
- package/dist-cjs/lib/shapes/text/toolStates/Pointing.js.map +1 -1
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +2 -4
- package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +2 -4
- package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js +1 -2
- package/dist-cjs/lib/tools/SelectTool/DragAndDropManager.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js +25 -30
- package/dist-cjs/lib/tools/SelectTool/childStates/Brushing.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js +12 -24
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/Idle.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js +1 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Cropping.js +8 -16
- package/dist-cjs/lib/tools/SelectTool/childStates/Cropping.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js +3 -6
- package/dist-cjs/lib/tools/SelectTool/childStates/DraggingHandle.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js +2 -4
- package/dist-cjs/lib/tools/SelectTool/childStates/EditingShape.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js +21 -42
- package/dist-cjs/lib/tools/SelectTool/childStates/Idle.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCropHandle.js +1 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingCropHandle.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js +1 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingSelection.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js +1 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/PointingShape.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js +5 -10
- package/dist-cjs/lib/tools/SelectTool/childStates/Resizing.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js +2 -4
- package/dist-cjs/lib/tools/SelectTool/childStates/Rotating.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js +1 -2
- package/dist-cjs/lib/tools/SelectTool/childStates/ScribbleBrushing.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js +4 -8
- package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +1 -1
- package/dist-cjs/lib/tools/SelectTool/children/DraggingHandle.js +3 -6
- package/dist-cjs/lib/tools/SelectTool/children/DraggingHandle.js.map +1 -1
- package/dist-cjs/lib/tools/selection-logic/updateHoveredId.js +1 -2
- package/dist-cjs/lib/tools/selection-logic/updateHoveredId.js.map +1 -1
- package/dist-cjs/lib/ui/assetUrls.js +1 -2
- package/dist-cjs/lib/ui/assetUrls.js.map +1 -1
- package/dist-cjs/lib/ui/components/ActionsMenu.js +2 -4
- package/dist-cjs/lib/ui/components/ActionsMenu.js.map +1 -1
- package/dist-cjs/lib/ui/components/BackToContent.js +1 -2
- package/dist-cjs/lib/ui/components/BackToContent.js.map +1 -1
- package/dist-cjs/lib/ui/components/ContextMenu.js +3 -6
- package/dist-cjs/lib/ui/components/ContextMenu.js.map +1 -1
- package/dist-cjs/lib/ui/components/DebugPanel.js +2 -4
- package/dist-cjs/lib/ui/components/DebugPanel.js.map +1 -1
- package/dist-cjs/lib/ui/components/EditLinkDialog.js +2 -4
- package/dist-cjs/lib/ui/components/EditLinkDialog.js.map +1 -1
- package/dist-cjs/lib/ui/components/EmbedDialog.js +1 -2
- package/dist-cjs/lib/ui/components/EmbedDialog.js.map +1 -1
- package/dist-cjs/lib/ui/components/FollowingIndicator.js +2 -4
- package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +1 -1
- package/dist-cjs/lib/ui/components/HelpMenu.js +2 -4
- package/dist-cjs/lib/ui/components/HelpMenu.js.map +1 -1
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog.js +2 -4
- package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog.js.map +1 -1
- package/dist-cjs/lib/ui/components/Menu.js +5 -10
- package/dist-cjs/lib/ui/components/Menu.js.map +1 -1
- package/dist-cjs/lib/ui/components/NavigationZone/Minimap.js +3 -6
- package/dist-cjs/lib/ui/components/NavigationZone/Minimap.js.map +1 -1
- package/dist-cjs/lib/ui/components/PageMenu/PageMenu.js +5 -10
- package/dist-cjs/lib/ui/components/PageMenu/PageMenu.js.map +1 -1
- package/dist-cjs/lib/ui/components/PenModeToggle.js +1 -2
- package/dist-cjs/lib/ui/components/PenModeToggle.js.map +1 -1
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +1 -2
- package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +1 -1
- package/dist-cjs/lib/ui/components/StylePanel/StylePanel.js +1 -2
- package/dist-cjs/lib/ui/components/StylePanel/StylePanel.js.map +1 -1
- package/dist-cjs/lib/ui/components/Toasts.js +1 -2
- package/dist-cjs/lib/ui/components/Toasts.js.map +1 -1
- package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +1 -2
- package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +1 -1
- package/dist-cjs/lib/ui/components/TrashButton.js +1 -2
- package/dist-cjs/lib/ui/components/TrashButton.js.map +1 -1
- package/dist-cjs/lib/ui/components/primitives/ButtonPicker.js +2 -4
- package/dist-cjs/lib/ui/components/primitives/ButtonPicker.js.map +1 -1
- package/dist-cjs/lib/ui/components/primitives/Input.js +1 -2
- package/dist-cjs/lib/ui/components/primitives/Input.js.map +1 -1
- package/dist-cjs/lib/ui/components/primitives/Slider.js +1 -2
- package/dist-cjs/lib/ui/components/primitives/Slider.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/clipboard/pasteExcalidrawContent.js +2 -4
- package/dist-cjs/lib/ui/hooks/clipboard/pasteExcalidrawContent.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/menuHelpers.js +5 -10
- package/dist-cjs/lib/ui/hooks/menuHelpers.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useActions.js +73 -146
- package/dist-cjs/lib/ui/hooks/useActions.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +6 -12
- package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useHighDpiCanvas.js +1 -2
- package/dist-cjs/lib/ui/hooks/useHighDpiCanvas.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useInsertMedia.js +1 -2
- package/dist-cjs/lib/ui/hooks/useInsertMedia.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js +8 -16
- package/dist-cjs/lib/ui/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useMenuIsOpen.js +1 -2
- package/dist-cjs/lib/ui/hooks/useMenuIsOpen.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useMenuSchema.js +2 -4
- package/dist-cjs/lib/ui/hooks/useMenuSchema.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/usePreloadAssets.js +2 -4
- package/dist-cjs/lib/ui/hooks/usePreloadAssets.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/usePreloadIcons.js +1 -2
- package/dist-cjs/lib/ui/hooks/usePreloadIcons.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/usePrint.js +2 -4
- package/dist-cjs/lib/ui/hooks/usePrint.js.map +1 -1
- package/dist-cjs/lib/ui/hooks/useRevelantStyles.js +1 -2
- package/dist-cjs/lib/ui/hooks/useRevelantStyles.js.map +1 -1
- package/dist-cjs/lib/utils/assets/is-gif-animated.js +9 -0
- package/dist-cjs/lib/utils/assets/is-gif-animated.js.map +1 -1
- package/dist-cjs/lib/utils/export/export.js +2 -4
- package/dist-cjs/lib/utils/export/export.js.map +1 -1
- package/dist-cjs/lib/utils/export/exportAs.js +1 -2
- package/dist-cjs/lib/utils/export/exportAs.js.map +1 -1
- package/dist-cjs/lib/utils/frames/frames.js +4 -8
- package/dist-cjs/lib/utils/frames/frames.js.map +1 -1
- package/dist-cjs/lib/utils/static-assets/assetUrls.js +1 -2
- package/dist-cjs/lib/utils/static-assets/assetUrls.js.map +1 -1
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js +10 -20
- package/dist-cjs/lib/utils/tldr/buildFromV1Document.js.map +1 -1
- package/dist-cjs/lib/utils/tldr/file.js +1 -2
- package/dist-cjs/lib/utils/tldr/file.js.map +1 -1
- package/dist-esm/lib/Tldraw.mjs +1 -2
- package/dist-esm/lib/Tldraw.mjs.map +1 -1
- package/dist-esm/lib/canvas/TldrawHandles.mjs +1 -2
- package/dist-esm/lib/canvas/TldrawHandles.mjs.map +1 -1
- package/dist-esm/lib/canvas/TldrawHoveredShapeIndicator.mjs +1 -2
- package/dist-esm/lib/canvas/TldrawHoveredShapeIndicator.mjs.map +1 -1
- package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -2
- package/dist-esm/lib/canvas/TldrawScribble.mjs.map +1 -1
- package/dist-esm/lib/canvas/TldrawSelectionBackground.mjs +1 -2
- package/dist-esm/lib/canvas/TldrawSelectionBackground.mjs.map +1 -1
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs +1 -2
- package/dist-esm/lib/canvas/TldrawSelectionForeground.mjs.map +1 -1
- package/dist-esm/lib/defaultExternalContentHandlers.mjs +3 -6
- package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +1 -1
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +7 -14
- package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs +1 -2
- package/dist-esm/lib/shapes/arrow/toolStates/Idle.mjs.map +1 -1
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs +6 -12
- package/dist-esm/lib/shapes/arrow/toolStates/Pointing.mjs.map +1 -1
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs +12 -24
- package/dist-esm/lib/shapes/draw/toolStates/Drawing.mjs.map +1 -1
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -2
- package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs +4 -8
- package/dist-esm/lib/shapes/frame/FrameShapeTool.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +3 -6
- package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -2
- package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +1 -1
- package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +4 -8
- package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +1 -1
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs +1 -2
- package/dist-esm/lib/shapes/geo/toolStates/Idle.mjs.map +1 -1
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs +2 -4
- package/dist-esm/lib/shapes/geo/toolStates/Pointing.mjs.map +1 -1
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +5 -10
- package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/shapes/line/components/svg.mjs +1 -2
- package/dist-esm/lib/shapes/line/components/svg.mjs.map +1 -1
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs +5 -10
- package/dist-esm/lib/shapes/line/toolStates/Pointing.mjs.map +1 -1
- package/dist-esm/lib/shapes/poll/components/CustomizedAxisTick.mjs +1 -2
- package/dist-esm/lib/shapes/poll/components/CustomizedAxisTick.mjs.map +1 -1
- package/dist-esm/lib/shapes/poll/components/poll-content.mjs +1 -2
- package/dist-esm/lib/shapes/poll/components/poll-content.mjs.map +1 -1
- package/dist-esm/lib/shapes/shared/TextHelpers.mjs +2 -4
- package/dist-esm/lib/shapes/shared/TextHelpers.mjs.map +1 -1
- package/dist-esm/lib/shapes/shared/createTextSvgElementFromSpans.mjs +1 -2
- package/dist-esm/lib/shapes/shared/createTextSvgElementFromSpans.mjs.map +1 -1
- package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs +8 -16
- package/dist-esm/lib/shapes/shared/defaultStyleDefs.mjs.map +1 -1
- package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs +6 -12
- package/dist-esm/lib/shapes/shared/freehand/getStrokePoints.mjs.map +1 -1
- package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs +1 -2
- package/dist-esm/lib/shapes/shared/freehand/setStrokePointRadii.mjs.map +1 -1
- package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs +2 -4
- package/dist-esm/lib/shapes/shared/freehand/svgInk.mjs.map +1 -1
- package/dist-esm/lib/shapes/shared/useEditableText.mjs +5 -10
- package/dist-esm/lib/shapes/shared/useEditableText.mjs.map +1 -1
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +6 -12
- package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs +1 -2
- package/dist-esm/lib/shapes/text/toolStates/Idle.mjs.map +1 -1
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs +1 -2
- package/dist-esm/lib/shapes/text/toolStates/Pointing.mjs.map +1 -1
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +2 -4
- package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +2 -4
- package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs +1 -2
- package/dist-esm/lib/tools/SelectTool/DragAndDropManager.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs +25 -30
- package/dist-esm/lib/tools/SelectTool/childStates/Brushing.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs +12 -24
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/Idle.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs +1 -2
- package/dist-esm/lib/tools/SelectTool/childStates/Crop/children/TranslatingCrop.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Cropping.mjs +8 -16
- package/dist-esm/lib/tools/SelectTool/childStates/Cropping.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs +3 -6
- package/dist-esm/lib/tools/SelectTool/childStates/DraggingHandle.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs +2 -4
- package/dist-esm/lib/tools/SelectTool/childStates/EditingShape.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs +21 -42
- package/dist-esm/lib/tools/SelectTool/childStates/Idle.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCropHandle.mjs +1 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingCropHandle.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs +1 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingSelection.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs +1 -2
- package/dist-esm/lib/tools/SelectTool/childStates/PointingShape.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs +5 -10
- package/dist-esm/lib/tools/SelectTool/childStates/Resizing.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs +2 -4
- package/dist-esm/lib/tools/SelectTool/childStates/Rotating.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs +1 -2
- package/dist-esm/lib/tools/SelectTool/childStates/ScribbleBrushing.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs +4 -8
- package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +1 -1
- package/dist-esm/lib/tools/SelectTool/children/DraggingHandle.mjs +3 -6
- package/dist-esm/lib/tools/SelectTool/children/DraggingHandle.mjs.map +1 -1
- package/dist-esm/lib/tools/selection-logic/updateHoveredId.mjs +1 -2
- package/dist-esm/lib/tools/selection-logic/updateHoveredId.mjs.map +1 -1
- package/dist-esm/lib/ui/assetUrls.mjs +1 -2
- package/dist-esm/lib/ui/assetUrls.mjs.map +1 -1
- package/dist-esm/lib/ui/components/ActionsMenu.mjs +2 -4
- package/dist-esm/lib/ui/components/ActionsMenu.mjs.map +1 -1
- package/dist-esm/lib/ui/components/BackToContent.mjs +1 -2
- package/dist-esm/lib/ui/components/BackToContent.mjs.map +1 -1
- package/dist-esm/lib/ui/components/ContextMenu.mjs +3 -6
- package/dist-esm/lib/ui/components/ContextMenu.mjs.map +1 -1
- package/dist-esm/lib/ui/components/DebugPanel.mjs +2 -4
- package/dist-esm/lib/ui/components/DebugPanel.mjs.map +1 -1
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs +2 -4
- package/dist-esm/lib/ui/components/EditLinkDialog.mjs.map +1 -1
- package/dist-esm/lib/ui/components/EmbedDialog.mjs +1 -2
- package/dist-esm/lib/ui/components/EmbedDialog.mjs.map +1 -1
- package/dist-esm/lib/ui/components/FollowingIndicator.mjs +2 -4
- package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +1 -1
- package/dist-esm/lib/ui/components/HelpMenu.mjs +2 -4
- package/dist-esm/lib/ui/components/HelpMenu.mjs.map +1 -1
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog.mjs +2 -4
- package/dist-esm/lib/ui/components/KeyboardShortcutsDialog.mjs.map +1 -1
- package/dist-esm/lib/ui/components/Menu.mjs +5 -10
- package/dist-esm/lib/ui/components/Menu.mjs.map +1 -1
- package/dist-esm/lib/ui/components/NavigationZone/Minimap.mjs +3 -6
- package/dist-esm/lib/ui/components/NavigationZone/Minimap.mjs.map +1 -1
- package/dist-esm/lib/ui/components/PageMenu/PageMenu.mjs +5 -10
- package/dist-esm/lib/ui/components/PageMenu/PageMenu.mjs.map +1 -1
- package/dist-esm/lib/ui/components/PenModeToggle.mjs +1 -2
- package/dist-esm/lib/ui/components/PenModeToggle.mjs.map +1 -1
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +1 -2
- package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +1 -1
- package/dist-esm/lib/ui/components/StylePanel/StylePanel.mjs +1 -2
- package/dist-esm/lib/ui/components/StylePanel/StylePanel.mjs.map +1 -1
- package/dist-esm/lib/ui/components/Toasts.mjs +1 -2
- package/dist-esm/lib/ui/components/Toasts.mjs.map +1 -1
- package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +1 -2
- package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +1 -1
- package/dist-esm/lib/ui/components/TrashButton.mjs +1 -2
- package/dist-esm/lib/ui/components/TrashButton.mjs.map +1 -1
- package/dist-esm/lib/ui/components/primitives/ButtonPicker.mjs +2 -4
- package/dist-esm/lib/ui/components/primitives/ButtonPicker.mjs.map +1 -1
- package/dist-esm/lib/ui/components/primitives/Input.mjs +1 -2
- package/dist-esm/lib/ui/components/primitives/Input.mjs.map +1 -1
- package/dist-esm/lib/ui/components/primitives/Slider.mjs +1 -2
- package/dist-esm/lib/ui/components/primitives/Slider.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/clipboard/pasteExcalidrawContent.mjs +2 -4
- package/dist-esm/lib/ui/hooks/clipboard/pasteExcalidrawContent.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/menuHelpers.mjs +5 -10
- package/dist-esm/lib/ui/hooks/menuHelpers.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useActions.mjs +73 -146
- package/dist-esm/lib/ui/hooks/useActions.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +6 -12
- package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useHighDpiCanvas.mjs +1 -2
- package/dist-esm/lib/ui/hooks/useHighDpiCanvas.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useInsertMedia.mjs +1 -2
- package/dist-esm/lib/ui/hooks/useInsertMedia.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs +8 -16
- package/dist-esm/lib/ui/hooks/useKeyboardShortcuts.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useMenuIsOpen.mjs +1 -2
- package/dist-esm/lib/ui/hooks/useMenuIsOpen.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useMenuSchema.mjs +2 -4
- package/dist-esm/lib/ui/hooks/useMenuSchema.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/usePreloadAssets.mjs +2 -4
- package/dist-esm/lib/ui/hooks/usePreloadAssets.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/usePreloadIcons.mjs +1 -2
- package/dist-esm/lib/ui/hooks/usePreloadIcons.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/usePrint.mjs +2 -4
- package/dist-esm/lib/ui/hooks/usePrint.mjs.map +1 -1
- package/dist-esm/lib/ui/hooks/useRevelantStyles.mjs +1 -2
- package/dist-esm/lib/ui/hooks/useRevelantStyles.mjs.map +1 -1
- package/dist-esm/lib/utils/assets/is-gif-animated.mjs +9 -0
- package/dist-esm/lib/utils/assets/is-gif-animated.mjs.map +1 -1
- package/dist-esm/lib/utils/export/export.mjs +2 -4
- package/dist-esm/lib/utils/export/export.mjs.map +1 -1
- package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
- package/dist-esm/lib/utils/export/exportAs.mjs.map +1 -1
- package/dist-esm/lib/utils/frames/frames.mjs +4 -8
- package/dist-esm/lib/utils/frames/frames.mjs.map +1 -1
- package/dist-esm/lib/utils/static-assets/assetUrls.mjs +1 -2
- package/dist-esm/lib/utils/static-assets/assetUrls.mjs.map +1 -1
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs +10 -20
- package/dist-esm/lib/utils/tldr/buildFromV1Document.mjs.map +1 -1
- package/dist-esm/lib/utils/tldr/file.mjs +1 -2
- package/dist-esm/lib/utils/tldr/file.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -14,12 +14,10 @@ function getFontDefForExport(fontStyle) {
|
|
|
14
14
|
key: `${DefaultFontStyle.id}:${fontStyle}`,
|
|
15
15
|
getElement: async () => {
|
|
16
16
|
const font = findFont(fontStyle);
|
|
17
|
-
if (!font)
|
|
18
|
-
return null;
|
|
17
|
+
if (!font) return null;
|
|
19
18
|
const url = font.$$_url;
|
|
20
19
|
const fontFaceRule = font.$$_fontface;
|
|
21
|
-
if (!url || !fontFaceRule)
|
|
22
|
-
return null;
|
|
20
|
+
if (!url || !fontFaceRule) return null;
|
|
23
21
|
const fontFile = await (await fetch(url)).blob();
|
|
24
22
|
const base64FontFile = await new Promise((resolve, reject) => {
|
|
25
23
|
const reader = new FileReader();
|
|
@@ -47,8 +45,7 @@ function getFillDefForExport(fill, theme) {
|
|
|
47
45
|
return {
|
|
48
46
|
key: `${DefaultFontStyle.id}:${fill}`,
|
|
49
47
|
getElement: async () => {
|
|
50
|
-
if (fill !== "pattern")
|
|
51
|
-
return null;
|
|
48
|
+
if (fill !== "pattern") return null;
|
|
52
49
|
const t = 8 / 12;
|
|
53
50
|
const divEl = document.createElement("div");
|
|
54
51
|
divEl.innerHTML = `
|
|
@@ -94,8 +91,7 @@ const generateImage = (dpr, currentZoom, darkMode) => {
|
|
|
94
91
|
canvasEl.width = size;
|
|
95
92
|
canvasEl.height = size;
|
|
96
93
|
const ctx = canvasEl.getContext("2d");
|
|
97
|
-
if (!ctx)
|
|
98
|
-
return;
|
|
94
|
+
if (!ctx) return;
|
|
99
95
|
ctx.fillStyle = darkMode ? "#212529" : "#f8f9fa";
|
|
100
96
|
ctx.fillRect(0, 0, size, size);
|
|
101
97
|
ctx.globalCompositeOperation = "destination-out";
|
|
@@ -125,8 +121,7 @@ const canvasBlob = (size, fn) => {
|
|
|
125
121
|
canvas.width = size[0];
|
|
126
122
|
canvas.height = size[1];
|
|
127
123
|
const ctx = canvas.getContext("2d");
|
|
128
|
-
if (!ctx)
|
|
129
|
-
return "";
|
|
124
|
+
if (!ctx) return "";
|
|
130
125
|
fn(ctx);
|
|
131
126
|
return canvas.toDataURL();
|
|
132
127
|
};
|
|
@@ -180,8 +175,7 @@ function usePattern() {
|
|
|
180
175
|
}
|
|
181
176
|
let isCancelled = false;
|
|
182
177
|
Promise.all(promises).then((urls) => {
|
|
183
|
-
if (isCancelled)
|
|
184
|
-
return;
|
|
178
|
+
if (isCancelled) return;
|
|
185
179
|
setBackgroundUrls(urls);
|
|
186
180
|
setIsReady(true);
|
|
187
181
|
});
|
|
@@ -226,10 +220,8 @@ function PatternFillDefForCanvas() {
|
|
|
226
220
|
return /* @__PURE__ */ jsx("g", { ref: containerRef, children: defs });
|
|
227
221
|
}
|
|
228
222
|
function findHtmlLayerParent(element) {
|
|
229
|
-
if (element.classList.contains("tl-html-layer"))
|
|
230
|
-
|
|
231
|
-
if (element.parentElement)
|
|
232
|
-
return findHtmlLayerParent(element.parentElement);
|
|
223
|
+
if (element.classList.contains("tl-html-layer")) return element;
|
|
224
|
+
if (element.parentElement) return findHtmlLayerParent(element.parentElement);
|
|
233
225
|
return null;
|
|
234
226
|
}
|
|
235
227
|
export {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/shapes/shared/defaultStyleDefs.tsx"],
|
|
4
4
|
"sourcesContent": ["import {\n\tDefaultColorThemePalette,\n\tDefaultFontFamilies,\n\tDefaultFontStyle,\n\tHASH_PATTERN_ZOOM_NAMES,\n\tMAX_ZOOM,\n\tSvgExportDef,\n\tTLDefaultColorTheme,\n\tTLDefaultFillStyle,\n\tTLDefaultFontStyle,\n\tTLShapeUtilCanvasSvgDef,\n\tdebugFlags,\n\tuseEditor,\n} from '@bigbluebutton/editor'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\n/** @public */\nexport function getFontDefForExport(fontStyle: TLDefaultFontStyle): SvgExportDef {\n\treturn {\n\t\tkey: `${DefaultFontStyle.id}:${fontStyle}`,\n\t\tgetElement: async () => {\n\t\t\tconst font = findFont(fontStyle)\n\t\t\tif (!font) return null\n\n\t\t\tconst url = (font as any).$$_url\n\t\t\tconst fontFaceRule = (font as any).$$_fontface\n\t\t\tif (!url || !fontFaceRule) return null\n\n\t\t\tconst fontFile = await (await fetch(url)).blob()\n\t\t\tconst base64FontFile = await new Promise<string>((resolve, reject) => {\n\t\t\t\tconst reader = new FileReader()\n\t\t\t\treader.onload = () => resolve(reader.result as string)\n\t\t\t\treader.onerror = reject\n\t\t\t\treader.readAsDataURL(fontFile)\n\t\t\t})\n\n\t\t\tconst newFontFaceRule = fontFaceRule.replace(url, base64FontFile)\n\t\t\tconst style = document.createElementNS('http://www.w3.org/2000/svg', 'style')\n\t\t\tstyle.textContent = newFontFaceRule\n\t\t\treturn style\n\t\t},\n\t}\n}\n\nfunction findFont(name: TLDefaultFontStyle): FontFace | null {\n\tconst fontFamily = DefaultFontFamilies[name]\n\tfor (const font of document.fonts) {\n\t\tif (fontFamily.includes(font.family)) {\n\t\t\treturn font\n\t\t}\n\t}\n\treturn null\n}\n\n/** @public */\nexport function getFillDefForExport(\n\tfill: TLDefaultFillStyle,\n\ttheme: TLDefaultColorTheme\n): SvgExportDef {\n\treturn {\n\t\tkey: `${DefaultFontStyle.id}:${fill}`,\n\t\tgetElement: async () => {\n\t\t\tif (fill !== 'pattern') return null\n\n\t\t\tconst t = 8 / 12\n\t\t\tconst divEl = document.createElement('div')\n\t\t\tdivEl.innerHTML = `\n\t\t\t\t<svg>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<mask id=\"hash_pattern_mask\">\n\t\t\t\t\t\t\t<rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" fill=\"white\" />\n\t\t\t\t\t\t\t<g\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstroke=\"black\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<line x1=\"${t * 1}\" y1=\"${t * 3}\" x2=\"${t * 3}\" y2=\"${t * 1}\" />\n\t\t\t\t\t\t\t\t<line x1=\"${t * 5}\" y1=\"${t * 7}\" x2=\"${t * 7}\" y2=\"${t * 5}\" />\n\t\t\t\t\t\t\t\t<line x1=\"${t * 9}\" y1=\"${t * 11}\" x2=\"${t * 11}\" y2=\"${t * 9}\" />\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</mask>\n\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\tid=\"hash_pattern\"\n\t\t\t\t\t\t\twidth=\"8\"\n\t\t\t\t\t\t\theight=\"8\"\n\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<rect x=\"0\" y=\"0\" width=\"8\" height=\"8\" fill=\"${theme.solid}\" mask=\"url(#hash_pattern_mask)\" />\n\t\t\t\t\t\t</pattern>\n\t\t\t\t\t</defs>\n\t\t\t\t</svg>\n\t\t\t`\n\t\t\treturn Array.from(divEl.querySelectorAll('defs > *'))\n\t\t},\n\t}\n}\n\nexport function getFillDefForCanvas(): TLShapeUtilCanvasSvgDef {\n\treturn {\n\t\tkey: `${DefaultFontStyle.id}:pattern`,\n\t\tcomponent: PatternFillDefForCanvas,\n\t}\n}\nconst TILE_PATTERN_SIZE = 8\n\nconst generateImage = (dpr: number, currentZoom: number, darkMode: boolean) => {\n\treturn new Promise<Blob>((resolve, reject) => {\n\t\tconst size = TILE_PATTERN_SIZE * currentZoom * dpr\n\n\t\tconst canvasEl = document.createElement('canvas')\n\t\tcanvasEl.width = size\n\t\tcanvasEl.height = size\n\n\t\tconst ctx = canvasEl.getContext('2d')\n\t\tif (!ctx) return\n\n\t\tctx.fillStyle = darkMode ? '#212529' : '#f8f9fa'\n\t\tctx.fillRect(0, 0, size, size)\n\n\t\t// This essentially generates an inverse of the pattern we're drawing.\n\t\tctx.globalCompositeOperation = 'destination-out'\n\n\t\tctx.lineCap = 'round'\n\t\tctx.lineWidth = 1.25 * currentZoom * dpr\n\n\t\tconst t = 8 / 12\n\t\tconst s = (v: number) => v * currentZoom * dpr\n\n\t\tctx.beginPath()\n\t\tctx.moveTo(s(t * 1), s(t * 3))\n\t\tctx.lineTo(s(t * 3), s(t * 1))\n\n\t\tctx.moveTo(s(t * 5), s(t * 7))\n\t\tctx.lineTo(s(t * 7), s(t * 5))\n\n\t\tctx.moveTo(s(t * 9), s(t * 11))\n\t\tctx.lineTo(s(t * 11), s(t * 9))\n\t\tctx.stroke()\n\n\t\tcanvasEl.toBlob((blob) => {\n\t\t\tif (!blob || debugFlags.throwToBlob.get()) {\n\t\t\t\treject()\n\t\t\t} else {\n\t\t\t\tresolve(blob)\n\t\t\t}\n\t\t})\n\t})\n}\n\nconst canvasBlob = (size: [number, number], fn: (ctx: CanvasRenderingContext2D) => void) => {\n\tconst canvas = document.createElement('canvas')\n\tcanvas.width = size[0]\n\tcanvas.height = size[1]\n\tconst ctx = canvas.getContext('2d')\n\tif (!ctx) return ''\n\tfn(ctx)\n\treturn canvas.toDataURL()\n}\ntype PatternDef = { zoom: number; url: string; darkMode: boolean }\n\nconst getDefaultPatterns = () => {\n\tconst defaultPatterns: PatternDef[] = []\n\tfor (let i = 1; i <= Math.ceil(MAX_ZOOM); i++) {\n\t\tconst whitePixelBlob = canvasBlob([1, 1], (ctx) => {\n\t\t\tctx.fillStyle = DefaultColorThemePalette.lightMode.black.semi\n\t\t\tctx.fillRect(0, 0, 1, 1)\n\t\t})\n\t\tconst blackPixelBlob = canvasBlob([1, 1], (ctx) => {\n\t\t\tctx.fillStyle = DefaultColorThemePalette.darkMode.black.semi\n\t\t\tctx.fillRect(0, 0, 1, 1)\n\t\t})\n\t\tdefaultPatterns.push({\n\t\t\tzoom: i,\n\t\t\turl: whitePixelBlob,\n\t\t\tdarkMode: false,\n\t\t})\n\t\tdefaultPatterns.push({\n\t\t\tzoom: i,\n\t\t\turl: blackPixelBlob,\n\t\t\tdarkMode: true,\n\t\t})\n\t}\n\treturn defaultPatterns\n}\n\nfunction usePattern() {\n\tconst editor = useEditor()\n\tconst dpr = editor.getInstanceState().devicePixelRatio\n\tconst [isReady, setIsReady] = useState(false)\n\tconst defaultPatterns = useMemo(() => getDefaultPatterns(), [])\n\tconst [backgroundUrls, setBackgroundUrls] = useState<PatternDef[]>(defaultPatterns)\n\n\tuseEffect(() => {\n\t\tconst promises: Promise<{ zoom: number; url: string; darkMode: boolean }>[] = []\n\n\t\tfor (let i = 1; i <= Math.ceil(MAX_ZOOM); i++) {\n\t\t\tpromises.push(\n\t\t\t\tgenerateImage(dpr, i, false).then((blob) => ({\n\t\t\t\t\tzoom: i,\n\t\t\t\t\turl: URL.createObjectURL(blob),\n\t\t\t\t\tdarkMode: false,\n\t\t\t\t}))\n\t\t\t)\n\t\t\tpromises.push(\n\t\t\t\tgenerateImage(dpr, i, true).then((blob) => ({\n\t\t\t\t\tzoom: i,\n\t\t\t\t\turl: URL.createObjectURL(blob),\n\t\t\t\t\tdarkMode: true,\n\t\t\t\t}))\n\t\t\t)\n\t\t}\n\n\t\tlet isCancelled = false\n\t\tPromise.all(promises).then((urls) => {\n\t\t\tif (isCancelled) return\n\t\t\tsetBackgroundUrls(urls)\n\t\t\tsetIsReady(true)\n\t\t})\n\n\t\treturn () => {\n\t\t\tisCancelled = true\n\t\t\tsetIsReady(false)\n\t\t}\n\t}, [dpr])\n\n\tconst defs = (\n\t\t<>\n\t\t\t{backgroundUrls.map((item) => {\n\t\t\t\tconst key = item.zoom + (item.darkMode ? '_dark' : '_light')\n\t\t\t\treturn (\n\t\t\t\t\t<pattern\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\tid={HASH_PATTERN_ZOOM_NAMES[key]}\n\t\t\t\t\t\twidth={TILE_PATTERN_SIZE}\n\t\t\t\t\t\theight={TILE_PATTERN_SIZE}\n\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<image href={item.url} width={TILE_PATTERN_SIZE} height={TILE_PATTERN_SIZE} />\n\t\t\t\t\t</pattern>\n\t\t\t\t)\n\t\t\t})}\n\t\t</>\n\t)\n\n\treturn { defs, isReady }\n}\n\nfunction PatternFillDefForCanvas() {\n\tconst editor = useEditor()\n\tconst containerRef = useRef<SVGGElement>(null)\n\tconst { defs, isReady } = usePattern()\n\n\tuseEffect(() => {\n\t\tif (isReady && editor.environment.isSafari) {\n\t\t\tconst htmlLayer = findHtmlLayerParent(containerRef.current!)\n\t\t\tif (htmlLayer) {\n\t\t\t\t// Wait for `patternContext` to be picked up\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\thtmlLayer.style.display = 'none'\n\n\t\t\t\t\t// Wait for 'display = \"none\"' to take effect\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\thtmlLayer.style.display = ''\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}, [editor, isReady])\n\n\treturn <g ref={containerRef}>{defs}</g>\n}\n\nfunction findHtmlLayerParent(element: Element): HTMLElement | null {\n\tif (element.classList.contains('tl-html-layer')) return element as HTMLElement\n\tif (element.parentElement) return findHtmlLayerParent(element.parentElement)\n\treturn null\n}\n"],
|
|
5
|
-
"mappings": "AAiOE,mBAWI,WAXJ;AAjOF;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAMA;AAAA,EACA;AAAA,OACM;AACP,SAAS,WAAW,SAAS,QAAQ,gBAAgB;AAG9C,SAAS,oBAAoB,WAA6C;AAChF,SAAO;AAAA,IACN,KAAK,GAAG,iBAAiB,EAAE,IAAI,SAAS;AAAA,IACxC,YAAY,YAAY;AACvB,YAAM,OAAO,SAAS,SAAS;AAC/B,UAAI,CAAC
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,16 +3,14 @@ const MIN_START_PRESSURE = 0.025;
|
|
|
3
3
|
const MIN_END_PRESSURE = 0.01;
|
|
4
4
|
function getStrokePoints(rawInputPoints, options = {}) {
|
|
5
5
|
const { streamline = 0.5, size = 16, simulatePressure = false } = options;
|
|
6
|
-
if (rawInputPoints.length === 0)
|
|
7
|
-
return [];
|
|
6
|
+
if (rawInputPoints.length === 0) return [];
|
|
8
7
|
const t = 0.15 + (1 - streamline) * 0.85;
|
|
9
8
|
let pts = rawInputPoints.map(Vec2d.From);
|
|
10
9
|
let pointsRemovedFromNearEnd = 0;
|
|
11
10
|
if (!simulatePressure) {
|
|
12
11
|
let pt2 = pts[0];
|
|
13
12
|
while (pt2) {
|
|
14
|
-
if (pt2.z >= MIN_START_PRESSURE)
|
|
15
|
-
break;
|
|
13
|
+
if (pt2.z >= MIN_START_PRESSURE) break;
|
|
16
14
|
pts.shift();
|
|
17
15
|
pt2 = pts[0];
|
|
18
16
|
}
|
|
@@ -20,8 +18,7 @@ function getStrokePoints(rawInputPoints, options = {}) {
|
|
|
20
18
|
if (!simulatePressure) {
|
|
21
19
|
let pt2 = pts[pts.length - 1];
|
|
22
20
|
while (pt2) {
|
|
23
|
-
if (pt2.z >= MIN_END_PRESSURE)
|
|
24
|
-
break;
|
|
21
|
+
if (pt2.z >= MIN_END_PRESSURE) break;
|
|
25
22
|
pts.pop();
|
|
26
23
|
pt2 = pts[pts.length - 1];
|
|
27
24
|
}
|
|
@@ -40,8 +37,7 @@ function getStrokePoints(rawInputPoints, options = {}) {
|
|
|
40
37
|
];
|
|
41
38
|
let pt = pts[1];
|
|
42
39
|
while (pt) {
|
|
43
|
-
if (Vec2d.Dist(pt, pts[0]) > size / 3)
|
|
44
|
-
break;
|
|
40
|
+
if (Vec2d.Dist(pt, pts[0]) > size / 3) break;
|
|
45
41
|
pts[0].z = Math.max(pts[0].z, pt.z);
|
|
46
42
|
pts.splice(1, 1);
|
|
47
43
|
pt = pts[1];
|
|
@@ -49,8 +45,7 @@ function getStrokePoints(rawInputPoints, options = {}) {
|
|
|
49
45
|
const last = pts.pop();
|
|
50
46
|
pt = pts[pts.length - 1];
|
|
51
47
|
while (pt) {
|
|
52
|
-
if (Vec2d.Dist(pt, last) > size / 3)
|
|
53
|
-
break;
|
|
48
|
+
if (Vec2d.Dist(pt, last) > size / 3) break;
|
|
54
49
|
pts.pop();
|
|
55
50
|
pt = pts[pts.length - 1];
|
|
56
51
|
pointsRemovedFromNearEnd++;
|
|
@@ -85,8 +80,7 @@ function getStrokePoints(rawInputPoints, options = {}) {
|
|
|
85
80
|
}
|
|
86
81
|
for (let i = 1, n = pts.length; i < n; i++) {
|
|
87
82
|
point = !t || options.last && i === n - 1 ? pts[i].clone() : pts[i].clone().lrp(prev.point, 1 - t);
|
|
88
|
-
if (prev.point.equals(point))
|
|
89
|
-
continue;
|
|
83
|
+
if (prev.point.equals(point)) continue;
|
|
90
84
|
distance = Vec2d.Dist(point, prev.point);
|
|
91
85
|
totalLength += distance;
|
|
92
86
|
if (i < 4 && totalLength < size) {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/shared/freehand/getStrokePoints.ts"],
|
|
4
4
|
"sourcesContent": ["import { Vec2d, VecLike } from '@bigbluebutton/editor'\nimport type { StrokeOptions, StrokePoint } from './types'\n\nconst MIN_START_PRESSURE = 0.025\nconst MIN_END_PRESSURE = 0.01\n\n/**\n * ## getStrokePoints\n *\n * Get an array of points as objects with an adjusted point, pressure, vector, distance, and\n * runningLength.\n *\n * @param points - An array of points (as `[x, y, pressure]` or `{x, y, pressure}`). Pressure is\n * optional in both cases.\n * @param options - An object with options.\n * @public\n */\nexport function getStrokePoints(\n\trawInputPoints: VecLike[],\n\toptions: StrokeOptions = {}\n): StrokePoint[] {\n\tconst { streamline = 0.5, size = 16, simulatePressure = false } = options\n\n\t// If we don't have any points, return an empty array.\n\tif (rawInputPoints.length === 0) return []\n\n\t// Find the interpolation level between points.\n\tconst t = 0.15 + (1 - streamline) * 0.85\n\n\t// Whatever the input is, make sure that the points are in number[][].\n\tlet pts = rawInputPoints.map(Vec2d.From)\n\n\tlet pointsRemovedFromNearEnd = 0\n\n\tif (!simulatePressure) {\n\t\t// Strip low pressure points from the start of the array.\n\t\tlet pt = pts[0]\n\t\twhile (pt) {\n\t\t\tif (pt.z >= MIN_START_PRESSURE) break\n\t\t\tpts.shift()\n\t\t\tpt = pts[0]\n\t\t}\n\t}\n\n\tif (!simulatePressure) {\n\t\t// Strip low pressure points from the end of the array.\n\t\tlet pt = pts[pts.length - 1]\n\t\twhile (pt) {\n\t\t\tif (pt.z >= MIN_END_PRESSURE) break\n\t\t\tpts.pop()\n\t\t\tpt = pts[pts.length - 1]\n\t\t}\n\t}\n\n\tif (pts.length === 0)\n\t\treturn [\n\t\t\t{\n\t\t\t\tpoint: Vec2d.From(rawInputPoints[0]),\n\t\t\t\tinput: Vec2d.From(rawInputPoints[0]),\n\t\t\t\tpressure: simulatePressure ? 0.5 : 0.15,\n\t\t\t\tvector: new Vec2d(1, 1),\n\t\t\t\tdistance: 0,\n\t\t\t\trunningLength: 0,\n\t\t\t\tradius: 1,\n\t\t\t},\n\t\t]\n\n\t// Strip points that are too close to the first point.\n\tlet pt = pts[1]\n\twhile (pt) {\n\t\tif (Vec2d.Dist(pt, pts[0]) > size / 3) break\n\t\tpts[0].z = Math.max(pts[0].z, pt.z) // Use maximum pressure\n\t\tpts.splice(1, 1)\n\t\tpt = pts[1]\n\t}\n\n\t// Strip points that are too close to the last point.\n\tconst last = pts.pop()!\n\tpt = pts[pts.length - 1]\n\twhile (pt) {\n\t\tif (Vec2d.Dist(pt, last) > size / 3) break\n\t\tpts.pop()\n\t\tpt = pts[pts.length - 1]\n\t\tpointsRemovedFromNearEnd++\n\t}\n\tpts.push(last)\n\n\tconst isComplete =\n\t\toptions.last ||\n\t\t!options.simulatePressure ||\n\t\t(pts.length > 1 && Vec2d.Dist(pts[pts.length - 1], pts[pts.length - 2]) < size) ||\n\t\tpointsRemovedFromNearEnd > 0\n\n\t// Add extra points between the two, to help avoid \"dash\" lines\n\t// for strokes with tapered start and ends. Don't mutate the\n\t// input array!\n\tif (pts.length === 2 && options.simulatePressure) {\n\t\tconst last = pts[1]\n\t\tpts = pts.slice(0, -1)\n\t\tfor (let i = 1; i < 5; i++) {\n\t\t\tconst next = Vec2d.Lrp(pts[0], last, i / 4)\n\t\t\tnext.z = ((pts[0].z + (last.z - pts[0].z)) * i) / 4\n\t\t\tpts.push(next)\n\t\t}\n\t}\n\n\t// The strokePoints array will hold the points for the stroke.\n\t// Start it out with the first point, which needs no adjustment.\n\tconst strokePoints: StrokePoint[] = [\n\t\t{\n\t\t\tpoint: pts[0],\n\t\t\tinput: pts[0],\n\t\t\tpressure: simulatePressure ? 0.5 : pts[0].z,\n\t\t\tvector: new Vec2d(1, 1),\n\t\t\tdistance: 0,\n\t\t\trunningLength: 0,\n\t\t\tradius: 1,\n\t\t},\n\t]\n\n\t// We use the totalLength to keep track of the total distance\n\tlet totalLength = 0\n\n\t// We're set this to the latest point, so we can use it to calculate\n\t// the distance and vector of the next point.\n\tlet prev = strokePoints[0]\n\n\t// Iterate through all of the points, creating StrokePoints.\n\tlet point: Vec2d, distance: number\n\n\tif (isComplete && streamline > 0) {\n\t\tpts.push(pts[pts.length - 1].clone())\n\t}\n\n\tfor (let i = 1, n = pts.length; i < n; i++) {\n\t\tpoint =\n\t\t\t!t || (options.last && i === n - 1) ? pts[i].clone() : pts[i].clone().lrp(prev.point, 1 - t)\n\n\t\t// If the new point is the same as the previous point, skip ahead.\n\t\tif (prev.point.equals(point)) continue\n\n\t\t// How far is the new point from the previous point?\n\t\tdistance = Vec2d.Dist(point, prev.point)\n\n\t\t// Add this distance to the total \"running length\" of the line.\n\t\ttotalLength += distance\n\n\t\t// At the start of the line, we wait until the new point is a\n\t\t// certain distance away from the original point, to avoid noise\n\n\t\tif (i < 4 && totalLength < size) {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Create a new strokepoint (it will be the new \"previous\" one).\n\t\tprev = {\n\t\t\tinput: pts[i],\n\t\t\t// The adjusted point\n\t\t\tpoint,\n\t\t\t// The input pressure (or .5 if not specified)\n\t\t\tpressure: simulatePressure ? 0.5 : pts[i].z,\n\t\t\t// The vector from the current point to the previous point\n\t\t\tvector: Vec2d.Sub(prev.point, point).uni(),\n\t\t\t// The distance between the current point and the previous point\n\t\t\tdistance,\n\t\t\t// The total distance so far\n\t\t\trunningLength: totalLength,\n\t\t\t// The stroke point's radius\n\t\t\tradius: 1,\n\t\t}\n\n\t\t// Push it to the strokePoints array.\n\t\tstrokePoints.push(prev)\n\t}\n\n\t// Set the vector of the first point to be the same as the second point.\n\tif (strokePoints[1]?.vector) {\n\t\tstrokePoints[0].vector = strokePoints[1].vector.clone()\n\t}\n\n\tif (totalLength < 1) {\n\t\tconst maxPressureAmongPoints = Math.max(0.5, ...strokePoints.map((s) => s.pressure))\n\t\tstrokePoints.forEach((s) => (s.pressure = maxPressureAmongPoints))\n\t}\n\n\treturn strokePoints\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,aAAsB;AAG/B,MAAM,qBAAqB;AAC3B,MAAM,mBAAmB;AAalB,SAAS,gBACf,gBACA,UAAyB,CAAC,GACV;AAChB,QAAM,EAAE,aAAa,KAAK,OAAO,IAAI,mBAAmB,MAAM,IAAI;AAGlE,MAAI,eAAe,WAAW
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["pt", "last"]
|
|
7
7
|
}
|
|
@@ -27,8 +27,7 @@ function setStrokePointRadii(strokePoints, options) {
|
|
|
27
27
|
let p;
|
|
28
28
|
for (let i = 0, n = strokePoints.length; i < n; i++) {
|
|
29
29
|
strokePoint = strokePoints[i];
|
|
30
|
-
if (strokePoint.runningLength > size * 5)
|
|
31
|
-
break;
|
|
30
|
+
if (strokePoint.runningLength > size * 5) break;
|
|
32
31
|
const sp = min(1, strokePoint.distance / size);
|
|
33
32
|
if (simulatePressure) {
|
|
34
33
|
const rp = min(1, 1 - sp);
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/shared/freehand/setStrokePointRadii.ts"],
|
|
4
4
|
"sourcesContent": ["import { EASINGS } from '@bigbluebutton/editor'\nimport { StrokeOptions, StrokePoint } from './types'\n\nconst { min } = Math\n\n// This is the rate of change for simulated pressure. It could be an option.\nconst RATE_OF_PRESSURE_CHANGE = 0.275\n\n/** @public */\nexport function setStrokePointRadii(strokePoints: StrokePoint[], options: StrokeOptions) {\n\tconst {\n\t\tsize = 16,\n\t\tthinning = 0.5,\n\t\tsimulatePressure = true,\n\t\teasing = (t) => t,\n\t\tstart = {},\n\t\tend = {},\n\t} = options\n\n\tconst { easing: taperStartEase = EASINGS.easeOutQuad } = start\n\tconst { easing: taperEndEase = EASINGS.easeOutCubic } = end\n\n\tconst totalLength = strokePoints[strokePoints.length - 1].runningLength\n\n\tlet firstRadius: number | undefined\n\tlet prevPressure = strokePoints[0].pressure\n\tlet strokePoint: StrokePoint\n\n\tif (!simulatePressure && totalLength < size) {\n\t\tconst max = strokePoints.reduce((max, curr) => Math.max(max, curr.pressure), 0.5)\n\t\tstrokePoints.forEach((sp) => {\n\t\t\tsp.pressure = max\n\t\t\tsp.radius = size * easing(0.5 - thinning * (0.5 - sp.pressure))\n\t\t})\n\t\treturn strokePoints\n\t} else {\n\t\t// Calculate initial pressure based on the average of the first\n\t\t// n number of points. This prevents \"dots\" at the start of the\n\t\t// line. Drawn lines almost always start slow!\n\t\tlet p: number\n\t\tfor (let i = 0, n = strokePoints.length; i < n; i++) {\n\t\t\tstrokePoint = strokePoints[i]\n\t\t\tif (strokePoint.runningLength > size * 5) break\n\t\t\tconst sp = min(1, strokePoint.distance / size)\n\t\t\tif (simulatePressure) {\n\t\t\t\tconst rp = min(1, 1 - sp)\n\t\t\t\tp = min(1, prevPressure + (rp - prevPressure) * (sp * RATE_OF_PRESSURE_CHANGE))\n\t\t\t} else {\n\t\t\t\tp = min(1, prevPressure + (strokePoint.pressure - prevPressure) * 0.5)\n\t\t\t}\n\t\t\tprevPressure = prevPressure + (p - prevPressure) * 0.5\n\t\t}\n\n\t\t// Now calculate pressure and radius for each point\n\t\tfor (let i = 0; i < strokePoints.length; i++) {\n\t\t\tstrokePoint = strokePoints[i]\n\t\t\tif (thinning) {\n\t\t\t\tlet { pressure } = strokePoint\n\t\t\t\tconst sp = min(1, strokePoint.distance / size)\n\t\t\t\tif (simulatePressure) {\n\t\t\t\t\t// If we're simulating pressure, then do so based on the distance\n\t\t\t\t\t// between the current point and the previous point, and the size\n\t\t\t\t\t// of the stroke.\n\t\t\t\t\tconst rp = min(1, 1 - sp)\n\t\t\t\t\tpressure = min(1, prevPressure + (rp - prevPressure) * (sp * RATE_OF_PRESSURE_CHANGE))\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise, use the input pressure slightly smoothed based on the\n\t\t\t\t\t// distance between the current point and the previous point.\n\t\t\t\t\tpressure = min(\n\t\t\t\t\t\t1,\n\t\t\t\t\t\tprevPressure + (pressure - prevPressure) * (sp * RATE_OF_PRESSURE_CHANGE)\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tstrokePoint.radius = size * easing(0.5 - thinning * (0.5 - pressure))\n\n\t\t\t\tprevPressure = pressure\n\t\t\t} else {\n\t\t\t\tstrokePoint.radius = size / 2\n\t\t\t}\n\n\t\t\tif (firstRadius === undefined) {\n\t\t\t\tfirstRadius = strokePoint.radius\n\t\t\t}\n\t\t}\n\t}\n\n\tconst taperStart =\n\t\tstart.taper === false\n\t\t\t? 0\n\t\t\t: start.taper === true\n\t\t\t? Math.max(size, totalLength)\n\t\t\t: (start.taper as number)\n\n\tconst taperEnd =\n\t\tend.taper === false\n\t\t\t? 0\n\t\t\t: end.taper === true\n\t\t\t? Math.max(size, totalLength)\n\t\t\t: (end.taper as number)\n\n\tif (taperStart || taperEnd) {\n\t\tfor (let i = 0; i < strokePoints.length; i++) {\n\t\t\tstrokePoint = strokePoints[i]\n\t\t\t/*\n\t\t\t\tApply tapering\n\n\t\t\t\tIf the current length is within the taper distance at either the\n\t\t\t\tstart or the end, calculate the taper strengths. Apply the smaller \n\t\t\t\tof the two taper strengths to the radius.\n\t\t\t*/\n\n\t\t\tconst { runningLength } = strokePoint\n\n\t\t\tconst ts = runningLength < taperStart ? taperStartEase(runningLength / taperStart) : 1\n\n\t\t\tconst te =\n\t\t\t\ttotalLength - runningLength < taperEnd\n\t\t\t\t\t? taperEndEase((totalLength - runningLength) / taperEnd)\n\t\t\t\t\t: 1\n\n\t\t\tstrokePoint.radius = Math.max(0.01, strokePoint.radius * Math.min(ts, te))\n\t\t}\n\t}\n\n\treturn strokePoints\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,eAAe;AAGxB,MAAM,EAAE,IAAI,IAAI;AAGhB,MAAM,0BAA0B;AAGzB,SAAS,oBAAoB,cAA6B,SAAwB;AACxF,QAAM;AAAA,IACL,OAAO;AAAA,IACP,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,SAAS,CAAC,MAAM;AAAA,IAChB,QAAQ,CAAC;AAAA,IACT,MAAM,CAAC;AAAA,EACR,IAAI;AAEJ,QAAM,EAAE,QAAQ,iBAAiB,QAAQ,YAAY,IAAI;AACzD,QAAM,EAAE,QAAQ,eAAe,QAAQ,aAAa,IAAI;AAExD,QAAM,cAAc,aAAa,aAAa,SAAS,CAAC,EAAE;AAE1D,MAAI;AACJ,MAAI,eAAe,aAAa,CAAC,EAAE;AACnC,MAAI;AAEJ,MAAI,CAAC,oBAAoB,cAAc,MAAM;AAC5C,UAAM,MAAM,aAAa,OAAO,CAACA,MAAK,SAAS,KAAK,IAAIA,MAAK,KAAK,QAAQ,GAAG,GAAG;AAChF,iBAAa,QAAQ,CAAC,OAAO;AAC5B,SAAG,WAAW;AACd,SAAG,SAAS,OAAO,OAAO,MAAM,YAAY,MAAM,GAAG,SAAS;AAAA,IAC/D,CAAC;AACD,WAAO;AAAA,EACR,OAAO;AAIN,QAAI;AACJ,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,IAAI,GAAG,KAAK;AACpD,oBAAc,aAAa,CAAC;AAC5B,UAAI,YAAY,gBAAgB,OAAO;
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["max"]
|
|
7
7
|
}
|
|
@@ -26,8 +26,7 @@ function svgInk(rawInputPoints, options = {}) {
|
|
|
26
26
|
return svg;
|
|
27
27
|
}
|
|
28
28
|
function partitionAtElbows(points) {
|
|
29
|
-
if (points.length <= 2)
|
|
30
|
-
return [points];
|
|
29
|
+
if (points.length <= 2) return [points];
|
|
31
30
|
const result = [];
|
|
32
31
|
let currentPartition = [points[0]];
|
|
33
32
|
for (let i = 1; i < points.length - 1; i++) {
|
|
@@ -107,8 +106,7 @@ function circlePath(cx, cy, r) {
|
|
|
107
106
|
return "M " + cx + " " + cy + " m -" + r + ", 0 a " + r + "," + r + " 0 1,1 " + r * 2 + ",0 a " + r + "," + r + " 0 1,1 -" + r * 2 + ",0";
|
|
108
107
|
}
|
|
109
108
|
function renderPartition(strokePoints, options = {}) {
|
|
110
|
-
if (strokePoints.length === 0)
|
|
111
|
-
return "";
|
|
109
|
+
if (strokePoints.length === 0) return "";
|
|
112
110
|
if (strokePoints.length === 1) {
|
|
113
111
|
return circlePath(strokePoints[0].point.x, strokePoints[0].point.y, strokePoints[0].radius);
|
|
114
112
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/shared/freehand/svgInk.ts"],
|
|
4
4
|
"sourcesContent": ["import {\n\tVec2d,\n\tVecLike,\n\tassert,\n\taverage,\n\tprecise,\n\tshortAngleDist,\n\ttoDomPrecision,\n} from '@bigbluebutton/editor'\nimport { getStrokeOutlineTracks } from './getStrokeOutlinePoints'\nimport { getStrokePoints } from './getStrokePoints'\nimport { setStrokePointRadii } from './setStrokePointRadii'\nimport { StrokeOptions, StrokePoint } from './types'\n\nexport function svgInk(rawInputPoints: VecLike[], options: StrokeOptions = {}) {\n\tconst { start = {}, end = {} } = options\n\tconst { cap: capStart = true } = start\n\tconst { cap: capEnd = true } = end\n\tassert(!start.taper && !end.taper, 'cap taper not supported here')\n\tassert(!start.easing && !end.easing, 'cap easing not supported here')\n\tassert(capStart && capEnd, 'cap must be true')\n\n\tconst points = getStrokePoints(rawInputPoints, options)\n\tsetStrokePointRadii(points, options)\n\tconst partitions = partitionAtElbows(points)\n\tlet svg = ''\n\tfor (const partition of partitions) {\n\t\tsvg += renderPartition(partition, options)\n\t}\n\n\treturn svg\n}\n\nfunction partitionAtElbows(points: StrokePoint[]): StrokePoint[][] {\n\tif (points.length <= 2) return [points]\n\n\tconst result: StrokePoint[][] = []\n\tlet currentPartition: StrokePoint[] = [points[0]]\n\tfor (let i = 1; i < points.length - 1; i++) {\n\t\tconst prevPoint = points[i - 1]\n\t\tconst thisPoint = points[i]\n\t\tconst nextPoint = points[i + 1]\n\t\tconst prevAngle = Vec2d.Angle(prevPoint.point, thisPoint.point)\n\t\tconst nextAngle = Vec2d.Angle(thisPoint.point, nextPoint.point)\n\t\t// acuteness is a normalized representation of how acute the angle is.\n\t\t// 1 is an infinitely thin wedge\n\t\t// 0 is a straight line\n\t\tconst acuteness = Math.abs(shortAngleDist(prevAngle, nextAngle)) / Math.PI\n\t\tif (acuteness > 0.8) {\n\t\t\t// always treat such acute angles as elbows\n\t\t\t// and use the extended .input point as the elbow point for swooshiness in fast zaggy lines\n\t\t\tconst elbowPoint = {\n\t\t\t\t...thisPoint,\n\t\t\t\tpoint: thisPoint.input,\n\t\t\t}\n\t\t\tcurrentPartition.push(elbowPoint)\n\t\t\tresult.push(cleanUpPartition(currentPartition))\n\t\t\tcurrentPartition = [elbowPoint]\n\t\t\tcontinue\n\t\t}\n\t\tcurrentPartition.push(thisPoint)\n\t\tif (acuteness < 0.25) {\n\t\t\t// this is not an elbow, bail out\n\t\t\tcontinue\n\t\t}\n\t\t// so now we have a reasonably acute angle but it might not be an elbow if it's far\n\t\t// away from it's neighbors\n\t\tconst avgRadius = (prevPoint.radius + thisPoint.radius + nextPoint.radius) / 3\n\t\tconst incomingNormalizedDist = Vec2d.Dist(prevPoint.point, thisPoint.point) / avgRadius\n\t\tconst outgoingNormalizedDist = Vec2d.Dist(thisPoint.point, nextPoint.point) / avgRadius\n\t\t// angular dist is a normalized representation of how far away the point is from it's neighbors\n\t\t// (normalized by the radius)\n\t\tconst angularDist = incomingNormalizedDist + outgoingNormalizedDist\n\t\tif (angularDist < 1.5) {\n\t\t\t// if this point is kinda close to its neighbors and it has a reasonably\n\t\t\t// acute angle, it's probably a hard elbow\n\t\t\tcurrentPartition.push(thisPoint)\n\t\t\tresult.push(cleanUpPartition(currentPartition))\n\t\t\tcurrentPartition = [thisPoint]\n\t\t\tcontinue\n\t\t}\n\t}\n\tcurrentPartition.push(points[points.length - 1])\n\tresult.push(cleanUpPartition(currentPartition))\n\n\treturn result\n}\n\nfunction cleanUpPartition(partition: StrokePoint[]) {\n\t// clean up start of partition (remove points that are too close to the start)\n\tconst startPoint = partition[0]\n\twhile (partition.length > 2) {\n\t\tconst nextPoint = partition[1]\n\t\tconst dist = Vec2d.Dist(startPoint.point, nextPoint.point)\n\t\tconst avgRadius = (startPoint.radius + nextPoint.radius) / 2\n\t\tif (dist < avgRadius * 0.5) {\n\t\t\tpartition.splice(1, 1)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\t// clean up end of partition in the same fashion\n\tconst endPoint = partition[partition.length - 1]\n\twhile (partition.length > 2) {\n\t\tconst prevPoint = partition[partition.length - 2]\n\t\tconst dist = Vec2d.Dist(endPoint.point, prevPoint.point)\n\t\tconst avgRadius = (endPoint.radius + prevPoint.radius) / 2\n\t\tif (dist < avgRadius * 0.5) {\n\t\t\tpartition.splice(partition.length - 2, 1)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\t// now readjust the cap point vectors to point to their nearest neighbors\n\tif (partition.length > 1) {\n\t\tpartition[0] = {\n\t\t\t...partition[0],\n\t\t\tvector: Vec2d.FromAngle(Vec2d.Angle(partition[1].point, partition[0].point)),\n\t\t}\n\t\tpartition[partition.length - 1] = {\n\t\t\t...partition[partition.length - 1],\n\t\t\tvector: Vec2d.FromAngle(\n\t\t\t\tVec2d.Angle(partition[partition.length - 1].point, partition[partition.length - 2].point)\n\t\t\t),\n\t\t}\n\t}\n\treturn partition\n}\n\nfunction circlePath(cx: number, cy: number, r: number) {\n\treturn (\n\t\t'M ' +\n\t\tcx +\n\t\t' ' +\n\t\tcy +\n\t\t' m -' +\n\t\tr +\n\t\t', 0 a ' +\n\t\tr +\n\t\t',' +\n\t\tr +\n\t\t' 0 1,1 ' +\n\t\tr * 2 +\n\t\t',0 a ' +\n\t\tr +\n\t\t',' +\n\t\tr +\n\t\t' 0 1,1 -' +\n\t\tr * 2 +\n\t\t',0'\n\t)\n}\n\nexport function renderPartition(strokePoints: StrokePoint[], options: StrokeOptions = {}): string {\n\tif (strokePoints.length === 0) return ''\n\tif (strokePoints.length === 1) {\n\t\treturn circlePath(strokePoints[0].point.x, strokePoints[0].point.y, strokePoints[0].radius)\n\t}\n\n\tconst { left, right } = getStrokeOutlineTracks(strokePoints, options)\n\tright.reverse()\n\tlet svg = `M${precise(left[0])}T`\n\n\t// draw left track\n\tfor (let i = 1; i < left.length; i++) {\n\t\tsvg += average(left[i - 1], left[i])\n\t}\n\t// draw end cap arc\n\t{\n\t\tconst point = strokePoints[strokePoints.length - 1]\n\t\tconst radius = point.radius\n\t\tconst direction = point.vector.clone().per().neg()\n\t\tconst arcStart = Vec2d.Add(point.point, Vec2d.Mul(direction, radius))\n\t\tconst arcEnd = Vec2d.Add(point.point, Vec2d.Mul(direction, -radius))\n\t\tsvg += `${precise(arcStart)}A${toDomPrecision(radius)},${toDomPrecision(\n\t\t\tradius\n\t\t)} 0 0 1 ${precise(arcEnd)}T`\n\t}\n\t// draw right track\n\tfor (let i = 1; i < right.length; i++) {\n\t\tsvg += average(right[i - 1], right[i])\n\t}\n\t// draw start cap arc\n\t{\n\t\tconst point = strokePoints[0]\n\t\tconst radius = point.radius\n\t\tconst direction = point.vector.clone().per()\n\t\tconst arcStart = Vec2d.Add(point.point, Vec2d.Mul(direction, radius))\n\t\tconst arcEnd = Vec2d.Add(point.point, Vec2d.Mul(direction, -radius))\n\t\tsvg += `${precise(arcStart)}A${toDomPrecision(radius)},${toDomPrecision(\n\t\t\tradius\n\t\t)} 0 0 1 ${precise(arcEnd)}Z`\n\t}\n\treturn svg\n}\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,8BAA8B;AACvC,SAAS,uBAAuB;AAChC,SAAS,2BAA2B;AAG7B,SAAS,OAAO,gBAA2B,UAAyB,CAAC,GAAG;AAC9E,QAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI;AACjC,QAAM,EAAE,KAAK,WAAW,KAAK,IAAI;AACjC,QAAM,EAAE,KAAK,SAAS,KAAK,IAAI;AAC/B,SAAO,CAAC,MAAM,SAAS,CAAC,IAAI,OAAO,8BAA8B;AACjE,SAAO,CAAC,MAAM,UAAU,CAAC,IAAI,QAAQ,+BAA+B;AACpE,SAAO,YAAY,QAAQ,kBAAkB;AAE7C,QAAM,SAAS,gBAAgB,gBAAgB,OAAO;AACtD,sBAAoB,QAAQ,OAAO;AACnC,QAAM,aAAa,kBAAkB,MAAM;AAC3C,MAAI,MAAM;AACV,aAAW,aAAa,YAAY;AACnC,WAAO,gBAAgB,WAAW,OAAO;AAAA,EAC1C;AAEA,SAAO;AACR;AAEA,SAAS,kBAAkB,QAAwC;AAClE,MAAI,OAAO,UAAU
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -24,8 +24,7 @@ function useEditableText(id, type, text) {
|
|
|
24
24
|
rSkipSelectOnFocus.current = false;
|
|
25
25
|
requestAnimationFrame(() => {
|
|
26
26
|
const elm = rInput.current;
|
|
27
|
-
if (!elm)
|
|
28
|
-
return;
|
|
27
|
+
if (!elm) return;
|
|
29
28
|
const shape = editor.getShape(id);
|
|
30
29
|
if (shape) {
|
|
31
30
|
elm.value = shape.props.text;
|
|
@@ -65,10 +64,8 @@ function useEditableText(id, type, text) {
|
|
|
65
64
|
}, [editor, id]);
|
|
66
65
|
const handleKeyDown = useCallback(
|
|
67
66
|
(e) => {
|
|
68
|
-
if (!isEditing)
|
|
69
|
-
|
|
70
|
-
if (e.ctrlKey || e.metaKey)
|
|
71
|
-
stopEventPropagation(e);
|
|
67
|
+
if (!isEditing) return;
|
|
68
|
+
if (e.ctrlKey || e.metaKey) stopEventPropagation(e);
|
|
72
69
|
switch (e.key) {
|
|
73
70
|
case "Enter": {
|
|
74
71
|
if (e.ctrlKey || e.metaKey) {
|
|
@@ -91,8 +88,7 @@ function useEditableText(id, type, text) {
|
|
|
91
88
|
);
|
|
92
89
|
const handleChange = useCallback(
|
|
93
90
|
(e) => {
|
|
94
|
-
if (!isEditing)
|
|
95
|
-
return;
|
|
91
|
+
if (!isEditing) return;
|
|
96
92
|
let text2 = TextHelpers.normalizeText(e.currentTarget.value);
|
|
97
93
|
const untabbedText = text2.replace(/\t/g, INDENT);
|
|
98
94
|
if (untabbedText !== text2) {
|
|
@@ -110,8 +106,7 @@ function useEditableText(id, type, text) {
|
|
|
110
106
|
);
|
|
111
107
|
const isEmpty = text.trim().length === 0;
|
|
112
108
|
useEffect(() => {
|
|
113
|
-
if (!isEditing)
|
|
114
|
-
return;
|
|
109
|
+
if (!isEditing) return;
|
|
115
110
|
const elm = rInput.current;
|
|
116
111
|
if (elm) {
|
|
117
112
|
let updateSelection2 = function() {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/shapes/shared/useEditableText.ts"],
|
|
4
4
|
"sourcesContent": ["/* eslint-disable no-inner-declarations */\n\nimport {\n\tTLShape,\n\tTLUnknownShape,\n\tgetPointerInfo,\n\tpreventDefault,\n\tstopEventPropagation,\n\tuseEditor,\n\tuseValue,\n} from '@bigbluebutton/editor'\nimport React, { useCallback, useEffect, useRef } from 'react'\nimport { INDENT, TextHelpers } from './TextHelpers'\n\nexport function useEditableText<T extends Extract<TLShape, { props: { text: string } }>>(\n\tid: T['id'],\n\ttype: T['type'],\n\ttext: string\n) {\n\tconst editor = useEditor()\n\n\tconst rInput = useRef<HTMLTextAreaElement>(null)\n\tconst rSkipSelectOnFocus = useRef(false)\n\tconst rSelectionRanges = useRef<Range[] | null>()\n\n\tconst isEditing = useValue('isEditing', () => editor.getEditingShapeId() === id, [editor, id])\n\n\t// If the shape is editing but the input element not focused, focus the element\n\tuseEffect(() => {\n\t\tconst elm = rInput.current\n\t\tif (elm && isEditing && document.activeElement !== elm) {\n\t\t\telm.focus()\n\t\t}\n\t}, [isEditing])\n\n\t// When the label receives focus, set the value to the most recent text value and select all of the text\n\tconst handleFocus = useCallback(() => {\n\t\t// Store and turn off the skipSelectOnFocus flag\n\t\tconst skipSelect = rSkipSelectOnFocus.current\n\t\trSkipSelectOnFocus.current = false\n\n\t\t// On the next frame, if we're not skipping select AND we have text in the element, then focus the text\n\t\trequestAnimationFrame(() => {\n\t\t\tconst elm = rInput.current\n\t\t\tif (!elm) return\n\n\t\t\tconst shape = editor.getShape<TLShape & { props: { text: string } }>(id)\n\n\t\t\tif (shape) {\n\t\t\t\telm.value = shape.props.text\n\t\t\t\tif (elm.value.length && !skipSelect) {\n\t\t\t\t\telm.select()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}, [editor, id])\n\n\t// When the label blurs, deselect all of the text and complete.\n\t// This makes it so that the canvas does not have to be focused\n\t// in order to exit the editing state and complete the editing state\n\tconst handleBlur = useCallback(() => {\n\t\tconst ranges = rSelectionRanges.current\n\n\t\trequestAnimationFrame(() => {\n\t\t\tconst elm = rInput.current\n\t\t\tconst editingShapeId = editor.getEditingShapeId()\n\t\t\t// Did we move to a different shape?\n\t\t\tif (elm && editingShapeId) {\n\t\t\t\t// important! these ^v are two different things\n\t\t\t\t// is that shape OUR shape?\n\t\t\t\tif (editingShapeId === id) {\n\t\t\t\t\tif (ranges) {\n\t\t\t\t\t\tif (!ranges.length) {\n\t\t\t\t\t\t\t// If we don't have any ranges, restore selection\n\t\t\t\t\t\t\t// and select all of the text\n\t\t\t\t\t\t\telm.focus()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Otherwise, skip the select-all-on-focus behavior\n\t\t\t\t\t\t\t// and restore the selection\n\t\t\t\t\t\t\trSkipSelectOnFocus.current = true\n\t\t\t\t\t\t\telm.focus()\n\t\t\t\t\t\t\tconst selection = window.getSelection()\n\t\t\t\t\t\t\tif (selection) {\n\t\t\t\t\t\t\t\tranges.forEach((range) => selection.addRange(range))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\telm.focus()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twindow.getSelection()?.removeAllRanges()\n\t\t\t\teditor.complete()\n\t\t\t}\n\t\t})\n\t}, [editor, id])\n\n\t// When the user presses ctrl / meta enter, complete the editing state.\n\t// When the user presses tab, indent or unindent the text.\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n\t\t\tif (!isEditing) return\n\n\t\t\tif (e.ctrlKey || e.metaKey) stopEventPropagation(e)\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase 'Enter': {\n\t\t\t\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\t\t\t\teditor.complete()\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcase 'Tab': {\n\t\t\t\t\tpreventDefault(e)\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tTextHelpers.unindent(e.currentTarget)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tTextHelpers.indent(e.currentTarget)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[editor, isEditing]\n\t)\n\n\t// When the text changes, update the text value.\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\tif (!isEditing) return\n\n\t\t\tlet text = TextHelpers.normalizeText(e.currentTarget.value)\n\n\t\t\t// ------- Bug fix ------------\n\t\t\t// Replace tabs with spaces when pasting\n\t\t\tconst untabbedText = text.replace(/\\t/g, INDENT)\n\t\t\tif (untabbedText !== text) {\n\t\t\t\tconst selectionStart = e.currentTarget.selectionStart\n\t\t\t\te.currentTarget.value = untabbedText\n\t\t\t\te.currentTarget.selectionStart = selectionStart + (untabbedText.length - text.length)\n\t\t\t\te.currentTarget.selectionEnd = selectionStart + (untabbedText.length - text.length)\n\t\t\t\ttext = untabbedText\n\t\t\t}\n\t\t\t// ----------------------------\n\n\t\t\teditor.updateShapes<TLUnknownShape & { props: { text: string } }>([\n\t\t\t\t{ id, type, props: { text } },\n\t\t\t])\n\t\t},\n\t\t[editor, id, type, isEditing]\n\t)\n\n\tconst isEmpty = text.trim().length === 0\n\n\tuseEffect(() => {\n\t\tif (!isEditing) return\n\n\t\tconst elm = rInput.current\n\t\tif (elm) {\n\t\t\tfunction updateSelection() {\n\t\t\t\tconst selection = window.getSelection?.()\n\t\t\t\tif (selection && selection.type !== 'None') {\n\t\t\t\t\tconst ranges: Range[] = []\n\n\t\t\t\t\tif (selection) {\n\t\t\t\t\t\tfor (let i = 0; i < selection.rangeCount; i++) {\n\t\t\t\t\t\t\tranges.push(selection.getRangeAt?.(i))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\trSelectionRanges.current = ranges\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdocument.addEventListener('selectionchange', updateSelection)\n\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener('selectionchange', updateSelection)\n\t\t\t}\n\t\t}\n\t}, [isEditing])\n\n\tconst handleInputPointerDown = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\teditor.dispatch({\n\t\t\t\t...getPointerInfo(e),\n\t\t\t\ttype: 'pointer',\n\t\t\t\tname: 'pointer_down',\n\t\t\t\ttarget: 'shape',\n\t\t\t\tshape: editor.getShape(id)!,\n\t\t\t})\n\n\t\t\tstopEventPropagation(e) // we need to prevent blurring the input\n\t\t},\n\t\t[editor, id]\n\t)\n\n\tconst handleDoubleClick = stopEventPropagation\n\n\treturn {\n\t\trInput,\n\t\tisEditing,\n\t\thandleFocus,\n\t\thandleBlur,\n\t\thandleKeyDown,\n\t\thandleChange,\n\t\thandleInputPointerDown,\n\t\thandleDoubleClick,\n\t\tisEmpty,\n\t}\n}\n"],
|
|
5
|
-
"mappings": "AAEA;AAAA,EAGC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAgB,aAAa,WAAW,cAAc;AACtD,SAAS,QAAQ,mBAAmB;AAE7B,SAAS,gBACf,IACA,MACA,MACC;AACD,QAAM,SAAS,UAAU;AAEzB,QAAM,SAAS,OAA4B,IAAI;AAC/C,QAAM,qBAAqB,OAAO,KAAK;AACvC,QAAM,mBAAmB,OAAuB;AAEhD,QAAM,YAAY,SAAS,aAAa,MAAM,OAAO,kBAAkB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAG7F,YAAU,MAAM;AACf,UAAM,MAAM,OAAO;AACnB,QAAI,OAAO,aAAa,SAAS,kBAAkB,KAAK;AACvD,UAAI,MAAM;AAAA,IACX;AAAA,EACD,GAAG,CAAC,SAAS,CAAC;AAGd,QAAM,cAAc,YAAY,MAAM;AAErC,UAAM,aAAa,mBAAmB;AACtC,uBAAmB,UAAU;AAG7B,0BAAsB,MAAM;AAC3B,YAAM,MAAM,OAAO;AACnB,UAAI,CAAC;
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["text", "updateSelection"]
|
|
7
7
|
}
|
|
@@ -123,8 +123,7 @@ class TextShapeUtil extends ShapeUtil {
|
|
|
123
123
|
indicator(shape) {
|
|
124
124
|
const bounds = this.editor.getShapeGeometry(shape).bounds;
|
|
125
125
|
const editor = useEditor();
|
|
126
|
-
if (shape.props.autoSize && editor.getEditingShapeId() === shape.id)
|
|
127
|
-
return null;
|
|
126
|
+
if (shape.props.autoSize && editor.getEditingShapeId() === shape.id) return null;
|
|
128
127
|
return /* @__PURE__ */ jsx("rect", { width: toDomPrecision(bounds.width), height: toDomPrecision(bounds.height) });
|
|
129
128
|
}
|
|
130
129
|
toSvg(shape, ctx) {
|
|
@@ -205,10 +204,8 @@ class TextShapeUtil extends ShapeUtil {
|
|
|
205
204
|
}
|
|
206
205
|
};
|
|
207
206
|
onBeforeCreate = (shape) => {
|
|
208
|
-
if (!shape.props.autoSize)
|
|
209
|
-
|
|
210
|
-
if (shape.props.text.trim())
|
|
211
|
-
return;
|
|
207
|
+
if (!shape.props.autoSize) return;
|
|
208
|
+
if (shape.props.text.trim()) return;
|
|
212
209
|
const bounds = this.getMinDimensions(shape);
|
|
213
210
|
return {
|
|
214
211
|
...shape,
|
|
@@ -240,12 +237,10 @@ class TextShapeUtil extends ShapeUtil {
|
|
|
240
237
|
}
|
|
241
238
|
};
|
|
242
239
|
onBeforeUpdate = (prev, next) => {
|
|
243
|
-
if (!next.props.autoSize)
|
|
244
|
-
return;
|
|
240
|
+
if (!next.props.autoSize) return;
|
|
245
241
|
const styleDidChange = prev.props.size !== next.props.size || prev.props.align !== next.props.align || prev.props.font !== next.props.font || prev.props.scale !== 1 && next.props.scale === 1;
|
|
246
242
|
const textDidChange = prev.props.text !== next.props.text;
|
|
247
|
-
if (!styleDidChange && !textDidChange)
|
|
248
|
-
return;
|
|
243
|
+
if (!styleDidChange && !textDidChange) return;
|
|
249
244
|
const boundsA = this.getMinDimensions(prev);
|
|
250
245
|
const boundsB = getTextSize(this.editor, next.props);
|
|
251
246
|
const wA = boundsA.width * prev.props.scale;
|
|
@@ -263,8 +258,7 @@ class TextShapeUtil extends ShapeUtil {
|
|
|
263
258
|
break;
|
|
264
259
|
}
|
|
265
260
|
default: {
|
|
266
|
-
if (textDidChange)
|
|
267
|
-
break;
|
|
261
|
+
if (textDidChange) break;
|
|
268
262
|
delta = new Vec2d(0, (hB - hA) / 2);
|
|
269
263
|
break;
|
|
270
264
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/shapes/text/TextShapeUtil.tsx"],
|
|
4
4
|
"sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n\tDefaultFontFamilies,\n\tEditor,\n\tHTMLContainer,\n\tRectangle2d,\n\tShapeUtil,\n\tSvgExportContext,\n\tTLOnEditEndHandler,\n\tTLOnResizeHandler,\n\tTLShapeUtilFlag,\n\tTLTextShape,\n\tVec2d,\n\tWeakMapCache,\n\tgetDefaultColorTheme,\n\tstopEventPropagation,\n\ttextShapeMigrations,\n\ttextShapeProps,\n\ttoDomPrecision,\n\tuseEditor,\n} from '@bigbluebutton/editor'\nimport { createTextSvgElementFromSpans } from '../shared/createTextSvgElementFromSpans'\nimport { FONT_FAMILIES, FONT_SIZES, TEXT_PROPS } from '../shared/default-shape-constants'\nimport { getFontDefForExport } from '../shared/defaultStyleDefs'\nimport { resizeScaled } from '../shared/resizeScaled'\nimport { useEditableText } from '../shared/useEditableText'\n\nconst sizeCache = new WeakMapCache<TLTextShape['props'], { height: number; width: number }>()\n\n/** @public */\nexport class TextShapeUtil extends ShapeUtil<TLTextShape> {\n\tstatic override type = 'text' as const\n\tstatic override props = textShapeProps\n\tstatic override migrations = textShapeMigrations\n\n\tgetDefaultProps(): TLTextShape['props'] {\n\t\treturn {\n\t\t\tcolor: 'black',\n\t\t\tsize: 'm',\n\t\t\tw: 8,\n\t\t\ttext: '',\n\t\t\tfont: 'draw',\n\t\t\talign: 'middle',\n\t\t\tautoSize: true,\n\t\t\tscale: 1,\n\t\t}\n\t}\n\n\tgetMinDimensions(shape: TLTextShape) {\n\t\treturn sizeCache.get(shape.props, (props) => getTextSize(this.editor, props))\n\t}\n\n\tgetGeometry(shape: TLTextShape) {\n\t\tconst { scale } = shape.props\n\t\tconst { width, height } = this.getMinDimensions(shape)!\n\t\treturn new Rectangle2d({\n\t\t\twidth: width * scale,\n\t\t\theight: height * scale,\n\t\t\tisFilled: true,\n\t\t})\n\t}\n\n\toverride canEdit = () => true\n\n\toverride isAspectRatioLocked: TLShapeUtilFlag<TLTextShape> = () => true\n\n\tcomponent(shape: TLTextShape) {\n\t\tconst {\n\t\t\tid,\n\t\t\ttype,\n\t\t\tprops: { text, color },\n\t\t} = shape\n\n\t\tconst theme = getDefaultColorTheme({ isDarkMode: this.editor.user.getIsDarkMode() })\n\t\tconst { width, height } = this.getMinDimensions(shape)\n\n\t\tconst {\n\t\t\trInput,\n\t\t\tisEmpty,\n\t\t\tisEditing,\n\t\t\thandleFocus,\n\t\t\thandleChange,\n\t\t\thandleKeyDown,\n\t\t\thandleBlur,\n\t\t\thandleInputPointerDown,\n\t\t\thandleDoubleClick,\n\t\t} = useEditableText(id, type, text)\n\n\t\treturn (\n\t\t\t<HTMLContainer id={shape.id}>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"tl-text-shape__wrapper tl-text-shadow\"\n\t\t\t\t\tdata-font={shape.props.font}\n\t\t\t\t\tdata-align={shape.props.align}\n\t\t\t\t\tdata-hastext={!isEmpty}\n\t\t\t\t\tdata-isediting={isEditing}\n\t\t\t\t\tdata-textwrap={true}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tfontSize: FONT_SIZES[shape.props.size],\n\t\t\t\t\t\tlineHeight: FONT_SIZES[shape.props.size] * TEXT_PROPS.lineHeight + 'px',\n\t\t\t\t\t\ttransform: `scale(${shape.props.scale})`,\n\t\t\t\t\t\ttransformOrigin: 'top left',\n\t\t\t\t\t\twidth: Math.max(1, width),\n\t\t\t\t\t\theight: Math.max(FONT_SIZES[shape.props.size] * TEXT_PROPS.lineHeight, height),\n\t\t\t\t\t\tcolor: theme[color].solid,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"tl-text tl-text-content\" dir=\"ltr\">\n\t\t\t\t\t\t{text}\n\t\t\t\t\t</div>\n\t\t\t\t\t{isEditing ? (\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\tref={rInput}\n\t\t\t\t\t\t\tclassName=\"tl-text tl-text-input\"\n\t\t\t\t\t\t\tname=\"text\"\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\tautoComplete=\"false\"\n\t\t\t\t\t\t\tautoCapitalize=\"false\"\n\t\t\t\t\t\t\tautoCorrect=\"false\"\n\t\t\t\t\t\t\tautoSave=\"false\"\n\t\t\t\t\t\t\tautoFocus={isEditing}\n\t\t\t\t\t\t\tplaceholder=\"\"\n\t\t\t\t\t\t\tspellCheck=\"true\"\n\t\t\t\t\t\t\twrap=\"off\"\n\t\t\t\t\t\t\tdir=\"ltr\"\n\t\t\t\t\t\t\tdatatype=\"wysiwyg\"\n\t\t\t\t\t\t\tdefaultValue={text}\n\t\t\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\t\t\tonTouchEnd={stopEventPropagation}\n\t\t\t\t\t\t\tonContextMenu={stopEventPropagation}\n\t\t\t\t\t\t\tonPointerDown={handleInputPointerDown}\n\t\t\t\t\t\t\tonDoubleClick={handleDoubleClick}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</div>\n\t\t\t</HTMLContainer>\n\t\t)\n\t}\n\n\tindicator(shape: TLTextShape) {\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\t\tconst editor = useEditor()\n\t\tif (shape.props.autoSize && editor.getEditingShapeId() === shape.id) return null\n\t\treturn <rect width={toDomPrecision(bounds.width)} height={toDomPrecision(bounds.height)} />\n\t}\n\n\toverride toSvg(shape: TLTextShape, ctx: SvgExportContext) {\n\t\tctx.addExportDef(getFontDefForExport(shape.props.font))\n\n\t\tconst theme = getDefaultColorTheme({ isDarkMode: this.editor.user.getIsDarkMode() })\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\t\tconst text = shape.props.text\n\n\t\tconst width = bounds.width / (shape.props.scale ?? 1)\n\t\tconst height = bounds.height / (shape.props.scale ?? 1)\n\n\t\tconst opts = {\n\t\t\tfontSize: FONT_SIZES[shape.props.size],\n\t\t\tfontFamily: DefaultFontFamilies[shape.props.font],\n\t\t\ttextAlign: shape.props.align,\n\t\t\tverticalTextAlign: 'middle' as const,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tpadding: 0, // no padding?\n\t\t\tlineHeight: TEXT_PROPS.lineHeight,\n\t\t\tfontStyle: 'normal',\n\t\t\tfontWeight: 'normal',\n\t\t\toverflow: 'wrap' as const,\n\t\t}\n\n\t\tconst color = theme[shape.props.color].solid\n\t\tconst groupEl = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n\t\tconst textBgEl = createTextSvgElementFromSpans(\n\t\t\tthis.editor,\n\t\t\tthis.editor.textMeasure.measureTextSpans(text, opts),\n\t\t\t{\n\t\t\t\t...opts,\n\t\t\t\tstroke: theme.background,\n\t\t\t\tstrokeWidth: 2,\n\t\t\t\tfill: theme.background,\n\t\t\t\tpadding: 0,\n\t\t\t}\n\t\t)\n\n\t\tconst textElm = textBgEl.cloneNode(true) as SVGTextElement\n\t\ttextElm.setAttribute('fill', color)\n\t\ttextElm.setAttribute('stroke', 'none')\n\n\t\tgroupEl.append(textBgEl)\n\t\tgroupEl.append(textElm)\n\n\t\treturn groupEl\n\t}\n\n\toverride onResize: TLOnResizeHandler<TLTextShape> = (shape, info) => {\n\t\tconst { initialBounds, initialShape, scaleX, handle } = info\n\n\t\tif (info.mode === 'scale_shape' || (handle !== 'right' && handle !== 'left')) {\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\t...resizeScaled(shape, info),\n\t\t\t}\n\t\t} else {\n\t\t\tconst prevWidth = initialBounds.width\n\t\t\tlet nextWidth = prevWidth * scaleX\n\n\t\t\tconst offset = new Vec2d(0, 0)\n\n\t\t\tnextWidth = Math.max(1, Math.abs(nextWidth))\n\n\t\t\tif (handle === 'left') {\n\t\t\t\toffset.x = prevWidth - nextWidth\n\t\t\t\tif (scaleX < 0) {\n\t\t\t\t\toffset.x += nextWidth\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (scaleX < 0) {\n\t\t\t\t\toffset.x -= nextWidth\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { x, y } = offset.rot(shape.rotation).add(initialShape)\n\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tprops: {\n\t\t\t\t\tw: nextWidth / initialShape.props.scale,\n\t\t\t\t\tautoSize: false,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onBeforeCreate = (shape: TLTextShape) => {\n\t\t// When a shape is created, center the text at the created point.\n\n\t\t// Only center if the shape is set to autosize.\n\t\tif (!shape.props.autoSize) return\n\n\t\t// Only center if the shape is empty when created.\n\t\tif (shape.props.text.trim()) return\n\n\t\tconst bounds = this.getMinDimensions(shape)\n\n\t\treturn {\n\t\t\t...shape,\n\t\t\tx: shape.x - bounds.width / 2,\n\t\t\ty: shape.y - bounds.height / 2,\n\t\t}\n\t}\n\n\toverride onEditEnd: TLOnEditEndHandler<TLTextShape> = (shape) => {\n\t\tconst {\n\t\t\tid,\n\t\t\ttype,\n\t\t\tprops: { text },\n\t\t} = shape\n\n\t\tconst trimmedText = shape.props.text.trimEnd()\n\n\t\tif (trimmedText.length === 0) {\n\t\t\tthis.editor.deleteShapes([shape.id])\n\t\t} else {\n\t\t\tif (trimmedText !== shape.props.text) {\n\t\t\t\tthis.editor.updateShapes([\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\ttext: text.trimEnd(),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t])\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onBeforeUpdate = (prev: TLTextShape, next: TLTextShape) => {\n\t\tif (!next.props.autoSize) return\n\n\t\tconst styleDidChange =\n\t\t\tprev.props.size !== next.props.size ||\n\t\t\tprev.props.align !== next.props.align ||\n\t\t\tprev.props.font !== next.props.font ||\n\t\t\t(prev.props.scale !== 1 && next.props.scale === 1)\n\n\t\tconst textDidChange = prev.props.text !== next.props.text\n\n\t\t// Only update position if either changed\n\t\tif (!styleDidChange && !textDidChange) return\n\n\t\t// Might return a cached value for the bounds\n\t\tconst boundsA = this.getMinDimensions(prev)\n\n\t\t// Will always be a fresh call to getTextSize\n\t\tconst boundsB = getTextSize(this.editor, next.props)\n\n\t\tconst wA = boundsA.width * prev.props.scale\n\t\tconst hA = boundsA.height * prev.props.scale\n\t\tconst wB = boundsB.width * next.props.scale\n\t\tconst hB = boundsB.height * next.props.scale\n\n\t\tlet delta: Vec2d | undefined\n\n\t\tswitch (next.props.align) {\n\t\t\tcase 'middle': {\n\t\t\t\tdelta = new Vec2d((wB - wA) / 2, textDidChange ? 0 : (hB - hA) / 2)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'end': {\n\t\t\t\tdelta = new Vec2d(wB - wA, textDidChange ? 0 : (hB - hA) / 2)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (textDidChange) break\n\t\t\t\tdelta = new Vec2d(0, (hB - hA) / 2)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (delta) {\n\t\t\t// account for shape rotation when writing text:\n\t\t\tdelta.rot(next.rotation)\n\t\t\tconst { x, y } = next\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tx: x - delta.x,\n\t\t\t\ty: y - delta.y,\n\t\t\t\tprops: { ...next.props, w: wB },\n\t\t\t}\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t...next,\n\t\t\t\tprops: { ...next.props, w: wB },\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onDoubleClickEdge = (shape: TLTextShape) => {\n\t\t// If the shape has a fixed width, set it to autoSize.\n\t\tif (!shape.props.autoSize) {\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: {\n\t\t\t\t\tautoSize: true,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\t// If the shape is scaled, reset the scale to 1.\n\t\tif (shape.props.scale !== 1) {\n\t\t\treturn {\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: shape.type,\n\t\t\t\tprops: {\n\t\t\t\t\tscale: 1,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction getTextSize(editor: Editor, props: TLTextShape['props']) {\n\tconst { font, text, autoSize, size, w } = props\n\n\tconst minWidth = autoSize ? 16 : Math.max(16, w)\n\tconst fontSize = FONT_SIZES[size]\n\n\tconst cw = autoSize\n\t\t? null\n\t\t: // `measureText` floors the number so we need to do the same here to avoid issues.\n\t\t Math.floor(Math.max(minWidth, w))\n\n\tconst result = editor.textMeasure.measureText(text, {\n\t\t...TEXT_PROPS,\n\t\tfontFamily: FONT_FAMILIES[font],\n\t\tfontSize: fontSize,\n\t\tmaxWidth: cw,\n\t})\n\n\t// // If we're autosizing the measureText will essentially `Math.floor`\n\t// // the numbers so `19` rather than `19.3`, this means we must +1 to\n\t// // whatever we get to avoid wrapping.\n\tif (autoSize) {\n\t\tresult.w += 1\n\t}\n\n\treturn {\n\t\twidth: Math.max(minWidth, result.w),\n\t\theight: Math.max(fontSize, result.h),\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -18,8 +18,7 @@ class Idle extends StateNode {
|
|
|
18
18
|
};
|
|
19
19
|
onKeyDown = (info) => {
|
|
20
20
|
if (info.key === "Enter") {
|
|
21
|
-
if (this.editor.getInstanceState().isReadonly)
|
|
22
|
-
return null;
|
|
21
|
+
if (this.editor.getInstanceState().isReadonly) return null;
|
|
23
22
|
const onlySelectedShape = this.editor.getOnlySelectedShape();
|
|
24
23
|
if (onlySelectedShape && this.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)) {
|
|
25
24
|
this.editor.setCurrentTool("select");
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/text/toolStates/Idle.ts"],
|
|
4
4
|
"sourcesContent": ["import { StateNode, TLEventHandlers } from '@bigbluebutton/editor'\nimport { updateHoveredId } from '../../../tools/selection-logic/updateHoveredId'\n\nexport class Idle extends StateNode {\n\tstatic override id = 'idle'\n\n\toverride onPointerMove: TLEventHandlers['onPointerMove'] = (info) => {\n\t\tswitch (info.target) {\n\t\t\tcase 'shape':\n\t\t\tcase 'canvas': {\n\t\t\t\tupdateHoveredId(this.editor)\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onPointerDown: TLEventHandlers['onPointerDown'] = (info) => {\n\t\tthis.parent.transition('pointing', info)\n\t}\n\n\toverride onEnter = () => {\n\t\tthis.editor.setCursor({ type: 'cross', rotation: 0 })\n\t}\n\n\toverride onKeyDown: TLEventHandlers['onKeyDown'] = (info) => {\n\t\tif (info.key === 'Enter') {\n\t\t\tif (this.editor.getInstanceState().isReadonly) return null\n\t\t\tconst onlySelectedShape = this.editor.getOnlySelectedShape()\n\t\t\t// If the only selected shape is editable, start editing it\n\t\t\tif (\n\t\t\t\tonlySelectedShape &&\n\t\t\t\tthis.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)\n\t\t\t) {\n\t\t\t\tthis.editor.setCurrentTool('select')\n\t\t\t\tthis.editor.setEditingShape(onlySelectedShape.id)\n\t\t\t\tthis.editor.root.getCurrent()?.transition('editing_shape', {\n\t\t\t\t\t...info,\n\t\t\t\t\ttarget: 'shape',\n\t\t\t\t\tshape: onlySelectedShape,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\toverride onCancel = () => {\n\t\tthis.editor.setCurrentTool('select')\n\t}\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,iBAAkC;AAC3C,SAAS,uBAAuB;AAEzB,MAAM,aAAa,UAAU;AAAA,EACnC,OAAgB,KAAK;AAAA,EAEZ,gBAAkD,CAAC,SAAS;AACpE,YAAQ,KAAK,QAAQ;AAAA,MACpB,KAAK;AAAA,MACL,KAAK,UAAU;AACd,wBAAgB,KAAK,MAAM;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;AAAA,EAES,gBAAkD,CAAC,SAAS;AACpE,SAAK,OAAO,WAAW,YAAY,IAAI;AAAA,EACxC;AAAA,EAES,UAAU,MAAM;AACxB,SAAK,OAAO,UAAU,EAAE,MAAM,SAAS,UAAU,EAAE,CAAC;AAAA,EACrD;AAAA,EAES,YAA0C,CAAC,SAAS;AAC5D,QAAI,KAAK,QAAQ,SAAS;AACzB,UAAI,KAAK,OAAO,iBAAiB,EAAE
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAkC;AAC3C,SAAS,uBAAuB;AAEzB,MAAM,aAAa,UAAU;AAAA,EACnC,OAAgB,KAAK;AAAA,EAEZ,gBAAkD,CAAC,SAAS;AACpE,YAAQ,KAAK,QAAQ;AAAA,MACpB,KAAK;AAAA,MACL,KAAK,UAAU;AACd,wBAAgB,KAAK,MAAM;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;AAAA,EAES,gBAAkD,CAAC,SAAS;AACpE,SAAK,OAAO,WAAW,YAAY,IAAI;AAAA,EACxC;AAAA,EAES,UAAU,MAAM;AACxB,SAAK,OAAO,UAAU,EAAE,MAAM,SAAS,UAAU,EAAE,CAAC;AAAA,EACrD;AAAA,EAES,YAA0C,CAAC,SAAS;AAC5D,QAAI,KAAK,QAAQ,SAAS;AACzB,UAAI,KAAK,OAAO,iBAAiB,EAAE,WAAY,QAAO;AACtD,YAAM,oBAAoB,KAAK,OAAO,qBAAqB;AAE3D,UACC,qBACA,KAAK,OAAO,aAAa,iBAAiB,EAAE,QAAQ,iBAAiB,GACpE;AACD,aAAK,OAAO,eAAe,QAAQ;AACnC,aAAK,OAAO,gBAAgB,kBAAkB,EAAE;AAChD,aAAK,OAAO,KAAK,WAAW,GAAG,WAAW,iBAAiB;AAAA,UAC1D,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,OAAO;AAAA,QACR,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA,EAES,WAAW,MAAM;AACzB,SAAK,OAAO,eAAe,QAAQ;AAAA,EACpC;AACD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -29,8 +29,7 @@ class Pointing extends StateNode {
|
|
|
29
29
|
]);
|
|
30
30
|
this.editor.select(id);
|
|
31
31
|
this.shape = this.editor.getShape(id);
|
|
32
|
-
if (!this.shape)
|
|
33
|
-
return;
|
|
32
|
+
if (!this.shape) return;
|
|
34
33
|
const { shape } = this;
|
|
35
34
|
this.editor.setCurrentTool("select.resizing", {
|
|
36
35
|
...info,
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/text/toolStates/Pointing.ts"],
|
|
4
4
|
"sourcesContent": ["import { StateNode, TLEventHandlers, TLTextShape, createShapeId } from '@bigbluebutton/editor'\n\nexport class Pointing extends StateNode {\n\tstatic override id = 'pointing'\n\n\tshape?: TLTextShape\n\n\tmarkId = ''\n\n\toverride onExit = () => {\n\t\tthis.editor.setHintingShapes([])\n\t}\n\n\toverride onPointerMove: TLEventHandlers['onPointerMove'] = (info) => {\n\t\tif (this.editor.inputs.isDragging) {\n\t\t\tconst {\n\t\t\t\tinputs: { originPagePoint },\n\t\t\t} = this.editor\n\n\t\t\tconst id = createShapeId()\n\n\t\t\tthis.markId = `creating:${id}`\n\t\t\tthis.editor.mark(this.markId)\n\n\t\t\tthis.editor.createShapes<TLTextShape>([\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tx: originPagePoint.x,\n\t\t\t\t\ty: originPagePoint.y,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\ttext: '',\n\t\t\t\t\t\tautoSize: false,\n\t\t\t\t\t\tw: 20,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\n\t\t\tthis.editor.select(id)\n\n\t\t\tthis.shape = this.editor.getShape(id)\n\t\t\tif (!this.shape) return\n\n\t\t\tconst { shape } = this\n\n\t\t\tthis.editor.setCurrentTool('select.resizing', {\n\t\t\t\t...info,\n\t\t\t\ttarget: 'selection',\n\t\t\t\thandle: 'right',\n\t\t\t\tisCreating: true,\n\t\t\t\tcreationCursorOffset: { x: 1, y: 1 },\n\t\t\t\tonInteractionEnd: 'text',\n\t\t\t\tonCreate: () => {\n\t\t\t\t\tthis.editor.setEditingShape(shape.id)\n\t\t\t\t\tthis.editor.setCurrentTool('select.editing_shape')\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n\n\toverride onPointerUp = () => {\n\t\tthis.complete()\n\t}\n\n\toverride onComplete = () => {\n\t\tthis.cancel()\n\t}\n\n\toverride onCancel = () => {\n\t\tthis.cancel()\n\t}\n\n\toverride onInterrupt = () => {\n\t\tthis.cancel()\n\t}\n\n\tprivate complete() {\n\t\tthis.editor.mark('creating text shape')\n\t\tconst id = createShapeId()\n\t\tconst { x, y } = this.editor.inputs.currentPagePoint\n\t\tthis.editor\n\t\t\t.createShapes([\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tx,\n\t\t\t\t\ty,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\ttext: '',\n\t\t\t\t\t\tautoSize: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t\t.select(id)\n\n\t\tthis.editor.setEditingShape(id)\n\t\tthis.editor.setCurrentTool('select')\n\t\tthis.editor.root.getCurrent()?.transition('editing_shape')\n\t}\n\n\tprivate cancel() {\n\t\tthis.parent.transition('idle')\n\t\tthis.editor.bailToMark(this.markId)\n\t}\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,WAAyC,qBAAqB;AAEhE,MAAM,iBAAiB,UAAU;AAAA,EACvC,OAAgB,KAAK;AAAA,EAErB;AAAA,EAEA,SAAS;AAAA,EAEA,SAAS,MAAM;AACvB,SAAK,OAAO,iBAAiB,CAAC,CAAC;AAAA,EAChC;AAAA,EAES,gBAAkD,CAAC,SAAS;AACpE,QAAI,KAAK,OAAO,OAAO,YAAY;AAClC,YAAM;AAAA,QACL,QAAQ,EAAE,gBAAgB;AAAA,MAC3B,IAAI,KAAK;AAET,YAAM,KAAK,cAAc;AAEzB,WAAK,SAAS,YAAY,EAAE;AAC5B,WAAK,OAAO,KAAK,KAAK,MAAM;AAE5B,WAAK,OAAO,aAA0B;AAAA,QACrC;AAAA,UACC;AAAA,UACA,MAAM;AAAA,UACN,GAAG,gBAAgB;AAAA,UACnB,GAAG,gBAAgB;AAAA,UACnB,OAAO;AAAA,YACN,MAAM;AAAA,YACN,UAAU;AAAA,YACV,GAAG;AAAA,UACJ;AAAA,QACD;AAAA,MACD,CAAC;AAED,WAAK,OAAO,OAAO,EAAE;AAErB,WAAK,QAAQ,KAAK,OAAO,SAAS,EAAE;AACpC,UAAI,CAAC,KAAK;
|
|
5
|
+
"mappings": "AAAA,SAAS,WAAyC,qBAAqB;AAEhE,MAAM,iBAAiB,UAAU;AAAA,EACvC,OAAgB,KAAK;AAAA,EAErB;AAAA,EAEA,SAAS;AAAA,EAEA,SAAS,MAAM;AACvB,SAAK,OAAO,iBAAiB,CAAC,CAAC;AAAA,EAChC;AAAA,EAES,gBAAkD,CAAC,SAAS;AACpE,QAAI,KAAK,OAAO,OAAO,YAAY;AAClC,YAAM;AAAA,QACL,QAAQ,EAAE,gBAAgB;AAAA,MAC3B,IAAI,KAAK;AAET,YAAM,KAAK,cAAc;AAEzB,WAAK,SAAS,YAAY,EAAE;AAC5B,WAAK,OAAO,KAAK,KAAK,MAAM;AAE5B,WAAK,OAAO,aAA0B;AAAA,QACrC;AAAA,UACC;AAAA,UACA,MAAM;AAAA,UACN,GAAG,gBAAgB;AAAA,UACnB,GAAG,gBAAgB;AAAA,UACnB,OAAO;AAAA,YACN,MAAM;AAAA,YACN,UAAU;AAAA,YACV,GAAG;AAAA,UACJ;AAAA,QACD;AAAA,MACD,CAAC;AAED,WAAK,OAAO,OAAO,EAAE;AAErB,WAAK,QAAQ,KAAK,OAAO,SAAS,EAAE;AACpC,UAAI,CAAC,KAAK,MAAO;AAEjB,YAAM,EAAE,MAAM,IAAI;AAElB,WAAK,OAAO,eAAe,mBAAmB;AAAA,QAC7C,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,sBAAsB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,QACnC,kBAAkB;AAAA,QAClB,UAAU,MAAM;AACf,eAAK,OAAO,gBAAgB,MAAM,EAAE;AACpC,eAAK,OAAO,eAAe,sBAAsB;AAAA,QAClD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAES,cAAc,MAAM;AAC5B,SAAK,SAAS;AAAA,EACf;AAAA,EAES,aAAa,MAAM;AAC3B,SAAK,OAAO;AAAA,EACb;AAAA,EAES,WAAW,MAAM;AACzB,SAAK,OAAO;AAAA,EACb;AAAA,EAES,cAAc,MAAM;AAC5B,SAAK,OAAO;AAAA,EACb;AAAA,EAEQ,WAAW;AAClB,SAAK,OAAO,KAAK,qBAAqB;AACtC,UAAM,KAAK,cAAc;AACzB,UAAM,EAAE,GAAG,EAAE,IAAI,KAAK,OAAO,OAAO;AACpC,SAAK,OACH,aAAa;AAAA,MACb;AAAA,QACC;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,OAAO;AAAA,UACN,MAAM;AAAA,UACN,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD,CAAC,EACA,OAAO,EAAE;AAEX,SAAK,OAAO,gBAAgB,EAAE;AAC9B,SAAK,OAAO,eAAe,QAAQ;AACnC,SAAK,OAAO,KAAK,WAAW,GAAG,WAAW,eAAe;AAAA,EAC1D;AAAA,EAEQ,SAAS;AAChB,SAAK,OAAO,WAAW,MAAM;AAC7B,SAAK,OAAO,WAAW,KAAK,MAAM;AAAA,EACnC;AACD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -52,8 +52,7 @@ function serializeVideo(id) {
|
|
|
52
52
|
canvas.height = video.videoHeight;
|
|
53
53
|
canvas.getContext("2d").drawImage(video, 0, 0);
|
|
54
54
|
return canvas.toDataURL("image/png");
|
|
55
|
-
} else
|
|
56
|
-
throw new Error("Video with id " + splitId + " not found");
|
|
55
|
+
} else throw new Error("Video with id " + splitId + " not found");
|
|
57
56
|
}
|
|
58
57
|
const TLVideoUtilComponent = track(function TLVideoUtilComponent2(props) {
|
|
59
58
|
const { shape, videoUtil } = props;
|
|
@@ -128,8 +127,7 @@ const TLVideoUtilComponent = track(function TLVideoUtilComponent2(props) {
|
|
|
128
127
|
);
|
|
129
128
|
React.useEffect(() => {
|
|
130
129
|
const video = rVideo.current;
|
|
131
|
-
if (!video)
|
|
132
|
-
return;
|
|
130
|
+
if (!video) return;
|
|
133
131
|
if (isLoaded && !isEditing && time !== video.currentTime) {
|
|
134
132
|
video.currentTime = time;
|
|
135
133
|
}
|