lost-sia 2.0.1-alpha9 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/Annotation/logic/Annotation.d.ts +17 -0
- package/dist/Annotation/logic/Annotation.js +1 -1
- package/dist/Annotation/ui/AnnotationComponent.d.ts +24 -0
- package/dist/Annotation/ui/AnnotationComponent.js +1 -1
- package/dist/Annotation/ui/atoms/AnnoBar.d.ts +15 -0
- package/dist/Annotation/ui/atoms/AnnoBar.js +1 -1
- package/dist/Annotation/ui/atoms/DaviIcon.d.ts +9 -0
- package/dist/Annotation/ui/atoms/Edge.d.ts +17 -0
- package/dist/Annotation/ui/atoms/Edge.js +1 -1
- package/dist/Annotation/ui/atoms/Node.d.ts +17 -0
- package/dist/Annotation/ui/atoms/Node.js +1 -1
- package/dist/Annotation/ui/atoms/PolygonArea.d.ts +16 -0
- package/dist/Annotation/ui/atoms/PolygonArea.js +1 -1
- package/dist/Annotation/ui/tools/BBox.d.ts +21 -0
- package/dist/Annotation/ui/tools/BBox.js +1 -1
- package/dist/Annotation/ui/tools/Line.d.ts +21 -0
- package/dist/Annotation/ui/tools/Line.js +1 -1
- package/dist/Annotation/ui/tools/Point.d.ts +16 -0
- package/dist/Annotation/ui/tools/Point.js +1 -1
- package/dist/Annotation/ui/tools/Polygon.d.ts +23 -0
- package/dist/Annotation/ui/tools/Polygon.js +1 -1
- package/dist/Canvas/Canvas.d.ts +31 -0
- package/dist/Canvas/Canvas.js +1 -1
- package/dist/Canvas/LabelInput.d.ts +11 -0
- package/dist/Canvas/LabelInput.js +1 -1
- package/dist/IconButton.d.ts +25 -0
- package/dist/IconButton.js +1 -0
- package/dist/Sia.d.ts +33 -0
- package/dist/Sia.js +1 -1
- package/dist/Toolbar/Toolbar.d.ts +21 -0
- package/dist/Toolbar/Toolbar.js +1 -1
- package/dist/Toolbar/ToolbarItems/AccessibilityTools.d.ts +7 -0
- package/dist/Toolbar/ToolbarItems/AccessibilityTools.js +1 -1
- package/dist/Toolbar/ToolbarItems/AnnoToolSelector.d.ts +11 -0
- package/dist/Toolbar/ToolbarItems/AnnoToolSelector.js +1 -1
- package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.d.ts +11 -0
- package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.js +1 -0
- package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.d.ts +11 -0
- package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.js +1 -1
- package/dist/Toolbar/ToolbarItems/ImageTools.d.ts +13 -0
- package/dist/Toolbar/ToolbarItems/ImageTools.js +1 -1
- package/dist/Toolbar/ToolbarItems/Instructions.d.ts +2 -0
- package/dist/Toolbar/ToolbarItems/InstructionsModal.d.ts +6 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1 -1
- package/dist/models/AnnotationMode.d.ts +11 -0
- package/dist/models/AnnotationStatus.d.ts +8 -0
- package/dist/models/AnnotationTool.d.ts +7 -0
- package/dist/models/CanvasAction.d.ts +28 -0
- package/dist/models/Direction.d.ts +7 -0
- package/dist/models/EditorModes.d.ts +11 -0
- package/dist/models/KeyAction.d.ts +22 -0
- package/dist/models/KeyAction.js +1 -1
- package/dist/models/NotificationType.d.ts +7 -0
- package/dist/models/NotificationType.js +1 -0
- package/dist/models/index.d.ts +6 -0
- package/dist/models/index.js +1 -1
- package/dist/stories/AnnotationTools.stories.d.ts +40 -0
- package/dist/stories/Canvas/Canvas.stories.d.ts +50 -0
- package/dist/stories/Canvas/CanvasOffset.d.ts +13 -0
- package/dist/stories/Canvas/CanvasWithOffset.stories.d.ts +36 -0
- package/dist/stories/FilterDropdown.stories.d.ts +19 -0
- package/dist/stories/MinimalSia.stories.d.ts +66 -0
- package/dist/stories/SIA/DemoWrapper.d.ts +8 -0
- package/dist/stories/SIA/DemoWrapper.stories.d.ts +27 -0
- package/dist/stories/SIA/SIA.stories.d.ts +72 -0
- package/dist/stories/Toolbar/ImageTools/TagLabel.stories.d.ts +21 -0
- package/dist/stories/Toolbar/Instructions.stories.d.ts +11 -0
- package/dist/stories/Toolbar/Toolbar.stories.d.ts +37 -0
- package/dist/stories/exampleData/exampleAnnotations.d.ts +8 -0
- package/dist/stories/exampleData/exampleExternalAnnotations.d.ts +8 -0
- package/dist/stories/exampleData/exampleImage.d.ts +2 -0
- package/dist/stories/exampleData/exampleLabels.d.ts +6 -0
- package/dist/types.d.ts +57 -0
- package/dist/utils/KeyMapper.d.ts +9 -0
- package/dist/utils/KeyMapper.js +1 -1
- package/dist/utils/TimeUtils.d.ts +4 -0
- package/dist/utils/TimeUtils.js +1 -0
- package/dist/utils/color.d.ts +2 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +1 -1
- package/dist/utils/mouse.d.ts +6 -0
- package/dist/utils/mouse.js +1 -1
- package/dist/utils/siaIcons.js +5 -5
- package/dist/utils/transform.d.ts +28 -0
- package/dist/utils/transform.js +1 -1
- package/dist/utils/windowViewport.d.ts +22 -0
- package/dist/utils/windowViewport.js +1 -1
- package/package.json +19 -16
- package/src/AnnoExampleViewer.jsx +18 -18
- package/src/Annotation/logic/Annotation.ts +24 -26
- package/src/Annotation/ui/AnnotationComponent.tsx +115 -86
- package/src/Annotation/ui/atoms/AnnoBar.tsx +51 -53
- package/src/Annotation/ui/atoms/DaviIcon.tsx +12 -22
- package/src/Annotation/ui/atoms/Edge.tsx +25 -22
- package/src/Annotation/ui/atoms/Node.tsx +56 -50
- package/src/Annotation/ui/atoms/PolygonArea.tsx +30 -35
- package/src/Annotation/ui/tools/BBox.tsx +136 -150
- package/src/Annotation/ui/tools/Line.tsx +94 -91
- package/src/Annotation/ui/tools/Point.tsx +19 -17
- package/src/Annotation/ui/tools/Polygon.tsx +126 -95
- package/src/Canvas/Canvas.tsx +748 -594
- package/src/Canvas/LabelInput.tsx +68 -45
- package/src/IconButton.tsx +119 -0
- package/src/InfoBoxes/AnnoDetails.jsx +53 -53
- package/src/InfoBoxes/AnnoStats.jsx +41 -41
- package/src/InfoBoxes/InfoBox.jsx +16 -16
- package/src/InfoBoxes/InfoBoxArea.jsx +32 -34
- package/src/InfoBoxes/LabelInfo.jsx +30 -30
- package/src/SIASettingButton.jsx +25 -25
- package/src/Sia.tsx +484 -0
- package/src/Toolbar/Toolbar.tsx +38 -31
- package/src/Toolbar/ToolbarItems/AccessibilityTools.tsx +26 -46
- package/src/Toolbar/ToolbarItems/AnnoToolSelector.tsx +53 -46
- package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.tsx +127 -0
- package/src/Toolbar/ToolbarItems/ImageToolItems/TagLabel.tsx +29 -28
- package/src/Toolbar/ToolbarItems/ImageTools.tsx +43 -40
- package/src/Toolbar/ToolbarItems/Instructions.tsx +47 -50
- package/src/Toolbar/ToolbarItems/InstructionsModal.tsx +8 -8
- package/src/index.ts +9 -13
- package/src/models/{AnnotationMode.tsx → AnnotationMode.ts} +1 -1
- package/src/models/{AnnotationStatus.tsx → AnnotationStatus.ts} +1 -1
- package/src/models/{AnnotationTool.tsx → AnnotationTool.ts} +1 -1
- package/src/models/{CanvasAction.tsx → CanvasAction.ts} +1 -1
- package/src/models/{Direction.tsx → Direction.ts} +1 -1
- package/src/models/{EditorModes.tsx → EditorModes.ts} +1 -1
- package/src/models/{KeyAction.tsx → KeyAction.ts} +3 -1
- package/src/models/NotificationType.ts +8 -0
- package/src/models/index.ts +6 -7
- package/src/siaDummyData.js +71 -71
- package/src/stories/AnnotationTools.mdx +27 -0
- package/src/stories/AnnotationTools.stories.tsx +104 -0
- package/src/stories/Canvas/Canvas.stories.tsx +59 -113
- package/src/stories/Canvas/CanvasOffset.tsx +54 -38
- package/src/stories/Canvas/CanvasWithOffset.stories.tsx +42 -113
- package/src/stories/FilterDropdown.stories.ts +13 -11
- package/src/stories/MinimalSIA.mdx +20 -0
- package/src/stories/MinimalSia.stories.tsx +90 -0
- package/src/stories/SIA/DemoWrapper.stories.tsx +71 -0
- package/src/stories/SIA/DemoWrapper.tsx +55 -0
- package/src/stories/SIA/SIA.stories.tsx +79 -45
- package/src/stories/Toolbar/ImageTools/TagLabel.stories.tsx +11 -12
- package/src/stories/Toolbar/Instructions.stories.tsx +11 -11
- package/src/stories/Toolbar/Toolbar.stories.tsx +32 -47
- package/src/stories/Welcome.mdx +5 -0
- package/src/stories/development/CoordinateSystems.mdx +25 -0
- package/src/stories/exampleData/exampleAnnotations.ts +65 -0
- package/src/stories/exampleData/exampleExternalAnnotations.ts +115 -0
- package/src/stories/{siaDummyData2.ts → exampleData/exampleImage.ts} +3 -264
- package/src/stories/exampleData/exampleLabels.ts +146 -0
- package/src/stories/main.scss +6 -0
- package/src/styles/style.scss +1 -26
- package/src/types.ts +67 -0
- package/src/utils/KeyMapper.ts +76 -74
- package/src/utils/TimeUtils.ts +11 -0
- package/src/utils/color.ts +25 -25
- package/src/utils/hist.js +22 -22
- package/src/utils/index.ts +2 -3
- package/src/utils/mouse.ts +45 -0
- package/src/utils/siaIcons.jsx +5 -7
- package/src/utils/transform.ts +186 -0
- package/src/utils/uiConfig.js +19 -22
- package/src/utils/windowViewport.ts +34 -0
- package/dist/AnnoExampleViewer.cjs +0 -1
- package/dist/AnnoExampleViewer.js +0 -1
- package/dist/AnnoLabelInput.cjs +0 -1
- package/dist/AnnoLabelInput.js +0 -1
- package/dist/AnnoToolBar.cjs +0 -19
- package/dist/AnnoToolBar.js +0 -19
- package/dist/Annotation/AnnoBar.cjs +0 -1
- package/dist/Annotation/AnnoBar.js +0 -1
- package/dist/Annotation/Annotation.cjs +0 -1
- package/dist/Annotation/Annotation.js +0 -1
- package/dist/Annotation/BBox.cjs +0 -1
- package/dist/Annotation/BBox.js +0 -1
- package/dist/Annotation/Edge.cjs +0 -1
- package/dist/Annotation/Edge.js +0 -1
- package/dist/Annotation/InfSelectionArea.cjs +0 -1
- package/dist/Annotation/InfSelectionArea.js +0 -1
- package/dist/Annotation/Line.cjs +0 -1
- package/dist/Annotation/Line.js +0 -1
- package/dist/Annotation/Node.cjs +0 -1
- package/dist/Annotation/Node.js +0 -1
- package/dist/Annotation/Point.cjs +0 -1
- package/dist/Annotation/Point.js +0 -1
- package/dist/Annotation/Polygon.cjs +0 -1
- package/dist/Annotation/Polygon.js +0 -1
- package/dist/Annotation/logic/Annotation.cjs +0 -1
- package/dist/Annotation/logic/AnnotationUtils.cjs +0 -1
- package/dist/Annotation/logic/AnnotationUtils.js +0 -1
- package/dist/Annotation/ui/AnnotationComponent.cjs +0 -1
- package/dist/Annotation/ui/atoms/AnnoBar.cjs +0 -1
- package/dist/Annotation/ui/atoms/DaviIcon.cjs +0 -19
- package/dist/Annotation/ui/atoms/Edge.cjs +0 -1
- package/dist/Annotation/ui/atoms/Node.cjs +0 -1
- package/dist/Annotation/ui/atoms/PolygonArea.cjs +0 -1
- package/dist/Annotation/ui/tools/BBox.cjs +0 -1
- package/dist/Annotation/ui/tools/Line.cjs +0 -1
- package/dist/Annotation/ui/tools/Point.cjs +0 -1
- package/dist/Annotation/ui/tools/Polygon.cjs +0 -1
- package/dist/Canvas/Canvas.cjs +0 -1
- package/dist/Canvas/LabelInput.cjs +0 -1
- package/dist/Canvas.cjs +0 -1
- package/dist/Canvas.js +0 -1
- package/dist/ImgBar.cjs +0 -1
- package/dist/ImgBar.js +0 -1
- package/dist/InfoBoxes/AnnoDetails.cjs +0 -1
- package/dist/InfoBoxes/AnnoDetails.js +0 -1
- package/dist/InfoBoxes/AnnoStats.cjs +0 -1
- package/dist/InfoBoxes/AnnoStats.js +0 -1
- package/dist/InfoBoxes/InfoBox.cjs +0 -1
- package/dist/InfoBoxes/InfoBox.js +0 -1
- package/dist/InfoBoxes/InfoBoxArea.cjs +0 -1
- package/dist/InfoBoxes/InfoBoxArea.js +0 -1
- package/dist/InfoBoxes/LabelInfo.cjs +0 -1
- package/dist/InfoBoxes/LabelInfo.js +0 -1
- package/dist/LabelInput.cjs +0 -1
- package/dist/LabelInput.js +0 -1
- package/dist/Prompt.cjs +0 -1
- package/dist/Prompt.js +0 -1
- package/dist/SIAFilterButton.cjs +0 -1
- package/dist/SIAFilterButton.js +0 -1
- package/dist/SIASettingButton.cjs +0 -1
- package/dist/SIASettingButton.js +0 -1
- package/dist/Sia.cjs +0 -1
- package/dist/Sia2.cjs +0 -1
- package/dist/Sia2.js +0 -1
- package/dist/SiaPopup.cjs +0 -1
- package/dist/SiaPopup.js +0 -1
- package/dist/ToolBar.cjs +0 -1
- package/dist/ToolBar.js +0 -1
- package/dist/Toolbar/NavigationButtons.cjs +0 -1
- package/dist/Toolbar/NavigationButtons.js +0 -1
- package/dist/Toolbar/Toolbar.cjs +0 -1
- package/dist/Toolbar/ToolbarItems/AccessibilityTools.cjs +0 -1
- package/dist/Toolbar/ToolbarItems/AnnoToolSelector.cjs +0 -1
- package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.cjs +0 -1
- package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.js +0 -1
- package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.cjs +0 -1
- package/dist/Toolbar/ToolbarItems/ImageTools.cjs +0 -1
- package/dist/Toolbar/ToolbarItems/Instructions.cjs +0 -1
- package/dist/Toolbar/ToolbarItems/InstructionsModal.cjs +0 -1
- package/dist/ToolbarItem.cjs +0 -1
- package/dist/ToolbarItem.js +0 -1
- package/dist/_virtual/_commonjsHelpers.cjs +0 -1
- package/dist/_virtual/_commonjsHelpers.js +0 -1
- package/dist/_virtual/lodash.cjs +0 -1
- package/dist/_virtual/lodash.js +0 -1
- package/dist/assets/Annotation/Annotation-Cd5Ua5TG.css +0 -1
- package/dist/assets/Toolbar-Cp1xyYeH.css +0 -1
- package/dist/filterTools.cjs +0 -1
- package/dist/filterTools.js +0 -1
- package/dist/index.cjs +0 -1
- package/dist/models/AllowedTools.cjs +0 -1
- package/dist/models/AllowedTools.js +0 -1
- package/dist/models/AnnotationMode.cjs +0 -1
- package/dist/models/AnnotationSettings.cjs +0 -1
- package/dist/models/AnnotationSettings.js +0 -1
- package/dist/models/AnnotationStatus.cjs +0 -1
- package/dist/models/AnnotationTool.cjs +0 -1
- package/dist/models/CanvasAction.cjs +0 -1
- package/dist/models/Direction.cjs +0 -1
- package/dist/models/EditorModes.cjs +0 -1
- package/dist/models/ExternalAnnotation.cjs +0 -1
- package/dist/models/ExternalAnnotation.js +0 -1
- package/dist/models/KeyAction.cjs +0 -1
- package/dist/models/Label.cjs +0 -1
- package/dist/models/Label.js +0 -1
- package/dist/models/UiConfig.cjs +0 -1
- package/dist/models/UiConfig.js +0 -1
- package/dist/models/index.cjs +0 -1
- package/dist/siaDummyData.cjs +0 -7
- package/dist/siaDummyData.js +0 -7
- package/dist/stories/Canvas/CanvasOffset.cjs +0 -1
- package/dist/stories/Canvas/CanvasOffset.js +0 -1
- package/dist/stories/FilterDropdown.stories.cjs +0 -1
- package/dist/stories/FilterDropdown.stories.js +0 -1
- package/dist/stories/SIA2/DemoWrapper.cjs +0 -1
- package/dist/stories/SIA2/DemoWrapper.js +0 -1
- package/dist/stories/siaDummyData.cjs +0 -1
- package/dist/stories/siaDummyData.js +0 -1
- package/dist/stories/siaDummyData2.cjs +0 -7
- package/dist/stories/siaDummyData2.js +0 -7
- package/dist/types/annoStatus.cjs +0 -1
- package/dist/types/annoStatus.js +0 -1
- package/dist/types/canvasActions.cjs +0 -1
- package/dist/types/canvasActions.js +0 -1
- package/dist/types/cursorstyles.cjs +0 -1
- package/dist/types/cursorstyles.js +0 -1
- package/dist/types/modes.cjs +0 -1
- package/dist/types/modes.js +0 -1
- package/dist/types/notificationType.cjs +0 -1
- package/dist/types/notificationType.js +0 -1
- package/dist/types/toolbarEvents.cjs +0 -1
- package/dist/types/toolbarEvents.js +0 -1
- package/dist/types/tools.cjs +0 -1
- package/dist/types/tools.js +0 -1
- package/dist/types.cjs +0 -1
- package/dist/utils/KeyMapper.cjs +0 -1
- package/dist/utils/annoConversion.cjs +0 -1
- package/dist/utils/annoConversion.js +0 -1
- package/dist/utils/annoConversion2.cjs +0 -1
- package/dist/utils/annoConversion2.js +0 -1
- package/dist/utils/color.cjs +0 -1
- package/dist/utils/colorlut.cjs +0 -1
- package/dist/utils/colorlut.js +0 -1
- package/dist/utils/constraints.cjs +0 -1
- package/dist/utils/constraints.js +0 -1
- package/dist/utils/hist.cjs +0 -1
- package/dist/utils/hist.js +0 -1
- package/dist/utils/index.cjs +0 -1
- package/dist/utils/keyActions.cjs +0 -1
- package/dist/utils/keyActions.js +0 -1
- package/dist/utils/mouse.cjs +0 -1
- package/dist/utils/mouse2.cjs +0 -1
- package/dist/utils/mouse2.js +0 -1
- package/dist/utils/siaIcons.cjs +0 -12
- package/dist/utils/transform.cjs +0 -1
- package/dist/utils/transform2.cjs +0 -1
- package/dist/utils/transform2.js +0 -1
- package/dist/utils/uiConfig.cjs +0 -1
- package/dist/utils/windowViewport.cjs +0 -1
- package/dist/utils/windowViewport2.cjs +0 -1
- package/dist/utils/windowViewport2.js +0 -1
- package/src/AnnoLabelInput.jsx +0 -109
- package/src/AnnoToolBar.jsx +0 -153
- package/src/Annotation/AnnoBar.jsx +0 -154
- package/src/Annotation/Annotation.jsx +0 -395
- package/src/Annotation/Annotation.scss +0 -47
- package/src/Annotation/BBox.jsx +0 -299
- package/src/Annotation/Edge.jsx +0 -92
- package/src/Annotation/InfSelectionArea.jsx +0 -72
- package/src/Annotation/Line.jsx +0 -68
- package/src/Annotation/Node.jsx +0 -282
- package/src/Annotation/Point.jsx +0 -200
- package/src/Annotation/Polygon.jsx +0 -404
- package/src/Annotation/logic/AnnotationUtils.ts +0 -30
- package/src/Canvas.jsx +0 -2194
- package/src/ImgBar.jsx +0 -131
- package/src/LabelInput.jsx +0 -238
- package/src/Prompt.jsx +0 -45
- package/src/SIAFilterButton.jsx +0 -186
- package/src/Sia.jsx +0 -478
- package/src/Sia2.tsx +0 -392
- package/src/SiaPopup.jsx +0 -15
- package/src/ToolBar.jsx +0 -463
- package/src/Toolbar/NavigationButtons.tsx +0 -21
- package/src/Toolbar/ToolbarItem.jsx +0 -30
- package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.tsx +0 -62
- package/src/Toolbar.css +0 -13
- package/src/ToolbarItem.jsx +0 -31
- package/src/filterTools.js +0 -5
- package/src/models/AllowedTools.tsx +0 -9
- package/src/models/AnnotationSettings.tsx +0 -9
- package/src/models/ExternalAnnotation.ts +0 -15
- package/src/models/Label.tsx +0 -8
- package/src/models/UiConfig.tsx +0 -6
- package/src/stories/Button.jsx +0 -54
- package/src/stories/Button.stories.js +0 -48
- package/src/stories/Header.jsx +0 -69
- package/src/stories/Header.stories.js +0 -28
- package/src/stories/Page.jsx +0 -87
- package/src/stories/Page.stories.js +0 -28
- package/src/stories/SIA2/DemoWrapper.stories.tsx +0 -167
- package/src/stories/SIA2/DemoWrapper.tsx +0 -54
- package/src/stories/SIA2/Sia2.stories.tsx +0 -62
- package/src/stories/Toolbar/ImageTools/ImageLabel.stories.tsx +0 -32
- package/src/stories/assets/accessibility.png +0 -0
- package/src/stories/assets/accessibility.svg +0 -5
- package/src/stories/assets/addon-library.png +0 -0
- package/src/stories/assets/assets.png +0 -0
- package/src/stories/assets/avif-test-image.avif +0 -0
- package/src/stories/assets/context.png +0 -0
- package/src/stories/assets/discord.svg +0 -15
- package/src/stories/assets/docs.png +0 -0
- package/src/stories/assets/figma-plugin.png +0 -0
- package/src/stories/assets/github.svg +0 -3
- package/src/stories/assets/share.png +0 -0
- package/src/stories/assets/styling.png +0 -0
- package/src/stories/assets/testing.png +0 -0
- package/src/stories/assets/theming.png +0 -0
- package/src/stories/assets/tutorials.svg +0 -12
- package/src/stories/assets/youtube.svg +0 -4
- package/src/stories/button.css +0 -30
- package/src/stories/header.css +0 -32
- package/src/stories/lost.js +0 -54
- package/src/stories/page.css +0 -69
- package/src/stories/siaDummyData.js +0 -263
- package/src/stories/store.js +0 -18
- package/src/test.js +0 -7
- package/src/types/annoStatus.js +0 -4
- package/src/types/canvasActions.js +0 -58
- package/src/types/cursorstyles.js +0 -3
- package/src/types/modes.js +0 -9
- package/src/types/notificationType.js +0 -11
- package/src/types/toolbarEvents.js +0 -35
- package/src/types/tools.js +0 -17
- package/src/types.tsx +0 -11
- package/src/utils/annoConversion.js +0 -145
- package/src/utils/annoConversion2.ts +0 -145
- package/src/utils/colorlut.js +0 -68
- package/src/utils/constraints.js +0 -81
- package/src/utils/index.js +0 -1
- package/src/utils/keyActions.js +0 -113
- package/src/utils/mouse.js +0 -14
- package/src/utils/mouse2.ts +0 -35
- package/src/utils/transform.js +0 -336
- package/src/utils/transform2.ts +0 -343
- package/src/utils/windowViewport.js +0 -34
- package/src/utils/windowViewport2.ts +0 -50
package/README.md
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AnnotationMode } from '../../models';
|
|
2
|
+
import { default as AnnotationStatus } from '../../models/AnnotationStatus';
|
|
3
|
+
import { default as AnnotationTool } from '../../models/AnnotationTool';
|
|
4
|
+
import { Point } from '../../types';
|
|
5
|
+
declare class Annotation {
|
|
6
|
+
internalId: number;
|
|
7
|
+
externalId?: string;
|
|
8
|
+
annoTime: number;
|
|
9
|
+
coordinates: Point[];
|
|
10
|
+
labelIds?: number[];
|
|
11
|
+
mode: AnnotationMode;
|
|
12
|
+
selectedNode: number;
|
|
13
|
+
status: AnnotationStatus;
|
|
14
|
+
type: AnnotationTool;
|
|
15
|
+
constructor(internalId: number, type: AnnotationTool, coordinates: Point[], mode?: AnnotationMode, status?: AnnotationStatus, externalId?: string);
|
|
16
|
+
}
|
|
17
|
+
export default Annotation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
var r=Object.defineProperty;var l=(o,e,s)=>e in o?r(o,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):o[e]=s;var t=(o,e,s)=>l(o,typeof e!="symbol"?e+"":e,s);import h from"../../models/AnnotationMode.js";import m from"../../models/AnnotationStatus.js";class u{constructor(e,s,n,i=h.CREATE,a=m.CREATING,d=""){t(this,"internalId");t(this,"externalId");t(this,"annoTime");t(this,"coordinates");t(this,"labelIds");t(this,"mode");t(this,"selectedNode");t(this,"status");t(this,"type");this.internalId=e,this.externalId=d,this.labelIds=[],this.type=s,this.mode=i,this.status=a,this.coordinates=n,this.selectedNode=1,this.annoTime=0}}export{u as default};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { default as Annotation } from '../logic/Annotation';
|
|
2
|
+
import { default as CanvasAction } from '../../models/CanvasAction';
|
|
3
|
+
import { AnnotationSettings, Label, Point, SIANotification } from '../../types';
|
|
4
|
+
import { default as AnnotationMode } from '../../models/AnnotationMode';
|
|
5
|
+
type AnnotationComponentProps = {
|
|
6
|
+
scaledAnnotation: Annotation;
|
|
7
|
+
annotationSettings: AnnotationSettings;
|
|
8
|
+
possibleLabels: Label[];
|
|
9
|
+
svgScale: number;
|
|
10
|
+
svgTranslation: Point;
|
|
11
|
+
pageToStageOffset: Point;
|
|
12
|
+
strokeWidth: number;
|
|
13
|
+
nodeRadius: number;
|
|
14
|
+
isSelected: boolean;
|
|
15
|
+
isDisabled?: boolean;
|
|
16
|
+
onFinishAnnoCreate: (fullyCreatedAnnotation: Annotation) => void;
|
|
17
|
+
onLabelIconClicked: (markerPosition: Point) => void;
|
|
18
|
+
onAction?: (annotation: Annotation, canvasAction: CanvasAction) => void;
|
|
19
|
+
onAnnoChanged?: (annotation: Annotation) => void;
|
|
20
|
+
onAnnotationModeChange?: (annotationMode: AnnotationMode) => void;
|
|
21
|
+
onNotification?: (notification: SIANotification) => void;
|
|
22
|
+
};
|
|
23
|
+
declare const AnnotationComponent: ({ scaledAnnotation, annotationSettings, possibleLabels, svgScale, svgTranslation, pageToStageOffset, strokeWidth, nodeRadius, isSelected, isDisabled, onFinishAnnoCreate, onLabelIconClicked, onAction, onAnnoChanged, onAnnotationModeChange, onNotification, }: AnnotationComponentProps) => import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export default AnnotationComponent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as G,jsx as d}from"react/jsx-runtime";import E from"../../models/AnnotationTool.js";import{getDefaultColor as L}from"../../utils/color.js";import H from"./tools/Point.js";import J from"./tools/Line.js";import K from"./atoms/AnnoBar.js";import Q from"../../models/CanvasAction.js";import X from"./tools/BBox.js";import Y from"./tools/Polygon.js";import{useState as h,useRef as x,useEffect as I}from"react";import e from"../../models/AnnotationMode.js";import Z from"../../utils/TimeUtils.js";const fo=({scaledAnnotation:r,annotationSettings:m,possibleLabels:A,svgScale:i,svgTranslation:f,pageToStageOffset:a,strokeWidth:B,nodeRadius:P,isSelected:c,isDisabled:V=!1,onFinishAnnoCreate:w,onLabelIconClicked:W,onAction:k=(n,l)=>{},onAnnoChanged:b=n=>{},onAnnotationModeChange:F=n=>{},onNotification:O=n=>{}})=>{const[n,l]=h(r.coordinates),[t,M]=h(r.mode),[j,C]=h(!1),R=x(void 0),[_,U]=h();I(()=>{R.current=_},[_]);const N=x(n);I(()=>{N.current=n},[n]);const y=()=>{M(e.VIEW);const o={...r,coordinates:N.current};w(o)},q=o=>A.find(s=>s.id===o),T=(()=>{if(!r.labelIds||r.labelIds.length==0)return L();const o=q(r.labelIds[0]);return(o==null?void 0:o.color)===void 0||o.color===null?L():o.color})(),u={stroke:T,fill:T,strokeWidth:B/i,r:P/i},D=o=>{l(o);let s=o;[e.ADD,e.MOVE].includes(t)&&(s=o.slice(0,-1)),b({...r,coordinates:s})},p=o=>{[e.ADD,e.CREATE,e.MOVE].includes(t)||(M(e.MOVE),U(performance.now())),l(o)},g=()=>{M(e.VIEW);const o=Z.getRoundedDuration(R.current,performance.now()),s=Number.isNaN(r.annoTime)||r.annoTime===null?o:r.annoTime+o;b({...r,coordinates:N.current,annoTime:s})};I(()=>{F(t)},[t]),I(()=>{t===e.CREATE||t===e.ADD||l(r.coordinates)},[r]);const z=()=>{switch(r.type){case E.Point:return d(H,{isSelected:c,annotationSettings:m,coordinates:n[0],pageToStageOffset:a,svgScale:i,svgTranslation:f,style:u,onMoving:o=>p([o]),onMoved:g,onIsDraggingStateChanged:C});case E.Line:return d(J,{annotationSettings:m,coordinates:n,isSelected:c,pageToStageOffset:a,annotationMode:t,svgScale:i,svgTranslation:f,style:u,onAddNode:D,onDeleteNode:D,onMoving:p,onMoved:g,onIsDraggingStateChanged:C,onFinishAnnoCreate:y});case E.BBox:return d(X,{annotationMode:t,annotationSettings:m,startCoords:n[0],endCoords:n[1],isSelected:c,pageToStageOffset:a,style:u,svgScale:i,svgTranslation:f,onDeleteNode:()=>{console.log("TODO")},onIsDraggingStateChanged:C,onFinishAnnoCreate:y,onMoving:p,onMoved:g});case E.Polygon:return d(Y,{annotationSettings:m,coordinates:n,isSelected:c,isDisabled:V,pageToStageOffset:a,annotationMode:t,svgScale:i,svgTranslation:f,style:u,onAddNode:D,onDeleteNode:D,onMoving:p,onMoved:g,onNotification:O,onIsDraggingStateChanged:C,onFinishAnnoCreate:y})}};return G("g",{onClick:o=>{o.stopPropagation(),k(r,Q.ANNO_SELECTED)},children:[!j&&t!==e.CREATE&&d(K,{annotationCoordinates:n,canLabel:m.canLabel,labels:A,color:T,isSelected:c,selectedLabelIds:r.labelIds,style:u,svgScale:i,onLabelIconClicked:W}),z()]})};export{fo as default};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { Label, Point } from '../../../types';
|
|
3
|
+
type AnnoBarProps = {
|
|
4
|
+
annotationCoordinates: Point[];
|
|
5
|
+
canLabel: boolean;
|
|
6
|
+
color: string;
|
|
7
|
+
labels: Label[];
|
|
8
|
+
selectedLabelIds: number[];
|
|
9
|
+
isSelected: boolean;
|
|
10
|
+
svgScale: number;
|
|
11
|
+
style: CSSProperties;
|
|
12
|
+
onLabelIconClicked: (markerPosition: Point) => void;
|
|
13
|
+
};
|
|
14
|
+
declare const AnnoBar: ({ annotationCoordinates, canLabel, color, labels, selectedLabelIds, isSelected, svgScale, style, onLabelIconClicked, }: AnnoBarProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export default AnnoBar;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as _,jsx as x}from"react/jsx-runtime";import{useState as r,useRef as C,useEffect as
|
|
1
|
+
import{jsxs as _,jsx as x}from"react/jsx-runtime";import{useState as r,useRef as C,useEffect as f}from"react";import T from"../../../utils/transform.js";import H from"./DaviIcon.js";const R=10,a=15,j=3,U=({annotationCoordinates:u,canLabel:y,color:b,labels:E,selectedLabelIds:h=[],isSelected:L,svgScale:t,style:d,onLabelIconClicked:P})=>{const[c,w]=r({x:0,y:0}),e={x:c.x+7/t,y:c.y-10/t},[p,D]=r(0),[z,A]=r(0),[l,B]=r(0),[m,F]=r(""),s=C(null);f(()=>{F(W())},[h]),f(()=>{const o=T.getTopPoint(u),i=T.getMostLeftPoints(o)[0];w(i);const n=Math.ceil(R/t);B(n),A(a/t)},[t]),f(()=>{if(s===void 0)return;const n=(s.current.getBoundingClientRect().width+j)/t;D(n)},[s,m,l]);const W=()=>{const i=E.filter(n=>h.includes(n.id)).map(n=>n.name).join(", ");return i.length?i:"no label"};return _("g",{children:[L&&y&&x(H,{x:e.x-33/t,y:e.y-30/t,color:b,size:60/t,onClick:()=>P(c)}),x("rect",{x:e.x,y:e.y-6/(t*1.2),width:p,height:z,rx:5/t,opacity:"0.5",style:d}),x("text",{x:e.x+1/t,y:e.y+6/t,fill:"white",textAnchor:"start",alignmentBaseline:"central",ref:s,fontSize:`${l}pt`,children:m}),x("rect",{x:e.x,y:e.y-6/(t*1.2),width:p,height:a,rx:5/t,opacity:"0.01",style:d,onContextMenu:o=>o.preventDefault()})]})};export{U as default};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CSSProperties, MouseEvent } from 'react';
|
|
2
|
+
import { Point, Vector2 } from '../../../types';
|
|
3
|
+
type EdgeProps = {
|
|
4
|
+
startCoordinate: Point;
|
|
5
|
+
endCoordinate: Point;
|
|
6
|
+
isDisabled?: boolean;
|
|
7
|
+
pageToStageOffset: Point;
|
|
8
|
+
svgScale: number;
|
|
9
|
+
svgTranslation: Vector2;
|
|
10
|
+
style: CSSProperties;
|
|
11
|
+
onAddNode?: (coordinate: Point) => void;
|
|
12
|
+
onDoubleClick?: (e: MouseEvent) => void;
|
|
13
|
+
onMouseDown: (e: MouseEvent) => void;
|
|
14
|
+
onMouseMove: (e: MouseEvent) => void;
|
|
15
|
+
};
|
|
16
|
+
declare const Edge: ({ startCoordinate, endCoordinate, isDisabled, pageToStageOffset, style, svgScale, svgTranslation, onAddNode, onDoubleClick, onMouseDown, onMouseMove, }: EdgeProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export default Edge;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as i}from"react/jsx-runtime";import d from"../../../utils/mouse.js";const S=({startCoordinate:o,endCoordinate:t,isDisabled:s=!1,pageToStageOffset:r,style:n,svgScale:a,svgTranslation:l,onAddNode:u=()=>{},onDoubleClick:x=()=>{},onMouseDown:c,onMouseMove:m})=>{const y=e=>{const f=d.getAntiScaledMouseStagePosition(e,r,a,l);u(f)};return i("line",{x1:o.x,y1:o.y,x2:t.x,y2:t.y,style:n,onClick:e=>e.ctrlKey&&y(e),onDoubleClick:x,onMouseDown:c,onMouseMove:m,onContextMenu:e=>e.preventDefault(),strokeDasharray:s?"10,5":"0"})};export{S as default};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { AnnotationSettings, Point } from '../../../types';
|
|
3
|
+
type NodeProps = {
|
|
4
|
+
index: number;
|
|
5
|
+
coordinates: Point;
|
|
6
|
+
annotationSettings: AnnotationSettings;
|
|
7
|
+
pageToStageOffset: Point;
|
|
8
|
+
svgScale: number;
|
|
9
|
+
svgTranslation: Point;
|
|
10
|
+
style: CSSProperties;
|
|
11
|
+
onDeleteNode: () => void;
|
|
12
|
+
onMoving: (index: number, coordinates: Point) => void;
|
|
13
|
+
onMoved: () => void;
|
|
14
|
+
onIsDraggingStateChanged: (bool: any) => void;
|
|
15
|
+
};
|
|
16
|
+
declare const Node: ({ index, coordinates, annotationSettings, pageToStageOffset, svgScale, svgTranslation, style, onDeleteNode, onMoving, onMoved, onIsDraggingStateChanged, }: NodeProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export default Node;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as H,jsx as u}from"react/jsx-runtime";import{useState as l,useRef as L,useEffect as m}from"react";import S from"../../../utils/mouse.js";const T=({index:v,coordinates:t,annotationSettings:o,pageToStageOffset:x,svgScale:r,svgTranslation:y,style:p,onDeleteNode:g,onMoving:D,onMoved:I,onIsDraggingStateChanged:A})=>{const[E,c]=l(!1),[n,i]=l(!1),[s,a]=l(!1),f=L(s);m(()=>{f.current=s},[s]);const M=e=>{if(!n)return;const C=S.getAntiScaledMouseStagePosition(e,x,r,y);(e.movementX!==0||e.movementY!==0)&&(a(!0),D(v,C))};m(()=>{if(A(n),!n)return;const e=()=>{i(!1),f.current&&I(),a(!1)};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[n]);const d=e=>{o.canEdit&&(e.ctrlKey?g():i(!0))},h=()=>u("circle",{cx:t.x,cy:t.y,r:12/r,onMouseLeave:e=>o.canEdit&&c(!1),onMouseDown:d,onContextMenu:e=>e.preventDefault()});return H("g",{children:[n&&u("circle",{cx:t.x,cy:t.y,r:"100%",style:{opacity:0},onMouseMove:e=>M(e),onContextMenu:e=>e.preventDefault()}),E&&h(),u("circle",{cx:t.x,cy:t.y,r:10/r,style:p,onMouseOver:()=>{o.canEdit&&c(!0)},onMouseDown:d,onMouseMove:e=>M(e),onContextMenu:e=>e.preventDefault()})]})};export{T as default};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { Point } from '../../../types';
|
|
3
|
+
import { default as AnnotationMode } from '../../../models/AnnotationMode';
|
|
4
|
+
type PolygonAreaProps = {
|
|
5
|
+
coordinates: Point[];
|
|
6
|
+
isSelected: boolean;
|
|
7
|
+
isDisabled?: boolean;
|
|
8
|
+
annotationMode: AnnotationMode;
|
|
9
|
+
style: CSSProperties;
|
|
10
|
+
onFinishAnnoCreate?: () => void;
|
|
11
|
+
onMouseDown: (e: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;
|
|
12
|
+
onMouseUp?: (e: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;
|
|
13
|
+
onMouseMove: (e: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;
|
|
14
|
+
};
|
|
15
|
+
declare const PolygonArea: ({ coordinates, isSelected, isDisabled, annotationMode, style, onFinishAnnoCreate, onMouseDown, onMouseUp, onMouseMove, }: PolygonAreaProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export default PolygonArea;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as m}from"react/jsx-runtime";import{useState as c,useEffect as C}from"react";import x from"../../../models/AnnotationMode.js";const E=({coordinates:
|
|
1
|
+
import{jsx as m}from"react/jsx-runtime";import{useState as c,useEffect as C}from"react";import x from"../../../models/AnnotationMode.js";const E=({coordinates:f,isSelected:n,isDisabled:e=!1,annotationMode:s,style:u,onFinishAnnoCreate:p=()=>{},onMouseDown:a,onMouseUp:l=()=>{},onMouseMove:i})=>{const y=f.map(o=>`${o.x},${o.y}`).join(" "),[g,r]=c("pointer");C(()=>{if(e)return r("not-allowed");r(n?"grab":"pointer")},[n,e]);const t={...u};return t.cursor=g,t.fillOpacity=n?0:.3,n&&e&&(t.stroke="none"),m("polygon",{points:y,style:t,onMouseDown:o=>{n&&r("grabbing"),a(o)},onMouseUp:o=>{r("grab"),l(o)},onDoubleClick:()=>s===x.CREATE&&p(),onMouseMove:i,onContextMenu:o=>o.preventDefault()})};export{E as default};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { AnnotationSettings, Point } from '../../../types';
|
|
3
|
+
import { default as AnnotationMode } from '../../../models/AnnotationMode';
|
|
4
|
+
type BBoxProps = {
|
|
5
|
+
annotationMode: AnnotationMode;
|
|
6
|
+
annotationSettings: AnnotationSettings;
|
|
7
|
+
pageToStageOffset: Point;
|
|
8
|
+
startCoords: Point;
|
|
9
|
+
endCoords: Point;
|
|
10
|
+
svgScale: number;
|
|
11
|
+
svgTranslation: Point;
|
|
12
|
+
isSelected: boolean;
|
|
13
|
+
style: CSSProperties;
|
|
14
|
+
onDeleteNode: (coordinates: Point[]) => void;
|
|
15
|
+
onFinishAnnoCreate: () => void;
|
|
16
|
+
onIsDraggingStateChanged: (newDraggingState: boolean) => void;
|
|
17
|
+
onMoving: (coordinates: Point[]) => void;
|
|
18
|
+
onMoved: () => void;
|
|
19
|
+
};
|
|
20
|
+
declare const BBox: ({ annotationMode, annotationSettings, pageToStageOffset, startCoords, endCoords, svgScale, svgTranslation, isSelected, style, onDeleteNode, onFinishAnnoCreate, onIsDraggingStateChanged, onMoving, onMoved, }: BBoxProps) => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export default BBox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as H,jsx as A}from"react/jsx-runtime";import{useState as E,useRef as J,useEffect as v}from"react";import K from"../atoms/Node.js";import i from"../../../models/AnnotationMode.js";import Q from"../../../utils/mouse.js";import V from"../atoms/PolygonArea.js";import W from"../atoms/Edge.js";const se=({annotationMode:m,annotationSettings:d,pageToStageOffset:y,startCoords:b,endCoords:x,svgScale:c,svgTranslation:R,isSelected:a,style:h,onDeleteNode:U,onFinishAnnoCreate:j,onIsDraggingStateChanged:w,onMoving:p,onMoved:C})=>{const t=[b,{x:b.x,y:x.y},x,{x:x.x,y:b.y}],[k,z]=E(m===i.CREATE),[l,T]=E(!1),[f,L]=E(!1),[B,_]=E(0),[D,g]=E(!1),M=J(D);v(()=>{M.current=D},[D]);const X=e=>{d.canEdit!==!1&&a&&m!==i.CREATE&&e.button===0&&T(!0)},$=e=>{d.canEdit!==!1&&a&&m!==i.CREATE&&e.button===0&&L(!0)},Y=e=>{if(l){const s=[{...t[0]},{...t[2]}].map(n=>{const u=n.x+=e.movementX/c,r=n.y+=e.movementY/c;return{x:u,y:r}});(e.movementX!==0||e.movementY!==0)&&(g(!0),p(s))}if(m===i.CREATE){const o=Q.getAntiScaledMouseStagePosition(e,y,c,R),n=[[...t][0],o];p(n)}};v(()=>{if(!k)return;const e=o=>{o.button===2&&(j(),z(!1))};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[k]),v(()=>{if(w(l),!l)return;const e=()=>{T(!1),M.current&&C(),g(!1)};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[l]),v(()=>{if(w(f),!f)return;const e=()=>{L(!1),M.current&&C(),g(!1)};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[f]);const q=()=>t.map((o,s)=>A(K,{index:s,annotationSettings:d,coordinates:o,pageToStageOffset:y,svgScale:c,svgTranslation:R,style:h,onDeleteNode:()=>{const n=[...t];n.splice(s,1),U(n)},onMoving:(n,u)=>{const r=[t[0],t[2]];switch(n){case 0:r[0]=u;break;case 1:r[0].x=u.x,r[1].y=u.y;break;case 2:r[1]=u;break;case 3:r[1].x=u.x,r[0].y=u.y;break}p(r)},onMoved:()=>C(),onIsDraggingStateChanged:w},`node_${s}`)),I=(e,o)=>{const s=[t[0],t[2]];switch(e){case 0:s[0].x+=o.movementX/c;break;case 1:s[1].y+=o.movementY/c;break;case 2:s[1].x+=o.movementX/c;break;case 3:s[0].y+=o.movementY/c;break}(o.movementX!==0||o.movementY!==0)&&(g(!0),p(s))},G=()=>t.map((o,s)=>{const n=s+1<t.length?t[s+1]:t[0],u=s%2===0?"ew-resize":"ns-resize";return A(W,{startCoordinate:o,endCoordinate:n,pageToStageOffset:y,svgScale:c,svgTranslation:R,style:{...h,cursor:u},onMouseDown:$,onMouseMove:r=>{_(s),f&&I(s,r)}},`edge_${s}`)}),N=e=>A("circle",{cx:t[0].x,cy:t[0].y,r:"100%",style:{opacity:0},onMouseDown:X,onMouseMove:o=>{e&&f&&I(B,o),e||Y(o)},onContextMenu:o=>o.preventDefault()});return H("g",{children:[(l||m===i.CREATE)&&N(!1),A(V,{coordinates:t,isSelected:a,annotationMode:m,style:h,onMouseDown:X,onMouseMove:Y}),f&&N(!0),a&&d.canEdit&&G(),a&&m!==i.CREATE&&q()]})};export{se as default};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { AnnotationSettings, Point } from '../../../types';
|
|
3
|
+
import { default as AnnotationMode } from '../../../models/AnnotationMode';
|
|
4
|
+
type LineProps = {
|
|
5
|
+
annotationSettings: AnnotationSettings;
|
|
6
|
+
coordinates: Point[];
|
|
7
|
+
isSelected: boolean;
|
|
8
|
+
annotationMode: AnnotationMode;
|
|
9
|
+
pageToStageOffset: Point;
|
|
10
|
+
svgScale: number;
|
|
11
|
+
svgTranslation: Point;
|
|
12
|
+
style: CSSProperties;
|
|
13
|
+
onAddNode: (coordinates: Point[]) => void;
|
|
14
|
+
onDeleteNode: (coordinates: Point[]) => void;
|
|
15
|
+
onFinishAnnoCreate: () => void;
|
|
16
|
+
onIsDraggingStateChanged: (newDraggingState: boolean) => void;
|
|
17
|
+
onMoving: (coordinates: Point[]) => void;
|
|
18
|
+
onMoved: () => void;
|
|
19
|
+
};
|
|
20
|
+
declare const Line: ({ annotationSettings, coordinates, isSelected, annotationMode, pageToStageOffset, svgScale, svgTranslation, style, onAddNode, onDeleteNode, onFinishAnnoCreate, onMoving, onMoved, onIsDraggingStateChanged, }: LineProps) => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export default Line;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as $,jsx as d}from"react/jsx-runtime";import{useState as P,useRef as k,useEffect as x}from"react";import U from"../atoms/Node.js";import i from"../../../models/AnnotationMode.js";import q from"../atoms/Edge.js";import I from"../../../utils/mouse.js";const K=({annotationSettings:p,coordinates:n,isSelected:C,annotationMode:r,pageToStageOffset:l,svgScale:u,svgTranslation:f,style:R,onAddNode:v,onDeleteNode:L,onFinishAnnoCreate:X,onMoving:E,onMoved:w,onIsDraggingStateChanged:y})=>{const[c,h]=P(!1),[A,g]=P(!1),D=k(A);x(()=>{D.current=A},[A]);const M=t=>{if(p.canEdit!==!1&&(C&&r!==i.CREATE&&t.button===0&&h(!0),t.button===2&&r==i.CREATE)){const o=I.getAntiScaledMouseStagePosition(t,l,u,f),e=[...n];e.push(o),v(e)}},N=t=>{if(c){const o=n.map(e=>{const s=e.x+=t.movementX/u,m=e.y+=t.movementY/u;return{x:s,y:m}});(t.movementX!==0||t.movementY!==0)&&(g(!0),E(o))}if(r===i.CREATE){const o=I.getAntiScaledMouseStagePosition(t,l,u,f);let e=[...n];n.length>1&&(e=n.slice(0,-1)),e.push(o),E(e)}};x(()=>{if(y(c),!c)return;const t=()=>{h(!1),D.current&&w(),g(!1)};return globalThis.addEventListener("mouseup",t),()=>{globalThis.removeEventListener("mouseup",t)}},[c]);const Y=()=>d("circle",{cx:n[0].x,cy:n[0].y,r:"100%",style:{opacity:0},onMouseDown:M,onMouseMove:N,onContextMenu:t=>t.preventDefault()}),j=()=>n.map((o,e)=>d(U,{index:e,annotationSettings:p,coordinates:o,pageToStageOffset:l,svgScale:u,svgTranslation:f,style:R,onDeleteNode:()=>{const s=[...n];s.splice(e,1),L(s)},onMoving:(s,m)=>{const b=[...n];b[s]=m,E(b)},onMoved:()=>w(),onIsDraggingStateChanged:y},`node_${e}`)),T=()=>n.map((o,e)=>{if(!(e+1>=n.length))return d(q,{startCoordinate:o,endCoordinate:n[e+1],pageToStageOffset:l,svgScale:u,svgTranslation:f,style:R,onAddNode:s=>{const m=[...n];m.splice(e+1,0,s),v(m)},onDoubleClick:()=>r===i.CREATE&&X(),onMouseDown:M,onMouseMove:N},`edge_${e}`)}),_=C&&r!==i.CREATE;return $("g",{children:[(c||r===i.CREATE)&&Y(),T(),_&&j()]})};export{K as default};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { AnnotationSettings, Point as TPoint } from '../../../types';
|
|
3
|
+
type PointProps = {
|
|
4
|
+
annotationSettings: AnnotationSettings;
|
|
5
|
+
coordinates: TPoint;
|
|
6
|
+
isSelected: boolean;
|
|
7
|
+
pageToStageOffset: TPoint;
|
|
8
|
+
svgScale: number;
|
|
9
|
+
svgTranslation: TPoint;
|
|
10
|
+
style: CSSProperties;
|
|
11
|
+
onIsDraggingStateChanged: (bool: any) => void;
|
|
12
|
+
onMoving: (coordinates: TPoint) => void;
|
|
13
|
+
onMoved: (coordinates: TPoint[]) => void;
|
|
14
|
+
};
|
|
15
|
+
declare const Point: ({ annotationSettings, coordinates, isSelected, pageToStageOffset, svgScale, svgTranslation, style, onMoving, onMoved, onIsDraggingStateChanged, }: PointProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export default Point;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
1
|
+
import{jsx as l}from"react/jsx-runtime";import s from"../atoms/Node.js";const N=({annotationSettings:e,coordinates:o,isSelected:n,pageToStageOffset:t,svgScale:r,svgTranslation:d,style:i,onMoving:m,onMoved:f,onIsDraggingStateChanged:p})=>l(s,{index:0,annotationSettings:e,coordinates:o,pageToStageOffset:t,svgScale:r,svgTranslation:d,style:i,onDeleteNode:()=>{},onMoving:(u,x)=>n&&m(x),onMoved:()=>f([o]),onIsDraggingStateChanged:p});export{N as default};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { AnnotationSettings, Point, SIANotification } from '../../../types';
|
|
3
|
+
import { default as AnnotationMode } from '../../../models/AnnotationMode';
|
|
4
|
+
type PolygonProps = {
|
|
5
|
+
annotationSettings: AnnotationSettings;
|
|
6
|
+
coordinates: Point[];
|
|
7
|
+
isSelected: boolean;
|
|
8
|
+
isDisabled?: boolean;
|
|
9
|
+
annotationMode: AnnotationMode;
|
|
10
|
+
pageToStageOffset: Point;
|
|
11
|
+
svgScale: number;
|
|
12
|
+
svgTranslation: Point;
|
|
13
|
+
style: CSSProperties;
|
|
14
|
+
onAddNode: (coordinates: Point[]) => void;
|
|
15
|
+
onDeleteNode: (coordinates: Point[]) => void;
|
|
16
|
+
onFinishAnnoCreate: () => void;
|
|
17
|
+
onIsDraggingStateChanged: (newDraggingState: boolean) => void;
|
|
18
|
+
onMoving: (coordinates: Point[]) => void;
|
|
19
|
+
onMoved: () => void;
|
|
20
|
+
onNotification?: (notification: SIANotification) => void;
|
|
21
|
+
};
|
|
22
|
+
declare const Polygon: ({ annotationSettings, coordinates, isSelected, isDisabled, annotationMode, pageToStageOffset, svgScale, svgTranslation, style, onAddNode, onDeleteNode, onFinishAnnoCreate, onIsDraggingStateChanged, onMoving, onMoved, onNotification, }: PolygonProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export default Polygon;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as U,jsx as c}from"react/jsx-runtime";import{useState as T,useRef as a,useEffect as X}from"react";import q from"../atoms/Node.js";import z from"../atoms/PolygonArea.js";import s from"../../../models/AnnotationMode.js";import B from"../atoms/Edge.js";import Y from"../../../utils/mouse.js";import _ from"../../../models/NotificationType.js";const O=({annotationSettings:C,coordinates:e,isSelected:f,isDisabled:D=!1,annotationMode:o,pageToStageOffset:A,svgScale:m,svgTranslation:p,style:y,onAddNode:v,onDeleteNode:j,onFinishAnnoCreate:F,onIsDraggingStateChanged:P,onMoving:g,onMoved:w,onNotification:b=l=>{}})=>{const[l,N]=T(!1),[h,x]=T(!1),I=a(h),M=()=>{if(e.length<3)return b({message:"Polygons must have at least 3 nodes",title:"Polygon Error",type:_.ERROR});F()};X(()=>{I.current=h},[h]);const R=n=>{if(C.canEdit!==!1&&(f&&o!==s.CREATE&&o!==s.ADD&&n.button===0&&N(!0),n.button===2&&[s.CREATE,s.ADD].includes(o))){const r=Y.getAntiScaledMouseStagePosition(n,A,m,p),t=[...e];t.push(r),v(t)}},d=n=>{if(l){const r=e.map(t=>{const u=t.x+=n.movementX/m,i=t.y+=n.movementY/m;return{x:u,y:i}});(n.movementX!==0||n.movementY!==0)&&(x(!0),g(r))}if(o===s.CREATE){const r=Y.getAntiScaledMouseStagePosition(n,A,m,p);let t=[...e];e.length>1&&(t=e.slice(0,-1)),t.push(r),g(t)}};X(()=>{if(P(l),!l)return;const n=()=>{N(!1),I.current&&w(),x(!1)};return globalThis.addEventListener("mouseup",n),()=>{globalThis.removeEventListener("mouseup",n)}},[l]);const L=()=>e.map((r,t)=>c(q,{index:t,annotationSettings:C,coordinates:r,pageToStageOffset:A,svgScale:m,svgTranslation:p,style:y,onDeleteNode:()=>{if(e.length<4)return b({message:"Polygons must have at least 3 nodes",title:"Polygon Error",type:_.ERROR});const u=[...e];u.splice(t,1),j(u)},onMoving:(u,i)=>{const E=[...e];E[u]=i,g(E)},onMoved:()=>w(),onIsDraggingStateChanged:P},`node_${t}`)),$=()=>e.map((r,t)=>{const u=t+1<e.length?e[t+1]:e[0];return c(B,{startCoordinate:r,endCoordinate:u,isDisabled:D&&f,pageToStageOffset:A,svgScale:m,svgTranslation:p,style:y,onAddNode:i=>{const E=[...e];E.splice(t+1,0,i),v(E)},onDoubleClick:()=>o===s.CREATE&&M(),onMouseDown:R,onMouseMove:d},`edge_${t}`)}),k=()=>c("circle",{cx:e[0].x,cy:e[0].y,r:"100%",style:{opacity:0},onMouseDown:R,onMouseMove:d,onContextMenu:n=>n.preventDefault()});return U("g",{children:[(l||o===s.CREATE||o===s.ADD)&&k(),c(z,{coordinates:e,isSelected:f,isDisabled:D,annotationMode:o,style:y,onFinishAnnoCreate:M,onMouseDown:R,onMouseMove:d}),f&&C.canEdit&&$(),f&&o!==s.CREATE&&L()]})};export{O as default};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { default as AnnotationTool } from '../models/AnnotationTool';
|
|
2
|
+
import { default as Annotation } from '../Annotation/logic/Annotation';
|
|
3
|
+
import { AnnotationSettings, Label, PolygonOperationResult, SIANotification, UiConfig } from '../types';
|
|
4
|
+
type CanvasProps = {
|
|
5
|
+
annotations?: Annotation[];
|
|
6
|
+
annotationSettings: AnnotationSettings;
|
|
7
|
+
defaultLabelId?: number;
|
|
8
|
+
image: string;
|
|
9
|
+
isFullscreen?: boolean;
|
|
10
|
+
isImageJunk?: boolean;
|
|
11
|
+
isPolygonSelectionMode?: boolean;
|
|
12
|
+
selectedAnnotation: Annotation | undefined;
|
|
13
|
+
selectedAnnoTool: AnnotationTool;
|
|
14
|
+
toolbarHeight?: number;
|
|
15
|
+
polygonOperationResult?: PolygonOperationResult;
|
|
16
|
+
possibleLabels: Label[];
|
|
17
|
+
preventScrolling?: boolean;
|
|
18
|
+
uiConfig: UiConfig;
|
|
19
|
+
onAnnoCreated: (createdAnno: Annotation) => void;
|
|
20
|
+
onAnnoCreationFinished: (createdAnno: Annotation, hasAnnotationExisted: boolean) => void;
|
|
21
|
+
onAnnoChanged: (changedAnno: Annotation) => void;
|
|
22
|
+
onAnnoEditing: (annoToEdit: Annotation) => void;
|
|
23
|
+
onNotification?: (notification: SIANotification) => void;
|
|
24
|
+
onRequestNewAnnoId: () => number;
|
|
25
|
+
onSelectAnnotation: (annotation?: Annotation) => void;
|
|
26
|
+
onSetIsImageJunk: (newJunkState: boolean) => void;
|
|
27
|
+
onSetSelectedTool: (tool: AnnotationTool) => void;
|
|
28
|
+
onShouldDeleteAnno: (internalAnnoId: number) => void;
|
|
29
|
+
};
|
|
30
|
+
declare const Canvas: ({ annotations, annotationSettings, defaultLabelId, image, isFullscreen, isImageJunk, isPolygonSelectionMode, polygonOperationResult, possibleLabels, preventScrolling, selectedAnnotation, selectedAnnoTool, toolbarHeight, uiConfig, onAnnoCreated, onAnnoCreationFinished, onAnnoChanged, onAnnoEditing, onNotification, onRequestNewAnnoId, onSelectAnnotation, onSetIsImageJunk, onSetSelectedTool, onShouldDeleteAnno, }: CanvasProps) => import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export default Canvas;
|
package/dist/Canvas/Canvas.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as
|
|
1
|
+
import{jsxs as K,jsx as h,Fragment as Qe}from"react/jsx-runtime";import{useState as E,useRef as Z,useEffect as M}from"react";import D from"../models/AnnotationTool.js";import i from"../models/EditorModes.js";import Ze from"../utils/KeyMapper.js";import a from"../models/KeyAction.js";import pe from"../Annotation/logic/Annotation.js";import qe from"../models/CanvasAction.js";import et from"../Annotation/ui/AnnotationComponent.js";import he from"../utils/mouse.js";import N from"../models/AnnotationMode.js";import tt from"./LabelInput.js";import{FontAwesomeIcon as nt}from"@fortawesome/react-fontawesome";import{faBan as ot}from"@fortawesome/free-solid-svg-icons";import w from"../models/AnnotationStatus.js";import x from"../utils/transform.js";import rt from"../models/NotificationType.js";import st from"../utils/TimeUtils.js";import xe from"../utils/windowViewport.js";const Dt=({annotations:A=[],annotationSettings:W,defaultLabelId:q,image:ee,isFullscreen:Ce=!1,isImageJunk:B=!1,isPolygonSelectionMode:F=!1,polygonOperationResult:X={annotationsToDelete:[],polygonsToCreate:[]},possibleLabels:te,preventScrolling:ne=!0,selectedAnnotation:r,selectedAnnoTool:R,toolbarHeight:U=0,uiConfig:z,onAnnoCreated:Oe,onAnnoCreationFinished:oe,onAnnoChanged:re,onAnnoEditing:Te=g=>{},onNotification:se=g=>{},onRequestNewAnnoId:V,onSelectAnnotation:v,onSetIsImageJunk:Ae,onSetSelectedTool:ve=g=>{},onShouldDeleteAnno:ie})=>{const[g,C]=E(i.VIEW),[Me,Ie]=E(),[ce,De]=E(q),[k,we]=E({x:-1,y:-1}),[ae,le]=E(0),L={x:k.x,y:k.y},[u,Y]=E({x:-1,y:-1}),[d,G]=E({x:-1,y:-1}),[m,de]=E({x:-1,y:-1}),[l,P]=E(1),[c,S]=E({x:0,y:0}),H={x:c.x+ae,y:c.y},[O,$]=E(),[j,_]=E(!1),fe=Z(null),p=Z(null),y=Z(null),T=((e,t)=>{if(e.x===0||e.y===0||t.x===0||t.y===0)return 0;const n=t.x/e.x,o=t.y/e.y;return Math.min(n,o)})(u,d),Se=()=>{if((y==null?void 0:y.current)===null)return{x:0,y:0};const e=u.x*T;if(z.imageCentered&&d.x>e){const f=(d.x-e)/2;le(f)}else le(0);const{top:t,left:n}=p.current.getBoundingClientRect(),o={x:n+window.scrollX,y:t+window.scrollY};we(o)},_e=new Ze(e=>Pe(e)),be=e=>{C(i.CREATE);const t=x.convertStageCoordinatesToPercentaged([e],T,u);R===D.BBox&&t.push(t[0]);const n=V(),o=new pe(n,R,t);if(Ie(performance.now()),ce!==void 0&&(o.labelIds=[ce]),Oe(o),R===D.Point){const s={...o,coordinates:[e],annoTime:0};Q(s)}},Ne=()=>{if(r&&![D.Line,D.Polygon].includes(r.type))return;const e=A.find(n=>n.internalId===(r==null?void 0:r.internalId));if(e===void 0)return;C(i.CREATE),ve(e.type);const t={...e,mode:N.CREATE,status:w.CREATING,internalId:V(),selectedNode:e.coordinates.length-1};Te(t)},Re=()=>{const e=r?r.internalId:0,t=A.find(n=>n.internalId>e);if(t)return v(t);if(A.length>0)return v(A[0])},Ve=()=>{const e=r?r.internalId:0,t=[...A];t.sort((o,s)=>s.internalId-o.internalId);const n=t.find(o=>o.internalId<e);if(n)return v(n);if(A.length>0)return v(A.at(-1))},ke=()=>{if(r){const e=JSON.stringify(r);localStorage.setItem("lostAnnotationClipboard",e);const t={title:"Success",message:"Annotation copied",type:rt.SUCCESS};se(t)}},Le=()=>{const e=localStorage.getItem("lostAnnotationClipboard");if(e==null)return;const t=JSON.parse(e);t.internalId=V(),t.externalId="",oe(t,!0),v(t)},Pe=e=>{switch(e){case a.EDIT_LABEL:r&&_(!0);break;case a.DELETE_ANNO:r&&ie(r.internalId);break;case a.DELETE_ANNO_IN_CREATION:g===i.CREATE&&(ie(r.internalId),C(i.VIEW));break;case a.ENTER_ANNO_ADD_MODE:console.log("KeyAction TODO: ENTER_ANNO_ADD_MODE");break;case a.LEAVE_ANNO_ADD_MODE:console.log("KeyAction TODO: LEAVE_ANNO_ADD_MODE");break;case a.UNDO:console.log("KeyAction TODO: UNDO");break;case a.REDO:console.log("KeyAction TODO: REDO");break;case a.TRAVERSE_ANNOS:Re();break;case a.TRAVERSE_ANNOS_BACKWARDS:Ve();break;case a.CAM_MOVE_LEFT:b(20*l,0);break;case a.CAM_MOVE_RIGHT:b(-20*l,0);break;case a.CAM_MOVE_UP:b(0,20*l);break;case a.CAM_MOVE_DOWN:b(0,-20*l);break;case a.CAM_MOVE_STOP:console.log("KeyAction TODO: CAM_MOVE_STOP");break;case a.COPY_ANNOTATION:ke();break;case a.PASTE_ANNOTATION:Le();break;case a.RECREATE_ANNO:console.log("KeyAction TODO: RECREATE_ANNO"),Ne();break;case a.TOGGLE_IMAGE_JUNK:if(g===i.ADD||g===i.CREATE)return;Ae(!B);break;default:console.log("Unknown KeyAction",e);break}},b=(e,t)=>{let n=c.x+e/l,o=c.y+t/l;const s=d.x*.45,f=d.x*.55,I=d.y*.45,je=d.y*.55,Je={x:0,y:0},Ee=xe.getViewportCoordinates(c,d,l,Je),me=xe.getViewportCoordinates(c,d,l,d);Ee.vX>=s?n=c.x-5:me.vX<=f?n=c.x+5:Ee.vY>=I?o=c.y-5:me.vY<=je&&(o=c.y+5),S({x:n,y:o})},J=(e=>m.x<=0||m.y<=0||u.x<=0||u.y<=0?[]:A.map(n=>({...n,coordinates:x.convertPercentagedCoordinatesToStage(n.coordinates,u,m)})))(),Ke=()=>{if(C(i.VIEW),de({x:-1,y:-1}),y.current!==null){const{width:e,height:t}=y.current.getBoundingClientRect();Y({x:e,y:t})}P(1),S({x:0,y:0}),$(void 0),_(!1)};M(()=>{var e;(e=fe.current)==null||e.focus()},[]),M(()=>{if((p==null?void 0:p.current)!==void 0){const{width:e,height:t}=p.current.getBoundingClientRect(),n=t-U;G({x:e,y:n});const o=new ResizeObserver(()=>{const{width:s,height:f}=p.current.getBoundingClientRect(),I=f-U;G({x:s,y:I})});return o.observe(p.current),()=>o.disconnect()}Ke()},[ee,Ce]),M(()=>{Se()},[y,c,d]),M(()=>{if(p.current===null)return;const{width:e,height:t}=p.current.getBoundingClientRect(),n=t-U;G({x:e,y:n})},[p]),M(()=>{if(y.current===null)return;const{width:e,height:t}=y.current.getBoundingClientRect();Y({x:e,y:t});const n=new ResizeObserver(()=>{const{width:o,height:s}=y.current.getBoundingClientRect();Y({x:o,y:s})});return n.observe(y.current),()=>n.disconnect()},[y]),M(()=>{if(T===0)return;const e={x:u.x*T,y:u.y*T};de(e)},[T,u]),M(()=>{F&&X.polygonsToCreate!==void 0&&X.polygonsToCreate.forEach(e=>{const t=V(),n=new pe(t,e.type,x.convertPercentagedCoordinatesToStage(e.coordinates,u,m),N.VIEW,w.CREATED);Q(n)})},[X]);const Q=e=>{C(i.VIEW);const t={...e,mode:N.VIEW};if(e.type!==D.Point){const s=st.getRoundedDuration(Me,performance.now());t.annoTime=s}const n=x.convertStageCoordinatesToPercentaged(e.coordinates,T,u);t.coordinates=n,re(t);const o=R===D.Point||F;oe(t,o)},We=e=>{_e.keyDown(e.key,e.shiftKey,e.ctrlKey)&&e.preventDefault()},Be=e=>{e.preventDefault()},Fe=e=>{if(e.button!==0){if(e.button===1)C(i.CAMERA_MOVE);else if(e.button===2){if(!W.canCreate||g===i.ADD||g===i.CREATE)return;const t=he.getAntiScaledMouseStagePosition(e,L,l,c),n={x:t.x-ae,y:t.y};be(n)}}},Xe=()=>{ne&&(document.body.style.overflow="hidden")},Ue=e=>{e.button===1&&C(i.VIEW)},ue=(e,t)=>{g===i.CAMERA_MOVE&&b(e,t)},ze=()=>{ne&&(document.body.style.overflow="")},Ye=e=>{const o=(e.deltaY<0?1:-1)>0?l*1.25:l/1.25,s=he.getAntiScaledMouseStagePosition(e,L,l,c),f=l/o,I={x:f*(s.x+c.x)-s.x,y:f*(s.y+c.y)-s.y};o<1?(P(1),(c.x!=0||c.y!=0)&&S({x:0,y:0})):o>200?(P(200),S(I)):(P(o),S(I))},Ge=(e,t)=>{if(t!==qe.ANNO_SELECTED){console.log("Unknown Canvas Action:",t);return}const n={...e,coordinates:x.convertStageCoordinatesToPercentaged([...e.coordinates],T,u)};v(n);const o=x.getMostLeftPoints(e.coordinates),s=x.getTopPoint(o)[0],f=x.convertStageToPage(s,L,l,c);$(f)},ge=e=>{const t=x.convertStageCoordinatesToPercentaged(e.coordinates,T,u),n={...e,coordinates:t};n.status===w.LOADED&&(n.status=w.CHANGED),re(n)},He=()=>{if(g===i.CAMERA_MOVE)return h(Qe,{});const t=[i.CREATE,i.ADD,i.MOVE].includes(g),n=J.map(o=>{const s=o.internalId===(r==null?void 0:r.internalId);return t&&!s?h("g",{},`annotationComponent_${o.internalId}`):h(et,{scaledAnnotation:o,annotationSettings:W,possibleLabels:te,svgScale:l,svgTranslation:H,pageToStageOffset:L,nodeRadius:z.nodeRadius,strokeWidth:z.strokeWidth,isSelected:s,isDisabled:F&&s,onFinishAnnoCreate:Q,onLabelIconClicked:()=>_(!0),onAction:Ge,onAnnoChanged:ge,onAnnotationModeChange:f=>{f===N.MOVE&&C(i.MOVE),g===i.MOVE&&f===N.VIEW&&C(i.VIEW)},onNotification:se},`annotationComponent_${o.internalId}`)});if(r){const o=J.find(f=>f.internalId===(r==null?void 0:r.internalId)),s=J.indexOf(o);n.push(n.splice(s,1)[0])}return h("g",{children:n})},$e=()=>h("circle",{cx:m.x/2,cy:m.y/2,r:"100%",style:{opacity:0},onContextMenu:e=>e.preventDefault(),onClick:()=>{_(!1)}}),ye={x:k.x+d.x/2,y:k.y+d.y/2};return K("div",{ref:p,style:{flex:"1 1 auto",minHeight:0,display:"flex",flexDirection:"column"},children:[h("div",{style:{position:"absolute",left:(O==null?void 0:O.x)??0,top:(O==null?void 0:O.y)??0,display:(O==null?void 0:O.y)===void 0?"none":"inherit",zIndex:j?7e3:-1},children:h(tt,{defaultLabelId:q,isVisible:j,selectedLabelsIds:r==null?void 0:r.labelIds,possibleLabels:te,isMultilabel:W.canHaveMultipleLabels,onLabelSelect:e=>{if(_(!1),e.length>0){const o=e.filter(s=>!r.labelIds.includes(s));o.length>0&&De(o[0])}const t=r.status===w.LOADED?w.CHANGED:r.status,n={...r,coordinates:x.convertPercentagedCoordinatesToStage(r.coordinates,u,m),labelIds:[...e],status:t};ge(n)}})}),B&&K("div",{style:{position:"absolute",left:ye.x,top:ye.y,transform:"translate(-50%, -50%)",textAlign:"center",color:"white"},children:[h(nt,{icon:ot,size:"5x",style:{marginBottom:15}}),h("h2",{children:"Marked as Junk"})]}),K("svg",{ref:fe,style:{flex:"1 1 auto",minHeight:0},onKeyDown:We,onKeyUp:Be,onMouseMove:e=>ue(e.movementX,e.movementY),tabIndex:0,onMouseDown:e=>Fe(e),children:[K("g",{transform:`scale(${l}) translate(${H.x}, ${H.y})`,onMouseOver:Xe,onMouseLeave:ze,onMouseUp:Ue,onWheel:Ye,onMouseMove:e=>ue(e.movementX,e.movementY),onClick:()=>{v(void 0)},children:[h("image",{onContextMenu:e=>e.preventDefault(),href:ee,ref:y,width:m.x>0?m.x:void 0,height:m.y>0?m.y:void 0}),He()]}),j&&$e(),B&&h("rect",{x:"0",y:"0",width:d.x,height:d.y,style:{opacity:.8},onContextMenu:e=>e.preventDefault(),onClick:()=>{$(void 0)}})]})]})};export{Dt as default};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Label } from '../types';
|
|
2
|
+
type LabelInputProps = {
|
|
3
|
+
defaultLabelId?: number;
|
|
4
|
+
isVisible: boolean;
|
|
5
|
+
selectedLabelsIds: number[];
|
|
6
|
+
possibleLabels: Label[];
|
|
7
|
+
isMultilabel?: boolean;
|
|
8
|
+
onLabelSelect: (selectedLabelIds: number[]) => void;
|
|
9
|
+
};
|
|
10
|
+
declare const LabelInput: ({ defaultLabelId, isVisible, selectedLabelsIds, possibleLabels, isMultilabel, onLabelSelect, }: LabelInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export default LabelInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{jsxs as r,Fragment as v,jsx as o}from"react/jsx-runtime";import{useState as g}from"react";import{CPopover as w,CDropdown as D,CDropdownToggle as x,CDropdownMenu as y,CFormInput as F,CDropdownDivider as I,CDropdownItem as c}from"@coreui/react";const S=({defaultLabelId:i,isVisible:d,selectedLabelsIds:l,possibleLabels:s,isMultilabel:m=!1,onLabelSelect:f})=>{const[a,C]=g(""),p=s.filter(e=>e.name.toLowerCase().includes(a.toLowerCase())),h=e=>{let n=[];if(m){n=[...l];const u=l.indexOf(e.id);u===-1?n.push(e.id):n.splice(u,1)}else n=[e.id];f(n)},t=i?s.find(e=>e.id===i):void 0;return r(v,{children:[o(w,{content:`Default Label: ${t==null?void 0:t.name}`,visible:d&&t!==void 0,children:o("div",{style:{marginLeft:80}})}),r(D,{visible:d,autoClose:!1,style:{marginTop:-25},children:[o(x,{style:{display:"none"}}),r(y,{children:[o("div",{className:"px-3 py-2",children:o(F,{placeholder:"Filter label...",value:a,onChange:e=>C(e.target.value),autoFocus:!0})}),o(I,{}),p.length>0?p.map(e=>o(c,{onClick:()=>h(e),children:e.name},e.id)):o(c,{disabled:!0,children:"No results"})]})]})]})};export{S as default};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IconDefinition } from '@fortawesome/free-solid-svg-icons';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
import { SizeProp } from '@fortawesome/fontawesome-svg-core';
|
|
4
|
+
type IconButtonProps = {
|
|
5
|
+
loadingSize?: SizeProp;
|
|
6
|
+
isLoading?: boolean;
|
|
7
|
+
margin?: number;
|
|
8
|
+
icon?: IconDefinition;
|
|
9
|
+
text?: string;
|
|
10
|
+
size?: 'sm' | 'lg';
|
|
11
|
+
isTextLeft?: boolean;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
id?: string;
|
|
14
|
+
type?: 'button' | 'submit' | 'reset';
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
onClick?: () => void;
|
|
17
|
+
className?: string;
|
|
18
|
+
color?: string;
|
|
19
|
+
isOutline?: boolean;
|
|
20
|
+
tooltip?: string;
|
|
21
|
+
ttipPlacement?: 'top' | 'left' | 'right' | 'auto' | 'bottom';
|
|
22
|
+
shape?: string;
|
|
23
|
+
};
|
|
24
|
+
declare const IconButton: ({ loadingSize, isLoading, margin, icon, text, size, isTextLeft, style, id, type, disabled, onClick, className, color, isOutline, tooltip, ttipPlacement, shape, }: IconButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export default IconButton;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{jsx as t,jsxs as A}from"react/jsx-runtime";import{faSync as F}from"@fortawesome/free-solid-svg-icons";import{FontAwesomeIcon as v}from"@fortawesome/react-fontawesome";import{CTooltip as I,CButton as y}from"@coreui/react";const D=({loadingSize:o="1x",isLoading:n=!1,margin:c=5,icon:j,text:i="",size:s,isTextLeft:N=!1,style:a={},id:B=void 0,type:C="button",disabled:r=!1,onClick:l,className:m="",color:f="primary",isOutline:T=!0,tooltip:u="",ttipPlacement:b="top",shape:w=""})=>{const e=j,p=T?"outline":void 0,x=()=>{if(n)return A("div",{className:"flex justify-center items-center",children:[t(v,{className:"mr-3",size:o||"2x",icon:F,spin:!0}),t("span",{className:"text-center",children:"Loading"})]});const d=e!=null&&e.iconName&&e.prefix?t(v,{icon:e,size:o||"2x"},"icon"):null,h=i?t("span",{style:{marginLeft:c,marginRight:c},children:i},"text"):null;return N?[h,d]:[d,h]};return u!=""?t(I,{content:u,placement:b,children:t(y,{id:B,size:s,className:m,style:a,variant:p,disabled:r||n,onClick:l,color:r||n?"secondary":f,shape:w,children:x()})}):t(y,{size:s,type:C,className:m,style:a,variant:p,disabled:r||n,onClick:l,color:r||n?"secondary":f,children:x()})};export{D as default};
|
package/dist/Sia.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { default as AnnotationTool } from './models/AnnotationTool';
|
|
3
|
+
import { default as Annotation } from './Annotation/logic/Annotation';
|
|
4
|
+
import { AllowedTools, AnnotationSettings, ExternalAnnotation, Label, PolygonOperationResult, SIANotification, UiConfig } from './types';
|
|
5
|
+
type SiaProps = {
|
|
6
|
+
additionalButtons?: ReactElement;
|
|
7
|
+
allowedTools?: AllowedTools;
|
|
8
|
+
polygonOperationResult?: PolygonOperationResult;
|
|
9
|
+
annotationSettings?: AnnotationSettings;
|
|
10
|
+
defaultAnnotationTool?: AnnotationTool;
|
|
11
|
+
defaultLabelId?: number;
|
|
12
|
+
image?: string;
|
|
13
|
+
isLoading?: boolean;
|
|
14
|
+
isPolygonSelectionMode?: boolean;
|
|
15
|
+
initialAnnotations?: ExternalAnnotation[];
|
|
16
|
+
initialImageLabelIds?: number[];
|
|
17
|
+
initialIsImageJunk?: boolean;
|
|
18
|
+
possibleLabels: Label[];
|
|
19
|
+
uiConfig?: UiConfig;
|
|
20
|
+
onAnnoCreated?: (createdAnno: Annotation, allAnnos: Annotation[]) => void;
|
|
21
|
+
onAnnoCreationFinished?: (createdAnno: Annotation, allAnnos: Annotation[]) => void;
|
|
22
|
+
onAnnoChanged?: (changedAnno: Annotation, allAnnos: Annotation[]) => void;
|
|
23
|
+
onAnnoDeleted?: (deletedAnno: Annotation, allAnnos: Annotation[]) => void;
|
|
24
|
+
onImageLabelsChanged?: (selectedImageIds: number[]) => void;
|
|
25
|
+
onIsImageJunk?: (isJunk: boolean) => void;
|
|
26
|
+
onNotification?: (notification: SIANotification) => void;
|
|
27
|
+
onSelectAnnotation?: (annotation: Annotation) => void;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Main SIA component
|
|
31
|
+
*/
|
|
32
|
+
declare const Sia2: ({ additionalButtons, allowedTools: propAllowedTools, polygonOperationResult, annotationSettings: propAnnotationSettings, uiConfig: propUiConfig, defaultAnnotationTool, defaultLabelId, image, isLoading, isPolygonSelectionMode, initialAnnotations, initialImageLabelIds, initialIsImageJunk, possibleLabels, onAnnoCreated, onAnnoCreationFinished, onAnnoChanged, onAnnoDeleted, onImageLabelsChanged, onIsImageJunk, onNotification, onSelectAnnotation, }: SiaProps) => import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export default Sia2;
|
package/dist/Sia.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{jsx as r,jsxs as P}from"react/jsx-runtime";import{useRef as cn,useState as i,useEffect as u}from"react";import{CSpinner as W}from"@coreui/react";import fn from"./Canvas/Canvas.js";import un from"./models/AnnotationTool.js";import In from"./Toolbar/Toolbar.js";import mn from"./models/AnnotationMode.js";import hn from"./models/AnnotationStatus.js";const wn=({additionalButtons:q,allowedTools:S,polygonOperationResult:c={annotationsToDelete:[],polygonsToCreate:[]},annotationSettings:T,uiConfig:g,defaultAnnotationTool:z,defaultLabelId:M,image:I,isLoading:w=!1,isPolygonSelectionMode:y=!1,initialAnnotations:x=void 0,initialImageLabelIds:_=void 0,initialIsImageJunk:V=!1,possibleLabels:D,onAnnoCreated:G=(f,m)=>{},onAnnoCreationFinished:K=(f,m)=>{},onAnnoChanged:Q=(f,m)=>{},onAnnoDeleted:b=(f,m)=>{},onImageLabelsChanged:X=()=>{},onIsImageJunk:Y=()=>{},onNotification:Z=f=>{},onSelectAnnotation:$=f=>{}})=>{const m=cn(null),[k,p]=i(),[s,d]=i([]),[E,R]=i(),[O,nn]=i(),[l,h]=i(),[j,N]=i(z??un.Point),[en,B]=i(_),[F,J]=i(),[v,tn]=i(!1),[L,U]=i([]),A=n=>{const e=s.findIndex(a=>a.internalId===n),t=[...s],o=t.splice(e,1)[0];d(t),h(void 0),b(o,t)},on=()=>{l!==void 0&&A(l.internalId)},sn=()=>{let n=0;const e=x.map(t=>({...t,internalId:n++,mode:mn.VIEW,selectedNode:1,status:t.status,annoTime:t.annoTime??0}));U([...new Array(n).keys()]),d(e)},an=()=>{let n=0;for(;L.includes(n);)n++;const e=[...L];return e.push(n),U(e),n},dn=n=>{const e=[...s],t=e.findIndex(C=>C.internalId===(l==null?void 0:l.internalId));if(t===-1)return;const o=e.splice(t,1)[0];b(o,e);const a=[...e];a.push(n),d(a),h(n)},H=n=>{J(n),Y(n)};u(()=>{I===void 0&&(d([]),h(void 0))},[I]),u(()=>{J(V),!(I!==void 0||x===void 0||x.length===0)&&sn()},[x]),u(()=>{B(_)},[_]),u(()=>{const e={...{canCreate:!0,canEdit:!0,canHaveMultipleLabels:!1,canLabel:!0,minimalArea:250},...T};R(e)},[T]),u(()=>{const e={...{nodeRadius:4,strokeWidth:4,imageCentered:!1},...g};nn(e)},[g]),u(()=>{const n={bbox:!0,point:!0,line:!0,junk:!0,polygon:!0};if(S===void 0)return p(n);p(S)},[S]);const ln={position:"fixed",top:0,left:0,zIndex:6e3,backgroundColor:"#ffff",width:"100%",height:"100%",padding:15},rn={flex:"1 1 auto",minHeight:0,display:"flex",flexDirection:"column"};return k===void 0?r("div",{className:"d-flex justify-content-center",children:r(W,{color:"primary",style:{width:"5rem",height:"5rem"}})}):P("div",{style:{...v?ln:{},flex:"1 1 auto",minHeight:0,display:"flex",flexDirection:"column"},children:[r("div",{ref:m,style:{marginBottom:10},children:r(In,{annotationSettings:E,allowedTools:k,additionalButtons:q,isDisabled:w,isFullscreen:v,isImageJunk:F,imageLabelIds:en,possibleLabels:D,selectedTool:j,onImageLabelsChanged:n=>{B(n),X(n)},onSetIsFullscreen:tn,onSetIsImageJunk:H,onSetSelectedTool:N,onShouldDeleteSelectedAnnotation:on})}),P("div",{style:rn,children:[w&&r("div",{className:"d-flex justify-content-center",children:r(W,{color:"primary",style:{width:"5rem",height:"5rem",marginTop:200}})}),I&&s&&r(fn,{annotations:s,annotationSettings:E,defaultLabelId:M,image:I,isFullscreen:v,isImageJunk:F,isPolygonSelectionMode:y,selectedAnnotation:l,selectedAnnoTool:j,polygonOperationResult:c,possibleLabels:D,uiConfig:O,onAnnoCreated:n=>{const e=[...s];e.push(n),d(e),h(n),G(n,e)},onAnnoChanged:n=>{const e=s.findIndex(o=>o.internalId===n.internalId);if(e===-1)return;const t=[...s];t[e]=n,d(t),Q(n,t)},onAnnoCreationFinished:(n,e)=>{const t=[...s];if(y&&(c==null?void 0:c.annotationsToDelete)!==void 0){c.annotationsToDelete.push(l);for(const o of c.annotationsToDelete){A(o.internalId);const a=t.findIndex(C=>C.internalId===o.internalId);t.splice(a,1)}}if(e)t.push(n);else{const o=s.findIndex(a=>a.internalId===n.internalId);t[o]=n}d(t),n.status=hn.CREATED,K(n,t)},onAnnoEditing:dn,onSetIsImageJunk:H,onNotification:Z,onRequestNewAnnoId:an,onSelectAnnotation:n=>{h(n),$(n)},onSetSelectedTool:N,onShouldDeleteAnno:A})]})]})};export{wn as default};
|