From 0de181b7523fbc973368db8c09b9c062d48a739b Mon Sep 17 00:00:00 2001 From: Oleksandr Danylchenko Date: Wed, 28 Aug 2024 20:29:40 +0300 Subject: [PATCH 1/7] Added highlights sorting for the `SPAN` --- .../src/highlight/span/spansRenderer.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/text-annotator/src/highlight/span/spansRenderer.ts b/packages/text-annotator/src/highlight/span/spansRenderer.ts index 47dd7f13..85451a49 100644 --- a/packages/text-annotator/src/highlight/span/spansRenderer.ts +++ b/packages/text-annotator/src/highlight/span/spansRenderer.ts @@ -56,7 +56,20 @@ const createRenderer = (container: HTMLElement): RendererImplementation => { if (shouldRedraw) highlightLayer.innerHTML = ''; - highlights.forEach(highlight => { + /** + * Highlights rendering in the span highlight layer is an order-sensitive operation. + * The later the highlight is rendered, the higher it will be in the visual stack. + * + * By default, we should expect that the newer highlight + * will be rendered over the older one + */ + const highlightsByCreation = [...highlights].sort((highlightA, highlightB) => { + const { annotation: { target: { created: createdA } } } = highlightA; + const { annotation: { target: { created: createdB } } } = highlightB; + return createdA.getTime() - createdB.getTime(); + }); + + highlightsByCreation.forEach(highlight => { highlight.rects.map(rect => { const zIndex = computeZIndex(rect, highlights); const style = paint(highlight, viewportBounds, currentStyle, painter, zIndex); From 3ee6a4a7c73057008c01da45c746b05a343c4bca Mon Sep 17 00:00:00 2001 From: Rainer Simon Date: Tue, 3 Sep 2024 07:27:28 +0200 Subject: [PATCH 2/7] Removed FF ponyfill --- .../text-annotator/src/state/spatialTree.ts | 9 +- .../src/utils/getClientRectsPonyfill.ts | 164 ------------------ packages/text-annotator/src/utils/index.ts | 1 - 3 files changed, 1 insertion(+), 173 deletions(-) delete mode 100644 packages/text-annotator/src/utils/getClientRectsPonyfill.ts diff --git a/packages/text-annotator/src/state/spatialTree.ts b/packages/text-annotator/src/state/spatialTree.ts index 9260c3e9..4becefe4 100644 --- a/packages/text-annotator/src/state/spatialTree.ts +++ b/packages/text-annotator/src/state/spatialTree.ts @@ -2,14 +2,9 @@ import RBush from 'rbush'; import type { Store } from '@annotorious/core'; import type { TextAnnotation, TextAnnotationTarget } from '../model'; import { isRevived, mergeClientRects } from '../utils'; -import { getClientRectsPonyfill } from '../utils/getClientRectsPonyfill'; import { reviveSelector } from '../utils'; import type { AnnotationRects } from './TextAnnotationStore'; -const isFirefox = false; // navigator.userAgent.match(/firefox|fxios/i); - -if (isFirefox) console.warn('Firefox interop enabled'); - interface IndexedHighlightRect { minX: number; @@ -40,9 +35,7 @@ export const createSpatialTree = (store: Store, container: HTMLE const toItems = (target: TextAnnotationTarget, offset: DOMRect): IndexedHighlightRect[] => { const rects = target.selector.flatMap(s => { const revivedRange = isRevived([s]) ? s.range : reviveSelector(s, container).range; - return isFirefox ? - getClientRectsPonyfill(revivedRange) : - Array.from(revivedRange.getClientRects()); + return Array.from(revivedRange.getClientRects()); }); const merged = mergeClientRects(rects) diff --git a/packages/text-annotator/src/utils/getClientRectsPonyfill.ts b/packages/text-annotator/src/utils/getClientRectsPonyfill.ts deleted file mode 100644 index 0e545c38..00000000 --- a/packages/text-annotator/src/utils/getClientRectsPonyfill.ts +++ /dev/null @@ -1,164 +0,0 @@ -/** Returns the index of this node in the node-iterator of the given root **/ -const findIndex = (node: Node, root: Node) => { - const ni = document.createNodeIterator(root); - - let index = 0; - - let n = ni.nextNode(); - - while (n !== null) { - if (n === node) - return index; - - index += 1; - - n = ni.nextNode(); - } -} - -/** - * Returns the node that has the given index in the node - * iterator of the given root node. - */ -const getNodeAtIndex = (index: number, root: Node) => { - const ni = document.createNodeIterator(root); - - let node: Node | null = null; - - for (let i=0; i { - const { - commonAncestorContainer, - startContainer, - startOffset, - endContainer, - endOffset - } = range; - - // Clone the original children, so we can re-generate the original DOM - const originalChildren = - Array.from(commonAncestorContainer.childNodes).map(n => { - const cloned = n.cloneNode(true); - return n.nodeName === 'CANVAS' ? n : cloned; - }); - - // Rember range start/end indices, so we can re-generate the range in the clone - const startContainerIndex = findIndex(startContainer, commonAncestorContainer)!; - const endContainerIndex = findIndex(endContainer, commonAncestorContainer)!; - - // Reverse the wrapping operation, regenerate the range - const unwrap = () => { - const root = commonAncestorContainer as Element; - root.replaceChildren(...originalChildren); - - const startContainer = getNodeAtIndex(startContainerIndex, root); - const endContainer = getNodeAtIndex(endContainerIndex, root); - - range.setStart(startContainer, startOffset); - range.setEnd(endContainer, endOffset); - return range; - } - - // Shorthand - const surround = (range: Range) => { - const wrapper = document.createElement('SPAN'); - range.surroundContents(wrapper); - return wrapper; - }; - - if (startContainer === endContainer) { - throw 'Not implemented'; - } else { - // Not-so-trivial case - we need to break the range - // apart and create sub-ranges for each segment - - // Start by wrapping text segments in start and end nodes - const startRange = document.createRange(); - startRange.selectNodeContents(startContainer); - startRange.setStart(startContainer, startOffset); - const startNode = surround(startRange); - - const endRange = document.createRange(); - endRange.selectNode(endContainer); - endRange.setEnd(endContainer, endOffset); - const endNode = surround(endRange); - - // And wrap nodes in between, if any - const textNodesBetween = getTextNodesBetween(range); - - const innerNodes = textNodesBetween.reverse().map(node => { - const wrapper = document.createElement('SPAN'); - node.parentNode?.insertBefore(wrapper, node); - wrapper.appendChild(node); - return wrapper; - }); - - return { unwrap, nodes: [startNode, ...innerNodes, endNode] }; - } - -} - -/** - * Returns a list of all text nodes between the start - * and end node of the range. Start and end node themselves - * are NOT INCLUDED! - */ -const getTextNodesBetween = (range: Range): Node[] => { - const { - commonAncestorContainer, - startContainer, - endContainer - } = range; - - const ni = document.createNodeIterator(commonAncestorContainer, NodeFilter.SHOW_TEXT); - - let n = ni.nextNode(); - - let take = false; - - const nodesBetween: Node[] = []; - - while (n != null) { - if (n === endContainer) - take = false; - - if (take) - nodesBetween.push(n); - - if (n === startContainer) - take = true; - - n = ni.nextNode() - } - - return nodesBetween; -} - -export const getClientRectsPonyfill = (range: Range) => { - const { startContainer, endContainer } = range; - - if (startContainer === endContainer) { - return Array.from(range.getClientRects()); - } else { - const { unwrap, nodes } = wrapRange(range); - - const rects = nodes.reduce((rects, node) => { - return [...rects, ...node.getClientRects()]; - }, [] as DOMRect[]); - - unwrap(); - - return rects; - } -} \ No newline at end of file diff --git a/packages/text-annotator/src/utils/index.ts b/packages/text-annotator/src/utils/index.ts index 3b7b0005..9a638ac5 100644 --- a/packages/text-annotator/src/utils/index.ts +++ b/packages/text-annotator/src/utils/index.ts @@ -1,7 +1,6 @@ export * from './cancelSingleClickEvents'; export * from './debounce'; export * from './getAnnotatableFragment'; -export * from './getClientRectsPonyfill'; export * from './getQuoteContext'; export * from './isWhitespaceOrEmpty'; export * from './isRevived'; From d2c10509814bab2c6fca58e696994bba5642892d Mon Sep 17 00:00:00 2001 From: Rainer Simon Date: Tue, 3 Sep 2024 07:32:01 +0200 Subject: [PATCH 3/7] Highlight sorting: created timestamps are optional --- packages/text-annotator/src/highlight/span/spansRenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/text-annotator/src/highlight/span/spansRenderer.ts b/packages/text-annotator/src/highlight/span/spansRenderer.ts index c2bb868e..5ce6a83c 100644 --- a/packages/text-annotator/src/highlight/span/spansRenderer.ts +++ b/packages/text-annotator/src/highlight/span/spansRenderer.ts @@ -66,7 +66,7 @@ const createRenderer = (container: HTMLElement): RendererImplementation => { const highlightsByCreation = [...highlights].sort((highlightA, highlightB) => { const { annotation: { target: { created: createdA } } } = highlightA; const { annotation: { target: { created: createdB } } } = highlightB; - return createdA.getTime() - createdB.getTime(); + return createdA && createdB ? createdA.getTime() - createdB.getTime() : 0; }); highlightsByCreation.forEach(highlight => { From a0b351879eef394bdd01debc30b6565a4b9a5c01 Mon Sep 17 00:00:00 2001 From: Rainer Simon Date: Tue, 3 Sep 2024 07:40:24 +0200 Subject: [PATCH 4/7] Temporarily disabled sorting --- .../src/highlight/span/spansRenderer.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/text-annotator/src/highlight/span/spansRenderer.ts b/packages/text-annotator/src/highlight/span/spansRenderer.ts index 5ce6a83c..4bfaff2c 100644 --- a/packages/text-annotator/src/highlight/span/spansRenderer.ts +++ b/packages/text-annotator/src/highlight/span/spansRenderer.ts @@ -63,13 +63,22 @@ const createRenderer = (container: HTMLElement): RendererImplementation => { * By default, we should expect that the newer highlight * will be rendered over the older one */ + + /** + * Note that I need to disable temporarily. Turns out annotation loading WITHOUT + * an adapter does not yet revive dates, causing this to fail. Needs to be + * fixed directly in the Annotorious Annotator. + * const highlightsByCreation = [...highlights].sort((highlightA, highlightB) => { const { annotation: { target: { created: createdA } } } = highlightA; const { annotation: { target: { created: createdB } } } = highlightB; + console.log(highlightA.annotation); + console.log(highlightB.annotation); return createdA && createdB ? createdA.getTime() - createdB.getTime() : 0; }); + */ - highlightsByCreation.forEach(highlight => { + [...highlights]/*highlightsByCreation*/.forEach(highlight => { highlight.rects.map(rect => { const zIndex = computeZIndex(rect, highlights); const style = paint(highlight, viewportBounds, currentStyle, painter, zIndex); From 15186ec1841df071d4153c715ff8193341900600 Mon Sep 17 00:00:00 2001 From: Rainer Simon Date: Tue, 3 Sep 2024 11:05:07 +0200 Subject: [PATCH 5/7] TS tweaks --- .../text-annotator-react/src/TextAnnotator.tsx | 2 +- packages/text-annotator/src/TextAnnotator.ts | 4 ++-- .../text-annotator/src/TextAnnotatorOptions.ts | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/text-annotator-react/src/TextAnnotator.tsx b/packages/text-annotator-react/src/TextAnnotator.tsx index 332a61b9..aa00e4e6 100644 --- a/packages/text-annotator-react/src/TextAnnotator.tsx +++ b/packages/text-annotator-react/src/TextAnnotator.tsx @@ -7,7 +7,7 @@ import { createTextAnnotator } from '@recogito/text-annotator'; import '@recogito/text-annotator/dist/text-annotator.css'; -export interface TextAnnotatorProps extends Omit, 'adapter'> { +export interface TextAnnotatorProps extends Omit, 'adapter'> { children?: ReactNode | JSX.Element; diff --git a/packages/text-annotator/src/TextAnnotator.ts b/packages/text-annotator/src/TextAnnotator.ts index a918080c..21805a73 100644 --- a/packages/text-annotator/src/TextAnnotator.ts +++ b/packages/text-annotator/src/TextAnnotator.ts @@ -28,12 +28,12 @@ export interface TextAnnotator extends Annot export const createTextAnnotator = ( container: HTMLElement, - options: TextAnnotatorOptions = {} + options: TextAnnotatorOptions = {} ): TextAnnotator => { // Prevent mobile browsers from triggering word selection on single click. cancelSingleClickEvents(container); - const opts = fillDefaults(options, { + const opts = fillDefaults(options, { annotatingEnabled: true, user: createAnonymousGuest() }); diff --git a/packages/text-annotator/src/TextAnnotatorOptions.ts b/packages/text-annotator/src/TextAnnotatorOptions.ts index bc9c7138..6e80a9f2 100644 --- a/packages/text-annotator/src/TextAnnotatorOptions.ts +++ b/packages/text-annotator/src/TextAnnotatorOptions.ts @@ -1,11 +1,11 @@ -import type { FormatAdapter, UserSelectActionExpression, User } from '@annotorious/core'; +import type { FormatAdapter, UserSelectActionExpression, User, Annotation } from '@annotorious/core'; import type { PresencePainterOptions } from './presence'; import type { TextAnnotation } from './model'; import type { HighlightStyleExpression } from './highlight'; -export interface TextAnnotatorOptions { +export interface TextAnnotatorOptions { - adapter?: FormatAdapter | null; + adapter?: FormatAdapter | null; annotatingEnabled?: boolean; @@ -25,10 +25,10 @@ export interface TextAnnotatorOptions { export type RendererType = 'SPANS' | 'CANVAS' | 'CSS_HIGHLIGHTS'; -export const fillDefaults = ( - opts: TextAnnotatorOptions, - defaults: TextAnnotatorOptions -): TextAnnotatorOptions => { +export const fillDefaults = ( + opts: TextAnnotatorOptions, + defaults: TextAnnotatorOptions +): TextAnnotatorOptions => { return { ...opts, From 876612f9089b0fdded5cab0624ead266e4c143db Mon Sep 17 00:00:00 2001 From: Rainer Simon Date: Tue, 3 Sep 2024 11:25:13 +0200 Subject: [PATCH 6/7] TS tweak --- packages/text-annotator/src/TextAnnotator.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/text-annotator/src/TextAnnotator.ts b/packages/text-annotator/src/TextAnnotator.ts index 21805a73..5e86b82d 100644 --- a/packages/text-annotator/src/TextAnnotator.ts +++ b/packages/text-annotator/src/TextAnnotator.ts @@ -13,14 +13,14 @@ import './TextAnnotator.css'; const USE_DEFAULT_RENDERER: RendererType = 'SPANS'; -export interface TextAnnotator extends Annotator { +export interface TextAnnotator extends Annotator { element: HTMLElement; setStyle(style: HighlightStyleExpression | undefined): void; // Returns true if successful (or false if the annotation is not currently rendered) - scrollIntoView(annotation: TextAnnotation): boolean; + scrollIntoView(annotation: I): boolean; state: TextAnnotatorState; @@ -29,7 +29,7 @@ export interface TextAnnotator extends Annot export const createTextAnnotator = ( container: HTMLElement, options: TextAnnotatorOptions = {} -): TextAnnotator => { +): TextAnnotator => { // Prevent mobile browsers from triggering word selection on single click. cancelSingleClickEvents(container); From f9700eda4ff40e9b77ca56fd2ce4787b29f1cbf6 Mon Sep 17 00:00:00 2001 From: Rainer Simon Date: Tue, 3 Sep 2024 12:09:01 +0200 Subject: [PATCH 7/7] Dependency updates --- package-lock.json | 62 +++++++++++----------- packages/extension-tei/package.json | 2 +- packages/text-annotator-react/package.json | 4 +- packages/text-annotator/package.json | 2 +- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 383ffa5b..32b09b26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,20 +29,20 @@ } }, "node_modules/@annotorious/annotorious": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@annotorious/annotorious/-/annotorious-3.0.2.tgz", - "integrity": "sha512-kzKEciBg5IMo37NJBF0xvhLATe2r+Ax5RMbt3t+ovNTQQxs3Miuvapk19Bo44JyouCon/9xH/dKMBCa4JeiStA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@annotorious/annotorious/-/annotorious-3.0.3.tgz", + "integrity": "sha512-jp0LLQxrBLRYVzrc9V4eTCjuDIF9WnwMJDkKUEthQAqsd8K1i3iXVfqxPQNH6uIay4cNenMAS8DhArKVXqkGyA==", "license": "BSD-3-Clause", "dependencies": { - "@annotorious/core": "3.0.2", + "@annotorious/core": "3.0.3", "rbush": "^4.0.1", "uuid": "^10.0.0" } }, "node_modules/@annotorious/core": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@annotorious/core/-/core-3.0.2.tgz", - "integrity": "sha512-jNat3SpPiJPa4Nb+CyyWiCLODzhWH08lzGGwK38eF/cvkRhsSahRGmHbFNNnr4LR/pBIteFbED98X3JOxEll4A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@annotorious/core/-/core-3.0.3.tgz", + "integrity": "sha512-D1mvTtlnmSco17X3PTZ92xKC9baxbcT9WDbtXIOotcFvTPq2Hpib36Jwz/DLXbVbCG6I3LScqtNcx/3JOElPhg==", "license": "BSD-3-Clause", "dependencies": { "dequal": "^2.0.3", @@ -52,13 +52,13 @@ } }, "node_modules/@annotorious/openseadragon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@annotorious/openseadragon/-/openseadragon-3.0.2.tgz", - "integrity": "sha512-o+1ph5XK8r2VwJeeDhTjQY9zvRtvmTGZwfaggohefaVwWhaNAv3iZQGZjM9minV/eXeMQbVzkxJX0P+0D1t0og==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@annotorious/openseadragon/-/openseadragon-3.0.3.tgz", + "integrity": "sha512-B2pG/jj1aVOIo51jU9GJEUQEzBYB/YtIYJuwoe0m1KrXKtbx0VfeixHiY6YXrQpRLG3iwfT1ztTVEgpOsLMtLw==", "license": "BSD-3-Clause", "dependencies": { - "@annotorious/annotorious": "3.0.2", - "@annotorious/core": "3.0.2", + "@annotorious/annotorious": "3.0.3", + "@annotorious/core": "3.0.3", "pixi.js": "^7.4.2", "uuid": "^10.0.0" }, @@ -67,14 +67,14 @@ } }, "node_modules/@annotorious/react": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@annotorious/react/-/react-3.0.2.tgz", - "integrity": "sha512-uPMqH0n91tHLIsua0UBIAaIN65apvzXJO2fhLAoVZ45doMOHe0nAeDj5FD4hee1hUAo5CefJ7XnDVLuKlPD8fw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@annotorious/react/-/react-3.0.3.tgz", + "integrity": "sha512-ijPbtW5FcFWMeVxCVcwoMuXuxMaCGnzjsrwYx4Xe/mnlNw5wWzfXAFIv4GK9IZUi+YKdmIsZ9yHmyUGUVwtabA==", "license": "BSD-3-Clause", "dependencies": { - "@annotorious/annotorious": "3.0.2", - "@annotorious/core": "3.0.2", - "@annotorious/openseadragon": "3.0.2", + "@annotorious/annotorious": "3.0.3", + "@annotorious/core": "3.0.3", + "@annotorious/openseadragon": "3.0.3", "@floating-ui/react": "^0.26.23" }, "peerDependencies": { @@ -3557,9 +3557,9 @@ } }, "node_modules/openseadragon": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/openseadragon/-/openseadragon-4.1.1.tgz", - "integrity": "sha512-owU9gsasAcobLN+LM8lN58Xc2VDSDotY9mkrwS/NB6g9KX/PcusV4RZvhHng2RF/Q0pMziwldf62glwXoGnuzg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/openseadragon/-/openseadragon-5.0.0.tgz", + "integrity": "sha512-S9aabSjmJg7Jfow1UItR5aXiKQLtkDWyRR5fxLeqT4vSYMvfscXUDfVS9snUN3JuIrHaSPJAlR4H2DYSn5DWRg==", "license": "BSD-3-Clause", "peer": true, "funding": { @@ -3633,9 +3633,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true, "license": "ISC" }, @@ -3707,9 +3707,9 @@ } }, "node_modules/postcss": { - "version": "8.4.43", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.43.tgz", - "integrity": "sha512-gJAQVYbh5R3gYm33FijzCZj7CHyQ3hWMgJMprLUlIYqCwTeZhBQ19wp0e9mA25BUbEvY5+EXuuaAjqQsrBxQBQ==", + "version": "8.4.44", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", + "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", "dev": true, "funding": [ { @@ -4786,7 +4786,7 @@ "vite-plugin-dts": "^4.1.0" }, "peerDependencies": { - "@annotorious/core": "^3.0.2", + "@annotorious/core": "^3.0.3", "@recogito/text-annotator": "3.0.0-rc.44" } }, @@ -4795,7 +4795,7 @@ "version": "3.0.0-rc.44", "license": "BSD-3-Clause", "dependencies": { - "@annotorious/core": "^3.0.2", + "@annotorious/core": "^3.0.3", "colord": "^2.9.3", "dequal": "^2.0.3", "rbush": "^4.0.1", @@ -4818,8 +4818,8 @@ "version": "3.0.0-rc.44", "license": "BSD-3-Clause", "dependencies": { - "@annotorious/core": "^3.0.2", - "@annotorious/react": "^3.0.2", + "@annotorious/core": "^3.0.3", + "@annotorious/react": "^3.0.3", "@floating-ui/react": "^0.26.23", "@recogito/text-annotator": "3.0.0-rc.44", "@recogito/text-annotator-tei": "3.0.0-rc.44", diff --git a/packages/extension-tei/package.json b/packages/extension-tei/package.json index 8a266a47..02c979f8 100644 --- a/packages/extension-tei/package.json +++ b/packages/extension-tei/package.json @@ -32,7 +32,7 @@ "vite-plugin-dts": "^4.1.0" }, "peerDependencies": { - "@annotorious/core": "^3.0.2", + "@annotorious/core": "^3.0.3", "@recogito/text-annotator": "3.0.0-rc.44" } } \ No newline at end of file diff --git a/packages/text-annotator-react/package.json b/packages/text-annotator-react/package.json index 0312a715..3c27fb19 100644 --- a/packages/text-annotator-react/package.json +++ b/packages/text-annotator-react/package.json @@ -44,8 +44,8 @@ } }, "dependencies": { - "@annotorious/core": "^3.0.2", - "@annotorious/react": "^3.0.2", + "@annotorious/core": "^3.0.3", + "@annotorious/react": "^3.0.3", "@floating-ui/react": "^0.26.23", "@recogito/text-annotator": "3.0.0-rc.44", "@recogito/text-annotator-tei": "3.0.0-rc.44", diff --git a/packages/text-annotator/package.json b/packages/text-annotator/package.json index 7e9d17dc..b2591081 100644 --- a/packages/text-annotator/package.json +++ b/packages/text-annotator/package.json @@ -37,7 +37,7 @@ "vitest": "^2.0.5" }, "dependencies": { - "@annotorious/core": "^3.0.2", + "@annotorious/core": "^3.0.3", "colord": "^2.9.3", "dequal": "^2.0.3", "rbush": "^4.0.1",