@recogito/text-annotator 3.0.0-rc.7 → 3.0.0-rc.8
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-annotator.umd.js","sources":["../src/highlight/HighlightPainter.ts","../src/highlight/trackViewport.ts","../src/highlight/highlightLayer.ts","../src/state/reviveTarget.ts","../../../node_modules/@annotorious/core/dist/annotorious-core.es.js","../../../node_modules/quickselect/index.js","../../../node_modules/rbush/index.js","../src/utils/mergeClientRects.ts","../src/utils/trimRange.ts","../src/state/spatialTree.ts","../src/state/TextAnnotatorState.ts","../src/presence/PresencePainter.ts","../src/api/scrollIntoView.ts","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../src/SelectionHandler.ts","../src/TextAnnotator.ts"],"sourcesContent":["import type { DrawingStyle } from '@annotorious/core';\nimport type { TextAnnotation } from '../model';\nimport type { Rect } from '../state';\n\nconst DEFAULT_STYLE = { fill: 'rgb(0, 128, 255', fillOpacity: 0.18 };\n\nconst DEFAULT_SELECTED_STYLE = { fill: 'rgb(0, 128, 255)', fillOpacity: 0.45 };\n\n/** \n * A painter implements the actual CANVAS highlight drawing logic.\n */\nexport type HighlightPainter = { \n \n paint( \n annotation: TextAnnotation,\n rects: Rect[], \n bg: CanvasRenderingContext2D,\n fg: CanvasRenderingContext2D,\n isSelected?: boolean,\n style?: DrawingStyle | ((annotation: TextAnnotation, selected?: boolean) => DrawingStyle)\n ): void;\n\n}\n\n/**\n * The default painter.\n */\nexport const defaultPainter: HighlightPainter = {\n\n paint: (annotation, rects, bg, fg, isSelected, drawingStyle) => {\n const style: HighlightStyle = drawingStyle ? \n typeof drawingStyle === 'function' ? drawingStyle(annotation, isSelected) : drawingStyle :\n isSelected ? DEFAULT_SELECTED_STYLE : \n DEFAULT_STYLE;\n\n bg.fillStyle = style.fill;\n bg.globalAlpha = style.fillOpacity || 1;\n \n rects.forEach(({ x, y, width, height }) => bg.fillRect(x, y - 2.5, width, height + 5));\n }\n\n}\n\nexport interface HighlightStyle {\n\n fill?: string;\n\n fillOpacity?: number;\n\n underline?: string;\n\n underlineOpacity?: number;\n\n underlineWidth?: number;\n\n}","import type { ViewportState } from '@annotorious/core';\nimport type { TextAnnotation } from '../model';\n\nexport const trackViewport = (viewport: ViewportState) => {\n let visible = new Set<string>();\n\n const onDraw = (annotations: TextAnnotation[]) => {\n const ids = annotations.map(a => a.id);\n\n if (visible.size !== ids.length || ids.some(id => !visible.has(id))) {\n viewport.set(ids);\n } \n\n visible = new Set(ids);\n }\n\n return onDraw;\n\n}","import type { DrawingStyle, Filter, ViewportState } from '@annotorious/core';\nimport type { TextAnnotation } from '../model';\nimport type { TextAnnotatorState } from '../state';\nimport { defaultPainter, type HighlightPainter } from './HighlightPainter';\nimport { trackViewport } from './trackViewport';\n\nimport './highlightLayer.css';\n\nconst debounce = <T extends (...args: any[]) => void>(func: T, delay: number = 10): T => {\n let timeoutId: number;\n\n return ((...args: any[]) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(this, args), delay);\n }) as T;\n}\n\nconst createCanvas = (className: string, highres?: boolean) => {\n const canvas = document.createElement('canvas');\n canvas.width = highres ? 2 * window.innerWidth : window.innerWidth;\n canvas.height = highres ? 2 * window.innerHeight : window.innerHeight;\n canvas.className = className;\n\n if (highres) {\n const context = canvas.getContext('2d');\n context.scale(2, 2);\n context.translate(0.5, 0.5);\n }\n\n return canvas;\n}\n\nconst resetCanvas = (canvas: HTMLCanvasElement, highres?: boolean) => {\n canvas.width = highres ? 2 * window.innerWidth : window.innerWidth;\n canvas.height = highres ? 2 * window.innerHeight : window.innerHeight;\n\n if (highres) {\n // Note that resizing the canvas resets the context\n const context = canvas.getContext('2d');\n context.scale(2, 2);\n context.translate(0.5, 0.5);\n }\n}\n\nexport const createHighlightLayer = (\n container: HTMLElement, \n state: TextAnnotatorState,\n viewport: ViewportState\n) => {\n\n const { store, selection, hover } = state;\n \n let currentStyle: DrawingStyle | ((annotation: TextAnnotation, selected?: boolean) => DrawingStyle) | undefined;\n\n let currentFilter: Filter | undefined;\n\n let currentPainter: HighlightPainter = defaultPainter;\n\n const onDraw = trackViewport(viewport);\n\n container.classList.add('r6o-annotatable');\n\n const bgCanvas = createCanvas('r6o-highlight-layer bg');\n const fgCanvas = createCanvas('r6o-highlight-layer fg', true);\n\n const bgContext = bgCanvas.getContext('2d');\n const fgContext = fgCanvas.getContext('2d');\n\n container.insertBefore(bgCanvas, container.firstChild);\n container.appendChild(fgCanvas);\n\n container.addEventListener('pointermove', (event: PointerEvent) => {\n const {x, y} = container.getBoundingClientRect();\n\n const hit = store.getAt(event.clientX - x, event.clientY - y);\n const isVisibleHit = hit && (!currentFilter || currentFilter(hit));\n\n if (isVisibleHit) {\n if (hover.current !== hit.id) {\n container.classList.add('hovered');\n hover.set(hit.id);\n }\n } else {\n if (hover.current) {\n container.classList.remove('hovered');\n hover.set(null);\n }\n }\n });\n\n const getViewport = () => {\n const { top, left } = container.getBoundingClientRect();\n\n const { innerWidth, innerHeight } = window;\n\n const minX = - left;\n const minY = - top;\n const maxX = innerWidth - left;\n const maxY = innerHeight - top;\n\n return { top, left, minX, minY, maxX, maxY };\n }\n\n const onScroll = () => redraw();\n\n document.addEventListener('scroll', onScroll, { capture: true, passive: true });\n\n const onResize = debounce(() => {\n resetCanvas(bgCanvas);\n resetCanvas(fgCanvas, true);\n\n store.recalculatePositions();\n\n redraw();\n });\n\n // Note that in cases where the element resized due to a \n // window resize, onResize will be triggered twice. This is\n // probably not a huge issue. But definitely an area for\n // future optimization. In terms of how to do this: there's \n // probably no ideal solution, but one straightforward way\n // would be to just set a flag in \n window.addEventListener('resize', onResize);\n\n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(container);\n\n const redraw = () => requestAnimationFrame(() => {\n const { top, left, minX, minY, maxX, maxY } = getViewport(); \n \n const annotationsInView = currentFilter\n ? store.getIntersectingRects(minX, minY, maxX, maxY).filter(({ annotation }) => currentFilter(annotation))\n : store.getIntersectingRects(minX, minY, maxX, maxY);\n\n const { width, height } = fgCanvas;\n\n // Get current selection\n const selectedIds = new Set(selection.selected.map(({ id }) => id));\n\n // New render loop - clear canvases\n fgContext.clearRect(-0.5, -0.5, width + 1, height + 1);\n bgContext.clearRect(-0.5, -0.5, width + 1, height + 1);\n \n annotationsInView.forEach(({ annotation, rects }) => {\n // Offset annotation rects by current scroll position\n const offsetRects = rects.map(({ x, y, width, height }) => ({ \n x: x + left, \n y: y + top, \n width, \n height \n }));\n\n const isSelected = selectedIds.has(annotation.id);\n currentPainter.paint(annotation, offsetRects, bgContext, fgContext, isSelected, currentStyle);\n });\n\n setTimeout(() => onDraw(annotationsInView.map(({ annotation }) => annotation)), 1);\n });\n\n store.observe(() => redraw());\n\n // Selection should only ever affect visible annotations,\n // need need for extra check\n selection.subscribe(() => redraw());\n\n const setDrawingStyle = (style: DrawingStyle | ((a: TextAnnotation, selected?: boolean) => DrawingStyle)) => {\n currentStyle = style;\n redraw();\n }\n\n const setFilter = (filter?: Filter) => {\n currentFilter = filter;\n redraw();\n } \n\n return {\n redraw,\n setDrawingStyle,\n setFilter,\n setPainter: (painter: HighlightPainter) => currentPainter = painter\n }\n\n}","import type { TextAnnotationTarget } from '../model';\n\n/**\n * Recalculates the DOM range from the given text annotation target.\n * \n * @param annotation the text annotation\n * @param container the HTML container of the annotated content\n * @returns the DOM range\n */\nexport const reviveTarget = (\n target: TextAnnotationTarget, \n container: HTMLElement\n): TextAnnotationTarget => { \n const { start, end } = target.selector;\n\n const offsetReference = target.selector.offsetReference ? target.selector.offsetReference : container;\n if (!offsetReference)\n return target;\n\n const iterator = document.createNodeIterator(container, NodeFilter.SHOW_TEXT);\n\n let runningOffset = 0;\n\n let range = document.createRange();\n\n let n = iterator.nextNode();\n if (n === null)\n console.error('Could not revive annotation target. Content missing.');\n\n // If there's no offset reference, start immediately\n let startCounting = !offsetReference;\n while (n !== null) {\n const len = n.textContent.length;\n\n if (!startCounting && offsetReference)\n startCounting = offsetReference.contains(n);\n\n if (startCounting) {\n if (runningOffset + len > start) {\n range.setStart(n, start - runningOffset);\n break;\n }\n \n runningOffset += len; \n }\n\n n = iterator.nextNode();\n }\n\n // set range end\n while (n !== null) {\n const len = n.textContent.length;\n\n if (runningOffset + len > end) {\n range.setEnd(n, end - runningOffset);\n break;\n }\n\n runningOffset += len;\n\n n = iterator.nextNode();\n }\n\n return {\n ...target,\n selector: { \n ...target.selector,\n range\n }\n }\n}\n","var Y = Object.prototype.hasOwnProperty;\nfunction x(e, n) {\n var t, o;\n if (e === n)\n return !0;\n if (e && n && (t = e.constructor) === n.constructor) {\n if (t === Date)\n return e.getTime() === n.getTime();\n if (t === RegExp)\n return e.toString() === n.toString();\n if (t === Array) {\n if ((o = e.length) === n.length)\n for (; o-- && x(e[o], n[o]); )\n ;\n return o === -1;\n }\n if (!t || typeof e == \"object\") {\n o = 0;\n for (t in e)\n if (Y.call(e, t) && ++o && !Y.call(n, t) || !(t in n) || !x(e[t], n[t]))\n return !1;\n return Object.keys(n).length === o;\n }\n }\n return e !== e && n !== n;\n}\nfunction $() {\n}\nfunction W(e, n) {\n return e != e ? n == n : e !== n || e && typeof e == \"object\" || typeof e == \"function\";\n}\nconst k = [];\nfunction _(e, n = $) {\n let t;\n const o = /* @__PURE__ */ new Set();\n function i(b) {\n if (W(e, b) && (e = b, t)) {\n const w = !k.length;\n for (const u of o)\n u[1](), k.push(u, e);\n if (w) {\n for (let u = 0; u < k.length; u += 2)\n k[u][0](k[u + 1]);\n k.length = 0;\n }\n }\n }\n function p(b) {\n i(b(e));\n }\n function U(b, w = $) {\n const u = [b, w];\n return o.add(u), o.size === 1 && (t = n(i, p) || $), b(e), () => {\n o.delete(u), o.size === 0 && t && (t(), t = null);\n };\n }\n return { set: i, update: p, subscribe: U };\n}\nconst be = (e) => {\n const { subscribe: n, set: t } = _();\n let o;\n return n((i) => o = i), e.observe(({ changes: i }) => {\n if (o) {\n (i.deleted || []).some((b) => b.id === o) && t(void 0);\n const U = (i.updated || []).find(({ oldValue: b }) => b.id === o);\n U && t(U.newValue.id);\n }\n }), {\n get current() {\n return o;\n },\n subscribe: n,\n set: t\n };\n};\nvar q = /* @__PURE__ */ ((e) => (e.EDIT = \"EDIT\", e.SELECT = \"SELECT\", e.NONE = \"NONE\", e))(q || {});\nconst V = { selected: [] }, ve = (e, n = \"EDIT\") => {\n const { subscribe: t, set: o } = _(V);\n let i = V;\n t((s) => i = s);\n const p = () => o(V), U = () => {\n var s;\n return ((s = i.selected) == null ? void 0 : s.length) === 0;\n }, b = (s) => {\n if (i.selected.length === 0)\n return !1;\n const g = typeof s == \"string\" ? s : s.id;\n return i.selected.some((y) => y.id === g);\n }, w = (s, g) => {\n const y = e.getAnnotation(s);\n if (y) {\n const A = G(y, n);\n o(A === \"EDIT\" ? { selected: [{ id: s, editable: !0 }], pointerEvent: g } : A === \"SELECT\" ? { selected: [{ id: s }], pointerEvent: g } : { selected: [], pointerEvent: g });\n } else\n console.warn(\"Invalid selection: \" + s);\n }, u = (s, g = !0) => {\n const y = Array.isArray(s) ? s : [s], A = y.map((O) => e.getAnnotation(O)).filter(Boolean);\n o({ selected: A.map(({ id: O }) => ({ id: O, editable: g })) }), A.length !== y.length && console.warn(\"Invalid selection\", s);\n }, S = (s) => {\n if (i.selected.length === 0)\n return !1;\n const { selected: g } = i;\n g.filter(({ id: A }) => s.includes(A)).length > 0 && o({ selected: g.filter(({ id: A }) => !s.includes(A)) });\n };\n return e.observe(({ changes: s }) => S((s.deleted || []).map((g) => g.id))), {\n clear: p,\n clickSelect: w,\n get selected() {\n return i ? [...i.selected] : null;\n },\n get pointerEvent() {\n return i ? i.pointerEvent : null;\n },\n isEmpty: U,\n isSelected: b,\n setSelected: u,\n subscribe: t\n };\n}, G = (e, n) => typeof n == \"function\" ? n(e) || \"EDIT\" : n || \"EDIT\";\nlet z;\nconst H = new Uint8Array(16);\nfunction F() {\n if (!z && (z = typeof crypto < \"u\" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !z))\n throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");\n return z(H);\n}\nconst R = [];\nfor (let e = 0; e < 256; ++e)\n R.push((e + 256).toString(16).slice(1));\nfunction J(e, n = 0) {\n return R[e[n + 0]] + R[e[n + 1]] + R[e[n + 2]] + R[e[n + 3]] + \"-\" + R[e[n + 4]] + R[e[n + 5]] + \"-\" + R[e[n + 6]] + R[e[n + 7]] + \"-\" + R[e[n + 8]] + R[e[n + 9]] + \"-\" + R[e[n + 10]] + R[e[n + 11]] + R[e[n + 12]] + R[e[n + 13]] + R[e[n + 14]] + R[e[n + 15]];\n}\nconst Q = typeof crypto < \"u\" && crypto.randomUUID && crypto.randomUUID.bind(crypto), j = {\n randomUUID: Q\n};\nfunction X(e, n, t) {\n if (j.randomUUID && !n && !e)\n return j.randomUUID();\n e = e || {};\n const o = e.random || (e.rng || F)();\n if (o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, n) {\n t = t || 0;\n for (let i = 0; i < 16; ++i)\n n[t + i] = o[i];\n return n;\n }\n return J(o);\n}\nconst Ce = (e) => {\n const { creator: n, updatedBy: t } = e.target, o = e.bodies.reduce((i, p) => [...i, p.creator, p.updatedBy].filter(Boolean), []);\n return [\n n,\n t,\n ...o\n ].filter((i) => i);\n}, we = (e, n, t, o) => ({\n id: X(),\n annotation: e.id,\n created: t || /* @__PURE__ */ new Date(),\n creator: o,\n ...n\n}), Z = (e, n) => {\n const t = new Set(e.bodies.map((o) => o.id));\n return n.bodies.filter((o) => !t.has(o.id));\n}, K = (e, n) => {\n const t = new Set(n.bodies.map((o) => o.id));\n return e.bodies.filter((o) => !t.has(o.id));\n}, ee = (e, n) => n.bodies.map((t) => {\n const o = e.bodies.find((i) => i.id === t.id);\n return { newBody: t, oldBody: o && !x(o, t) ? o : void 0 };\n}).filter(({ oldBody: t }) => t).map(({ oldBody: t, newBody: o }) => ({ oldBody: t, newBody: o })), te = (e, n) => !x(e.target, n.target), M = (e, n) => {\n const t = Z(e, n), o = K(e, n), i = ee(e, n);\n return {\n oldValue: e,\n newValue: n,\n bodiesCreated: t.length > 0 ? t : void 0,\n bodiesDeleted: o.length > 0 ? o : void 0,\n bodiesUpdated: i.length > 0 ? i : void 0,\n targetUpdated: te(e, n) ? { oldTarget: e.target, newTarget: n.target } : void 0\n };\n};\nvar ne = /* @__PURE__ */ ((e) => (e.BODY_ONLY = \"BODY_ONLY\", e.TARGET_ONLY = \"TARGET_ONLY\", e))(ne || {}), T = /* @__PURE__ */ ((e) => (e.LOCAL = \"LOCAL\", e.REMOTE = \"REMOTE\", e))(T || {});\nconst oe = (e, n) => {\n var p, U;\n const { changes: t, origin: o } = n;\n if (!(!e.options.origin || e.options.origin === o))\n return !1;\n if (e.options.ignore) {\n const { ignore: b } = e.options, w = (S) => S && S.length > 0;\n if (!(w(t.created) || w(t.deleted))) {\n const S = (p = t.updated) == null ? void 0 : p.some((g) => w(g.bodiesCreated) || w(g.bodiesDeleted) || w(g.bodiesUpdated)), s = (U = t.updated) == null ? void 0 : U.some((g) => g.targetUpdated);\n if (b === \"BODY_ONLY\" && S && !s || b === \"TARGET_ONLY\" && s && !S)\n return !1;\n }\n }\n if (e.options.annotations) {\n const b = /* @__PURE__ */ new Set([\n ...(t.created || []).map((u) => u.id),\n ...(t.deleted || []).map((u) => u.id),\n ...(t.updated || []).map(({ oldValue: u }) => u.id)\n ]);\n return !!(Array.isArray(e.options.annotations) ? e.options.annotations : [e.options.annotations]).find((u) => b.has(u));\n } else\n return !0;\n}, se = (e, n) => {\n const t = new Set((e.created || []).map((s) => s.id)), o = new Set((e.updated || []).map(({ newValue: s }) => s.id)), i = new Set((n.created || []).map((s) => s.id)), p = new Set((n.deleted || []).map((s) => s.id)), U = new Set((n.updated || []).map(({ oldValue: s }) => s.id)), b = new Set((n.updated || []).filter(({ oldValue: s }) => t.has(s.id) || o.has(s.id)).map(({ oldValue: s }) => s.id)), w = [\n ...(e.created || []).filter((s) => !p.has(s.id)).map((s) => U.has(s.id) ? n.updated.find(({ oldValue: g }) => g.id === s.id).newValue : s),\n ...n.created || []\n ], u = [\n ...(e.deleted || []).filter((s) => !i.has(s.id)),\n ...(n.deleted || []).filter((s) => !t.has(s.id))\n ], S = [\n ...(e.updated || []).filter(({ newValue: s }) => !p.has(s.id)).map((s) => {\n const { oldValue: g, newValue: y } = s;\n if (U.has(y.id)) {\n const A = n.updated.find((O) => O.oldValue.id === y.id).newValue;\n return M(g, A);\n } else\n return s;\n }),\n ...(n.updated || []).filter(({ oldValue: s }) => !b.has(s.id))\n ];\n return { created: w, deleted: u, updated: S };\n}, ie = (e) => e.id !== void 0, ye = () => {\n const e = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), t = [], o = (d, l = {}) => t.push({ onChange: d, options: l }), i = (d) => {\n const l = t.findIndex((c) => c.onChange == d);\n l > -1 && t.splice(l, 1);\n }, p = (d, l) => {\n const c = {\n origin: d,\n changes: {\n created: l.created || [],\n updated: l.updated || [],\n deleted: l.deleted || []\n },\n state: [...e.values()]\n };\n t.forEach((f) => {\n oe(f, c) && f.onChange(c);\n });\n }, U = (d, l = T.LOCAL) => {\n if (e.get(d.id))\n throw Error(`Cannot add annotation ${d.id} - exists already`);\n e.set(d.id, d), d.bodies.forEach((f) => n.set(f.id, d.id)), p(l, { created: [d] });\n }, b = (d, l) => {\n const c = typeof d == \"string\" ? l : d, f = typeof d == \"string\" ? d : d.id, v = e.get(f);\n if (v) {\n const D = M(v, c);\n return f === c.id ? e.set(f, c) : (e.delete(f), e.set(c.id, c)), v.bodies.forEach((B) => n.delete(B.id)), c.bodies.forEach((B) => n.set(B.id, c.id)), D;\n } else\n console.warn(`Cannot update annotation ${f} - does not exist`);\n }, w = (d, l = T.LOCAL, c = T.LOCAL) => {\n const f = ie(l) ? c : l, v = b(d, l);\n v && p(f, { updated: [v] });\n }, u = (d, l = T.LOCAL) => {\n const c = d.reduce((f, v) => {\n const D = b(v);\n return D ? [...f, D] : f;\n }, []);\n c.length > 0 && p(l, { updated: c });\n }, S = (d, l = T.LOCAL) => {\n const c = e.get(d.annotation);\n if (c) {\n const f = {\n ...c,\n bodies: [...c.bodies, d]\n };\n e.set(c.id, f), n.set(d.id, f.id), p(l, { updated: [{\n oldValue: c,\n newValue: f,\n bodiesCreated: [d]\n }] });\n } else\n console.warn(`Attempt to add body to missing annotation: ${d.annotation}`);\n }, s = () => [...e.values()], g = (d = T.LOCAL) => {\n const l = [...e.values()];\n e.clear(), n.clear(), p(d, { deleted: l });\n }, y = (d, l = !0, c = T.LOCAL) => {\n if (l) {\n const f = [...e.values()];\n e.clear(), n.clear(), d.forEach((v) => {\n e.set(v.id, v), v.bodies.forEach((D) => n.set(D.id, v.id));\n }), p(c, { created: d, deleted: f });\n } else {\n const f = d.reduce((v, D) => {\n const B = e.get(D.id);\n return B ? [...v, B] : v;\n }, []);\n if (f.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${f.map((v) => v.id).join(\", \")}`);\n d.forEach((v) => {\n e.set(v.id, v), v.bodies.forEach((D) => n.set(D.id, v.id));\n }), p(c, { created: d });\n }\n }, A = (d) => {\n const l = typeof d == \"string\" ? d : d.id, c = e.get(l);\n if (c)\n return e.delete(l), c.bodies.forEach((f) => n.delete(f.id)), c;\n console.warn(`Attempt to delete missing annotation: ${l}`);\n }, O = (d, l = T.LOCAL) => {\n const c = A(d);\n c && p(l, { deleted: [c] });\n }, C = (d, l = T.LOCAL) => {\n const c = d.reduce((f, v) => {\n const D = A(v);\n return D ? [...f, D] : f;\n }, []);\n c.length > 0 && p(l, { deleted: c });\n }, a = (d, l = T.LOCAL) => {\n const c = e.get(d.annotation);\n if (c) {\n const f = c.bodies.find((v) => v.id === d.id);\n if (f) {\n n.delete(f.id);\n const v = {\n ...c,\n bodies: c.bodies.filter((B) => B.id !== d.id)\n };\n e.set(c.id, v), p(l, { updated: [{\n oldValue: c,\n newValue: v,\n bodiesDeleted: [f]\n }] });\n } else\n console.warn(`Attempt to delete missing body ${d.id} from annotation ${d.annotation}`);\n } else\n console.warn(`Attempt to delete body from missing annotation ${d.annotation}`);\n }, m = (d) => {\n const l = e.get(d);\n return l ? { ...l } : void 0;\n }, r = (d) => {\n const l = n.get(d);\n if (l) {\n const f = m(l).bodies.find((v) => v.id === d);\n if (f)\n return f;\n console.error(`Store integrity error: body ${d} in index, but not in annotation`);\n } else\n console.warn(`Attempt to retrieve missing body: ${d}`);\n }, E = (d, l) => {\n if (d.annotation !== l.annotation)\n throw \"Annotation integrity violation: annotation ID must be the same when updating bodies\";\n const c = e.get(d.annotation);\n if (c) {\n const f = c.bodies.find((D) => D.id === d.id), v = {\n ...c,\n bodies: c.bodies.map((D) => D.id === f.id ? l : D)\n };\n return e.set(c.id, v), f.id !== l.id && (n.delete(f.id), n.set(l.id, v.id)), {\n oldValue: c,\n newValue: v,\n bodiesUpdated: [{ oldBody: f, newBody: l }]\n };\n } else\n console.warn(`Attempt to add body to missing annotation ${d.annotation}`);\n }, h = (d, l, c = T.LOCAL) => {\n const f = E(d, l);\n f && p(c, { updated: [f] });\n }, L = (d, l = T.LOCAL) => {\n const c = d.map((f) => E({ id: f.id, annotation: f.annotation }, f)).filter(Boolean);\n p(l, { updated: c });\n }, I = (d) => {\n const l = e.get(d.annotation);\n if (l) {\n const c = {\n ...l,\n target: {\n ...l.target,\n ...d\n }\n };\n return e.set(l.id, c), {\n oldValue: l,\n newValue: c,\n targetUpdated: {\n oldTarget: l.target,\n newTarget: d\n }\n };\n } else\n console.warn(`Attempt to update target on missing annotation: ${d.annotation}`);\n };\n return {\n addAnnotation: U,\n addBody: S,\n all: s,\n bulkAddAnnotation: y,\n bulkDeleteAnnotation: C,\n bulkUpdateAnnotation: u,\n bulkUpdateBodies: L,\n bulkUpdateTargets: (d, l = T.LOCAL) => {\n const c = d.map((f) => I(f)).filter(Boolean);\n c.length > 0 && p(l, { updated: c });\n },\n clear: g,\n deleteAnnotation: O,\n deleteBody: a,\n getAnnotation: m,\n getBody: r,\n observe: o,\n unobserve: i,\n updateAnnotation: w,\n updateBody: h,\n updateTarget: (d, l = T.LOCAL) => {\n const c = I(d);\n c && p(l, { updated: [c] });\n }\n };\n}, Ue = (e) => ({\n ...e,\n subscribe: (t) => {\n const o = (i) => t(i.state);\n return e.observe(o), t(e.all()), () => e.unobserve(o);\n }\n});\nlet P = () => ({\n emit(e, ...n) {\n for (let t = 0, o = this.events[e] || [], i = o.length; t < i; t++)\n o[t](...n);\n },\n events: {},\n on(e, n) {\n var t;\n return ((t = this.events)[e] || (t[e] = [])).push(n), () => {\n var o;\n this.events[e] = (o = this.events[e]) == null ? void 0 : o.filter((i) => n !== i);\n };\n }\n});\nconst de = 250, Le = (e) => {\n const n = P(), t = [];\n let o = -1, i = !1, p = 0;\n const U = (r) => {\n if (!i) {\n const { changes: E } = r, h = performance.now();\n if (h - p > de)\n t.splice(o + 1), t.push(E), o = t.length - 1;\n else {\n const L = t.length - 1;\n t[L] = se(t[L], E);\n }\n p = h;\n }\n i = !1;\n };\n e.observe(U, { origin: T.LOCAL });\n const b = (r) => r && r.length > 0 && e.bulkDeleteAnnotation(r), w = (r) => r && r.length > 0 && e.bulkAddAnnotation(r, !1), u = (r) => r && r.length > 0 && e.bulkUpdateAnnotation(r.map(({ oldValue: E }) => E)), S = (r) => r && r.length > 0 && e.bulkUpdateAnnotation(r.map(({ newValue: E }) => E)), s = (r) => r && r.length > 0 && e.bulkAddAnnotation(r, !1), g = (r) => r && r.length > 0 && e.bulkDeleteAnnotation(r);\n return {\n canRedo: () => t.length - 1 > o,\n canUndo: () => o > -1,\n destroy: () => e.unobserve(U),\n on: (r, E) => n.on(r, E),\n redo: () => {\n if (t.length - 1 > o) {\n i = !0;\n const { created: r, updated: E, deleted: h } = t[o + 1];\n w(r), S(E), g(h), n.emit(\"redo\", t[o + 1]), o += 1;\n }\n },\n undo: () => {\n if (o > -1) {\n i = !0;\n const { created: r, updated: E, deleted: h } = t[o];\n b(r), u(E), s(h), n.emit(\"undo\", t[o]), o -= 1;\n }\n }\n };\n}, Se = () => {\n const { subscribe: e, set: n } = _([]);\n return {\n subscribe: e,\n set: n\n };\n}, Oe = (e, n, t, o) => {\n const { store: i, selection: p, hover: U, viewport: b } = e, w = /* @__PURE__ */ new Map();\n let u = [], S, s;\n const g = (a, m) => {\n w.has(a) ? w.get(a).push(m) : w.set(a, [m]);\n }, y = (a, m) => {\n const r = w.get(a);\n r && r.indexOf(m) > 0 && r.splice(r.indexOf(m), 1);\n }, A = (a, m, r) => {\n w.has(a) && setTimeout(() => {\n w.get(a).forEach((E) => {\n if (t) {\n const h = Array.isArray(m) ? m.map((I) => t.serialize(I)) : t.serialize(m), L = r ? r instanceof PointerEvent ? r : t.serialize(r) : void 0;\n E(h, L);\n } else\n E(m, r);\n });\n }, 1);\n }, O = () => {\n const { selected: a } = p, m = (a || []).map(({ id: r }) => i.getAnnotation(r));\n m.forEach((r) => {\n const E = u.find((h) => h.id === r.id);\n (!E || !x(E, r)) && A(\"updateAnnotation\", r, E);\n }), u = u.map((r) => {\n const E = m.find(({ id: h }) => h === r.id);\n return E || r;\n });\n };\n p.subscribe(({ selected: a }) => {\n if (!(u.length === 0 && a.length === 0)) {\n if (u.length === 0 && a.length > 0)\n u = a.map(({ id: m }) => i.getAnnotation(m));\n else if (u.length > 0 && a.length === 0)\n u.forEach((m) => {\n const r = i.getAnnotation(m.id);\n r && !x(r, m) && A(\"updateAnnotation\", r, m);\n }), u = [];\n else {\n const m = new Set(u.map((h) => h.id)), r = new Set(a.map(({ id: h }) => h));\n u.filter((h) => !r.has(h.id)).forEach((h) => {\n const L = i.getAnnotation(h.id);\n L && !x(L, h) && A(\"updateAnnotation\", L, h);\n }), u = [\n // Remove annotations that were deselected\n ...u.filter((h) => r.has(h.id)),\n // Add editable annotations that were selected\n ...a.filter(({ id: h }) => !m.has(h)).map(({ id: h }) => i.getAnnotation(h))\n ];\n }\n A(\"selectionChanged\", u);\n }\n }), U.subscribe((a) => {\n !S && a ? A(\"mouseEnterAnnotation\", i.getAnnotation(a)) : S && !a ? A(\"mouseLeaveAnnotation\", i.getAnnotation(S)) : S && a && (A(\"mouseLeaveAnnotation\", i.getAnnotation(S)), A(\"mouseEnterAnnotation\", i.getAnnotation(a))), S = a;\n }), b == null || b.subscribe((a) => A(\"viewportIntersect\", a.map((m) => i.getAnnotation(m)))), i.observe((a) => {\n o && (s && clearTimeout(s), s = setTimeout(O, 1e3));\n const { created: m, deleted: r } = a.changes;\n (m || []).forEach((h) => A(\"createAnnotation\", h)), (r || []).forEach((h) => A(\"deleteAnnotation\", h)), (a.changes.updated || []).filter((h) => [\n ...h.bodiesCreated || [],\n ...h.bodiesDeleted || [],\n ...h.bodiesUpdated || []\n ].length > 0).forEach(({ oldValue: h, newValue: L }) => {\n const I = u.find((N) => N.id === h.id) || h;\n u = u.map((N) => N.id === h.id ? L : N), A(\"updateAnnotation\", L, I);\n });\n }, { origin: T.LOCAL }), i.observe((a) => {\n if (u) {\n const m = new Set(u.map((E) => E.id)), r = (a.changes.updated || []).filter(({ newValue: E }) => m.has(E.id)).map(({ newValue: E }) => E);\n r.length > 0 && (u = u.map((E) => {\n const h = r.find((L) => L.id === E.id);\n return h || E;\n }));\n }\n }, { origin: T.REMOTE });\n const C = (a) => (m) => {\n const { created: r, deleted: E, updated: h } = m;\n (r || []).forEach((L) => A(\"createAnnotation\", L)), (E || []).forEach((L) => A(\"deleteAnnotation\", L)), a ? (h || []).forEach((L) => A(\"updateAnnotation\", L.oldValue, L.newValue)) : (h || []).forEach((L) => A(\"updateAnnotation\", L.newValue, L.oldValue));\n };\n return n.on(\"undo\", C(!0)), n.on(\"redo\", C(!1)), { on: g, off: y, emit: A };\n}, Te = (e) => (n) => n.map((t) => e.serialize(t)), re = (e) => (n) => n.reduce((t, o) => {\n const { parsed: i, error: p } = e.parse(o);\n return p ? {\n parsed: t.parsed,\n failed: [...t.failed, o]\n } : i ? {\n parsed: [...t.parsed, i],\n failed: t.failed\n } : {\n ...t\n };\n}, { parsed: [], failed: [] }), De = (e, n, t) => {\n const { store: o, selection: i } = e, p = (C) => {\n if (t) {\n const { parsed: a, error: m } = t.parse(C);\n a ? o.addAnnotation(a, T.REMOTE) : console.error(m);\n } else\n o.addAnnotation(C, T.REMOTE);\n }, U = () => i.clear(), b = () => o.clear(), w = (C) => {\n const a = o.getAnnotation(C);\n return t && a ? t.serialize(a) : a;\n }, u = () => t ? o.all().map(t.serialize) : o.all(), S = () => {\n var m;\n const a = (((m = i.selected) == null ? void 0 : m.map((r) => r.id)) || []).map((r) => o.getAnnotation(r)).filter(Boolean);\n return t ? a.map(t.serialize) : a;\n }, s = (C) => fetch(C).then((a) => a.json()).then((a) => (y(a), a)), g = (C) => {\n if (typeof C == \"string\") {\n const a = o.getAnnotation(C);\n if (o.deleteAnnotation(C), a)\n return t ? t.serialize(a) : a;\n } else {\n const a = t ? t.parse(C).parsed : C;\n if (a)\n return o.deleteAnnotation(a), C;\n }\n }, y = (C) => {\n if (t) {\n const { parsed: a, failed: m } = re(t)(C);\n m.length > 0 && console.warn(`Discarded ${m.length} invalid annotations`, m), o.bulkAddAnnotation(a, !0, T.REMOTE);\n } else\n o.bulkAddAnnotation(C, !0, T.REMOTE);\n }, A = (C) => {\n C ? i.setSelected(C) : i.clear();\n }, O = (C) => {\n if (t) {\n const a = t.parse(C).parsed, m = t.serialize(o.getAnnotation(a.id));\n return o.updateAnnotation(a), m;\n } else {\n const a = o.getAnnotation(C.id);\n return o.updateAnnotation(C), a;\n }\n };\n return {\n addAnnotation: p,\n cancelSelected: U,\n canRedo: n.canRedo,\n canUndo: n.canUndo,\n clearAnnotations: b,\n getAnnotationById: w,\n getAnnotations: u,\n getSelected: S,\n loadAnnotations: s,\n redo: n.redo,\n removeAnnotation: g,\n setAnnotations: y,\n setSelected: A,\n undo: n.undo,\n updateAnnotation: O\n };\n};\nlet ae = (e) => crypto.getRandomValues(new Uint8Array(e)), ce = (e, n, t) => {\n let o = (2 << Math.log(e.length - 1) / Math.LN2) - 1, i = -~(1.6 * o * n / e.length);\n return (p = n) => {\n let U = \"\";\n for (; ; ) {\n let b = t(i), w = i;\n for (; w--; )\n if (U += e[b[w] & o] || \"\", U.length === p)\n return U;\n }\n };\n}, le = (e, n = 21) => ce(e, n, ae), ue = (e = 21) => crypto.getRandomValues(new Uint8Array(e)).reduce((n, t) => (t &= 63, t < 36 ? n += t.toString(36) : t < 62 ? n += (t - 26).toString(36).toUpperCase() : t > 62 ? n += \"-\" : n += \"_\", n), \"\");\nconst Re = () => ({ isGuest: !0, id: le(\"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_\", 20)() }), fe = (e) => {\n const n = JSON.stringify(e);\n let t = 0;\n for (let o = 0, i = n.length; o < i; o++) {\n let p = n.charCodeAt(o);\n t = (t << 5) - t + p, t |= 0;\n }\n return `${t}`;\n}, pe = (e) => e ? typeof e == \"object\" ? { ...e } : e : void 0, Be = (e, n) => (Array.isArray(e) ? e : [e]).map((t) => {\n const { id: o, type: i, purpose: p, value: U, created: b, creator: w, ...u } = t;\n return {\n id: o || `temp-${fe(t)}`,\n annotation: n,\n type: i,\n purpose: p,\n value: U,\n created: b ? new Date(b) : void 0,\n creator: pe(w),\n ...u\n };\n}), xe = (e) => e.map((n) => {\n var o, i;\n const t = { ...n };\n return delete t.annotation, (o = t.id) != null && o.startsWith(\"temp-\") && delete t.id, { ...t, created: (i = t.created) == null ? void 0 : i.toISOString() };\n}), ge = [\n \"#ff7c00\",\n // orange\n \"#1ac938\",\n // green\n \"#e8000b\",\n // red\n \"#8b2be2\",\n // purple\n \"#9f4800\",\n // brown\n \"#f14cc1\",\n // pink\n \"#ffc400\",\n // khaki\n \"#00d7ff\",\n // cyan\n \"#023eff\"\n // blue\n], he = () => {\n const e = [...ge];\n return { assignRandomColor: () => {\n const o = Math.floor(Math.random() * e.length), i = e[o];\n return e.splice(o, 1), i;\n }, releaseColor: (o) => e.push(o) };\n}, me = () => {\n const e = he();\n return { addUser: (o, i) => {\n const p = e.assignRandomColor();\n return {\n label: i.name || i.id,\n avatar: i.avatar,\n color: p\n };\n }, removeUser: (o) => e.releaseColor(o.appearance.color) };\n}, Ae = (e, n) => e.every((t) => e.includes(t)) && n.every((t) => e.includes(t)), Ie = ue(), ke = (e = me()) => {\n const n = P(), t = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), i = (s, g) => {\n if (t.has(s)) {\n console.warn(\"Attempt to add user that is already present\", s, g);\n return;\n }\n const y = e.addUser(s, g);\n t.set(s, {\n ...g,\n presenceKey: s,\n appearance: y\n });\n }, p = (s) => {\n const g = t.get(s);\n if (!g) {\n console.warn(\"Attempt to remove user that is not present\", s);\n return;\n }\n e.removeUser(g), t.delete(s);\n }, U = (s) => {\n const g = new Set(s.map((O) => O.presenceKey)), y = s.filter(({ presenceKey: O }) => !t.has(O)), A = Array.from(t.values()).filter((O) => !g.has(O.presenceKey));\n y.forEach(({ presenceKey: O, user: C }) => i(O, C)), A.forEach((O) => {\n const { presenceKey: C } = O;\n o.has(C) && n.emit(\"selectionChange\", O, null), p(C);\n }), (y.length > 0 || A.length > 0) && n.emit(\"presence\", u());\n }, b = (s, g) => {\n const y = t.get(s);\n if (!y) {\n console.warn(\"Activity notification from user that is not present\");\n return;\n }\n const A = o.get(s);\n (!A || !Ae(A, g)) && (o.set(s, g), n.emit(\"selectionChange\", y, g));\n }, w = (s, g) => {\n const y = t.get(s);\n if (!y) {\n console.warn(\"Selection change for user that is not present\", s);\n return;\n }\n g ? o.set(s, g) : o.delete(s), n.emit(\"selectionChange\", y, g);\n }, u = () => [...Array.from(t.values())];\n return {\n getPresentUsers: u,\n notifyActivity: b,\n on: (s, g) => n.on(s, g),\n syncUsers: U,\n updateSelection: w\n };\n};\nexport {\n ne as Ignore,\n T as Origin,\n Ie as PRESENCE_KEY,\n q as PointerSelectAction,\n Re as createAnonymousGuest,\n De as createBaseAnnotator,\n we as createBody,\n me as createDefaultAppearenceProvider,\n be as createHoverState,\n Oe as createLifecyleObserver,\n ke as createPresenceState,\n ve as createSelectionState,\n ye as createStore,\n Le as createUndoStack,\n Se as createViewportState,\n he as defaultColorProvider,\n M as diffAnnotations,\n Ce as getContributors,\n se as mergeChanges,\n G as onPointerSelect,\n re as parseAll,\n Be as parseW3CBodies,\n pe as parseW3CUser,\n Te as serializeAll,\n xe as serializeW3CBodies,\n oe as shouldNotify,\n Ue as toSvelteStore\n};\n//# sourceMappingURL=annotorious-core.es.js.map\n","\nexport default function quickselect(arr, k, left, right, compare) {\n quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);\n}\n\nfunction quickselectStep(arr, k, left, right, compare) {\n\n while (right > left) {\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp(2 * z / 3);\n var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n quickselectStep(arr, k, newLeft, newRight, compare);\n }\n\n var t = arr[k];\n var i = left;\n var j = right;\n\n swap(arr, left, k);\n if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (compare(arr[i], t) < 0) i++;\n while (compare(arr[j], t) > 0) j--;\n }\n\n if (compare(arr[left], t) === 0) swap(arr, left, j);\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","import quickselect from 'quickselect';\n\nexport default class RBush {\n constructor(maxEntries = 9) {\n // max entries in a node is 9 by default; min node fill is 40% for best performance\n this._maxEntries = Math.max(4, maxEntries);\n this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));\n this.clear();\n }\n\n all() {\n return this._all(this.data, []);\n }\n\n search(bbox) {\n let node = this.data;\n const result = [];\n\n if (!intersects(bbox, node)) return result;\n\n const toBBox = this.toBBox;\n const nodesToSearch = [];\n\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf) result.push(child);\n else if (contains(bbox, childBBox)) this._all(child, result);\n else nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return result;\n }\n\n collides(bbox) {\n let node = this.data;\n\n if (!intersects(bbox, node)) return false;\n\n const nodesToSearch = [];\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? this.toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf || contains(bbox, childBBox)) return true;\n nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return false;\n }\n\n load(data) {\n if (!(data && data.length)) return this;\n\n if (data.length < this._minEntries) {\n for (let i = 0; i < data.length; i++) {\n this.insert(data[i]);\n }\n return this;\n }\n\n // recursively build the tree with the given data from scratch using OMT algorithm\n let node = this._build(data.slice(), 0, data.length - 1, 0);\n\n if (!this.data.children.length) {\n // save as is if tree is empty\n this.data = node;\n\n } else if (this.data.height === node.height) {\n // split root if trees have the same height\n this._splitRoot(this.data, node);\n\n } else {\n if (this.data.height < node.height) {\n // swap trees if inserted one is bigger\n const tmpNode = this.data;\n this.data = node;\n node = tmpNode;\n }\n\n // insert the small tree into the large tree at appropriate level\n this._insert(node, this.data.height - node.height - 1, true);\n }\n\n return this;\n }\n\n insert(item) {\n if (item) this._insert(item, this.data.height - 1);\n return this;\n }\n\n clear() {\n this.data = createNode([]);\n return this;\n }\n\n remove(item, equalsFn) {\n if (!item) return this;\n\n let node = this.data;\n const bbox = this.toBBox(item);\n const path = [];\n const indexes = [];\n let i, parent, goingUp;\n\n // depth-first iterative tree traversal\n while (node || path.length) {\n\n if (!node) { // go up\n node = path.pop();\n parent = path[path.length - 1];\n i = indexes.pop();\n goingUp = true;\n }\n\n if (node.leaf) { // check current node\n const index = findItem(item, node.children, equalsFn);\n\n if (index !== -1) {\n // item found, remove the item and condense tree upwards\n node.children.splice(index, 1);\n path.push(node);\n this._condense(path);\n return this;\n }\n }\n\n if (!goingUp && !node.leaf && contains(node, bbox)) { // go down\n path.push(node);\n indexes.push(i);\n i = 0;\n parent = node;\n node = node.children[0];\n\n } else if (parent) { // go right\n i++;\n node = parent.children[i];\n goingUp = false;\n\n } else node = null; // nothing found\n }\n\n return this;\n }\n\n toBBox(item) { return item; }\n\n compareMinX(a, b) { return a.minX - b.minX; }\n compareMinY(a, b) { return a.minY - b.minY; }\n\n toJSON() { return this.data; }\n\n fromJSON(data) {\n this.data = data;\n return this;\n }\n\n _all(node, result) {\n const nodesToSearch = [];\n while (node) {\n if (node.leaf) result.push(...node.children);\n else nodesToSearch.push(...node.children);\n\n node = nodesToSearch.pop();\n }\n return result;\n }\n\n _build(items, left, right, height) {\n\n const N = right - left + 1;\n let M = this._maxEntries;\n let node;\n\n if (N <= M) {\n // reached leaf level; return leaf\n node = createNode(items.slice(left, right + 1));\n calcBBox(node, this.toBBox);\n return node;\n }\n\n if (!height) {\n // target height of the bulk-loaded tree\n height = Math.ceil(Math.log(N) / Math.log(M));\n\n // target number of root entries to maximize storage utilization\n M = Math.ceil(N / Math.pow(M, height - 1));\n }\n\n node = createNode([]);\n node.leaf = false;\n node.height = height;\n\n // split the items into M mostly square tiles\n\n const N2 = Math.ceil(N / M);\n const N1 = N2 * Math.ceil(Math.sqrt(M));\n\n multiSelect(items, left, right, N1, this.compareMinX);\n\n for (let i = left; i <= right; i += N1) {\n\n const right2 = Math.min(i + N1 - 1, right);\n\n multiSelect(items, i, right2, N2, this.compareMinY);\n\n for (let j = i; j <= right2; j += N2) {\n\n const right3 = Math.min(j + N2 - 1, right2);\n\n // pack each entry recursively\n node.children.push(this._build(items, j, right3, height - 1));\n }\n }\n\n calcBBox(node, this.toBBox);\n\n return node;\n }\n\n _chooseSubtree(bbox, node, level, path) {\n while (true) {\n path.push(node);\n\n if (node.leaf || path.length - 1 === level) break;\n\n let minArea = Infinity;\n let minEnlargement = Infinity;\n let targetNode;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const area = bboxArea(child);\n const enlargement = enlargedArea(bbox, child) - area;\n\n // choose entry with the least area enlargement\n if (enlargement < minEnlargement) {\n minEnlargement = enlargement;\n minArea = area < minArea ? area : minArea;\n targetNode = child;\n\n } else if (enlargement === minEnlargement) {\n // otherwise choose one with the smallest area\n if (area < minArea) {\n minArea = area;\n targetNode = child;\n }\n }\n }\n\n node = targetNode || node.children[0];\n }\n\n return node;\n }\n\n _insert(item, level, isNode) {\n const bbox = isNode ? item : this.toBBox(item);\n const insertPath = [];\n\n // find the best node for accommodating the item, saving all nodes along the path too\n const node = this._chooseSubtree(bbox, this.data, level, insertPath);\n\n // put the item into the node\n node.children.push(item);\n extend(node, bbox);\n\n // split on node overflow; propagate upwards if necessary\n while (level >= 0) {\n if (insertPath[level].children.length > this._maxEntries) {\n this._split(insertPath, level);\n level--;\n } else break;\n }\n\n // adjust bboxes along the insertion path\n this._adjustParentBBoxes(bbox, insertPath, level);\n }\n\n // split overflowed node into two\n _split(insertPath, level) {\n const node = insertPath[level];\n const M = node.children.length;\n const m = this._minEntries;\n\n this._chooseSplitAxis(node, m, M);\n\n const splitIndex = this._chooseSplitIndex(node, m, M);\n\n const newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));\n newNode.height = node.height;\n newNode.leaf = node.leaf;\n\n calcBBox(node, this.toBBox);\n calcBBox(newNode, this.toBBox);\n\n if (level) insertPath[level - 1].children.push(newNode);\n else this._splitRoot(node, newNode);\n }\n\n _splitRoot(node, newNode) {\n // split root node\n this.data = createNode([node, newNode]);\n this.data.height = node.height + 1;\n this.data.leaf = false;\n calcBBox(this.data, this.toBBox);\n }\n\n _chooseSplitIndex(node, m, M) {\n let index;\n let minOverlap = Infinity;\n let minArea = Infinity;\n\n for (let i = m; i <= M - m; i++) {\n const bbox1 = distBBox(node, 0, i, this.toBBox);\n const bbox2 = distBBox(node, i, M, this.toBBox);\n\n const overlap = intersectionArea(bbox1, bbox2);\n const area = bboxArea(bbox1) + bboxArea(bbox2);\n\n // choose distribution with minimum overlap\n if (overlap < minOverlap) {\n minOverlap = overlap;\n index = i;\n\n minArea = area < minArea ? area : minArea;\n\n } else if (overlap === minOverlap) {\n // otherwise choose distribution with minimum area\n if (area < minArea) {\n minArea = area;\n index = i;\n }\n }\n }\n\n return index || M - m;\n }\n\n // sorts node children by the best axis for split\n _chooseSplitAxis(node, m, M) {\n const compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;\n const compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;\n const xMargin = this._allDistMargin(node, m, M, compareMinX);\n const yMargin = this._allDistMargin(node, m, M, compareMinY);\n\n // if total distributions margin value is minimal for x, sort by minX,\n // otherwise it's already sorted by minY\n if (xMargin < yMargin) node.children.sort(compareMinX);\n }\n\n // total margin of all possible split distributions where each node is at least m full\n _allDistMargin(node, m, M, compare) {\n node.children.sort(compare);\n\n const toBBox = this.toBBox;\n const leftBBox = distBBox(node, 0, m, toBBox);\n const rightBBox = distBBox(node, M - m, M, toBBox);\n let margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);\n\n for (let i = m; i < M - m; i++) {\n const child = node.children[i];\n extend(leftBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(leftBBox);\n }\n\n for (let i = M - m - 1; i >= m; i--) {\n const child = node.children[i];\n extend(rightBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(rightBBox);\n }\n\n return margin;\n }\n\n _adjustParentBBoxes(bbox, path, level) {\n // adjust bboxes along the given tree path\n for (let i = level; i >= 0; i--) {\n extend(path[i], bbox);\n }\n }\n\n _condense(path) {\n // go through the path, removing empty nodes and updating bboxes\n for (let i = path.length - 1, siblings; i >= 0; i--) {\n if (path[i].children.length === 0) {\n if (i > 0) {\n siblings = path[i - 1].children;\n siblings.splice(siblings.indexOf(path[i]), 1);\n\n } else this.clear();\n\n } else calcBBox(path[i], this.toBBox);\n }\n }\n}\n\nfunction findItem(item, items, equalsFn) {\n if (!equalsFn) return items.indexOf(item);\n\n for (let i = 0; i < items.length; i++) {\n if (equalsFn(item, items[i])) return i;\n }\n return -1;\n}\n\n// calculate node's bbox from bboxes of its children\nfunction calcBBox(node, toBBox) {\n distBBox(node, 0, node.children.length, toBBox, node);\n}\n\n// min bounding rectangle of node children from k to p-1\nfunction distBBox(node, k, p, toBBox, destNode) {\n if (!destNode) destNode = createNode(null);\n destNode.minX = Infinity;\n destNode.minY = Infinity;\n destNode.maxX = -Infinity;\n destNode.maxY = -Infinity;\n\n for (let i = k; i < p; i++) {\n const child = node.children[i];\n extend(destNode, node.leaf ? toBBox(child) : child);\n }\n\n return destNode;\n}\n\nfunction extend(a, b) {\n a.minX = Math.min(a.minX, b.minX);\n a.minY = Math.min(a.minY, b.minY);\n a.maxX = Math.max(a.maxX, b.maxX);\n a.maxY = Math.max(a.maxY, b.maxY);\n return a;\n}\n\nfunction compareNodeMinX(a, b) { return a.minX - b.minX; }\nfunction compareNodeMinY(a, b) { return a.minY - b.minY; }\n\nfunction bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }\nfunction bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }\n\nfunction enlargedArea(a, b) {\n return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *\n (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));\n}\n\nfunction intersectionArea(a, b) {\n const minX = Math.max(a.minX, b.minX);\n const minY = Math.max(a.minY, b.minY);\n const maxX = Math.min(a.maxX, b.maxX);\n const maxY = Math.min(a.maxY, b.maxY);\n\n return Math.max(0, maxX - minX) *\n Math.max(0, maxY - minY);\n}\n\nfunction contains(a, b) {\n return a.minX <= b.minX &&\n a.minY <= b.minY &&\n b.maxX <= a.maxX &&\n b.maxY <= a.maxY;\n}\n\nfunction intersects(a, b) {\n return b.minX <= a.maxX &&\n b.minY <= a.maxY &&\n b.maxX >= a.minX &&\n b.maxY >= a.minY;\n}\n\nfunction createNode(children) {\n return {\n children,\n height: 1,\n leaf: true,\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity\n };\n}\n\n// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;\n// combines selection algorithm with binary divide & conquer approach\n\nfunction multiSelect(arr, left, right, n, compare) {\n const stack = [left, right];\n\n while (stack.length) {\n right = stack.pop();\n left = stack.pop();\n\n if (right - left <= n) continue;\n\n const mid = left + Math.ceil((right - left) / n / 2) * n;\n quickselect(arr, mid, left, right, compare);\n\n stack.push(left, mid, mid, right);\n }\n}\n","// The three topological relations we need to check for\ntype Relation = \n // Inline elements, same height, directly adjacent\n 'inline-adjacent' |\n // Inline elements, A fully contains B\n 'inline-contains' |\n // Inline elements, A is fully contained inside B\n 'inline-is-contained' |\n // At least one block element, A fully contains B\n 'block-contains' |\n // At least one block element, A is fully contained in B\n 'block-is-contained';\n\n// Note that this is not a general topology test. Takes a \n// few shortcuts to test ONLY the situations we'll encounter\n// with text selections.\nconst getRelation = (rectA: DOMRect, rectB: DOMRect): Relation | undefined => {\n const round = (num: number ) => Math.round(num * 10) / 10;\n\n // Some browsers have fractional pixel differences (looking at you FF!)\n const a = {\n top: round(rectA.top),\n bottom: round(rectA.bottom),\n left: round(rectA.left),\n right: round(rectA.right)\n };\n\n const b = {\n top: round(rectB.top),\n bottom: round(rectB.bottom),\n left: round(rectB.left),\n right: round(rectB.right)\n };\n\n if (Math.abs(a.top - b.top) < 0.5 && Math.abs(a.bottom - b.bottom) < 0.5) {\n // Same height - check for containment and adjacency\n if (Math.abs(a.left - b.right) < 0.5 || Math.abs(a.right - b.left) < 0.5)\n return 'inline-adjacent';\n\n if (a.left >= b.left && a.right <= b.right)\n return 'inline-is-contained';\n\n if (a.left <= b.left && a.right >= b.right)\n return 'inline-contains';\n } else {\n // Different heights - check for containment\n if (a.top <= b.top && a.bottom >= b.bottom) {\n if (a.left <= b.left && a.right >= b.right) {\n return 'block-contains'\n }\n } else if (a.top >= b.top && a.bottom <= b.bottom) {\n if (a.left >= b.left && a.right <= b.right) {\n return 'block-is-contained';\n }\n }\n }\n}\n\nconst union = (a: DOMRect, b: DOMRect): DOMRect => {\n const left = Math.min(a.left, b.left);\n const right = Math.max(a.right, b.right);\n const top = Math.min(a.top, b.top);\n const bottom = Math.max(a.bottom, b.bottom);\n\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\nexport const mergeClientRects = (rects: DOMRect[]) => rects.reduce((merged, rectA) => {\n // Some browser report empty rects - discard\n if (rectA.width === 0 || rectA.height === 0)\n return merged;\n\n let next = [...merged];\n\n let wasMerged = false;\n\n for (const rectB of merged) {\n const relation = getRelation(rectA, rectB);\n \n if (relation === 'inline-adjacent') {\n // A and B are adjacent - remove B and keep union\n next = next.map(r => r === rectB ? union(rectA, rectB) : r);\n wasMerged = true;\n break;\n } else if (relation === 'inline-contains') {\n // A contains B - remove B and keep A\n next = next.map(r => r === rectB ? rectA : r);\n wasMerged = true;\n break;\n } else if (relation === 'inline-is-contained') {\n // B contains A - skip A\n wasMerged = true;\n break;\n } else if (relation === 'block-contains' || relation === 'block-is-contained') {\n // Block containment - keep the element with smaller width\n if (rectA.width < rectB.width) {\n next = next.map(r => r === rectB ? rectA : r);\n }\n wasMerged = true;\n break;\n }\n }\n\n return wasMerged ? next : [ ...next, rectA ];\n}, [] as DOMRect[]);\n","export const trimRange = (range: Range): Range => {\n const { startContainer, endContainer } = range;\n\n const isTextRange = \n startContainer.nodeType === Node.TEXT_NODE && \n endContainer.nodeType === Node.TEXT_NODE;\n\n if (isTextRange)\n return range;\n\n if (startContainer.nodeType !== Node.TEXT_NODE) {\n const nextContainer = startContainer.nextSibling || startContainer.parentNode;\n \n // Get first text child in next container\n const nextText = nextContainer.nodeType === Node.TEXT_NODE ?\n nextContainer :\n Array.from(nextContainer.childNodes).filter(n => n.nodeType === Node.TEXT_NODE).shift(); \n\n range.setEnd(nextText, 0);\n }\n\n if (endContainer.nodeType !== Node.TEXT_NODE) {\n const prevContainer = endContainer.previousSibling || endContainer.parentNode;\n \n // Get last text child in previous container\n const prevText = prevContainer.nodeType === Node.TEXT_NODE ?\n prevContainer :\n Array.from(prevContainer.childNodes).filter(n => n.nodeType === Node.TEXT_NODE).pop(); \n\n range.setEnd(prevText, prevText.textContent.length);\n }\n\n return range;\n}","import RBush from 'rbush';\nimport type { Store } from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport { mergeClientRects } from '../utils';\nimport { getClientRectsPonyfill } from '../utils/getClientRectsPonyfill';\nimport { reviveTarget } from './reviveTarget';\n\nconst isFirefox = false; // navigator.userAgent.match(/firefox|fxios/i);\n\nif (isFirefox) console.warn('Firefox interop enabled');\n\nexport interface IndexedHighlightRect {\n\n minX: number;\n\n minY: number;\n\n maxX: number;\n\n maxY: number;\n\n annotation: {\n \n id: string;\n\n rects: DOMRect[];\n\n }\n\n}\n\nexport const createSpatialTree = (store: Store<TextAnnotation>, container: HTMLElement) => {\n\n const tree = new RBush<IndexedHighlightRect>();\n\n const index = new Map<string, IndexedHighlightRect[]>();\n\n // Helper: converts a single text annotation target to a list of hightlight rects\n const toItems = (target: TextAnnotationTarget): IndexedHighlightRect[] => {\n const offset = container.getBoundingClientRect();\n\n const isValidRange = \n target.selector.range instanceof Range && \n !target.selector.range.collapsed &&\n target.selector.range.startContainer.nodeType === Node.TEXT_NODE && \n target.selector.range.endContainer.nodeType === Node.TEXT_NODE;\n\n const t = isValidRange ? target : reviveTarget(target, container);\n\n const rects = isFirefox ? \n getClientRectsPonyfill(t.selector.range) :\n Array.from(t.selector.range.getClientRects());\n\n const merged = mergeClientRects(rects);\n\n return merged.map(rect => {\n const { x, y, width, height } = rect;\n\n return {\n minX: x - offset.x,\n minY: y - offset.y,\n maxX: x - offset.x + width,\n maxY: y - offset.y + height,\n annotation: {\n id: target.annotation,\n rects: merged\n }\n }\n });\n }\n\n const all = () => [...index.values()];\n\n const clear = () => {\n tree.clear();\n index.clear();\n }\n\n const insert = (target: TextAnnotationTarget) => {\n const rects = toItems(target);\n rects.forEach(rect => tree.insert(rect));\n index.set(target.annotation, rects);\n }\n\n const remove = (target: TextAnnotationTarget) => {\n const rects = index.get(target.annotation);\n rects.forEach(rect => tree.remove(rect));\n index.delete(target.annotation);\n }\n\n const update = (target: TextAnnotationTarget) => {\n remove(target);\n insert(target);\n }\n\n const set = (targets: TextAnnotationTarget[], replace: boolean = true) => {\n if (replace)\n clear();\n\n const rectsByTarget = targets.map(target => ({ target, rects: toItems(target) }));\n rectsByTarget.forEach(({ target, rects }) => index.set(target.annotation, rects));\n\n const allRects = rectsByTarget.reduce((all, { rects }) => [...all, ...rects], []);\n tree.load(allRects);\n }\n\n const getAt = (x: number, y: number): string | undefined => {\n const hits = tree.search({\n minX: x,\n minY: y,\n maxX: x,\n maxY: y\n });\n\n const area = (rect: IndexedHighlightRect) =>\n rect.annotation.rects.reduce((area, r) =>\n area + r.width * r.height, 0);\n \n // Get smallest rect\n if (hits.length > 0) {\n hits.sort((a, b) => area(a) - area(b));\n return hits[0].annotation.id;\n }\n }\n\n const getBoundsForAnnotation = (id: string): DOMRect => {\n const rects = getDOMRectsForAnnotation(id);\n\n if (rects.length === 0)\n return undefined;\n\n let left = rects[0].left;\n let top = rects[0].top;\n let right = rects[0].right;\n let bottom = rects[0].bottom;\n\n for (let i = 1; i < rects.length; i++) {\n const rect = rects[i];\n\n left = Math.min(left, rect.left);\n top = Math.min(top, rect.top);\n right = Math.max(right, rect.right);\n bottom = Math.max(bottom, rect.bottom);\n }\n\n return new DOMRect(left, top, right - left, bottom - top);\n }\n\n const getDOMRectsForAnnotation = (id: string): DOMRect[] => {\n const indexed = index.get(id);\n if (indexed) {\n // Reminder: *each* IndexedHighlightRect stores *all*\n // DOMRects for the annotation for convenience\n return indexed[0].annotation.rects;\n } else {\n return [];\n }\n }\n\n const getIntersectingRects = (minX: number, minY: number, maxX: number, maxY: number) =>\n tree.search({ minX, minY, maxX, maxY });\n\n const size = () => tree.all().length;\n\n const recalculate = () =>\n set(store.all().map(a => a.target), true);\n\n return {\n all,\n clear,\n getAt,\n getBoundsForAnnotation,\n getDOMRectsForAnnotation,\n getIntersectingRects,\n insert,\n recalculate,\n remove,\n set,\n size,\n update\n }\n\n}","import type { PointerSelectAction, Store, ViewportState } from '@annotorious/core';\nimport { \n createHoverState, \n createSelectionState, \n createStore, \n AnnotatorState, \n SelectionState, \n HoverState, \n Origin,\n createViewportState\n} from '@annotorious/core';\nimport { IndexedHighlightRect, createSpatialTree } from './spatialTree';\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport type { AnnotationRects, TextAnnotationStore } from './TextAnnotationStore';\nimport { reviveTarget } from './reviveTarget';\n\nexport type TextAnnotatorState = AnnotatorState<TextAnnotation> & {\n\n store: TextAnnotationStore;\n\n selection: SelectionState<TextAnnotation>;\n\n hover: HoverState<TextAnnotation>;\n\n viewport: ViewportState;\n\n}\n\n// Shorthand\nconst hasValidRange = (annotation: TextAnnotation) => {\n const { range } = annotation.target.selector;\n return range instanceof Range && !range.collapsed;\n}\n\nexport const createTextAnnotatorState = (\n container: HTMLElement,\n defaultPointerAction?: PointerSelectAction | ((annotation: TextAnnotation) => PointerSelectAction)\n): TextAnnotatorState => {\n\n const store: Store<TextAnnotation> = createStore<TextAnnotation>();\n\n const tree = createSpatialTree(store, container);\n\n const selection = createSelectionState<TextAnnotation>(store, defaultPointerAction);\n\n const hover = createHoverState(store);\n\n const viewport = createViewportState();\n\n // Wrap store interface to intercept annotations and revive DOM ranges, if needed\n const addAnnotation = (annotation: TextAnnotation, origin = Origin.LOCAL): boolean => {\n const revived = annotation.target.selector.range instanceof Range ?\n annotation : { ...annotation, target: reviveTarget(annotation.target, container) };\n\n const { range } = revived.target.selector;\n const isValid = range && !range.collapsed;\n\n if (isValid)\n store.addAnnotation(revived, origin); \n\n return isValid;\n }\n\n const bulkAddAnnotation = (\n annotations: TextAnnotation[], \n replace = true, \n origin = Origin.LOCAL\n ): TextAnnotation[] => {\n const revived = annotations.map(a => hasValidRange(a) ?\n a : { ...a, target: reviveTarget(a.target, container )});\n\n // Initial page load might take some time. Retry for more robustness.\n const hasCollapsedRanges = revived.some(a => a.target.selector.range.collapsed);\n if (hasCollapsedRanges) {\n const couldNotRevive = revived.filter(a => a.target.selector.range.collapsed);\n console.warn('Could not revive all targets');\n console.warn(couldNotRevive);\n\n // Note: we want to keep ALL annotations in the store, even those that\n // were not revived - even if the highlighter won't be able to render\n // the un-revived ones to the screen.\n store.bulkAddAnnotation(revived, replace, origin);\n\n return couldNotRevive;\n } else {\n store.bulkAddAnnotation(revived, replace, origin);\n return [];\n }\n }\n\n const updateTarget = (target: TextAnnotationTarget, origin = Origin.LOCAL) => {\n const revived = target.selector.range instanceof Range ?\n target : reviveTarget(target, container);\n\n store.updateTarget(revived, origin);\n }\n\n const bulkUpdateTargets = (targets: TextAnnotationTarget[], origin = Origin.LOCAL) => {\n const revived = targets.map(t => t.selector.range instanceof Range ? t : reviveTarget(t, container));\n store.bulkUpdateTargets(revived, origin);\n }\n\n const getAt = (x: number, y: number): TextAnnotation | undefined => {\n const annotationId = tree.getAt(x, y);\n return annotationId ? store.getAnnotation(annotationId) : undefined;\n }\n\n const getIntersecting = (minX: number, minY: number, maxX: number, maxY: number) => {\n const rects = tree.getIntersectingRects(minX, minY, maxX, maxY);\n const ids = Array.from(new Set(rects.map(item => item.annotation.id)));\n\n // Note that the tree could be slightly out of sync (because it updates\n // by listening to changes, just like anyone else)\n return ids.map(id => store.getAnnotation(id)).filter(a => a);\n }\n\n const getAnnotationBounds = (id: string, x?: number, y?: number, buffer = 5): DOMRect => {\n const rects = tree.getDOMRectsForAnnotation(id);\n if (rects.length > 0) {\n if (x && y) {\n const match = rects.find(({ top, right, bottom, left }) =>\n x >= left - buffer && x <= right + buffer && y >= top - buffer && y <= bottom + buffer);\n\n if (match)\n // Preferred bounds: the rectangle \n return match;\n }\n \n return tree.getBoundsForAnnotation(id);\n }\n }\n\n const getIntersectingRects = (\n minX: number, \n minY: number, \n maxX: number, \n maxY: number\n ): AnnotationRects[] => {\n const rects = tree.getIntersectingRects(minX, minY, maxX, maxY);\n\n // Group by annotation ID\n const groupedByAnnotationId: { [key:string]: IndexedHighlightRect[] } = rects.reduce((grouped, rect) => {\n (grouped[rect.annotation.id] = grouped[rect.annotation.id] || []).push(rect);\n return grouped;\n }, {});\n\n // Resolve annotation IDs\n return Object.entries(groupedByAnnotationId).map(([annotationId, rects]) => ({\n annotation: store.getAnnotation(annotationId),\n rects: rects.map(({ minX, minY, maxX, maxY }) => \n ({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }))\n }));\n }\n\n const recalculatePositions = () => tree.recalculate();\n\n store.observe(({ changes }) => {\n const created = (changes.created || []).filter(hasValidRange);\n const deleted = (changes.deleted || []).filter(hasValidRange);\n const updated = (changes.updated || []).filter(u => hasValidRange(u.newValue));\n\n if (created.length > 0)\n tree.set(created.map(a => a.target), false);\n\n if (deleted?.length > 0)\n deleted.forEach(a => tree.remove(a.target));\n\n if (updated?.length > 0)\n updated.forEach(({ newValue }) =>\n tree.update(newValue.target));\n });\n\n return {\n store: {\n ...store,\n addAnnotation,\n bulkAddAnnotation,\n bulkUpdateTargets,\n getAnnotationBounds,\n getAt,\n getIntersecting,\n getIntersectingRects,\n recalculatePositions,\n updateTarget\n } as TextAnnotationStore,\n selection,\n hover,\n viewport\n }\n\n}","import type { DrawingStyle, PresenceProvider, PresentUser } from '@annotorious/core';\nimport type { HighlightPainter } from '../highlight';\nimport type { PresencePainterOptions } from './PresencePainterOptions';\nimport type { TextAnnotation } from '../model';\nimport type { Rect } from '../state';\nimport { defaultPainter } from '../highlight';\n\nexport const createPainter = (provider: PresenceProvider, opts: PresencePainterOptions = {}): HighlightPainter => {\n\n const trackedAnnotations = new Map<string, PresentUser>();\n\n const getAnnotationsForUser = (p: PresentUser) =>\n Array.from(trackedAnnotations.entries())\n .filter(([id, user]) => user.presenceKey === p.presenceKey)\n .map(([id, _]) => id);\n\n provider.on('selectionChange', (p: PresentUser, selection: string[] | null) => {\n // Remove this user's previous selection\n const currentIds = getAnnotationsForUser(p);\n currentIds.forEach(id => trackedAnnotations.delete(id));\n\n // Set new selection (if any)\n if (selection)\n selection.forEach(id => trackedAnnotations.set(id, p));\n }); \n\n const paint = (\n annotation: TextAnnotation,\n rects: Rect[], \n bg: CanvasRenderingContext2D, \n fg: CanvasRenderingContext2D,\n isSelected?: boolean,\n style?: DrawingStyle | ((annotation: TextAnnotation) => DrawingStyle)\n ) => {\n if (opts.font)\n fg.font = opts.font;\n\n const user = trackedAnnotations.get(annotation.id);\n if (user) {\n const { x, y, height } = rects[0];\n\n // Draw presence indicator\n fg.fillStyle = user.appearance.color;\n fg.fillRect(x - 2, y - 2.5, 2, height + 5);\n\n // Draw name label\n const metrics = fg.measureText(user.appearance.label);\n const labelWidth = metrics.width + 6;\n const labelHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent + 8;\n \n // Sigh... different between FF and Chrome\n const paddingBottom = metrics.fontBoundingBoxAscent ? 8 : 6.5;\n\n fg.fillRect(x - 2, y - 2.5 - labelHeight, labelWidth, labelHeight);\n \n fg.fillStyle = '#fff';\n fg.fillText(user.appearance.label, x + 1, y - paddingBottom);\n\n bg.fillStyle = user.appearance.color;\n bg.globalAlpha = isSelected ? 0.45 : 0.18;\n rects.forEach(({ x, y, width, height }) => bg.fillRect(x, y - 2.5, width, height + 5));\n } else {\n defaultPainter.paint(annotation, rects, bg, fg, isSelected, style);\n }\n }\n\n return { paint };\n \n}","import type { TextAnnotationStore } from 'src/state';\nimport type { TextAnnotation } from '../model/TextAnnotation';\n\nconst getScrollParent = (el: Element) => {\n if (el === null)\n return document.scrollingElement;\n\n const { overflowY } = window.getComputedStyle(el);\n const isScrollable = overflowY !== 'visible' && overflowY !== 'hidden';\n\n // Cf. discussion https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\n if (isScrollable && el.scrollHeight > el.clientHeight)\n return el;\n else\n return getScrollParent(el.parentElement);\n}\n\nexport const scrollIntoView = (container: HTMLElement, store: TextAnnotationStore) => (annotation: TextAnnotation) => {\n // Get closest scrollable parent\n const scrollParent: Element = getScrollParent(container);\n if (scrollParent) {\n // Get curren version of the annotation from the store\n const current = store.getAnnotation(annotation.id);\n\n const { range } = current.target.selector;\n\n if (!range || range.collapsed)\n return false;\n\n // Parent bounds and client (= visible) height\n const parentBounds = scrollParent.getBoundingClientRect();\n const parentHeight = scrollParent.clientHeight;\n const parentWidth = scrollParent.clientWidth;\n\n // Position of the annotation relative to viewport\n const annotationBounds = current.target.selector.range.getBoundingClientRect();\n\n // Note: getBoundingClientRect seems to return wrong height! \n // (Includes block elements?) We'll therefore use the normalized height\n // from the spatial index!\n const { width, height } = store.getAnnotationBounds(annotation.id);\n\n // Position of the annotation relative to scrollParent\n const offsetTop = annotationBounds.top - parentBounds.top;\n const offsetLeft = annotationBounds.left - parentBounds.left;\n\n const scrollTop = scrollParent.parentElement ? scrollParent.scrollTop : 0;\n const scrollLeft = scrollParent.parentElement ? scrollParent.scrollLeft : 0;\n\n // Scroll the annotation to the center of the viewport\n const top = offsetTop + scrollTop - (parentHeight - height) / 2;\n const left = offsetLeft + scrollLeft - (parentWidth - width) / 2;\n\n scrollParent.scroll({ top, left, behavior: 'smooth' });\n\n return true;\n }\n}","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { Origin, type User } from '@annotorious/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { TextAnnotatorState } from './state';\nimport type { TextSelector, TextAnnotationTarget } from './model';\nimport { trimRange } from './utils';\n\nexport const rangeToSelector = (range: Range, container: HTMLElement, offsetReferenceSelector?: string): TextSelector => {\n const rangeBefore = document.createRange();\n\n const offsetReference: HTMLElement = offsetReferenceSelector ? \n (range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector) : container;\n\n // A helper range from the start of the contentNode to the start of the selection\n rangeBefore.setStart(offsetReference, 0);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n\n const quote = range.toString();\n const start = rangeBefore.toString().length;\n const end = start + quote.length;\n\n return offsetReferenceSelector ?\n { quote, start, end, range, offsetReference } :\n { quote, start, end, range };\n}\n\nexport const SelectionHandler = (\n container: HTMLElement,\n state: TextAnnotatorState,\n offsetReferenceSelector?: string\n) => {\n\n const { store, selection } = state;\n\n let currentUser: User;\n\n let currentTarget: TextAnnotationTarget = null;\n\n const setUser = (user: User) => currentUser = user;\n\n let isLeftClick = false;\n\n let lastPointerEvent: PointerEvent;\n\n container.addEventListener('selectstart', (evt: PointerEvent) => {\n if (!isLeftClick)\n return;\n\n // Make sure we don't listen to selection changes that\n // were not started on the container, or which are not supposed to\n // be annotatable (like the popup)\n const annotatable = !(evt.target as Node).parentElement.closest('.not-annotatable');\n if (annotatable) {\n currentTarget = {\n annotation: uuidv4(),\n selector: undefined,\n creator: currentUser,\n created: new Date()\n };\n } else {\n currentTarget = null;\n lastPointerEvent = undefined;\n }\n });\n\n let debounceTimer: ReturnType<typeof setTimeout> = undefined;\n\n document.addEventListener('selectionchange', (evt: PointerEvent) => {\n if (debounceTimer)\n clearTimeout(debounceTimer);\n\n debounceTimer = setTimeout(() => onSelectionChange(), 50);\n });\n\n const onSelectionChange = () => {\n const sel = document.getSelection();\n\n if (!sel.isCollapsed && isLeftClick && currentTarget) {\n const ranges = Array.from(Array(sel.rangeCount).keys())\n .map(idx => sel.getRangeAt(idx));\n\n const trimmed = trimRange(ranges[0]);\n\n const hasChanged =\n trimmed.toString() !== currentTarget.selector?.range?.toString();\n\n if (hasChanged) {\n currentTarget = {\n ...currentTarget,\n selector: rangeToSelector(ranges[0], container, offsetReferenceSelector)\n };\n\n if (store.getAnnotation(currentTarget.annotation)) {\n store.updateTarget(currentTarget, Origin.LOCAL);\n } else {\n store.addAnnotation({\n id: currentTarget.annotation,\n bodies: [],\n target: currentTarget\n });\n\n // Reminder: select events don't have offsetX/offsetY - reuse last up/down\n selection.clickSelect(currentTarget.annotation, lastPointerEvent);\n }\n }\n }\n }\n\n // Select events don't carry information about the mouse button\n // Therefore, to prevent right-click selection, we need to listen\n // to the initial pointerdown event and remember the button\n container.addEventListener('pointerdown', (evt: PointerEvent) => {\n lastPointerEvent = evt;\n isLeftClick = evt.button === 0;\n });\n\n document.addEventListener('pointerup', (evt: PointerEvent) => {\n lastPointerEvent = evt;\n\n const annotatable = !(evt.target as Node).parentElement?.closest('.not-annotatable');\n if (!annotatable || !isLeftClick)\n return;\n\n setTimeout(() => {\n if (currentTarget?.selector) {\n store.updateTarget(currentTarget, Origin.LOCAL);\n\n selection.clickSelect(currentTarget.annotation, evt);\n\n currentTarget = null;\n lastPointerEvent = undefined;\n } else {\n const { x, y } = container.getBoundingClientRect();\n\n const hovered = store.getAt(evt.clientX - x, evt.clientY - y);\n if (hovered) {\n const { selected } = selection;\n\n if (selected.length !== 1 || selected[0].id !== hovered.id) {\n selection.clickSelect(hovered.id, evt);\n lastPointerEvent = undefined;\n }\n } else if (!selection.isEmpty()) {\n selection.clear();\n }\n }\n }, 50);\n });\n\n return {\n setUser\n }\n\n}\n","import { createAnonymousGuest, createLifecyleObserver, createBaseAnnotator, DrawingStyle, Filter, createUndoStack } from '@annotorious/core';\nimport type { Annotator, User, PresenceProvider } from '@annotorious/core';\nimport { createPainter } from './presence';\nimport { createHighlightLayer } from './highlight';\nimport { scrollIntoView } from './api';\nimport { TextAnnotationStore, TextAnnotatorState, createTextAnnotatorState } from './state';\nimport type { TextAnnotation } from './model';\nimport type { TextAnnotatorOptions } from './TextAnnotatorOptions';\nimport { SelectionHandler } from './SelectionHandler';\n\nimport './TextAnnotator.css';\n\nexport interface TextAnnotator<T extends unknown = TextAnnotation> extends Annotator<TextAnnotation, T> {\n\n element: HTMLElement;\n\n // Returns true if successful (or false if the annotation is not currently rendered)\n scrollIntoView(annotation: TextAnnotation): boolean;\n\n}\n\nexport const createTextAnnotator = <E extends unknown = TextAnnotation>(\n container: HTMLElement, \n opts: TextAnnotatorOptions<E> = {}\n): TextAnnotator<E> => {\n\n const state: TextAnnotatorState = createTextAnnotatorState(container, opts.pointerAction);\n\n const { selection, viewport } = state;\n\n const store: TextAnnotationStore = state.store;\n\n const undoStack = createUndoStack(store);\n\n const lifecycle = createLifecyleObserver<TextAnnotation, TextAnnotation | E>(\n state, undoStack, opts.adapter\n );\n \n let currentUser: User = createAnonymousGuest();\n\n const highlightLayer = createHighlightLayer(container, state, viewport);\n if (opts.style)\n highlightLayer.setDrawingStyle(opts.style);\n\n const selectionHandler = SelectionHandler(container, state, opts.offsetReferenceSelector);\n\n selectionHandler.setUser(currentUser);\n\n /*************************/\n /* External API */\n /******++++++*************/\n\n // Most of the external API functions are covered in the base annotator\n const base = createBaseAnnotator<TextAnnotation, E>(state, undoStack, opts.adapter);\n\n const getUser = () => currentUser;\n\n const setFilter = (filter?: Filter) =>\n highlightLayer.setFilter(filter);\n\n const setStyle = (drawingStyle: DrawingStyle | ((annotation: TextAnnotation) => DrawingStyle) | undefined) =>\n highlightLayer.setDrawingStyle(drawingStyle);\n\n const setUser = (user: User) => {\n currentUser = user;\n selectionHandler.setUser(user);\n }\n\n const setPresenceProvider = (provider: PresenceProvider) => {\n if (provider) {\n highlightLayer.setPainter(createPainter(provider, opts.presence));\n provider.on('selectionChange', () => highlightLayer.redraw());\n }\n }\n\n const setSelected = (arg?: string | string[]) => {\n if (arg) {\n selection.setSelected(arg);\n } else {\n selection.clear();\n }\n }\n\n const destroy = () => {\n throw 'Not implemented yet';\n }\n\n return {\n ...base,\n destroy,\n element: container,\n getUser,\n setFilter,\n setStyle,\n setUser,\n setSelected,\n setPresenceProvider,\n on: lifecycle.on,\n off: lifecycle.off,\n scrollIntoView: scrollIntoView(container, store),\n state\n }\n\n}"],"names":["DEFAULT_STYLE","DEFAULT_SELECTED_STYLE","defaultPainter","annotation","rects","bg","fg","isSelected","drawingStyle","style","x","y","width","height","trackViewport","viewport","visible","annotations","ids","a","id","debounce","func","delay","timeoutId","args","createCanvas","className","highres","canvas","context","resetCanvas","createHighlightLayer","container","state","store","selection","hover","currentStyle","currentFilter","currentPainter","onDraw","bgCanvas","fgCanvas","bgContext","fgContext","event","hit","getViewport","top","left","innerWidth","innerHeight","minX","minY","maxX","maxY","onScroll","redraw","onResize","annotationsInView","selectedIds","offsetRects","filter","painter","reviveTarget","target","start","end","offsetReference","iterator","runningOffset","range","n","startCounting","len","Y","t","$","W","k","_","b","w","p","U","be","V","ve","s","g","A","G","O","S","R","Z","K","ee","te","M","T","oe","o","u","se","ie","ye","d","l","c","f","v","D","B","C","m","r","E","h","L","I","P","de","Le","Se","Oe","N","re","De","ae","ce","le","ue","Re","quickselect","arr","right","compare","quickselectStep","defaultCompare","z","sd","newLeft","newRight","i","j","swap","tmp","RBush","maxEntries","bbox","node","result","intersects","toBBox","nodesToSearch","child","childBBox","contains","data","tmpNode","item","createNode","equalsFn","path","indexes","parent","goingUp","index","findItem","items","calcBBox","N2","N1","multiSelect","right2","right3","level","minArea","minEnlargement","targetNode","area","bboxArea","enlargement","enlargedArea","isNode","insertPath","extend","splitIndex","newNode","minOverlap","bbox1","distBBox","bbox2","overlap","intersectionArea","compareMinX","compareNodeMinX","compareMinY","compareNodeMinY","xMargin","yMargin","leftBBox","rightBBox","margin","bboxMargin","siblings","destNode","children","stack","mid","getRelation","rectA","rectB","round","num","union","bottom","mergeClientRects","merged","next","wasMerged","relation","trimRange","startContainer","endContainer","nextContainer","nextText","prevContainer","prevText","createSpatialTree","tree","toItems","offset","rect","all","clear","insert","remove","update","set","targets","replace","rectsByTarget","allRects","getAt","hits","getBoundsForAnnotation","getDOMRectsForAnnotation","indexed","hasValidRange","createTextAnnotatorState","defaultPointerAction","createStore","createSelectionState","createHoverState","createViewportState","addAnnotation","origin","Origin","revived","isValid","bulkAddAnnotation","couldNotRevive","updateTarget","bulkUpdateTargets","annotationId","getIntersecting","getAnnotationBounds","buffer","match","getIntersectingRects","groupedByAnnotationId","grouped","recalculatePositions","changes","created","deleted","updated","newValue","createPainter","provider","opts","trackedAnnotations","getAnnotationsForUser","user","metrics","labelWidth","labelHeight","paddingBottom","getScrollParent","el","overflowY","scrollIntoView","scrollParent","current","parentBounds","parentHeight","parentWidth","annotationBounds","offsetTop","offsetLeft","scrollTop","scrollLeft","getRandomValues","rnds8","rng","byteToHex","unsafeStringify","native","v4","options","buf","rnds","rangeToSelector","offsetReferenceSelector","rangeBefore","quote","SelectionHandler","currentUser","currentTarget","setUser","isLeftClick","lastPointerEvent","evt","uuidv4","debounceTimer","onSelectionChange","sel","ranges","idx","_b","_a","hovered","selected","createTextAnnotator","undoStack","createUndoStack","lifecycle","createLifecyleObserver","createAnonymousGuest","highlightLayer","selectionHandler","createBaseAnnotator","arg"],"mappings":"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","x_google_ignoreList":[4,5,6,13,14,15,16]}
|
|
1
|
+
{"version":3,"file":"text-annotator.umd.js","sources":["../src/highlight/HighlightPainter.ts","../src/highlight/trackViewport.ts","../src/highlight/highlightLayer.ts","../src/state/reviveTarget.ts","../../../node_modules/@annotorious/core/dist/annotorious-core.es.js","../../../node_modules/quickselect/index.js","../../../node_modules/rbush/index.js","../src/utils/mergeClientRects.ts","../src/utils/trimRange.ts","../src/state/spatialTree.ts","../src/state/TextAnnotatorState.ts","../src/presence/PresencePainter.ts","../src/api/scrollIntoView.ts","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../src/SelectionHandler.ts","../src/TextAnnotator.ts"],"sourcesContent":["import type { DrawingStyle } from '@annotorious/core';\nimport type { TextAnnotation } from '../model';\nimport type { Rect } from '../state';\n\nconst DEFAULT_STYLE = { fill: 'rgb(0, 128, 255', fillOpacity: 0.18 };\n\nconst DEFAULT_SELECTED_STYLE = { fill: 'rgb(0, 128, 255)', fillOpacity: 0.45 };\n\n/** \n * A painter implements the actual CANVAS highlight drawing logic.\n */\nexport type HighlightPainter = { \n \n paint( \n annotation: TextAnnotation,\n rects: Rect[], \n bg: CanvasRenderingContext2D,\n fg: CanvasRenderingContext2D,\n isSelected?: boolean,\n style?: DrawingStyle | ((annotation: TextAnnotation, selected?: boolean) => DrawingStyle)\n ): void;\n\n}\n\n/**\n * The default painter.\n */\nexport const defaultPainter: HighlightPainter = {\n\n paint: (annotation, rects, bg, fg, isSelected, drawingStyle) => {\n const style: HighlightStyle = drawingStyle ? \n typeof drawingStyle === 'function' ? drawingStyle(annotation, isSelected) : drawingStyle :\n isSelected ? DEFAULT_SELECTED_STYLE : \n DEFAULT_STYLE;\n\n bg.fillStyle = style.fill;\n bg.globalAlpha = style.fillOpacity || 1;\n \n rects.forEach(({ x, y, width, height }) => bg.fillRect(x, y - 2.5, width, height + 5));\n }\n\n}\n\nexport interface HighlightStyle {\n\n fill?: string;\n\n fillOpacity?: number;\n\n underline?: string;\n\n underlineOpacity?: number;\n\n underlineWidth?: number;\n\n}","import type { ViewportState } from '@annotorious/core';\nimport type { TextAnnotation } from '../model';\n\nexport const trackViewport = (viewport: ViewportState) => {\n let visible = new Set<string>();\n\n const onDraw = (annotations: TextAnnotation[]) => {\n const ids = annotations.map(a => a.id);\n\n if (visible.size !== ids.length || ids.some(id => !visible.has(id))) {\n viewport.set(ids);\n } \n\n visible = new Set(ids);\n }\n\n return onDraw;\n\n}","import type { DrawingStyle, Filter, ViewportState } from '@annotorious/core';\nimport type { TextAnnotation } from '../model';\nimport type { TextAnnotatorState } from '../state';\nimport { defaultPainter, type HighlightPainter } from './HighlightPainter';\nimport { trackViewport } from './trackViewport';\n\nimport './highlightLayer.css';\n\nconst debounce = <T extends (...args: any[]) => void>(func: T, delay: number = 10): T => {\n let timeoutId: number;\n\n return ((...args: any[]) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func.apply(this, args), delay);\n }) as T;\n}\n\nconst createCanvas = (className: string, highres?: boolean) => {\n const canvas = document.createElement('canvas');\n canvas.width = highres ? 2 * window.innerWidth : window.innerWidth;\n canvas.height = highres ? 2 * window.innerHeight : window.innerHeight;\n canvas.className = className;\n\n if (highres) {\n const context = canvas.getContext('2d');\n context.scale(2, 2);\n context.translate(0.5, 0.5);\n }\n\n return canvas;\n}\n\nconst resetCanvas = (canvas: HTMLCanvasElement, highres?: boolean) => {\n canvas.width = highres ? 2 * window.innerWidth : window.innerWidth;\n canvas.height = highres ? 2 * window.innerHeight : window.innerHeight;\n\n if (highres) {\n // Note that resizing the canvas resets the context\n const context = canvas.getContext('2d');\n context.scale(2, 2);\n context.translate(0.5, 0.5);\n }\n}\n\nexport const createHighlightLayer = (\n container: HTMLElement, \n state: TextAnnotatorState,\n viewport: ViewportState\n) => {\n\n const { store, selection, hover } = state;\n \n let currentStyle: DrawingStyle | ((annotation: TextAnnotation, selected?: boolean) => DrawingStyle) | undefined;\n\n let currentFilter: Filter | undefined;\n\n let currentPainter: HighlightPainter = defaultPainter;\n\n const onDraw = trackViewport(viewport);\n\n container.classList.add('r6o-annotatable');\n\n const bgCanvas = createCanvas('r6o-highlight-layer bg');\n const fgCanvas = createCanvas('r6o-highlight-layer fg', true);\n\n const bgContext = bgCanvas.getContext('2d');\n const fgContext = fgCanvas.getContext('2d');\n\n container.insertBefore(bgCanvas, container.firstChild);\n container.appendChild(fgCanvas);\n\n container.addEventListener('pointermove', (event: PointerEvent) => {\n const {x, y} = container.getBoundingClientRect();\n\n const hit = store.getAt(event.clientX - x, event.clientY - y);\n const isVisibleHit = hit && (!currentFilter || currentFilter(hit));\n\n if (isVisibleHit) {\n if (hover.current !== hit.id) {\n container.classList.add('hovered');\n hover.set(hit.id);\n }\n } else {\n if (hover.current) {\n container.classList.remove('hovered');\n hover.set(null);\n }\n }\n });\n\n const getViewport = () => {\n const { top, left } = container.getBoundingClientRect();\n\n const { innerWidth, innerHeight } = window;\n\n const minX = - left;\n const minY = - top;\n const maxX = innerWidth - left;\n const maxY = innerHeight - top;\n\n return { top, left, minX, minY, maxX, maxY };\n }\n\n const onScroll = () => redraw();\n\n document.addEventListener('scroll', onScroll, { capture: true, passive: true });\n\n const onResize = debounce(() => {\n resetCanvas(bgCanvas);\n resetCanvas(fgCanvas, true);\n\n store.recalculatePositions();\n\n redraw();\n });\n\n // Note that in cases where the element resized due to a \n // window resize, onResize will be triggered twice. This is\n // probably not a huge issue. But definitely an area for\n // future optimization. In terms of how to do this: there's \n // probably no ideal solution, but one straightforward way\n // would be to just set a flag in \n window.addEventListener('resize', onResize);\n\n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(container);\n\n const redraw = () => requestAnimationFrame(() => {\n const { top, left, minX, minY, maxX, maxY } = getViewport(); \n \n const annotationsInView = currentFilter\n ? store.getIntersectingRects(minX, minY, maxX, maxY).filter(({ annotation }) => currentFilter(annotation))\n : store.getIntersectingRects(minX, minY, maxX, maxY);\n\n const { width, height } = fgCanvas;\n\n // Get current selection\n const selectedIds = new Set(selection.selected.map(({ id }) => id));\n\n // New render loop - clear canvases\n fgContext.clearRect(-0.5, -0.5, width + 1, height + 1);\n bgContext.clearRect(-0.5, -0.5, width + 1, height + 1);\n \n annotationsInView.forEach(({ annotation, rects }) => {\n // Offset annotation rects by current scroll position\n const offsetRects = rects.map(({ x, y, width, height }) => ({ \n x: x + left, \n y: y + top, \n width, \n height \n }));\n\n const isSelected = selectedIds.has(annotation.id);\n currentPainter.paint(annotation, offsetRects, bgContext, fgContext, isSelected, currentStyle);\n });\n\n setTimeout(() => onDraw(annotationsInView.map(({ annotation }) => annotation)), 1);\n });\n\n store.observe(() => redraw());\n\n // Selection should only ever affect visible annotations,\n // need need for extra check\n selection.subscribe(() => redraw());\n\n const setDrawingStyle = (style: DrawingStyle | ((a: TextAnnotation, selected?: boolean) => DrawingStyle)) => {\n currentStyle = style;\n redraw();\n }\n\n const setFilter = (filter?: Filter) => {\n currentFilter = filter;\n redraw();\n } \n\n return {\n redraw,\n setDrawingStyle,\n setFilter,\n setPainter: (painter: HighlightPainter) => currentPainter = painter\n }\n\n}","import type { TextAnnotationTarget } from '../model';\n\n/**\n * Recalculates the DOM range from the given text annotation target.\n * \n * @param annotation the text annotation\n * @param container the HTML container of the annotated content\n * @returns the DOM range\n */\nexport const reviveTarget = (\n target: TextAnnotationTarget, \n container: HTMLElement\n): TextAnnotationTarget => { \n const { start, end } = target.selector;\n\n const offsetReference = target.selector.offsetReference ? target.selector.offsetReference : container;\n if (!offsetReference)\n return target;\n\n const iterator = document.createNodeIterator(container, NodeFilter.SHOW_TEXT);\n\n let runningOffset = 0;\n\n let range = document.createRange();\n\n let n = iterator.nextNode();\n if (n === null)\n console.error('Could not revive annotation target. Content missing.');\n\n // If there's no offset reference, start immediately\n let startCounting = !offsetReference;\n while (n !== null) {\n const len = n.textContent.length;\n\n if (!startCounting && offsetReference)\n startCounting = offsetReference.contains(n);\n\n if (startCounting) {\n if (runningOffset + len > start) {\n range.setStart(n, start - runningOffset);\n break;\n }\n \n runningOffset += len; \n }\n\n n = iterator.nextNode();\n }\n\n // set range end\n while (n !== null) {\n const len = n.textContent.length;\n\n if (runningOffset + len > end) {\n range.setEnd(n, end - runningOffset);\n break;\n }\n\n runningOffset += len;\n\n n = iterator.nextNode();\n }\n\n return {\n ...target,\n selector: { \n ...target.selector,\n range\n }\n }\n}\n","var Y = Object.prototype.hasOwnProperty;\nfunction x(e, n) {\n var t, o;\n if (e === n)\n return !0;\n if (e && n && (t = e.constructor) === n.constructor) {\n if (t === Date)\n return e.getTime() === n.getTime();\n if (t === RegExp)\n return e.toString() === n.toString();\n if (t === Array) {\n if ((o = e.length) === n.length)\n for (; o-- && x(e[o], n[o]); )\n ;\n return o === -1;\n }\n if (!t || typeof e == \"object\") {\n o = 0;\n for (t in e)\n if (Y.call(e, t) && ++o && !Y.call(n, t) || !(t in n) || !x(e[t], n[t]))\n return !1;\n return Object.keys(n).length === o;\n }\n }\n return e !== e && n !== n;\n}\nfunction $() {\n}\nfunction W(e, n) {\n return e != e ? n == n : e !== n || e && typeof e == \"object\" || typeof e == \"function\";\n}\nconst k = [];\nfunction _(e, n = $) {\n let t;\n const o = /* @__PURE__ */ new Set();\n function i(b) {\n if (W(e, b) && (e = b, t)) {\n const w = !k.length;\n for (const u of o)\n u[1](), k.push(u, e);\n if (w) {\n for (let u = 0; u < k.length; u += 2)\n k[u][0](k[u + 1]);\n k.length = 0;\n }\n }\n }\n function p(b) {\n i(b(e));\n }\n function U(b, w = $) {\n const u = [b, w];\n return o.add(u), o.size === 1 && (t = n(i, p) || $), b(e), () => {\n o.delete(u), o.size === 0 && t && (t(), t = null);\n };\n }\n return { set: i, update: p, subscribe: U };\n}\nconst be = (e) => {\n const { subscribe: n, set: t } = _();\n let o;\n return n((i) => o = i), e.observe(({ changes: i }) => {\n if (o) {\n (i.deleted || []).some((b) => b.id === o) && t(void 0);\n const U = (i.updated || []).find(({ oldValue: b }) => b.id === o);\n U && t(U.newValue.id);\n }\n }), {\n get current() {\n return o;\n },\n subscribe: n,\n set: t\n };\n};\nvar q = /* @__PURE__ */ ((e) => (e.EDIT = \"EDIT\", e.SELECT = \"SELECT\", e.NONE = \"NONE\", e))(q || {});\nconst V = { selected: [] }, ve = (e, n = \"EDIT\") => {\n const { subscribe: t, set: o } = _(V);\n let i = V;\n t((s) => i = s);\n const p = () => o(V), U = () => {\n var s;\n return ((s = i.selected) == null ? void 0 : s.length) === 0;\n }, b = (s) => {\n if (i.selected.length === 0)\n return !1;\n const g = typeof s == \"string\" ? s : s.id;\n return i.selected.some((y) => y.id === g);\n }, w = (s, g) => {\n const y = e.getAnnotation(s);\n if (y) {\n const A = G(y, n);\n o(A === \"EDIT\" ? { selected: [{ id: s, editable: !0 }], pointerEvent: g } : A === \"SELECT\" ? { selected: [{ id: s }], pointerEvent: g } : { selected: [], pointerEvent: g });\n } else\n console.warn(\"Invalid selection: \" + s);\n }, u = (s, g = !0) => {\n const y = Array.isArray(s) ? s : [s], A = y.map((O) => e.getAnnotation(O)).filter(Boolean);\n o({ selected: A.map(({ id: O }) => ({ id: O, editable: g })) }), A.length !== y.length && console.warn(\"Invalid selection\", s);\n }, S = (s) => {\n if (i.selected.length === 0)\n return !1;\n const { selected: g } = i;\n g.filter(({ id: A }) => s.includes(A)).length > 0 && o({ selected: g.filter(({ id: A }) => !s.includes(A)) });\n };\n return e.observe(({ changes: s }) => S((s.deleted || []).map((g) => g.id))), {\n clear: p,\n clickSelect: w,\n get selected() {\n return i ? [...i.selected] : null;\n },\n get pointerEvent() {\n return i ? i.pointerEvent : null;\n },\n isEmpty: U,\n isSelected: b,\n setSelected: u,\n subscribe: t\n };\n}, G = (e, n) => typeof n == \"function\" ? n(e) || \"EDIT\" : n || \"EDIT\";\nlet z;\nconst H = new Uint8Array(16);\nfunction F() {\n if (!z && (z = typeof crypto < \"u\" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !z))\n throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");\n return z(H);\n}\nconst R = [];\nfor (let e = 0; e < 256; ++e)\n R.push((e + 256).toString(16).slice(1));\nfunction J(e, n = 0) {\n return R[e[n + 0]] + R[e[n + 1]] + R[e[n + 2]] + R[e[n + 3]] + \"-\" + R[e[n + 4]] + R[e[n + 5]] + \"-\" + R[e[n + 6]] + R[e[n + 7]] + \"-\" + R[e[n + 8]] + R[e[n + 9]] + \"-\" + R[e[n + 10]] + R[e[n + 11]] + R[e[n + 12]] + R[e[n + 13]] + R[e[n + 14]] + R[e[n + 15]];\n}\nconst Q = typeof crypto < \"u\" && crypto.randomUUID && crypto.randomUUID.bind(crypto), j = {\n randomUUID: Q\n};\nfunction X(e, n, t) {\n if (j.randomUUID && !n && !e)\n return j.randomUUID();\n e = e || {};\n const o = e.random || (e.rng || F)();\n if (o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, n) {\n t = t || 0;\n for (let i = 0; i < 16; ++i)\n n[t + i] = o[i];\n return n;\n }\n return J(o);\n}\nconst Ce = (e) => {\n const { creator: n, updatedBy: t } = e.target, o = e.bodies.reduce((i, p) => [...i, p.creator, p.updatedBy].filter(Boolean), []);\n return [\n n,\n t,\n ...o\n ].filter((i) => i);\n}, we = (e, n, t, o) => ({\n id: X(),\n annotation: e.id,\n created: t || /* @__PURE__ */ new Date(),\n creator: o,\n ...n\n}), Z = (e, n) => {\n const t = new Set(e.bodies.map((o) => o.id));\n return n.bodies.filter((o) => !t.has(o.id));\n}, K = (e, n) => {\n const t = new Set(n.bodies.map((o) => o.id));\n return e.bodies.filter((o) => !t.has(o.id));\n}, ee = (e, n) => n.bodies.map((t) => {\n const o = e.bodies.find((i) => i.id === t.id);\n return { newBody: t, oldBody: o && !x(o, t) ? o : void 0 };\n}).filter(({ oldBody: t }) => t).map(({ oldBody: t, newBody: o }) => ({ oldBody: t, newBody: o })), te = (e, n) => !x(e.target, n.target), M = (e, n) => {\n const t = Z(e, n), o = K(e, n), i = ee(e, n);\n return {\n oldValue: e,\n newValue: n,\n bodiesCreated: t.length > 0 ? t : void 0,\n bodiesDeleted: o.length > 0 ? o : void 0,\n bodiesUpdated: i.length > 0 ? i : void 0,\n targetUpdated: te(e, n) ? { oldTarget: e.target, newTarget: n.target } : void 0\n };\n};\nvar ne = /* @__PURE__ */ ((e) => (e.BODY_ONLY = \"BODY_ONLY\", e.TARGET_ONLY = \"TARGET_ONLY\", e))(ne || {}), T = /* @__PURE__ */ ((e) => (e.LOCAL = \"LOCAL\", e.REMOTE = \"REMOTE\", e))(T || {});\nconst oe = (e, n) => {\n var p, U;\n const { changes: t, origin: o } = n;\n if (!(!e.options.origin || e.options.origin === o))\n return !1;\n if (e.options.ignore) {\n const { ignore: b } = e.options, w = (S) => S && S.length > 0;\n if (!(w(t.created) || w(t.deleted))) {\n const S = (p = t.updated) == null ? void 0 : p.some((g) => w(g.bodiesCreated) || w(g.bodiesDeleted) || w(g.bodiesUpdated)), s = (U = t.updated) == null ? void 0 : U.some((g) => g.targetUpdated);\n if (b === \"BODY_ONLY\" && S && !s || b === \"TARGET_ONLY\" && s && !S)\n return !1;\n }\n }\n if (e.options.annotations) {\n const b = /* @__PURE__ */ new Set([\n ...(t.created || []).map((u) => u.id),\n ...(t.deleted || []).map((u) => u.id),\n ...(t.updated || []).map(({ oldValue: u }) => u.id)\n ]);\n return !!(Array.isArray(e.options.annotations) ? e.options.annotations : [e.options.annotations]).find((u) => b.has(u));\n } else\n return !0;\n}, se = (e, n) => {\n const t = new Set((e.created || []).map((s) => s.id)), o = new Set((e.updated || []).map(({ newValue: s }) => s.id)), i = new Set((n.created || []).map((s) => s.id)), p = new Set((n.deleted || []).map((s) => s.id)), U = new Set((n.updated || []).map(({ oldValue: s }) => s.id)), b = new Set((n.updated || []).filter(({ oldValue: s }) => t.has(s.id) || o.has(s.id)).map(({ oldValue: s }) => s.id)), w = [\n ...(e.created || []).filter((s) => !p.has(s.id)).map((s) => U.has(s.id) ? n.updated.find(({ oldValue: g }) => g.id === s.id).newValue : s),\n ...n.created || []\n ], u = [\n ...(e.deleted || []).filter((s) => !i.has(s.id)),\n ...(n.deleted || []).filter((s) => !t.has(s.id))\n ], S = [\n ...(e.updated || []).filter(({ newValue: s }) => !p.has(s.id)).map((s) => {\n const { oldValue: g, newValue: y } = s;\n if (U.has(y.id)) {\n const A = n.updated.find((O) => O.oldValue.id === y.id).newValue;\n return M(g, A);\n } else\n return s;\n }),\n ...(n.updated || []).filter(({ oldValue: s }) => !b.has(s.id))\n ];\n return { created: w, deleted: u, updated: S };\n}, ie = (e) => e.id !== void 0, ye = () => {\n const e = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), t = [], o = (d, l = {}) => t.push({ onChange: d, options: l }), i = (d) => {\n const l = t.findIndex((c) => c.onChange == d);\n l > -1 && t.splice(l, 1);\n }, p = (d, l) => {\n const c = {\n origin: d,\n changes: {\n created: l.created || [],\n updated: l.updated || [],\n deleted: l.deleted || []\n },\n state: [...e.values()]\n };\n t.forEach((f) => {\n oe(f, c) && f.onChange(c);\n });\n }, U = (d, l = T.LOCAL) => {\n if (e.get(d.id))\n throw Error(`Cannot add annotation ${d.id} - exists already`);\n e.set(d.id, d), d.bodies.forEach((f) => n.set(f.id, d.id)), p(l, { created: [d] });\n }, b = (d, l) => {\n const c = typeof d == \"string\" ? l : d, f = typeof d == \"string\" ? d : d.id, v = e.get(f);\n if (v) {\n const D = M(v, c);\n return f === c.id ? e.set(f, c) : (e.delete(f), e.set(c.id, c)), v.bodies.forEach((B) => n.delete(B.id)), c.bodies.forEach((B) => n.set(B.id, c.id)), D;\n } else\n console.warn(`Cannot update annotation ${f} - does not exist`);\n }, w = (d, l = T.LOCAL, c = T.LOCAL) => {\n const f = ie(l) ? c : l, v = b(d, l);\n v && p(f, { updated: [v] });\n }, u = (d, l = T.LOCAL) => {\n const c = d.reduce((f, v) => {\n const D = b(v);\n return D ? [...f, D] : f;\n }, []);\n c.length > 0 && p(l, { updated: c });\n }, S = (d, l = T.LOCAL) => {\n const c = e.get(d.annotation);\n if (c) {\n const f = {\n ...c,\n bodies: [...c.bodies, d]\n };\n e.set(c.id, f), n.set(d.id, f.id), p(l, { updated: [{\n oldValue: c,\n newValue: f,\n bodiesCreated: [d]\n }] });\n } else\n console.warn(`Attempt to add body to missing annotation: ${d.annotation}`);\n }, s = () => [...e.values()], g = (d = T.LOCAL) => {\n const l = [...e.values()];\n e.clear(), n.clear(), p(d, { deleted: l });\n }, y = (d, l = !0, c = T.LOCAL) => {\n if (l) {\n const f = [...e.values()];\n e.clear(), n.clear(), d.forEach((v) => {\n e.set(v.id, v), v.bodies.forEach((D) => n.set(D.id, v.id));\n }), p(c, { created: d, deleted: f });\n } else {\n const f = d.reduce((v, D) => {\n const B = e.get(D.id);\n return B ? [...v, B] : v;\n }, []);\n if (f.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${f.map((v) => v.id).join(\", \")}`);\n d.forEach((v) => {\n e.set(v.id, v), v.bodies.forEach((D) => n.set(D.id, v.id));\n }), p(c, { created: d });\n }\n }, A = (d) => {\n const l = typeof d == \"string\" ? d : d.id, c = e.get(l);\n if (c)\n return e.delete(l), c.bodies.forEach((f) => n.delete(f.id)), c;\n console.warn(`Attempt to delete missing annotation: ${l}`);\n }, O = (d, l = T.LOCAL) => {\n const c = A(d);\n c && p(l, { deleted: [c] });\n }, C = (d, l = T.LOCAL) => {\n const c = d.reduce((f, v) => {\n const D = A(v);\n return D ? [...f, D] : f;\n }, []);\n c.length > 0 && p(l, { deleted: c });\n }, a = (d, l = T.LOCAL) => {\n const c = e.get(d.annotation);\n if (c) {\n const f = c.bodies.find((v) => v.id === d.id);\n if (f) {\n n.delete(f.id);\n const v = {\n ...c,\n bodies: c.bodies.filter((B) => B.id !== d.id)\n };\n e.set(c.id, v), p(l, { updated: [{\n oldValue: c,\n newValue: v,\n bodiesDeleted: [f]\n }] });\n } else\n console.warn(`Attempt to delete missing body ${d.id} from annotation ${d.annotation}`);\n } else\n console.warn(`Attempt to delete body from missing annotation ${d.annotation}`);\n }, m = (d) => {\n const l = e.get(d);\n return l ? { ...l } : void 0;\n }, r = (d) => {\n const l = n.get(d);\n if (l) {\n const f = m(l).bodies.find((v) => v.id === d);\n if (f)\n return f;\n console.error(`Store integrity error: body ${d} in index, but not in annotation`);\n } else\n console.warn(`Attempt to retrieve missing body: ${d}`);\n }, E = (d, l) => {\n if (d.annotation !== l.annotation)\n throw \"Annotation integrity violation: annotation ID must be the same when updating bodies\";\n const c = e.get(d.annotation);\n if (c) {\n const f = c.bodies.find((D) => D.id === d.id), v = {\n ...c,\n bodies: c.bodies.map((D) => D.id === f.id ? l : D)\n };\n return e.set(c.id, v), f.id !== l.id && (n.delete(f.id), n.set(l.id, v.id)), {\n oldValue: c,\n newValue: v,\n bodiesUpdated: [{ oldBody: f, newBody: l }]\n };\n } else\n console.warn(`Attempt to add body to missing annotation ${d.annotation}`);\n }, h = (d, l, c = T.LOCAL) => {\n const f = E(d, l);\n f && p(c, { updated: [f] });\n }, L = (d, l = T.LOCAL) => {\n const c = d.map((f) => E({ id: f.id, annotation: f.annotation }, f)).filter(Boolean);\n p(l, { updated: c });\n }, I = (d) => {\n const l = e.get(d.annotation);\n if (l) {\n const c = {\n ...l,\n target: {\n ...l.target,\n ...d\n }\n };\n return e.set(l.id, c), {\n oldValue: l,\n newValue: c,\n targetUpdated: {\n oldTarget: l.target,\n newTarget: d\n }\n };\n } else\n console.warn(`Attempt to update target on missing annotation: ${d.annotation}`);\n };\n return {\n addAnnotation: U,\n addBody: S,\n all: s,\n bulkAddAnnotation: y,\n bulkDeleteAnnotation: C,\n bulkUpdateAnnotation: u,\n bulkUpdateBodies: L,\n bulkUpdateTargets: (d, l = T.LOCAL) => {\n const c = d.map((f) => I(f)).filter(Boolean);\n c.length > 0 && p(l, { updated: c });\n },\n clear: g,\n deleteAnnotation: O,\n deleteBody: a,\n getAnnotation: m,\n getBody: r,\n observe: o,\n unobserve: i,\n updateAnnotation: w,\n updateBody: h,\n updateTarget: (d, l = T.LOCAL) => {\n const c = I(d);\n c && p(l, { updated: [c] });\n }\n };\n}, Ue = (e) => ({\n ...e,\n subscribe: (t) => {\n const o = (i) => t(i.state);\n return e.observe(o), t(e.all()), () => e.unobserve(o);\n }\n});\nlet P = () => ({\n emit(e, ...n) {\n for (let t = 0, o = this.events[e] || [], i = o.length; t < i; t++)\n o[t](...n);\n },\n events: {},\n on(e, n) {\n var t;\n return ((t = this.events)[e] || (t[e] = [])).push(n), () => {\n var o;\n this.events[e] = (o = this.events[e]) == null ? void 0 : o.filter((i) => n !== i);\n };\n }\n});\nconst de = 250, Le = (e) => {\n const n = P(), t = [];\n let o = -1, i = !1, p = 0;\n const U = (r) => {\n if (!i) {\n const { changes: E } = r, h = performance.now();\n if (h - p > de)\n t.splice(o + 1), t.push(E), o = t.length - 1;\n else {\n const L = t.length - 1;\n t[L] = se(t[L], E);\n }\n p = h;\n }\n i = !1;\n };\n e.observe(U, { origin: T.LOCAL });\n const b = (r) => r && r.length > 0 && e.bulkDeleteAnnotation(r), w = (r) => r && r.length > 0 && e.bulkAddAnnotation(r, !1), u = (r) => r && r.length > 0 && e.bulkUpdateAnnotation(r.map(({ oldValue: E }) => E)), S = (r) => r && r.length > 0 && e.bulkUpdateAnnotation(r.map(({ newValue: E }) => E)), s = (r) => r && r.length > 0 && e.bulkAddAnnotation(r, !1), g = (r) => r && r.length > 0 && e.bulkDeleteAnnotation(r);\n return {\n canRedo: () => t.length - 1 > o,\n canUndo: () => o > -1,\n destroy: () => e.unobserve(U),\n on: (r, E) => n.on(r, E),\n redo: () => {\n if (t.length - 1 > o) {\n i = !0;\n const { created: r, updated: E, deleted: h } = t[o + 1];\n w(r), S(E), g(h), n.emit(\"redo\", t[o + 1]), o += 1;\n }\n },\n undo: () => {\n if (o > -1) {\n i = !0;\n const { created: r, updated: E, deleted: h } = t[o];\n b(r), u(E), s(h), n.emit(\"undo\", t[o]), o -= 1;\n }\n }\n };\n}, Se = () => {\n const { subscribe: e, set: n } = _([]);\n return {\n subscribe: e,\n set: n\n };\n}, Oe = (e, n, t, o) => {\n const { store: i, selection: p, hover: U, viewport: b } = e, w = /* @__PURE__ */ new Map();\n let u = [], S, s;\n const g = (a, m) => {\n w.has(a) ? w.get(a).push(m) : w.set(a, [m]);\n }, y = (a, m) => {\n const r = w.get(a);\n r && r.indexOf(m) > 0 && r.splice(r.indexOf(m), 1);\n }, A = (a, m, r) => {\n w.has(a) && setTimeout(() => {\n w.get(a).forEach((E) => {\n if (t) {\n const h = Array.isArray(m) ? m.map((I) => t.serialize(I)) : t.serialize(m), L = r ? r instanceof PointerEvent ? r : t.serialize(r) : void 0;\n E(h, L);\n } else\n E(m, r);\n });\n }, 1);\n }, O = () => {\n const { selected: a } = p, m = (a || []).map(({ id: r }) => i.getAnnotation(r));\n m.forEach((r) => {\n const E = u.find((h) => h.id === r.id);\n (!E || !x(E, r)) && A(\"updateAnnotation\", r, E);\n }), u = u.map((r) => {\n const E = m.find(({ id: h }) => h === r.id);\n return E || r;\n });\n };\n p.subscribe(({ selected: a }) => {\n if (!(u.length === 0 && a.length === 0)) {\n if (u.length === 0 && a.length > 0)\n u = a.map(({ id: m }) => i.getAnnotation(m));\n else if (u.length > 0 && a.length === 0)\n u.forEach((m) => {\n const r = i.getAnnotation(m.id);\n r && !x(r, m) && A(\"updateAnnotation\", r, m);\n }), u = [];\n else {\n const m = new Set(u.map((h) => h.id)), r = new Set(a.map(({ id: h }) => h));\n u.filter((h) => !r.has(h.id)).forEach((h) => {\n const L = i.getAnnotation(h.id);\n L && !x(L, h) && A(\"updateAnnotation\", L, h);\n }), u = [\n // Remove annotations that were deselected\n ...u.filter((h) => r.has(h.id)),\n // Add editable annotations that were selected\n ...a.filter(({ id: h }) => !m.has(h)).map(({ id: h }) => i.getAnnotation(h))\n ];\n }\n A(\"selectionChanged\", u);\n }\n }), U.subscribe((a) => {\n !S && a ? A(\"mouseEnterAnnotation\", i.getAnnotation(a)) : S && !a ? A(\"mouseLeaveAnnotation\", i.getAnnotation(S)) : S && a && (A(\"mouseLeaveAnnotation\", i.getAnnotation(S)), A(\"mouseEnterAnnotation\", i.getAnnotation(a))), S = a;\n }), b == null || b.subscribe((a) => A(\"viewportIntersect\", a.map((m) => i.getAnnotation(m)))), i.observe((a) => {\n o && (s && clearTimeout(s), s = setTimeout(O, 1e3));\n const { created: m, deleted: r } = a.changes;\n (m || []).forEach((h) => A(\"createAnnotation\", h)), (r || []).forEach((h) => A(\"deleteAnnotation\", h)), (a.changes.updated || []).filter((h) => [\n ...h.bodiesCreated || [],\n ...h.bodiesDeleted || [],\n ...h.bodiesUpdated || []\n ].length > 0).forEach(({ oldValue: h, newValue: L }) => {\n const I = u.find((N) => N.id === h.id) || h;\n u = u.map((N) => N.id === h.id ? L : N), A(\"updateAnnotation\", L, I);\n });\n }, { origin: T.LOCAL }), i.observe((a) => {\n if (u) {\n const m = new Set(u.map((E) => E.id)), r = (a.changes.updated || []).filter(({ newValue: E }) => m.has(E.id)).map(({ newValue: E }) => E);\n r.length > 0 && (u = u.map((E) => {\n const h = r.find((L) => L.id === E.id);\n return h || E;\n }));\n }\n }, { origin: T.REMOTE });\n const C = (a) => (m) => {\n const { created: r, deleted: E, updated: h } = m;\n (r || []).forEach((L) => A(\"createAnnotation\", L)), (E || []).forEach((L) => A(\"deleteAnnotation\", L)), a ? (h || []).forEach((L) => A(\"updateAnnotation\", L.oldValue, L.newValue)) : (h || []).forEach((L) => A(\"updateAnnotation\", L.newValue, L.oldValue));\n };\n return n.on(\"undo\", C(!0)), n.on(\"redo\", C(!1)), { on: g, off: y, emit: A };\n}, Te = (e) => (n) => n.map((t) => e.serialize(t)), re = (e) => (n) => n.reduce((t, o) => {\n const { parsed: i, error: p } = e.parse(o);\n return p ? {\n parsed: t.parsed,\n failed: [...t.failed, o]\n } : i ? {\n parsed: [...t.parsed, i],\n failed: t.failed\n } : {\n ...t\n };\n}, { parsed: [], failed: [] }), De = (e, n, t) => {\n const { store: o, selection: i } = e, p = (C) => {\n if (t) {\n const { parsed: a, error: m } = t.parse(C);\n a ? o.addAnnotation(a, T.REMOTE) : console.error(m);\n } else\n o.addAnnotation(C, T.REMOTE);\n }, U = () => i.clear(), b = () => o.clear(), w = (C) => {\n const a = o.getAnnotation(C);\n return t && a ? t.serialize(a) : a;\n }, u = () => t ? o.all().map(t.serialize) : o.all(), S = () => {\n var m;\n const a = (((m = i.selected) == null ? void 0 : m.map((r) => r.id)) || []).map((r) => o.getAnnotation(r)).filter(Boolean);\n return t ? a.map(t.serialize) : a;\n }, s = (C) => fetch(C).then((a) => a.json()).then((a) => (y(a), a)), g = (C) => {\n if (typeof C == \"string\") {\n const a = o.getAnnotation(C);\n if (o.deleteAnnotation(C), a)\n return t ? t.serialize(a) : a;\n } else {\n const a = t ? t.parse(C).parsed : C;\n if (a)\n return o.deleteAnnotation(a), C;\n }\n }, y = (C) => {\n if (t) {\n const { parsed: a, failed: m } = re(t)(C);\n m.length > 0 && console.warn(`Discarded ${m.length} invalid annotations`, m), o.bulkAddAnnotation(a, !0, T.REMOTE);\n } else\n o.bulkAddAnnotation(C, !0, T.REMOTE);\n }, A = (C) => {\n C ? i.setSelected(C) : i.clear();\n }, O = (C) => {\n if (t) {\n const a = t.parse(C).parsed, m = t.serialize(o.getAnnotation(a.id));\n return o.updateAnnotation(a), m;\n } else {\n const a = o.getAnnotation(C.id);\n return o.updateAnnotation(C), a;\n }\n };\n return {\n addAnnotation: p,\n cancelSelected: U,\n canRedo: n.canRedo,\n canUndo: n.canUndo,\n clearAnnotations: b,\n getAnnotationById: w,\n getAnnotations: u,\n getSelected: S,\n loadAnnotations: s,\n redo: n.redo,\n removeAnnotation: g,\n setAnnotations: y,\n setSelected: A,\n undo: n.undo,\n updateAnnotation: O\n };\n};\nlet ae = (e) => crypto.getRandomValues(new Uint8Array(e)), ce = (e, n, t) => {\n let o = (2 << Math.log(e.length - 1) / Math.LN2) - 1, i = -~(1.6 * o * n / e.length);\n return (p = n) => {\n let U = \"\";\n for (; ; ) {\n let b = t(i), w = i;\n for (; w--; )\n if (U += e[b[w] & o] || \"\", U.length === p)\n return U;\n }\n };\n}, le = (e, n = 21) => ce(e, n, ae), ue = (e = 21) => crypto.getRandomValues(new Uint8Array(e)).reduce((n, t) => (t &= 63, t < 36 ? n += t.toString(36) : t < 62 ? n += (t - 26).toString(36).toUpperCase() : t > 62 ? n += \"-\" : n += \"_\", n), \"\");\nconst Re = () => ({ isGuest: !0, id: le(\"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_\", 20)() }), fe = (e) => {\n const n = JSON.stringify(e);\n let t = 0;\n for (let o = 0, i = n.length; o < i; o++) {\n let p = n.charCodeAt(o);\n t = (t << 5) - t + p, t |= 0;\n }\n return `${t}`;\n}, pe = (e) => e ? typeof e == \"object\" ? { ...e } : e : void 0, Be = (e, n) => (Array.isArray(e) ? e : [e]).map((t) => {\n const { id: o, type: i, purpose: p, value: U, created: b, creator: w, ...u } = t;\n return {\n id: o || `temp-${fe(t)}`,\n annotation: n,\n type: i,\n purpose: p,\n value: U,\n created: b ? new Date(b) : void 0,\n creator: pe(w),\n ...u\n };\n}), xe = (e) => e.map((n) => {\n var o, i;\n const t = { ...n };\n return delete t.annotation, (o = t.id) != null && o.startsWith(\"temp-\") && delete t.id, { ...t, created: (i = t.created) == null ? void 0 : i.toISOString() };\n}), ge = [\n \"#ff7c00\",\n // orange\n \"#1ac938\",\n // green\n \"#e8000b\",\n // red\n \"#8b2be2\",\n // purple\n \"#9f4800\",\n // brown\n \"#f14cc1\",\n // pink\n \"#ffc400\",\n // khaki\n \"#00d7ff\",\n // cyan\n \"#023eff\"\n // blue\n], he = () => {\n const e = [...ge];\n return { assignRandomColor: () => {\n const o = Math.floor(Math.random() * e.length), i = e[o];\n return e.splice(o, 1), i;\n }, releaseColor: (o) => e.push(o) };\n}, me = () => {\n const e = he();\n return { addUser: (o, i) => {\n const p = e.assignRandomColor();\n return {\n label: i.name || i.id,\n avatar: i.avatar,\n color: p\n };\n }, removeUser: (o) => e.releaseColor(o.appearance.color) };\n}, Ae = (e, n) => e.every((t) => e.includes(t)) && n.every((t) => e.includes(t)), Ie = ue(), ke = (e = me()) => {\n const n = P(), t = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), i = (s, g) => {\n if (t.has(s)) {\n console.warn(\"Attempt to add user that is already present\", s, g);\n return;\n }\n const y = e.addUser(s, g);\n t.set(s, {\n ...g,\n presenceKey: s,\n appearance: y\n });\n }, p = (s) => {\n const g = t.get(s);\n if (!g) {\n console.warn(\"Attempt to remove user that is not present\", s);\n return;\n }\n e.removeUser(g), t.delete(s);\n }, U = (s) => {\n const g = new Set(s.map((O) => O.presenceKey)), y = s.filter(({ presenceKey: O }) => !t.has(O)), A = Array.from(t.values()).filter((O) => !g.has(O.presenceKey));\n y.forEach(({ presenceKey: O, user: C }) => i(O, C)), A.forEach((O) => {\n const { presenceKey: C } = O;\n o.has(C) && n.emit(\"selectionChange\", O, null), p(C);\n }), (y.length > 0 || A.length > 0) && n.emit(\"presence\", u());\n }, b = (s, g) => {\n const y = t.get(s);\n if (!y) {\n console.warn(\"Activity notification from user that is not present\");\n return;\n }\n const A = o.get(s);\n (!A || !Ae(A, g)) && (o.set(s, g), n.emit(\"selectionChange\", y, g));\n }, w = (s, g) => {\n const y = t.get(s);\n if (!y) {\n console.warn(\"Selection change for user that is not present\", s);\n return;\n }\n g ? o.set(s, g) : o.delete(s), n.emit(\"selectionChange\", y, g);\n }, u = () => [...Array.from(t.values())];\n return {\n getPresentUsers: u,\n notifyActivity: b,\n on: (s, g) => n.on(s, g),\n syncUsers: U,\n updateSelection: w\n };\n};\nexport {\n ne as Ignore,\n T as Origin,\n Ie as PRESENCE_KEY,\n q as PointerSelectAction,\n Re as createAnonymousGuest,\n De as createBaseAnnotator,\n we as createBody,\n me as createDefaultAppearenceProvider,\n be as createHoverState,\n Oe as createLifecyleObserver,\n ke as createPresenceState,\n ve as createSelectionState,\n ye as createStore,\n Le as createUndoStack,\n Se as createViewportState,\n he as defaultColorProvider,\n M as diffAnnotations,\n Ce as getContributors,\n se as mergeChanges,\n G as onPointerSelect,\n re as parseAll,\n Be as parseW3CBodies,\n pe as parseW3CUser,\n Te as serializeAll,\n xe as serializeW3CBodies,\n oe as shouldNotify,\n Ue as toSvelteStore\n};\n//# sourceMappingURL=annotorious-core.es.js.map\n","\nexport default function quickselect(arr, k, left, right, compare) {\n quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);\n}\n\nfunction quickselectStep(arr, k, left, right, compare) {\n\n while (right > left) {\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp(2 * z / 3);\n var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n quickselectStep(arr, k, newLeft, newRight, compare);\n }\n\n var t = arr[k];\n var i = left;\n var j = right;\n\n swap(arr, left, k);\n if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (compare(arr[i], t) < 0) i++;\n while (compare(arr[j], t) > 0) j--;\n }\n\n if (compare(arr[left], t) === 0) swap(arr, left, j);\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","import quickselect from 'quickselect';\n\nexport default class RBush {\n constructor(maxEntries = 9) {\n // max entries in a node is 9 by default; min node fill is 40% for best performance\n this._maxEntries = Math.max(4, maxEntries);\n this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));\n this.clear();\n }\n\n all() {\n return this._all(this.data, []);\n }\n\n search(bbox) {\n let node = this.data;\n const result = [];\n\n if (!intersects(bbox, node)) return result;\n\n const toBBox = this.toBBox;\n const nodesToSearch = [];\n\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf) result.push(child);\n else if (contains(bbox, childBBox)) this._all(child, result);\n else nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return result;\n }\n\n collides(bbox) {\n let node = this.data;\n\n if (!intersects(bbox, node)) return false;\n\n const nodesToSearch = [];\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? this.toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf || contains(bbox, childBBox)) return true;\n nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return false;\n }\n\n load(data) {\n if (!(data && data.length)) return this;\n\n if (data.length < this._minEntries) {\n for (let i = 0; i < data.length; i++) {\n this.insert(data[i]);\n }\n return this;\n }\n\n // recursively build the tree with the given data from scratch using OMT algorithm\n let node = this._build(data.slice(), 0, data.length - 1, 0);\n\n if (!this.data.children.length) {\n // save as is if tree is empty\n this.data = node;\n\n } else if (this.data.height === node.height) {\n // split root if trees have the same height\n this._splitRoot(this.data, node);\n\n } else {\n if (this.data.height < node.height) {\n // swap trees if inserted one is bigger\n const tmpNode = this.data;\n this.data = node;\n node = tmpNode;\n }\n\n // insert the small tree into the large tree at appropriate level\n this._insert(node, this.data.height - node.height - 1, true);\n }\n\n return this;\n }\n\n insert(item) {\n if (item) this._insert(item, this.data.height - 1);\n return this;\n }\n\n clear() {\n this.data = createNode([]);\n return this;\n }\n\n remove(item, equalsFn) {\n if (!item) return this;\n\n let node = this.data;\n const bbox = this.toBBox(item);\n const path = [];\n const indexes = [];\n let i, parent, goingUp;\n\n // depth-first iterative tree traversal\n while (node || path.length) {\n\n if (!node) { // go up\n node = path.pop();\n parent = path[path.length - 1];\n i = indexes.pop();\n goingUp = true;\n }\n\n if (node.leaf) { // check current node\n const index = findItem(item, node.children, equalsFn);\n\n if (index !== -1) {\n // item found, remove the item and condense tree upwards\n node.children.splice(index, 1);\n path.push(node);\n this._condense(path);\n return this;\n }\n }\n\n if (!goingUp && !node.leaf && contains(node, bbox)) { // go down\n path.push(node);\n indexes.push(i);\n i = 0;\n parent = node;\n node = node.children[0];\n\n } else if (parent) { // go right\n i++;\n node = parent.children[i];\n goingUp = false;\n\n } else node = null; // nothing found\n }\n\n return this;\n }\n\n toBBox(item) { return item; }\n\n compareMinX(a, b) { return a.minX - b.minX; }\n compareMinY(a, b) { return a.minY - b.minY; }\n\n toJSON() { return this.data; }\n\n fromJSON(data) {\n this.data = data;\n return this;\n }\n\n _all(node, result) {\n const nodesToSearch = [];\n while (node) {\n if (node.leaf) result.push(...node.children);\n else nodesToSearch.push(...node.children);\n\n node = nodesToSearch.pop();\n }\n return result;\n }\n\n _build(items, left, right, height) {\n\n const N = right - left + 1;\n let M = this._maxEntries;\n let node;\n\n if (N <= M) {\n // reached leaf level; return leaf\n node = createNode(items.slice(left, right + 1));\n calcBBox(node, this.toBBox);\n return node;\n }\n\n if (!height) {\n // target height of the bulk-loaded tree\n height = Math.ceil(Math.log(N) / Math.log(M));\n\n // target number of root entries to maximize storage utilization\n M = Math.ceil(N / Math.pow(M, height - 1));\n }\n\n node = createNode([]);\n node.leaf = false;\n node.height = height;\n\n // split the items into M mostly square tiles\n\n const N2 = Math.ceil(N / M);\n const N1 = N2 * Math.ceil(Math.sqrt(M));\n\n multiSelect(items, left, right, N1, this.compareMinX);\n\n for (let i = left; i <= right; i += N1) {\n\n const right2 = Math.min(i + N1 - 1, right);\n\n multiSelect(items, i, right2, N2, this.compareMinY);\n\n for (let j = i; j <= right2; j += N2) {\n\n const right3 = Math.min(j + N2 - 1, right2);\n\n // pack each entry recursively\n node.children.push(this._build(items, j, right3, height - 1));\n }\n }\n\n calcBBox(node, this.toBBox);\n\n return node;\n }\n\n _chooseSubtree(bbox, node, level, path) {\n while (true) {\n path.push(node);\n\n if (node.leaf || path.length - 1 === level) break;\n\n let minArea = Infinity;\n let minEnlargement = Infinity;\n let targetNode;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const area = bboxArea(child);\n const enlargement = enlargedArea(bbox, child) - area;\n\n // choose entry with the least area enlargement\n if (enlargement < minEnlargement) {\n minEnlargement = enlargement;\n minArea = area < minArea ? area : minArea;\n targetNode = child;\n\n } else if (enlargement === minEnlargement) {\n // otherwise choose one with the smallest area\n if (area < minArea) {\n minArea = area;\n targetNode = child;\n }\n }\n }\n\n node = targetNode || node.children[0];\n }\n\n return node;\n }\n\n _insert(item, level, isNode) {\n const bbox = isNode ? item : this.toBBox(item);\n const insertPath = [];\n\n // find the best node for accommodating the item, saving all nodes along the path too\n const node = this._chooseSubtree(bbox, this.data, level, insertPath);\n\n // put the item into the node\n node.children.push(item);\n extend(node, bbox);\n\n // split on node overflow; propagate upwards if necessary\n while (level >= 0) {\n if (insertPath[level].children.length > this._maxEntries) {\n this._split(insertPath, level);\n level--;\n } else break;\n }\n\n // adjust bboxes along the insertion path\n this._adjustParentBBoxes(bbox, insertPath, level);\n }\n\n // split overflowed node into two\n _split(insertPath, level) {\n const node = insertPath[level];\n const M = node.children.length;\n const m = this._minEntries;\n\n this._chooseSplitAxis(node, m, M);\n\n const splitIndex = this._chooseSplitIndex(node, m, M);\n\n const newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));\n newNode.height = node.height;\n newNode.leaf = node.leaf;\n\n calcBBox(node, this.toBBox);\n calcBBox(newNode, this.toBBox);\n\n if (level) insertPath[level - 1].children.push(newNode);\n else this._splitRoot(node, newNode);\n }\n\n _splitRoot(node, newNode) {\n // split root node\n this.data = createNode([node, newNode]);\n this.data.height = node.height + 1;\n this.data.leaf = false;\n calcBBox(this.data, this.toBBox);\n }\n\n _chooseSplitIndex(node, m, M) {\n let index;\n let minOverlap = Infinity;\n let minArea = Infinity;\n\n for (let i = m; i <= M - m; i++) {\n const bbox1 = distBBox(node, 0, i, this.toBBox);\n const bbox2 = distBBox(node, i, M, this.toBBox);\n\n const overlap = intersectionArea(bbox1, bbox2);\n const area = bboxArea(bbox1) + bboxArea(bbox2);\n\n // choose distribution with minimum overlap\n if (overlap < minOverlap) {\n minOverlap = overlap;\n index = i;\n\n minArea = area < minArea ? area : minArea;\n\n } else if (overlap === minOverlap) {\n // otherwise choose distribution with minimum area\n if (area < minArea) {\n minArea = area;\n index = i;\n }\n }\n }\n\n return index || M - m;\n }\n\n // sorts node children by the best axis for split\n _chooseSplitAxis(node, m, M) {\n const compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;\n const compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;\n const xMargin = this._allDistMargin(node, m, M, compareMinX);\n const yMargin = this._allDistMargin(node, m, M, compareMinY);\n\n // if total distributions margin value is minimal for x, sort by minX,\n // otherwise it's already sorted by minY\n if (xMargin < yMargin) node.children.sort(compareMinX);\n }\n\n // total margin of all possible split distributions where each node is at least m full\n _allDistMargin(node, m, M, compare) {\n node.children.sort(compare);\n\n const toBBox = this.toBBox;\n const leftBBox = distBBox(node, 0, m, toBBox);\n const rightBBox = distBBox(node, M - m, M, toBBox);\n let margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);\n\n for (let i = m; i < M - m; i++) {\n const child = node.children[i];\n extend(leftBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(leftBBox);\n }\n\n for (let i = M - m - 1; i >= m; i--) {\n const child = node.children[i];\n extend(rightBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(rightBBox);\n }\n\n return margin;\n }\n\n _adjustParentBBoxes(bbox, path, level) {\n // adjust bboxes along the given tree path\n for (let i = level; i >= 0; i--) {\n extend(path[i], bbox);\n }\n }\n\n _condense(path) {\n // go through the path, removing empty nodes and updating bboxes\n for (let i = path.length - 1, siblings; i >= 0; i--) {\n if (path[i].children.length === 0) {\n if (i > 0) {\n siblings = path[i - 1].children;\n siblings.splice(siblings.indexOf(path[i]), 1);\n\n } else this.clear();\n\n } else calcBBox(path[i], this.toBBox);\n }\n }\n}\n\nfunction findItem(item, items, equalsFn) {\n if (!equalsFn) return items.indexOf(item);\n\n for (let i = 0; i < items.length; i++) {\n if (equalsFn(item, items[i])) return i;\n }\n return -1;\n}\n\n// calculate node's bbox from bboxes of its children\nfunction calcBBox(node, toBBox) {\n distBBox(node, 0, node.children.length, toBBox, node);\n}\n\n// min bounding rectangle of node children from k to p-1\nfunction distBBox(node, k, p, toBBox, destNode) {\n if (!destNode) destNode = createNode(null);\n destNode.minX = Infinity;\n destNode.minY = Infinity;\n destNode.maxX = -Infinity;\n destNode.maxY = -Infinity;\n\n for (let i = k; i < p; i++) {\n const child = node.children[i];\n extend(destNode, node.leaf ? toBBox(child) : child);\n }\n\n return destNode;\n}\n\nfunction extend(a, b) {\n a.minX = Math.min(a.minX, b.minX);\n a.minY = Math.min(a.minY, b.minY);\n a.maxX = Math.max(a.maxX, b.maxX);\n a.maxY = Math.max(a.maxY, b.maxY);\n return a;\n}\n\nfunction compareNodeMinX(a, b) { return a.minX - b.minX; }\nfunction compareNodeMinY(a, b) { return a.minY - b.minY; }\n\nfunction bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }\nfunction bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }\n\nfunction enlargedArea(a, b) {\n return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *\n (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));\n}\n\nfunction intersectionArea(a, b) {\n const minX = Math.max(a.minX, b.minX);\n const minY = Math.max(a.minY, b.minY);\n const maxX = Math.min(a.maxX, b.maxX);\n const maxY = Math.min(a.maxY, b.maxY);\n\n return Math.max(0, maxX - minX) *\n Math.max(0, maxY - minY);\n}\n\nfunction contains(a, b) {\n return a.minX <= b.minX &&\n a.minY <= b.minY &&\n b.maxX <= a.maxX &&\n b.maxY <= a.maxY;\n}\n\nfunction intersects(a, b) {\n return b.minX <= a.maxX &&\n b.minY <= a.maxY &&\n b.maxX >= a.minX &&\n b.maxY >= a.minY;\n}\n\nfunction createNode(children) {\n return {\n children,\n height: 1,\n leaf: true,\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity\n };\n}\n\n// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;\n// combines selection algorithm with binary divide & conquer approach\n\nfunction multiSelect(arr, left, right, n, compare) {\n const stack = [left, right];\n\n while (stack.length) {\n right = stack.pop();\n left = stack.pop();\n\n if (right - left <= n) continue;\n\n const mid = left + Math.ceil((right - left) / n / 2) * n;\n quickselect(arr, mid, left, right, compare);\n\n stack.push(left, mid, mid, right);\n }\n}\n","// The three topological relations we need to check for\ntype Relation = \n // Inline elements, same height, directly adjacent\n 'inline-adjacent' |\n // Inline elements, A fully contains B\n 'inline-contains' |\n // Inline elements, A is fully contained inside B\n 'inline-is-contained' |\n // At least one block element, A fully contains B\n 'block-contains' |\n // At least one block element, A is fully contained in B\n 'block-is-contained';\n\n// Note that this is not a general topology test. Takes a \n// few shortcuts to test ONLY the situations we'll encounter\n// with text selections.\nconst getRelation = (rectA: DOMRect, rectB: DOMRect): Relation | undefined => {\n const round = (num: number ) => Math.round(num * 10) / 10;\n\n // Some browsers have fractional pixel differences (looking at you FF!)\n const a = {\n top: round(rectA.top),\n bottom: round(rectA.bottom),\n left: round(rectA.left),\n right: round(rectA.right)\n };\n\n const b = {\n top: round(rectB.top),\n bottom: round(rectB.bottom),\n left: round(rectB.left),\n right: round(rectB.right)\n };\n\n if (Math.abs(a.top - b.top) < 0.5 && Math.abs(a.bottom - b.bottom) < 0.5) {\n // Same height - check for containment and adjacency\n if (Math.abs(a.left - b.right) < 0.5 || Math.abs(a.right - b.left) < 0.5)\n return 'inline-adjacent';\n\n if (a.left >= b.left && a.right <= b.right)\n return 'inline-is-contained';\n\n if (a.left <= b.left && a.right >= b.right)\n return 'inline-contains';\n } else {\n // Different heights - check for containment\n if (a.top <= b.top && a.bottom >= b.bottom) {\n if (a.left <= b.left && a.right >= b.right) {\n return 'block-contains'\n }\n } else if (a.top >= b.top && a.bottom <= b.bottom) {\n if (a.left >= b.left && a.right <= b.right) {\n return 'block-is-contained';\n }\n }\n }\n}\n\nconst union = (a: DOMRect, b: DOMRect): DOMRect => {\n const left = Math.min(a.left, b.left);\n const right = Math.max(a.right, b.right);\n const top = Math.min(a.top, b.top);\n const bottom = Math.max(a.bottom, b.bottom);\n\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\nexport const mergeClientRects = (rects: DOMRect[]) => rects.reduce((merged, rectA) => {\n // Some browser report empty rects - discard\n if (rectA.width === 0 || rectA.height === 0)\n return merged;\n\n let next = [...merged];\n\n let wasMerged = false;\n\n for (const rectB of merged) {\n const relation = getRelation(rectA, rectB);\n \n if (relation === 'inline-adjacent') {\n // A and B are adjacent - remove B and keep union\n next = next.map(r => r === rectB ? union(rectA, rectB) : r);\n wasMerged = true;\n break;\n } else if (relation === 'inline-contains') {\n // A contains B - remove B and keep A\n next = next.map(r => r === rectB ? rectA : r);\n wasMerged = true;\n break;\n } else if (relation === 'inline-is-contained') {\n // B contains A - skip A\n wasMerged = true;\n break;\n } else if (relation === 'block-contains' || relation === 'block-is-contained') {\n // Block containment - keep the element with smaller width\n if (rectA.width < rectB.width) {\n next = next.map(r => r === rectB ? rectA : r);\n }\n wasMerged = true;\n break;\n }\n }\n\n return wasMerged ? next : [ ...next, rectA ];\n}, [] as DOMRect[]);\n","export const trimRange = (range: Range): Range => {\n const { startContainer, endContainer } = range;\n\n const isTextRange = \n startContainer.nodeType === Node.TEXT_NODE && \n endContainer.nodeType === Node.TEXT_NODE;\n\n if (isTextRange)\n return range;\n\n if (startContainer.nodeType !== Node.TEXT_NODE) {\n const nextContainer = startContainer.nextSibling || startContainer.parentNode;\n \n // Get first text child in next container\n const nextText = nextContainer.nodeType === Node.TEXT_NODE ?\n nextContainer :\n Array.from(nextContainer.childNodes).filter(n => n.nodeType === Node.TEXT_NODE).shift(); \n\n range.setEnd(nextText, 0);\n }\n\n if (endContainer.nodeType !== Node.TEXT_NODE) {\n const prevContainer = endContainer.previousSibling || endContainer.parentNode;\n \n // Get last text child in previous container\n const prevText = prevContainer.nodeType === Node.TEXT_NODE ?\n prevContainer :\n Array.from(prevContainer.childNodes).filter(n => n.nodeType === Node.TEXT_NODE).pop(); \n\n range.setEnd(prevText, prevText.textContent.length);\n }\n\n return range;\n}","import RBush from 'rbush';\nimport type { Store } from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport { mergeClientRects } from '../utils';\nimport { getClientRectsPonyfill } from '../utils/getClientRectsPonyfill';\nimport { reviveTarget } from './reviveTarget';\n\nconst isFirefox = false; // navigator.userAgent.match(/firefox|fxios/i);\n\nif (isFirefox) console.warn('Firefox interop enabled');\n\nexport interface IndexedHighlightRect {\n\n minX: number;\n\n minY: number;\n\n maxX: number;\n\n maxY: number;\n\n annotation: {\n \n id: string;\n\n rects: DOMRect[];\n\n }\n\n}\n\nexport const createSpatialTree = (store: Store<TextAnnotation>, container: HTMLElement) => {\n\n const tree = new RBush<IndexedHighlightRect>();\n\n const index = new Map<string, IndexedHighlightRect[]>();\n\n // Helper: converts a single text annotation target to a list of hightlight rects\n const toItems = (target: TextAnnotationTarget): IndexedHighlightRect[] => {\n const offset = container.getBoundingClientRect();\n\n const isValidRange = \n target.selector.range instanceof Range && \n !target.selector.range.collapsed &&\n target.selector.range.startContainer.nodeType === Node.TEXT_NODE && \n target.selector.range.endContainer.nodeType === Node.TEXT_NODE;\n\n const t = isValidRange ? target : reviveTarget(target, container);\n\n const rects = isFirefox ? \n getClientRectsPonyfill(t.selector.range) :\n Array.from(t.selector.range.getClientRects());\n\n const merged = mergeClientRects(rects);\n\n return merged.map(rect => {\n const { x, y, width, height } = rect;\n\n return {\n minX: x - offset.x,\n minY: y - offset.y,\n maxX: x - offset.x + width,\n maxY: y - offset.y + height,\n annotation: {\n id: target.annotation,\n rects: merged\n }\n }\n });\n }\n\n const all = () => [...index.values()];\n\n const clear = () => {\n tree.clear();\n index.clear();\n }\n\n const insert = (target: TextAnnotationTarget) => {\n const rects = toItems(target);\n rects.forEach(rect => tree.insert(rect));\n index.set(target.annotation, rects);\n }\n\n const remove = (target: TextAnnotationTarget) => {\n const rects = index.get(target.annotation);\n rects.forEach(rect => tree.remove(rect));\n index.delete(target.annotation);\n }\n\n const update = (target: TextAnnotationTarget) => {\n remove(target);\n insert(target);\n }\n\n const set = (targets: TextAnnotationTarget[], replace: boolean = true) => {\n if (replace)\n clear();\n\n const rectsByTarget = targets.map(target => ({ target, rects: toItems(target) }));\n rectsByTarget.forEach(({ target, rects }) => index.set(target.annotation, rects));\n\n const allRects = rectsByTarget.reduce((all, { rects }) => [...all, ...rects], []);\n tree.load(allRects);\n }\n\n const getAt = (x: number, y: number): string | undefined => {\n const hits = tree.search({\n minX: x,\n minY: y,\n maxX: x,\n maxY: y\n });\n\n const area = (rect: IndexedHighlightRect) =>\n rect.annotation.rects.reduce((area, r) =>\n area + r.width * r.height, 0);\n \n // Get smallest rect\n if (hits.length > 0) {\n hits.sort((a, b) => area(a) - area(b));\n return hits[0].annotation.id;\n }\n }\n\n const getBoundsForAnnotation = (id: string): DOMRect => {\n const rects = getDOMRectsForAnnotation(id);\n\n if (rects.length === 0)\n return undefined;\n\n let left = rects[0].left;\n let top = rects[0].top;\n let right = rects[0].right;\n let bottom = rects[0].bottom;\n\n for (let i = 1; i < rects.length; i++) {\n const rect = rects[i];\n\n left = Math.min(left, rect.left);\n top = Math.min(top, rect.top);\n right = Math.max(right, rect.right);\n bottom = Math.max(bottom, rect.bottom);\n }\n\n return new DOMRect(left, top, right - left, bottom - top);\n }\n\n const getDOMRectsForAnnotation = (id: string): DOMRect[] => {\n const indexed = index.get(id);\n if (indexed) {\n // Reminder: *each* IndexedHighlightRect stores *all*\n // DOMRects for the annotation for convenience\n return indexed[0].annotation.rects;\n } else {\n return [];\n }\n }\n\n const getIntersectingRects = (minX: number, minY: number, maxX: number, maxY: number) =>\n tree.search({ minX, minY, maxX, maxY });\n\n const size = () => tree.all().length;\n\n const recalculate = () =>\n set(store.all().map(a => a.target), true);\n\n return {\n all,\n clear,\n getAt,\n getBoundsForAnnotation,\n getDOMRectsForAnnotation,\n getIntersectingRects,\n insert,\n recalculate,\n remove,\n set,\n size,\n update\n }\n\n}","import type { PointerSelectAction, Store, ViewportState } from '@annotorious/core';\nimport { \n createHoverState, \n createSelectionState, \n createStore, \n AnnotatorState, \n SelectionState, \n HoverState, \n Origin,\n createViewportState\n} from '@annotorious/core';\nimport { IndexedHighlightRect, createSpatialTree } from './spatialTree';\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport type { AnnotationRects, TextAnnotationStore } from './TextAnnotationStore';\nimport { reviveTarget } from './reviveTarget';\n\nexport type TextAnnotatorState = AnnotatorState<TextAnnotation> & {\n\n store: TextAnnotationStore;\n\n selection: SelectionState<TextAnnotation>;\n\n hover: HoverState<TextAnnotation>;\n\n viewport: ViewportState;\n\n}\n\n// Shorthand\nconst hasValidRange = (annotation: TextAnnotation) => {\n const { range } = annotation.target.selector;\n return range instanceof Range && !range.collapsed;\n}\n\nexport const createTextAnnotatorState = (\n container: HTMLElement,\n defaultPointerAction?: PointerSelectAction | ((annotation: TextAnnotation) => PointerSelectAction)\n): TextAnnotatorState => {\n\n const store: Store<TextAnnotation> = createStore<TextAnnotation>();\n\n const tree = createSpatialTree(store, container);\n\n const selection = createSelectionState<TextAnnotation>(store, defaultPointerAction);\n\n const hover = createHoverState(store);\n\n const viewport = createViewportState();\n\n // Wrap store interface to intercept annotations and revive DOM ranges, if needed\n const addAnnotation = (annotation: TextAnnotation, origin = Origin.LOCAL): boolean => {\n const revived = annotation.target.selector.range instanceof Range ?\n annotation : { ...annotation, target: reviveTarget(annotation.target, container) };\n\n const { range } = revived.target.selector;\n const isValid = range && !range.collapsed;\n\n if (isValid)\n store.addAnnotation(revived, origin); \n\n return isValid;\n }\n\n const bulkAddAnnotation = (\n annotations: TextAnnotation[], \n replace = true, \n origin = Origin.LOCAL\n ): TextAnnotation[] => {\n const revived = annotations.map(a => hasValidRange(a) ?\n a : { ...a, target: reviveTarget(a.target, container )});\n\n // Initial page load might take some time. Retry for more robustness.\n const hasCollapsedRanges = revived.some(a => a.target.selector.range.collapsed);\n if (hasCollapsedRanges) {\n const couldNotRevive = revived.filter(a => a.target.selector.range.collapsed);\n console.warn('Could not revive all targets');\n console.warn(couldNotRevive);\n\n // Note: we want to keep ALL annotations in the store, even those that\n // were not revived - even if the highlighter won't be able to render\n // the un-revived ones to the screen.\n store.bulkAddAnnotation(revived, replace, origin);\n\n return couldNotRevive;\n } else {\n store.bulkAddAnnotation(revived, replace, origin);\n return [];\n }\n }\n\n const updateTarget = (target: TextAnnotationTarget, origin = Origin.LOCAL) => {\n const revived = target.selector.range instanceof Range ?\n target : reviveTarget(target, container);\n\n store.updateTarget(revived, origin);\n }\n\n const bulkUpdateTargets = (targets: TextAnnotationTarget[], origin = Origin.LOCAL) => {\n const revived = targets.map(t => t.selector.range instanceof Range ? t : reviveTarget(t, container));\n store.bulkUpdateTargets(revived, origin);\n }\n\n const getAt = (x: number, y: number): TextAnnotation | undefined => {\n const annotationId = tree.getAt(x, y);\n return annotationId ? store.getAnnotation(annotationId) : undefined;\n }\n\n const getIntersecting = (minX: number, minY: number, maxX: number, maxY: number) => {\n const rects = tree.getIntersectingRects(minX, minY, maxX, maxY);\n const ids = Array.from(new Set(rects.map(item => item.annotation.id)));\n\n // Note that the tree could be slightly out of sync (because it updates\n // by listening to changes, just like anyone else)\n return ids.map(id => store.getAnnotation(id)).filter(a => a);\n }\n\n const getAnnotationBounds = (id: string, x?: number, y?: number, buffer = 5): DOMRect => {\n const rects = tree.getDOMRectsForAnnotation(id);\n if (rects.length > 0) {\n if (x && y) {\n const match = rects.find(({ top, right, bottom, left }) =>\n x >= left - buffer && x <= right + buffer && y >= top - buffer && y <= bottom + buffer);\n\n if (match)\n // Preferred bounds: the rectangle \n return match;\n }\n \n return tree.getBoundsForAnnotation(id);\n }\n }\n\n const getIntersectingRects = (\n minX: number, \n minY: number, \n maxX: number, \n maxY: number\n ): AnnotationRects[] => {\n const rects = tree.getIntersectingRects(minX, minY, maxX, maxY);\n\n // Group by annotation ID\n const groupedByAnnotationId: { [key:string]: IndexedHighlightRect[] } = rects.reduce((grouped, rect) => {\n (grouped[rect.annotation.id] = grouped[rect.annotation.id] || []).push(rect);\n return grouped;\n }, {});\n\n // Resolve annotation IDs\n return Object.entries(groupedByAnnotationId).map(([annotationId, rects]) => ({\n annotation: store.getAnnotation(annotationId),\n rects: rects.map(({ minX, minY, maxX, maxY }) => \n ({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }))\n }));\n }\n\n const recalculatePositions = () => tree.recalculate();\n\n store.observe(({ changes }) => {\n const created = (changes.created || []).filter(hasValidRange);\n const deleted = (changes.deleted || []).filter(hasValidRange);\n const updated = (changes.updated || []).filter(u => hasValidRange(u.newValue));\n\n if (created.length > 0)\n tree.set(created.map(a => a.target), false);\n\n if (deleted?.length > 0)\n deleted.forEach(a => tree.remove(a.target));\n\n if (updated?.length > 0)\n updated.forEach(({ newValue }) =>\n tree.update(newValue.target));\n });\n\n return {\n store: {\n ...store,\n addAnnotation,\n bulkAddAnnotation,\n bulkUpdateTargets,\n getAnnotationBounds,\n getAt,\n getIntersecting,\n getIntersectingRects,\n recalculatePositions,\n updateTarget\n } as TextAnnotationStore,\n selection,\n hover,\n viewport\n }\n\n}","import type { DrawingStyle, PresenceProvider, PresentUser } from '@annotorious/core';\nimport type { HighlightPainter } from '../highlight';\nimport type { PresencePainterOptions } from './PresencePainterOptions';\nimport type { TextAnnotation } from '../model';\nimport type { Rect } from '../state';\nimport { defaultPainter } from '../highlight';\n\nexport const createPainter = (provider: PresenceProvider, opts: PresencePainterOptions = {}): HighlightPainter => {\n\n const trackedAnnotations = new Map<string, PresentUser>();\n\n const getAnnotationsForUser = (p: PresentUser) =>\n Array.from(trackedAnnotations.entries())\n .filter(([id, user]) => user.presenceKey === p.presenceKey)\n .map(([id, _]) => id);\n\n provider.on('selectionChange', (p: PresentUser, selection: string[] | null) => {\n // Remove this user's previous selection\n const currentIds = getAnnotationsForUser(p);\n currentIds.forEach(id => trackedAnnotations.delete(id));\n\n // Set new selection (if any)\n if (selection)\n selection.forEach(id => trackedAnnotations.set(id, p));\n }); \n\n const paint = (\n annotation: TextAnnotation,\n rects: Rect[], \n bg: CanvasRenderingContext2D, \n fg: CanvasRenderingContext2D,\n isSelected?: boolean,\n style?: DrawingStyle | ((annotation: TextAnnotation) => DrawingStyle)\n ) => {\n if (opts.font)\n fg.font = opts.font;\n\n const user = trackedAnnotations.get(annotation.id);\n if (user) {\n const { x, y, height } = rects[0];\n\n // Draw presence indicator\n fg.fillStyle = user.appearance.color;\n fg.fillRect(x - 2, y - 2.5, 2, height + 5);\n\n // Draw name label\n const metrics = fg.measureText(user.appearance.label);\n const labelWidth = metrics.width + 6;\n const labelHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent + 8;\n \n // Sigh... different between FF and Chrome\n const paddingBottom = metrics.fontBoundingBoxAscent ? 8 : 6.5;\n\n fg.fillRect(x - 2, y - 2.5 - labelHeight, labelWidth, labelHeight);\n \n fg.fillStyle = '#fff';\n fg.fillText(user.appearance.label, x + 1, y - paddingBottom);\n\n bg.fillStyle = user.appearance.color;\n bg.globalAlpha = isSelected ? 0.45 : 0.18;\n rects.forEach(({ x, y, width, height }) => bg.fillRect(x, y - 2.5, width, height + 5));\n } else {\n defaultPainter.paint(annotation, rects, bg, fg, isSelected, style);\n }\n }\n\n return { paint };\n \n}","import type { TextAnnotationStore } from 'src/state';\nimport type { TextAnnotation } from '../model/TextAnnotation';\n\nconst getScrollParent = (el: Element) => {\n if (el === null)\n return document.scrollingElement;\n\n const { overflowY } = window.getComputedStyle(el);\n const isScrollable = overflowY !== 'visible' && overflowY !== 'hidden';\n\n // Cf. discussion https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\n if (isScrollable && el.scrollHeight > el.clientHeight)\n return el;\n else\n return getScrollParent(el.parentElement);\n}\n\nexport const scrollIntoView = (container: HTMLElement, store: TextAnnotationStore) => (annotation: TextAnnotation) => {\n // Get closest scrollable parent\n const scrollParent: Element = getScrollParent(container);\n if (scrollParent) {\n // Get curren version of the annotation from the store\n const current = store.getAnnotation(annotation.id);\n\n const { range } = current.target.selector;\n\n if (!range || range.collapsed)\n return false;\n\n // Parent bounds and client (= visible) height\n const parentBounds = scrollParent.getBoundingClientRect();\n const parentHeight = scrollParent.clientHeight;\n const parentWidth = scrollParent.clientWidth;\n\n // Position of the annotation relative to viewport\n const annotationBounds = current.target.selector.range.getBoundingClientRect();\n\n // Note: getBoundingClientRect seems to return wrong height! \n // (Includes block elements?) We'll therefore use the normalized height\n // from the spatial index!\n const { width, height } = store.getAnnotationBounds(annotation.id);\n\n // Position of the annotation relative to scrollParent\n const offsetTop = annotationBounds.top - parentBounds.top;\n const offsetLeft = annotationBounds.left - parentBounds.left;\n\n const scrollTop = scrollParent.parentElement ? scrollParent.scrollTop : 0;\n const scrollLeft = scrollParent.parentElement ? scrollParent.scrollLeft : 0;\n\n // Scroll the annotation to the center of the viewport\n const top = offsetTop + scrollTop - (parentHeight - height) / 2;\n const left = offsetLeft + scrollLeft - (parentWidth - width) / 2;\n\n scrollParent.scroll({ top, left, behavior: 'smooth' });\n\n return true;\n }\n}","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { Origin, type User } from '@annotorious/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { TextAnnotatorState } from './state';\nimport type { TextSelector, TextAnnotationTarget } from './model';\nimport { trimRange } from './utils';\n\nexport const rangeToSelector = (range: Range, container: HTMLElement, offsetReferenceSelector?: string): TextSelector => {\n const rangeBefore = document.createRange();\n\n const offsetReference: HTMLElement = offsetReferenceSelector ? \n (range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector) : container;\n\n // A helper range from the start of the contentNode to the start of the selection\n rangeBefore.setStart(offsetReference, 0);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n\n const quote = range.toString();\n const start = rangeBefore.toString().length;\n const end = start + quote.length;\n\n return offsetReferenceSelector ?\n { quote, start, end, range, offsetReference } :\n { quote, start, end, range };\n}\n\nexport const SelectionHandler = (\n container: HTMLElement,\n state: TextAnnotatorState,\n offsetReferenceSelector?: string\n) => {\n\n const { store, selection } = state;\n\n let currentUser: User;\n\n let currentTarget: TextAnnotationTarget = null;\n\n const setUser = (user: User) => currentUser = user;\n\n let isLeftClick = false;\n\n let lastPointerEvent: PointerEvent;\n\n container.addEventListener('selectstart', (evt: PointerEvent) => {\n if (!isLeftClick)\n return;\n\n // Make sure we don't listen to selection changes that\n // were not started on the container, or which are not supposed to\n // be annotatable (like the popup)\n const annotatable = !(evt.target as Node).parentElement.closest('.not-annotatable');\n if (annotatable) {\n currentTarget = {\n annotation: uuidv4(),\n selector: undefined,\n creator: currentUser,\n created: new Date()\n };\n } else {\n currentTarget = null;\n lastPointerEvent = undefined;\n }\n });\n\n let debounceTimer: ReturnType<typeof setTimeout> = undefined;\n\n document.addEventListener('selectionchange', (evt: PointerEvent) => {\n if (debounceTimer)\n clearTimeout(debounceTimer);\n\n debounceTimer = setTimeout(() => onSelectionChange(), 50);\n });\n\n const onSelectionChange = () => {\n const sel = document.getSelection();\n\n if (!sel.isCollapsed && isLeftClick && currentTarget) {\n const ranges = Array.from(Array(sel.rangeCount).keys())\n .map(idx => sel.getRangeAt(idx));\n\n const trimmed = trimRange(ranges[0]);\n\n const hasChanged =\n trimmed.toString() !== currentTarget.selector?.range?.toString();\n\n if (hasChanged) {\n currentTarget = {\n ...currentTarget,\n selector: rangeToSelector(ranges[0], container, offsetReferenceSelector)\n };\n\n if (store.getAnnotation(currentTarget.annotation)) {\n store.updateTarget(currentTarget, Origin.LOCAL);\n } else {\n store.addAnnotation({\n id: currentTarget.annotation,\n bodies: [],\n target: currentTarget\n });\n\n // Reminder: select events don't have offsetX/offsetY - reuse last up/down\n selection.clickSelect(currentTarget.annotation, lastPointerEvent);\n }\n }\n }\n }\n\n // Select events don't carry information about the mouse button\n // Therefore, to prevent right-click selection, we need to listen\n // to the initial pointerdown event and remember the button\n container.addEventListener('pointerdown', (evt: PointerEvent) => {\n lastPointerEvent = evt;\n isLeftClick = evt.button === 0;\n });\n\n document.addEventListener('pointerup', (evt: PointerEvent) => {\n lastPointerEvent = evt;\n\n const annotatable = !(evt.target as Node).parentElement?.closest('.not-annotatable');\n if (!annotatable || !isLeftClick)\n return;\n\n setTimeout(() => {\n if (currentTarget?.selector) {\n store.updateTarget(currentTarget, Origin.LOCAL);\n\n selection.clickSelect(currentTarget.annotation, evt);\n\n currentTarget = null;\n lastPointerEvent = undefined;\n } else {\n const { x, y } = container.getBoundingClientRect();\n\n const hovered = store.getAt(evt.clientX - x, evt.clientY - y);\n if (hovered) {\n const { selected } = selection;\n\n if (selected.length !== 1 || selected[0].id !== hovered.id) {\n selection.clickSelect(hovered.id, evt);\n lastPointerEvent = undefined;\n }\n } else if (!selection.isEmpty()) {\n selection.clear();\n }\n }\n }, 50);\n });\n\n return {\n setUser\n }\n\n}\n","import { createAnonymousGuest, createLifecyleObserver, createBaseAnnotator, DrawingStyle, Filter, createUndoStack } from '@annotorious/core';\nimport type { Annotator, User, PresenceProvider } from '@annotorious/core';\nimport { createPainter } from './presence';\nimport { createHighlightLayer } from './highlight';\nimport { scrollIntoView } from './api';\nimport { TextAnnotationStore, TextAnnotatorState, createTextAnnotatorState } from './state';\nimport type { TextAnnotation } from './model';\nimport type { TextAnnotatorOptions } from './TextAnnotatorOptions';\nimport { SelectionHandler } from './SelectionHandler';\n\nimport './TextAnnotator.css';\n\nexport interface TextAnnotator<T extends unknown = TextAnnotation> extends Annotator<TextAnnotation, T> {\n\n element: HTMLElement;\n\n // Returns true if successful (or false if the annotation is not currently rendered)\n scrollIntoView(annotation: TextAnnotation): boolean;\n\n}\n\nexport const createTextAnnotator = <E extends unknown = TextAnnotation>(\n container: HTMLElement, \n opts: TextAnnotatorOptions<E> = {}\n): TextAnnotator<E> => {\n\n const state: TextAnnotatorState = createTextAnnotatorState(container, opts.pointerAction);\n\n const { selection, viewport } = state;\n\n const store: TextAnnotationStore = state.store;\n\n const undoStack = createUndoStack(store);\n\n const lifecycle = createLifecyleObserver<TextAnnotation, TextAnnotation | E>(\n state, undoStack, opts.adapter\n );\n \n let currentUser: User = createAnonymousGuest();\n\n const highlightLayer = createHighlightLayer(container, state, viewport);\n if (opts.style)\n highlightLayer.setDrawingStyle(opts.style);\n\n const selectionHandler = SelectionHandler(container, state, opts.offsetReferenceSelector);\n\n selectionHandler.setUser(currentUser);\n\n /*************************/\n /* External API */\n /******++++++*************/\n\n // Most of the external API functions are covered in the base annotator\n const base = createBaseAnnotator<TextAnnotation, E>(state, undoStack, opts.adapter);\n\n const getUser = () => currentUser;\n\n const setFilter = (filter?: Filter) =>\n highlightLayer.setFilter(filter);\n\n const setStyle = (drawingStyle: DrawingStyle | ((annotation: TextAnnotation) => DrawingStyle) | undefined) =>\n highlightLayer.setDrawingStyle(drawingStyle);\n\n const setUser = (user: User) => {\n currentUser = user;\n selectionHandler.setUser(user);\n }\n\n const setPresenceProvider = (provider: PresenceProvider) => {\n if (provider) {\n highlightLayer.setPainter(createPainter(provider, opts.presence));\n provider.on('selectionChange', () => highlightLayer.redraw());\n }\n }\n\n const setSelected = (arg?: string | string[]) => {\n if (arg) {\n selection.setSelected(arg);\n } else {\n selection.clear();\n }\n }\n\n const destroy = () => {\n throw 'Not implemented yet';\n }\n\n return {\n ...base,\n destroy,\n element: container,\n getUser,\n setFilter,\n setStyle,\n setUser,\n setSelected,\n setPresenceProvider,\n on: lifecycle.on,\n off: lifecycle.off,\n scrollIntoView: scrollIntoView(container, store),\n state\n }\n\n}"],"names":["DEFAULT_STYLE","DEFAULT_SELECTED_STYLE","defaultPainter","annotation","rects","bg","fg","isSelected","drawingStyle","style","x","y","width","height","trackViewport","viewport","visible","annotations","ids","a","id","debounce","func","delay","timeoutId","args","createCanvas","className","highres","canvas","context","resetCanvas","createHighlightLayer","container","state","store","selection","hover","currentStyle","currentFilter","currentPainter","onDraw","bgCanvas","fgCanvas","bgContext","fgContext","event","hit","getViewport","top","left","innerWidth","innerHeight","minX","minY","maxX","maxY","onScroll","redraw","onResize","annotationsInView","selectedIds","offsetRects","filter","painter","reviveTarget","target","start","end","offsetReference","iterator","runningOffset","range","n","startCounting","len","Y","t","$","W","k","_","b","w","p","U","be","V","ve","s","g","A","G","O","S","R","Z","K","ee","te","M","T","oe","o","u","se","ie","ye","d","l","c","f","v","D","B","C","m","r","E","h","L","I","P","de","Le","Se","Oe","N","re","De","ae","ce","le","ue","Re","quickselect","arr","right","compare","quickselectStep","defaultCompare","z","sd","newLeft","newRight","i","j","swap","tmp","RBush","maxEntries","bbox","node","result","intersects","toBBox","nodesToSearch","child","childBBox","contains","data","tmpNode","item","createNode","equalsFn","path","indexes","parent","goingUp","index","findItem","items","calcBBox","N2","N1","multiSelect","right2","right3","level","minArea","minEnlargement","targetNode","area","bboxArea","enlargement","enlargedArea","isNode","insertPath","extend","splitIndex","newNode","minOverlap","bbox1","distBBox","bbox2","overlap","intersectionArea","compareMinX","compareNodeMinX","compareMinY","compareNodeMinY","xMargin","yMargin","leftBBox","rightBBox","margin","bboxMargin","siblings","destNode","children","stack","mid","getRelation","rectA","rectB","round","num","union","bottom","mergeClientRects","merged","next","wasMerged","relation","trimRange","startContainer","endContainer","nextContainer","nextText","prevContainer","prevText","createSpatialTree","tree","toItems","offset","rect","all","clear","insert","remove","update","set","targets","replace","rectsByTarget","allRects","getAt","hits","getBoundsForAnnotation","getDOMRectsForAnnotation","indexed","hasValidRange","createTextAnnotatorState","defaultPointerAction","createStore","createSelectionState","createHoverState","createViewportState","addAnnotation","origin","Origin","revived","isValid","bulkAddAnnotation","couldNotRevive","updateTarget","bulkUpdateTargets","annotationId","getIntersecting","getAnnotationBounds","buffer","match","getIntersectingRects","groupedByAnnotationId","grouped","recalculatePositions","changes","created","deleted","updated","newValue","createPainter","provider","opts","trackedAnnotations","getAnnotationsForUser","user","metrics","labelWidth","labelHeight","paddingBottom","getScrollParent","el","overflowY","scrollIntoView","scrollParent","current","parentBounds","parentHeight","parentWidth","annotationBounds","offsetTop","offsetLeft","scrollTop","scrollLeft","getRandomValues","rnds8","rng","byteToHex","unsafeStringify","native","v4","options","buf","rnds","rangeToSelector","offsetReferenceSelector","rangeBefore","quote","SelectionHandler","currentUser","currentTarget","setUser","isLeftClick","lastPointerEvent","evt","uuidv4","debounceTimer","onSelectionChange","sel","ranges","idx","_b","_a","hovered","selected","createTextAnnotator","undoStack","createUndoStack","lifecycle","createLifecyleObserver","createAnonymousGuest","highlightLayer","selectionHandler","createBaseAnnotator","arg"],"mappings":"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","x_google_ignoreList":[4,5,6,13,14,15,16]}
|