@recogito/text-annotator 3.0.0-rc.3 → 3.0.0-rc.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/SelectionHandler.d.ts +5 -5
- package/dist/src/TextAnnotator.d.ts +10 -5
- package/dist/src/TextAnnotatorOptions.d.ts +10 -4
- package/dist/src/api/scrollIntoView.d.ts +4 -3
- package/dist/src/highlight/Highlight.d.ts +6 -0
- package/dist/src/highlight/HighlightPainter.d.ts +11 -19
- package/dist/src/highlight/HighlightStyle.d.ts +12 -0
- package/dist/src/highlight/baseRenderer.d.ts +21 -0
- package/dist/src/highlight/canvas/canvasRenderer.d.ts +4 -0
- package/dist/src/highlight/canvas/index.d.ts +1 -0
- package/dist/src/highlight/highlights/highlightsRenderer.d.ts +6 -0
- package/dist/src/highlight/highlights/index.d.ts +1 -0
- package/dist/src/highlight/index.d.ts +5 -1
- package/dist/src/highlight/span/index.d.ts +1 -0
- package/dist/src/highlight/span/spansRenderer.d.ts +4 -0
- package/dist/src/highlight/viewport.d.ts +13 -0
- package/dist/src/index.d.ts +3 -3
- package/dist/src/model/{TextAnnotation.d.ts → core/TextAnnotation.d.ts} +4 -2
- package/dist/src/model/core/index.d.ts +1 -0
- package/dist/src/model/index.d.ts +2 -1
- package/dist/src/model/w3c/W3CTextAnnotation.d.ts +34 -0
- package/dist/src/model/w3c/W3CTextFormatAdapter.d.ts +13 -0
- package/dist/src/model/w3c/index.d.ts +2 -0
- package/dist/src/presence/PresencePainter.d.ts +5 -4
- package/dist/src/state/TextAnnotationStore.d.ts +7 -6
- package/dist/src/state/TextAnnotatorState.d.ts +6 -6
- package/dist/src/state/index.d.ts +0 -1
- package/dist/src/state/spatialTree.d.ts +9 -6
- package/dist/src/utils/cancelSingleClickEvents.d.ts +6 -0
- package/dist/src/utils/debounce.d.ts +1 -0
- package/dist/src/utils/getAnnotatableFragment.d.ts +5 -0
- package/dist/src/utils/getQuoteContext.d.ts +4 -0
- package/dist/src/utils/index.d.ts +11 -1
- package/dist/src/utils/isRevived.d.ts +3 -0
- package/dist/src/utils/isWhitespaceOrEmpty.d.ts +2 -0
- package/dist/src/utils/rangeToSelector.d.ts +3 -0
- package/dist/src/utils/reviveAnnotation.d.ts +3 -0
- package/dist/src/utils/reviveSelector.d.ts +12 -0
- package/dist/src/utils/reviveTarget.d.ts +3 -0
- package/dist/src/utils/splitAnnotatableRanges.d.ts +7 -0
- package/dist/test/model/w3c/W3CTextFormatAdapter.test.d.ts +1 -0
- package/dist/test/model/w3c/fixtures.d.ts +4 -0
- package/dist/text-annotator.css +1 -1
- package/dist/text-annotator.es.js +1550 -986
- package/dist/text-annotator.es.js.map +1 -1
- package/dist/text-annotator.umd.js +2 -1
- package/dist/text-annotator.umd.js.map +1 -1
- package/package.json +18 -12
- package/dist/src/highlight/highlightLayer.d.ts +0 -10
- package/dist/src/highlight/trackViewport.d.ts +0 -3
- package/dist/src/state/reviveTarget.d.ts +0 -9
- package/dist/src/utils/trimRange.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-annotator.es.js","sources":["../src/highlight/HighlightPainter.ts","../src/highlight/trackViewport.ts","../src/highlight/highlightLayer.ts","../src/state/reviveTarget.ts","../../../node_modules/dequal/lite/index.mjs","../../../node_modules/svelte/src/runtime/internal/utils.js","../../../node_modules/svelte/src/runtime/store/index.js","../../../node_modules/@annotorious/core/src/state/Hover.ts","../../../node_modules/@annotorious/core/src/state/Selection.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","../../../node_modules/@annotorious/core/src/utils/diffAnnotations.ts","../../../node_modules/@annotorious/core/src/state/StoreObserver.ts","../../../node_modules/@annotorious/core/src/state/Store.ts","../../../node_modules/nanoevents/index.js","../../../node_modules/@annotorious/core/src/state/UndoStack.ts","../../../node_modules/@annotorious/core/src/state/Viewport.ts","../../../node_modules/@annotorious/core/src/lifecycle/Lifecycle.ts","../../../node_modules/@annotorious/core/src/model/FormatAdapter.ts","../../../node_modules/@annotorious/core/src/model/Annotator.ts","../../../node_modules/nanoid/index.browser.js","../../../node_modules/@annotorious/core/src/model/User.ts","../../../node_modules/@annotorious/core/src/model/W3CAnnotation.ts","../../../node_modules/@annotorious/core/src/presence/PresenceState.ts","../../../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","../src/SelectionHandler.ts","../src/TextAnnotator.ts","../src/index.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 has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","/** @returns {void} */\nexport function noop() {}\n\nexport const identity = (x) => x;\n\n/**\n * @template T\n * @template S\n * @param {T} tar\n * @param {S} src\n * @returns {T & S}\n */\nexport function assign(tar, src) {\n\t// @ts-ignore\n\tfor (const k in src) tar[k] = src[k];\n\treturn /** @type {T & S} */ (tar);\n}\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n/**\n * @param {any} value\n * @returns {value is PromiseLike<any>}\n */\nexport function is_promise(value) {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\ttypeof (/** @type {any} */ (value).then) === 'function'\n\t);\n}\n\n/** @returns {void} */\nexport function add_location(element, file, line, column, char) {\n\telement.__svelte_meta = {\n\t\tloc: { file, line, column, char }\n\t};\n}\n\nexport function run(fn) {\n\treturn fn();\n}\n\nexport function blank_object() {\n\treturn Object.create(null);\n}\n\n/**\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function run_all(fns) {\n\tfns.forEach(run);\n}\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\n/** @returns {boolean} */\nexport function safe_not_equal(a, b) {\n\treturn a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function';\n}\n\nlet src_url_equal_anchor;\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nexport function src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\tif (!src_url_equal_anchor) {\n\t\tsrc_url_equal_anchor = document.createElement('a');\n\t}\n\t// This is actually faster than doing URL(..).href\n\tsrc_url_equal_anchor.href = url;\n\treturn element_src === src_url_equal_anchor.href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element_srcset\n * @param {string | undefined | null} srcset\n * @returns {boolean}\n */\nexport function srcset_url_equal(element_srcset, srcset) {\n\tconst element_urls = split_srcset(element_srcset.srcset);\n\tconst urls = split_srcset(srcset || '');\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n\n/** @returns {boolean} */\nexport function not_equal(a, b) {\n\treturn a != a ? b == b : a !== b;\n}\n\n/** @returns {boolean} */\nexport function is_empty(obj) {\n\treturn Object.keys(obj).length === 0;\n}\n\n/** @returns {void} */\nexport function validate_store(store, name) {\n\tif (store != null && typeof store.subscribe !== 'function') {\n\t\tthrow new Error(`'${name}' is not a store with a 'subscribe' method`);\n\t}\n}\n\nexport function subscribe(store, ...callbacks) {\n\tif (store == null) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(undefined);\n\t\t}\n\t\treturn noop;\n\t}\n\tconst unsub = store.subscribe(...callbacks);\n\treturn unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\n\n/**\n * Get the current value from a store by subscribing and immediately unsubscribing.\n *\n * https://svelte.dev/docs/svelte-store#get\n * @template T\n * @param {import('../store/public.js').Readable<T>} store\n * @returns {T}\n */\nexport function get_store_value(store) {\n\tlet value;\n\tsubscribe(store, (_) => (value = _))();\n\treturn value;\n}\n\n/** @returns {void} */\nexport function component_subscribe(component, store, callback) {\n\tcomponent.$$.on_destroy.push(subscribe(store, callback));\n}\n\nexport function create_slot(definition, ctx, $$scope, fn) {\n\tif (definition) {\n\t\tconst slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n\t\treturn definition[0](slot_ctx);\n\t}\n}\n\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n\treturn definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;\n}\n\nexport function get_slot_changes(definition, $$scope, dirty, fn) {\n\tif (definition[2] && fn) {\n\t\tconst lets = definition[2](fn(dirty));\n\t\tif ($$scope.dirty === undefined) {\n\t\t\treturn lets;\n\t\t}\n\t\tif (typeof lets === 'object') {\n\t\t\tconst merged = [];\n\t\t\tconst len = Math.max($$scope.dirty.length, lets.length);\n\t\t\tfor (let i = 0; i < len; i += 1) {\n\t\t\t\tmerged[i] = $$scope.dirty[i] | lets[i];\n\t\t\t}\n\t\t\treturn merged;\n\t\t}\n\t\treturn $$scope.dirty | lets;\n\t}\n\treturn $$scope.dirty;\n}\n\n/** @returns {void} */\nexport function update_slot_base(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tslot_changes,\n\tget_slot_context_fn\n) {\n\tif (slot_changes) {\n\t\tconst slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n\t\tslot.p(slot_context, slot_changes);\n\t}\n}\n\n/** @returns {void} */\nexport function update_slot(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tdirty,\n\tget_slot_changes_fn,\n\tget_slot_context_fn\n) {\n\tconst slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n\tupdate_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\n\n/** @returns {any[] | -1} */\nexport function get_all_dirty_from_scope($$scope) {\n\tif ($$scope.ctx.length > 32) {\n\t\tconst dirty = [];\n\t\tconst length = $$scope.ctx.length / 32;\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tdirty[i] = -1;\n\t\t}\n\t\treturn dirty;\n\t}\n\treturn -1;\n}\n\n/** @returns {{}} */\nexport function exclude_internal_props(props) {\n\tconst result = {};\n\tfor (const k in props) if (k[0] !== '$') result[k] = props[k];\n\treturn result;\n}\n\n/** @returns {{}} */\nexport function compute_rest_props(props, keys) {\n\tconst rest = {};\n\tkeys = new Set(keys);\n\tfor (const k in props) if (!keys.has(k) && k[0] !== '$') rest[k] = props[k];\n\treturn rest;\n}\n\n/** @returns {{}} */\nexport function compute_slots(slots) {\n\tconst result = {};\n\tfor (const key in slots) {\n\t\tresult[key] = true;\n\t}\n\treturn result;\n}\n\n/** @returns {(this: any, ...args: any[]) => void} */\nexport function once(fn) {\n\tlet ran = false;\n\treturn function (...args) {\n\t\tif (ran) return;\n\t\tran = true;\n\t\tfn.call(this, ...args);\n\t};\n}\n\nexport function null_to_empty(value) {\n\treturn value == null ? '' : value;\n}\n\nexport function set_store_value(store, ret, value) {\n\tstore.set(value);\n\treturn ret;\n}\n\nexport const has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\n\nexport function action_destroyer(action_result) {\n\treturn action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\n/** @param {number | string} value\n * @returns {[number, string]}\n */\nexport function split_css_unit(value) {\n\tconst split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n\treturn split ? [parseFloat(split[1]), split[2] || 'px'] : [/** @type {number} */ (value), 'px'];\n}\n\nexport const contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n","import {\n\trun_all,\n\tsubscribe,\n\tnoop,\n\tsafe_not_equal,\n\tis_function,\n\tget_store_value\n} from '../internal/index.js';\n\nconst subscriber_queue = [];\n\n/**\n * Creates a `Readable` store that allows reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#readable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readable(value, start) {\n\treturn {\n\t\tsubscribe: writable(value, start).subscribe\n\t};\n}\n\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#writable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Writable<T>}\n */\nexport function writable(value, start = noop) {\n\t/** @type {import('./public.js').Unsubscriber} */\n\tlet stop;\n\t/** @type {Set<import('./private.js').SubscribeInvalidateTuple<T>>} */\n\tconst subscribers = new Set();\n\t/** @param {T} new_value\n\t * @returns {void}\n\t */\n\tfunction set(new_value) {\n\t\tif (safe_not_equal(value, new_value)) {\n\t\t\tvalue = new_value;\n\t\t\tif (stop) {\n\t\t\t\t// store is ready\n\t\t\t\tconst run_queue = !subscriber_queue.length;\n\t\t\t\tfor (const subscriber of subscribers) {\n\t\t\t\t\tsubscriber[1]();\n\t\t\t\t\tsubscriber_queue.push(subscriber, value);\n\t\t\t\t}\n\t\t\t\tif (run_queue) {\n\t\t\t\t\tfor (let i = 0; i < subscriber_queue.length; i += 2) {\n\t\t\t\t\t\tsubscriber_queue[i][0](subscriber_queue[i + 1]);\n\t\t\t\t\t}\n\t\t\t\t\tsubscriber_queue.length = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {import('./public.js').Updater<T>} fn\n\t * @returns {void}\n\t */\n\tfunction update(fn) {\n\t\tset(fn(value));\n\t}\n\n\t/**\n\t * @param {import('./public.js').Subscriber<T>} run\n\t * @param {import('./private.js').Invalidator<T>} [invalidate]\n\t * @returns {import('./public.js').Unsubscriber}\n\t */\n\tfunction subscribe(run, invalidate = noop) {\n\t\t/** @type {import('./private.js').SubscribeInvalidateTuple<T>} */\n\t\tconst subscriber = [run, invalidate];\n\t\tsubscribers.add(subscriber);\n\t\tif (subscribers.size === 1) {\n\t\t\tstop = start(set, update) || noop;\n\t\t}\n\t\trun(value);\n\t\treturn () => {\n\t\t\tsubscribers.delete(subscriber);\n\t\t\tif (subscribers.size === 0 && stop) {\n\t\t\t\tstop();\n\t\t\t\tstop = null;\n\t\t\t}\n\t\t};\n\t}\n\treturn { set, update, subscribe };\n}\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>, set: (value: T) => void, update: (fn: import('./public.js').Updater<T>) => void) => import('./public.js').Unsubscriber | void} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>) => T} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * @template {import('./private.js').Stores} S\n * @template T\n * @param {S} stores\n * @param {Function} fn\n * @param {T} [initial_value]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function derived(stores, fn, initial_value) {\n\tconst single = !Array.isArray(stores);\n\t/** @type {Array<import('./public.js').Readable<any>>} */\n\tconst stores_array = single ? [stores] : stores;\n\tif (!stores_array.every(Boolean)) {\n\t\tthrow new Error('derived() expects stores as input, got a falsy value');\n\t}\n\tconst auto = fn.length < 2;\n\treturn readable(initial_value, (set, update) => {\n\t\tlet started = false;\n\t\tconst values = [];\n\t\tlet pending = 0;\n\t\tlet cleanup = noop;\n\t\tconst sync = () => {\n\t\t\tif (pending) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tconst result = fn(single ? values[0] : values, set, update);\n\t\t\tif (auto) {\n\t\t\t\tset(result);\n\t\t\t} else {\n\t\t\t\tcleanup = is_function(result) ? result : noop;\n\t\t\t}\n\t\t};\n\t\tconst unsubscribers = stores_array.map((store, i) =>\n\t\t\tsubscribe(\n\t\t\t\tstore,\n\t\t\t\t(value) => {\n\t\t\t\t\tvalues[i] = value;\n\t\t\t\t\tpending &= ~(1 << i);\n\t\t\t\t\tif (started) {\n\t\t\t\t\t\tsync();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tpending |= 1 << i;\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t\tstarted = true;\n\t\tsync();\n\t\treturn function stop() {\n\t\t\trun_all(unsubscribers);\n\t\t\tcleanup();\n\t\t\t// We need to set this to false because callbacks can still happen despite having unsubscribed:\n\t\t\t// Callbacks might already be placed in the queue which doesn't know it should no longer\n\t\t\t// invoke this derived store.\n\t\t\tstarted = false;\n\t\t};\n\t});\n}\n\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * https://svelte.dev/docs/svelte-store#readonly\n * @template T\n * @param {import('./public.js').Readable<T>} store - store to make readonly\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readonly(store) {\n\treturn {\n\t\tsubscribe: store.subscribe.bind(store)\n\t};\n}\n\nexport { get_store_value as get };\n","import { writable } from 'svelte/store';\nimport type { Annotation } from '../model';\nimport type { Store } from './Store';\n\nexport type HoverState<T extends Annotation> = ReturnType<typeof createHoverState<T>>;\n\nexport const createHoverState = <T extends Annotation>(store: Store<T>) => {\n\n const { subscribe, set } = writable<string>(null);\n\n let currentHover: string = null;\n\n subscribe(updated => currentHover = updated);\n\n // Track store delete and update events\n store.observe(( { changes }) => { \n if (currentHover) {\n const isDeleted = changes.deleted.some(a => a.id === currentHover);\n if (isDeleted)\n set(null);\n \n const updated = changes.updated.find(({ oldValue }) => oldValue.id === currentHover);\n if (updated)\n set(updated.newValue.id);\n }\n });\n\n return { \n get current() { return currentHover },\n subscribe, \n set \n };\n\n}\n","import { writable } from 'svelte/store';\nimport type { Annotation } from '../model';\nimport type { Store } from './Store';\n \nexport type Selection = {\n\n selected: { id: string, editable?: boolean }[],\n\n pointerEvent?: PointerEvent;\n\n}\n\nexport type SelectionState<T extends Annotation> = ReturnType<typeof createSelectionState<T>>;\n\nexport enum PointerSelectAction {\n\n EDIT = 'EDIT', // Make annotation target(s) editable on pointer select\n \n SELECT = 'SELECT', // Just select, but don't make editable\n\n NONE = 'NONE' // Click won't select - annotation is completely inert\n\n}\n\nconst EMPTY: Selection = { selected: [] };\n\nexport const createSelectionState = <T extends Annotation>(\n store: Store<T>,\n selectAction: PointerSelectAction | ((a: Annotation) => PointerSelectAction) = PointerSelectAction.EDIT\n) => {\n const { subscribe, set } = writable<Selection>(EMPTY);\n\n let currentSelection: Selection = EMPTY;\n\n subscribe(updated => currentSelection = updated);\n\n const clear = () => set(EMPTY);\n\n const isEmpty = () => currentSelection.selected?.length === 0;\n\n const isSelected = (annotationOrId: T | string) => {\n if (currentSelection.selected.length === 0)\n return false;\n\n const id = typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;\n return currentSelection.selected.some(i => i.id === id);\n }\n\n // TODO enable CTRL select\n const clickSelect = (id: string, pointerEvent: PointerEvent) => {\n const annotation = store.getAnnotation(id);\n if (annotation) {\n const action = onPointerSelect(annotation, selectAction);\n if (action === PointerSelectAction.EDIT)\n set({ selected: [{ id, editable: true }], pointerEvent }); \n else if (action === PointerSelectAction.SELECT)\n set({ selected: [{ id }], pointerEvent }); \n else\n set({ selected: [], pointerEvent });\n } else {\n console.warn('Invalid selection: ' + id);\n }\n }\n\n const setSelected = (idOrIds: string | string[], editable: boolean = true) => {\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n\n // Remove invalid\n const annotations = \n ids.map(id => store.getAnnotation(id)).filter(a => a); \n\n set({ selected: annotations.map(({ id }) => ({ id, editable })) });\n \n if (annotations.length !== ids.length)\n console.warn('Invalid selection', idOrIds);\n }\n\n const removeFromSelection = (ids: string[]) => {\n if (currentSelection.selected.length === 0)\n return false;\n\n const { selected } = currentSelection;\n\n // Checks which of the given annotations are actually in the selection\n const toRemove = selected.filter(({ id }) => ids.includes(id))\n\n if (toRemove.length > 0)\n set({ selected: selected.filter(({ id }) => !ids.includes(id)) });\n }\n\n // Track store delete and update events\n store.observe(({ changes }) =>\n removeFromSelection(changes.deleted.map(a => a.id)));\n\n return { \n clear, \n clickSelect, \n get selected() { return currentSelection ? [...currentSelection.selected ] : null},\n get pointerEvent() { return currentSelection ? currentSelection.pointerEvent : null },\n isEmpty, \n isSelected, \n setSelected, \n subscribe \n };\n\n}\n\nexport const onPointerSelect = (\n annotation: Annotation, \n action?: PointerSelectAction | ((a: Annotation) => PointerSelectAction)\n): PointerSelectAction => (typeof action === 'function') ?\n (action(annotation) || PointerSelectAction.EDIT) : \n (action || PointerSelectAction.EDIT);\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 { dequal } from 'dequal/lite';\nimport type { Update } from '../state';\nimport type { Annotation } from '../model';\n\nconst getAddedBodies = (oldValue: Annotation, newValue: Annotation) => {\n const oldBodyIds = new Set(oldValue.bodies.map(b => b.id));\n return newValue.bodies.filter(b => !oldBodyIds.has(b.id));\n}\n\nconst getRemovedBodies = (oldValue: Annotation, newValue: Annotation) => {\n const newBodyIds = new Set(newValue.bodies.map(b => b.id));\n return oldValue.bodies.filter(b => !newBodyIds.has(b.id));\n}\n\nconst getChangedBodies = (oldValue: Annotation, newValue: Annotation) => \n newValue.bodies\n .map(newBody => {\n const oldBody = oldValue.bodies.find(b => b.id === newBody.id);\n return { newBody, oldBody: oldBody && !dequal(oldBody, newBody) ? oldBody : undefined }\n })\n .filter(({ oldBody }) => oldBody);\n\nconst hasTargetChanged = (oldValue: Annotation, newValue: Annotation) => \n !dequal(oldValue.target, newValue.target);\n\nexport const diffAnnotations = <T extends Annotation = Annotation>(oldValue: T, newValue: T): Update<T> => {\n const bodiesCreated = getAddedBodies(oldValue, newValue);\n const bodiesDeleted = getRemovedBodies(oldValue, newValue);\n const bodiesUpdated = getChangedBodies(oldValue, newValue);\n\n return {\n oldValue, \n newValue,\n bodiesCreated: bodiesCreated.length > 0 ? bodiesCreated : undefined,\n bodiesDeleted: bodiesDeleted.length > 0 ? bodiesDeleted : undefined,\n bodiesUpdated: bodiesUpdated.length > 0 ? bodiesUpdated : undefined,\n targetUpdated: hasTargetChanged(oldValue, newValue) ? { oldTarget: oldValue.target, newTarget: newValue.target } : undefined\n }\n}","import type { Annotation, AnnotationBody, AnnotationTarget } from '../model';\nimport { diffAnnotations } from '../utils';\n\n/** Interface for listening to changes in the annotation store **/\nexport interface StoreObserver<T extends Annotation> { \n\n onChange: { (event: StoreChangeEvent<T>): void };\n\n options: StoreObserveOptions;\n\n}\n\n/** A change event fired when the store state changes **/\nexport interface StoreChangeEvent<T extends Annotation> {\n\n origin: Origin;\n\n changes: ChangeSet<T>;\n\n state: T[];\n\n}\n\nexport interface ChangeSet<T extends Annotation> {\n\n created?: T[];\n\n deleted?: T[];\n\n updated?: Update<T>[];\n\n}\n\nexport interface Update<T extends Annotation> {\n\n oldValue: T;\n\n newValue: T;\n\n bodiesCreated?: AnnotationBody[];\n\n bodiesDeleted?: AnnotationBody[];\n\n bodiesUpdated?: Array<{ oldBody: AnnotationBody, newBody: AnnotationBody }>;\n\n targetUpdated?: { oldTarget: AnnotationTarget, newTarget: AnnotationTarget};\n\n}\n\n/** Options to control which events the observer wants to get notified about **/\nexport interface StoreObserveOptions {\n\n // Observe changes on targets, bodies or both?\n ignore?: Ignore;\n\n // Observe changes on one more specific annotations\n annotations?: string | string[];\n\n // Observer changes only for a specific origin\n origin?: Origin\n\n}\n\n/** Allows the observer to ignore certain event types **/\nexport enum Ignore { \n\n // Don't notify this observer for changes that involve bodies only\n BODY_ONLY = 'BODY_ONLY',\n\n // Don't notify for changes on targets only\n TARGET_ONLY = 'TARGET_ONLY'\n\n}\n\n/** Allows the observer to listen only for events that originated locally or from a remote source **/\nexport enum Origin { \n \n LOCAL = 'LOCAL', \n \n REMOTE = 'REMOTE' \n\n}\n\n/** Tests if this observer should be notified about this event **/\nexport const shouldNotify = <T extends Annotation>(observer: StoreObserver<T>, event: StoreChangeEvent<T>) => {\n const { changes, origin } = event;\n\n const isRelevantOrigin = \n !observer.options.origin || observer.options.origin === origin;\n\n if (!isRelevantOrigin)\n return false;\n\n if (observer.options.ignore) {\n const { ignore } = observer.options;\n\n // Shorthand\n const has = (arg: any[]) => arg?.length > 0;\n\n const hasAnnotationChanges =\n has(changes.created) || has(changes.deleted);\n\n if (!hasAnnotationChanges) {\n const hasBodyChanges =\n changes.updated?.some(u => has(u.bodiesCreated) || has(u.bodiesDeleted) || has(u.bodiesUpdated));\n \n const hasTargetChanges = \n changes.updated?.some(u => u.targetUpdated);\n\n if (ignore === Ignore.BODY_ONLY && hasBodyChanges && !hasTargetChanges)\n return false;\n\n if (ignore === Ignore.TARGET_ONLY && hasTargetChanges && !hasBodyChanges)\n return false;\n }\n }\n\n if (observer.options.annotations) {\n // This observer has a filter set on specific annotations - check affected\n const affectedAnnotations = new Set([\n ...changes.created.map(a => a.id),\n ...changes.deleted.map(a => a.id),\n ...changes.updated.map(({ oldValue }) => oldValue.id)\n ]);\n\n const observed = Array.isArray(observer.options.annotations) ?\n observer.options.annotations : [ observer.options.annotations ];\n\n return Boolean(observed.find(id => affectedAnnotations.has(id)));\n } else {\n return true;\n }\n\n}\n\nexport const mergeChanges = <T extends Annotation>(changes: ChangeSet<T>, toMerge: ChangeSet<T>) => {\n\n const previouslyCreatedIds = new Set((changes.created || []).map(a => a.id));\n const previouslyUpdatedIds = new Set((changes.updated || []).map(({ newValue })=> newValue.id));\n\n const createdIds = new Set((toMerge.created || []).map(a => a.id));\n const deletedIds = new Set((toMerge.deleted || []).map(a => a.id));\n const updatedIds = new Set((toMerge.updated || []).map(({ oldValue }) => oldValue.id));\n\n // Updates that will be merged into create or previous update events\n const mergeableUpdates = new Set((toMerge.updated || [])\n .filter(({ oldValue }) => previouslyCreatedIds.has(oldValue.id) || previouslyUpdatedIds.has(oldValue.id))\n .map(({ oldValue }) => oldValue.id ));\n\n // * created *\n // - drop created that were then deleted\n // - merge any updates on created\n // - append newly created\n const created = [\n ...(changes.created || [])\n .filter(a => !deletedIds.has(a.id))\n .map(a => updatedIds.has(a.id) \n ? toMerge.updated.find(({ oldValue }) => oldValue.id === a.id).newValue\n : a),\n ...(toMerge.created || [])\n ];\n\n // * deleted *\n // - drop deleted that were later re-created (redo action!)\n // - append newly deleted, but remove any that delete annotations \n // that were created in the same round\n const deleted = [\n ...(changes.deleted || [])\n .filter(a => !createdIds.has(a.id)),\n ...(toMerge.deleted || []) \n .filter(a => !previouslyCreatedIds.has(a.id))\n ] \n\n // * updated *\n // - drop updates on deleted annotations\n // - merge any updates that override previous ones\n // - append new updates, but remove any that were merged\n const updated = [\n ...(changes.updated || [])\n .filter(({ newValue }) => !deletedIds.has(newValue.id))\n .map(update => {\n const { oldValue, newValue } = update;\n if (updatedIds.has(newValue.id)) {\n const updated = toMerge.updated.find(u => u.oldValue.id === newValue.id).newValue;\n return diffAnnotations(oldValue, updated);\n } else {\n return update;\n }\n }),\n ...(toMerge.updated || []).filter(({ oldValue }) => !mergeableUpdates.has(oldValue.id))\n ]\n\n return { created, deleted, updated };\n}","import type { Annotation, AnnotationBody, AnnotationTarget } from '../model';\nimport { diffAnnotations } from '../utils';\nimport { Origin, shouldNotify, type Update, type ChangeSet } from './StoreObserver';\nimport type { StoreObserver, StoreChangeEvent, StoreObserveOptions } from './StoreObserver';\n\n// Shorthand\ntype AnnotationBodyIdentifier = { id: string, annotation: string }; \n\nexport type Store<T extends Annotation> = ReturnType<typeof createStore<T>>;\n\nconst isAnnotation = <T extends Annotation>(arg: any): arg is T => arg.id !== undefined;\n\nexport const createStore = <T extends Annotation>() => {\n\n const annotationIndex = new Map<string, T>();\n\n const bodyIndex = new Map<string, string>();\n\n const observers: StoreObserver<T>[] = [];\n\n const observe = (onChange: { (event: StoreChangeEvent<T>): void }, options: StoreObserveOptions = {}) =>\n observers.push({ onChange, options });\n\n const unobserve = (onChange: { (event: StoreChangeEvent<T>): void }) => {\n const idx = observers.findIndex(observer => observer.onChange == onChange);\n if (idx > -1)\n observers.splice(idx, 1);\n }\n\n const emit = (origin: Origin, changes: ChangeSet<T>) => {\n const event: StoreChangeEvent<T> = {\n origin,\n changes: {\n created: changes.created || [],\n updated: changes.updated || [],\n deleted: changes.deleted || []\n },\n state: [...annotationIndex.values()]\n };\n\n observers.forEach(observer => {\n if (shouldNotify(observer, event))\n observer.onChange(event);\n });\n }\n\n const addAnnotation = (annotation: T, origin = Origin.LOCAL) => {\n const existing = annotationIndex.get(annotation.id);\n\n if (existing) {\n throw Error(`Cannot add annotation ${annotation.id} - exists already`);\n } else {\n annotationIndex.set(annotation.id, annotation);\n\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n emit(origin, { created: [annotation] });\n }\n }\n\n const updateOneAnnotation = (arg1: string | T, arg2?: T | Origin) => {\n const updated: T = typeof arg1 === 'string' ? arg2 as T : arg1;\n\n const oldId: string = typeof arg1 === 'string' ? arg1 : arg1.id;\n const oldValue = annotationIndex.get(oldId);\n\n if (oldValue) {\n const update: Update<T> = diffAnnotations(oldValue, updated);\n\n if (oldId === updated.id) {\n annotationIndex.set(oldId, updated);\n } else {\n annotationIndex.delete(oldId);\n annotationIndex.set(updated.id, updated);\n }\n\n oldValue.bodies.forEach(b => bodyIndex.delete(b.id));\n updated.bodies.forEach(b => bodyIndex.set(b.id, updated.id));\n\n return update;\n } else {\n console.warn(`Cannot update annotation ${oldId} - does not exist`);\n }\n }\n \n const updateAnnotation = (arg1: string | T, arg2: T | Origin = Origin.LOCAL, arg3 = Origin.LOCAL) => {\n const origin: Origin = isAnnotation(arg2) ? arg3 : arg2;\n\n const update = updateOneAnnotation(arg1, arg2);\n if (update)\n emit(origin, { updated: [update] })\n }\n\n const bulkUpdateAnnotation = (annotations: T[], origin = Origin.LOCAL) => {\n const updated = annotations.reduce((updated, annotation) => {\n const u = updateOneAnnotation(annotation);\n return u ? [...updated, u] : updated;\n }, [] as Update<T>[]);\n\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n const addBody = (body: AnnotationBody, origin = Origin.LOCAL) => {\n const oldValue = annotationIndex.get(body.annotation);\n if (oldValue) {\n const newValue = { \n ...oldValue,\n bodies: [ ...oldValue.bodies, body ]\n };\n\n annotationIndex.set(oldValue.id, newValue);\n\n bodyIndex.set(body.id, newValue.id);\n\n const update: Update<T> = {\n oldValue, newValue, bodiesCreated: [ body ]\n };\n\n emit(origin, { updated: [update] });\n } else {\n console.warn(`Attempt to add body to missing annotation: ${body.annotation}`);\n }\n }\n\n const all = () => [...annotationIndex.values()];\n\n const clear = (origin = Origin.LOCAL) => { \n const all = [...annotationIndex.values()];\n\n annotationIndex.clear();\n bodyIndex.clear();\n\n emit(origin, { deleted: all });\n }\n\n const bulkAddAnnotation = (annotations: T[], replace = true, origin = Origin.LOCAL) => {\n if (replace) {\n // Delete existing first\n const deleted = [...annotationIndex.values()];\n annotationIndex.clear();\n bodyIndex.clear();\n\n annotations.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: annotations, deleted });\n } else {\n // Don't allow overwriting of existing annotations\n const existing = annotations.reduce((all, next) => {\n const existing = annotationIndex.get(next.id);\n return existing ? [...all, existing ] : all;\n }, []);\n\n if (existing.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${existing.map(a => a.id).join(', ')}`);\n\n annotations.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: annotations });\n }\n }\n\n const deleteOneAnnotation = (annotationOrId: T | string) => {\n const id = typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;\n\n const existing = annotationIndex.get(id);\n if (existing) {\n annotationIndex.delete(id);\n existing.bodies.forEach(b => bodyIndex.delete(b.id));\n return existing;\n } else {\n console.warn(`Attempt to delete missing annotation: ${id}`);\n }\n }\n\n const deleteAnnotation = (annotationOrId: T | string, origin = Origin.LOCAL) => {\n const deleted = deleteOneAnnotation(annotationOrId);\n if (deleted)\n emit(origin, { deleted: [ deleted ]});\n }\n\n const bulkDeleteAnnotation = (annotationsOrIds: (T | string)[], origin = Origin.LOCAL) => {\n const deleted = annotationsOrIds.reduce((deleted, arg) => {\n const existing = deleteOneAnnotation(arg);\n return existing ? [...deleted, existing] : deleted;\n }, [] as T[]);\n\n if (deleted.length > 0)\n emit(origin, { deleted });\n }\n \n const deleteBody = (body: AnnotationBodyIdentifier, origin = Origin.LOCAL) => {\n const oldAnnotation = annotationIndex.get(body.annotation);\n\n if (oldAnnotation) {\n const oldBody = oldAnnotation.bodies.find(b => b.id === body.id);\n\n if (oldBody) {\n bodyIndex.delete(oldBody.id);\n\n const newAnnotation = {\n ...oldAnnotation,\n bodies: oldAnnotation.bodies.filter(b => b.id !== body.id)\n };\n\n annotationIndex.set(oldAnnotation.id, newAnnotation);\n\n const update: Update<T> = {\n oldValue: oldAnnotation, newValue: newAnnotation, bodiesDeleted: [oldBody]\n };\n\n emit(origin, { updated: [update] });\n } else {\n console.warn(`Attempt to delete missing body ${body.id} from annotation ${body.annotation}`);\n }\n } else {\n console.warn(`Attempt to delete body from missing annotation ${body.annotation}`);\n }\n }\n\n const getAnnotation = (id: string): T | undefined => {\n const a = annotationIndex.get(id);\n return a ? {...a} : undefined;\n }\n\n const getBody = (id: string): AnnotationBody | undefined => {\n const annotationId = bodyIndex.get(id);\n if (annotationId) {\n const annotation = getAnnotation(annotationId);\n const body = annotation.bodies.find(b => b.id === id);\n if (body) {\n return body;\n } else {\n console.error(`Store integrity error: body ${id} in index, but not in annotation`);\n }\n } else {\n console.warn(`Attempt to retrieve missing body: ${id}`);\n }\n }\n\n const updateOneBody = (oldBodyId: AnnotationBodyIdentifier, newBody: AnnotationBody) => {\n if (oldBodyId.annotation !== newBody.annotation)\n throw 'Annotation integrity violation: annotation ID must be the same when updating bodies';\n\n const oldAnnotation = annotationIndex.get(oldBodyId.annotation);\n if (oldAnnotation) {\n const oldBody = oldAnnotation.bodies.find(b => b.id === oldBodyId.id);\n\n const newAnnotation = { \n ...oldAnnotation,\n bodies: oldAnnotation.bodies.map(b => b.id === oldBody.id ? newBody : b)\n };\n\n annotationIndex.set(oldAnnotation.id, newAnnotation);\n\n if (oldBody.id !== newBody.id) {\n bodyIndex.delete(oldBody.id);\n bodyIndex.set(newBody.id, newAnnotation.id);\n }\n\n return {\n oldValue: oldAnnotation, \n newValue: newAnnotation,\n bodiesUpdated: [{ oldBody, newBody }]\n }\n } else {\n console.warn(`Attempt to add body to missing annotation ${oldBodyId.annotation}`);\n }\n }\n\n const updateBody = (oldBodyId: AnnotationBodyIdentifier, newBody: AnnotationBody, origin = Origin.LOCAL) => {\n const update = updateOneBody(oldBodyId, newBody);\n emit(origin, { updated: [ update ]} );\n }\n\n const bulkUpdateBodies = (bodies: AnnotationBody[], origin = Origin.LOCAL) => {\n const updated = bodies.map(b => updateOneBody({ id: b.id, annotation: b.annotation }, b));\n emit(origin, { updated });\n }\n\n const updateOneTarget = (target: AnnotationTarget): Update<T> => {\n const oldValue = annotationIndex.get(target.annotation);\n \n if (oldValue) {\n const newValue = { \n ...oldValue, \n target: {\n ...oldValue.target,\n ...target \n }\n };\n\n annotationIndex.set(oldValue.id, newValue);\n\n return {\n oldValue, newValue, targetUpdated: { \n oldTarget: oldValue.target,\n newTarget: target\n }\n };\n } else {\n console.warn(`Attempt to update target on missing annotation: ${target.annotation}`);\n }\n }\n\n const updateTarget = (target: AnnotationTarget, origin = Origin.LOCAL) => {\n const update = updateOneTarget(target);\n if (update)\n emit(origin, { updated: [ update ]} );\n }\n\n const bulkUpdateTargets = (targets: AnnotationTarget[], origin = Origin.LOCAL) => {\n const updated = targets.map(updateOneTarget).filter(val => val);\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n\treturn {\n addAnnotation,\n addBody,\n all,\n bulkAddAnnotation,\n bulkDeleteAnnotation,\n bulkUpdateAnnotation,\n bulkUpdateBodies,\n bulkUpdateTargets,\n clear,\n deleteAnnotation,\n deleteBody,\n getAnnotation,\n getBody,\n observe,\n unobserve,\n updateAnnotation,\n updateBody,\n updateTarget\n\t};\n\n}","export let createNanoEvents = () => ({\n emit(event, ...args) {\n let callbacks = this.events[event] || []\n for (let i = 0, length = callbacks.length; i < length; i++) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n this.events[event]?.push(cb) || (this.events[event] = [cb])\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n","import { createNanoEvents, type Unsubscribe } from 'nanoevents';\nimport type { Annotation } from '../model';\nimport type { Store } from './Store';\nimport { Origin } from './StoreObserver';\nimport { mergeChanges, type ChangeSet, type StoreChangeEvent, type Update } from './StoreObserver';\n\n// Duration with fast successive changes get merged \n// with the last event in the stack, rather than getting stacked\n// as a new undo/redo step.\nconst DEBOUNCE = 250;\n\nexport interface UndoStack <T extends Annotation> {\n\n canRedo(): boolean;\n\n canUndo(): boolean;\n\n destroy(): void;\n\n on<E extends keyof UndoStackEvents<T>>(event: E, callback: UndoStackEvents<T>[E]): Unsubscribe;\n\n undo(): void;\n\n redo(): void;\n\n}\n\nexport interface UndoStackEvents <T extends Annotation> {\n\n redo(change: ChangeSet<T>): void;\n\n undo(change: ChangeSet<T>): void;\n\n}\n\nexport const createUndoStack = <T extends Annotation>(store: Store<T>): UndoStack<T> => {\n\n const emitter = createNanoEvents<UndoStackEvents<T>>();\n\n const changeStack: ChangeSet<T>[] = [];\n\n let pointer = -1;\n\n let muteEvents = false;\n\n let lastEvent = 0;\n\n const onChange = (event: StoreChangeEvent<T>) => {\n if (!muteEvents) {\n const { changes } = event;\n\n const now = performance.now();\n\n if (now - lastEvent > DEBOUNCE) {\n // Put this change on the stack...\n changeStack.splice(pointer + 1);\n changeStack.push(changes);\n\n // ...and update the pointer\n pointer = changeStack.length - 1;\n } else {\n // Merge this change with the last in the stack\n const last = changeStack.length - 1;\n changeStack[last] = mergeChanges(changeStack[last], changes);\n }\n\n lastEvent = now;\n }\n\n muteEvents = false;\n }\n\n store.observe(onChange, { origin: Origin.LOCAL });\n\n const undoCreated = (created: T[]) => \n created?.length > 0 && store.bulkDeleteAnnotation(created);\n\n const redoCreated = (created: T[]) =>\n created?.length > 0 && store.bulkAddAnnotation(created, false);\n\n const undoUpdated = (updated: Update<T>[]) =>\n updated?.length > 0 && store.bulkUpdateAnnotation(updated.map(({ oldValue }) => oldValue));\n \n const redoUpdated = (updated: Update<T>[]) =>\n updated?.length > 0 && store.bulkUpdateAnnotation(updated.map(({ newValue }) => newValue));\n\n const undoDeleted = (deleted: T[]) => \n deleted?.length > 0 && store.bulkAddAnnotation(deleted, false);\n\n const redoDeleted = (deleted: T[]) =>\n deleted?.length > 0 && store.bulkDeleteAnnotation(deleted);\n\n const undo = () => {\n if (pointer > -1) {\n muteEvents = true;\n\n const { created, updated, deleted } = changeStack[pointer];\n\n undoCreated(created);\n undoUpdated(updated);\n undoDeleted(deleted);\n\n emitter.emit('undo', changeStack[pointer]);\n\n pointer -= 1;\n }\n }\n\n const canUndo = () => pointer > -1;\n\n const redo = () => {\n if (changeStack.length - 1 > pointer) {\n muteEvents = true;\n\n const { created, updated, deleted } = changeStack[pointer + 1];\n\n redoCreated(created);\n redoUpdated(updated);\n redoDeleted(deleted);\n\n emitter.emit('redo', changeStack[pointer + 1]);\n\n pointer += 1;\n }\n }\n\n const canRedo = () => changeStack.length - 1 > pointer;\n\n const destroy = () => store.unobserve(onChange);\n\n const on = <E extends keyof UndoStackEvents<T>>(event: E, callback: UndoStackEvents<T>[E]) => \n emitter.on(event, callback);\n\n return {\n canRedo,\n canUndo,\n destroy,\n on,\n redo,\n undo\n }\n\n}","import { writable } from 'svelte/store';\n\nexport type ViewportState = ReturnType<typeof createViewportState>;\n\nexport const createViewportState = () => {\n\n const { subscribe, set } = writable<string[]>([]);\n\n return { \n subscribe, \n set\n };\n\n}\n","import { dequal } from 'dequal/lite';\nimport type { Annotation, AnnotatorState, FormatAdapter } from '../model';\nimport { Origin, type ChangeSet, type UndoStack } from '../state';\nimport type { ViewportState } from '../state';\nimport type { LifecycleEvents } from './LifecycleEvents';\n\nexport type Lifecycle<I extends Annotation, E extends unknown> = \n ReturnType<typeof createLifecyleObserver<I, E>>;\n\nexport const createLifecyleObserver = <I extends Annotation, E extends unknown>(\n state: AnnotatorState<I>,\n undoStack: UndoStack<I>,\n adapter?: FormatAdapter<I, E>,\n autoSave?: boolean\n) => {\n const { store, selection, hover, viewport } = state;\n\n const observers: Map<keyof LifecycleEvents, Function[]> = new Map();\n\n // The currently selected annotations, in the state when they were selected \n let initialSelection: I[] = [];\n\n let currentHover: string | undefined;\n\n let idleTimeout: ReturnType<typeof setTimeout>;\n\n const on = <T extends keyof LifecycleEvents>(event: T, callback: LifecycleEvents<E>[T]) => {\n if (observers.has(event)) {\n observers.get(event).push(callback);\n } else {\n observers.set(event, [callback]);\n }\n }\n\n const off = <T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]) => {\n const callbacks = observers.get(event);\n if (callbacks) {\n const idx = callbacks.indexOf(callback);\n if (idx > 0)\n callbacks.splice(callbacks.indexOf(callback), 1);\n }\n }\n\n const emit = (event: keyof LifecycleEvents<E>, arg0: I | I[], arg1?: I | PointerEvent) => {\n if (observers.has(event)) {\n setTimeout(() => {\n observers.get(event).forEach(callback => { \n if (adapter) {\n const serialized0 = Array.isArray(arg0) ? \n arg0.map(a => adapter.serialize(a)) : adapter.serialize(arg0);\n \n const serialized1: E | PointerEvent | undefined =\n arg1 ? arg1 instanceof PointerEvent ? arg1 : adapter.serialize(arg1) : undefined;\n\n callback(serialized0 as E & E[], serialized1); \n } else {\n callback(arg0 as E & E[], arg1 as unknown as E); \n }\n });\n }, 1);\n }\n }\n\n const onIdleUpdate = () => {\n const { selected } = selection;\n\n // User idle after activity - fire update events for selected\n // annotations that changed\n const updatedSelected = selected.map(({ id }) => store.getAnnotation(id));\n\n updatedSelected.forEach(updated => {\n const initial = initialSelection.find(a => a.id === updated.id);\n if (!initial || !dequal(initial, updated)) {\n emit('updateAnnotation', updated, initial);\n }\n });\n\n initialSelection = initialSelection.map(initial => {\n const updated = updatedSelected.find(({ id }) => id === initial.id);\n return updated ? updated : initial\n });\n }\n\n selection.subscribe(({ selected })=> {\n if (initialSelection.length === 0 && selected.length === 0)\n return;\n\n if (initialSelection.length === 0 && selected.length > 0) {\n // A new selection was made - store the editable annotation as initial state\n initialSelection = selected.map(({ id }) => store.getAnnotation(id));\n } else if (initialSelection.length > 0 && selected.length === 0) {\n // Deselect!\n initialSelection.forEach(initial => {\n const updatedState = store.getAnnotation(initial.id); \n \n if (updatedState && !dequal(updatedState, initial)) {\n emit('updateAnnotation', updatedState, initial);\n }\n });\n\n initialSelection = [];\n } else {\n // Changed selection\n const initialIds = new Set(initialSelection.map(a => a.id));\n const selectedIds = new Set(selected.map(({ id }) => id));\n\n // Fire update events for deselected annotations that have changed\n const deselected = initialSelection.filter(a => !selectedIds.has(a.id));\n deselected.forEach(initial => {\n const updatedState = store.getAnnotation(initial.id);\n\n if (updatedState && !dequal(updatedState, initial))\n emit('updateAnnotation', updatedState, initial);\n });\n\n initialSelection = [\n // Remove annotations that were deselected\n ...initialSelection.filter(a => selectedIds.has(a.id)),\n // Add editable annotations that were selected\n ...selected.filter(({ id }) => !initialIds.has(id))\n .map(({ id }) => store.getAnnotation(id))\n ];\n }\n\n emit('selectionChanged', initialSelection);\n });\n\n hover.subscribe(id => {\n if (!currentHover && id) {\n emit('mouseEnterAnnotation', store.getAnnotation(id));\n } else if (currentHover && !id) {\n emit('mouseLeaveAnnotation', store.getAnnotation(currentHover));\n } else if (currentHover && id) {\n emit('mouseLeaveAnnotation', store.getAnnotation(currentHover));\n emit('mouseEnterAnnotation', store.getAnnotation(id));\n }\n\n currentHover = id;\n });\n\n viewport?.subscribe(ids => \n emit('viewportIntersect', ids.map(store.getAnnotation)));\n\n store.observe(event => {\n // autoSave option triggers update events on idleness\n if (autoSave) {\n if (idleTimeout)\n clearTimeout(idleTimeout);\n\n idleTimeout = setTimeout(onIdleUpdate, 1000);\n }\n\n // Local CREATE and DELETE events are applied immediately\n const { created, deleted } = event.changes;\n created.forEach(a => emit('createAnnotation', a));\n deleted.forEach(a => emit('deleteAnnotation', a));\n\n // Updates are only applied immediately if they involve body changes\n const updatesWithBody = event.changes.updated.filter(u => [\n ...(u.bodiesCreated || []),\n ...(u.bodiesDeleted || []),\n ...(u.bodiesUpdated || [])\n ].length > 0);\n\n // Emit an update with the new annototation and the stored initial state\n updatesWithBody.forEach(({ oldValue, newValue }) => {\n const initial = initialSelection.find(a => a.id === oldValue.id) || oldValue;\n\n // Record the update as the new last known state\n initialSelection = initialSelection\n .map(a => a.id === oldValue.id ? newValue : a);\n\n emit('updateAnnotation', newValue, initial);\n });\n }, { origin: Origin.LOCAL });\n\n // Track remote changes - these should update the initial state\n store.observe(event => {\n if (initialSelection) {\n const selectedIds = new Set(initialSelection.map(a => a.id));\n\n const relevantUpdates = event.changes.updated\n .filter(({ newValue }) => selectedIds.has(newValue.id))\n .map(({ newValue }) => newValue);\n\n if (relevantUpdates.length > 0) {\n initialSelection = initialSelection.map(selected => {\n const updated = relevantUpdates.find(updated => updated.id === selected.id);\n return updated ? updated : selected;\n })\n }\n }\n }, { origin: Origin.REMOTE });\n\n const onUndoOrRedo = (undo: boolean) => (changes: ChangeSet<I>) => {\n const { created, deleted, updated } = changes;\n created.forEach(a => emit('createAnnotation', a));\n deleted.forEach(a => emit('deleteAnnotation', a));\n\n if (undo)\n updated.forEach(t => emit('updateAnnotation', t.oldValue, t.newValue));\n else\n updated.forEach(t => emit('updateAnnotation', t.newValue, t.oldValue));\n }\n\n undoStack.on('undo', onUndoOrRedo(true));\n undoStack.on('redo', onUndoOrRedo(false));\n\n return { on, off, emit }\n\n}","import type { Annotation } from './Annotation';\n\nexport interface FormatAdapter<A extends Annotation, T extends unknown> {\n\n parse(serialized: T): ParseResult<A>;\n\n serialize(core: A): T;\n\n}\n\nexport interface ParseResult<A extends Annotation> {\n\n parsed?: A;\n \n error?: Error;\n\n}\n\nexport const serializeAll = \n <A extends Annotation, T extends unknown>(adapter: FormatAdapter<A, T>) =>\n (annotations: A[]) => annotations.map(a => adapter.serialize(a));\n\nexport const parseAll = \n <A extends Annotation, T extends unknown>(adapter: FormatAdapter<A, T>) =>\n (serialized: T[]) => serialized.reduce((result, next) => {\n const { parsed, error } = adapter.parse(next);\n\n return error ? {\n parsed: result.parsed,\n failed: [...result.failed, next ]\n } : {\n parsed: [...result.parsed, parsed ],\n failed: result.failed\n }\n }, { parsed: [], failed: [] });\n ","import type { Annotation } from './Annotation';\nimport type { User } from './User';\nimport type { PresenceProvider } from '../presence';\nimport { Origin, type HoverState, type SelectionState, type Store, type UndoStack, type ViewportState } from '../state';\nimport type { LifecycleEvents } from '../lifecycle';\nimport { parseAll, type FormatAdapter } from './FormatAdapter';\nimport type { DrawingStyle } from './DrawingStyle';\nimport type { Filter } from './Filter';\n\n/**\n * Base annotator interface.\n * I ... internal core data model \n * E ... external adapted representation\n */\nexport interface Annotator<I extends Annotation = Annotation, E extends unknown = Annotation> {\n\n addAnnotation(annotation: E): void;\n\n cancelSelected(): void;\n\n canRedo(): boolean;\n\n canUndo(): boolean;\n\n clearAnnotations(): void;\n\n destroy(): void;\n\n getAnnotationById(id: string): E | undefined;\n\n getAnnotations(): E[];\n\n getSelected(): E[];\n\n getUser(): User;\n\n loadAnnotations(url: string): Promise<E[]>;\n\n redo(): void;\n\n removeAnnotation(arg: E | string): E;\n\n setAnnotations(annotations: E[]): void;\n\n setFilter(filter: Filter): void;\n\n setPresenceProvider?(provider: PresenceProvider): void;\n\n setSelected(arg?: string | string[]): void;\n\n setStyle(arg: DrawingStyle | ((annotation: I) => DrawingStyle) | undefined): void;\n\n setUser(user: User): void;\n\n undo(): void;\n\n updateAnnotation(annotation: E): E;\n \n on<T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]): void;\n\n off<T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]): void;\n\n state: AnnotatorState<I>;\n\n}\n\nexport interface AnnotatorState<A extends Annotation> {\n\n store: Store<A>;\n\n selection: SelectionState<A>;\n\n hover: HoverState<A>;\n\n viewport: ViewportState;\n\n}\n\nexport const createBaseAnnotator = <I extends Annotation, E extends unknown>(\n state: AnnotatorState<I>, \n undoStack: UndoStack<I>,\n adapter?: FormatAdapter<I, E>\n) => {\n\n const { store, selection } = state;\n\n const addAnnotation = (annotation: E) => {\n if (adapter) {\n const { parsed, error } = adapter.parse(annotation);\n if (parsed) {\n store.addAnnotation(parsed, Origin.REMOTE);\n } else {\n console.error(error);\n }\n } else {\n store.addAnnotation(annotation as unknown as I, Origin.REMOTE);\n }\n }\n\n const cancelSelected = () => selection.clear();\n\n const clearAnnotations = () => store.clear();\n\n const getAnnotationById = (id: string): E | undefined => {\n const annotation = store.getAnnotation(id);\n return (adapter && annotation) ?\n adapter.serialize(annotation) as E : annotation as unknown as E;\n }\n\n const getAnnotations = () =>\n (adapter ? store.all().map(adapter.serialize) : store.all()) as E[];\n\n const getSelected = () => {\n const selectedIds = selection.selected?.map(s => s.id) || [];\n\n const selected = selectedIds.map(id => store.getAnnotation(id));\n\n return adapter \n ? selected.map(adapter.serialize) \n : selected as unknown as E[];\n }\n\n const loadAnnotations = (url: string) =>\n fetch(url)\n .then((response) => response.json())\n .then((annotations) => {\n setAnnotations(annotations);\n return annotations;\n });\n\n const removeAnnotation = (arg: E | string): E => {\n if (typeof arg === 'string') {\n const annotation = store.getAnnotation(arg);\n store.deleteAnnotation(arg);\n\n return adapter ? adapter.serialize(annotation) : annotation as unknown as E;\n } else {\n const annotation = adapter ? adapter.parse(arg).parsed : (arg as unknown as I);\n store.deleteAnnotation(annotation);\n return arg;\n }\n }\n\n const setAnnotations = (annotations: E[]) => {\n if (adapter) {\n const { parsed, failed } = parseAll(adapter)(annotations);\n\n if (failed.length > 0)\n console.warn(`Discarded ${failed.length} invalid annotations`, failed);\n\n store.bulkAddAnnotation(parsed, true, Origin.REMOTE);\n } else {\n store.bulkAddAnnotation(annotations as unknown as I[], true, Origin.REMOTE);\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 updateAnnotation = (updated: E): E => {\n if (adapter) {\n const crosswalked = adapter.parse(updated).parsed;\n const previous = adapter.serialize(store.getAnnotation(crosswalked.id));\n store.updateAnnotation(crosswalked);\n return previous;\n } else {\n const previous = store.getAnnotation((updated as unknown as I).id);\n store.updateAnnotation(updated as unknown as I);\n return previous as unknown as E;\n }\n }\n\n // Note that we don't spread the undoStack - it has a .destroy()\n // method that would likely get overwritten by other Annotator implementations\n // if people are not careful.\n return { \n addAnnotation,\n cancelSelected,\n canRedo: undoStack.canRedo,\n canUndo: undoStack.canUndo,\n clearAnnotations,\n getAnnotationById,\n getAnnotations,\n getSelected,\n loadAnnotations,\n redo: undoStack.redo,\n removeAnnotation,\n setAnnotations,\n setSelected,\n undo: undoStack.undo,\n updateAnnotation\n }\n\n}","export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n","import { customAlphabet } from 'nanoid';\n\nexport interface User {\n\n id: string;\n\n isGuest?: boolean;\n\n name?: string;\n\n avatar?: string;\n\n}\n\nexport const createAnonymousGuest = () => {\n const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_', 20);\n \n return { isGuest: true, id: nanoid() }\n}","import type { AnnotationBody } from './Annotation';\n\nexport interface W3CAnnotation {\n\n '@context': 'http://www.w3.org/ns/anno.jsonld';\n\n type: 'Annotation';\n\n id: string;\n\n body: W3CAnnotationBody | W3CAnnotationBody[]\n\n target: W3CAnnotationTarget | W3CAnnotationTarget[];\n\n [key: string]: any;\n\n}\n\nexport interface W3CAnnotationBody {\n\n id?: string;\n\n type?: string;\n\n purpose?: string;\n\n value?: string;\n\n source?: string;\n\n created?: Date;\n\n creator?: {\n\n type?: string;\n\n id: string;\n\n name?: string;\n\n };\n\n}\n\nexport interface W3CAnnotationTarget {\n\n source: string;\n\n selector?: W3CSelector | W3CSelector[];\n\n}\n\nexport interface W3CSelector {\n\n type: string;\n\n conformsTo?: string;\n\n value: string;\n}\n\n// https://stackoverflow.com/questions/6122571/simple-non-secure-hash-function-for-javascript\nconst hashCode = (obj: Object): string => {\n const str = JSON.stringify(obj);\n\n let hash = 0;\n\n for (let i = 0, len = str.length; i < len; i++) {\n let chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n\n return `${hash}`;\n}\n\n/**\n * Helper to crosswalk the W3C annotation body to a list of core AnnotationBody objects.\n */\nexport const parseW3CBodies = (\n body: W3CAnnotationBody | W3CAnnotationBody[], \n annotationId: string\n): AnnotationBody[] => (Array.isArray(body) ? body : [body]).map(body => {\n\n // Exctract properties that conform to the internal model, but keep custom props\n const { id, type, purpose, value, created, creator, ...rest } = body;\n\n // The internal model strictly requires IDs. (Because multi-user scenarios\n // will have problems without them.) In the W3C model, bodys *may* have IDs.\n // We'll create ad-hoc IDs for bodies without IDs, but want to make sure that\n // generating the ID is idempotent: the same body should always get the same ID.\n // This will avoid unexpected results when checking for equality. \n return {\n id: id || `temp-${hashCode(body)}`,\n annotation: annotationId,\n type,\n purpose,\n value,\n created,\n creator: creator ? \n typeof creator === 'object' ? { ...creator }: creator :\n undefined,\n ...rest\n }\n\n});\n\n/** Serialization helper to remove core-specific fields from the annotation body **/\nexport const serializeW3CBodies = (bodies: AnnotationBody[]): W3CAnnotationBody[] => \n bodies.map(b => {\n const w3c = { ...b };\n delete w3c.annotation;\n\n if (w3c.id?.startsWith('temp-'))\n delete w3c.id;\n \n return w3c;\n });","import { nanoid } from 'nanoid';\nimport { createNanoEvents, type Unsubscribe } from 'nanoevents';\nimport type { User } from '../model';\nimport type { PresentUser } from './PresentUser';\nimport type { PresenceEvents } from './PresenceEvents';\nimport { createDefaultAppearenceProvider } from './AppearanceProvider';\nimport type { AppearanceProvider } from './AppearanceProvider';\n\nexport interface PresenceState {\n\n // Get users currently present to this room\n getPresentUsers(): PresentUser[];\n\n // Notify of a given present user's activity on the given annotations\n notifyActivity(presenceKey: string, annotationIds: string[]): void;\n\n // Add a listener for the given presence event\n on<E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]): Unsubscribe;\n\n // Initial sync - which users are present under which keys\n syncUsers(state: { presenceKey: string, user: User }[]): void;\n\n // Update the selection state for the given prresent user\n updateSelection(presenceKey: string, selection: string[] | null): void;\n\n}\n\nconst isListEqual = (listA: any[], listB: any[]) => \n listA.every(a => listA.includes(a)) && listB.every(b => listA.includes(b));\n\n// This client's presence key\nexport const PRESENCE_KEY = nanoid();\n\nexport const createPresenceState = (\n appearanceProvider: AppearanceProvider = createDefaultAppearenceProvider()\n): PresenceState => {\n\n const emitter = createNanoEvents<PresenceEvents>();\n\n const presentUsers = new Map<string, PresentUser>();\n\n const selectionStates = new Map<string, string[]>();\n\n const addUser = (presenceKey: string, user: User) => {\n if (presentUsers.has(presenceKey)) {\n console.warn('Attempt to add user that is already present', presenceKey, user);\n return; \n }\n\n const appearance = appearanceProvider.addUser(presenceKey, user);\n\n presentUsers.set(presenceKey, { \n ...user,\n presenceKey,\n appearance\n });\n }\n\n const removeUser = (presenceKey: string) => {\n const user = presentUsers.get(presenceKey);\n if (!user) {\n console.warn('Attempt to remove user that is not present', presenceKey);\n return;\n }\n\n appearanceProvider.removeUser(user);\n\n presentUsers.delete(presenceKey);\n }\n\n const syncUsers = (state: { presenceKey: string, user: User }[]) => {\n // const keys = new Set(others.map(s => s.presenceKey));\n const keys = new Set(state.map(s => s.presenceKey));\n\n // These users need to be added to the presentUsers list\n // const toAdd = others.filter(({ presenceKey }) => !presentUsers.has(presenceKey));\n const toAdd = state.filter(({ presenceKey }) => !presentUsers.has(presenceKey));\n\n // These users need to be dropped from the list\n const toRemove = Array.from(presentUsers.values()).filter(presentUser =>\n !keys.has(presentUser.presenceKey));\n\n toAdd.forEach(({ presenceKey, user }) => addUser(presenceKey, user));\n\n toRemove.forEach(user => {\n const { presenceKey } = user;\n\n // If this user has a selection, fire deselect event\n if (selectionStates.has(presenceKey))\n emitter.emit('selectionChange', user, null);\n\n removeUser(presenceKey)\n });\n\n if (toAdd.length > 0 || toRemove.length > 0)\n emitter.emit('presence', getPresentUsers());\n }\n\n const notifyActivity = (presenceKey: string, annotationIds: string[]) => { \n const user = presentUsers.get(presenceKey);\n \n if (!user) {\n console.warn('Activity notification from user that is not present');\n return;\n }\n\n const currentSelection = selectionStates.get(presenceKey);\n\n // Was there a selection change we might have missed?\n if (!currentSelection || !isListEqual(currentSelection, annotationIds)) {\n selectionStates.set(presenceKey, annotationIds);\n emitter.emit('selectionChange', user, annotationIds);\n }\n }\n\n const updateSelection = (presenceKey: string, selection: string[] | null) => {\n const from = presentUsers.get(presenceKey);\n if (!from) {\n console.warn('Selection change for user that is not present', presenceKey);\n return;\n }\n\n if (selection)\n selectionStates.set(presenceKey, selection);\n else \n selectionStates.delete(presenceKey);\n\n emitter.emit('selectionChange', from, selection);\n }\n\n const getPresentUsers = () =>\n [...Array.from(presentUsers.values())];\n \n const on = <E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]) =>\n emitter.on(event, callback);\n\n return {\n getPresentUsers,\n notifyActivity,\n on,\n syncUsers,\n updateSelection\n }\n\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 null;\n\n if (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}","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}","export * from './highlight';\nexport * from './model';\nexport * from './state';\nexport * from './presence/PresencePainterOptions';\nexport * from './TextAnnotator';\nexport * from './TextAnnotatorOptions';\n\n// Re-export essentials from @annotorious/core utilities for convenience\nexport * from '@annotorious/core/src/model';\n\nimport { \n Origin as _Origin,\n} from '@annotorious/core/src/state';\n\nexport const Origin = _Origin;"],"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","has","dequal","foo","bar","ctor","noop","safe_not_equal","b","subscriber_queue","writable","value","stop","subscribers","set","new_value","run_queue","subscriber","i","update","fn","subscribe","run","invalidate","createHoverState","currentHover","updated","changes","oldValue","EMPTY","createSelectionState","selectAction","currentSelection","clear","isEmpty","_a","annotationOrId","clickSelect","pointerEvent","action","onPointerSelect","setSelected","idOrIds","editable","removeFromSelection","selected","getRandomValues","rnds8","rng","byteToHex","unsafeStringify","arr","offset","randomUUID","native","v4","options","buf","rnds","getAddedBodies","newValue","oldBodyIds","getRemovedBodies","newBodyIds","getChangedBodies","newBody","oldBody","hasTargetChanged","diffAnnotations","bodiesCreated","bodiesDeleted","bodiesUpdated","Origin","shouldNotify","observer","_b","origin","ignore","arg","hasBodyChanges","u","hasTargetChanges","affectedAnnotations","mergeChanges","toMerge","previouslyCreatedIds","previouslyUpdatedIds","createdIds","deletedIds","updatedIds","mergeableUpdates","created","deleted","isAnnotation","createStore","annotationIndex","bodyIndex","observers","observe","onChange","unobserve","idx","emit","addAnnotation","updateOneAnnotation","arg1","arg2","oldId","updateAnnotation","arg3","bulkUpdateAnnotation","addBody","body","all","bulkAddAnnotation","replace","existing","next","deleteOneAnnotation","deleteAnnotation","bulkDeleteAnnotation","annotationsOrIds","deleteBody","oldAnnotation","newAnnotation","getAnnotation","getBody","annotationId","updateOneBody","oldBodyId","updateBody","bulkUpdateBodies","bodies","updateOneTarget","targets","val","createNanoEvents","callbacks","length","cb","DEBOUNCE","createUndoStack","emitter","changeStack","pointer","muteEvents","lastEvent","now","last","undoCreated","redoCreated","undoUpdated","redoUpdated","undoDeleted","redoDeleted","callback","createViewportState","createLifecyleObserver","undoStack","adapter","autoSave","initialSelection","idleTimeout","on","off","arg0","serialized0","serialized1","onIdleUpdate","updatedSelected","initial","updatedState","initialIds","relevantUpdates","onUndoOrRedo","undo","t","serializeAll","parseAll","serialized","result","parsed","error","createBaseAnnotator","cancelSelected","clearAnnotations","getAnnotationById","getAnnotations","getSelected","s","loadAnnotations","url","response","setAnnotations","removeAnnotation","failed","crosswalked","previous","random","bytes","customRandom","alphabet","defaultSize","getRandom","mask","step","size","j","customAlphabet","nanoid","byte","createAnonymousGuest","hashCode","obj","str","hash","chr","parseW3CBodies","type","purpose","creator","rest","serializeW3CBodies","w3c","quickselect","k","right","compare","quickselectStep","defaultCompare","m","z","sd","newLeft","newRight","swap","tmp","RBush","maxEntries","bbox","node","intersects","toBBox","nodesToSearch","child","childBBox","contains","data","tmpNode","item","createNode","equalsFn","path","indexes","parent","goingUp","index","findItem","items","N","M","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","p","destNode","children","stack","mid","getRelation","rectA","rectB","round","num","union","bottom","mergeClientRects","merged","wasMerged","relation","r","trimRange","startContainer","endContainer","nextContainer","nextText","prevContainer","prevText","createSpatialTree","tree","toItems","rect","insert","remove","rectsByTarget","allRects","getAt","hits","getBoundsForAnnotation","getDOMRectsForAnnotation","indexed","hasValidRange","createTextAnnotatorState","defaultPointerAction","revived","isValid","couldNotRevive","updateTarget","bulkUpdateTargets","getIntersecting","getAnnotationBounds","buffer","match","getIntersectingRects","groupedByAnnotationId","grouped","recalculatePositions","createPainter","provider","opts","trackedAnnotations","getAnnotationsForUser","user","_","metrics","labelWidth","labelHeight","paddingBottom","getScrollParent","el","scrollIntoView","scrollParent","current","parentBounds","parentHeight","parentWidth","annotationBounds","offsetTop","offsetLeft","scrollTop","scrollLeft","rangeToSelector","offsetReferenceSelector","rangeBefore","quote","SelectionHandler","currentUser","currentTarget","setUser","isLeftClick","lastPointerEvent","evt","uuidv4","debounceTimer","onSelectionChange","sel","ranges","hovered","createTextAnnotator","lifecycle","highlightLayer","selectionHandler","_Origin"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]}
|
|
1
|
+
{"version":3,"file":"text-annotator.es.js","sources":["../src/highlight/HighlightStyle.ts","../src/highlight/HighlightPainter.ts","../src/utils/splitAnnotatableRanges.ts","../src/utils/cancelSingleClickEvents.ts","../src/utils/debounce.ts","../src/utils/getAnnotatableFragment.ts","../src/utils/getClientRectsPonyfill.ts","../src/utils/getQuoteContext.ts","../src/utils/isWhitespaceOrEmpty.ts","../src/utils/isRevived.ts","../src/utils/mergeClientRects.ts","../src/utils/rangeToSelector.ts","../src/utils/reviveSelector.ts","../src/utils/reviveTarget.ts","../src/utils/reviveAnnotation.ts","../src/highlight/viewport.ts","../src/highlight/baseRenderer.ts","../src/highlight/canvas/canvasRenderer.ts","../../../node_modules/colord/index.mjs","../src/highlight/highlights/highlightsRenderer.ts","../../../node_modules/dequal/lite/index.mjs","../src/highlight/span/spansRenderer.ts","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../../../node_modules/@annotorious/core/dist/annotorious-core.es.js","../src/model/w3c/W3CTextFormatAdapter.ts","../../../node_modules/quickselect/index.js","../../../node_modules/rbush/index.js","../src/state/spatialTree.ts","../src/state/TextAnnotatorState.ts","../src/presence/PresencePainter.ts","../src/api/scrollIntoView.ts","../src/TextAnnotatorOptions.ts","../src/SelectionHandler.ts","../src/TextAnnotator.ts"],"sourcesContent":["import type { AnnotationState, Color, DrawingStyle } from '@annotorious/core';\nimport type { TextAnnotation } from 'src/model';\n\nexport interface HighlightStyle extends Pick<DrawingStyle, 'fill' | 'fillOpacity'> {\n\n underlineStyle?: string;\n\n underlineColor?: Color;\n\n underlineOffset?: number;\n\n underlineThickness?: number;\n \n}\n\nexport type HighlightStyleExpression = HighlightStyle \n | ((annotation: TextAnnotation, state: AnnotationState, zIndex?: number) => HighlightStyle | undefined);\n\nexport const DEFAULT_STYLE: HighlightStyle = { \n fill: 'rgb(0, 128, 255)', \n fillOpacity: 0.18\n};\n\nexport const DEFAULT_SELECTED_STYLE: HighlightStyle = { \n fill: 'rgb(0, 128, 255)', \n fillOpacity: 0.45 \n};\n","\nimport type { Highlight } from './Highlight';\nimport { DEFAULT_SELECTED_STYLE, DEFAULT_STYLE } from './HighlightStyle';\nimport type { HighlightStyle, HighlightStyleExpression } from './HighlightStyle';\nimport type { ViewportBounds } from './viewport';\n\nexport interface HighlightPainter {\n\n clear(): void;\n\n destroy(): void;\n\n paint(highlight: Highlight, viewportBounds: ViewportBounds): HighlightStyle;\n\n reset(): void;\n\n}\n\n/** Helper **/\nexport const paint = (\n highlight: Highlight,\n viewportBounds: ViewportBounds,\n style?: HighlightStyleExpression, \n painter?: HighlightPainter,\n zIndex?: number\n) => {\n const base: HighlightStyle = style \n ? typeof style === 'function' \n ? style(highlight.annotation, highlight.state, zIndex) || (\n highlight.state?.selected ? DEFAULT_SELECTED_STYLE : DEFAULT_STYLE\n )\n : style \n : highlight.state?.selected \n ? DEFAULT_SELECTED_STYLE \n : DEFAULT_STYLE;\n\n // Trigger the custom painter (if any) as a side-effect\n return painter ? painter.paint(highlight, viewportBounds) || base : base;\n}","export const NOT_ANNOTATABLE_CLASS = 'not-annotatable';\n\nexport const NOT_ANNOTATABLE_SELECTOR = `.${NOT_ANNOTATABLE_CLASS}`;\n\nconst isRangeAnnotatable = (range: Range): boolean => {\n const ancestor = range.commonAncestorContainer;\n return ancestor instanceof HTMLElement\n ? !ancestor.closest(NOT_ANNOTATABLE_SELECTOR)\n : !ancestor.parentElement?.closest(NOT_ANNOTATABLE_SELECTOR);\n}\n\nconst iterateNotAnnotatableElements = function*(range: Range): Generator<HTMLElement> {\n const notAnnotatableIterator = document.createNodeIterator(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT,\n (node) =>\n node instanceof HTMLElement // Only elements that can have the class applied\n && node.classList.contains(NOT_ANNOTATABLE_CLASS) // Only elements that are not annotatable\n && !node.parentElement.closest(NOT_ANNOTATABLE_SELECTOR) // Only elements that are not descendants of a not annotatable element\n && range.intersectsNode(node) // Only elements that are within the range\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP\n );\n\n let notAnnotatableNode: Node | null;\n\n while ((notAnnotatableNode = notAnnotatableIterator.nextNode())) {\n if (notAnnotatableNode instanceof HTMLElement) {\n yield notAnnotatableNode;\n }\n }\n}\n\n/**\n * Splits a DOM Range into one or more ranges that span annotatable content only.\n */\nexport const splitAnnotatableRanges = (range: Range): Range[] => {\n if (!isRangeAnnotatable(range)) return [];\n\n const annotatableRanges: Range[] = [];\n\n let prevNotAnnotatable: HTMLElement | null = null;\n\n for (const notAnnotatable of iterateNotAnnotatableElements(range)) {\n let subRange: Range;\n\n // From the start of the range to the not annotatable element.\n // If selection starts on the non-annotatable element, a collapsed range will be created and ignored.\n if (!prevNotAnnotatable) {\n subRange = range.cloneRange();\n subRange.setEndBefore(notAnnotatable);\n } else {\n // From the previous not annotatable element to the current not annotatable element\n subRange = document.createRange();\n subRange.setStartAfter(prevNotAnnotatable);\n subRange.setEndBefore(notAnnotatable);\n }\n\n if (!subRange.collapsed)\n annotatableRanges.push(subRange);\n\n prevNotAnnotatable = notAnnotatable;\n }\n\n // From the last not annotatable element to the end of the parent range\n if (prevNotAnnotatable) {\n const lastRange = range.cloneRange();\n lastRange.setStartAfter(prevNotAnnotatable);\n if (!lastRange.collapsed) {\n annotatableRanges.push(lastRange);\n }\n }\n\n return annotatableRanges.length > 0 ? annotatableRanges : [range];\n}\n\nexport const getRangeAnnotatableContents = (range: Range): DocumentFragment => {\n const contents = range.cloneContents();\n contents.querySelectorAll(NOT_ANNOTATABLE_SELECTOR).forEach((el) => el.remove());\n return contents;\n}\n","import { NOT_ANNOTATABLE_SELECTOR } from './splitAnnotatableRanges';\n\n/** \n * Calls .preventDefault() on click events in annotable areas, in order\n * to prevent problematic default browser behavior. (Specifically: keep\n * Chrome Android from triggering word selection on single click.)\n */\nexport const cancelSingleClickEvents = (container: HTMLElement) => {\n container.addEventListener('click', event => {\n const targetElement = event.target as HTMLElement;\n\n const shouldPrevent =\n // Allow clicks within not-annotatable elements\n !targetElement.closest(NOT_ANNOTATABLE_SELECTOR)\n // Allow clicks on links\n && !(event.target as Element).closest('a');\n\n if (shouldPrevent)\n event.preventDefault();\n });\n}","export const debounce = <T extends (...args: any[]) => void>(func: T, delay = 10): T => {\n\tlet timeoutId: ReturnType<typeof setTimeout>;\n\n\treturn ((...args: any[]) => {\n\t\tclearTimeout(timeoutId);\n\t\ttimeoutId = setTimeout(() => func.apply(this, args), delay);\n\t}) as T;\n}\n","import { NOT_ANNOTATABLE_SELECTOR } from './splitAnnotatableRanges';\n\n/**\n * Returns a DocumentFragment consisting of ONLY the annotatable content\n * in the given DOM Range.\n */\nexport const getAnnotatableFragment = (range: Range): DocumentFragment => {\n const fragment = range.cloneContents();\n fragment.querySelectorAll(NOT_ANNOTATABLE_SELECTOR).forEach(el => el.remove());\n return fragment;\n}\n","/** Returns the index of this node in the node-iterator of the given root **/\nconst findIndex = (node: Node, root: Node) => {\n const ni = document.createNodeIterator(root);\n\n let index = 0;\n \n let n = ni.nextNode();\n\n while (n !== null) {\n if (n === node)\n return index;\n\n index += 1;\n\n n = ni.nextNode();\n }\n}\n\n/** \n * Returns the node that has the given index in the node \n * iterator of the given root node.\n */\nconst getNodeAtIndex = (index: number, root: Node) => {\n const ni = document.createNodeIterator(root);\n\n let node: Node | null = null;\n\n for (let i=0; i<index + 1; i++) {\n node = ni.nextNode();\n }\n\n return node!;\n}\n\n/**\n * Wraps a DOM range CLEVERLY! If the range spans multiple\n * elements, it's broken apart appropriately, and each segment\n * is wrapped \n */\nconst wrapRange = (range: Range) => {\n const {\n commonAncestorContainer,\n startContainer,\n startOffset,\n endContainer,\n endOffset\n } = range;\n\n // Clone the original children, so we can re-generate the original DOM\n const originalChildren = \n Array.from(commonAncestorContainer.childNodes).map(n => {\n const cloned = n.cloneNode(true);\n return n.nodeName === 'CANVAS' ? n : cloned;\n });\n\n // Rember range start/end indices, so we can re-generate the range in the clone\n const startContainerIndex = findIndex(startContainer, commonAncestorContainer)!;\n const endContainerIndex = findIndex(endContainer, commonAncestorContainer)!;\n\n // Reverse the wrapping operation, regenerate the range\n const unwrap = () => {\n const root = commonAncestorContainer as Element;\n root.replaceChildren(...originalChildren);\n\n const startContainer = getNodeAtIndex(startContainerIndex, root);\n const endContainer = getNodeAtIndex(endContainerIndex, root);\n\n range.setStart(startContainer, startOffset);\n range.setEnd(endContainer, endOffset);\n return range;\n }\n\n // Shorthand\n const surround = (range: Range) => {\n const wrapper = document.createElement('SPAN');\n range.surroundContents(wrapper);\n return wrapper;\n };\n\n if (startContainer === endContainer) {\n throw 'Not implemented';\n } else {\n // Not-so-trivial case - we need to break the range \n // apart and create sub-ranges for each segment\n\n // Start by wrapping text segments in start and end nodes\n const startRange = document.createRange();\n startRange.selectNodeContents(startContainer);\n startRange.setStart(startContainer, startOffset);\n const startNode = surround(startRange);\n\n const endRange = document.createRange();\n endRange.selectNode(endContainer);\n endRange.setEnd(endContainer, endOffset);\n const endNode = surround(endRange);\n\n // And wrap nodes in between, if any\n const textNodesBetween = getTextNodesBetween(range);\n\n const innerNodes = textNodesBetween.reverse().map(node => {\n const wrapper = document.createElement('SPAN');\n node.parentNode?.insertBefore(wrapper, node);\n wrapper.appendChild(node);\n return wrapper;\n });\n\n return { unwrap, nodes: [startNode, ...innerNodes, endNode] };\n }\n\n}\n\n/**\n * Returns a list of all text nodes between the start\n * and end node of the range. Start and end node themselves \n * are NOT INCLUDED!\n */\nconst getTextNodesBetween = (range: Range): Node[] => {\n const { \n commonAncestorContainer, \n startContainer, \n endContainer \n } = range;\n\n const ni = document.createNodeIterator(commonAncestorContainer, NodeFilter.SHOW_TEXT);\n\n let n = ni.nextNode();\n\n let take = false;\n \n const nodesBetween: Node[] = [];\n\n while (n != null) {\n if (n === endContainer)\n take = false;\n\n if (take)\n nodesBetween.push(n);\n\n if (n === startContainer)\n take = true;\n\n n = ni.nextNode()\n }\n\n return nodesBetween;\n}\n\nexport const getClientRectsPonyfill = (range: Range) => {\n const { startContainer, endContainer } = range;\n\n if (startContainer === endContainer) {\n return Array.from(range.getClientRects());\n } else {\n const { unwrap, nodes } = wrapRange(range);\n\n const rects = nodes.reduce((rects, node) => {\n return [...rects, ...node.getClientRects()];\n }, [] as DOMRect[]);\n\n unwrap();\n \n return rects;\n }\n}","import { getRangeAnnotatableContents } from './splitAnnotatableRanges';\n\nexport const getQuoteContext = (\n range: Range, \n container: HTMLElement, \n length = 10,\n offsetReferenceSelector?: string\n) => {\n const offsetReference: HTMLElement = offsetReferenceSelector\n ? (range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector)!\n : container;\n\n const rangeBefore = document.createRange();\n rangeBefore.setStart(offsetReference, 0);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n\n const before = getRangeAnnotatableContents(rangeBefore).textContent;\n \n const rangeAfter = document.createRange();\n rangeAfter.setStart(range.endContainer, range.endOffset);\n\n if (offsetReference === document.body)\n rangeAfter.setEnd(offsetReference, offsetReference.childNodes.length);\n else\n rangeAfter.setEndAfter(offsetReference);\n\n const after = getRangeAnnotatableContents(rangeAfter).textContent;\n\n return {\n prefix: before.substring(before.length - length),\n suffix: after.substring(0, length)\n }\n}\n","export const whitespaceOrEmptyRegex = /^\\s*$/;\n\nexport const isWhitespaceOrEmpty = (range: Range): boolean => whitespaceOrEmptyRegex.test(range.toString())\n","import type { TextSelector } from '../model';\n\nexport const isRevived = (selector: TextSelector[]) =>\n selector.every(s => s.range instanceof Range && !s.range.collapsed);\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","import { getRangeAnnotatableContents } from './splitAnnotatableRanges';\nimport type { TextSelector } from '../model';\n\nexport const rangeToSelector = (\n range: Range,\n container: HTMLElement,\n offsetReferenceSelector?: string\n): TextSelector => {\n const rangeBefore = document.createRange();\n\n const offsetReference: HTMLElement = offsetReferenceSelector\n ? (range.startContainer.parentElement as HTMLElement).closest(offsetReferenceSelector)!\n : container;\n\n // A helper range from the start of the container to the start of the selection\n rangeBefore.setStart(offsetReference, 0);\n rangeBefore.setEnd(range.startContainer, range.startOffset);\n\n // A content range before content w/o not annotatable elements\n const before = getRangeAnnotatableContents(rangeBefore).textContent;\n\n const quote = range.toString();\n const start = before.length || 0;\n const end = start + quote.length;\n\n return offsetReferenceSelector\n ? { quote, start, end, range, offsetReference }\n : { quote, start, end, range };\n}\n","import type { TextSelector } from '../model';\nimport { NOT_ANNOTATABLE_SELECTOR } from './splitAnnotatableRanges';\n\n/**\n * Creates a new selector object with the revived DOM range from the given text annotation position\n * Only the annotatable elements are processed and counted towards the range\n *\n * @param selector annotation selector with start and end positions\n * @param container the HTML container of the annotated content\n *\n * @returns the revived selector\n */\nexport const reviveSelector = (selector: TextSelector, container: HTMLElement): TextSelector => {\n\n const { start, end } = selector;\n\n const offsetReference = selector.offsetReference || container;\n\n const iterator = document.createNodeIterator(container, NodeFilter.SHOW_TEXT, (node) =>\n node.parentElement?.closest(NOT_ANNOTATABLE_SELECTOR)\n ? NodeFilter.FILTER_SKIP\n : NodeFilter.FILTER_ACCEPT\n );\n\n // Position that contains the length of the preceding annotatable text nodes\n let runningOffset = 0;\n\n const range = document.createRange();\n\n let n = iterator.nextNode();\n if (n === null) 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 startCounting ||= offsetReference?.contains(n);\n\n if (startCounting) {\n const len = n.textContent?.length || 0;\n\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 || 0;\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 ...selector,\n range\n }\n\n}\n","import type { TextAnnotationTarget } from '../model';\nimport { isRevived } from './isRevived';\nimport { reviveSelector } from './reviveSelector';\n\nexport const reviveTarget = (target: TextAnnotationTarget, container: HTMLElement): TextAnnotationTarget =>\n isRevived(target.selector)\n ? target\n : ({\n ...target,\n selector: target.selector.map(s => s.range instanceof Range && !s.range.collapsed ? s : reviveSelector(s, container))\n });\n\n\n","import type { TextAnnotation } from '../model';\nimport { isRevived } from './isRevived';\nimport { reviveTarget } from './reviveTarget';\n\nexport const reviveAnnotation = (annotation: TextAnnotation, container: HTMLElement): TextAnnotation =>\n isRevived(annotation.target.selector)\n ? annotation\n : ({ ...annotation, target: reviveTarget(annotation.target, container) });","import type { ViewportState } from '@annotorious/core';\nimport type { TextAnnotation } from '../model';\n\nexport interface ViewportBounds {\n\n top: number;\n\n left: number;\n\n minX: number;\n\n minY: number;\n \n maxX: number;\n \n maxY: number;\n\n}\n\nexport const getViewportBounds = (container: HTMLElement): ViewportBounds => {\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\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 { Filter, ViewportState } from '@annotorious/core';\nimport type { TextAnnotatorState } from '../state';\nimport { debounce } from '../utils';\nimport { ViewportBounds, getViewportBounds, trackViewport } from './viewport';\nimport type { HighlightPainter } from './HighlightPainter';\nimport type { Highlight } from './Highlight';\nimport type { HighlightStyleExpression } from './HighlightStyle';\n\nexport interface RendererImplementation {\n\n destroy(): void;\n\n redraw(\n\n highlights:Highlight[], \n\n bounds: ViewportBounds, \n \n style?: HighlightStyleExpression,\n\n painter?: HighlightPainter,\n\n lazy?: boolean\n \n ): void;\n\n setVisible(visible: boolean): void;\n\n}\n\nexport interface Renderer {\n\n destroy(): void;\n\n redraw(force?: boolean): void;\n\n setStyle(style?: HighlightStyleExpression): void;\n\n setFilter(filter?: Filter): void;\n\n setPainter(painter?: HighlightPainter): void;\n\n setVisible(visible: boolean): void;\n\n}\n\nexport const createBaseRenderer = (\n container: HTMLElement, \n state: TextAnnotatorState,\n viewport: ViewportState,\n renderer: RendererImplementation\n): Renderer => {\n const { store, selection, hover } = state;\n\n let currentStyle: HighlightStyleExpression | undefined;\n\n let currentFilter: Filter | undefined;\n\n let currentPainter: HighlightPainter;\n\n const onDraw = trackViewport(viewport);\n\n const onPointerMove = (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 container.addEventListener('pointermove', onPointerMove);\n\n const redraw = (lazy: boolean = false) => {\n if (currentPainter)\n currentPainter.clear();\n\n const bounds = getViewportBounds(container); \n\n const { minX, minY, maxX, maxY } = bounds;\n \n const annotationsInView = currentFilter\n ? store.getIntersecting(minX, minY, maxX, maxY).filter(({ annotation }) => currentFilter(annotation))\n : store.getIntersecting(minX, minY, maxX, maxY);\n\n const selectedIds = selection.selected.map(({ id }) => id);\n\n const highlights: Highlight[] = annotationsInView.map(({ annotation, rects }) => {\n const selected = selectedIds.includes(annotation.id);\n const hovered = annotation.id === hover.current;\n\n return { annotation, rects, state: { selected, hover: hovered }};\n });\n\n renderer.redraw(highlights, bounds, currentStyle, currentPainter, lazy);\n\n setTimeout(() => onDraw(annotationsInView.map(({ annotation }) => annotation)), 1);\n }\n\n const setPainter = (painter: HighlightPainter) => { \n currentPainter = painter;\n redraw();\n }\n\n const setStyle = (style?: HighlightStyleExpression) => {\n currentStyle = style;\n redraw();\n }\n\n const setFilter = (filter?: Filter) => {\n currentFilter = filter;\n redraw(false);\n } \n\n // Refresh on store change\n const onStoreChange = () => redraw();\n store.observe(onStoreChange);\n\n // Refresh on selection change\n const unsubscribeSelection = selection.subscribe(() => redraw());\n\n // Refresh on scroll\n const onScroll = () => redraw(true);\n document.addEventListener('scroll', onScroll, { capture: true, passive: true });\n\n // Refresh on resize\n const onResize = debounce(() => {\n store.recalculatePositions();\n\n if (currentPainter)\n currentPainter.reset();\n\n redraw();\n });\n\n window.addEventListener('resize', onResize);\n\n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(container);\n\n // This is an extra precaution. The position of the container\n // might shift (without resizing) due to layout changes higher-up\n // in the DOM. (This happens in Recogito for example)\n const config: MutationObserverInit = { attributes: true, childList: true, subtree: true };\n\n const mutationObserver = new MutationObserver((records: MutationRecord[]) => {\n const isInternal = records.every(record => record.target === container || container.contains(record.target));\n if (!isInternal) redraw(true);\n });\n\n mutationObserver.observe(document.body, config);\n\n const destroy = () => {\n container.removeEventListener('pointermove', onPointerMove);\n \n renderer.destroy();\n \n store.unobserve(onStoreChange);\n\n unsubscribeSelection();\n\n document.removeEventListener('scroll', onScroll);\n\n window.removeEventListener('resize', onResize);\n resizeObserver.disconnect();\n\n mutationObserver.disconnect();\n }\n\n return {\n destroy,\n redraw,\n setStyle,\n setFilter,\n setPainter,\n setVisible: renderer.setVisible\n }\n\n}\n","import type { ViewportBounds } from '../viewport';\nimport { debounce } from '../../utils';\nimport type { HighlightStyle } from '../HighlightStyle';\nimport { DEFAULT_SELECTED_STYLE, DEFAULT_STYLE, HighlightStyleExpression } from '../HighlightStyle';\nimport type { HighlightPainter } from '../HighlightPainter';\nimport { createBaseRenderer, type RendererImplementation } from '../baseRenderer';\nimport type { Highlight } from '../Highlight';\nimport type { TextAnnotatorState } from 'src/state';\nimport type { ViewportState } from '@annotorious/core';\n\nconst createCanvas = () => {\n const canvas = document.createElement('canvas');\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n canvas.className = 'r6o-highlight-layer bg';\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\nconst createRenderer = (container: HTMLElement): RendererImplementation => {\n\n container.classList.add('r6o-annotatable');\n\n const canvas = createCanvas();\n const ctx = canvas.getContext('2d');\n\n container.insertBefore(canvas, container.firstChild);\n\n const redraw = ( \n highlights: Highlight[], \n viewportBounds: ViewportBounds,\n currentStyle?: HighlightStyleExpression,\n currentPainter?: HighlightPainter\n ) => requestAnimationFrame(() => {\n\n const { width, height } = canvas;\n\n // New render loop - clear canvases\n ctx.clearRect(-0.5, -0.5, width + 1, height + 1);\n\n if (currentPainter)\n currentPainter.clear();\n\n const { top, left } = viewportBounds;\n\n /**\n * Highlights rendering on the canvas is an order-sensitive operation.\n * The later the highlight is rendered, the higher it will be in the visual stack.\n *\n * By default, we should expect that the newer highlight\n * will be rendered over the older one\n */\n const highlightsByCreation = [...highlights].sort((highlightA, highlightB) => {\n const { annotation: { target: { created: createdA } } } = highlightA;\n const { annotation: { target: { created: createdB } } } = highlightB;\n return createdA.getTime() - createdB.getTime();\n })\n\n highlightsByCreation.forEach(h => {\n const base: HighlightStyle = currentStyle\n ? typeof currentStyle === 'function'\n ? currentStyle(h.annotation, h.state)\n : currentStyle\n : h.state?.selected\n ? DEFAULT_SELECTED_STYLE\n : DEFAULT_STYLE;\n\n // Trigger the custom painter (if any) as a side-effect\n const style = currentPainter ? currentPainter.paint(h, viewportBounds) || base : base;\n\n // Offset annotation rects by current scroll position\n const offsetRects = h.rects.map(({ x, y, width, height }) => ({\n x: x + left,\n y: y + top,\n width,\n height\n }));\n\n ctx.fillStyle = style.fill;\n ctx.globalAlpha = style.fillOpacity || 1;\n\n\n /**\n * The default browser's selection highlight is a bit taller than the text itself.\n * To match it, we need to draw the highlight a bit taller as well.\n */\n const selectionHighlightCompensation = 5;\n offsetRects.forEach(({ x, y, width, height }) =>\n ctx.fillRect(\n x,\n y - selectionHighlightCompensation / 2,\n width,\n height + selectionHighlightCompensation\n )\n );\n\n if (style.underlineColor) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = style.underlineColor;\n ctx.lineWidth = style.underlineThickness ?? 1;\n\n // Place the underline below the highlighted text + an optional offset\n const underlineOffset = selectionHighlightCompensation / 2 + (style.underlineOffset ?? 0);\n\n offsetRects.forEach(({ x, y, width, height }) => {\n ctx.beginPath();\n ctx.moveTo(x, y + height + underlineOffset);\n ctx.lineTo(x + width, y + height + underlineOffset);\n\n // Draw the Path\n ctx.stroke();\n });\n }\n });\n });\n\n const onResize = debounce(() => {\n resetCanvas(canvas);\n });\n\n window.addEventListener('resize', onResize);\n\n const setVisible = (visible: boolean) => {\n console.log('setVisible not implemented on Canvas renderer');\n }\n\n const destroy = () => {\n container.removeChild(canvas);\n\n window.removeEventListener('resize', onResize);\n }\n\n return {\n destroy,\n setVisible,\n redraw\n }\n\n}\n\nexport const createCanvasRenderer = (\n container: HTMLElement, \n state: TextAnnotatorState,\n viewport: ViewportState\n) => createBaseRenderer(container, state, viewport, createRenderer(container));\n","var r={grad:.9,turn:360,rad:360/(2*Math.PI)},t=function(r){return\"string\"==typeof r?r.length>0:\"number\"==typeof r},n=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=Math.pow(10,t)),Math.round(n*r)/n+0},e=function(r,t,n){return void 0===t&&(t=0),void 0===n&&(n=1),r>n?n:r>t?r:t},u=function(r){return(r=isFinite(r)?r%360:0)>0?r:r+360},a=function(r){return{r:e(r.r,0,255),g:e(r.g,0,255),b:e(r.b,0,255),a:e(r.a)}},o=function(r){return{r:n(r.r),g:n(r.g),b:n(r.b),a:n(r.a,3)}},i=/^#([0-9a-f]{3,8})$/i,s=function(r){var t=r.toString(16);return t.length<2?\"0\"+t:t},h=function(r){var t=r.r,n=r.g,e=r.b,u=r.a,a=Math.max(t,n,e),o=a-Math.min(t,n,e),i=o?a===t?(n-e)/o:a===n?2+(e-t)/o:4+(t-n)/o:0;return{h:60*(i<0?i+6:i),s:a?o/a*100:0,v:a/255*100,a:u}},b=function(r){var t=r.h,n=r.s,e=r.v,u=r.a;t=t/360*6,n/=100,e/=100;var a=Math.floor(t),o=e*(1-n),i=e*(1-(t-a)*n),s=e*(1-(1-t+a)*n),h=a%6;return{r:255*[e,i,o,o,s,e][h],g:255*[s,e,e,i,o,o][h],b:255*[o,o,s,e,e,i][h],a:u}},g=function(r){return{h:u(r.h),s:e(r.s,0,100),l:e(r.l,0,100),a:e(r.a)}},d=function(r){return{h:n(r.h),s:n(r.s),l:n(r.l),a:n(r.a,3)}},f=function(r){return b((n=(t=r).s,{h:t.h,s:(n*=((e=t.l)<50?e:100-e)/100)>0?2*n/(e+n)*100:0,v:e+n,a:t.a}));var t,n,e},c=function(r){return{h:(t=h(r)).h,s:(u=(200-(n=t.s))*(e=t.v)/100)>0&&u<200?n*e/100/(u<=100?u:200-u)*100:0,l:u/2,a:t.a};var t,n,e,u},l=/^hsla?\\(\\s*([+-]?\\d*\\.?\\d+)(deg|rad|grad|turn)?\\s*,\\s*([+-]?\\d*\\.?\\d+)%\\s*,\\s*([+-]?\\d*\\.?\\d+)%\\s*(?:,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,p=/^hsla?\\(\\s*([+-]?\\d*\\.?\\d+)(deg|rad|grad|turn)?\\s+([+-]?\\d*\\.?\\d+)%\\s+([+-]?\\d*\\.?\\d+)%\\s*(?:\\/\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,v=/^rgba?\\(\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*(?:,\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,m=/^rgba?\\(\\s*([+-]?\\d*\\.?\\d+)(%)?\\s+([+-]?\\d*\\.?\\d+)(%)?\\s+([+-]?\\d*\\.?\\d+)(%)?\\s*(?:\\/\\s*([+-]?\\d*\\.?\\d+)(%)?\\s*)?\\)$/i,y={string:[[function(r){var t=i.exec(r);return t?(r=t[1]).length<=4?{r:parseInt(r[0]+r[0],16),g:parseInt(r[1]+r[1],16),b:parseInt(r[2]+r[2],16),a:4===r.length?n(parseInt(r[3]+r[3],16)/255,2):1}:6===r.length||8===r.length?{r:parseInt(r.substr(0,2),16),g:parseInt(r.substr(2,2),16),b:parseInt(r.substr(4,2),16),a:8===r.length?n(parseInt(r.substr(6,2),16)/255,2):1}:null:null},\"hex\"],[function(r){var t=v.exec(r)||m.exec(r);return t?t[2]!==t[4]||t[4]!==t[6]?null:a({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:void 0===t[7]?1:Number(t[7])/(t[8]?100:1)}):null},\"rgb\"],[function(t){var n=l.exec(t)||p.exec(t);if(!n)return null;var e,u,a=g({h:(e=n[1],u=n[2],void 0===u&&(u=\"deg\"),Number(e)*(r[u]||1)),s:Number(n[3]),l:Number(n[4]),a:void 0===n[5]?1:Number(n[5])/(n[6]?100:1)});return f(a)},\"hsl\"]],object:[[function(r){var n=r.r,e=r.g,u=r.b,o=r.a,i=void 0===o?1:o;return t(n)&&t(e)&&t(u)?a({r:Number(n),g:Number(e),b:Number(u),a:Number(i)}):null},\"rgb\"],[function(r){var n=r.h,e=r.s,u=r.l,a=r.a,o=void 0===a?1:a;if(!t(n)||!t(e)||!t(u))return null;var i=g({h:Number(n),s:Number(e),l:Number(u),a:Number(o)});return f(i)},\"hsl\"],[function(r){var n=r.h,a=r.s,o=r.v,i=r.a,s=void 0===i?1:i;if(!t(n)||!t(a)||!t(o))return null;var h=function(r){return{h:u(r.h),s:e(r.s,0,100),v:e(r.v,0,100),a:e(r.a)}}({h:Number(n),s:Number(a),v:Number(o),a:Number(s)});return b(h)},\"hsv\"]]},N=function(r,t){for(var n=0;n<t.length;n++){var e=t[n][0](r);if(e)return[e,t[n][1]]}return[null,void 0]},x=function(r){return\"string\"==typeof r?N(r.trim(),y.string):\"object\"==typeof r&&null!==r?N(r,y.object):[null,void 0]},I=function(r){return x(r)[1]},M=function(r,t){var n=c(r);return{h:n.h,s:e(n.s+100*t,0,100),l:n.l,a:n.a}},H=function(r){return(299*r.r+587*r.g+114*r.b)/1e3/255},$=function(r,t){var n=c(r);return{h:n.h,s:n.s,l:e(n.l+100*t,0,100),a:n.a}},j=function(){function r(r){this.parsed=x(r)[0],this.rgba=this.parsed||{r:0,g:0,b:0,a:1}}return r.prototype.isValid=function(){return null!==this.parsed},r.prototype.brightness=function(){return n(H(this.rgba),2)},r.prototype.isDark=function(){return H(this.rgba)<.5},r.prototype.isLight=function(){return H(this.rgba)>=.5},r.prototype.toHex=function(){return r=o(this.rgba),t=r.r,e=r.g,u=r.b,i=(a=r.a)<1?s(n(255*a)):\"\",\"#\"+s(t)+s(e)+s(u)+i;var r,t,e,u,a,i},r.prototype.toRgb=function(){return o(this.rgba)},r.prototype.toRgbString=function(){return r=o(this.rgba),t=r.r,n=r.g,e=r.b,(u=r.a)<1?\"rgba(\"+t+\", \"+n+\", \"+e+\", \"+u+\")\":\"rgb(\"+t+\", \"+n+\", \"+e+\")\";var r,t,n,e,u},r.prototype.toHsl=function(){return d(c(this.rgba))},r.prototype.toHslString=function(){return r=d(c(this.rgba)),t=r.h,n=r.s,e=r.l,(u=r.a)<1?\"hsla(\"+t+\", \"+n+\"%, \"+e+\"%, \"+u+\")\":\"hsl(\"+t+\", \"+n+\"%, \"+e+\"%)\";var r,t,n,e,u},r.prototype.toHsv=function(){return r=h(this.rgba),{h:n(r.h),s:n(r.s),v:n(r.v),a:n(r.a,3)};var r},r.prototype.invert=function(){return w({r:255-(r=this.rgba).r,g:255-r.g,b:255-r.b,a:r.a});var r},r.prototype.saturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,r))},r.prototype.desaturate=function(r){return void 0===r&&(r=.1),w(M(this.rgba,-r))},r.prototype.grayscale=function(){return w(M(this.rgba,-1))},r.prototype.lighten=function(r){return void 0===r&&(r=.1),w($(this.rgba,r))},r.prototype.darken=function(r){return void 0===r&&(r=.1),w($(this.rgba,-r))},r.prototype.rotate=function(r){return void 0===r&&(r=15),this.hue(this.hue()+r)},r.prototype.alpha=function(r){return\"number\"==typeof r?w({r:(t=this.rgba).r,g:t.g,b:t.b,a:r}):n(this.rgba.a,3);var t},r.prototype.hue=function(r){var t=c(this.rgba);return\"number\"==typeof r?w({h:r,s:t.s,l:t.l,a:t.a}):n(t.h)},r.prototype.isEqual=function(r){return this.toHex()===w(r).toHex()},r}(),w=function(r){return r instanceof j?r:new j(r)},S=[],k=function(r){r.forEach(function(r){S.indexOf(r)<0&&(r(j,y),S.push(r))})},E=function(){return new j({r:255*Math.random(),g:255*Math.random(),b:255*Math.random()})};export{j as Colord,w as colord,k as extend,I as getFormat,E as random};\n","import type { ViewportState } from '@annotorious/core';\nimport { colord } from 'colord';\nimport type { HighlightPainter } from '../HighlightPainter';\nimport type { TextAnnotatorState } from 'src/state';\nimport type { ViewportBounds } from '../viewport';\nimport { DEFAULT_SELECTED_STYLE, DEFAULT_STYLE, HighlightStyle, HighlightStyleExpression } from '../HighlightStyle';\nimport { RendererImplementation, createBaseRenderer } from '../baseRenderer';\nimport type { Highlight } from '../Highlight';\n\nconst toCSS = (s?: HighlightStyle) => {\n const backgroundColor = colord(s?.fill || DEFAULT_STYLE.fill)\n .alpha(s?.fillOpacity === undefined ? DEFAULT_STYLE.fillOpacity : s.fillOpacity)\n .toHex();\n\n const rules = [\n `background-color:${backgroundColor}`,\n s?.underlineThickness ? `text-decoration:underline` : undefined,\n s?.underlineColor ? `text-decoration-color:${s.underlineColor}` : undefined,\n s?.underlineOffset ? `text-underline-offset:${s.underlineOffset}px` : undefined,\n s?.underlineThickness ? `text-decoration-thickness:${s.underlineThickness}px` : undefined\n ].filter(Boolean);\n\n return rules.join(';');\n}\n\nexport const createRenderer = (): RendererImplementation => {\n const elem = document.createElement('style');\n document.getElementsByTagName('head')[0].appendChild(elem);\n\n let currentRendered = new Set<string>();\n\n const redraw = (\n highlights: Highlight[], \n viewportBounds: ViewportBounds,\n currentStyle?: HighlightStyleExpression,\n painter?: HighlightPainter\n ) => {\n if (painter)\n painter.clear();\n\n // Next set of rendered annotation IDs and selections\n const nextRendered = new Set(highlights.map(h => h.annotation.id));\n\n // Annotations currently in this stylesheet that no longer need rendering\n const toRemove = Array.from(currentRendered).filter(id => !nextRendered.has(id));\n\n // For simplicity, re-generate the whole stylesheet\n const updatedCSS = highlights.map(h => {\n const base = currentStyle \n ? typeof currentStyle === 'function' \n ? currentStyle(h.annotation, h.state) \n : currentStyle \n : h.state?.selected ? DEFAULT_SELECTED_STYLE : DEFAULT_STYLE;\n\n // Trigger the custom painter (if any) as a side-effect\n const style = painter ? painter.paint(h, viewportBounds) || base : base;\n\n return `::highlight(_${h.annotation.id}) { ${toCSS(style)} }`;\n });\n\n elem.innerHTML = updatedCSS.join('\\n');\n\n // After we have the styles, we need to update the Highlights.\n // Note that the (experimental) CSS Custom Highlight API is not yet\n // available in TypeScript!\n\n // @ts-ignore\n CSS.highlights.clear();\n // toRemove.forEach(id => CSS.highlights.delete(`_${id}`));\n\n // Could be improved further by (re-)setting only annotations that\n // have changes.\n highlights.forEach(({ annotation }) => { \n const ranges = annotation.target.selector.map(s => s.range);\n\n // @ts-ignore\n const highlights = new Highlight(...ranges);\n\n // @ts-ignore\n CSS.highlights.set(`_${annotation.id}`, highlights);\n });\n\n currentRendered = nextRendered;\n }\n\n const setVisible = (visible: boolean) => {\n console.log('setVisible not implemented on CSS Custom Highlights renderer');\n }\n\n const destroy = () => {\n // Clear all highlights from the Highlight Registry\n // @ts-ignore\n CSS.highlights.clear();\n\n // Remove the stylesheet\n elem.remove();\n }\n\n return {\n destroy,\n setVisible,\n redraw\n }\n\n}\n\nexport const createHighlightsRenderer = (\n container: HTMLElement, \n state: TextAnnotatorState,\n viewport: ViewportState\n) => createBaseRenderer(container, state, viewport, createRenderer());","var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import type { ViewportState } from '@annotorious/core';\nimport { colord } from 'colord';\nimport { dequal } from 'dequal/lite';\nimport type { Rect, TextAnnotatorState } from '../../state';\nimport { paint, type HighlightPainter } from '../HighlightPainter';\nimport type { ViewportBounds } from '../viewport';\nimport { createBaseRenderer, type RendererImplementation } from '../baseRenderer';\nimport type { Highlight } from '../Highlight';\nimport { DEFAULT_STYLE, type HighlightStyleExpression } from '../HighlightStyle';\n\nimport './spansRenderer.css';\n\nconst computeZIndex = (rect: Rect, all: Rect[]): number => {\n const intersects = (a: Rect, b: Rect): boolean => (\n a.x <= b.x + b.width && a.x + a.width >= b.x &&\n a.y <= b.y + b.height && a.y + a.height >= b.y\n );\n\n return all.filter(other => (\n rect !== other &&\n intersects(rect, other) &&\n other.width > rect.width\n )).length;\n}\n\nconst createRenderer = (container: HTMLElement): RendererImplementation => {\n\n container.classList.add('r6o-annotatable');\n\n const highlightLayer = document.createElement('div');\n highlightLayer.className = 'r6o-span-highlight-layer';\n\n container.insertBefore(highlightLayer, container.firstChild);\n\n // Currently rendered highlights\n let currentRendered: Highlight[] = [];\n\n const redraw = (\n highlights: Highlight[], \n viewportBounds: ViewportBounds,\n currentStyle?: HighlightStyleExpression,\n painter?: HighlightPainter,\n lazy?: boolean\n ) => { \n const noChanges = dequal(currentRendered, highlights);\n\n // If there are no changes and rendering is set to lazy\n // Don't redraw the SPANs - but redraw the painter, if any!\n const shouldRedraw = !(noChanges && lazy);\n\n if (!painter && !shouldRedraw) return;\n\n if (shouldRedraw)\n highlightLayer.innerHTML = '';\n\n // Rects from all visible annotations, for z-index computation\n const allRects = highlights.reduce<Rect[]>((all, { rects }) => ([...all, ...rects]), []);\n\n highlights.forEach(highlight => {\n highlight.rects.map(rect => {\n const zIndex = computeZIndex(rect, allRects);\n const style = paint(highlight, viewportBounds, currentStyle, painter, zIndex);\n\n if (shouldRedraw) {\n const span = document.createElement('span');\n span.className = 'r6o-annotation';\n span.dataset.annotation = highlight.annotation.id;\n\n span.style.left = `${rect.x}px`;\n span.style.top = `${rect.y}px`;\n span.style.width = `${rect.width}px`;\n span.style.height = `${rect.height}px`;\n\n const backgroundColor = colord(style?.fill || DEFAULT_STYLE.fill)\n .alpha(style?.fillOpacity === undefined ? DEFAULT_STYLE.fillOpacity : style.fillOpacity)\n .toHex();\n\n span.style.backgroundColor = backgroundColor;\n\n if (style.underlineStyle)\n span.style.borderStyle = style.underlineStyle;\n\n if (style.underlineColor)\n span.style.borderColor = style.underlineColor;\n\n if (style.underlineThickness)\n span.style.borderBottomWidth = `${style.underlineThickness}px`;\n\n if (style.underlineOffset)\n span.style.paddingBottom = `${style.underlineOffset}px`;\n\n highlightLayer.appendChild(span);\n }\n });\n });\n\n currentRendered = highlights;\n }\n\n const setVisible = (visible: boolean) => {\n if (visible)\n highlightLayer.classList.remove('hidden');\n else\n highlightLayer.classList.add('hidden');\n }\n\n const destroy = () => {\n highlightLayer.remove();\n }\n\n return {\n destroy,\n redraw,\n setVisible\n }\n\n}\n\nexport const createSpansRenderer = (\n container: HTMLElement, \n state: TextAnnotatorState,\n viewport: ViewportState\n) => createBaseRenderer(container, state, viewport, createRenderer(container));\n","import validate from './validate.js';\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\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 //\n // Note to future-self: No, you can't remove the `toLowerCase()` call.\n // REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351\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]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n var uuid = unsafeStringify(arr, offset);\n // 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 if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","// 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()).\n\nvar getRandomValues;\nvar 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 if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n return getRandomValues(rnds8);\n}","var 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';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","var M = Object.prototype.hasOwnProperty;\nfunction B(e, n) {\n var t, o;\n if (e === n) return !0;\n if (e && n && (t = e.constructor) === n.constructor) {\n if (t === Date) return e.getTime() === n.getTime();\n if (t === RegExp) return e.toString() === n.toString();\n if (t === Array) {\n if ((o = e.length) === n.length)\n for (; o-- && B(e[o], n[o]); ) ;\n return o === -1;\n }\n if (!t || typeof e == \"object\") {\n o = 0;\n for (t in e)\n if (M.call(e, t) && ++o && !M.call(n, t) || !(t in n) || !B(e[t], n[t])) return !1;\n return Object.keys(n).length === o;\n }\n }\n return e !== e && n !== n;\n}\nfunction z() {\n}\nfunction H(e, n) {\n return e != e ? n == n : e !== n || e && typeof e == \"object\" || typeof e == \"function\";\n}\nconst k = [];\nfunction Y(e, n = z) {\n let t;\n const o = /* @__PURE__ */ new Set();\n function i(b) {\n if (H(e, b) && (e = b, t)) {\n const y = !k.length;\n for (const u of o)\n u[1](), k.push(u, e);\n if (y) {\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 w(b, y = z) {\n const u = [b, y];\n return o.add(u), o.size === 1 && (t = n(i, p) || z), b(e), () => {\n o.delete(u), o.size === 0 && t && (t(), t = null);\n };\n }\n return { set: i, update: p, subscribe: w };\n}\nconst Ce = (e) => {\n const { subscribe: n, set: t } = Y();\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 w = (i.updated || []).find(({ oldValue: b }) => b.id === o);\n w && t(w.newValue.id);\n }\n }), {\n get current() {\n return o;\n },\n subscribe: n,\n set: t\n };\n};\nvar F = /* @__PURE__ */ ((e) => (e.EDIT = \"EDIT\", e.SELECT = \"SELECT\", e.NONE = \"NONE\", e))(F || {});\nconst V = { selected: [] }, Le = (e, n = \"EDIT\") => {\n const { subscribe: t, set: o } = Y(V);\n let i = V;\n t((s) => i = s);\n const p = () => o(V), w = () => {\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 h = typeof s == \"string\" ? s : s.id;\n return i.selected.some((L) => L.id === h);\n }, y = (s, h) => {\n const L = e.getAnnotation(s);\n if (L) {\n const v = P(L, n);\n o(v === \"EDIT\" ? { selected: [{ id: s, editable: !0 }], pointerEvent: h } : v === \"SELECT\" ? { selected: [{ id: s }], pointerEvent: h } : { selected: [], pointerEvent: h });\n } else\n console.warn(\"Invalid selection: \" + s);\n }, u = (s, h) => {\n const L = Array.isArray(s) ? s : [s], v = L.map((S) => e.getAnnotation(S)).filter(Boolean);\n o({\n selected: v.map((S) => {\n const E = h === void 0 ? P(S, n) === \"EDIT\" : h;\n return { id: S.id, editable: E };\n })\n }), v.length !== L.length && console.warn(\"Invalid selection\", s);\n }, U = (s) => {\n if (i.selected.length === 0)\n return !1;\n const { selected: h } = i;\n h.filter(({ id: v }) => s.includes(v)).length > 0 && o({ selected: h.filter(({ id: v }) => !s.includes(v)) });\n };\n return e.observe(({ changes: s }) => U((s.deleted || []).map((h) => h.id))), {\n clear: p,\n clickSelect: y,\n get selected() {\n return i ? [...i.selected] : null;\n },\n get pointerEvent() {\n return i ? i.pointerEvent : null;\n },\n isEmpty: w,\n isSelected: b,\n setSelected: u,\n subscribe: t\n };\n}, P = (e, n) => typeof n == \"function\" ? n(e) || \"EDIT\" : n || \"EDIT\";\nvar D = [];\nfor (var _ = 0; _ < 256; ++_)\n D.push((_ + 256).toString(16).slice(1));\nfunction J(e, n = 0) {\n return (D[e[n + 0]] + D[e[n + 1]] + D[e[n + 2]] + D[e[n + 3]] + \"-\" + D[e[n + 4]] + D[e[n + 5]] + \"-\" + D[e[n + 6]] + D[e[n + 7]] + \"-\" + D[e[n + 8]] + D[e[n + 9]] + \"-\" + D[e[n + 10]] + D[e[n + 11]] + D[e[n + 12]] + D[e[n + 13]] + D[e[n + 14]] + D[e[n + 15]]).toLowerCase();\n}\nvar $, Q = new Uint8Array(16);\nfunction X() {\n if (!$ && ($ = typeof crypto < \"u\" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !$))\n throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");\n return $(Q);\n}\nvar Z = typeof crypto < \"u\" && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nconst W = {\n randomUUID: Z\n};\nfunction K(e, n, t) {\n if (W.randomUUID && !n && !e)\n return W.randomUUID();\n e = e || {};\n var o = e.random || (e.rng || X)();\n return o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, J(o);\n}\nconst Ue = (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}, Se = (e, n, t, o) => ({\n id: K(),\n annotation: e.id,\n created: t || /* @__PURE__ */ new Date(),\n creator: o,\n ...n\n}), ee = (e, n) => {\n const t = new Set(e.bodies.map((o) => o.id));\n return n.bodies.filter((o) => !t.has(o.id));\n}, te = (e, n) => {\n const t = new Set(n.bodies.map((o) => o.id));\n return e.bodies.filter((o) => !t.has(o.id));\n}, ne = (e, n) => n.bodies.map((t) => {\n const o = e.bodies.find((i) => i.id === t.id);\n return { newBody: t, oldBody: o && !B(o, t) ? o : void 0 };\n}).filter(({ oldBody: t }) => t).map(({ oldBody: t, newBody: o }) => ({ oldBody: t, newBody: o })), oe = (e, n) => !B(e.target, n.target), q = (e, n) => {\n const t = ee(e, n), o = te(e, n), i = ne(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: oe(e, n) ? { oldTarget: e.target, newTarget: n.target } : void 0\n };\n};\nvar se = /* @__PURE__ */ ((e) => (e.BODY_ONLY = \"BODY_ONLY\", e.TARGET_ONLY = \"TARGET_ONLY\", e))(se || {}), O = /* @__PURE__ */ ((e) => (e.LOCAL = \"LOCAL\", e.REMOTE = \"REMOTE\", e))(O || {});\nconst ie = (e, n) => {\n var p, w;\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, y = (U) => U && U.length > 0;\n if (!(y(t.created) || y(t.deleted))) {\n const U = (p = t.updated) == null ? void 0 : p.some((h) => y(h.bodiesCreated) || y(h.bodiesDeleted) || y(h.bodiesUpdated)), s = (w = t.updated) == null ? void 0 : w.some((h) => h.targetUpdated);\n if (b === \"BODY_ONLY\" && U && !s || b === \"TARGET_ONLY\" && s && !U)\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}, de = (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)), w = 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)), y = [\n ...(e.created || []).filter((s) => !p.has(s.id)).map((s) => w.has(s.id) ? n.updated.find(({ oldValue: h }) => h.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 ], U = [\n ...(e.updated || []).filter(({ newValue: s }) => !p.has(s.id)).map((s) => {\n const { oldValue: h, newValue: L } = s;\n if (w.has(L.id)) {\n const v = n.updated.find((S) => S.oldValue.id === L.id).newValue;\n return q(h, v);\n } else\n return s;\n }),\n ...(n.updated || []).filter(({ oldValue: s }) => !b.has(s.id))\n ];\n return { created: y, deleted: u, updated: U };\n}, ae = (e) => e.id !== void 0, Oe = () => {\n const e = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), t = [], o = (d, r = {}) => t.push({ onChange: d, options: r }), i = (d) => {\n const r = t.findIndex((c) => c.onChange == d);\n r > -1 && t.splice(r, 1);\n }, p = (d, r) => {\n const c = {\n origin: d,\n changes: {\n created: r.created || [],\n updated: r.updated || [],\n deleted: r.deleted || []\n },\n state: [...e.values()]\n };\n t.forEach((f) => {\n ie(f, c) && f.onChange(c);\n });\n }, w = (d, r = O.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(r, { created: [d] });\n }, b = (d, r) => {\n const c = typeof d == \"string\" ? r : d, f = typeof d == \"string\" ? d : d.id, C = e.get(f);\n if (C) {\n const T = q(C, c);\n return f === c.id ? e.set(f, c) : (e.delete(f), e.set(c.id, c)), C.bodies.forEach((x) => n.delete(x.id)), c.bodies.forEach((x) => n.set(x.id, c.id)), T;\n } else\n console.warn(`Cannot update annotation ${f} - does not exist`);\n }, y = (d, r = O.LOCAL, c = O.LOCAL) => {\n const f = ae(r) ? c : r, C = b(d, r);\n C && p(f, { updated: [C] });\n }, u = (d, r = O.LOCAL) => {\n const c = d.reduce((f, C) => {\n const T = b(C);\n return T ? [...f, T] : f;\n }, []);\n c.length > 0 && p(r, { updated: c });\n }, U = (d, r = O.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(r, { 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()], h = (d = O.LOCAL) => {\n const r = [...e.values()];\n e.clear(), n.clear(), p(d, { deleted: r });\n }, L = (d, r = !0, c = O.LOCAL) => {\n if (r) {\n const f = [...e.values()];\n e.clear(), n.clear(), d.forEach((C) => {\n e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));\n }), p(c, { created: d, deleted: f });\n } else {\n const f = d.reduce((C, T) => {\n const x = e.get(T.id);\n return x ? [...C, x] : C;\n }, []);\n if (f.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${f.map((C) => C.id).join(\", \")}`);\n d.forEach((C) => {\n e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));\n }), p(c, { created: d });\n }\n }, v = (d) => {\n const r = typeof d == \"string\" ? d : d.id, c = e.get(r);\n if (c)\n return e.delete(r), c.bodies.forEach((f) => n.delete(f.id)), c;\n console.warn(`Attempt to delete missing annotation: ${r}`);\n }, S = (d, r = O.LOCAL) => {\n const c = v(d);\n c && p(r, { deleted: [c] });\n }, E = (d, r = O.LOCAL) => {\n const c = d.reduce((f, C) => {\n const T = v(C);\n return T ? [...f, T] : f;\n }, []);\n c.length > 0 && p(r, { deleted: c });\n }, l = (d) => {\n const r = e.get(d.annotation);\n if (r) {\n const c = r.bodies.find((f) => f.id === d.id);\n if (c) {\n n.delete(c.id);\n const f = {\n ...r,\n bodies: r.bodies.filter((T) => T.id !== d.id)\n };\n return e.set(r.id, f), {\n oldValue: r,\n newValue: f,\n bodiesDeleted: [c]\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 }, g = (d, r = O.LOCAL) => {\n const c = l(d);\n c && p(r, { updated: [c] });\n }, a = (d, r = O.LOCAL) => {\n const c = d.map((f) => l(f)).filter(Boolean);\n c.length > 0 && p(r, { updated: c });\n }, m = (d) => {\n const r = e.get(d);\n return r ? { ...r } : void 0;\n }, A = (d) => {\n const r = n.get(d);\n if (r) {\n const f = m(r).bodies.find((C) => C.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 }, R = (d, r) => {\n if (d.annotation !== r.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((T) => T.id === d.id), C = {\n ...c,\n bodies: c.bodies.map((T) => T.id === f.id ? r : T)\n };\n return e.set(c.id, C), f.id !== r.id && (n.delete(f.id), n.set(r.id, C.id)), {\n oldValue: c,\n newValue: C,\n bodiesUpdated: [{ oldBody: f, newBody: r }]\n };\n } else\n console.warn(`Attempt to add body to missing annotation ${d.annotation}`);\n }, N = (d, r, c = O.LOCAL) => {\n const f = R(d, r);\n f && p(c, { updated: [f] });\n }, I = (d, r = O.LOCAL) => {\n const c = d.map((f) => R({ id: f.id, annotation: f.annotation }, f)).filter(Boolean);\n p(r, { updated: c });\n }, j = (d) => {\n const r = e.get(d.annotation);\n if (r) {\n const c = {\n ...r,\n target: {\n ...r.target,\n ...d\n }\n };\n return e.set(r.id, c), {\n oldValue: r,\n newValue: c,\n targetUpdated: {\n oldTarget: r.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: w,\n addBody: U,\n all: s,\n bulkAddAnnotation: L,\n bulkDeleteAnnotation: E,\n bulkDeleteBodies: a,\n bulkUpdateAnnotation: u,\n bulkUpdateBodies: I,\n bulkUpdateTargets: (d, r = O.LOCAL) => {\n const c = d.map((f) => j(f)).filter(Boolean);\n c.length > 0 && p(r, { updated: c });\n },\n clear: h,\n deleteAnnotation: S,\n deleteBody: g,\n getAnnotation: m,\n getBody: A,\n observe: o,\n unobserve: i,\n updateAnnotation: y,\n updateBody: N,\n updateTarget: (d, r = O.LOCAL) => {\n const c = j(d);\n c && p(r, { updated: [c] });\n }\n };\n}, Te = (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 G = () => ({\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 re = 250, De = (e) => {\n const n = G(), t = [];\n let o = -1, i = !1, p = 0;\n const w = (a) => {\n if (!i) {\n const { changes: m } = a, A = performance.now();\n if (A - p > re)\n t.splice(o + 1), t.push(m), o = t.length - 1;\n else {\n const R = t.length - 1;\n t[R] = de(t[R], m);\n }\n p = A;\n }\n i = !1;\n };\n e.observe(w, { origin: O.LOCAL });\n const b = (a) => a && a.length > 0 && e.bulkDeleteAnnotation(a), y = (a) => a && a.length > 0 && e.bulkAddAnnotation(a, !1), u = (a) => a && a.length > 0 && e.bulkUpdateAnnotation(a.map(({ oldValue: m }) => m)), U = (a) => a && a.length > 0 && e.bulkUpdateAnnotation(a.map(({ newValue: m }) => m)), s = (a) => a && a.length > 0 && e.bulkAddAnnotation(a, !1), h = (a) => a && a.length > 0 && e.bulkDeleteAnnotation(a);\n return {\n canRedo: () => t.length - 1 > o,\n canUndo: () => o > -1,\n destroy: () => e.unobserve(w),\n on: (a, m) => n.on(a, m),\n redo: () => {\n if (t.length - 1 > o) {\n i = !0;\n const { created: a, updated: m, deleted: A } = t[o + 1];\n y(a), U(m), h(A), n.emit(\"redo\", t[o + 1]), o += 1;\n }\n },\n undo: () => {\n if (o > -1) {\n i = !0;\n const { created: a, updated: m, deleted: A } = t[o];\n b(a), u(m), s(A), n.emit(\"undo\", t[o]), o -= 1;\n }\n }\n };\n}, Re = () => {\n const { subscribe: e, set: n } = Y([]);\n return {\n subscribe: e,\n set: n\n };\n}, Be = (e, n, t, o) => {\n const { store: i, selection: p, hover: w, viewport: b } = e, y = /* @__PURE__ */ new Map();\n let u = [], U, s;\n const h = (l, g) => {\n y.has(l) ? y.get(l).push(g) : y.set(l, [g]);\n }, L = (l, g) => {\n const a = y.get(l);\n if (a) {\n const m = a.indexOf(g);\n m !== -1 && a.splice(m, 1);\n }\n }, v = (l, g, a) => {\n y.has(l) && setTimeout(() => {\n y.get(l).forEach((m) => {\n if (t) {\n const A = Array.isArray(g) ? g.map((N) => t.serialize(N)) : t.serialize(g), R = a ? a instanceof PointerEvent ? a : t.serialize(a) : void 0;\n m(A, R);\n } else\n m(g, a);\n });\n }, 1);\n }, S = () => {\n const { selected: l } = p, g = (l || []).map(({ id: a }) => i.getAnnotation(a));\n g.forEach((a) => {\n const m = u.find((A) => A.id === a.id);\n (!m || !B(m, a)) && v(\"updateAnnotation\", a, m);\n }), u = u.map((a) => {\n const m = g.find(({ id: A }) => A === a.id);\n return m || a;\n });\n };\n p.subscribe(({ selected: l }) => {\n if (!(u.length === 0 && l.length === 0)) {\n if (u.length === 0 && l.length > 0)\n u = l.map(({ id: g }) => i.getAnnotation(g));\n else if (u.length > 0 && l.length === 0)\n u.forEach((g) => {\n const a = i.getAnnotation(g.id);\n a && !B(a, g) && v(\"updateAnnotation\", a, g);\n }), u = [];\n else {\n const g = new Set(u.map((A) => A.id)), a = new Set(l.map(({ id: A }) => A));\n u.filter((A) => !a.has(A.id)).forEach((A) => {\n const R = i.getAnnotation(A.id);\n R && !B(R, A) && v(\"updateAnnotation\", R, A);\n }), u = [\n // Remove annotations that were deselected\n ...u.filter((A) => a.has(A.id)),\n // Add editable annotations that were selected\n ...l.filter(({ id: A }) => !g.has(A)).map(({ id: A }) => i.getAnnotation(A))\n ];\n }\n v(\"selectionChanged\", u);\n }\n }), w.subscribe((l) => {\n !U && l ? v(\"mouseEnterAnnotation\", i.getAnnotation(l)) : U && !l ? v(\"mouseLeaveAnnotation\", i.getAnnotation(U)) : U && l && (v(\"mouseLeaveAnnotation\", i.getAnnotation(U)), v(\"mouseEnterAnnotation\", i.getAnnotation(l))), U = l;\n }), b == null || b.subscribe((l) => v(\"viewportIntersect\", l.map((g) => i.getAnnotation(g)))), i.observe((l) => {\n o && (s && clearTimeout(s), s = setTimeout(S, 1e3));\n const { created: g, deleted: a } = l.changes;\n (g || []).forEach((A) => v(\"createAnnotation\", A)), (a || []).forEach((A) => v(\"deleteAnnotation\", A)), (l.changes.updated || []).filter((A) => [\n ...A.bodiesCreated || [],\n ...A.bodiesDeleted || [],\n ...A.bodiesUpdated || []\n ].length > 0).forEach(({ oldValue: A, newValue: R }) => {\n const N = u.find((I) => I.id === A.id) || A;\n u = u.map((I) => I.id === A.id ? R : I), v(\"updateAnnotation\", R, N);\n });\n }, { origin: O.LOCAL }), i.observe((l) => {\n if (u) {\n const g = new Set(u.map((m) => m.id)), a = (l.changes.updated || []).filter(({ newValue: m }) => g.has(m.id)).map(({ newValue: m }) => m);\n a.length > 0 && (u = u.map((m) => {\n const A = a.find((R) => R.id === m.id);\n return A || m;\n }));\n }\n }, { origin: O.REMOTE });\n const E = (l) => (g) => {\n const { updated: a } = g;\n l ? (a || []).forEach((m) => v(\"updateAnnotation\", m.oldValue, m.newValue)) : (a || []).forEach((m) => v(\"updateAnnotation\", m.newValue, m.oldValue));\n };\n return n.on(\"undo\", E(!0)), n.on(\"redo\", E(!1)), { on: h, off: L, emit: v };\n}, Ie = (e) => (n) => n.map((t) => e.serialize(t)), ce = (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: [] }), xe = (e, n, t) => {\n const { store: o, selection: i } = e, p = (E) => {\n if (t) {\n const { parsed: l, error: g } = t.parse(E);\n l ? o.addAnnotation(l, O.REMOTE) : console.error(g);\n } else\n o.addAnnotation(E, O.REMOTE);\n }, w = () => i.clear(), b = () => o.clear(), y = (E) => {\n const l = o.getAnnotation(E);\n return t && l ? t.serialize(l) : l;\n }, u = () => t ? o.all().map(t.serialize) : o.all(), U = () => {\n var g;\n const l = (((g = i.selected) == null ? void 0 : g.map((a) => a.id)) || []).map((a) => o.getAnnotation(a)).filter(Boolean);\n return t ? l.map(t.serialize) : l;\n }, s = (E, l = !0) => fetch(E).then((g) => g.json()).then((g) => (L(g, l), g)), h = (E) => {\n if (typeof E == \"string\") {\n const l = o.getAnnotation(E);\n if (o.deleteAnnotation(E), l)\n return t ? t.serialize(l) : l;\n } else {\n const l = t ? t.parse(E).parsed : E;\n if (l)\n return o.deleteAnnotation(l), E;\n }\n }, L = (E, l = !0) => {\n if (t) {\n const { parsed: g, failed: a } = ce(t)(E);\n a.length > 0 && console.warn(`Discarded ${a.length} invalid annotations`, a), o.bulkAddAnnotation(g, l, O.REMOTE);\n } else\n o.bulkAddAnnotation(E, l, O.REMOTE);\n }, v = (E, l) => {\n E ? i.setSelected(E, l) : i.clear();\n }, S = (E) => {\n if (t) {\n const l = t.parse(E).parsed, g = t.serialize(o.getAnnotation(l.id));\n return o.updateAnnotation(l), g;\n } else {\n const l = o.getAnnotation(E.id);\n return o.updateAnnotation(E), l;\n }\n };\n return {\n addAnnotation: p,\n cancelSelected: w,\n canRedo: n.canRedo,\n canUndo: n.canUndo,\n clearAnnotations: b,\n getAnnotationById: y,\n getAnnotations: u,\n getSelected: U,\n loadAnnotations: s,\n redo: n.redo,\n removeAnnotation: h,\n setAnnotations: L,\n setSelected: v,\n undo: n.undo,\n updateAnnotation: S\n };\n}, le = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nlet ue = (e) => crypto.getRandomValues(new Uint8Array(e)), fe = (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 w = \"\";\n for (; ; ) {\n let b = t(i), y = i;\n for (; y--; )\n if (w += e[b[y] & o] || \"\", w.length === p) return w;\n }\n };\n}, pe = (e, n = 21) => fe(e, n, ue), he = (e = 21) => {\n let n = \"\", t = crypto.getRandomValues(new Uint8Array(e));\n for (; e--; )\n n += le[t[e] & 63];\n return n;\n};\nconst ke = () => ({ isGuest: !0, id: pe(\"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_\", 20)() }), ge = (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}, me = (e) => e ? typeof e == \"object\" ? { ...e } : e : void 0, Ne = (e, n) => (Array.isArray(e) ? e : [e]).map((t) => {\n const { id: o, type: i, purpose: p, value: w, created: b, modified: y, creator: u, ...U } = t;\n return {\n id: o || `temp-${ge(t)}`,\n annotation: n,\n type: i,\n purpose: p,\n value: w,\n creator: me(u),\n created: b ? new Date(b) : void 0,\n updated: y ? new Date(y) : void 0,\n ...U\n };\n}), $e = (e) => e.map((n) => {\n var b;\n const { annotation: t, created: o, updated: i, ...p } = n, w = {\n ...p,\n created: o == null ? void 0 : o.toISOString(),\n modified: i == null ? void 0 : i.toISOString()\n };\n return (b = w.id) != null && b.startsWith(\"temp-\") && delete w.id, w;\n}), Ae = [\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], be = () => {\n const e = [...Ae];\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}, ve = () => {\n const e = be();\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}, Ee = (e, n) => e.every((t) => e.includes(t)) && n.every((t) => e.includes(t)), ze = he(), Ve = (e = ve()) => {\n const n = G(), t = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), i = (s, h) => {\n if (t.has(s)) {\n console.warn(\"Attempt to add user that is already present\", s, h);\n return;\n }\n const L = e.addUser(s, h);\n t.set(s, {\n ...h,\n presenceKey: s,\n appearance: L\n });\n }, p = (s) => {\n const h = t.get(s);\n if (!h) {\n console.warn(\"Attempt to remove user that is not present\", s);\n return;\n }\n e.removeUser(h), t.delete(s);\n }, w = (s) => {\n const h = new Set(s.map((S) => S.presenceKey)), L = s.filter(({ presenceKey: S }) => !t.has(S)), v = Array.from(t.values()).filter((S) => !h.has(S.presenceKey));\n L.forEach(({ presenceKey: S, user: E }) => i(S, E)), v.forEach((S) => {\n const { presenceKey: E } = S;\n o.has(E) && n.emit(\"selectionChange\", S, null), p(E);\n }), (L.length > 0 || v.length > 0) && n.emit(\"presence\", u());\n }, b = (s, h) => {\n const L = t.get(s);\n if (!L) {\n console.warn(\"Activity notification from user that is not present\");\n return;\n }\n const v = o.get(s);\n (!v || !Ee(v, h)) && (o.set(s, h), n.emit(\"selectionChange\", L, h));\n }, y = (s, h) => {\n const L = t.get(s);\n if (!L) {\n console.warn(\"Selection change for user that is not present\", s);\n return;\n }\n h ? o.set(s, h) : o.delete(s), n.emit(\"selectionChange\", L, h);\n }, u = () => [...Array.from(t.values())];\n return {\n getPresentUsers: u,\n notifyActivity: b,\n on: (s, h) => n.on(s, h),\n syncUsers: w,\n updateSelection: y\n };\n};\nexport {\n se as Ignore,\n O as Origin,\n ze as PRESENCE_KEY,\n F as PointerSelectAction,\n ke as createAnonymousGuest,\n xe as createBaseAnnotator,\n Se as createBody,\n ve as createDefaultAppearenceProvider,\n Ce as createHoverState,\n Be as createLifecycleObserver,\n Ve as createPresenceState,\n Le as createSelectionState,\n Oe as createStore,\n De as createUndoStack,\n Re as createViewportState,\n be as defaultColorProvider,\n q as diffAnnotations,\n Ue as getContributors,\n de as mergeChanges,\n P as onPointerSelect,\n ce as parseAll,\n Ne as parseW3CBodies,\n me as parseW3CUser,\n Ie as serializeAll,\n $e as serializeW3CBodies,\n ie as shouldNotify,\n Te as toSvelteStore\n};\n//# sourceMappingURL=annotorious-core.es.js.map\n","import { v4 as uuidv4 } from 'uuid';\nimport {\n type FormatAdapter,\n ParseResult,\n parseW3CBodies,\n parseW3CUser,\n serializeW3CBodies\n} from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationTarget, TextSelector } from '../core';\nimport type { W3CTextAnnotation, W3CTextSelector } from '../w3c';\nimport { getQuoteContext } from '../../utils';\n\nexport type W3CTextFormatAdapter = FormatAdapter<TextAnnotation, W3CTextAnnotation>;\n\n/**\n * @param source - the IRI of the annotated content\n * @param container - the HTML container of the annotated content,\n * Required to locate the content's `range` within the DOM\n */\nexport const W3CTextFormat = (\n source: string,\n container: HTMLElement\n): W3CTextFormatAdapter => ({\n parse: (serialized) => parseW3CTextAnnotation(serialized),\n serialize: (annotation) => serializeW3CTextAnnotation(annotation, source, container)\n});\n\nconst isTextSelector = (selector: Partial<TextSelector>): selector is TextSelector =>\n selector.quote !== undefined && selector.start !== undefined && selector.end !== undefined;\n\nconst parseW3CTextTargets = (annotation: W3CTextAnnotation) => {\n const {\n id: annotationId,\n creator,\n created,\n modified,\n target\n } = annotation;\n\n const w3cTargets = Array.isArray(target) ? target : [target];\n\n const parsed: TextAnnotationTarget = {\n creator: parseW3CUser(creator),\n created: created ? new Date(created) : undefined,\n updated: modified ? new Date(modified) : undefined,\n annotation: annotationId,\n selector: []\n };\n\n for (const w3cTarget of w3cTargets) {\n const w3cSelectors = Array.isArray(w3cTarget.selector) ? w3cTarget.selector : [w3cTarget.selector];\n\n const selector = w3cSelectors.reduce<Partial<TextSelector>>((s, w3cSelector) => {\n switch (w3cSelector.type) {\n case 'TextQuoteSelector':\n s.quote = w3cSelector.exact;\n break;\n case 'TextPositionSelector':\n s.start = w3cSelector.start;\n s.end = w3cSelector.end;\n break;\n }\n return s;\n }, {});\n\n if (isTextSelector(selector)) {\n parsed.selector.push({ id: w3cTarget.id, ...selector });\n } else {\n const missingTypes = [\n !selector.start ? 'TextPositionSelector' : undefined,\n !selector.quote ? 'TextQuoteSelector' : undefined\n ].filter(Boolean);\n\n return { error: Error(`Missing selector types: ${missingTypes.join(' and ')} for annotation: ${annotation.id}`) };\n }\n }\n\n return { parsed };\n};\n\nexport const parseW3CTextAnnotation = (\n annotation: W3CTextAnnotation\n): ParseResult<TextAnnotation> => {\n const annotationId = annotation.id || uuidv4();\n\n const {\n creator,\n created,\n modified,\n body,\n ...rest\n } = annotation;\n\n const bodies = parseW3CBodies(body, annotationId);\n const target = parseW3CTextTargets(annotation);\n\n return 'error' in target\n ? { error: target.error }\n : {\n parsed: {\n ...rest,\n id: annotationId,\n bodies,\n target: target.parsed\n }\n };\n\n};\n\nexport const serializeW3CTextAnnotation = (\n annotation: TextAnnotation,\n source: string,\n container: HTMLElement\n): W3CTextAnnotation => {\n const { bodies, target, ...rest } = annotation;\n\n const {\n selector,\n creator,\n created,\n updated,\n ...targetRest\n } = target;\n\n const w3cTargets = selector.map((s) => {\n const { quote, start, end, range } = s;\n\n const { prefix, suffix } = getQuoteContext(range, container);\n\n const w3cSelectors: W3CTextSelector[] = [{\n type: 'TextQuoteSelector',\n exact: quote,\n prefix,\n suffix\n }, {\n type: 'TextPositionSelector',\n start,\n end\n }];\n\n return {\n ...targetRest,\n id: s.id,\n source,\n selector: w3cSelectors\n };\n });\n\n\n return {\n ...rest,\n '@context': 'http://www.w3.org/ns/anno.jsonld',\n id: annotation.id,\n type: 'Annotation',\n body: serializeW3CBodies(annotation.bodies),\n creator,\n created: created?.toISOString(),\n modified: updated?.toISOString(),\n target: w3cTargets\n };\n\n};\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","import RBush from 'rbush';\nimport type { Store } from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport { isRevived, mergeClientRects } from '../utils';\nimport { getClientRectsPonyfill } from '../utils/getClientRectsPonyfill';\nimport { reviveSelector } from '../utils';\nimport type { AnnotationRects } from './TextAnnotationStore';\n\nconst isFirefox = false; // navigator.userAgent.match(/firefox|fxios/i);\n\nif (isFirefox) console.warn('Firefox interop enabled');\n\ninterface 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, offset: DOMRect): IndexedHighlightRect[] => {\n const rects = target.selector.flatMap(s => {\n const revivedRange = isRevived([s]) ? s.range : reviveSelector(s, container).range;\n return isFirefox ?\n getClientRectsPonyfill(revivedRange) :\n Array.from(revivedRange.getClientRects());\n });\n\n const merged = mergeClientRects(rects)\n // Offset the merged client rects so that coords\n // are relative to the parent container\n .map(({ left, top, right, bottom }) => \n new DOMRect(left - offset.left, top - offset.top, right - left, bottom - top));\n\n return merged.map(rect => {\n const { x, y, width, height } = rect;\n\n return {\n minX: x,\n minY: y,\n maxX: x + width,\n maxY: 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, container.getBoundingClientRect());\n\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 if (rects) {\n rects.forEach(rect => tree.remove(rect));\n index.delete(target.annotation);\n }\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 offset = container.getBoundingClientRect();\n\n const rectsByTarget = targets.map(target => ({ target, rects: toItems(target, offset) }));\n rectsByTarget.forEach(({ target, rects }) => index.set(target.annotation, rects));\n\n const allRects = rectsByTarget.flatMap(({ rects }) => 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 getAnnotationBounds = (id: string): DOMRect => {\n const rects = getAnnotationRects(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 getAnnotationRects = (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 getIntersecting = (\n minX: number, \n minY: number, \n maxX: number, \n maxY: number,\n ): AnnotationRects[] => {\n // All rects in this area, regardless of annotation\n const rects = tree.search({ minX, minY, maxX, maxY });\n\n // Distinct annotation IDs\n const annotationIds = new Set(rects.map(rect => rect.annotation.id));\n\n // Resolve annotation IDs. Note that the tree could be slightly out of sync (because \n // it updates by listening to changes, just like anyone else)\n return Array.from(annotationIds).map(annotationId => ({\n annotation: store.getAnnotation(annotationId),\n rects: getAnnotationRects(annotationId)\n })).filter(t => Boolean(t.annotation));\n }\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 getAnnotationBounds,\n getAnnotationRects,\n getIntersecting,\n insert,\n recalculate,\n remove,\n set,\n size,\n update\n }\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 { createSpatialTree } from './spatialTree';\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport type { TextAnnotationStore } from './TextAnnotationStore';\nimport { isRevived, reviveAnnotation, reviveTarget } from '../utils';\n\nexport interface TextAnnotatorState extends AnnotatorState<TextAnnotation> {\n\n store: TextAnnotationStore;\n\n selection: SelectionState<TextAnnotation>;\n\n hover: HoverState<TextAnnotation>;\n\n viewport: ViewportState;\n\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 = reviveAnnotation(annotation, container);\n\n const isValid = isRevived(revived.target.selector);\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 => reviveAnnotation(a, container));\n\n // Initial page load might take some time. Retry for more robustness.\n const couldNotRevive = revived.filter(a => !isRevived(a.target.selector));\n if (couldNotRevive.length > 0) {\n console.warn('Could not revive all targets for these annotations:', 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 bulkUpsertAnnotations = (\n annotations: TextAnnotation[], \n origin = Origin.LOCAL\n ): TextAnnotation[] => {\n const revived = annotations.map(a => reviveAnnotation(a, container));\n\n // Initial page load might take some time. Retry for more robustness.\n const couldNotRevive = revived.filter(a => !isRevived(a.target.selector));\n if (couldNotRevive.length > 0)\n console.warn('Could not revive all targets for these annotations:', couldNotRevive);\n\n revived.forEach(a => {\n if (store.getAnnotation(a.id))\n store.updateAnnotation(a, origin);\n else \n store.addAnnotation(a, origin);\n })\n\n return couldNotRevive;\n }\n\n const updateTarget = (target: TextAnnotationTarget, origin = Origin.LOCAL) => {\n const revived = reviveTarget(target, container);\n store.updateTarget(revived, origin);\n }\n\n const bulkUpdateTargets = (targets: TextAnnotationTarget[], origin = Origin.LOCAL) => {\n const revived = targets.map(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 getAnnotationBounds = (id: string, x?: number, y?: number, buffer = 5): DOMRect => {\n const rects = tree.getAnnotationRects(id);\n if (rects.length === 0) return;\n\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 // Preferred bounds: the rectangle\n if (match) return match;\n }\n\n return tree.getAnnotationBounds(id);\n }\n\n const recalculatePositions = () => tree.recalculate();\n\n store.observe(({ changes }) => {\n const deleted = (changes.deleted || []).filter(a => isRevived(a.target.selector));\n const created = (changes.created || []).filter(a => isRevived(a.target.selector));\n const updated = (changes.updated || []).filter(u => isRevived(u.newValue.target.selector));\n\n if (deleted?.length > 0)\n deleted.forEach(a => tree.remove(a.target));\n\n if (created.length > 0)\n tree.set(created.map(a => a.target), false);\n\n if (updated?.length > 0)\n updated.forEach(({ newValue }) => tree.update(newValue.target));\n });\n\n return {\n store: {\n ...store,\n addAnnotation,\n bulkAddAnnotation,\n bulkUpdateTargets,\n bulkUpsertAnnotations,\n getAnnotationBounds,\n getAt,\n getIntersecting: tree.getIntersecting,\n recalculatePositions,\n updateTarget\n },\n selection,\n hover,\n viewport\n }\n\n}\n","import type { Color, PresenceProvider, PresentUser } from '@annotorious/core';\nimport type { AnnotationRects } from '../state';\nimport type { HighlightStyle } from '../highlight/HighlightStyle';\nimport type { HighlightPainter } from '../highlight/HighlightPainter';\nimport type { PresencePainterOptions } from 'src/presence';\nimport type { ViewportBounds } from '../highlight/viewport';\n\nconst createCanvas = () => {\n const canvas = document.createElement('canvas');\n\n // Retina resolution for crisp font rendering\n canvas.width = 2 * window.innerWidth;\n canvas.height = 2 * window.innerHeight;\n canvas.className = 'r6o-highlight-layer presence';\n\n const context = canvas.getContext('2d');\n context.scale(2, 2);\n context.translate(0.5, 0.5);\n\n return canvas;\n}\n\nexport const createPresencePainter = (\n container: HTMLElement, \n provider: PresenceProvider, \n opts: PresencePainterOptions = {}\n): HighlightPainter => {\n\n const canvas = createCanvas();\n\n const ctx = canvas.getContext('2d');\n\n container.appendChild(canvas);\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 clear = () => {\n const { width, height } = canvas;\n ctx.clearRect(-0.5, -0.5, width + 1, height + 1);\n }\n\n const paint = (\n highlight: AnnotationRects, \n viewportBounds: ViewportBounds,\n isSelected?: boolean\n ): HighlightStyle | undefined => {\n if (opts.font)\n ctx.font = opts.font;\n\n const user = trackedAnnotations.get(highlight.annotation.id);\n if (user) {\n // Draw cursor + label to the presence canvas\n const { height } = highlight.rects[0];\n const x = highlight.rects[0].x + viewportBounds.left;\n const y = highlight.rects[0].y + viewportBounds.top;\n\n // Draw presence indicator\n ctx.fillStyle = user.appearance.color;\n ctx.fillRect(x - 2, y - 2.5, 2, height + 5);\n\n // Draw name label\n const metrics = ctx.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 ctx.fillRect(x - 2, y - 2.5 - labelHeight, labelWidth, labelHeight);\n \n ctx.fillStyle = '#fff';\n ctx.fillText(user.appearance.label, x + 1, y - paddingBottom);\n\n // Return modfied style for the renderer\n return { \n fill: user.appearance.color as Color,\n fillOpacity: isSelected ? 0.45 : 0.18\n }\n }\n }\n \n const reset = () => {\n canvas.width = 2 * window.innerWidth;\n canvas.height = 2 * window.innerHeight;\n\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 const destroy = () => {\n canvas.remove();\n }\n\n return {\n clear,\n destroy,\n paint,\n reset\n }\n \n}","import type { TextAnnotationStore } from '../state';\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport { reviveTarget } from '../utils';\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 = (\n container: HTMLElement, store: TextAnnotationStore\n) => (annotationOrId: string | TextAnnotation) => {\n const id = \n typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;\n\n // Executes scroll on an annotation with a valid DOM range selector\n const scroll = (target: TextAnnotationTarget) => {\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 // Note: first selector is not necessarily top one...\n const annotationBounds = target.selector[0].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(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\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(id);\n\n // The 1st selector is the topmost one as well\n const { range } = current.target.selector[0];\n if (range && !range.collapsed) {\n scroll(current.target);\n return true;\n } else {\n // Try reviving to account for lazy rendering\n const revived = reviveTarget(current.target, container);\n const { range } = revived.selector[0];\n if (range && !range.collapsed) {\n scroll(revived);\n return true;\n }\n }\n }\n\n return false;\n};\n","import type { FormatAdapter, PointerSelectAction } from '@annotorious/core';\nimport type { PresencePainterOptions } from './presence';\nimport type { TextAnnotation } from './model';\nimport type { HighlightStyleExpression } from './highlight';\n\nexport interface TextAnnotatorOptions<T extends unknown = TextAnnotation> {\n\n adapter?: FormatAdapter<TextAnnotation, T> | null;\n\n annotationEnabled?: boolean;\n\n renderer?: RendererType;\n\n offsetReferenceSelector?: string;\n\n pointerAction?: PointerSelectAction | ((annotation: TextAnnotation) => PointerSelectAction);\n\n presence?: PresencePainterOptions;\n\n style?: HighlightStyleExpression;\n \n}\n\nexport type RendererType = 'SPANS' | 'CANVAS' | 'CSS_HIGHLIGHTS';\n\nexport const fillDefaults = <T extends unknown = TextAnnotation> (\n opts: TextAnnotatorOptions<T>,\n defaults: TextAnnotatorOptions<T>\n): TextAnnotatorOptions<T> => {\n\n return {\n ...opts,\n annotationEnabled: opts.annotationEnabled === undefined ? defaults.annotationEnabled : opts.annotationEnabled\n };\n\n};\n","import { Origin, type User } from '@annotorious/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { TextAnnotatorState } from './state';\nimport type { TextAnnotationTarget } from './model';\nimport {\n debounce,\n splitAnnotatableRanges,\n rangeToSelector,\n isWhitespaceOrEmpty,\n NOT_ANNOTATABLE_SELECTOR\n} from './utils';\n\nexport const SelectionHandler = (\n container: HTMLElement,\n state: TextAnnotatorState,\n annotationEnabled: boolean,\n offsetReferenceSelector?: string\n) => {\n\n const { store, selection } = state;\n\n let currentUser: User;\n\n let currentTarget: TextAnnotationTarget | undefined;\n\n const setUser = (user: User) => currentUser = user;\n\n let isLeftClick = false;\n\n let lastPointerDown: PointerEvent | undefined;\n\n const onSelectStart = (evt: PointerEvent) => {\n if (!isLeftClick) return;\n\n // Make sure we don't listen to selection changes that were\n // not started on the container, or which are not supposed to\n // be annotatable (like a component popup).\n // Note that Chrome/iOS will sometimes return the root doc as target!\n const annotatable = !(evt.target as Node).parentElement?.closest(NOT_ANNOTATABLE_SELECTOR);\n if (annotatable) {\n currentTarget = {\n annotation: uuidv4(),\n selector: [],\n creator: currentUser,\n created: new Date()\n };\n } else {\n currentTarget = undefined;\n }\n }\n\n if (annotationEnabled)\n container.addEventListener('selectstart', onSelectStart);\n\n const onSelectionChange = debounce((evt: PointerEvent) => {\n const sel = document.getSelection();\n\n // This is to handle cases where the selection is \"hijacked\" by another element\n // in a not-annotatable area. A rare case in theory. But rich text editors\n // will like Quill do it...\n const annotatable = !sel.anchorNode?.parentElement?.closest(NOT_ANNOTATABLE_SELECTOR);\n if (!annotatable) {\n currentTarget = undefined;\n return;\n }\n\n // Chrome/iOS does not reliably fire the 'selectstart' event!\n if (evt.timeStamp - (lastPointerDown?.timeStamp || evt.timeStamp) < 1000 && !currentTarget)\n onSelectStart(lastPointerDown);\n\n if (sel.isCollapsed || !isLeftClick || !currentTarget) return;\n\n const selectionRange = sel.getRangeAt(0);\n if (isWhitespaceOrEmpty(selectionRange)) return;\n \n const annotatableRanges = splitAnnotatableRanges(selectionRange.cloneRange());\n\n const hasChanged =\n annotatableRanges.length !== currentTarget.selector.length ||\n annotatableRanges.some((r, i) => r.toString() !== currentTarget.selector[i]?.quote);\n \n if (!hasChanged) return;\n\n currentTarget = {\n ...currentTarget,\n selector: annotatableRanges.map(r => rangeToSelector(r, container, offsetReferenceSelector)),\n updated: new Date()\n };\n\n if (store.getAnnotation(currentTarget.annotation)) {\n store.updateTarget(currentTarget, Origin.LOCAL);\n } else {\n // Proper lifecycle management: clear selection first...\n selection.clear();\n \n // ...then add annotation to store...\n store.addAnnotation({\n id: currentTarget.annotation,\n bodies: [],\n target: currentTarget\n });\n\n // ...then make the new annotation the current selection. (Reminder:\n // select events don't have offsetX/offsetY - reuse last up/down)\n selection.clickSelect(currentTarget.annotation, lastPointerDown);\n }\n })\n\n if (annotationEnabled)\n document.addEventListener('selectionchange', onSelectionChange);\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 const onPointerDown = (evt: PointerEvent) => {\n // Note that the event itself can be ephemeral!\n const { target, timeStamp, offsetX, offsetY, type } = evt;\n lastPointerDown = { ...evt, target, timeStamp, offsetX, offsetY, type };\n\n isLeftClick = evt.button === 0;\n }\n\n container.addEventListener('pointerdown', onPointerDown);\n\n const onPointerUp = (evt: PointerEvent) => {\n const annotatable = !(evt.target as Node).parentElement?.closest(NOT_ANNOTATABLE_SELECTOR);\n if (!annotatable || !isLeftClick)\n return;\n\n // Logic for selecting an existing annotation by clicking it\n const clickSelect = () => {\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 } else if (!selection.isEmpty()) {\n selection.clear();\n }\n }\n\n const timeDifference = evt.timeStamp - lastPointerDown.timeStamp;\n\n // Just a click, not a selection\n if (document.getSelection().isCollapsed && timeDifference < 300) {\n currentTarget = undefined;\n clickSelect();\n } else if (currentTarget) {\n selection.clickSelect(currentTarget.annotation, evt);\n }\n }\n\n document.addEventListener('pointerup', onPointerUp);\n\n const destroy = () => {\n container.removeEventListener('selectstart', onSelectStart);\n document.removeEventListener('selectionchange', onSelectionChange);\n \n container.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('pointerup', onPointerUp);\n }\n\n return {\n destroy,\n setUser\n }\n\n}\n","import { createAnonymousGuest, createLifecycleObserver, createBaseAnnotator, Filter, createUndoStack } from '@annotorious/core';\nimport type { Annotator, User, PresenceProvider } from '@annotorious/core';\nimport { createCanvasRenderer, createHighlightsRenderer, createSpansRenderer, type HighlightStyleExpression } from './highlight';\nimport { createPresencePainter } from './presence';\nimport { scrollIntoView } from './api';\nimport { TextAnnotationStore, TextAnnotatorState, createTextAnnotatorState } from './state';\nimport type { TextAnnotation } from './model';\nimport { cancelSingleClickEvents } from './utils';\nimport { fillDefaults, type RendererType, type TextAnnotatorOptions } from './TextAnnotatorOptions';\nimport { SelectionHandler } from './SelectionHandler';\n\nimport './TextAnnotator.css';\n\nconst USE_DEFAULT_RENDERER: RendererType = 'SPANS';\n\nexport interface TextAnnotator<E extends unknown = TextAnnotation> extends Annotator<TextAnnotation, E> {\n\n element: HTMLElement;\n\n setStyle(style: HighlightStyleExpression | undefined): void;\n\n // Returns true if successful (or false if the annotation is not currently rendered)\n scrollIntoView(annotation: TextAnnotation): boolean;\n\n state: TextAnnotatorState;\n\n}\n\nexport const createTextAnnotator = <E extends unknown = TextAnnotation>(\n container: HTMLElement, \n options: TextAnnotatorOptions<E> = {}\n): TextAnnotator<E> => {\n // Prevent mobile browsers from triggering word selection on single click.\n cancelSingleClickEvents(container);\n\n const opts = fillDefaults<E>(options, {\n annotationEnabled: true\n });\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 = createLifecycleObserver<TextAnnotation, E>(state, undoStack, opts.adapter);\n \n let currentUser: User = createAnonymousGuest();\n\n // Use selected renderer, or fall back to default. If CSS_HIGHLIGHT is\n // requested, check if CSS Custom Highlights are supported, and fall\n // back to default renderer if not.\n const useRenderer: RendererType =\n opts.renderer === 'CSS_HIGHLIGHTS' \n ? Boolean(CSS.highlights) ? 'CSS_HIGHLIGHTS' : USE_DEFAULT_RENDERER\n : opts.renderer || USE_DEFAULT_RENDERER;\n\n const highlightRenderer = \n useRenderer === 'SPANS' ? createSpansRenderer(container, state, viewport) :\n useRenderer === 'CSS_HIGHLIGHTS' ? createHighlightsRenderer(container, state, viewport) :\n useRenderer === 'CANVAS' ? createCanvasRenderer(container, state, viewport) : undefined;\n\n if (!highlightRenderer)\n throw `Unknown renderer implementation: ${useRenderer}`;\n\n console.debug(`Using ${useRenderer} renderer`);\n \n if (opts.style)\n highlightRenderer.setStyle(opts.style);\n\n const selectionHandler = SelectionHandler(container, state, opts.annotationEnabled, opts.offsetReferenceSelector);\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 highlightRenderer.setFilter(filter);\n\n const setStyle = (style: HighlightStyleExpression | undefined) =>\n highlightRenderer.setStyle(style);\n\n const setUser = (user: User) => {\n currentUser = user;\n selectionHandler.setUser(user);\n }\n\n const setPresenceProvider = (provider: PresenceProvider) => {\n if (provider) {\n highlightRenderer.setPainter(createPresencePainter(container, provider, opts.presence));\n provider.on('selectionChange', () => highlightRenderer.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 setVisible = (visible: boolean) =>\n highlightRenderer.setVisible(visible);\n\n const destroy = () => {\n highlightRenderer.destroy();\n selectionHandler.destroy();\n\n // Other cleanup actions\n undoStack.destroy();\n }\n\n return {\n ...base,\n destroy,\n element: container,\n getUser,\n setFilter,\n setStyle,\n setUser,\n setSelected,\n setPresenceProvider,\n setVisible,\n on: lifecycle.on,\n off: lifecycle.off,\n scrollIntoView: scrollIntoView(container, store),\n state\n }\n\n}\n"],"names":["DEFAULT_STYLE","DEFAULT_SELECTED_STYLE","paint","highlight","viewportBounds","style","painter","zIndex","_a","_b","base","NOT_ANNOTATABLE_CLASS","NOT_ANNOTATABLE_SELECTOR","isRangeAnnotatable","range","ancestor","iterateNotAnnotatableElements","notAnnotatableIterator","node","notAnnotatableNode","splitAnnotatableRanges","annotatableRanges","prevNotAnnotatable","notAnnotatable","subRange","lastRange","getRangeAnnotatableContents","contents","el","cancelSingleClickEvents","container","event","debounce","func","delay","timeoutId","args","getAnnotatableFragment","fragment","findIndex","root","ni","index","n","getNodeAtIndex","wrapRange","commonAncestorContainer","startContainer","startOffset","endContainer","endOffset","originalChildren","cloned","startContainerIndex","endContainerIndex","unwrap","surround","wrapper","startRange","startNode","endRange","endNode","innerNodes","getTextNodesBetween","take","nodesBetween","getClientRectsPonyfill","nodes","rects","getQuoteContext","length","offsetReferenceSelector","offsetReference","rangeBefore","before","rangeAfter","after","whitespaceOrEmptyRegex","isWhitespaceOrEmpty","isRevived","selector","s","getRelation","rectA","rectB","round","num","a","b","union","left","right","top","bottom","mergeClientRects","merged","next","wasMerged","relation","r","rangeToSelector","quote","start","end","reviveSelector","iterator","runningOffset","startCounting","len","reviveTarget","target","reviveAnnotation","annotation","getViewportBounds","innerWidth","innerHeight","minX","minY","maxX","maxY","trackViewport","viewport","visible","annotations","ids","id","createBaseRenderer","state","renderer","store","selection","hover","currentStyle","currentFilter","currentPainter","onDraw","onPointerMove","x","y","hit","redraw","lazy","bounds","annotationsInView","selectedIds","highlights","selected","hovered","setPainter","setStyle","setFilter","filter","onStoreChange","unsubscribeSelection","onScroll","onResize","resizeObserver","config","mutationObserver","records","record","createCanvas","canvas","resetCanvas","highres","createRenderer","ctx","width","height","highlightA","highlightB","createdA","createdB","offsetRects","selectionHighlightCompensation","underlineOffset","createCanvasRenderer","t","e","u","o","i","h","g","d","f","c","l","p","v","m","N","M","H","$","j","w","toCSS","colord","elem","currentRendered","nextRendered","updatedCSS","ranges","createHighlightsRenderer","has","dequal","foo","bar","ctor","computeZIndex","rect","all","intersects","other","highlightLayer","shouldRedraw","allRects","span","backgroundColor","createSpansRenderer","byteToHex","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","B","z","k","Y","Ce","F","V","Le","L","P","S","E","U","D","_","J","Q","X","Z","W","K","Se","ee","te","ne","oe","q","O","ie","de","ae","Oe","C","T","A","R","I","G","re","De","Re","Be","ce","xe","le","ue","fe","pe","he","ke","ge","me","Ne","$e","W3CTextFormat","source","serialized","parseW3CTextAnnotation","serializeW3CTextAnnotation","isTextSelector","parseW3CTextTargets","annotationId","creator","created","modified","w3cTargets","parsed","parseW3CUser","w3cTarget","w3cSelector","missingTypes","uuidv4","body","rest","bodies","parseW3CBodies","updated","targetRest","prefix","suffix","w3cSelectors","serializeW3CBodies","quickselect","compare","quickselectStep","defaultCompare","sd","newLeft","newRight","swap","tmp","RBush","maxEntries","bbox","result","toBBox","nodesToSearch","child","childBBox","contains","data","tmpNode","item","createNode","equalsFn","path","indexes","parent","goingUp","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","createSpatialTree","tree","toItems","revivedRange","clear","insert","remove","update","set","targets","replace","rectsByTarget","getAt","hits","getAnnotationBounds","getAnnotationRects","indexed","annotationIds","createTextAnnotatorState","defaultPointerAction","createStore","createSelectionState","createHoverState","createViewportState","addAnnotation","origin","Origin","revived","isValid","bulkAddAnnotation","couldNotRevive","bulkUpsertAnnotations","updateTarget","bulkUpdateTargets","buffer","match","recalculatePositions","changes","deleted","newValue","context","createPresencePainter","provider","opts","trackedAnnotations","getAnnotationsForUser","user","isSelected","metrics","labelWidth","labelHeight","paddingBottom","getScrollParent","overflowY","scrollIntoView","annotationOrId","scroll","parentBounds","scrollParent","parentHeight","parentWidth","annotationBounds","offsetTop","offsetLeft","scrollTop","scrollLeft","current","fillDefaults","defaults","SelectionHandler","annotationEnabled","currentUser","currentTarget","setUser","isLeftClick","lastPointerDown","onSelectStart","evt","onSelectionChange","sel","selectionRange","onPointerDown","timeStamp","offsetX","offsetY","type","onPointerUp","clickSelect","timeDifference","USE_DEFAULT_RENDERER","createTextAnnotator","undoStack","createUndoStack","lifecycle","createLifecycleObserver","createAnonymousGuest","useRenderer","highlightRenderer","selectionHandler","createBaseAnnotator","arg"],"mappings":"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","x_google_ignoreList":[18,20,22,23,24,25,26,28,29]}
|