@recogito/metaphor-annotation-plugin 0.0.0-stage → 0.0.11-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -2
- package/dist/extensions/GoToMetaphorAnnotationView.d.ts +3 -0
- package/dist/extensions/GoToMetaphorAnnotationView.d.ts.map +1 -0
- package/dist/extensions/GoToMetaphorAnnotationView.js +14 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/pages/_components/ImageMetaphorView/ImageMetaphorView.css +22 -0
- package/dist/pages/_components/ImageMetaphorView/ImageMetaphorView.d.ts +10 -0
- package/dist/pages/_components/ImageMetaphorView/ImageMetaphorView.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/ImageMetaphorView.js +136 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/AnnotationPanel.d.ts +9 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/AnnotationPanel.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/AnnotationPanel.js +12 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ImageListCard.d.ts +11 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ImageListCard.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ImageListCard.js +37 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ListTab.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ListTab.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ListTab.js +70 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedArrowAnnotation.d.ts +8 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedArrowAnnotation.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedArrowAnnotation.js +20 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedImageAnnotation.d.ts +9 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedImageAnnotation.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedImageAnnotation.js +25 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedTab.d.ts +6 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedTab.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedTab.js +16 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SettingsTab/SettingsTab.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SettingsTab/SettingsTab.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SettingsTab/SettingsTab.js +10 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SettingsTab/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SettingsTab/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/SettingsTab/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ArrowToolbar/ArrowToolbar.d.ts +3 -0
- package/dist/pages/_components/ImageMetaphorView/components/ArrowToolbar/ArrowToolbar.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ArrowToolbar/ArrowToolbar.js +27 -0
- package/dist/pages/_components/ImageMetaphorView/components/ArrowToolbar/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/ArrowToolbar/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ArrowToolbar/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/FilterAdapter/FilterAdapter.d.ts +9 -0
- package/dist/pages/_components/ImageMetaphorView/components/FilterAdapter/FilterAdapter.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/FilterAdapter/FilterAdapter.js +23 -0
- package/dist/pages/_components/ImageMetaphorView/components/FilterAdapter/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/FilterAdapter/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/FilterAdapter/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/HoverTooltip/HoverTooltip.d.ts +11 -0
- package/dist/pages/_components/ImageMetaphorView/components/HoverTooltip/HoverTooltip.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/HoverTooltip/HoverTooltip.js +16 -0
- package/dist/pages/_components/ImageMetaphorView/components/HoverTooltip/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/HoverTooltip/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/HoverTooltip/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageArrows/ImageArrows.d.ts +13 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageArrows/ImageArrows.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageArrows/ImageArrows.js +42 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageArrows/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageArrows/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageArrows/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageUndoStack/ImageUndoStack.d.ts +7 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageUndoStack/ImageUndoStack.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageUndoStack/ImageUndoStack.js +22 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageUndoStack/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageUndoStack/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ImageUndoStack/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/Contents.d.ts +14 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/Contents.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/Contents.js +36 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/Info.d.ts +9 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/Info.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/Info.js +35 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/MetadataPanel.css +96 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/MetadataPanel.d.ts +18 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/MetadataPanel.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/MetadataPanel.js +33 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/MetadataPanel/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ShapeToolbar/ShapeToolbar.d.ts +9 -0
- package/dist/pages/_components/ImageMetaphorView/components/ShapeToolbar/ShapeToolbar.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ShapeToolbar/ShapeToolbar.js +20 -0
- package/dist/pages/_components/ImageMetaphorView/components/ShapeToolbar/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/ShapeToolbar/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/ShapeToolbar/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/ImageMoreTools.d.ts +11 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/ImageMoreTools.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/ImageMoreTools.js +15 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/Toolbar.css +105 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/Toolbar.d.ts +22 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/Toolbar.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/Toolbar.js +61 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/index.d.ts +3 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/Toolbar/index.js +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/image-panel.css +347 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/AddProperty.d.ts +6 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/AddProperty.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/AddProperty.js +21 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/RelationPreview.d.ts +12 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/RelationPreview.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/RelationPreview.js +34 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/SetCategory.d.ts +8 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/SetCategory.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/SetCategory.js +20 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/colors.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/colors.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/colors.js +17 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/index.d.ts +6 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/index.js +5 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/useRelations.d.ts +8 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/useRelations.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/components/shared/useRelations.js +13 -0
- package/dist/pages/_components/ImageMetaphorView/hooks/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/hooks/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/hooks/index.js +1 -0
- package/dist/pages/_components/ImageMetaphorView/hooks/useMultiPagePresence.d.ts +17 -0
- package/dist/pages/_components/ImageMetaphorView/hooks/useMultiPagePresence.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/hooks/useMultiPagePresence.js +43 -0
- package/dist/pages/_components/ImageMetaphorView/index.d.ts +2 -0
- package/dist/pages/_components/ImageMetaphorView/index.d.ts.map +1 -0
- package/dist/pages/_components/ImageMetaphorView/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/TeiMetaphorView.css +2055 -0
- package/dist/pages/_components/TeiMetaphorView/TeiMetaphorView.d.ts +10 -0
- package/dist/pages/_components/TeiMetaphorView/TeiMetaphorView.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/TeiMetaphorView.js +41 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotatableTEI/AnnotatableTEI.d.ts +14 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotatableTEI/AnnotatableTEI.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotatableTEI/AnnotatableTEI.js +35 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotatableTEI/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotatableTEI/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotatableTEI/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/AnnotationPanel.css +67 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/AnnotationPanel.d.ts +10 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/AnnotationPanel.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/AnnotationPanel.js +15 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/ListCard.d.ts +13 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/ListCard.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/ListCard.js +32 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/ListTab.css +230 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/ListTab.d.ts +7 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/ListTab.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/ListTab.js +100 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/ListTab/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/SelectedTab.css +449 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/SelectedTab.d.ts +10 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/SelectedTab.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/SelectedTab.js +81 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/LinkedWordItem.d.ts +11 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/LinkedWordItem.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/LinkedWordItem.js +11 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorLinkedWords.d.ts +9 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorLinkedWords.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorLinkedWords.js +45 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorPreview.d.ts +8 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorPreview.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorPreview.js +27 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorTags.d.ts +10 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorTags.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/MetaphorTags.js +39 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/SpanTools.d.ts +8 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/SpanTools.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/SpanTools.js +9 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/Tag.d.ts +7 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/Tag.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/Tag.js +7 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/TypeSelector.d.ts +9 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/TypeSelector.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/TypeSelector.js +8 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/WordTags.d.ts +10 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/WordTags.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/WordTags.js +32 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/WordUplink.d.ts +7 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/WordUplink.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/components/WordUplink.js +17 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SelectedTab/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/SettingsTab.css +157 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/SettingsTab.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/SettingsTab.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/SettingsTab.js +12 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/components/AnnotationStyle.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/components/AnnotationStyle.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/components/AnnotationStyle.js +19 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/SettingsTab/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/AnnotationPanel/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/ColorCodingState/ColorCodingState.d.ts +31 -0
- package/dist/pages/_components/TeiMetaphorView/components/ColorCodingState/ColorCodingState.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/ColorCodingState/ColorCodingState.js +64 -0
- package/dist/pages/_components/TeiMetaphorView/components/ColorCodingState/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/ColorCodingState/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/ColorCodingState/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/InlineToolbar.css +189 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/InlineToolbar.d.ts +7 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/InlineToolbar.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/InlineToolbar.js +24 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/ToolbarStateChoice.d.ts +8 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/ToolbarStateChoice.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/ToolbarStateChoice.js +26 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/ToolbarStateSelected.d.ts +7 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/ToolbarStateSelected.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/ToolbarStateSelected.js +71 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/InlineToolbar/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/Info.d.ts +8 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/Info.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/Info.js +41 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/getTeiMetadata.d.ts +9 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/getTeiMetadata.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/getTeiMetadata.js +33 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Info/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/MetadataPanel.css +159 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/MetadataPanel.d.ts +9 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/MetadataPanel.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/MetadataPanel.js +47 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/Toc.d.ts +6 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/Toc.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/Toc.js +15 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/TocLevel.d.ts +7 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/TocLevel.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/TocLevel.js +13 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/buildTableOfContents.d.ts +12 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/buildTableOfContents.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/buildTableOfContents.js +97 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/Toc/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/components/MetadataPanel/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/index.d.ts +6 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/index.js +5 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useAnnotationsStyle.d.ts +3 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useAnnotationsStyle.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useAnnotationsStyle.js +138 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useIntersectingAnnotations.d.ts +5 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useIntersectingAnnotations.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useIntersectingAnnotations.js +35 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useLinkedMetaphors.d.ts +5 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useLinkedMetaphors.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useLinkedMetaphors.js +14 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useMrwOptions.d.ts +6 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useMrwOptions.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useMrwOptions.js +24 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useSuggestAnnotationType.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useSuggestAnnotationType.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useSuggestAnnotationType.js +35 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useTagVocabulary.d.ts +3 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useTagVocabulary.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/hooks/useTagVocabulary.js +46 -0
- package/dist/pages/_components/TeiMetaphorView/index.d.ts +2 -0
- package/dist/pages/_components/TeiMetaphorView/index.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/index.js +1 -0
- package/dist/pages/_components/TeiMetaphorView/utils.d.ts +15 -0
- package/dist/pages/_components/TeiMetaphorView/utils.d.ts.map +1 -0
- package/dist/pages/_components/TeiMetaphorView/utils.js +146 -0
- package/dist/pages/_components/shared/components/Accordion/Accordion.css +55 -0
- package/dist/pages/_components/shared/components/Accordion/Accordion.d.ts +6 -0
- package/dist/pages/_components/shared/components/Accordion/Accordion.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Accordion/Accordion.js +7 -0
- package/dist/pages/_components/shared/components/Accordion/index.d.ts +2 -0
- package/dist/pages/_components/shared/components/Accordion/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Accordion/index.js +1 -0
- package/dist/pages/_components/shared/components/AccountActions/AccountActions.css +49 -0
- package/dist/pages/_components/shared/components/AccountActions/AccountActions.d.ts +2 -0
- package/dist/pages/_components/shared/components/AccountActions/AccountActions.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/AccountActions/AccountActions.js +33 -0
- package/dist/pages/_components/shared/components/AccountActions/index.d.ts +2 -0
- package/dist/pages/_components/shared/components/AccountActions/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/AccountActions/index.js +1 -0
- package/dist/pages/_components/shared/components/Conversation/Comment.d.ts +6 -0
- package/dist/pages/_components/shared/components/Conversation/Comment.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Conversation/Comment.js +12 -0
- package/dist/pages/_components/shared/components/Conversation/Conversation.css +93 -0
- package/dist/pages/_components/shared/components/Conversation/Conversation.d.ts +8 -0
- package/dist/pages/_components/shared/components/Conversation/Conversation.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Conversation/Conversation.js +55 -0
- package/dist/pages/_components/shared/components/Conversation/index.d.ts +2 -0
- package/dist/pages/_components/shared/components/Conversation/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Conversation/index.js +1 -0
- package/dist/pages/_components/shared/components/EditorToolbar/EditorToolbar.css +218 -0
- package/dist/pages/_components/shared/components/EditorToolbar/EditorToolbar.d.ts +23 -0
- package/dist/pages/_components/shared/components/EditorToolbar/EditorToolbar.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/EditorToolbar/EditorToolbar.js +13 -0
- package/dist/pages/_components/shared/components/EditorToolbar/PrivacySelector.d.ts +8 -0
- package/dist/pages/_components/shared/components/EditorToolbar/PrivacySelector.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/EditorToolbar/PrivacySelector.js +9 -0
- package/dist/pages/_components/shared/components/EditorToolbar/UndoRedo.d.ts +2 -0
- package/dist/pages/_components/shared/components/EditorToolbar/UndoRedo.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/EditorToolbar/UndoRedo.js +42 -0
- package/dist/pages/_components/shared/components/EditorToolbar/index.d.ts +3 -0
- package/dist/pages/_components/shared/components/EditorToolbar/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/EditorToolbar/index.js +2 -0
- package/dist/pages/_components/shared/components/Filters/Filters.d.ts +6 -0
- package/dist/pages/_components/shared/components/Filters/Filters.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Filters/Filters.js +61 -0
- package/dist/pages/_components/shared/components/Filters/VisibilityFilter.d.ts +2 -0
- package/dist/pages/_components/shared/components/Filters/VisibilityFilter.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Filters/VisibilityFilter.js +23 -0
- package/dist/pages/_components/shared/components/Filters/index.d.ts +3 -0
- package/dist/pages/_components/shared/components/Filters/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Filters/index.js +2 -0
- package/dist/pages/_components/shared/components/HideAllState/HideAllState.d.ts +12 -0
- package/dist/pages/_components/shared/components/HideAllState/HideAllState.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/HideAllState/HideAllState.js +9 -0
- package/dist/pages/_components/shared/components/HideAllState/index.d.ts +2 -0
- package/dist/pages/_components/shared/components/HideAllState/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/HideAllState/index.js +1 -0
- package/dist/pages/_components/shared/components/Metadata/MetadataList.d.ts +10 -0
- package/dist/pages/_components/shared/components/Metadata/MetadataList.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Metadata/MetadataList.js +11 -0
- package/dist/pages/_components/shared/components/Metadata/index.d.ts +3 -0
- package/dist/pages/_components/shared/components/Metadata/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Metadata/index.js +2 -0
- package/dist/pages/_components/shared/components/Metadata/sanitize.d.ts +3 -0
- package/dist/pages/_components/shared/components/Metadata/sanitize.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Metadata/sanitize.js +53 -0
- package/dist/pages/_components/shared/components/StorageAdapter.d.ts +8 -0
- package/dist/pages/_components/shared/components/StorageAdapter.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/StorageAdapter.js +12 -0
- package/dist/pages/_components/shared/components/SupabaseStorageAdapter.d.ts +23 -0
- package/dist/pages/_components/shared/components/SupabaseStorageAdapter.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/SupabaseStorageAdapter.js +46 -0
- package/dist/pages/_components/shared/components/Tabs/Tabs.css +90 -0
- package/dist/pages/_components/shared/components/Tabs/Tabs.d.ts +6 -0
- package/dist/pages/_components/shared/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Tabs/Tabs.js +6 -0
- package/dist/pages/_components/shared/components/Tabs/index.d.ts +2 -0
- package/dist/pages/_components/shared/components/Tabs/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/Tabs/index.js +1 -0
- package/dist/pages/_components/shared/components/index.d.ts +9 -0
- package/dist/pages/_components/shared/components/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/components/index.js +8 -0
- package/dist/pages/_components/shared/hooks/index.d.ts +2 -0
- package/dist/pages/_components/shared/hooks/index.d.ts.map +1 -0
- package/dist/pages/_components/shared/hooks/index.js +1 -0
- package/dist/pages/_components/shared/hooks/useDocument.d.ts +3 -0
- package/dist/pages/_components/shared/hooks/useDocument.d.ts.map +1 -0
- package/dist/pages/_components/shared/hooks/useDocument.js +14 -0
- package/dist/pages/_components/shared/hooks/useDocumentLayers.d.ts +6 -0
- package/dist/pages/_components/shared/hooks/useDocumentLayers.d.ts.map +1 -0
- package/dist/pages/_components/shared/hooks/useDocumentLayers.js +18 -0
- package/dist/pages/_components/shared/hooks/useLayerPolicies.d.ts +3 -0
- package/dist/pages/_components/shared/hooks/useLayerPolicies.d.ts.map +1 -0
- package/dist/pages/_components/shared/hooks/useLayerPolicies.js +16 -0
- package/dist/pages/_components/shared/hooks/useSelectAction.d.ts +18 -0
- package/dist/pages/_components/shared/hooks/useSelectAction.d.ts.map +1 -0
- package/dist/pages/_components/shared/hooks/useSelectAction.js +26 -0
- package/dist/pages/_components/shared/hooks/useStoredFileDocument.d.ts +5 -0
- package/dist/pages/_components/shared/hooks/useStoredFileDocument.d.ts.map +1 -0
- package/dist/pages/_components/shared/hooks/useStoredFileDocument.js +22 -0
- package/dist/pages/_components/shared/i18n.d.ts +4 -0
- package/dist/pages/_components/shared/i18n.d.ts.map +1 -0
- package/dist/pages/_components/shared/i18n.js +31 -0
- package/dist/pages/_components/shared/supabase.d.ts +7 -0
- package/dist/pages/_components/shared/supabase.d.ts.map +1 -0
- package/dist/pages/_components/shared/supabase.js +7 -0
- package/dist/pages/_components/shared/types.d.ts +16 -0
- package/dist/pages/_components/shared/types.d.ts.map +1 -0
- package/dist/pages/_components/shared/types.js +1 -0
- package/dist/pages/metaphor-annotation-view.astro +122 -0
- package/package.json +69 -4
package/README.md
CHANGED
|
@@ -1,3 +1,103 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Metaphor Annotation View
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A Recogito Studio plugin that **injects a custom Metaphor Annotation View** for working with metaphor in TEI documents, fully replacing the standard Recogito Studio text-/image annotation view. This plugin provides:
|
|
4
|
+
1. A new Astro page route at `/[lang]/annotate-metaphor/[contextId]/[documentId]`
|
|
5
|
+
2. A new menu option in the Document Card, which opens the document in the Metaphor Annotation View.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
### Injected Page Route
|
|
10
|
+
|
|
11
|
+
The annotation view is injected using the standard Astro Integrations mechanism (see `src/index.ts`). The page itself is a minimal `.astro` file (`src/pages/metaphor-annotation-view.astro`) that:
|
|
12
|
+
- Computes the realtime channel ID (derived from the server-side env variable).
|
|
13
|
+
- Instantiates the React entry-point component.
|
|
14
|
+
|
|
15
|
+
> [!NOTE]
|
|
16
|
+
> The React component is instantiated with `client:only`. This is necessary because OpenSeadragon is not compatible with SSR! Initially, I had trouble with `client:only` failing in Vite (`client:load` was fine):
|
|
17
|
+
>
|
|
18
|
+
> ```
|
|
19
|
+
> The request url [...] is outside of Vite serving allow list
|
|
20
|
+
> ```
|
|
21
|
+
>
|
|
22
|
+
> I got around this by explicitly allowing the parent directory in the dev app config (`.dev/astro.config.mjs`). This adjustment should only be necessary in dev mode, and wouldn't be needed in a Recogito Studio production deployment. But I haven't tested yet!
|
|
23
|
+
|
|
24
|
+
### Document Menu Extension
|
|
25
|
+
|
|
26
|
+
The `GoToMetaphorAnnotationView` extension (`src/extensions/GoToMetaphorAnnotationView.tsx`) adds a new menu entry to the `project:document-actions` extension point, providing a link to the custom route.
|
|
27
|
+
|
|
28
|
+
<img src="menu-extension-screenshot.png" style="max-width: 600px;" width="600" />
|
|
29
|
+
|
|
30
|
+
> [!WARNING]
|
|
31
|
+
> Currently, we have no mechanism for disabling or replacing the standard **Open document** and **Open document in new tab** entries. This may be worth thinking about for later!
|
|
32
|
+
|
|
33
|
+
### Metaphor Annotation View
|
|
34
|
+
|
|
35
|
+
The annotation view itself is a React single page app (`src/pages/_components/TeiMetaphorView/TeiMetaphorView.tsx`). It receives the following input props from the `.astro` page:
|
|
36
|
+
|
|
37
|
+
- **documentId**
|
|
38
|
+
- **contextId**
|
|
39
|
+
- **channelId** for realtime annotation updates
|
|
40
|
+
|
|
41
|
+
> [!IMPORTANT]
|
|
42
|
+
> The view only supports **TEI/XML documents**. For other content types (plaintext, PDF, image) it mounts an error message instead of the annotation view. Later, we should implement separate React SPAs, and conditionally load them from the `.astro` page.
|
|
43
|
+
|
|
44
|
+
**Implementation Notes:**
|
|
45
|
+
|
|
46
|
+
- Backend interaction happens through the SDK. This requires an **.env file with valid credentials** in the `.dev/` folder.
|
|
47
|
+
- I added convenience hooks for easier access to document, context and stored file content.
|
|
48
|
+
- Similarly, I added a simplified `SupabaseStorageAdapter` (`src/pages/_components/shared/components/SupabaseStorageAdapter.tsx`), adapted from the [core codebase](https://github.com/recogito/recogito-client/blob/develop/src/components/SupabasePlugin/SupabasePlugin.ts). This component transparently handles annotation storage and realtime sync.
|
|
49
|
+
|
|
50
|
+
## Installation
|
|
51
|
+
|
|
52
|
+
To test this plugin, you'll need access to a live Recogito Studio backend. For most development, I recommend running the plugin through the SDK development app (already included in this repo), though setup is tricky.
|
|
53
|
+
|
|
54
|
+
### 1. Build the Plugin
|
|
55
|
+
|
|
56
|
+
First, build the plugin itself:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
cd .dev
|
|
60
|
+
npm install
|
|
61
|
+
cd ..
|
|
62
|
+
npm install
|
|
63
|
+
npm run build
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. Install in a Local Recogito Client
|
|
67
|
+
|
|
68
|
+
1. Clone a local copy of the [recogito-client](https://github.com/recogito/recogito-client).
|
|
69
|
+
2. Make sure a valid `.env` file is configured in your client.
|
|
70
|
+
3. Add this plugin as a local `file:` dependency in the client's `package.json` (adjust the path as needed), then run `npm install`:
|
|
71
|
+
|
|
72
|
+
```jsonc
|
|
73
|
+
"dependencies": {
|
|
74
|
+
// ...
|
|
75
|
+
"@recogito/metaphor-annotation-plugin": "file:../metaphor-annotation-plugin"
|
|
76
|
+
// ...
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
4. Register the plugin by adding its package name to `INSTALLED_PLUGINS` in the client's `.env`:
|
|
80
|
+
|
|
81
|
+
```sh
|
|
82
|
+
INSTALLED_PLUGINS="@recogito/metaphor-annotation-plugin"
|
|
83
|
+
```
|
|
84
|
+
5. Start Recogito Studio with `npm start`.
|
|
85
|
+
6. To verify installation was successful: open a project, go to **Project Settings** → **Plugins** and check if the plugin is available in the plugin gallery.
|
|
86
|
+
7. Navigate to a **TEI document**, open it in the annotation view, and note its **contextId** and **documentId** from the URL (e.g. `http://localhost:4321/en/annotate/[contextId]/[documentId]`).
|
|
87
|
+
|
|
88
|
+
### 3. Run with the Development App
|
|
89
|
+
|
|
90
|
+
For active development, it's easier to use the plugin **outside of Recogito Studio**, with the SDK development app (with hot-reloading).
|
|
91
|
+
|
|
92
|
+
**Requirements:**
|
|
93
|
+
|
|
94
|
+
- A valid `.env` file in the `.dev/` folder with backend credentials (see `.dev/.env.example`).
|
|
95
|
+
- You must be **logged in to Recogito Studio**. The dev app does not currently provide a login mechanism. Therefore the ugly workaround is:
|
|
96
|
+
- Start a local Recogito Client (e.g. at http://localhost:4321) and log in.
|
|
97
|
+
- Stop Recogito, then **run the dev app on the same port**. This reuses the login credentials from your earlier session.
|
|
98
|
+
|
|
99
|
+
Finally, open a valid context/document manually:
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
http://localhost:4321/en/annotate-metaphor/[contextId]/[documentId]
|
|
103
|
+
```
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { DocumentCardActionsExtensionProps } from '@recogito/studio-sdk';
|
|
2
|
+
export declare const GoToMetaphorAnnotationView: import("react").ForwardRefExoticComponent<DocumentCardActionsExtensionProps<any> & import("react").RefAttributes<HTMLDivElement>>;
|
|
3
|
+
//# sourceMappingURL=GoToMetaphorAnnotationView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoToMetaphorAnnotationView.d.ts","sourceRoot":"","sources":["../../src/extensions/GoToMetaphorAnnotationView.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iCAAiC,EAAE,MAAM,sBAAsB,CAAC;AAGzE,eAAO,MAAM,0BAA0B,mIAyBtC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import * as Dropdown from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
export const GoToMetaphorAnnotationView = forwardRef((props, forwardedRef) => {
|
|
6
|
+
const { t, i18n } = useTranslation();
|
|
7
|
+
// the metaphor view supports TEI XML documents and IIIF images
|
|
8
|
+
const isTei = props.document.content_type === 'text/xml';
|
|
9
|
+
const isIIIF = props.document.meta_data?.protocol?.startsWith('IIIF');
|
|
10
|
+
if (!isTei && !isIIIF)
|
|
11
|
+
return null;
|
|
12
|
+
const onSelect = () => (window.location.href = `/${i18n.language}/annotate-metaphor/${props.context.id}/${props.document.id}`);
|
|
13
|
+
return (_jsx(Dropdown.Item, { ref: forwardedRef, className: 'dropdown-item', onSelect: onSelect, children: t('Open in Metaphor Annotation View') }));
|
|
14
|
+
});
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAuB9C,QAAA,MAAM,MAAM,QAAO,gBAmBjB,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { fileURLToPath } from 'url';
|
|
2
|
+
import { dirname, join } from 'path';
|
|
3
|
+
import { registerPlugin } from '@recogito/studio-sdk';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
6
|
+
const MetaphorAnnotationViewPlugin = {
|
|
7
|
+
name: "Metaphor Annotation View",
|
|
8
|
+
module_name: '@recogito/metaphor-annotation-plugin',
|
|
9
|
+
description: "A plugin that adds the Metaphor Annotation View, a custom annotation view for TEI documents.",
|
|
10
|
+
author: "Performant Software",
|
|
11
|
+
homepage: "https://www.performantsoftware.com/",
|
|
12
|
+
extensions: [
|
|
13
|
+
{
|
|
14
|
+
name: "metaphor-annotation-view-menuitem",
|
|
15
|
+
component_name: "GoToMetaphorAnnotationView",
|
|
16
|
+
extension_point: "project:document-actions",
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
};
|
|
20
|
+
const plugin = () => ({
|
|
21
|
+
name: "plugin-metaphor-annotation-view",
|
|
22
|
+
hooks: {
|
|
23
|
+
"astro:config:setup": ({ config, logger, injectRoute }) => {
|
|
24
|
+
// Register document menu items
|
|
25
|
+
registerPlugin(MetaphorAnnotationViewPlugin, config, logger);
|
|
26
|
+
// Inject route to the Metaphor Annotation View
|
|
27
|
+
logger.info('Injecting new API route: /[lang]/annotate-metaphor/[contextId]/[documentId]');
|
|
28
|
+
const integrationPagePath = join(__dirname, 'pages', 'metaphor-annotation-view.astro');
|
|
29
|
+
injectRoute({
|
|
30
|
+
pattern: '/[lang]/annotate-metaphor/[contextId]/[documentId]',
|
|
31
|
+
entrypoint: integrationPagePath,
|
|
32
|
+
prerender: false
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
export default plugin;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#metaphor-image-root {
|
|
2
|
+
display: flex;
|
|
3
|
+
max-width: 100vw;
|
|
4
|
+
height: 100vh;
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* OpenSeadragon needs an explicitly-sized container */
|
|
9
|
+
.ia-osd-container {
|
|
10
|
+
position: relative;
|
|
11
|
+
flex: 1 1 auto;
|
|
12
|
+
min-width: 0;
|
|
13
|
+
min-height: 0;
|
|
14
|
+
width: 100%;
|
|
15
|
+
height: 100%;
|
|
16
|
+
background-color: var(--gray-100, #f4f4f4);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* "Hide all" also hides relations (arrows) */
|
|
20
|
+
.ia-hide-arrows .a9s-arrows-layer {
|
|
21
|
+
display: none;
|
|
22
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Context, type Document, type Project } from '@recogito/studio-sdk';
|
|
2
|
+
interface ImageMetaphorViewProps {
|
|
3
|
+
channelId: string;
|
|
4
|
+
context: Context;
|
|
5
|
+
document: Document;
|
|
6
|
+
project: Project;
|
|
7
|
+
}
|
|
8
|
+
export declare const ImageMetaphorView: (props: ImageMetaphorViewProps) => import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=ImageMetaphorView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageMetaphorView.d.ts","sourceRoot":"","sources":["../../../../src/pages/_components/ImageMetaphorView/ImageMetaphorView.tsx"],"names":[],"mappings":"AAuBA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAmC9B,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAsCD,eAAO,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,gCA8Q9D,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { I18nextProvider } from 'react-i18next';
|
|
4
|
+
import { Annotorious, AnnotoriousPlugin, OpenSeadragonAnnotationPopup, OpenSeadragonAnnotator, OpenSeadragonHoverTooltip, OpenSeadragonViewer, } from '@annotorious/react';
|
|
5
|
+
import { mountPlugin as ToolsPlugin } from '@annotorious/plugin-tools';
|
|
6
|
+
import { mountPlugin as MagneticOutlinePlugin } from '@annotorious/plugin-magnetic-outline';
|
|
7
|
+
import { AuthorColorProvider, FilterState, SelectionURLState, Spinner, } from '@recogito/studio-sdk/components';
|
|
8
|
+
import { HideAllState } from '../shared/components';
|
|
9
|
+
import { FilterAdapter } from './components/FilterAdapter';
|
|
10
|
+
import { useDocumentIIIF } from '@recogito/studio-sdk/iiif';
|
|
11
|
+
import { useDocumentLayers } from '../shared/hooks/useDocumentLayers';
|
|
12
|
+
import { useLayerPolicies } from '../shared/hooks/useLayerPolicies';
|
|
13
|
+
import { useSelectAction } from '../shared/hooks/useSelectAction';
|
|
14
|
+
import { StorageAdapter } from '../shared/components';
|
|
15
|
+
import { supabase } from '../shared/supabase';
|
|
16
|
+
import clientI18next from '../shared/i18n';
|
|
17
|
+
import { EditorToolbar } from '../shared/components/EditorToolbar';
|
|
18
|
+
import { Toolbar, ImageMoreTools } from './components/Toolbar';
|
|
19
|
+
import { AnnotationPanel, } from './components/AnnotationPanel';
|
|
20
|
+
import { ShapeToolbar } from './components/ShapeToolbar';
|
|
21
|
+
import { ImageArrows } from './components/ImageArrows';
|
|
22
|
+
import { HoverTooltip } from './components/HoverTooltip';
|
|
23
|
+
import { useMultiPagePresence } from './hooks';
|
|
24
|
+
import { ImageUndoStack } from './components/ImageUndoStack';
|
|
25
|
+
import { MetadataPanel } from './components/MetadataPanel';
|
|
26
|
+
const CANTALOUPE_PATH = import.meta.env
|
|
27
|
+
.PUBLIC_IIIF_CANTALOUPE_PATH;
|
|
28
|
+
const getAccessToken = () => supabase.auth.getSession().then(({ data }) => data.session?.access_token);
|
|
29
|
+
const OSD_BASE_OPTIONS = {
|
|
30
|
+
crossOriginPolicy: 'Anonymous',
|
|
31
|
+
gestureSettingsMouse: {
|
|
32
|
+
clickToZoom: false,
|
|
33
|
+
dblClickToZoom: false,
|
|
34
|
+
},
|
|
35
|
+
gestureSettingsTouch: {
|
|
36
|
+
pinchRotate: true,
|
|
37
|
+
},
|
|
38
|
+
maxZoomLevel: 100,
|
|
39
|
+
minZoomLevel: 0.1,
|
|
40
|
+
preserveImageSizeOnResize: true,
|
|
41
|
+
showNavigationControl: false,
|
|
42
|
+
showRotationControl: true,
|
|
43
|
+
visibilityRatio: 0.2,
|
|
44
|
+
drawer: 'canvas',
|
|
45
|
+
};
|
|
46
|
+
// Match the client's default annotation style for now
|
|
47
|
+
const DRAWING_STYLE = (state) => ({
|
|
48
|
+
fill: '#0080ff',
|
|
49
|
+
fillOpacity: state?.hovered ? 0.28 : 0.2,
|
|
50
|
+
stroke: '#0080ff',
|
|
51
|
+
strokeOpacity: state?.selected ? 0.9 : 0.5,
|
|
52
|
+
strokeWidth: state?.selected ? 2 : 1,
|
|
53
|
+
});
|
|
54
|
+
// Same as the client: annotations on inactive (read-only) layers
|
|
55
|
+
const READ_ONLY_STYLE = (state) => ({
|
|
56
|
+
fill: '#010101',
|
|
57
|
+
fillOpacity: state?.hovered ? 0.1 : 0,
|
|
58
|
+
stroke: '#010101',
|
|
59
|
+
strokeOpacity: state?.selected ? 1 : 0.65,
|
|
60
|
+
strokeWidth: state?.selected ? 2.5 : 2,
|
|
61
|
+
});
|
|
62
|
+
export const ImageMetaphorView = (props) => {
|
|
63
|
+
const { channelId, context, document, project } = props;
|
|
64
|
+
const isIIIF = document.meta_data?.protocol?.startsWith('IIIF');
|
|
65
|
+
const { layers, activeLayer } = useDocumentLayers(document.id, context.id);
|
|
66
|
+
const policies = useLayerPolicies(activeLayer?.id);
|
|
67
|
+
const isLocked = Boolean(project.is_locked);
|
|
68
|
+
const style = useMemo(() => (annotation, state) => {
|
|
69
|
+
const layerId = annotation
|
|
70
|
+
.layer_id;
|
|
71
|
+
return activeLayer && layerId && layerId !== activeLayer.id
|
|
72
|
+
? READ_ONLY_STYLE(state)
|
|
73
|
+
: DRAWING_STYLE(state);
|
|
74
|
+
}, [activeLayer?.id]);
|
|
75
|
+
const annoRef = useRef(null);
|
|
76
|
+
// Creators and layer admins can edit, everyone else can only select. The
|
|
77
|
+
// resulting `editable` flag drives the popups and the Selected tab.
|
|
78
|
+
const selectAction = useSelectAction({
|
|
79
|
+
isLocked,
|
|
80
|
+
activeLayerId: activeLayer?.id,
|
|
81
|
+
policies,
|
|
82
|
+
getUser: () => annoRef.current?.getUser(),
|
|
83
|
+
});
|
|
84
|
+
// Resolves remote IIIF (meta_data.url) and locally-uploaded images (served
|
|
85
|
+
// via cantaloupe)
|
|
86
|
+
const { manifest, canvases, currentCanvas, currentImage, image, error, authToken, isPresentationManifest, setCurrentCanvas, } = useDocumentIIIF(document, {
|
|
87
|
+
cantaloupePath: CANTALOUPE_PATH,
|
|
88
|
+
getAccessToken,
|
|
89
|
+
});
|
|
90
|
+
// OSD tile source: the info.json URL for a IIIF image service, or the plain
|
|
91
|
+
// image URL for a static image
|
|
92
|
+
const tilesource = useMemo(() => currentImage
|
|
93
|
+
? currentImage.type === 'static'
|
|
94
|
+
? currentImage.url
|
|
95
|
+
: currentImage.serviceUrl
|
|
96
|
+
: undefined, [currentImage]);
|
|
97
|
+
const [present, setPresent] = useState([]);
|
|
98
|
+
// Where other users are working, for multi-canvas documents
|
|
99
|
+
const { activeUsers, onPageActivity } = useMultiPagePresence(present);
|
|
100
|
+
const isMultiCanvas = canvases.length > 1;
|
|
101
|
+
const [privacy, setPrivacy] = useState('public');
|
|
102
|
+
const [tool, setTool] = useState('rectangle');
|
|
103
|
+
const [drawingEnabled, setDrawingEnabled] = useState(false);
|
|
104
|
+
const [arrowsMode, setArrowsMode] = useState('select');
|
|
105
|
+
const [arrowsVisibility, setArrowsVisibility] = useState('ALWAYS');
|
|
106
|
+
const [annotationTab, setAnnotationTab] = useState();
|
|
107
|
+
const [metadataOpen, setMetadataOpen] = useState(true);
|
|
108
|
+
const metadataOpenButtonRef = useRef(null);
|
|
109
|
+
const onMetadataOpenChange = (open) => {
|
|
110
|
+
setMetadataOpen(open);
|
|
111
|
+
if (!open) {
|
|
112
|
+
metadataOpenButtonRef.current?.focus();
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const options = useMemo(() => {
|
|
116
|
+
if (!tilesource)
|
|
117
|
+
return OSD_BASE_OPTIONS;
|
|
118
|
+
return {
|
|
119
|
+
...OSD_BASE_OPTIONS,
|
|
120
|
+
tileSources: {
|
|
121
|
+
tileSource: tilesource,
|
|
122
|
+
loadTilesWithAjax: Boolean(authToken),
|
|
123
|
+
ajaxHeaders: authToken
|
|
124
|
+
? { Authorization: `Bearer ${authToken}` }
|
|
125
|
+
: undefined,
|
|
126
|
+
},
|
|
127
|
+
crossOriginPolicy: authToken ? undefined : 'Anonymous',
|
|
128
|
+
ajaxWithCredentials: authToken ? true : undefined,
|
|
129
|
+
};
|
|
130
|
+
}, [tilesource, authToken]);
|
|
131
|
+
return (_jsx(I18nextProvider, { i18n: clientI18next, children: !isIIIF ? (_jsx("div", { className: 'view-unsupported', children: clientI18next.t('This document type is not supported in this view.') })) : error ? (_jsx("div", { className: 'view-unsupported', children: error })) : activeLayer && tilesource ? (_jsx(AuthorColorProvider, { children: _jsx(Annotorious, { children: _jsx(FilterState, { children: _jsx(HideAllState, { children: _jsxs("div", { id: 'metaphor-image-root', children: [_jsx(MetadataPanel, { document: document, open: metadataOpen, onOpenChange: onMetadataOpenChange, canvases: canvases, currentCanvas: currentCanvas, image: image, manifest: manifest, authToken: authToken, onSelectCanvas: setCurrentCanvas, activeUsers: activeUsers }), _jsx("div", { id: 'main', children: _jsxs(OpenSeadragonAnnotator, { ref: annoRef, autoSave: true, disableUndoRedoKeys: true, tool: tool, drawingMode: 'drag', drawingEnabled: drawingEnabled && !isLocked, userSelectAction: selectAction, style: style, onInitError: (error) => console.error('[metaphor] OSD annotator init failed', error), children: [_jsx(EditorToolbar, { annotationsOpen: !!annotationTab, context: context, document: document, metadataOpen: metadataOpen, metadataOpenButtonRef: metadataOpenButtonRef, onMetadataOpenChange: onMetadataOpenChange, present: present, project: project, privacy: privacy, onChangePrivacy: setPrivacy, onAnnotationsOpenChange: (open) => setAnnotationTab(open ? 'list' : undefined), tools:
|
|
132
|
+
// no drawing tools in locked projects
|
|
133
|
+
!isLocked && (_jsx(Toolbar, { tool: tool, drawingEnabled: drawingEnabled, arrowsMode: arrowsMode, onChangeTool: setTool, onSetDrawingEnabled: setDrawingEnabled, onSetArrowsMode: setArrowsMode })), moreMenu: _jsx(ImageMoreTools, { privacy: privacy, arrowsVisibility: arrowsVisibility, onChangePrivacy: setPrivacy, onSetArrowsVisibility: setArrowsVisibility }) }), _jsx(OpenSeadragonViewer, { className: 'ia-osd-container', options: options }, currentCanvas?.id), _jsx(ImageUndoStack, {}), _jsx(SelectionURLState, { backButton: true }), _jsx(FilterAdapter, {}), layers.length > 0 && (_jsx(StorageAdapter, { activeLayer: activeLayer, channelId: channelId, layers: layers, onPresence: setPresent, onOffPageActivity: isMultiCanvas ? onPageActivity : undefined, onSelectionChange: isMultiCanvas && currentCanvas
|
|
134
|
+
? (user) => onPageActivity({ source: currentCanvas.id, user })
|
|
135
|
+
: undefined, privacyMode: privacy === 'private', source: isPresentationManifest ? currentCanvas?.id : undefined })), _jsx(OpenSeadragonHoverTooltip, { tooltip: (tooltipProps) => (_jsx(HoverTooltip, { annotation: tooltipProps.annotation })) }), _jsx(OpenSeadragonAnnotationPopup, { popup: (popupProps) => (_jsx(ShapeToolbar, { annotation: popupProps.annotation, editable: Boolean(popupProps.editable), onClickAdvanced: () => setAnnotationTab('selected') })) }), _jsx(AnnotoriousPlugin, { plugin: ToolsPlugin }), _jsx(AnnotoriousPlugin, { plugin: MagneticOutlinePlugin }), _jsx(ImageArrows, { mode: arrowsMode, visibility: arrowsVisibility })] }) }), _jsx(AnnotationPanel, { isLocked: isLocked, tab: annotationTab, onStateChange: setAnnotationTab })] }) }) }) }) })) : (_jsx("div", { className: 'spinner-container', children: _jsx(Spinner, { className: 'spinner', size: 32 }) })) }));
|
|
136
|
+
};
|
package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/AnnotationPanel.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type AnnotationPanelTab = 'selected' | 'list' | 'settings';
|
|
2
|
+
interface AnnotationPanelProps {
|
|
3
|
+
isLocked: boolean;
|
|
4
|
+
tab?: AnnotationPanelTab;
|
|
5
|
+
onStateChange(tab?: AnnotationPanelTab): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const AnnotationPanel: (props: AnnotationPanelProps) => import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=AnnotationPanel.d.ts.map
|
package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/AnnotationPanel.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnnotationPanel.d.ts","sourceRoot":"","sources":["../../../../../../src/pages/_components/ImageMetaphorView/components/AnnotationPanel/AnnotationPanel.tsx"],"names":[],"mappings":"AAkBA,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAElE,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAElB,GAAG,CAAC,EAAE,kBAAkB,CAAC;IAEzB,aAAa,CAAC,GAAG,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC/C;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,oBAAoB,gCA8D1D,CAAC"}
|
package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/AnnotationPanel.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { XIcon, CursorIcon, ChatsIcon, SlidersHorizontalIcon, } from '@phosphor-icons/react';
|
|
4
|
+
import { Button } from '@recogito/studio-sdk/components';
|
|
5
|
+
import { SelectedTab } from './SelectedTab';
|
|
6
|
+
import { ListTab } from './ListTab';
|
|
7
|
+
import { SettingsTab } from './SettingsTab';
|
|
8
|
+
import { Tabs, TabsList, TabsTrigger, TabsContent, } from '../../../shared/components';
|
|
9
|
+
export const AnnotationPanel = (props) => {
|
|
10
|
+
const { t } = useTranslation();
|
|
11
|
+
return (_jsx("div", { className: `annotation-panel ${props.tab ? 'open' : 'closed'}`, inert: !props.tab, children: _jsxs("div", { className: 'annotation-panel-content', children: [_jsxs("div", { className: 'annotation-panel-header', children: [_jsx("h3", { className: 'annotation-panel-title', children: t('Annotations') }), _jsx(Button, { className: 'unstyled toolbar-btn icon-only', onClick: () => props.onStateChange(undefined), "aria-label": t('Close sidebar'), children: _jsx(XIcon, { weight: 'bold', "aria-hidden": 'true' }) })] }), _jsxs(Tabs, { value: props.tab || 'selected', onValueChange: (val) => props.onStateChange(val), className: 'annotation-panel-tabs-root', children: [_jsxs(TabsList, { children: [_jsxs(TabsTrigger, { value: 'selected', children: [_jsx(CursorIcon, { weight: 'bold', "aria-hidden": 'true' }), _jsx("span", { className: 'tab-label', children: t('Selected') })] }), _jsxs(TabsTrigger, { value: 'list', children: [_jsx(ChatsIcon, { weight: 'bold', "aria-hidden": 'true' }), _jsx("span", { className: 'tab-label', children: t('List') })] }), _jsxs(TabsTrigger, { value: 'settings', children: [_jsx(SlidersHorizontalIcon, { weight: 'bold', "aria-hidden": 'true' }), _jsx("span", { className: 'tab-label', children: t('Settings') })] })] }), _jsx(TabsContent, { value: 'selected', className: 'annotation-panel-tab-content', children: _jsx(SelectedTab, { isLocked: props.isLocked }) }), _jsx(TabsContent, { value: 'list', className: 'annotation-panel-tab-content list-tab-container', children: _jsx(ListTab, {}) }), _jsx(TabsContent, { value: 'settings', className: 'annotation-panel-tab-content', children: _jsx(SettingsTab, {}) })] })] }) }));
|
|
12
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SupabaseAnnotation } from '@recogito/annotorious-supabase';
|
|
2
|
+
interface ImageListCardProps {
|
|
3
|
+
annotation: SupabaseAnnotation;
|
|
4
|
+
selected: boolean;
|
|
5
|
+
emphasize: boolean;
|
|
6
|
+
deemphasize: boolean;
|
|
7
|
+
onToggleSelect(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare const ImageListCard: (props: ImageListCardProps) => import("react").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ImageListCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageListCard.d.ts","sourceRoot":"","sources":["../../../../../../../src/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ImageListCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAcxC,UAAU,kBAAkB;IAC1B,UAAU,EAAE,kBAAkB,CAAC;IAE/B,QAAQ,EAAE,OAAO,CAAC;IAElB,SAAS,EAAE,OAAO,CAAC;IAEnB,WAAW,EAAE,OAAO,CAAC;IAErB,cAAc,IAAI,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,aAAa,GAAI,OAAO,kBAAkB,gCAyHtD,CAAC"}
|
package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ImageListCard.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import { Visibility, } from '@recogito/annotorious-supabase';
|
|
5
|
+
import { ChatTeardropTextIcon, LockIcon } from '@phosphor-icons/react';
|
|
6
|
+
import { Avatar } from '@recogito/studio-sdk/components';
|
|
7
|
+
import { getCategoryColor, RelationPreview, useRelations } from '../../shared';
|
|
8
|
+
const timeAgo = (date, locale) => {
|
|
9
|
+
const rtf = new Intl.RelativeTimeFormat(locale || 'en', { numeric: 'auto' });
|
|
10
|
+
const mins = Math.round((date.getTime() - Date.now()) / 60000);
|
|
11
|
+
if (Math.abs(mins) < 60)
|
|
12
|
+
return rtf.format(mins, 'minute');
|
|
13
|
+
const hrs = Math.round(mins / 60);
|
|
14
|
+
if (Math.abs(hrs) < 24)
|
|
15
|
+
return rtf.format(hrs, 'hour');
|
|
16
|
+
return rtf.format(Math.round(hrs / 24), 'day');
|
|
17
|
+
};
|
|
18
|
+
export const ImageListCard = (props) => {
|
|
19
|
+
const { t, i18n } = useTranslation();
|
|
20
|
+
const { annotation } = props;
|
|
21
|
+
const category = useMemo(() => annotation.bodies.find((b) => b.purpose === 'classifying')?.value, [annotation.bodies]);
|
|
22
|
+
const properties = useMemo(() => annotation.bodies.filter((b) => b.purpose === 'tagging' && b.value), [annotation.bodies]);
|
|
23
|
+
const creator = annotation.target.creator;
|
|
24
|
+
const creatorName = creator?.name || t('Unknown User');
|
|
25
|
+
const created = annotation.target.created || new Date();
|
|
26
|
+
const isPrivate = annotation.visibility === Visibility.PRIVATE;
|
|
27
|
+
const arrows = useRelations(annotation.id);
|
|
28
|
+
const commentCount = useMemo(() => annotation.bodies.filter((b) => b.purpose === 'commenting' || b.purpose === 'replying').length, [annotation.bodies]);
|
|
29
|
+
const cardClass = [
|
|
30
|
+
'list-card',
|
|
31
|
+
props.emphasize ? 'is-emphasized' : '',
|
|
32
|
+
props.deemphasize ? 'is-deemphasized' : '',
|
|
33
|
+
]
|
|
34
|
+
.filter(Boolean)
|
|
35
|
+
.join(' ');
|
|
36
|
+
return (_jsxs("div", { className: cardClass, children: [_jsx("button", { type: 'button', className: 'unstyled list-card-select', "aria-pressed": props.selected, "aria-label": t('Select Annotation'), onClick: props.onToggleSelect }), _jsxs("div", { className: 'list-card-content', children: [category ? (_jsx("div", { className: 'ia-list-card-category', style: { backgroundColor: getCategoryColor(category) }, children: category })) : (_jsx("div", { className: 'ia-list-card-untitled', children: t('Untitled annotation') })), properties.length > 0 && (_jsx("div", { className: 'list-card-tags', children: properties.map((body, idx) => (_jsxs("div", { className: 'list-card-tag', children: [_jsx("div", { className: 'list-card-tag-dot' }), _jsx("span", { children: body.value })] }, body.id || idx))) })), arrows.length > 0 && (_jsx("div", { className: 'ia-relation-list', children: arrows.map((arrow) => (_jsx(RelationPreview, { arrow: arrow, referenceAnnotationId: annotation.id }, arrow.id))) })), _jsxs("div", { className: 'list-card-footer', children: [_jsxs("div", { className: 'list-card-meta', children: [_jsx(Avatar, { id: creator?.id || 'unknown', name: creatorName, avatar: creator?.avatar, size: 'sm' }), _jsx("span", { className: 'list-card-author', children: creatorName }), _jsxs("span", { className: 'list-card-date', children: ["\u00B7 ", timeAgo(created, i18n.language)] })] }), _jsxs("div", { className: 'list-card-footer-actions', children: [commentCount > 0 && (_jsxs("span", { className: 'list-card-comments', children: [_jsx(ChatTeardropTextIcon, { size: 14, weight: 'bold', "aria-hidden": 'true' }), _jsx("span", { children: commentCount })] })), isPrivate && (_jsx("span", { className: 'list-card-private', title: t('Private'), children: _jsx(LockIcon, { size: 14, weight: 'bold' }) }))] })] })] })] }));
|
|
37
|
+
};
|
package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ListTab.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListTab.d.ts","sourceRoot":"","sources":["../../../../../../../src/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ListTab.tsx"],"names":[],"mappings":"AAuBA,eAAO,MAAM,OAAO,mCA2NnB,CAAC"}
|
package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/ListTab.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import * as Tooltip from '@radix-ui/react-tooltip';
|
|
5
|
+
import * as Select from '@radix-ui/react-select';
|
|
6
|
+
import { CaretDownIcon, CheckIcon, SortAscendingIcon, SortDescendingIcon, } from '@phosphor-icons/react';
|
|
7
|
+
import { useAnnotationStore, useAnnotator, useSelection, useViewportState, } from '@annotorious/react';
|
|
8
|
+
import { useFilter } from '@recogito/studio-sdk/components';
|
|
9
|
+
import { isArrowAnchor, isArrowAnnotation } from '@annotorious/plugin-arrows-react';
|
|
10
|
+
import { ImageListCard } from './ImageListCard';
|
|
11
|
+
export const ListTab = () => {
|
|
12
|
+
const { t } = useTranslation();
|
|
13
|
+
const [sortBy, setSortBy] = useState('created');
|
|
14
|
+
const [sortDirection, setSortDirection] = useState('desc');
|
|
15
|
+
const [viewportFilter, setViewportFilter] = useState('all');
|
|
16
|
+
const anno = useAnnotator();
|
|
17
|
+
const store = useAnnotationStore();
|
|
18
|
+
const [allAnnotations, setAllAnnotations] = useState([]);
|
|
19
|
+
// Keep annotations list in sync
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!store)
|
|
22
|
+
return;
|
|
23
|
+
const update = () => setAllAnnotations(store.all());
|
|
24
|
+
update();
|
|
25
|
+
store.observe(update);
|
|
26
|
+
return () => store.unobserve(update);
|
|
27
|
+
}, [store]);
|
|
28
|
+
const visibleAnnotations = useViewportState(250);
|
|
29
|
+
const { selected } = useSelection();
|
|
30
|
+
const { filter } = useFilter();
|
|
31
|
+
const hasSelection = selected.length > 0;
|
|
32
|
+
const isSelected = (annotation) => selected.some((s) => s.annotation.id === annotation.id);
|
|
33
|
+
// When a relation (arrow) is selected, emphasize the annotations it links
|
|
34
|
+
const linkedBySelection = useMemo(() => new Set(selected
|
|
35
|
+
.map((s) => s.annotation)
|
|
36
|
+
.filter(isArrowAnnotation)
|
|
37
|
+
.flatMap(({ target: { selector } }) => [selector.start, selector.end])
|
|
38
|
+
.filter(isArrowAnchor)
|
|
39
|
+
.map((anchor) => anchor.annotationId)), [selected]);
|
|
40
|
+
const isEmphasized = (annotation) => isSelected(annotation) || linkedBySelection.has(annotation.id);
|
|
41
|
+
// Relations (arrows) are shown on the cards of the annotations they link,
|
|
42
|
+
// not as cards of their own
|
|
43
|
+
const unfiltered = (viewportFilter === 'viewport' ? visibleAnnotations : allAnnotations).filter((a) => !isArrowAnnotation(a));
|
|
44
|
+
const activeAnnotations = filter ? unfiltered.filter(filter) : unfiltered;
|
|
45
|
+
const sorted = useMemo(() => {
|
|
46
|
+
const getLatest = (a) => Math.max(a.target.created?.getTime() || 0, ...a.bodies.map((b) => b.created?.getTime() || 0));
|
|
47
|
+
const list = [...activeAnnotations].sort((a, b) => sortBy === 'updated'
|
|
48
|
+
? getLatest(a) - getLatest(b)
|
|
49
|
+
: (a.target.created?.getTime() || 0) -
|
|
50
|
+
(b.target.created?.getTime() || 0));
|
|
51
|
+
if (sortDirection === 'desc')
|
|
52
|
+
list.reverse();
|
|
53
|
+
return list;
|
|
54
|
+
}, [activeAnnotations, sortBy, sortDirection]);
|
|
55
|
+
const onToggleSelect = (annotation) => {
|
|
56
|
+
if (!anno)
|
|
57
|
+
return;
|
|
58
|
+
if (isSelected(annotation)) {
|
|
59
|
+
anno.state.selection.clear();
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
anno.state.selection.setSelected(annotation.id);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
return (_jsxs(_Fragment, { children: [_jsxs("header", { className: 'list-header', children: [_jsxs("div", { className: 'list-header-group', children: [_jsx(Tooltip.Provider, { children: _jsxs(Tooltip.Root, { children: [_jsx(Tooltip.Trigger, { asChild: true, children: _jsx("button", { className: 'unstyled toolbar-btn icon-only', "aria-label": t('Toggle sort direction'), onClick: () => setSortDirection((prev) => prev === 'asc' ? 'desc' : 'asc'), children: sortDirection === 'asc' ? (_jsx(SortAscendingIcon, {})) : (_jsx(SortDescendingIcon, {})) }) }), _jsx(Tooltip.Portal, { children: _jsxs(Tooltip.Content, { side: 'top', className: 'tooltip-content', children: [sortDirection === 'asc'
|
|
66
|
+
? t('Sort descending')
|
|
67
|
+
: t('Sort ascending'), _jsx(Tooltip.Arrow, { className: 'tooltip-arrow' })] }) })] }) }), _jsxs(Select.Root, { value: sortBy, onValueChange: (v) => setSortBy(v), children: [_jsxs(Select.Trigger, { className: 'unstyled list-select-trigger', children: [_jsx(Select.Value, {}), _jsx(Select.Icon, { children: _jsx(CaretDownIcon, { size: 12 }) })] }), _jsx(Select.Portal, { children: _jsx(Select.Content, { className: 'list-select-content', position: 'popper', sideOffset: 4, children: _jsxs(Select.Viewport, { children: [_jsxs(Select.Item, { value: 'created', className: 'list-select-item', children: [_jsx(Select.ItemText, { children: t('Created') }), _jsx(Select.ItemIndicator, { className: 'list-select-indicator', children: _jsx(CheckIcon, { size: 14 }) })] }), _jsxs(Select.Item, { value: 'updated', className: 'list-select-item', children: [_jsx(Select.ItemText, { children: t('Updated') }), _jsx(Select.ItemIndicator, { className: 'list-select-indicator', children: _jsx(CheckIcon, { size: 14 }) })] })] }) }) })] })] }), _jsx("div", { className: 'list-header-group', children: _jsxs(Select.Root, { value: viewportFilter, onValueChange: (v) => setViewportFilter(v), children: [_jsxs(Select.Trigger, { className: 'unstyled list-select-trigger', children: [_jsx(Select.Value, {}), _jsx(Select.Icon, { children: _jsx(CaretDownIcon, { size: 12 }) })] }), _jsx(Select.Portal, { children: _jsx(Select.Content, { className: 'list-select-content', position: 'popper', sideOffset: 4, children: _jsxs(Select.Viewport, { children: [_jsxs(Select.Item, { value: 'all', className: 'list-select-item', children: [_jsx(Select.ItemText, { children: t('Show all') }), _jsx(Select.ItemIndicator, { className: 'list-select-indicator', children: _jsx(CheckIcon, { size: 14 }) })] }), _jsxs(Select.Item, { value: 'viewport', className: 'list-select-item', children: [_jsx(Select.ItemText, { children: t('Current viewport') }), _jsx(Select.ItemIndicator, { className: 'list-select-indicator', children: _jsx(CheckIcon, { size: 14 }) })] })] }) }) })] }) })] }), sorted.length === 0 ? (_jsx("div", { className: 'ia-panel-empty', children: _jsx("p", { children: viewportFilter === 'viewport'
|
|
68
|
+
? t('No annotations in the current view')
|
|
69
|
+
: t('No annotations yet') }) })) : (_jsx("div", { className: 'list-cards-wrapper', children: sorted.map((annotation) => (_jsx(ImageListCard, { annotation: annotation, selected: isSelected(annotation), emphasize: hasSelection && isEmphasized(annotation), deemphasize: hasSelection && !isEmphasized(annotation), onToggleSelect: () => onToggleSelect(annotation) }, annotation.id))) }))] }));
|
|
70
|
+
};
|
package/dist/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/pages/_components/ImageMetaphorView/components/AnnotationPanel/ListTab/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ListTab';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ArrowAnnotation } from '@annotorious/plugin-arrows-react';
|
|
2
|
+
interface SelectedArrowAnnotationProps {
|
|
3
|
+
annotation: ArrowAnnotation;
|
|
4
|
+
editable: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const SelectedArrowAnnotation: (props: SelectedArrowAnnotationProps) => import("react").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=SelectedArrowAnnotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectedArrowAnnotation.d.ts","sourceRoot":"","sources":["../../../../../../../src/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedArrowAnnotation.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,UAAU,4BAA4B;IACpC,UAAU,EAAE,eAAe,CAAC;IAE5B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,uBAAuB,GAAI,OAAO,4BAA4B,gCAqE1E,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import { ShapesIcon, TrashIcon, XIcon } from '@phosphor-icons/react';
|
|
5
|
+
import { createBody, useAnnotationStore } from '@annotorious/react';
|
|
6
|
+
import { getCategoryColor, RelationPreview, SetCategory } from '../../shared';
|
|
7
|
+
export const SelectedArrowAnnotation = (props) => {
|
|
8
|
+
const { t } = useTranslation();
|
|
9
|
+
const store = useAnnotationStore();
|
|
10
|
+
// Relation categories reuse the shape categories (a 'classifying' body)
|
|
11
|
+
const category = useMemo(() => props.annotation.bodies.find((b) => b.purpose === 'classifying')?.value, [props.annotation]);
|
|
12
|
+
const onSetCategory = (value) => store?.addBody(createBody(props.annotation, { purpose: 'classifying', value }));
|
|
13
|
+
const onClearCategory = () => {
|
|
14
|
+
const body = props.annotation.bodies.find((b) => b.purpose === 'classifying');
|
|
15
|
+
if (body)
|
|
16
|
+
store?.deleteBody(body);
|
|
17
|
+
};
|
|
18
|
+
const onDelete = () => store?.deleteAnnotation(props.annotation.id);
|
|
19
|
+
return (_jsxs("div", { className: 'ia-selected', children: [_jsx("div", { className: 'ia-selected-section', children: category ? (_jsxs("div", { className: 'ia-category-chip', style: { backgroundColor: getCategoryColor(category) }, children: [_jsx("span", { children: category }), props.editable && (_jsx("button", { className: 'unstyled icon-only', "aria-label": t('Clear class'), onClick: onClearCategory, children: _jsx(XIcon, {}) }))] })) : props.editable && (_jsx(SetCategory, { onSetCategory: onSetCategory, children: _jsxs("button", { className: 'ia-add-class', children: [_jsx(ShapesIcon, { size: 20 }), " ", t('Add class')] }) })) }), _jsx("div", { className: 'ia-selected-section', children: _jsx(RelationPreview, { arrow: props.annotation }) }), props.editable && (_jsx("div", { className: 'ia-selected-footer', children: _jsxs("button", { className: 'danger', onClick: onDelete, children: [_jsx(TrashIcon, {}), " ", t('Delete relation')] }) }))] }));
|
|
20
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ImageAnnotation } from '@annotorious/react';
|
|
2
|
+
interface SelectedImageAnnotationProps {
|
|
3
|
+
annotation: ImageAnnotation;
|
|
4
|
+
editable: boolean;
|
|
5
|
+
isLocked: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const SelectedImageAnnotation: (props: SelectedImageAnnotationProps) => import("react").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=SelectedImageAnnotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectedImageAnnotation.d.ts","sourceRoot":"","sources":["../../../../../../../src/pages/_components/ImageMetaphorView/components/AnnotationPanel/SelectedTab/SelectedImageAnnotation.tsx"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,oBAAoB,CAAC;AAgB5B,UAAU,4BAA4B;IACpC,UAAU,EAAE,eAAe,CAAC;IAE5B,QAAQ,EAAE,OAAO,CAAC;IAElB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,uBAAuB,GAAI,OAAO,4BAA4B,gCAwJ1E,CAAC"}
|