@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
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/shapes/frame/FrameShapeUtil.tsx"],
|
|
4
4
|
"sourcesContent": ["import {\n\tBaseBoxShapeUtil,\n\tGeometry2d,\n\tRectangle2d,\n\tSVGContainer,\n\tSelectionEdge,\n\tTLFrameShape,\n\tTLGroupShape,\n\tTLOnResizeEndHandler,\n\tTLOnResizeHandler,\n\tTLShape,\n\tTLShapeId,\n\tcanonicalizeRotation,\n\tframeShapeMigrations,\n\tframeShapeProps,\n\tgetDefaultColorTheme,\n\tlast,\n\tresizeBox,\n\ttoDomPrecision,\n\tuseValue,\n} from '@bigbluebutton/editor'\nimport classNames from 'classnames'\nimport { useDefaultColorTheme } from '../shared/ShapeFill'\nimport { createTextSvgElementFromSpans } from '../shared/createTextSvgElementFromSpans'\nimport { FrameHeading } from './components/FrameHeading'\n\nexport function defaultEmptyAs(str: string, dflt: string) {\n\tif (str.match(/^\\s*$/)) {\n\t\treturn dflt\n\t}\n\treturn str\n}\n\n/** @public */\nexport class FrameShapeUtil extends BaseBoxShapeUtil<TLFrameShape> {\n\tstatic override type = 'frame' as const\n\tstatic override props = frameShapeProps\n\tstatic override migrations = frameShapeMigrations\n\n\toverride canBind = () => true\n\n\toverride canEdit = () => true\n\n\toverride getDefaultProps(): TLFrameShape['props'] {\n\t\treturn { w: 160 * 2, h: 90 * 2, name: '' }\n\t}\n\n\toverride getGeometry(shape: TLFrameShape): Geometry2d {\n\t\treturn new Rectangle2d({\n\t\t\twidth: shape.props.w,\n\t\t\theight: shape.props.h,\n\t\t\tisFilled: false,\n\t\t})\n\t}\n\n\toverride component(shape: TLFrameShape) {\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst theme = useDefaultColorTheme()\n\n\t\t// eslint-disable-next-line react-hooks/rules-of-hooks\n\t\tconst isCreating = useValue(\n\t\t\t'is creating this shape',\n\t\t\t() => {\n\t\t\t\tconst resizingState = this.editor.getStateDescendant('select.resizing')\n\t\t\t\tif (!resizingState) return false\n\t\t\t\tif (!resizingState.getIsActive()) return false\n\t\t\t\tconst info = (resizingState as typeof resizingState & { info: { isCreating: boolean } })\n\t\t\t\t\t?.info\n\t\t\t\tif (!info) return false\n\t\t\t\treturn info.isCreating && this.editor.getOnlySelectedShape()?.id === shape.id\n\t\t\t},\n\t\t\t[shape.id]\n\t\t)\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<SVGContainer>\n\t\t\t\t\t<rect\n\t\t\t\t\t\tclassName={classNames('tl-frame__body', { 'tl-frame__creating': isCreating })}\n\t\t\t\t\t\twidth={bounds.width}\n\t\t\t\t\t\theight={bounds.height}\n\t\t\t\t\t\tfill={theme.solid}\n\t\t\t\t\t\tstroke={theme.text}\n\t\t\t\t\t/>\n\t\t\t\t</SVGContainer>\n\t\t\t\t{isCreating ? null : (\n\t\t\t\t\t<FrameHeading\n\t\t\t\t\t\tid={shape.id}\n\t\t\t\t\t\tname={shape.props.name}\n\t\t\t\t\t\twidth={bounds.width}\n\t\t\t\t\t\theight={bounds.height}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t)\n\t}\n\n\toverride toSvg(shape: TLFrameShape): SVGElement | Promise<SVGElement> {\n\t\tconst theme = getDefaultColorTheme({ isDarkMode: this.editor.user.getIsDarkMode() })\n\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\n\t\tconst rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\trect.setAttribute('width', shape.props.w.toString())\n\t\trect.setAttribute('height', shape.props.h.toString())\n\t\trect.setAttribute('fill', theme.solid)\n\t\trect.setAttribute('stroke', theme.black.solid)\n\t\trect.setAttribute('stroke-width', '1')\n\t\trect.setAttribute('rx', '1')\n\t\trect.setAttribute('ry', '1')\n\t\tg.appendChild(rect)\n\n\t\t// Text label\n\t\tconst pageRotation = canonicalizeRotation(\n\t\t\tthis.editor.getShapePageTransform(shape.id)!.rotation()\n\t\t)\n\t\t// rotate right 45 deg\n\t\tconst offsetRotation = pageRotation + Math.PI / 4\n\t\tconst scaledRotation = (offsetRotation * (2 / Math.PI) + 4) % 4\n\t\tconst labelSide: SelectionEdge = (['top', 'left', 'bottom', 'right'] as const)[\n\t\t\tMath.floor(scaledRotation)\n\t\t]\n\n\t\tlet labelTranslate: string\n\t\tswitch (labelSide) {\n\t\t\tcase 'top':\n\t\t\t\tlabelTranslate = ``\n\t\t\t\tbreak\n\t\t\tcase 'right':\n\t\t\t\tlabelTranslate = `translate(${toDomPrecision(shape.props.w)}px, 0px) rotate(90deg)`\n\t\t\t\tbreak\n\t\t\tcase 'bottom':\n\t\t\t\tlabelTranslate = `translate(${toDomPrecision(shape.props.w)}px, ${toDomPrecision(\n\t\t\t\t\tshape.props.h\n\t\t\t\t)}px) rotate(180deg)`\n\t\t\t\tbreak\n\t\t\tcase 'left':\n\t\t\t\tlabelTranslate = `translate(0px, ${toDomPrecision(shape.props.h)}px) rotate(270deg)`\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tlabelTranslate = ``\n\t\t}\n\n\t\t// Truncate with ellipsis\n\t\tconst opts = {\n\t\t\tfontSize: 12,\n\t\t\tfontFamily: 'Inter, sans-serif',\n\t\t\ttextAlign: 'start' as const,\n\t\t\twidth: shape.props.w,\n\t\t\theight: 32,\n\t\t\tpadding: 0,\n\t\t\tlineHeight: 1,\n\t\t\tfontStyle: 'normal',\n\t\t\tfontWeight: 'normal',\n\t\t\toverflow: 'truncate-ellipsis' as const,\n\t\t\tverticalTextAlign: 'middle' as const,\n\t\t}\n\n\t\tconst spans = this.editor.textMeasure.measureTextSpans(\n\t\t\tdefaultEmptyAs(shape.props.name, 'Frame') + String.fromCharCode(8203),\n\t\t\topts\n\t\t)\n\n\t\tconst firstSpan = spans[0]\n\t\tconst lastSpan = last(spans)!\n\t\tconst labelTextWidth = lastSpan.box.w + lastSpan.box.x - firstSpan.box.x\n\t\tconst text = createTextSvgElementFromSpans(this.editor, spans, {\n\t\t\toffsetY: -opts.height - 2,\n\t\t\t...opts,\n\t\t})\n\t\ttext.style.setProperty('transform', labelTranslate)\n\n\t\tconst textBg = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n\t\ttextBg.setAttribute('x', '-8px')\n\t\ttextBg.setAttribute('y', -opts.height - 4 + 'px')\n\t\ttextBg.setAttribute('width', labelTextWidth + 16 + 'px')\n\t\ttextBg.setAttribute('height', `${opts.height}px`)\n\t\ttextBg.setAttribute('rx', 4 + 'px')\n\t\ttextBg.setAttribute('ry', 4 + 'px')\n\t\ttextBg.setAttribute('fill', theme.background)\n\n\t\tg.appendChild(textBg)\n\t\tg.appendChild(text)\n\n\t\treturn g\n\t}\n\n\tindicator(shape: TLFrameShape) {\n\t\tconst bounds = this.editor.getShapeGeometry(shape).bounds\n\n\t\treturn (\n\t\t\t<rect\n\t\t\t\twidth={toDomPrecision(bounds.width)}\n\t\t\t\theight={toDomPrecision(bounds.height)}\n\t\t\t\tclassName={`tl-frame-indicator`}\n\t\t\t/>\n\t\t)\n\t}\n\n\toverride canReceiveNewChildrenOfType = (shape: TLShape, _type: TLShape['type']) => {\n\t\treturn !shape.isLocked\n\t}\n\n\toverride providesBackgroundForChildren(): boolean {\n\t\treturn true\n\t}\n\n\toverride canDropShapes = (shape: TLFrameShape, _shapes: TLShape[]): boolean => {\n\t\treturn !shape.isLocked\n\t}\n\n\toverride onDragShapesOver = (frame: TLFrameShape, shapes: TLShape[]): { shouldHint: boolean } => {\n\t\tif (!shapes.every((child) => child.parentId === frame.id)) {\n\t\t\tthis.editor.reparentShapes(\n\t\t\t\tshapes.map((shape) => shape.id),\n\t\t\t\tframe.id\n\t\t\t)\n\t\t\treturn { shouldHint: true }\n\t\t}\n\t\treturn { shouldHint: false }\n\t}\n\n\toverride onDragShapesOut = (_shape: TLFrameShape, shapes: TLShape[]): void => {\n\t\tconst parent = this.editor.getShape(_shape.parentId)\n\t\tconst isInGroup = parent && this.editor.isShapeOfType<TLGroupShape>(parent, 'group')\n\n\t\t// If frame is in a group, keep the shape\n\t\t// moved out in that group\n\n\t\tif (isInGroup) {\n\t\t\tthis.editor.reparentShapes(shapes, parent.id)\n\t\t} else {\n\t\t\tthis.editor.reparentShapes(shapes, this.editor.getCurrentPageId())\n\t\t}\n\t}\n\n\toverride onResizeEnd: TLOnResizeEndHandler<TLFrameShape> = (shape) => {\n\t\tconst bounds = this.editor.getShapePageBounds(shape)!\n\t\tconst children = this.editor.getSortedChildIdsForParent(shape.id)\n\n\t\tconst shapesToReparent: TLShapeId[] = []\n\n\t\tfor (const childId of children) {\n\t\t\tconst childBounds = this.editor.getShapePageBounds(childId)!\n\t\t\tif (!bounds.includes(childBounds)) {\n\t\t\t\tshapesToReparent.push(childId)\n\t\t\t}\n\t\t}\n\n\t\tif (shapesToReparent.length > 0) {\n\t\t\tthis.editor.reparentShapes(shapesToReparent, this.editor.getCurrentPageId())\n\t\t}\n\t}\n\n\toverride onResize: TLOnResizeHandler<any> = (shape, info) => {\n\t\treturn resizeBox(shape, info)\n\t}\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4EG;AA5EH,oBAoBO;AACP,wBAAuB;AACvB,uBAAqC;AACrC,2CAA8C;AAC9C,0BAA6B;AAEtB,SAAS,eAAe,KAAa,MAAc;AACzD,MAAI,IAAI,MAAM,OAAO,GAAG;AACvB,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAGO,MAAM,uBAAuB,+BAA+B;AAAA,EAClE,OAAgB,OAAO;AAAA,EACvB,OAAgB,QAAQ;AAAA,EACxB,OAAgB,aAAa;AAAA,EAEpB,UAAU,MAAM;AAAA,EAEhB,UAAU,MAAM;AAAA,EAEhB,kBAAyC;AACjD,WAAO,EAAE,GAAG,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,GAAG;AAAA,EAC1C;AAAA,EAES,YAAY,OAAiC;AACrD,WAAO,IAAI,0BAAY;AAAA,MACtB,OAAO,MAAM,MAAM;AAAA,MACnB,QAAQ,MAAM,MAAM;AAAA,MACpB,UAAU;AAAA,IACX,CAAC;AAAA,EACF;AAAA,EAES,UAAU,OAAqB;AACvC,UAAM,SAAS,KAAK,OAAO,iBAAiB,KAAK,EAAE;AAEnD,UAAM,YAAQ,uCAAqB;AAGnC,UAAM,iBAAa;AAAA,MAClB;AAAA,MACA,MAAM;AACL,cAAM,gBAAgB,KAAK,OAAO,mBAAmB,iBAAiB;AACtE,YAAI,CAAC
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["classNames"]
|
|
7
7
|
}
|
|
@@ -42,8 +42,7 @@ const FrameHeading = function FrameHeading2({
|
|
|
42
42
|
const handlePointerDown = (0, import_react.useCallback)(
|
|
43
43
|
(e) => {
|
|
44
44
|
const event = (0, import_editor.getPointerInfo)(e);
|
|
45
|
-
if (editor.getEditingShapeId() === id)
|
|
46
|
-
return;
|
|
45
|
+
if (editor.getEditingShapeId() === id) return;
|
|
47
46
|
editor.dispatch({
|
|
48
47
|
type: "pointer",
|
|
49
48
|
name: "pointer_down",
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/frame/components/FrameHeading.tsx"],
|
|
4
4
|
"sourcesContent": ["import {\n\tSelectionEdge,\n\tTLShapeId,\n\tcanonicalizeRotation,\n\tgetPointerInfo,\n\ttoDomPrecision,\n\tuseEditor,\n\tuseIsEditing,\n\tuseValue,\n} from '@bigbluebutton/editor'\nimport { useCallback, useEffect, useRef } from 'react'\nimport { FrameLabelInput } from './FrameLabelInput'\n\nexport const FrameHeading = function FrameHeading({\n\tid,\n\tname,\n\twidth,\n\theight,\n}: {\n\tid: TLShapeId\n\tname: string\n\twidth: number\n\theight: number\n}) {\n\tconst editor = useEditor()\n\tconst pageRotation = useValue(\n\t\t'shape rotation',\n\t\t() => canonicalizeRotation(editor.getShapePageTransform(id)!.rotation()),\n\t\t[editor, id]\n\t)\n\n\tconst isEditing = useIsEditing(id)\n\n\tconst rInput = useRef<HTMLInputElement>(null)\n\n\tconst handlePointerDown = useCallback(\n\t\t(e: React.PointerEvent) => {\n\t\t\tconst event = getPointerInfo(e)\n\n\t\t\t// If we're editing the frame label, we shouldn't hijack the pointer event\n\t\t\tif (editor.getEditingShapeId() === id) return\n\n\t\t\teditor.dispatch({\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\t...event,\n\t\t\t})\n\t\t\te.preventDefault()\n\t\t},\n\t\t[editor, id]\n\t)\n\n\tuseEffect(() => {\n\t\tconst el = rInput.current\n\t\tif (el && isEditing) {\n\t\t\t// On iOS, we must focus here\n\t\t\tel.focus()\n\t\t\tel.select()\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\t// On desktop, the input may have lost focus, so try try try again!\n\t\t\t\tif (document.activeElement !== el) {\n\t\t\t\t\tel.focus()\n\t\t\t\t\tel.select()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}, [rInput, isEditing])\n\n\t// rotate right 45 deg\n\tconst offsetRotation = pageRotation + Math.PI / 4\n\tconst scaledRotation = (offsetRotation * (2 / Math.PI) + 4) % 4\n\tconst labelSide: SelectionEdge = (['top', 'left', 'bottom', 'right'] as const)[\n\t\tMath.floor(scaledRotation)\n\t]\n\n\tlet labelTranslate: string\n\tswitch (labelSide) {\n\t\tcase 'top':\n\t\t\tlabelTranslate = ``\n\t\t\tbreak\n\t\tcase 'right':\n\t\t\tlabelTranslate = `translate(${toDomPrecision(width)}px, 0px) rotate(90deg)`\n\t\t\tbreak\n\t\tcase 'bottom':\n\t\t\tlabelTranslate = `translate(${toDomPrecision(width)}px, ${toDomPrecision(\n\t\t\t\theight\n\t\t\t)}px) rotate(180deg)`\n\t\t\tbreak\n\t\tcase 'left':\n\t\t\tlabelTranslate = `translate(0px, ${toDomPrecision(height)}px) rotate(270deg)`\n\t\t\tbreak\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"tl-frame-heading\"\n\t\t\tstyle={{\n\t\t\t\toverflow: isEditing ? 'visible' : 'hidden',\n\t\t\t\tmaxWidth: `calc(var(--tl-zoom) * ${\n\t\t\t\t\tlabelSide === 'top' || labelSide === 'bottom' ? Math.ceil(width) : Math.ceil(height)\n\t\t\t\t}px + var(--space-5))`,\n\t\t\t\tbottom: '100%',\n\t\t\t\ttransform: `${labelTranslate} scale(var(--tl-scale)) translateX(calc(-1 * var(--space-3))`,\n\t\t\t}}\n\t\t\tonPointerDown={handlePointerDown}\n\t\t>\n\t\t\t<div className=\"tl-frame-heading-hit-area\">\n\t\t\t\t<FrameLabelInput ref={rInput} id={id} name={name} isEditing={isEditing} />\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8GI;AA9GJ,oBASO;AACP,mBAA+C;AAC/C,6BAAgC;AAEzB,MAAM,eAAe,SAASA,cAAa;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAKG;AACF,QAAM,aAAS,yBAAU;AACzB,QAAM,mBAAe;AAAA,IACpB;AAAA,IACA,UAAM,oCAAqB,OAAO,sBAAsB,EAAE,EAAG,SAAS,CAAC;AAAA,IACvE,CAAC,QAAQ,EAAE;AAAA,EACZ;AAEA,QAAM,gBAAY,4BAAa,EAAE;AAEjC,QAAM,aAAS,qBAAyB,IAAI;AAE5C,QAAM,wBAAoB;AAAA,IACzB,CAAC,MAA0B;AAC1B,YAAM,YAAQ,8BAAe,CAAC;AAG9B,UAAI,OAAO,kBAAkB,MAAM;
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8GI;AA9GJ,oBASO;AACP,mBAA+C;AAC/C,6BAAgC;AAEzB,MAAM,eAAe,SAASA,cAAa;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,GAKG;AACF,QAAM,aAAS,yBAAU;AACzB,QAAM,mBAAe;AAAA,IACpB;AAAA,IACA,UAAM,oCAAqB,OAAO,sBAAsB,EAAE,EAAG,SAAS,CAAC;AAAA,IACvE,CAAC,QAAQ,EAAE;AAAA,EACZ;AAEA,QAAM,gBAAY,4BAAa,EAAE;AAEjC,QAAM,aAAS,qBAAyB,IAAI;AAE5C,QAAM,wBAAoB;AAAA,IACzB,CAAC,MAA0B;AAC1B,YAAM,YAAQ,8BAAe,CAAC;AAG9B,UAAI,OAAO,kBAAkB,MAAM,GAAI;AAEvC,aAAO,SAAS;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO,OAAO,SAAS,EAAE;AAAA,QACzB,GAAG;AAAA,MACJ,CAAC;AACD,QAAE,eAAe;AAAA,IAClB;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,EACZ;AAEA,8BAAU,MAAM;AACf,UAAM,KAAK,OAAO;AAClB,QAAI,MAAM,WAAW;AAEpB,SAAG,MAAM;AACT,SAAG,OAAO;AAEV,4BAAsB,MAAM;AAE3B,YAAI,SAAS,kBAAkB,IAAI;AAClC,aAAG,MAAM;AACT,aAAG,OAAO;AAAA,QACX;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD,GAAG,CAAC,QAAQ,SAAS,CAAC;AAGtB,QAAM,iBAAiB,eAAe,KAAK,KAAK;AAChD,QAAM,kBAAkB,kBAAkB,IAAI,KAAK,MAAM,KAAK;AAC9D,QAAM,YAA4B,CAAC,OAAO,QAAQ,UAAU,OAAO,EAClE,KAAK,MAAM,cAAc,CAC1B;AAEA,MAAI;AACJ,UAAQ,WAAW;AAAA,IAClB,KAAK;AACJ,uBAAiB;AACjB;AAAA,IACD,KAAK;AACJ,uBAAiB,iBAAa,8BAAe,KAAK,CAAC;AACnD;AAAA,IACD,KAAK;AACJ,uBAAiB,iBAAa,8BAAe,KAAK,CAAC,WAAO;AAAA,QACzD;AAAA,MACD,CAAC;AACD;AAAA,IACD,KAAK;AACJ,uBAAiB,sBAAkB,8BAAe,MAAM,CAAC;AACzD;AAAA,EACF;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAU;AAAA,MACV,OAAO;AAAA,QACN,UAAU,YAAY,YAAY;AAAA,QAClC,UAAU,yBACT,cAAc,SAAS,cAAc,WAAW,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,CACpF;AAAA,QACA,QAAQ;AAAA,QACR,WAAW,GAAG,cAAc;AAAA,MAC7B;AAAA,MACA,eAAe;AAAA,MAEf,sDAAC,SAAI,WAAU,6BACd,sDAAC,0CAAgB,KAAK,QAAQ,IAAQ,MAAY,WAAsB,GACzE;AAAA;AAAA,EACD;AAEF;",
|
|
6
6
|
"names": ["FrameHeading"]
|
|
7
7
|
}
|
|
@@ -40,12 +40,10 @@ const FrameLabelInput = (0, import_react.forwardRef)(({ id, name, isEditing }, r
|
|
|
40
40
|
const handleBlur = (0, import_react.useCallback)(
|
|
41
41
|
(e) => {
|
|
42
42
|
const shape = editor.getShape(id);
|
|
43
|
-
if (!shape)
|
|
44
|
-
return;
|
|
43
|
+
if (!shape) return;
|
|
45
44
|
const name2 = shape.props.name;
|
|
46
45
|
const value = e.currentTarget.value.trim();
|
|
47
|
-
if (name2 === value)
|
|
48
|
-
return;
|
|
46
|
+
if (name2 === value) return;
|
|
49
47
|
editor.updateShapes(
|
|
50
48
|
[
|
|
51
49
|
{
|
|
@@ -62,12 +60,10 @@ const FrameLabelInput = (0, import_react.forwardRef)(({ id, name, isEditing }, r
|
|
|
62
60
|
const handleChange = (0, import_react.useCallback)(
|
|
63
61
|
(e) => {
|
|
64
62
|
const shape = editor.getShape(id);
|
|
65
|
-
if (!shape)
|
|
66
|
-
return;
|
|
63
|
+
if (!shape) return;
|
|
67
64
|
const name2 = shape.props.name;
|
|
68
65
|
const value = e.currentTarget.value;
|
|
69
|
-
if (name2 === value)
|
|
70
|
-
return;
|
|
66
|
+
if (name2 === value) return;
|
|
71
67
|
editor.updateShapes(
|
|
72
68
|
[
|
|
73
69
|
{
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/frame/components/FrameLabelInput.tsx"],
|
|
4
4
|
"sourcesContent": ["import { TLFrameShape, TLShapeId, stopEventPropagation, useEditor } from '@bigbluebutton/editor'\nimport { forwardRef, useCallback } from 'react'\nimport { defaultEmptyAs } from '../FrameShapeUtil'\n\nexport const FrameLabelInput = forwardRef<\n\tHTMLInputElement,\n\t{ id: TLShapeId; name: string; isEditing: boolean }\n>(({ id, name, isEditing }, ref) => {\n\tconst editor = useEditor()\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === 'Enter' && !e.nativeEvent.isComposing) {\n\t\t\t\t// need to prevent the enter keydown making it's way up to the Idle state\n\t\t\t\t// and sending us back into edit mode\n\t\t\t\tstopEventPropagation(e)\n\t\t\t\te.currentTarget.blur()\n\t\t\t\teditor.setEditingShape(null)\n\t\t\t}\n\t\t},\n\t\t[editor]\n\t)\n\n\tconst handleBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tconst shape = editor.getShape<TLFrameShape>(id)\n\t\t\tif (!shape) return\n\n\t\t\tconst name = shape.props.name\n\t\t\tconst value = e.currentTarget.value.trim()\n\t\t\tif (name === value) return\n\n\t\t\teditor.updateShapes(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttype: 'frame',\n\t\t\t\t\t\tprops: { name: value },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t{ squashing: true }\n\t\t\t)\n\t\t},\n\t\t[id, editor]\n\t)\n\n\tconst handleChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst shape = editor.getShape<TLFrameShape>(id)\n\t\t\tif (!shape) return\n\n\t\t\tconst name = shape.props.name\n\t\t\tconst value = e.currentTarget.value\n\t\t\tif (name === value) return\n\n\t\t\teditor.updateShapes(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttype: 'frame',\n\t\t\t\t\t\tprops: { name: value },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t{ squashing: true }\n\t\t\t)\n\t\t},\n\t\t[id, editor]\n\t)\n\n\treturn (\n\t\t<div className={`tl-frame-label ${isEditing ? 'tl-frame-label__editing' : ''}`}>\n\t\t\t<input\n\t\t\t\tclassName=\"tl-frame-name-input\"\n\t\t\t\tref={ref}\n\t\t\t\tstyle={{ display: isEditing ? undefined : 'none' }}\n\t\t\t\tvalue={name}\n\t\t\t\tautoFocus\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tonBlur={handleBlur}\n\t\t\t\tonChange={handleChange}\n\t\t\t/>\n\t\t\t{defaultEmptyAs(name, 'Frame') + String.fromCharCode(8203)}\n\t\t</div>\n\t)\n})\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEE;AAtEF,oBAAyE;AACzE,mBAAwC;AACxC,4BAA+B;AAExB,MAAM,sBAAkB,yBAG7B,CAAC,EAAE,IAAI,MAAM,UAAU,GAAG,QAAQ;AACnC,QAAM,aAAS,yBAAU;AAEzB,QAAM,oBAAgB;AAAA,IACrB,CAAC,MAA6C;AAC7C,UAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAY,aAAa;AAGpD,gDAAqB,CAAC;AACtB,UAAE,cAAc,KAAK;AACrB,eAAO,gBAAgB,IAAI;AAAA,MAC5B;AAAA,IACD;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AAEA,QAAM,iBAAa;AAAA,IAClB,CAAC,MAA0C;AAC1C,YAAM,QAAQ,OAAO,SAAuB,EAAE;AAC9C,UAAI,CAAC;
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEE;AAtEF,oBAAyE;AACzE,mBAAwC;AACxC,4BAA+B;AAExB,MAAM,sBAAkB,yBAG7B,CAAC,EAAE,IAAI,MAAM,UAAU,GAAG,QAAQ;AACnC,QAAM,aAAS,yBAAU;AAEzB,QAAM,oBAAgB;AAAA,IACrB,CAAC,MAA6C;AAC7C,UAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAY,aAAa;AAGpD,gDAAqB,CAAC;AACtB,UAAE,cAAc,KAAK;AACrB,eAAO,gBAAgB,IAAI;AAAA,MAC5B;AAAA,IACD;AAAA,IACA,CAAC,MAAM;AAAA,EACR;AAEA,QAAM,iBAAa;AAAA,IAClB,CAAC,MAA0C;AAC1C,YAAM,QAAQ,OAAO,SAAuB,EAAE;AAC9C,UAAI,CAAC,MAAO;AAEZ,YAAMA,QAAO,MAAM,MAAM;AACzB,YAAM,QAAQ,EAAE,cAAc,MAAM,KAAK;AACzC,UAAIA,UAAS,MAAO;AAEpB,aAAO;AAAA,QACN;AAAA,UACC;AAAA,YACC;AAAA,YACA,MAAM;AAAA,YACN,OAAO,EAAE,MAAM,MAAM;AAAA,UACtB;AAAA,QACD;AAAA,QACA,EAAE,WAAW,KAAK;AAAA,MACnB;AAAA,IACD;AAAA,IACA,CAAC,IAAI,MAAM;AAAA,EACZ;AAEA,QAAM,mBAAe;AAAA,IACpB,CAAC,MAA2C;AAC3C,YAAM,QAAQ,OAAO,SAAuB,EAAE;AAC9C,UAAI,CAAC,MAAO;AAEZ,YAAMA,QAAO,MAAM,MAAM;AACzB,YAAM,QAAQ,EAAE,cAAc;AAC9B,UAAIA,UAAS,MAAO;AAEpB,aAAO;AAAA,QACN;AAAA,UACC;AAAA,YACC;AAAA,YACA,MAAM;AAAA,YACN,OAAO,EAAE,MAAM,MAAM;AAAA,UACtB;AAAA,QACD;AAAA,QACA,EAAE,WAAW,KAAK;AAAA,MACnB;AAAA,IACD;AAAA,IACA,CAAC,IAAI,MAAM;AAAA,EACZ;AAEA,SACC,6CAAC,SAAI,WAAW,kBAAkB,YAAY,4BAA4B,EAAE,IAC3E;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,WAAU;AAAA,QACV;AAAA,QACA,OAAO,EAAE,SAAS,YAAY,SAAY,OAAO;AAAA,QACjD,OAAO;AAAA,QACP,WAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU;AAAA;AAAA,IACX;AAAA,QACC,sCAAe,MAAM,OAAO,IAAI,OAAO,aAAa,IAAI;AAAA,KAC1D;AAEF,CAAC;",
|
|
6
6
|
"names": ["name"]
|
|
7
7
|
}
|
|
@@ -32,8 +32,7 @@ class Idle extends import_editor.StateNode {
|
|
|
32
32
|
};
|
|
33
33
|
onKeyUp = (info) => {
|
|
34
34
|
if (info.key === "Enter") {
|
|
35
|
-
if (this.editor.getInstanceState().isReadonly)
|
|
36
|
-
return null;
|
|
35
|
+
if (this.editor.getInstanceState().isReadonly) return null;
|
|
37
36
|
const onlySelectedShape = this.editor.getOnlySelectedShape();
|
|
38
37
|
if (onlySelectedShape && this.editor.getShapeUtil(onlySelectedShape).canEdit(onlySelectedShape)) {
|
|
39
38
|
this.editor.setCurrentTool("select");
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/geo/toolStates/Idle.ts"],
|
|
4
4
|
"sourcesContent": ["import { StateNode, TLEventHandlers } from '@bigbluebutton/editor'\n\nexport class Idle extends StateNode {\n\tstatic override id = 'idle'\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 onKeyUp: TLEventHandlers['onKeyUp'] = (info) => {\n\t\tif (info.key === 'Enter') {\n\t\t\tif (this.editor.getInstanceState().isReadonly) return null\n\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;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA2C;AAEpC,MAAM,aAAa,wBAAU;AAAA,EACnC,OAAgB,KAAK;AAAA,EAEZ,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,UAAsC,CAAC,SAAS;AACxD,QAAI,KAAK,QAAQ,SAAS;AACzB,UAAI,KAAK,OAAO,iBAAiB,EAAE
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA2C;AAEpC,MAAM,aAAa,wBAAU;AAAA,EACnC,OAAgB,KAAK;AAAA,EAEZ,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,UAAsC,CAAC,SAAS;AACxD,QAAI,KAAK,QAAQ,SAAS;AACzB,UAAI,KAAK,OAAO,iBAAiB,EAAE,WAAY,QAAO;AAEtD,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
|
}
|
|
@@ -84,13 +84,11 @@ class Pointing extends import_editor.StateNode {
|
|
|
84
84
|
}
|
|
85
85
|
]);
|
|
86
86
|
const shape = this.editor.getShape(id);
|
|
87
|
-
if (!shape)
|
|
88
|
-
return;
|
|
87
|
+
if (!shape) return;
|
|
89
88
|
const bounds = shape.props.geo === "star" ? (0, import_editor.getStarBounds)(5, 200, 200) : shape.props.geo === "cloud" ? new import_editor.Box2d(0, 0, 300, 180) : new import_editor.Box2d(0, 0, 200, 200);
|
|
90
89
|
const delta = bounds.center;
|
|
91
90
|
const parentTransform = this.editor.getShapeParentTransform(shape);
|
|
92
|
-
if (parentTransform)
|
|
93
|
-
delta.rot(-parentTransform.rotation());
|
|
91
|
+
if (parentTransform) delta.rot(-parentTransform.rotation());
|
|
94
92
|
this.editor.select(id);
|
|
95
93
|
this.editor.updateShapes([
|
|
96
94
|
{
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/geo/toolStates/Pointing.ts"],
|
|
4
4
|
"sourcesContent": ["import {\n\tBox2d,\n\tGeoShapeGeoStyle,\n\tStateNode,\n\tTLEventHandlers,\n\tTLGeoShape,\n\tcreateShapeId,\n\tgetStarBounds,\n} from '@bigbluebutton/editor'\n\nexport class Pointing extends StateNode {\n\tstatic override id = 'pointing'\n\n\tmarkId = ''\n\n\toverride onPointerUp: TLEventHandlers['onPointerUp'] = () => {\n\t\tthis.complete()\n\t}\n\n\toverride onPointerMove: TLEventHandlers['onPointerMove'] = (info) => {\n\t\tif (this.editor.inputs.isDragging) {\n\t\t\tconst { originPagePoint } = this.editor.inputs\n\n\t\t\tconst id = createShapeId()\n\n\t\t\tthis.markId = `creating:${id}`\n\n\t\t\tthis.editor.mark(this.markId)\n\n\t\t\tthis.editor\n\t\t\t\t.createShapes<TLGeoShape>([\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\ttype: 'geo',\n\t\t\t\t\t\tx: originPagePoint.x,\n\t\t\t\t\t\ty: originPagePoint.y,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tw: 1,\n\t\t\t\t\t\t\th: 1,\n\t\t\t\t\t\t\tgeo: this.editor.getStyleForNextShape(GeoShapeGeoStyle),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t])\n\t\t\t\t.select(id)\n\t\t\t\t.setCurrentTool('select.resizing', {\n\t\t\t\t\t...info,\n\t\t\t\t\ttarget: 'selection',\n\t\t\t\t\thandle: 'bottom_right',\n\t\t\t\t\tisCreating: true,\n\t\t\t\t\tcreationCursorOffset: { x: 1, y: 1 },\n\t\t\t\t\tonInteractionEnd: 'geo',\n\t\t\t\t})\n\t\t}\n\t}\n\n\toverride onCancel: TLEventHandlers['onCancel'] = () => {\n\t\tthis.cancel()\n\t}\n\n\toverride onComplete: TLEventHandlers['onComplete'] = () => {\n\t\tthis.complete()\n\t}\n\n\toverride onInterrupt: TLEventHandlers['onInterrupt'] = () => {\n\t\tthis.cancel()\n\t}\n\n\tprivate complete() {\n\t\tconst { originPagePoint } = this.editor.inputs\n\n\t\tconst id = createShapeId()\n\n\t\tthis.markId = `creating:${id}`\n\n\t\tthis.editor.mark(this.markId)\n\n\t\tthis.editor.createShapes<TLGeoShape>([\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\ttype: 'geo',\n\t\t\t\tx: originPagePoint.x,\n\t\t\t\ty: originPagePoint.y,\n\t\t\t\tprops: {\n\t\t\t\t\tgeo: this.editor.getStyleForNextShape(GeoShapeGeoStyle),\n\t\t\t\t\tw: 1,\n\t\t\t\t\th: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\n\t\tconst shape = this.editor.getShape<TLGeoShape>(id)!\n\t\tif (!shape) return\n\n\t\tconst bounds =\n\t\t\tshape.props.geo === 'star'\n\t\t\t\t? getStarBounds(5, 200, 200)\n\t\t\t\t: shape.props.geo === 'cloud'\n\t\t\t\t? new Box2d(0, 0, 300, 180)\n\t\t\t\t: new Box2d(0, 0, 200, 200)\n\n\t\tconst delta = bounds.center\n\t\tconst parentTransform = this.editor.getShapeParentTransform(shape)\n\t\tif (parentTransform) delta.rot(-parentTransform.rotation())\n\n\t\tthis.editor.select(id)\n\t\tthis.editor.updateShapes<TLGeoShape>([\n\t\t\t{\n\t\t\t\tid: shape.id,\n\t\t\t\ttype: 'geo',\n\t\t\t\tx: shape.x - delta.x,\n\t\t\t\ty: shape.y - delta.y,\n\t\t\t\tprops: {\n\t\t\t\t\tgeo: this.editor.getStyleForNextShape(GeoShapeGeoStyle),\n\t\t\t\t\tw: bounds.width,\n\t\t\t\t\th: bounds.height,\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\n\t\tif (this.editor.getInstanceState().isToolLocked) {\n\t\t\tthis.parent.transition('idle')\n\t\t} else {\n\t\t\tthis.editor.setCurrentTool('select', {})\n\t\t}\n\t}\n\n\tprivate cancel() {\n\t\t// we should not have created any shapes yet, so no need to bail\n\t\tthis.parent.transition('idle')\n\t}\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAQO;AAEA,MAAM,iBAAiB,wBAAU;AAAA,EACvC,OAAgB,KAAK;AAAA,EAErB,SAAS;AAAA,EAEA,cAA8C,MAAM;AAC5D,SAAK,SAAS;AAAA,EACf;AAAA,EAES,gBAAkD,CAAC,SAAS;AACpE,QAAI,KAAK,OAAO,OAAO,YAAY;AAClC,YAAM,EAAE,gBAAgB,IAAI,KAAK,OAAO;AAExC,YAAM,SAAK,6BAAc;AAEzB,WAAK,SAAS,YAAY,EAAE;AAE5B,WAAK,OAAO,KAAK,KAAK,MAAM;AAE5B,WAAK,OACH,aAAyB;AAAA,QACzB;AAAA,UACC;AAAA,UACA,MAAM;AAAA,UACN,GAAG,gBAAgB;AAAA,UACnB,GAAG,gBAAgB;AAAA,UACnB,OAAO;AAAA,YACN,GAAG;AAAA,YACH,GAAG;AAAA,YACH,KAAK,KAAK,OAAO,qBAAqB,8BAAgB;AAAA,UACvD;AAAA,QACD;AAAA,MACD,CAAC,EACA,OAAO,EAAE,EACT,eAAe,mBAAmB;AAAA,QAClC,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,sBAAsB,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,QACnC,kBAAkB;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACD;AAAA,EAES,WAAwC,MAAM;AACtD,SAAK,OAAO;AAAA,EACb;AAAA,EAES,aAA4C,MAAM;AAC1D,SAAK,SAAS;AAAA,EACf;AAAA,EAES,cAA8C,MAAM;AAC5D,SAAK,OAAO;AAAA,EACb;AAAA,EAEQ,WAAW;AAClB,UAAM,EAAE,gBAAgB,IAAI,KAAK,OAAO;AAExC,UAAM,SAAK,6BAAc;AAEzB,SAAK,SAAS,YAAY,EAAE;AAE5B,SAAK,OAAO,KAAK,KAAK,MAAM;AAE5B,SAAK,OAAO,aAAyB;AAAA,MACpC;AAAA,QACC;AAAA,QACA,MAAM;AAAA,QACN,GAAG,gBAAgB;AAAA,QACnB,GAAG,gBAAgB;AAAA,QACnB,OAAO;AAAA,UACN,KAAK,KAAK,OAAO,qBAAqB,8BAAgB;AAAA,UACtD,GAAG;AAAA,UACH,GAAG;AAAA,QACJ;AAAA,MACD;AAAA,IACD,CAAC;AAED,UAAM,QAAQ,KAAK,OAAO,SAAqB,EAAE;AACjD,QAAI,CAAC;
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -41,8 +41,7 @@ const getStateFrame = async (url) => {
|
|
|
41
41
|
canvas.width = image.width;
|
|
42
42
|
canvas.height = image.height;
|
|
43
43
|
const ctx = canvas.getContext("2d");
|
|
44
|
-
if (!ctx)
|
|
45
|
-
return;
|
|
44
|
+
if (!ctx) return;
|
|
46
45
|
ctx.drawImage(image, 0, 0);
|
|
47
46
|
return canvas.toDataURL();
|
|
48
47
|
};
|
|
@@ -93,8 +92,7 @@ class ImageShapeUtil extends import_editor.BaseBoxShapeUtil {
|
|
|
93
92
|
let cancelled = false;
|
|
94
93
|
const run = async () => {
|
|
95
94
|
const newStaticFrame = await getStateFrame(asset.props.src);
|
|
96
|
-
if (cancelled)
|
|
97
|
-
return;
|
|
95
|
+
if (cancelled) return;
|
|
98
96
|
if (newStaticFrame) {
|
|
99
97
|
setStaticFrameSrc(newStaticFrame);
|
|
100
98
|
}
|
|
@@ -196,11 +194,9 @@ class ImageShapeUtil extends import_editor.BaseBoxShapeUtil {
|
|
|
196
194
|
}
|
|
197
195
|
onDoubleClick = (shape) => {
|
|
198
196
|
const asset = shape.props.assetId ? this.editor.getAsset(shape.props.assetId) : void 0;
|
|
199
|
-
if (!asset)
|
|
200
|
-
return;
|
|
197
|
+
if (!asset) return;
|
|
201
198
|
const canPlay = asset.props.src && "mimeType" in asset.props && asset.props.mimeType === "image/gif";
|
|
202
|
-
if (!canPlay)
|
|
203
|
-
return;
|
|
199
|
+
if (!canPlay) return;
|
|
204
200
|
this.editor.updateShapes([
|
|
205
201
|
{
|
|
206
202
|
type: "image",
|
|
@@ -213,8 +209,7 @@ class ImageShapeUtil extends import_editor.BaseBoxShapeUtil {
|
|
|
213
209
|
};
|
|
214
210
|
onDoubleClickEdge = (shape) => {
|
|
215
211
|
const props = shape.props;
|
|
216
|
-
if (!props)
|
|
217
|
-
return;
|
|
212
|
+
if (!props) return;
|
|
218
213
|
if (this.editor.getCroppingShapeId() !== shape.id) {
|
|
219
214
|
return;
|
|
220
215
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/shapes/image/ImageShapeUtil.tsx"],
|
|
4
4
|
"sourcesContent": ["/* eslint-disable react-hooks/rules-of-hooks */\nimport {\n\tBaseBoxShapeUtil,\n\tHTMLContainer,\n\tTLImageShape,\n\tTLOnDoubleClickHandler,\n\tTLShapePartial,\n\tVec2d,\n\tdeepCopy,\n\timageShapeMigrations,\n\timageShapeProps,\n\ttoDomPrecision,\n\tuseIsCropping,\n\tuseValue,\n} from '@bigbluebutton/editor'\nimport { useEffect, useState } from 'react'\nimport { HyperlinkButton } from '../shared/HyperlinkButton'\nimport { usePrefersReducedMotion } from '../shared/usePrefersReducedMotion'\n\nconst loadImage = async (url: string): Promise<HTMLImageElement> => {\n\treturn new Promise((resolve, reject) => {\n\t\tconst image = new Image()\n\t\timage.onload = () => resolve(image)\n\t\timage.onerror = () => reject(new Error('Failed to load image'))\n\t\timage.crossOrigin = 'anonymous'\n\t\timage.src = url\n\t})\n}\n\nconst getStateFrame = async (url: string) => {\n\tconst image = await loadImage(url)\n\n\tconst canvas = document.createElement('canvas')\n\tcanvas.width = image.width\n\tcanvas.height = image.height\n\n\tconst ctx = canvas.getContext('2d')\n\tif (!ctx) return\n\n\tctx.drawImage(image, 0, 0)\n\treturn canvas.toDataURL()\n}\n\nasync function getDataURIFromURL(url: string): Promise<string> {\n\tconst response = await fetch(url)\n\tconst blob = await response.blob()\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader()\n\t\treader.onloadend = () => resolve(reader.result as string)\n\t\treader.onerror = reject\n\t\treader.readAsDataURL(blob)\n\t})\n}\n\n/** @public */\nexport class ImageShapeUtil extends BaseBoxShapeUtil<TLImageShape> {\n\tstatic override type = 'image' as const\n\tstatic override props = imageShapeProps\n\tstatic override migrations = imageShapeMigrations\n\n\toverride isAspectRatioLocked = () => true\n\toverride canCrop = () => true\n\n\toverride getDefaultProps(): TLImageShape['props'] {\n\t\treturn {\n\t\t\tw: 100,\n\t\t\th: 100,\n\t\t\tassetId: null,\n\t\t\tplaying: true,\n\t\t\turl: '',\n\t\t\tcrop: null,\n\t\t}\n\t}\n\n\tcomponent(shape: TLImageShape) {\n\t\tconst containerStyle = getContainerStyle(shape)\n\t\tconst isCropping = useIsCropping(shape.id)\n\t\tconst prefersReducedMotion = usePrefersReducedMotion()\n\t\tconst [staticFrameSrc, setStaticFrameSrc] = useState('')\n\n\t\tconst asset = shape.props.assetId ? this.editor.getAsset(shape.props.assetId) : undefined\n\n\t\tif (asset?.type === 'bookmark') {\n\t\t\tthrow Error(\"Bookmark assets can't be rendered as images\")\n\t\t}\n\n\t\tconst isSelected = useValue(\n\t\t\t'onlySelectedShape',\n\t\t\t() => shape.id === this.editor.getOnlySelectedShape()?.id,\n\t\t\t[this.editor]\n\t\t)\n\n\t\tconst showCropPreview =\n\t\t\tisSelected &&\n\t\t\tisCropping &&\n\t\t\tthis.editor.isInAny('select.crop', 'select.cropping', 'select.pointing_crop_handle')\n\n\t\t// We only want to reduce motion for mimeTypes that have motion\n\t\tconst reduceMotion =\n\t\t\tprefersReducedMotion &&\n\t\t\t(asset?.props.mimeType?.includes('video') || asset?.props.mimeType?.includes('gif'))\n\n\t\tuseEffect(() => {\n\t\t\tif (asset?.props.src && 'mimeType' in asset.props && asset?.props.mimeType === 'image/gif') {\n\t\t\t\tlet cancelled = false\n\t\t\t\tconst run = async () => {\n\t\t\t\t\tconst newStaticFrame = await getStateFrame(asset.props.src!)\n\t\t\t\t\tif (cancelled) return\n\t\t\t\t\tif (newStaticFrame) {\n\t\t\t\t\t\tsetStaticFrameSrc(newStaticFrame)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trun()\n\n\t\t\t\treturn () => {\n\t\t\t\t\tcancelled = true\n\t\t\t\t}\n\t\t\t}\n\t\t}, [prefersReducedMotion, asset?.props])\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{asset?.props.src && showCropPreview && (\n\t\t\t\t\t<div style={containerStyle}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"tl-image\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\topacity: 0.1,\n\t\t\t\t\t\t\t\tbackgroundImage: `url(${\n\t\t\t\t\t\t\t\t\t!shape.props.playing || reduceMotion ? staticFrameSrc : asset.props.src\n\t\t\t\t\t\t\t\t})`,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<HTMLContainer\n\t\t\t\t\tid={shape.id}\n\t\t\t\t\tstyle={{ overflow: 'hidden', width: shape.props.w, height: shape.props.h }}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"tl-image-container\" style={containerStyle}>\n\t\t\t\t\t\t{asset?.props.src ? (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"tl-image\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackgroundImage: `url(${\n\t\t\t\t\t\t\t\t\t\t!shape.props.playing || reduceMotion ? staticFrameSrc : asset.props.src\n\t\t\t\t\t\t\t\t\t})`,\n\t\t\t\t\t\t\t\t\t// Force hardware acceleration to prevent Safari flickering issue\n\t\t\t\t\t\t\t\t\ttransform: this.editor.environment.isSafari ? 'translateZ(0)' : undefined,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{asset?.props.isAnimated && !shape.props.playing && (\n\t\t\t\t\t\t\t<div className=\"tl-image__tg\">GIF</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t{'url' in shape.props && shape.props.url && (\n\t\t\t\t\t\t<HyperlinkButton url={shape.props.url} zoomLevel={this.editor.getZoomLevel()} />\n\t\t\t\t\t)}\n\t\t\t\t</HTMLContainer>\n\t\t\t</>\n\t\t)\n\t}\n\n\tindicator(shape: TLImageShape) {\n\t\tconst isCropping = useIsCropping(shape.id)\n\t\tif (isCropping) {\n\t\t\treturn null\n\t\t}\n\t\treturn <rect width={toDomPrecision(shape.props.w)} height={toDomPrecision(shape.props.h)} />\n\t}\n\n\toverride async toSvg(shape: TLImageShape) {\n\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\tconst asset = shape.props.assetId ? this.editor.getAsset(shape.props.assetId) : null\n\n\t\tlet src = asset?.props.src || ''\n\t\tif (src && src.startsWith('http')) {\n\t\t\t// If it's a remote image, we need to fetch it and convert it to a data URI\n\t\t\tsrc = (await getDataURIFromURL(src)) || ''\n\t\t}\n\n\t\tconst image = document.createElementNS('http://www.w3.org/2000/svg', 'image')\n\t\timage.setAttributeNS('http://www.w3.org/1999/xlink', 'href', src)\n\t\tconst containerStyle = getContainerStyle(shape)\n\t\tconst crop = shape.props.crop\n\t\tif (containerStyle.transform && crop) {\n\t\t\tconst { transform, width, height } = containerStyle\n\t\t\tconst croppedWidth = (crop.bottomRight.x - crop.topLeft.x) * width\n\t\t\tconst croppedHeight = (crop.bottomRight.y - crop.topLeft.y) * height\n\n\t\t\tconst points = [\n\t\t\t\tnew Vec2d(0, 0),\n\t\t\t\tnew Vec2d(croppedWidth, 0),\n\t\t\t\tnew Vec2d(croppedWidth, croppedHeight),\n\t\t\t\tnew Vec2d(0, croppedHeight),\n\t\t\t]\n\n\t\t\tconst polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n\t\t\tpolygon.setAttribute('points', points.map((p) => `${p.x},${p.y}`).join(' '))\n\n\t\t\tconst clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath')\n\t\t\tclipPath.setAttribute('id', 'cropClipPath')\n\t\t\tclipPath.appendChild(polygon)\n\n\t\t\tconst defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n\t\t\tdefs.appendChild(clipPath)\n\t\t\tg.appendChild(defs)\n\n\t\t\tconst innerElement = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\t\tinnerElement.setAttribute('clip-path', 'url(#cropClipPath)')\n\t\t\timage.setAttribute('width', width.toString())\n\t\t\timage.setAttribute('height', height.toString())\n\t\t\timage.style.transform = transform\n\t\t\tinnerElement.appendChild(image)\n\t\t\tg.appendChild(innerElement)\n\t\t} else {\n\t\t\timage.setAttribute('width', shape.props.w.toString())\n\t\t\timage.setAttribute('height', shape.props.h.toString())\n\t\t\tg.appendChild(image)\n\t\t}\n\n\t\treturn g\n\t}\n\n\toverride onDoubleClick = (shape: TLImageShape) => {\n\t\tconst asset = shape.props.assetId ? this.editor.getAsset(shape.props.assetId) : undefined\n\n\t\tif (!asset) return\n\n\t\tconst canPlay =\n\t\t\tasset.props.src && 'mimeType' in asset.props && asset.props.mimeType === 'image/gif'\n\n\t\tif (!canPlay) return\n\n\t\tthis.editor.updateShapes([\n\t\t\t{\n\t\t\t\ttype: 'image',\n\t\t\t\tid: shape.id,\n\t\t\t\tprops: {\n\t\t\t\t\tplaying: !shape.props.playing,\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\t}\n\n\toverride onDoubleClickEdge: TLOnDoubleClickHandler<TLImageShape> = (shape) => {\n\t\tconst props = shape.props\n\t\tif (!props) return\n\n\t\tif (this.editor.getCroppingShapeId() !== shape.id) {\n\t\t\treturn\n\t\t}\n\n\t\tconst crop = deepCopy(props.crop) || {\n\t\t\ttopLeft: { x: 0, y: 0 },\n\t\t\tbottomRight: { x: 1, y: 1 },\n\t\t}\n\n\t\t// The true asset dimensions\n\t\tconst w = (1 / (crop.bottomRight.x - crop.topLeft.x)) * shape.props.w\n\t\tconst h = (1 / (crop.bottomRight.y - crop.topLeft.y)) * shape.props.h\n\n\t\tconst pointDelta = new Vec2d(crop.topLeft.x * w, crop.topLeft.y * h).rot(shape.rotation)\n\n\t\tconst partial: TLShapePartial<TLImageShape> = {\n\t\t\tid: shape.id,\n\t\t\ttype: shape.type,\n\t\t\tx: shape.x - pointDelta.x,\n\t\t\ty: shape.y - pointDelta.y,\n\t\t\tprops: {\n\t\t\t\tcrop: {\n\t\t\t\t\ttopLeft: { x: 0, y: 0 },\n\t\t\t\t\tbottomRight: { x: 1, y: 1 },\n\t\t\t\t},\n\t\t\t\tw,\n\t\t\t\th,\n\t\t\t},\n\t\t}\n\n\t\tthis.editor.updateShapes([partial])\n\t}\n}\n\n/**\n * When an image is cropped we need to translate the image to show the portion withing the cropped\n * area. We do this by translating the image by the negative of the top left corner of the crop\n * area.\n *\n * @param shape - Shape The image shape for which to get the container style\n * @returns - Styles to apply to the image container\n */\nfunction getContainerStyle(shape: TLImageShape) {\n\tconst crop = shape.props.crop\n\tconst topLeft = crop?.topLeft\n\tif (!topLeft) {\n\t\treturn {\n\t\t\twidth: shape.props.w,\n\t\t\theight: shape.props.h,\n\t\t}\n\t}\n\n\tconst w = (1 / (crop.bottomRight.x - crop.topLeft.x)) * shape.props.w\n\tconst h = (1 / (crop.bottomRight.y - crop.topLeft.y)) * shape.props.h\n\n\tconst offsetX = -topLeft.x * w\n\tconst offsetY = -topLeft.y * h\n\treturn {\n\t\ttransform: `translate(${offsetX}px, ${offsetY}px)`,\n\t\twidth: w,\n\t\theight: h,\n\t}\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyHG;AAxHH,oBAaO;AACP,mBAAoC;AACpC,6BAAgC;AAChC,qCAAwC;AAExC,MAAM,YAAY,OAAO,QAA2C;AACnE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,UAAM,QAAQ,IAAI,MAAM;AACxB,UAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,UAAM,UAAU,MAAM,OAAO,IAAI,MAAM,sBAAsB,CAAC;AAC9D,UAAM,cAAc;AACpB,UAAM,MAAM;AAAA,EACb,CAAC;AACF;AAEA,MAAM,gBAAgB,OAAO,QAAgB;AAC5C,QAAM,QAAQ,MAAM,UAAU,GAAG;AAEjC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,MAAM;AACrB,SAAO,SAAS,MAAM;AAEtB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC;
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -37,8 +37,7 @@ function getSvgPathForEdge(edge, first) {
|
|
|
37
37
|
}
|
|
38
38
|
function getSvgPathForBezierCurve(curve, first) {
|
|
39
39
|
const { a, b, c, d } = curve;
|
|
40
|
-
if (import_editor.Vec2d.Equals(a, d))
|
|
41
|
-
return "";
|
|
40
|
+
if (import_editor.Vec2d.Equals(a, d)) return "";
|
|
42
41
|
return `${first ? `M${(0, import_editor.toDomPrecision)(a.x)},${(0, import_editor.toDomPrecision)(a.y)}` : ``}C${(0, import_editor.toDomPrecision)(
|
|
43
42
|
b.x
|
|
44
43
|
)},${(0, import_editor.toDomPrecision)(b.y)} ${(0, import_editor.toDomPrecision)(c.x)},${(0, import_editor.toDomPrecision)(c.y)} ${(0, import_editor.toDomPrecision)(
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/line/components/svg.ts"],
|
|
4
4
|
"sourcesContent": ["import {\n\tCubicBezier2d,\n\tCubicSpline2d,\n\tEdge2d,\n\tPolyline2d,\n\tVec2d,\n\ttoDomPrecision,\n} from '@bigbluebutton/editor'\n\nexport function getSvgPathForEdge(edge: Edge2d, first: boolean) {\n\tconst { start, end } = edge\n\tif (first) {\n\t\treturn `M${toDomPrecision(start.x)},${toDomPrecision(start.y)} L${toDomPrecision(\n\t\t\tend.x\n\t\t)},${toDomPrecision(end.y)} `\n\t}\n\treturn `${toDomPrecision(end.x)},${toDomPrecision(end.y)} `\n}\n\nexport function getSvgPathForBezierCurve(curve: CubicBezier2d, first: boolean) {\n\tconst { a, b, c, d } = curve\n\n\tif (Vec2d.Equals(a, d)) return ''\n\n\treturn `${first ? `M${toDomPrecision(a.x)},${toDomPrecision(a.y)}` : ``}C${toDomPrecision(\n\t\tb.x\n\t)},${toDomPrecision(b.y)} ${toDomPrecision(c.x)},${toDomPrecision(c.y)} ${toDomPrecision(\n\t\td.x\n\t)},${toDomPrecision(d.y)}`\n}\n\nexport function getSvgPathForCubicSpline(spline: CubicSpline2d, isClosed: boolean) {\n\tlet d = spline.segments.reduce((d, segment, i) => {\n\t\treturn d + getSvgPathForBezierCurve(segment, i === 0)\n\t}, '')\n\n\tif (isClosed) {\n\t\td += 'Z'\n\t}\n\n\treturn d\n}\n\nexport function getSvgPathForPolylineSpline(spline: Polyline2d, isClosed: boolean) {\n\tlet d = spline.segments.reduce((d, segment, i) => {\n\t\treturn d + getSvgPathForEdge(segment, i === 0)\n\t}, '')\n\n\tif (isClosed) {\n\t\td += 'Z'\n\t}\n\n\treturn d\n}\n\nexport function getSvgPathForLineGeometry(spline: CubicSpline2d | Polyline2d, isClosed = false) {\n\tif (spline instanceof Polyline2d) {\n\t\treturn getSvgPathForPolylineSpline(spline, isClosed)\n\t} else {\n\t\treturn getSvgPathForCubicSpline(spline, isClosed)\n\t}\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAOO;AAEA,SAAS,kBAAkB,MAAc,OAAgB;AAC/D,QAAM,EAAE,OAAO,IAAI,IAAI;AACvB,MAAI,OAAO;AACV,WAAO,QAAI,8BAAe,MAAM,CAAC,CAAC,QAAI,8BAAe,MAAM,CAAC,CAAC,SAAK;AAAA,MACjE,IAAI;AAAA,IACL,CAAC,QAAI,8BAAe,IAAI,CAAC,CAAC;AAAA,EAC3B;AACA,SAAO,OAAG,8BAAe,IAAI,CAAC,CAAC,QAAI,8BAAe,IAAI,CAAC,CAAC;AACzD;AAEO,SAAS,yBAAyB,OAAsB,OAAgB;AAC9E,QAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI;AAEvB,MAAI,oBAAM,OAAO,GAAG,CAAC
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAOO;AAEA,SAAS,kBAAkB,MAAc,OAAgB;AAC/D,QAAM,EAAE,OAAO,IAAI,IAAI;AACvB,MAAI,OAAO;AACV,WAAO,QAAI,8BAAe,MAAM,CAAC,CAAC,QAAI,8BAAe,MAAM,CAAC,CAAC,SAAK;AAAA,MACjE,IAAI;AAAA,IACL,CAAC,QAAI,8BAAe,IAAI,CAAC,CAAC;AAAA,EAC3B;AACA,SAAO,OAAG,8BAAe,IAAI,CAAC,CAAC,QAAI,8BAAe,IAAI,CAAC,CAAC;AACzD;AAEO,SAAS,yBAAyB,OAAsB,OAAgB;AAC9E,QAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI;AAEvB,MAAI,oBAAM,OAAO,GAAG,CAAC,EAAG,QAAO;AAE/B,SAAO,GAAG,QAAQ,QAAI,8BAAe,EAAE,CAAC,CAAC,QAAI,8BAAe,EAAE,CAAC,CAAC,KAAK,EAAE,QAAI;AAAA,IAC1E,EAAE;AAAA,EACH,CAAC,QAAI,8BAAe,EAAE,CAAC,CAAC,QAAI,8BAAe,EAAE,CAAC,CAAC,QAAI,8BAAe,EAAE,CAAC,CAAC,QAAI;AAAA,IACzE,EAAE;AAAA,EACH,CAAC,QAAI,8BAAe,EAAE,CAAC,CAAC;AACzB;AAEO,SAAS,yBAAyB,QAAuB,UAAmB;AAClF,MAAI,IAAI,OAAO,SAAS,OAAO,CAACA,IAAG,SAAS,MAAM;AACjD,WAAOA,KAAI,yBAAyB,SAAS,MAAM,CAAC;AAAA,EACrD,GAAG,EAAE;AAEL,MAAI,UAAU;AACb,SAAK;AAAA,EACN;AAEA,SAAO;AACR;AAEO,SAAS,4BAA4B,QAAoB,UAAmB;AAClF,MAAI,IAAI,OAAO,SAAS,OAAO,CAACA,IAAG,SAAS,MAAM;AACjD,WAAOA,KAAI,kBAAkB,SAAS,MAAM,CAAC;AAAA,EAC9C,GAAG,EAAE;AAEL,MAAI,UAAU;AACb,SAAK;AAAA,EACN;AAEA,SAAO;AACR;AAEO,SAAS,0BAA0B,QAAoC,WAAW,OAAO;AAC/F,MAAI,kBAAkB,0BAAY;AACjC,WAAO,4BAA4B,QAAQ,QAAQ;AAAA,EACpD,OAAO;AACN,WAAO,yBAAyB,QAAQ,QAAQ;AAAA,EACjD;AACD;",
|
|
6
6
|
"names": ["d"]
|
|
7
7
|
}
|
|
@@ -37,8 +37,7 @@ class Pointing extends import_editor.StateNode {
|
|
|
37
37
|
this.editor.mark(this.markId);
|
|
38
38
|
this.shape = shape;
|
|
39
39
|
const handles = this.editor.getShapeHandles(this.shape);
|
|
40
|
-
if (!handles)
|
|
41
|
-
return;
|
|
40
|
+
if (!handles) return;
|
|
42
41
|
const vertexHandles = handles.filter((h) => h.type === "vertex").sort(import_editor.sortByIndex);
|
|
43
42
|
const endHandle = vertexHandles[vertexHandles.length - 1];
|
|
44
43
|
const prevEndHandle = vertexHandles[vertexHandles.length - 2];
|
|
@@ -96,14 +95,12 @@ class Pointing extends import_editor.StateNode {
|
|
|
96
95
|
}
|
|
97
96
|
};
|
|
98
97
|
onPointerMove = () => {
|
|
99
|
-
if (!this.shape)
|
|
100
|
-
return;
|
|
98
|
+
if (!this.shape) return;
|
|
101
99
|
if (this.editor.inputs.isDragging) {
|
|
102
100
|
const handles = this.editor.getShapeHandles(this.shape);
|
|
103
101
|
console;
|
|
104
102
|
if (!handles) {
|
|
105
|
-
if (this.markId)
|
|
106
|
-
this.editor.bailToMark(this.markId);
|
|
103
|
+
if (this.markId) this.editor.bailToMark(this.markId);
|
|
107
104
|
throw Error("No handles found");
|
|
108
105
|
}
|
|
109
106
|
const lastHandle = (0, import_editor.last)(handles);
|
|
@@ -127,8 +124,7 @@ class Pointing extends import_editor.StateNode {
|
|
|
127
124
|
};
|
|
128
125
|
onInterrupt = () => {
|
|
129
126
|
this.parent.transition("idle");
|
|
130
|
-
if (this.markId)
|
|
131
|
-
this.editor.bailToMark(this.markId);
|
|
127
|
+
if (this.markId) this.editor.bailToMark(this.markId);
|
|
132
128
|
this.editor.snaps.clear();
|
|
133
129
|
};
|
|
134
130
|
complete() {
|
|
@@ -136,8 +132,7 @@ class Pointing extends import_editor.StateNode {
|
|
|
136
132
|
this.editor.snaps.clear();
|
|
137
133
|
}
|
|
138
134
|
cancel() {
|
|
139
|
-
if (this.markId)
|
|
140
|
-
this.editor.bailToMark(this.markId);
|
|
135
|
+
if (this.markId) this.editor.bailToMark(this.markId);
|
|
141
136
|
this.parent.transition("idle", { shapeId: this.shape.id });
|
|
142
137
|
this.editor.snaps.clear();
|
|
143
138
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/line/toolStates/Pointing.ts"],
|
|
4
4
|
"sourcesContent": ["import {\n\tMatrix2d,\n\tStateNode,\n\tTLEventHandlers,\n\tTLHandle,\n\tTLInterruptEvent,\n\tTLLineShape,\n\tTLShapeId,\n\tVec2d,\n\tcreateShapeId,\n\tgetIndexAbove,\n\tlast,\n\tsortByIndex,\n\tstructuredClone,\n} from '@bigbluebutton/editor'\n\nconst MINIMUM_DISTANCE_BETWEEN_SHIFT_CLICKED_HANDLES = 2\n\nexport class Pointing extends StateNode {\n\tstatic override id = 'pointing'\n\n\tshape = {} as TLLineShape\n\n\tmarkId: string | undefined\n\n\toverride onEnter = (info: { shapeId?: TLShapeId }) => {\n\t\tconst { inputs } = this.editor\n\t\tconst { currentPagePoint } = inputs\n\n\t\tthis.markId = undefined\n\n\t\t// Previously created line shape that we might be extending\n\t\tconst shape = info.shapeId && this.editor.getShape<TLLineShape>(info.shapeId)\n\n\t\tif (shape && inputs.shiftKey) {\n\t\t\t// Extending a previous shape\n\t\t\tthis.markId = `creating:${shape.id}`\n\t\t\tthis.editor.mark(this.markId)\n\t\t\tthis.shape = shape\n\n\t\t\tconst handles = this.editor.getShapeHandles(this.shape)\n\t\t\tif (!handles) return\n\n\t\t\tconst vertexHandles = handles.filter((h) => h.type === 'vertex').sort(sortByIndex)\n\t\t\tconst endHandle = vertexHandles[vertexHandles.length - 1]\n\t\t\tconst prevEndHandle = vertexHandles[vertexHandles.length - 2]\n\n\t\t\tconst shapePagePoint = Matrix2d.applyToPoint(\n\t\t\t\tthis.editor.getShapeParentTransform(this.shape)!,\n\t\t\t\tnew Vec2d(this.shape.x, this.shape.y)\n\t\t\t)\n\n\t\t\tlet nextEndHandleIndex: string, nextEndHandleId: string, nextEndHandle: TLHandle\n\n\t\t\tconst nextPoint = Vec2d.Sub(currentPagePoint, shapePagePoint)\n\n\t\t\tif (\n\t\t\t\tVec2d.Dist(endHandle, prevEndHandle) < MINIMUM_DISTANCE_BETWEEN_SHIFT_CLICKED_HANDLES ||\n\t\t\t\tVec2d.Dist(nextPoint, endHandle) < MINIMUM_DISTANCE_BETWEEN_SHIFT_CLICKED_HANDLES\n\t\t\t) {\n\t\t\t\t// If the end handle is too close to the previous end handle, we'll just extend the previous end handle\n\t\t\t\tnextEndHandleIndex = endHandle.index\n\t\t\t\tnextEndHandleId = endHandle.id\n\t\t\t\tnextEndHandle = {\n\t\t\t\t\t...endHandle,\n\t\t\t\t\tx: nextPoint.x + 0.1,\n\t\t\t\t\ty: nextPoint.y + 0.1,\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we'll create a new end handle\n\t\t\t\tnextEndHandleIndex = getIndexAbove(endHandle.index)\n\t\t\t\tnextEndHandleId = 'handle:' + nextEndHandleIndex\n\t\t\t\tnextEndHandle = {\n\t\t\t\t\tid: nextEndHandleId,\n\t\t\t\t\ttype: 'vertex',\n\t\t\t\t\tindex: nextEndHandleIndex,\n\t\t\t\t\tx: nextPoint.x + 0.1,\n\t\t\t\t\ty: nextPoint.y + 0.1,\n\t\t\t\t\tcanBind: false,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst nextHandles = structuredClone(this.shape.props.handles)\n\n\t\t\tnextHandles[nextEndHandle.id] = nextEndHandle\n\n\t\t\tthis.editor.updateShapes([\n\t\t\t\t{\n\t\t\t\t\tid: this.shape.id,\n\t\t\t\t\ttype: this.shape.type,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\thandles: nextHandles,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t])\n\t\t} else {\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<TLLineShape>([\n\t\t\t\t{\n\t\t\t\t\tid,\n\t\t\t\t\ttype: 'line',\n\t\t\t\t\tx: currentPagePoint.x,\n\t\t\t\t\ty: currentPagePoint.y,\n\t\t\t\t},\n\t\t\t])\n\n\t\t\tthis.editor.select(id)\n\t\t\tthis.shape = this.editor.getShape(id)!\n\t\t}\n\t}\n\n\toverride onPointerMove: TLEventHandlers['onPointerMove'] = () => {\n\t\tif (!this.shape) return\n\n\t\tif (this.editor.inputs.isDragging) {\n\t\t\tconst handles = this.editor.getShapeHandles(this.shape)\n\t\t\tconsole\n\t\t\tif (!handles) {\n\t\t\t\tif (this.markId) this.editor.bailToMark(this.markId)\n\t\t\t\tthrow Error('No handles found')\n\t\t\t}\n\t\t\tconst lastHandle = last(handles)!\n\t\t\tthis.editor.setCurrentTool('select.dragging_handle', {\n\t\t\t\tshape: this.shape,\n\t\t\t\tisCreating: true,\n\t\t\t\t// remove the offset that we added to the handle when we created it\n\t\t\t\thandle: { ...lastHandle, x: lastHandle.x - 0.1, y: lastHandle.y - 0.1 },\n\t\t\t\tonInteractionEnd: 'line',\n\t\t\t})\n\t\t}\n\t}\n\n\toverride onPointerUp: TLEventHandlers['onPointerUp'] = () => {\n\t\tthis.complete()\n\t}\n\n\toverride onCancel: TLEventHandlers['onCancel'] = () => {\n\t\tthis.cancel()\n\t}\n\n\toverride onComplete: TLEventHandlers['onComplete'] = () => {\n\t\tthis.complete()\n\t}\n\n\toverride onInterrupt: TLInterruptEvent = () => {\n\t\tthis.parent.transition('idle')\n\t\tif (this.markId) this.editor.bailToMark(this.markId)\n\t\tthis.editor.snaps.clear()\n\t}\n\n\tcomplete() {\n\t\tthis.parent.transition('idle', { shapeId: this.shape.id })\n\t\tthis.editor.snaps.clear()\n\t}\n\n\tcancel() {\n\t\tif (this.markId) this.editor.bailToMark(this.markId)\n\t\tthis.parent.transition('idle', { shapeId: this.shape.id })\n\t\tthis.editor.snaps.clear()\n\t}\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAcO;AAEP,MAAM,iDAAiD;AAEhD,MAAM,iBAAiB,wBAAU;AAAA,EACvC,OAAgB,KAAK;AAAA,EAErB,QAAQ,CAAC;AAAA,EAET;AAAA,EAES,UAAU,CAAC,SAAkC;AACrD,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,UAAM,EAAE,iBAAiB,IAAI;AAE7B,SAAK,SAAS;AAGd,UAAM,QAAQ,KAAK,WAAW,KAAK,OAAO,SAAsB,KAAK,OAAO;AAE5E,QAAI,SAAS,OAAO,UAAU;AAE7B,WAAK,SAAS,YAAY,MAAM,EAAE;AAClC,WAAK,OAAO,KAAK,KAAK,MAAM;AAC5B,WAAK,QAAQ;AAEb,YAAM,UAAU,KAAK,OAAO,gBAAgB,KAAK,KAAK;AACtD,UAAI,CAAC;
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -25,8 +25,7 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
25
25
|
function getAverageCharacterWidth(text, font) {
|
|
26
26
|
const canvas = document.createElement("canvas");
|
|
27
27
|
const ctx = canvas.getContext("2d");
|
|
28
|
-
if (!ctx)
|
|
29
|
-
return null;
|
|
28
|
+
if (!ctx) return null;
|
|
30
29
|
ctx.font = font;
|
|
31
30
|
const textWidth = ctx.measureText(text).width;
|
|
32
31
|
const averageAdvance = textWidth / text.length;
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/poll/components/CustomizedAxisTick.tsx"],
|
|
4
4
|
"sourcesContent": ["function getAverageCharacterWidth(text: string, font: string) {\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) return null\n\n\tctx.font = font\n\n\tconst textWidth = ctx.measureText(text).width\n\tconst averageAdvance = textWidth / text.length\n\n\treturn averageAdvance\n}\n\nconst TICK_SIZE = 6\nconst AVERAGE_CHAR_WIDTH = getAverageCharacterWidth('0', 'Source Sans Pro') ?? 6\nconst ELLIPSIS = '...'\n\nconst CustomizedAxisTick = (props: any) => {\n\tconst { payload, ...restProps } = props\n\tconst { width } = restProps\n\tconst numberOfChars = Math.floor((width - TICK_SIZE) / AVERAGE_CHAR_WIDTH)\n\tconst restValue = payload.value.substring(numberOfChars, payload.value.length)\n\n\treturn (\n\t\t<g>\n\t\t\t<text {...restProps}>\n\t\t\t\t{payload.value.substring(\n\t\t\t\t\t0,\n\t\t\t\t\trestValue.length > 0 ? numberOfChars - ELLIPSIS.length : numberOfChars\n\t\t\t\t)}\n\t\t\t\t{restValue.length > 0 && ELLIPSIS}\n\t\t\t</text>\n\t\t</g>\n\t)\n}\n\nexport default CustomizedAxisTick\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBE;AAzBF,SAAS,yBAAyB,MAAc,MAAc;AAC7D,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,MAAM,OAAO,WAAW,IAAI;AAElC,MAAI,CAAC
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBE;AAzBF,SAAS,yBAAyB,MAAc,MAAc;AAC7D,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,MAAM,OAAO,WAAW,IAAI;AAElC,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,OAAO;AAEX,QAAM,YAAY,IAAI,YAAY,IAAI,EAAE;AACxC,QAAM,iBAAiB,YAAY,KAAK;AAExC,SAAO;AACR;AAEA,MAAM,YAAY;AAClB,MAAM,qBAAqB,yBAAyB,KAAK,iBAAiB,KAAK;AAC/E,MAAM,WAAW;AAEjB,MAAM,qBAAqB,CAAC,UAAe;AAC1C,QAAM,EAAE,SAAS,GAAG,UAAU,IAAI;AAClC,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,gBAAgB,KAAK,OAAO,QAAQ,aAAa,kBAAkB;AACzE,QAAM,YAAY,QAAQ,MAAM,UAAU,eAAe,QAAQ,MAAM,MAAM;AAE7E,SACC,4CAAC,OACA,uDAAC,UAAM,GAAG,WACR;AAAA,YAAQ,MAAM;AAAA,MACd;AAAA,MACA,UAAU,SAAS,IAAI,gBAAgB,SAAS,SAAS;AAAA,IAC1D;AAAA,IACC,UAAU,SAAS,KAAK;AAAA,KAC1B,GACD;AAEF;AAEA,IAAO,6BAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -46,8 +46,7 @@ const translatedAnswersKeys = {
|
|
|
46
46
|
const caseInsensitiveReducer = (acc, item) => {
|
|
47
47
|
const index = acc.findIndex((ans) => ans.key.toLowerCase() === item.key.toLowerCase());
|
|
48
48
|
if (index !== -1) {
|
|
49
|
-
if (acc[index].numVotes >= item.numVotes)
|
|
50
|
-
acc[index].numVotes += item.numVotes;
|
|
49
|
+
if (acc[index].numVotes >= item.numVotes) acc[index].numVotes += item.numVotes;
|
|
51
50
|
else {
|
|
52
51
|
const tempVotes = acc[index].numVotes;
|
|
53
52
|
acc[index] = item;
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/shapes/poll/components/poll-content.tsx"],
|
|
4
4
|
"sourcesContent": ["/* eslint-disable import/no-extraneous-dependencies */\nimport React from 'react'\nimport { Bar, BarChart, ResponsiveContainer, XAxis, YAxis } from 'recharts'\nimport { TLUiTranslationKey } from '../../../ui/hooks/useTranslation/TLUiTranslationKey'\nimport { useTranslation } from '../../../ui/hooks/useTranslation/useTranslation'\nimport CustomizedAxisTick from './CustomizedAxisTick'\nimport Styled from './styles'\n\nconst translatedAnswersKeys = {\n\tTrue: 'app.poll.t',\n\tFalse: 'app.poll.f',\n\tYes: 'app.poll.y',\n\tNo: 'app.poll.n',\n\tAbstention: 'app.poll.abstention',\n}\n\nconst caseInsensitiveReducer = (acc: any[], item: { key: string; numVotes: number }) => {\n\tconst index = acc.findIndex((ans) => ans.key.toLowerCase() === item.key.toLowerCase())\n\tif (index !== -1) {\n\t\tif (acc[index].numVotes >= item.numVotes) acc[index].numVotes += item.numVotes\n\t\telse {\n\t\t\tconst tempVotes = acc[index].numVotes\n\t\t\tacc[index] = item\n\t\t\tacc[index].numVotes += tempVotes\n\t\t}\n\t} else {\n\t\tacc.push(item)\n\t}\n\treturn acc\n}\n\ninterface ChatPollContentProps {\n\tmetadata: string\n\theight?: number\n\twidth?: number\n}\n\ninterface Metadata {\n\tid: string\n\tquestion: string\n\tnumRespondents: number\n\tnumResponders: number\n\tquestionText: string\n\tquestionType: string\n\tanswers: Array<Answers>\n}\n\ninterface Answers {\n\tkey: string\n\tnumVotes: number\n\tid: number\n\tisCorrectAnswer?: boolean\n}\n\nfunction assertAsMetadata(metadata: unknown): asserts metadata is Metadata {\n\tif (typeof metadata !== 'object' || metadata === null) {\n\t\tthrow new Error('metadata is not an object')\n\t}\n\tif (typeof (metadata as Metadata).id !== 'string') {\n\t\tthrow new Error('metadata.id is not a string')\n\t}\n\tif (typeof (metadata as Metadata).numRespondents !== 'number') {\n\t\tthrow new Error('metadata.numRespondents is not a number')\n\t}\n\tif (typeof (metadata as Metadata).numResponders !== 'number') {\n\t\tthrow new Error('metadata.numResponders is not a number')\n\t}\n\tif (typeof (metadata as Metadata).questionText !== 'string') {\n\t\tthrow new Error('metadata.questionText is not a string')\n\t}\n\tif (typeof (metadata as Metadata).questionType !== 'string') {\n\t\tthrow new Error('metadata.questionType is not a string')\n\t}\n\tif (!Array.isArray((metadata as Metadata).answers)) {\n\t\tthrow new Error('metadata.answers is not an array')\n\t}\n}\n\nconst ChatPollContent: React.FC<ChatPollContentProps> = ({\n\tmetadata: string,\n\theight = undefined,\n\twidth = undefined,\n}) => {\n\tconst pollData = JSON.parse(string) as unknown\n\tassertAsMetadata(pollData)\n\tconst msg = useTranslation()\n\n\tconst isTypedPoll = pollData.questionType.startsWith('R-')\n\tconst yAxisWidth = isTypedPoll && width ? Math.floor(width / 2) : 80\n\n\tconst answers = pollData.answers.reduce(caseInsensitiveReducer, [])\n\n\tconst translatedAnswers = answers.map((answer: Answers) => {\n\t\tconst key = answer.key as keyof typeof translatedAnswersKeys\n\t\tconst translationKey = msg((translatedAnswersKeys[key] || key) as TLUiTranslationKey)\n\t\tconst pollAnswer = `${answer.isCorrectAnswer ? '\u2705 ' : ''}${\n\t\t\ttranslationKey ? translationKey : answer.key\n\t\t}`\n\t\treturn {\n\t\t\t...answer,\n\t\t\tpollAnswer,\n\t\t}\n\t})\n\n\tconst useHeight = height || translatedAnswers.length * 50\n\treturn (\n\t\t<Styled.PollWrapper data-test=\"chatPollMessageText\">\n\t\t\t<Styled.PollText>{pollData.questionText}</Styled.PollText>\n\t\t\t<ResponsiveContainer width=\"90%\" height={useHeight}>\n\t\t\t\t<BarChart data={translatedAnswers} layout=\"vertical\">\n\t\t\t\t\t<XAxis type=\"number\" allowDecimals={false} />\n\t\t\t\t\t<YAxis\n\t\t\t\t\t\twidth={yAxisWidth}\n\t\t\t\t\t\ttype=\"category\"\n\t\t\t\t\t\tdataKey=\"pollAnswer\"\n\t\t\t\t\t\ttick={<CustomizedAxisTick />}\n\t\t\t\t\t/>\n\t\t\t\t\t<Bar dataKey=\"numVotes\" fill=\"#0C57A7\" />\n\t\t\t\t</BarChart>\n\t\t\t</ResponsiveContainer>\n\t\t</Styled.PollWrapper>\n\t)\n}\n\nexport default ChatPollContent\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2GG;AAzGH,sBAAiE;AAEjE,4BAA+B;AAC/B,gCAA+B;AAC/B,oBAAmB;AAEnB,MAAM,wBAAwB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,YAAY;AACb;AAEA,MAAM,yBAAyB,CAAC,KAAY,SAA4C;AACvF,QAAM,QAAQ,IAAI,UAAU,CAAC,QAAQ,IAAI,IAAI,YAAY,MAAM,KAAK,IAAI,YAAY,CAAC;AACrF,MAAI,UAAU,IAAI;AACjB,QAAI,IAAI,KAAK,EAAE,YAAY,KAAK
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2GG;AAzGH,sBAAiE;AAEjE,4BAA+B;AAC/B,gCAA+B;AAC/B,oBAAmB;AAEnB,MAAM,wBAAwB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,YAAY;AACb;AAEA,MAAM,yBAAyB,CAAC,KAAY,SAA4C;AACvF,QAAM,QAAQ,IAAI,UAAU,CAAC,QAAQ,IAAI,IAAI,YAAY,MAAM,KAAK,IAAI,YAAY,CAAC;AACrF,MAAI,UAAU,IAAI;AACjB,QAAI,IAAI,KAAK,EAAE,YAAY,KAAK,SAAU,KAAI,KAAK,EAAE,YAAY,KAAK;AAAA,SACjE;AACJ,YAAM,YAAY,IAAI,KAAK,EAAE;AAC7B,UAAI,KAAK,IAAI;AACb,UAAI,KAAK,EAAE,YAAY;AAAA,IACxB;AAAA,EACD,OAAO;AACN,QAAI,KAAK,IAAI;AAAA,EACd;AACA,SAAO;AACR;AAyBA,SAAS,iBAAiB,UAAiD;AAC1E,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACtD,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC5C;AACA,MAAI,OAAQ,SAAsB,OAAO,UAAU;AAClD,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC9C;AACA,MAAI,OAAQ,SAAsB,mBAAmB,UAAU;AAC9D,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC1D;AACA,MAAI,OAAQ,SAAsB,kBAAkB,UAAU;AAC7D,UAAM,IAAI,MAAM,wCAAwC;AAAA,EACzD;AACA,MAAI,OAAQ,SAAsB,iBAAiB,UAAU;AAC5D,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACxD;AACA,MAAI,OAAQ,SAAsB,iBAAiB,UAAU;AAC5D,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACxD;AACA,MAAI,CAAC,MAAM,QAAS,SAAsB,OAAO,GAAG;AACnD,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACnD;AACD;AAEA,MAAM,kBAAkD,CAAC;AAAA,EACxD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACT,MAAM;AACL,QAAM,WAAW,KAAK,MAAM,MAAM;AAClC,mBAAiB,QAAQ;AACzB,QAAM,UAAM,sCAAe;AAE3B,QAAM,cAAc,SAAS,aAAa,WAAW,IAAI;AACzD,QAAM,aAAa,eAAe,QAAQ,KAAK,MAAM,QAAQ,CAAC,IAAI;AAElE,QAAM,UAAU,SAAS,QAAQ,OAAO,wBAAwB,CAAC,CAAC;AAElE,QAAM,oBAAoB,QAAQ,IAAI,CAAC,WAAoB;AAC1D,UAAM,MAAM,OAAO;AACnB,UAAM,iBAAiB,IAAK,sBAAsB,GAAG,KAAK,GAA0B;AACpF,UAAM,aAAa,GAAG,OAAO,kBAAkB,YAAO,EAAE,GACvD,iBAAiB,iBAAiB,OAAO,GAC1C;AACA,WAAO;AAAA,MACN,GAAG;AAAA,MACH;AAAA,IACD;AAAA,EACD,CAAC;AAED,QAAM,YAAY,UAAU,kBAAkB,SAAS;AACvD,SACC,6CAAC,cAAAA,QAAO,aAAP,EAAmB,aAAU,uBAC7B;AAAA,gDAAC,cAAAA,QAAO,UAAP,EAAiB,mBAAS,cAAa;AAAA,IACxC,4CAAC,uCAAoB,OAAM,OAAM,QAAQ,WACxC,uDAAC,4BAAS,MAAM,mBAAmB,QAAO,YACzC;AAAA,kDAAC,yBAAM,MAAK,UAAS,eAAe,OAAO;AAAA,MAC3C;AAAA,QAAC;AAAA;AAAA,UACA,OAAO;AAAA,UACP,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAM,4CAAC,0BAAAC,SAAA,EAAmB;AAAA;AAAA,MAC3B;AAAA,MACA,4CAAC,uBAAI,SAAQ,YAAW,MAAK,WAAU;AAAA,OACxC,GACD;AAAA,KACD;AAEF;AAEA,IAAO,uBAAQ;",
|
|
6
6
|
"names": ["Styled", "CustomizedAxisTick"]
|
|
7
7
|
}
|
|
@@ -210,11 +210,9 @@ class TextHelpers {
|
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
function getCaretIndex(element) {
|
|
213
|
-
if (typeof window.getSelection === "undefined")
|
|
214
|
-
return;
|
|
213
|
+
if (typeof window.getSelection === "undefined") return;
|
|
215
214
|
const selection = window.getSelection();
|
|
216
|
-
if (!selection)
|
|
217
|
-
return;
|
|
215
|
+
if (!selection) return;
|
|
218
216
|
let position = 0;
|
|
219
217
|
if (selection.rangeCount !== 0) {
|
|
220
218
|
const range = selection.getRangeAt(0);
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/shapes/shared/TextHelpers.ts"],
|
|
4
4
|
"sourcesContent": ["// Adapted (mostly copied) the work of https://github.com/fregante\n// Copyright (c) Federico Brigante <opensource@bfred.it> (bfred.it)\n\n// TODO: Most of this file can be moved into a DOM utils library.\n\n/** @internal */\nexport type ReplacerCallback = (substring: string, ...args: unknown[]) => string\n\n/**\t@public */\nexport const INDENT = ' '\n\n/** @internal */\nexport class TextHelpers {\n\tstatic insertTextFirefox(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n\t\t// Found on https://www.everythingfrontend.com/blog/insert-text-into-textarea-at-cursor-position.html \uD83C\uDF88\n\t\tfield.setRangeText(\n\t\t\ttext,\n\t\t\tfield.selectionStart || 0,\n\t\t\tfield.selectionEnd || 0,\n\t\t\t'end' // Without this, the cursor is either at the beginning or text remains selected\n\t\t)\n\n\t\tfield.dispatchEvent(\n\t\t\tnew InputEvent('input', {\n\t\t\t\tdata: text,\n\t\t\t\tinputType: 'insertText',\n\t\t\t\tisComposing: false, // TODO: fix @types/jsdom, this shouldn't be required\n\t\t\t})\n\t\t)\n\t}\n\n\t/**\n\t * Inserts text at the cursor\u2019s position, replacing any selection, with **undo** support and by\n\t * firing the input event.\n\t */\n\tstatic insert(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n\t\tconst document = field.ownerDocument\n\t\tconst initialFocus = document.activeElement\n\t\tif (initialFocus !== field) {\n\t\t\tfield.focus()\n\t\t}\n\n\t\t// eslint-disable-next-line deprecation/deprecation\n\t\tif (!document.execCommand('insertText', false, text)) {\n\t\t\tTextHelpers.insertTextFirefox(field, text)\n\t\t}\n\n\t\tif (initialFocus === document.body) {\n\t\t\tfield.blur()\n\t\t} else if (initialFocus instanceof HTMLElement && initialFocus !== field) {\n\t\t\tinitialFocus.focus()\n\t\t}\n\t}\n\n\t/**\n\t * Replaces the entire content, equivalent to field.value = text but with **undo** support and by\n\t * firing the input event.\n\t */\n\tstatic set(field: HTMLTextAreaElement | HTMLInputElement, text: string): void {\n\t\tfield.select()\n\t\tTextHelpers.insert(field, text)\n\t}\n\n\t/** Get the selected text in a field or an empty string if nothing is selected. */\n\tstatic getSelection(field: HTMLTextAreaElement | HTMLInputElement): string {\n\t\tconst { selectionStart, selectionEnd } = field\n\t\treturn field.value.slice(\n\t\t\tselectionStart ? selectionStart : undefined,\n\t\t\tselectionEnd ? selectionEnd : undefined\n\t\t)\n\t}\n\n\t/**\n\t * Adds the wrappingText before and after field\u2019s selection (or cursor). If endWrappingText is\n\t * provided, it will be used instead of wrappingText at on the right.\n\t */\n\tstatic wrapSelection(\n\t\tfield: HTMLTextAreaElement | HTMLInputElement,\n\t\twrap: string,\n\t\twrapEnd?: string\n\t): void {\n\t\tconst { selectionStart, selectionEnd } = field\n\t\tconst selection = TextHelpers.getSelection(field)\n\t\tTextHelpers.insert(field, wrap + selection + (wrapEnd ?? wrap))\n\n\t\t// Restore the selection around the previously-selected text\n\t\tfield.selectionStart = (selectionStart || 0) + wrap.length\n\t\tfield.selectionEnd = (selectionEnd || 0) + wrap.length\n\t}\n\n\t/** Finds and replaces strings and regex in the field\u2019s value. */\n\tstatic replace(\n\t\tfield: HTMLTextAreaElement | HTMLInputElement,\n\t\tsearchValue: string | RegExp,\n\t\treplacer: string | ReplacerCallback\n\t): void {\n\t\t/** Remembers how much each match offset should be adjusted */\n\t\tlet drift = 0\n\t\tfield.value.replace(searchValue, (...args): string => {\n\t\t\t// Select current match to replace it later\n\t\t\tconst matchStart = drift + (args[args.length - 2] as number)\n\t\t\tconst matchLength = args[0].length\n\t\t\tfield.selectionStart = matchStart\n\t\t\tfield.selectionEnd = matchStart + matchLength\n\t\t\tconst replacement = typeof replacer === 'string' ? replacer : replacer(...args)\n\t\t\tTextHelpers.insert(field, replacement)\n\t\t\t// Select replacement. Without this, the cursor would be after the replacement\n\t\t\tfield.selectionStart = matchStart\n\t\t\tdrift += replacement.length - matchLength\n\t\t\treturn replacement\n\t\t})\n\t}\n\n\tstatic findLineEnd(value: string, currentEnd: number): number {\n\t\t// Go to the beginning of the last line\n\t\tconst lastLineStart = value.lastIndexOf('\\n', currentEnd - 1) + 1\n\t\t// There's nothing to unindent after the last cursor, so leave it as is\n\t\tif (value.charAt(lastLineStart) !== '\\t') {\n\t\t\treturn currentEnd\n\t\t}\n\t\treturn lastLineStart + 1 // Include the first character, which will be a tab\n\t}\n\n\tstatic indent(element: HTMLTextAreaElement): void {\n\t\tconst { selectionStart, selectionEnd, value } = element\n\t\tconst selectedContrast = value.slice(selectionStart, selectionEnd)\n\t\t// The first line should be indented, even if it starts with \\n\n\t\t// The last line should only be indented if includes any character after \\n\n\t\tconst lineBreakCount = /\\n/g.exec(selectedContrast)?.length\n\n\t\tif (lineBreakCount && lineBreakCount > 0) {\n\t\t\t// Select full first line to replace everything at once\n\t\t\tconst firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n\n\t\t\tconst newSelection = element.value.slice(firstLineStart, selectionEnd - 1)\n\t\t\tconst indentedText = newSelection.replace(\n\t\t\t\t/^|\\n/g, // Match all line starts\n\t\t\t\t`$&${INDENT}`\n\t\t\t)\n\t\t\tconst replacementsCount = indentedText.length - newSelection.length\n\n\t\t\t// Replace newSelection with indentedText\n\t\t\telement.setSelectionRange(firstLineStart, selectionEnd - 1)\n\t\t\tTextHelpers.insert(element, indentedText)\n\n\t\t\t// Restore selection position, including the indentation\n\t\t\telement.setSelectionRange(selectionStart + 1, selectionEnd + replacementsCount)\n\t\t} else {\n\t\t\tTextHelpers.insert(element, INDENT)\n\t\t}\n\t}\n\n\t// The first line should always be unindented\n\t// The last line should only be unindented if the selection includes any characters after \\n\n\tstatic unindent(element: HTMLTextAreaElement): void {\n\t\tconst { selectionStart, selectionEnd, value } = element\n\n\t\t// Select the whole first line because it might contain \\t\n\t\tconst firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n\t\tconst minimumSelectionEnd = TextHelpers.findLineEnd(value, selectionEnd)\n\n\t\tconst newSelection = element.value.slice(firstLineStart, minimumSelectionEnd)\n\t\tconst indentedText = newSelection.replace(/(^|\\n)(\\t| {1,2})/g, '$1')\n\t\tconst replacementsCount = newSelection.length - indentedText.length\n\n\t\t// Replace newSelection with indentedText\n\t\telement.setSelectionRange(firstLineStart, minimumSelectionEnd)\n\t\tTextHelpers.insert(element, indentedText)\n\n\t\t// Restore selection position, including the indentation\n\t\tconst firstLineIndentation = /\\t| {1,2}/.exec(value.slice(firstLineStart, selectionStart))\n\n\t\tconst difference = firstLineIndentation ? firstLineIndentation[0].length : 0\n\n\t\tconst newSelectionStart = selectionStart - difference\n\t\telement.setSelectionRange(\n\t\t\tselectionStart - difference,\n\t\t\tMath.max(newSelectionStart, selectionEnd - replacementsCount)\n\t\t)\n\t}\n\n\tstatic indentCE(element: HTMLElement): void {\n\t\tconst selection = window.getSelection()\n\t\tconst value = element.innerText\n\t\tconst selectionStart = getCaretIndex(element) ?? 0\n\t\tconst selectionEnd = getCaretIndex(element) ?? 0\n\t\tconst selectedContrast = value.slice(selectionStart, selectionEnd)\n\t\t// The first line should be indented, even if it starts with \\n\n\t\t// The last line should only be indented if includes any character after \\n\n\t\tconst lineBreakCount = /\\n/g.exec(selectedContrast)?.length\n\n\t\tif (lineBreakCount && lineBreakCount > 0) {\n\t\t\t// Select full first line to replace everything at once\n\t\t\tconst firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n\n\t\t\tconst newSelection = value.slice(firstLineStart, selectionEnd - 1)\n\t\t\tconst indentedText = newSelection.replace(\n\t\t\t\t/^|\\n/g, // Match all line starts\n\t\t\t\t`$&${INDENT}`\n\t\t\t)\n\t\t\tconst replacementsCount = indentedText.length - newSelection.length\n\n\t\t\t// Replace newSelection with indentedText\n\n\t\t\tif (selection) {\n\t\t\t\tselection.setBaseAndExtent(\n\t\t\t\t\telement,\n\t\t\t\t\tselectionStart + 1,\n\t\t\t\t\telement,\n\t\t\t\t\tselectionEnd + replacementsCount\n\t\t\t\t)\n\t\t\t\t// element.setSelectionRange(firstLineStart, selectionEnd - 1)\n\t\t\t\t// TextHelpers.insert(element, indentedText)\n\n\t\t\t\t// Restore selection position, including the indentation\n\t\t\t\t// element.setSelectionRange(selectionStart + 1, selectionEnd + replacementsCount)\n\t\t\t}\n\t\t} else {\n\t\t\tconst selection = window.getSelection()\n\t\t\telement.innerText = value.slice(0, selectionStart) + INDENT + value.slice(selectionStart)\n\t\t\tselection?.setBaseAndExtent(element, selectionStart + 1, element, selectionStart + 2)\n\t\t\t// TextHelpers.insert(element, INDENT)\n\t\t}\n\t}\n\n\tstatic unindentCE(element: HTMLElement): void {\n\t\tconst selection = window.getSelection()\n\t\tconst value = element.innerText\n\t\t// const { selectionStart, selectionEnd } = element\n\t\tconst selectionStart = getCaretIndex(element) ?? 0\n\t\tconst selectionEnd = getCaretIndex(element) ?? 0\n\n\t\t// Select the whole first line because it might contain \\t\n\t\tconst firstLineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1\n\t\tconst minimumSelectionEnd = TextHelpers.findLineEnd(value, selectionEnd)\n\n\t\tconst newSelection = value.slice(firstLineStart, minimumSelectionEnd)\n\t\tconst indentedText = newSelection.replace(/(^|\\n)(\\t| {1,2})/g, '$1')\n\t\tconst replacementsCount = newSelection.length - indentedText.length\n\n\t\tif (selection) {\n\t\t\t// Replace newSelection with indentedText\n\t\t\tselection.setBaseAndExtent(element, firstLineStart, element, minimumSelectionEnd)\n\t\t\t// TextHelpers.insert(element, indentedText)\n\n\t\t\t// Restore selection position, including the indentation\n\t\t\tconst firstLineIndentation = /\\t| {1,2}/.exec(value.slice(firstLineStart, selectionStart))\n\n\t\t\tconst difference = firstLineIndentation ? firstLineIndentation[0].length : 0\n\n\t\t\tconst newSelectionStart = selectionStart - difference\n\t\t\tselection.setBaseAndExtent(\n\t\t\t\telement,\n\t\t\t\tselectionStart - difference,\n\t\t\t\telement,\n\t\t\t\tMath.max(newSelectionStart, selectionEnd - replacementsCount)\n\t\t\t)\n\t\t}\n\t}\n\n\tstatic fixNewLines = /\\r?\\n|\\r/g\n\n\tstatic normalizeText(text: string) {\n\t\treturn text.replace(TextHelpers.fixNewLines, '\\n')\n\t}\n\n\tstatic normalizeTextForDom(text: string) {\n\t\treturn text\n\t\t\t.replace(TextHelpers.fixNewLines, '\\n')\n\t\t\t.split('\\n')\n\t\t\t.map((x) => x || ' ')\n\t\t\t.join('\\n')\n\t}\n}\n\nfunction getCaretIndex(element: HTMLElement) {\n\tif (typeof window.getSelection === 'undefined') return\n\tconst selection = window.getSelection()\n\tif (!selection) return\n\tlet position = 0\n\tif (selection.rangeCount !== 0) {\n\t\tconst range = selection.getRangeAt(0)\n\t\tconst preCaretRange = range.cloneRange()\n\t\tpreCaretRange.selectNodeContents(element)\n\t\tpreCaretRange.setEnd(range.endContainer, range.endOffset)\n\t\tposition = preCaretRange.toString().length\n\t}\n\treturn position\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["selection"]
|
|
7
7
|
}
|
|
@@ -35,8 +35,7 @@ function createTextSvgElementFromSpans(editor, spans, opts) {
|
|
|
35
35
|
textElm.setAttribute("line-height", opts.lineHeight * opts.fontSize + "px");
|
|
36
36
|
textElm.setAttribute("dominant-baseline", "mathematical");
|
|
37
37
|
textElm.setAttribute("alignment-baseline", "mathematical");
|
|
38
|
-
if (spans.length === 0)
|
|
39
|
-
return textElm;
|
|
38
|
+
if (spans.length === 0) return textElm;
|
|
40
39
|
const bounds = import_editor.Box2d.From(spans[0].box);
|
|
41
40
|
for (const { box } of spans) {
|
|
42
41
|
bounds.union(box);
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/shapes/shared/createTextSvgElementFromSpans.ts"],
|
|
4
4
|
"sourcesContent": ["import {\n\tBox2d,\n\tBox2dModel,\n\tEditor,\n\tTLDefaultHorizontalAlignStyle,\n\tTLDefaultVerticalAlignStyle,\n} from '@bigbluebutton/editor'\n\nfunction correctSpacesToNbsp(input: string) {\n\treturn input.replace(/\\s/g, '\\xa0')\n}\n\n/** Get an SVG element for a text shape. */\nexport function createTextSvgElementFromSpans(\n\teditor: Editor,\n\tspans: { text: string; box: Box2dModel }[],\n\topts: {\n\t\tfontSize: number\n\t\tfontFamily: string\n\t\ttextAlign: TLDefaultHorizontalAlignStyle\n\t\tverticalTextAlign: TLDefaultVerticalAlignStyle\n\t\tfontWeight: string\n\t\tfontStyle: string\n\t\tlineHeight: number\n\t\twidth: number\n\t\theight: number\n\t\tstroke?: string\n\t\tstrokeWidth?: number\n\t\tfill?: string\n\t\tpadding?: number\n\t\toffsetX?: number\n\t\toffsetY?: number\n\t}\n) {\n\tconst { padding = 0 } = opts\n\n\t// Create the text element\n\tconst textElm = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\ttextElm.setAttribute('font-size', opts.fontSize + 'px')\n\ttextElm.setAttribute('font-family', opts.fontFamily)\n\ttextElm.setAttribute('font-style', opts.fontStyle)\n\ttextElm.setAttribute('font-weight', opts.fontWeight)\n\ttextElm.setAttribute('line-height', opts.lineHeight * opts.fontSize + 'px')\n\ttextElm.setAttribute('dominant-baseline', 'mathematical')\n\ttextElm.setAttribute('alignment-baseline', 'mathematical')\n\n\tif (spans.length === 0) return textElm\n\n\tconst bounds = Box2d.From(spans[0].box)\n\tfor (const { box } of spans) {\n\t\tbounds.union(box)\n\t}\n\n\tconst offsetX = padding + (opts.offsetX ?? 0)\n\t// const offsetY = (Math.ceil(opts.height) - bounds.height + opts.fontSize) / 2 + (opts.offsetY ?? 0)\n\tconst offsetY =\n\t\t(opts.offsetY ?? 0) +\n\t\topts.fontSize / 2 +\n\t\t(opts.verticalTextAlign === 'start'\n\t\t\t? padding\n\t\t\t: opts.verticalTextAlign === 'end'\n\t\t\t? opts.height - padding - bounds.height\n\t\t\t: (Math.ceil(opts.height) - bounds.height) / 2)\n\n\t// Create text span elements for each word\n\tlet currentLineTop = null\n\tfor (const { text, box } of spans) {\n\t\t// if we broke a line, add a line break span. This helps tools like\n\t\t// figma import our exported svg correctly\n\t\tconst didBreakLine = currentLineTop !== null && box.y > currentLineTop\n\t\tif (didBreakLine) {\n\t\t\tconst lineBreakTspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan')\n\t\t\tlineBreakTspan.setAttribute('alignment-baseline', 'mathematical')\n\t\t\tlineBreakTspan.setAttribute('x', offsetX + 'px')\n\t\t\tlineBreakTspan.setAttribute('y', box.y + offsetY + 'px')\n\t\t\tlineBreakTspan.textContent = '\\n'\n\t\t\ttextElm.appendChild(lineBreakTspan)\n\t\t}\n\n\t\tconst tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan')\n\t\ttspan.setAttribute('alignment-baseline', 'mathematical')\n\t\ttspan.setAttribute('x', box.x + offsetX + 'px')\n\t\ttspan.setAttribute('y', box.y + offsetY + 'px')\n\t\tconst cleanText = correctSpacesToNbsp(text)\n\t\ttspan.textContent = cleanText\n\t\ttextElm.appendChild(tspan)\n\n\t\tcurrentLineTop = box.y\n\t}\n\n\tif (opts.stroke && opts.strokeWidth) {\n\t\ttextElm.setAttribute('stroke', opts.stroke)\n\t\ttextElm.setAttribute('stroke-width', opts.strokeWidth + 'px')\n\t}\n\n\tif (opts.fill) {\n\t\ttextElm.setAttribute('fill', opts.fill)\n\t}\n\n\treturn textElm\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMO;AAEP,SAAS,oBAAoB,OAAe;AAC3C,SAAO,MAAM,QAAQ,OAAO,MAAM;AACnC;AAGO,SAAS,8BACf,QACA,OACA,MAiBC;AACD,QAAM,EAAE,UAAU,EAAE,IAAI;AAGxB,QAAM,UAAU,SAAS,gBAAgB,8BAA8B,MAAM;AAC7E,UAAQ,aAAa,aAAa,KAAK,WAAW,IAAI;AACtD,UAAQ,aAAa,eAAe,KAAK,UAAU;AACnD,UAAQ,aAAa,cAAc,KAAK,SAAS;AACjD,UAAQ,aAAa,eAAe,KAAK,UAAU;AACnD,UAAQ,aAAa,eAAe,KAAK,aAAa,KAAK,WAAW,IAAI;AAC1E,UAAQ,aAAa,qBAAqB,cAAc;AACxD,UAAQ,aAAa,sBAAsB,cAAc;AAEzD,MAAI,MAAM,WAAW
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMO;AAEP,SAAS,oBAAoB,OAAe;AAC3C,SAAO,MAAM,QAAQ,OAAO,MAAM;AACnC;AAGO,SAAS,8BACf,QACA,OACA,MAiBC;AACD,QAAM,EAAE,UAAU,EAAE,IAAI;AAGxB,QAAM,UAAU,SAAS,gBAAgB,8BAA8B,MAAM;AAC7E,UAAQ,aAAa,aAAa,KAAK,WAAW,IAAI;AACtD,UAAQ,aAAa,eAAe,KAAK,UAAU;AACnD,UAAQ,aAAa,cAAc,KAAK,SAAS;AACjD,UAAQ,aAAa,eAAe,KAAK,UAAU;AACnD,UAAQ,aAAa,eAAe,KAAK,aAAa,KAAK,WAAW,IAAI;AAC1E,UAAQ,aAAa,qBAAqB,cAAc;AACxD,UAAQ,aAAa,sBAAsB,cAAc;AAEzD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,SAAS,oBAAM,KAAK,MAAM,CAAC,EAAE,GAAG;AACtC,aAAW,EAAE,IAAI,KAAK,OAAO;AAC5B,WAAO,MAAM,GAAG;AAAA,EACjB;AAEA,QAAM,UAAU,WAAW,KAAK,WAAW;AAE3C,QAAM,WACJ,KAAK,WAAW,KACjB,KAAK,WAAW,KACf,KAAK,sBAAsB,UACzB,UACA,KAAK,sBAAsB,QAC3B,KAAK,SAAS,UAAU,OAAO,UAC9B,KAAK,KAAK,KAAK,MAAM,IAAI,OAAO,UAAU;AAG/C,MAAI,iBAAiB;AACrB,aAAW,EAAE,MAAM,IAAI,KAAK,OAAO;AAGlC,UAAM,eAAe,mBAAmB,QAAQ,IAAI,IAAI;AACxD,QAAI,cAAc;AACjB,YAAM,iBAAiB,SAAS,gBAAgB,8BAA8B,OAAO;AACrF,qBAAe,aAAa,sBAAsB,cAAc;AAChE,qBAAe,aAAa,KAAK,UAAU,IAAI;AAC/C,qBAAe,aAAa,KAAK,IAAI,IAAI,UAAU,IAAI;AACvD,qBAAe,cAAc;AAC7B,cAAQ,YAAY,cAAc;AAAA,IACnC;AAEA,UAAM,QAAQ,SAAS,gBAAgB,8BAA8B,OAAO;AAC5E,UAAM,aAAa,sBAAsB,cAAc;AACvD,UAAM,aAAa,KAAK,IAAI,IAAI,UAAU,IAAI;AAC9C,UAAM,aAAa,KAAK,IAAI,IAAI,UAAU,IAAI;AAC9C,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,cAAc;AACpB,YAAQ,YAAY,KAAK;AAEzB,qBAAiB,IAAI;AAAA,EACtB;AAEA,MAAI,KAAK,UAAU,KAAK,aAAa;AACpC,YAAQ,aAAa,UAAU,KAAK,MAAM;AAC1C,YAAQ,aAAa,gBAAgB,KAAK,cAAc,IAAI;AAAA,EAC7D;AAEA,MAAI,KAAK,MAAM;AACd,YAAQ,aAAa,QAAQ,KAAK,IAAI;AAAA,EACvC;AAEA,SAAO;AACR;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|