An Annotorious plugin for drawing arrows. Arrows can be independent annotations, or they can be linked to existing shapes — either on both ends, or on one end only (start or tip). When linked, the relationships are represented in the data model.
Also available: React wrapper
npm install @annotorious/plugin-arrows import { createImageAnnotator } from '@annotorious/annotorious'; import { mountImagePlugin } from '@annotorious/plugin-arrows'; const anno = createImageAnnotator('sample-image'); const arrowsPlugin = mountImagePlugin(anno, { // Plugin options (see below) }); import { createOSDAnnotator } from '@annotorious/openseadragon'; import { mountOSDPlugin } from '@annotorious/plugin-arrows'; const viewer = OpenSeadragon({ // OSD init options }); const anno = createOSDAnnotator(viewer, { // Annotorious init options }); const arrowsPlugin = mountOSDPlugin(anno, viewer, { // Plugin options (see below) }); Once installed, the plugin integrates seamlessly with the Annotorious lifecycle. Arrow annotations trigger the same events as other annotations:
createAnnotationupdateAnnotationdeleteAnnotationselectionChangedmouseEnterAnnotationmouseLeaveAnnotation
Note
clickAnnotation and viewportIntersect are currently not supported for arrows.
By default, the plugin starts enabled and in select mode:
- You can interact with all annotations normally (regular shapes and arrows).
- Clicking an arrow selects it, allowing the user to move it or adjust the start/tip.
To let users draw arrows, switch to draw mode:
arrowsPlugin.setMode('draw');Users can then:
- Click once for the start and once for the end point, or
- Click and drag from start to end.
| Option | Type | Description |
|---|---|---|
showArrows | ArrowsVisibility | Controls when arrows are visible |
ArrowsVisibility can be one of the following:
ALWAYS– all arrows are visible.HOVER_ONLY– arrows appear only when hovering over a connected shape annotation.SELECTED_ONLY– arrows appear only when a connected annotation is selected.HOVER_OR_SELECT– arrows appear when hovering over or selecting a connected annotation.
| Method | Parameters | Description |
|---|---|---|
setEnabled(enabled: boolean) | true/false | Enables or disables the plugin (arrows remain visible) |
| `setMode(mode: 'draw' | 'select')` | – |
setVisibility(visibility: ArrowsVisibility) | – | Changes arrow visibility. |
unmount() | – | Cleans up and destroys the plugin instance. |
Arrow annotations differ from standard Annotorious shapes in two ways:
- They have a
motivationfield with the valuepointing. - Their target represents the arrow start and end anchors.
An arrow can be independent, with explicit start/end coordinates, or linked to existing annotations.
Example: independent (unlinked) arrow
{ "id": "aab6d162-0156-461e-b3cd-704ee5061d89", "motivation": "pointing", "bodies": [], "target": { "created": "2025-10-20T13:16:56.486Z", "selector": { "start": { "x": 37.4, "y": 176.6 }, "end": { "x": 120.3, "y": 80.1 } } } }Example: arrow linked at both ends
{ "id": "daf0e68a-002b-44fd-9b9c-6c984c992742", "motivation": "pointing", "bodies": [], "target": { "created": "2025-10-20T13:18:26.019Z", "selector": { "start": { "annotationId": "617d04b3-1f49-4b65-b684-5e64d90f10be", "offset": { "x": -2, "y": 108.8 } }, "end": { "annotationId": "e4309c1c-7481-4554-88a3-9ae42166ea5e", "offset": { "x": -13, "y": 0.1 } } } } }Linked anchors (start or end) reference other annotations by ID. The offset represents the X/Y offset from the center of the linked shape's bounding box, rather than absolute image coordinates.
