@soomo/text-annotator 3.0.0-staging.32 → 3.0.0-staging.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"text-annotator.es.js","sources":["../src/highlight/HighlightStyle.ts","../src/highlight/HighlightPainter.ts","../src/utils/splitAnnotatableRanges.ts","../src/utils/cancelSingleClickEvents.ts","../src/utils/programmaticallyFocusable.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/utils/normalizeRects.ts","../src/utils/cloneEvents.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","../../../node_modules/hotkeys-js/dist/hotkeys.esm.js","../../../node_modules/ts-key-enum/dist/js/Key.enum.js","../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}\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","/**\n * Makes an element programmatically focusable by adding a `tabindex=\"-1\"` attribute.\n * Or does nothing if the element is already focusable 🤷🏻\n * It's required to process keyboard events on an element that is not natively focusable.\n */\nexport const programmaticallyFocusable = (container: HTMLElement) => {\n if (!container.hasAttribute('tabindex') && container.tabIndex < 0) {\n container.setAttribute('tabindex', '-1');\n }\n\n container.classList.add('no-focus-outline');\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<DOMRect[]>((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}, []);\n\nexport const toDomRectList = (rects: DOMRect[]): DOMRectList => ({\n length: rects.length,\n item: (index) => rects[index],\n [Symbol.iterator]: function* (): IterableIterator<DOMRect> {\n for (let i = 0; i < this.length; i++)\n yield this.item(i)!;\n }\n})\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) });","export const normalizeRectWithOffset = (rect: DOMRect, offset: DOMRect): DOMRect => {\n const { left, top, right, bottom } = rect;\n return new DOMRect(left - offset.left, top - offset.top, right - left, bottom - top);\n};\n\nexport const denormalizeRectWithOffset = (rect: DOMRect, offset: DOMRect): DOMRect => {\n const { left, top, right, bottom } = rect;\n return new DOMRect(left + offset.left, top + offset.top, right - left, bottom - top);\n}\n","/**\n * Events need to be manually mapped into new objects:\n * 1. It preserves the `target` and `currentTarget` properties.\n * Otherwise, they will be `null` when the event is read beyond the handler.\n * 2. Spread operator can copy only own enumerable properties, not inherited ones.\n * Therefore, we need to manually copy the props we're interested in.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget\n * @see https://github.com/recogito/text-annotator-js/commit/65d13f3108c429311cf8c2523f6babbbc946013d#r144041390\n */\n\nexport const clonePointerEvent = (event: PointerEvent): PointerEvent => ({\n ...event,\n type: event.type,\n x: event.x,\n y: event.y,\n clientX: event.clientX,\n clientY: event.clientY,\n offsetX: event.offsetX,\n offsetY: event.offsetY,\n screenX: event.screenX,\n screenY: event.screenY,\n isPrimary: event.isPrimary,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n button: event.button,\n buttons: event.buttons,\n currentTarget: event.currentTarget,\n target: event.target,\n defaultPrevented: event.defaultPrevented,\n detail: event.detail,\n eventPhase: event.eventPhase,\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n timeStamp: event.timeStamp\n})\n\nexport const cloneKeyboardEvent = (event: KeyboardEvent): KeyboardEvent => ({\n ...event,\n type: event.type,\n key: event.key,\n code: event.code,\n location: event.location,\n repeat: event.repeat,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n currentTarget: event.currentTarget,\n target: event.target,\n defaultPrevented: event.defaultPrevented,\n detail: event.detail,\n timeStamp: event.timeStamp\n})\n","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, currentFilter);\n if (hit) {\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 { ViewportState } from '@annotorious/core';\nimport type { TextAnnotatorState } from '../../state';\nimport { debounce } from '../../utils';\nimport type { ViewportBounds } from '../viewport';\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';\n\nimport './canvasRenderer.css';\n\nconst createCanvas = () => {\n const canvas = document.createElement('canvas');\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n canvas.className = 'r6o-canvas-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 document.body.appendChild(canvas);\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 offsetRects.forEach(({ x, y, width, height }) =>\n ctx.fillRect(x, y, width, height)\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 = 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 canvas.remove();\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());\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","import type { ViewportState } from '@annotorious/core';\nimport { colord } from 'colord';\nimport { dequal } from 'dequal/lite';\nimport type { Rect, TextAnnotatorState } from '../../state';\nimport { type HighlightPainter, paint } 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: Highlight[]): 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 const getLength = (h: Highlight) => \n h.rects.reduce((total, rect) => total + rect.width, 0);\n\n // Any highlights that intersect this rect, sorted by total length\n const intersecting = all.filter(({ rects }) => rects.some(r => intersects(rect, r)));\n intersecting.sort((a, b) => getLength(b) - getLength(a));\n\n return intersecting.findIndex(h => h.rects.includes(rect));\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 highlights.forEach(highlight => {\n highlight.rects.map(rect => {\n const zIndex = computeZIndex(rect, highlights);\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 span.style.backgroundColor = colord(style?.fill || DEFAULT_STYLE.fill)\n .alpha(style?.fillOpacity === undefined ? DEFAULT_STYLE.fillOpacity : style.fillOpacity)\n .toHex();\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 d(b) {\n if (H(e, b) && (e = b, t)) {\n const y = !k.length;\n for (const p of o)\n p[1](), k.push(p, e);\n if (y) {\n for (let p = 0; p < k.length; p += 2)\n k[p][0](k[p + 1]);\n k.length = 0;\n }\n }\n }\n function f(b) {\n d(b(e));\n }\n function w(b, y = z) {\n const p = [b, y];\n return o.add(p), o.size === 1 && (t = n(d, f) || z), b(e), () => {\n o.delete(p), o.size === 0 && t && (t(), t = null);\n };\n }\n return { set: d, update: f, subscribe: w };\n}\nconst Ce = (e) => {\n const { subscribe: n, set: t } = Y();\n let o;\n return n((d) => o = d), e.observe(({ changes: d }) => {\n if (o) {\n (d.deleted || []).some((b) => b.id === o) && t(void 0);\n const w = (d.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: [] }, Ue = (e, n = \"EDIT\") => {\n const { subscribe: t, set: o } = Y(V);\n let d = n, f = V;\n t((m) => f = m);\n const w = () => o(V), b = () => {\n var m;\n return ((m = f.selected) == null ? void 0 : m.length) === 0;\n }, y = (m) => {\n if (b())\n return !1;\n const v = typeof m == \"string\" ? m : m.id;\n return f.selected.some((U) => U.id === v);\n }, p = (m, v) => {\n const U = e.getAnnotation(m);\n if (!U) {\n console.warn(\"Invalid selection: \" + m);\n return;\n }\n switch (P(U, d)) {\n case \"EDIT\":\n o({ selected: [{ id: m, editable: !0 }], event: v });\n break;\n case \"SELECT\":\n o({ selected: [{ id: m }], event: v });\n break;\n default:\n o({ selected: [], event: v });\n }\n }, L = (m, v) => {\n const U = Array.isArray(m) ? m : [m], O = U.map((r) => e.getAnnotation(r)).filter((r) => !!r);\n o({\n selected: O.map((r) => {\n const u = v === void 0 ? P(r, d) === \"EDIT\" : v;\n return { id: r.id, editable: u };\n })\n }), O.length !== U.length && console.warn(\"Invalid selection\", m);\n }, a = (m) => {\n if (b())\n return !1;\n const { selected: v } = f;\n v.some(({ id: O }) => m.includes(O)) && o({ selected: v.filter(({ id: O }) => !m.includes(O)) });\n }, E = (m) => d = m;\n return e.observe(\n ({ changes: m }) => a((m.deleted || []).map((v) => v.id))\n ), {\n get event() {\n return f ? f.event : null;\n },\n get selected() {\n return f ? [...f.selected] : null;\n },\n clear: w,\n isEmpty: b,\n isSelected: y,\n setSelected: L,\n setUserSelectAction: E,\n subscribe: t,\n userSelect: p\n };\n}, P = (e, n) => typeof n == \"function\" ? n(e) : 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 Le = (e) => {\n const { creator: n, updatedBy: t } = e.target, o = e.bodies.reduce((d, f) => [...d, f.creator, f.updatedBy].filter(Boolean), []);\n return [\n n,\n t,\n ...o\n ].filter((d) => d);\n}, Se = (e, n, t, o) => ({\n id: K(),\n annotation: typeof e == \"string\" ? e : 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((d) => d.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), d = 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: d.length > 0 ? d : 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 || {}), S = /* @__PURE__ */ ((e) => (e.LOCAL = \"LOCAL\", e.REMOTE = \"REMOTE\", e))(S || {});\nconst ie = (e, n) => {\n var f, 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 = (L) => L && L.length > 0;\n if (!(y(t.created) || y(t.deleted))) {\n const L = (f = t.updated) == null ? void 0 : f.some((E) => y(E.bodiesCreated) || y(E.bodiesDeleted) || y(E.bodiesUpdated)), a = (w = t.updated) == null ? void 0 : w.some((E) => E.targetUpdated);\n if (b === \"BODY_ONLY\" && L && !a || b === \"TARGET_ONLY\" && a && !L)\n return !1;\n }\n }\n if (e.options.annotations) {\n const b = /* @__PURE__ */ new Set([\n ...(t.created || []).map((p) => p.id),\n ...(t.deleted || []).map((p) => p.id),\n ...(t.updated || []).map(({ oldValue: p }) => p.id)\n ]);\n return !!(Array.isArray(e.options.annotations) ? e.options.annotations : [e.options.annotations]).find((p) => b.has(p));\n } else\n return !0;\n}, de = (e, n) => {\n const t = new Set((e.created || []).map((a) => a.id)), o = new Set((e.updated || []).map(({ newValue: a }) => a.id)), d = new Set((n.created || []).map((a) => a.id)), f = new Set((n.deleted || []).map((a) => a.id)), w = new Set((n.updated || []).map(({ oldValue: a }) => a.id)), b = new Set((n.updated || []).filter(({ oldValue: a }) => t.has(a.id) || o.has(a.id)).map(({ oldValue: a }) => a.id)), y = [\n ...(e.created || []).filter((a) => !f.has(a.id)).map((a) => w.has(a.id) ? n.updated.find(({ oldValue: E }) => E.id === a.id).newValue : a),\n ...n.created || []\n ], p = [\n ...(e.deleted || []).filter((a) => !d.has(a.id)),\n ...(n.deleted || []).filter((a) => !t.has(a.id))\n ], L = [\n ...(e.updated || []).filter(({ newValue: a }) => !f.has(a.id)).map((a) => {\n const { oldValue: E, newValue: m } = a;\n if (w.has(m.id)) {\n const v = n.updated.find((U) => U.oldValue.id === m.id).newValue;\n return q(E, v);\n } else\n return a;\n }),\n ...(n.updated || []).filter(({ oldValue: a }) => !b.has(a.id))\n ];\n return { created: y, deleted: p, updated: L };\n}, re = (e) => e.id !== void 0, Oe = () => {\n const e = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), t = [], o = (i, c = {}) => t.push({ onChange: i, options: c }), d = (i) => {\n const c = t.findIndex((l) => l.onChange == i);\n c > -1 && t.splice(c, 1);\n }, f = (i, c) => {\n const l = {\n origin: i,\n changes: {\n created: c.created || [],\n updated: c.updated || [],\n deleted: c.deleted || []\n },\n state: [...e.values()]\n };\n t.forEach((g) => {\n ie(g, l) && g.onChange(l);\n });\n }, w = (i, c = S.LOCAL) => {\n if (e.get(i.id))\n throw Error(`Cannot add annotation ${i.id} - exists already`);\n e.set(i.id, i), i.bodies.forEach((g) => n.set(g.id, i.id)), f(c, { created: [i] });\n }, b = (i, c) => {\n const l = typeof i == \"string\" ? c : i, g = typeof i == \"string\" ? i : i.id, C = e.get(g);\n if (C) {\n const T = q(C, l);\n return g === l.id ? e.set(g, l) : (e.delete(g), e.set(l.id, l)), C.bodies.forEach((I) => n.delete(I.id)), l.bodies.forEach((I) => n.set(I.id, l.id)), T;\n } else\n console.warn(`Cannot update annotation ${g} - does not exist`);\n }, y = (i, c = S.LOCAL, l = S.LOCAL) => {\n const g = re(c) ? l : c, C = b(i, c);\n C && f(g, { updated: [C] });\n }, p = (i, c = S.LOCAL) => {\n const l = i.reduce((g, C) => {\n const T = b(C);\n return T ? [...g, T] : g;\n }, []);\n l.length > 0 && f(c, { updated: l });\n }, L = (i, c = S.LOCAL) => {\n const l = e.get(i.annotation);\n if (l) {\n const g = {\n ...l,\n bodies: [...l.bodies, i]\n };\n e.set(l.id, g), n.set(i.id, g.id), f(c, { updated: [{\n oldValue: l,\n newValue: g,\n bodiesCreated: [i]\n }] });\n } else\n console.warn(`Attempt to add body to missing annotation: ${i.annotation}`);\n }, a = () => [...e.values()], E = (i = S.LOCAL) => {\n const c = [...e.values()];\n e.clear(), n.clear(), f(i, { deleted: c });\n }, m = (i, c = !0, l = S.LOCAL) => {\n if (c) {\n const g = [...e.values()];\n e.clear(), n.clear(), i.forEach((C) => {\n e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));\n }), f(l, { created: i, deleted: g });\n } else {\n const g = i.reduce((C, T) => {\n const I = e.get(T.id);\n return I ? [...C, I] : C;\n }, []);\n if (g.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${g.map((C) => C.id).join(\", \")}`);\n i.forEach((C) => {\n e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));\n }), f(l, { created: i });\n }\n }, v = (i) => {\n const c = typeof i == \"string\" ? i : i.id, l = e.get(c);\n if (l)\n return e.delete(c), l.bodies.forEach((g) => n.delete(g.id)), l;\n console.warn(`Attempt to delete missing annotation: ${c}`);\n }, U = (i, c = S.LOCAL) => {\n const l = v(i);\n l && f(c, { deleted: [l] });\n }, O = (i, c = S.LOCAL) => {\n const l = i.reduce((g, C) => {\n const T = v(C);\n return T ? [...g, T] : g;\n }, []);\n l.length > 0 && f(c, { deleted: l });\n }, r = (i) => {\n const c = e.get(i.annotation);\n if (c) {\n const l = c.bodies.find((g) => g.id === i.id);\n if (l) {\n n.delete(l.id);\n const g = {\n ...c,\n bodies: c.bodies.filter((T) => T.id !== i.id)\n };\n return e.set(c.id, g), {\n oldValue: c,\n newValue: g,\n bodiesDeleted: [l]\n };\n } else\n console.warn(`Attempt to delete missing body ${i.id} from annotation ${i.annotation}`);\n } else\n console.warn(`Attempt to delete body from missing annotation ${i.annotation}`);\n }, u = (i, c = S.LOCAL) => {\n const l = r(i);\n l && f(c, { updated: [l] });\n }, s = (i, c = S.LOCAL) => {\n const l = i.map((g) => r(g)).filter(Boolean);\n l.length > 0 && f(c, { updated: l });\n }, h = (i) => {\n const c = e.get(i);\n return c ? { ...c } : void 0;\n }, A = (i) => {\n const c = n.get(i);\n if (c) {\n const g = h(c).bodies.find((C) => C.id === i);\n if (g)\n return g;\n console.error(`Store integrity error: body ${i} in index, but not in annotation`);\n } else\n console.warn(`Attempt to retrieve missing body: ${i}`);\n }, R = (i, c) => {\n if (i.annotation !== c.annotation)\n throw \"Annotation integrity violation: annotation ID must be the same when updating bodies\";\n const l = e.get(i.annotation);\n if (l) {\n const g = l.bodies.find((T) => T.id === i.id), C = {\n ...l,\n bodies: l.bodies.map((T) => T.id === g.id ? c : T)\n };\n return e.set(l.id, C), g.id !== c.id && (n.delete(g.id), n.set(c.id, C.id)), {\n oldValue: l,\n newValue: C,\n bodiesUpdated: [{ oldBody: g, newBody: c }]\n };\n } else\n console.warn(`Attempt to add body to missing annotation ${i.annotation}`);\n }, N = (i, c, l = S.LOCAL) => {\n const g = R(i, c);\n g && f(l, { updated: [g] });\n }, x = (i, c = S.LOCAL) => {\n const l = i.map((g) => R({ id: g.id, annotation: g.annotation }, g)).filter(Boolean);\n f(c, { updated: l });\n }, j = (i) => {\n const c = e.get(i.annotation);\n if (c) {\n const l = {\n ...c,\n target: {\n ...c.target,\n ...i\n }\n };\n return e.set(c.id, l), {\n oldValue: c,\n newValue: l,\n targetUpdated: {\n oldTarget: c.target,\n newTarget: i\n }\n };\n } else\n console.warn(`Attempt to update target on missing annotation: ${i.annotation}`);\n };\n return {\n addAnnotation: w,\n addBody: L,\n all: a,\n bulkAddAnnotation: m,\n bulkDeleteAnnotation: O,\n bulkDeleteBodies: s,\n bulkUpdateAnnotation: p,\n bulkUpdateBodies: x,\n bulkUpdateTargets: (i, c = S.LOCAL) => {\n const l = i.map((g) => j(g)).filter(Boolean);\n l.length > 0 && f(c, { updated: l });\n },\n clear: E,\n deleteAnnotation: U,\n deleteBody: u,\n getAnnotation: h,\n getBody: A,\n observe: o,\n unobserve: d,\n updateAnnotation: y,\n updateBody: N,\n updateTarget: (i, c = S.LOCAL) => {\n const l = j(i);\n l && f(c, { updated: [l] });\n }\n };\n}, Te = (e) => ({\n ...e,\n subscribe: (t) => {\n const o = (d) => t(d.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] || [], d = o.length; t < d; 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((d) => n !== d);\n };\n }\n});\nconst ae = 250, De = (e) => {\n const n = G(), t = [];\n let o = -1, d = !1, f = 0;\n const w = (s) => {\n if (!d) {\n const { changes: h } = s, A = performance.now();\n if (A - f > ae)\n t.splice(o + 1), t.push(h), o = t.length - 1;\n else {\n const R = t.length - 1;\n t[R] = de(t[R], h);\n }\n f = A;\n }\n d = !1;\n };\n e.observe(w, { origin: S.LOCAL });\n const b = (s) => s && s.length > 0 && e.bulkDeleteAnnotation(s), y = (s) => s && s.length > 0 && e.bulkAddAnnotation(s, !1), p = (s) => s && s.length > 0 && e.bulkUpdateAnnotation(s.map(({ oldValue: h }) => h)), L = (s) => s && s.length > 0 && e.bulkUpdateAnnotation(s.map(({ newValue: h }) => h)), a = (s) => s && s.length > 0 && e.bulkAddAnnotation(s, !1), E = (s) => s && s.length > 0 && e.bulkDeleteAnnotation(s);\n return {\n canRedo: () => t.length - 1 > o,\n canUndo: () => o > -1,\n destroy: () => e.unobserve(w),\n on: (s, h) => n.on(s, h),\n redo: () => {\n if (t.length - 1 > o) {\n d = !0;\n const { created: s, updated: h, deleted: A } = t[o + 1];\n y(s), L(h), E(A), n.emit(\"redo\", t[o + 1]), o += 1;\n }\n },\n undo: () => {\n if (o > -1) {\n d = !0;\n const { created: s, updated: h, deleted: A } = t[o];\n b(s), p(h), a(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: d, selection: f, hover: w, viewport: b } = e, y = /* @__PURE__ */ new Map();\n let p = [], L, a;\n const E = (r, u) => {\n y.has(r) ? y.get(r).push(u) : y.set(r, [u]);\n }, m = (r, u) => {\n const s = y.get(r);\n if (s) {\n const h = s.indexOf(u);\n h !== -1 && s.splice(h, 1);\n }\n }, v = (r, u, s) => {\n y.has(r) && setTimeout(() => {\n y.get(r).forEach((h) => {\n if (t) {\n const A = Array.isArray(u) ? u.map((N) => t.serialize(N)) : t.serialize(u), R = s ? s instanceof PointerEvent ? s : t.serialize(s) : void 0;\n h(A, R);\n } else\n h(u, s);\n });\n }, 1);\n }, U = () => {\n const { selected: r } = f, u = (r || []).map(({ id: s }) => d.getAnnotation(s));\n u.forEach((s) => {\n const h = p.find((A) => A.id === s.id);\n (!h || !B(h, s)) && v(\"updateAnnotation\", s, h);\n }), p = p.map((s) => {\n const h = u.find(({ id: A }) => A === s.id);\n return h || s;\n });\n };\n f.subscribe(({ selected: r }) => {\n if (!(p.length === 0 && r.length === 0)) {\n if (p.length === 0 && r.length > 0)\n p = r.map(({ id: u }) => d.getAnnotation(u));\n else if (p.length > 0 && r.length === 0)\n p.forEach((u) => {\n const s = d.getAnnotation(u.id);\n s && !B(s, u) && v(\"updateAnnotation\", s, u);\n }), p = [];\n else {\n const u = new Set(p.map((A) => A.id)), s = new Set(r.map(({ id: A }) => A));\n p.filter((A) => !s.has(A.id)).forEach((A) => {\n const R = d.getAnnotation(A.id);\n R && !B(R, A) && v(\"updateAnnotation\", R, A);\n }), p = [\n // Remove annotations that were deselected\n ...p.filter((A) => s.has(A.id)),\n // Add editable annotations that were selected\n ...r.filter(({ id: A }) => !u.has(A)).map(({ id: A }) => d.getAnnotation(A))\n ];\n }\n v(\"selectionChanged\", p);\n }\n }), w.subscribe((r) => {\n !L && r ? v(\"mouseEnterAnnotation\", d.getAnnotation(r)) : L && !r ? v(\"mouseLeaveAnnotation\", d.getAnnotation(L)) : L && r && (v(\"mouseLeaveAnnotation\", d.getAnnotation(L)), v(\"mouseEnterAnnotation\", d.getAnnotation(r))), L = r;\n }), b == null || b.subscribe((r) => v(\"viewportIntersect\", r.map((u) => d.getAnnotation(u)))), d.observe((r) => {\n o && (a && clearTimeout(a), a = setTimeout(U, 1e3));\n const { created: u, deleted: s } = r.changes;\n (u || []).forEach((A) => v(\"createAnnotation\", A)), (s || []).forEach((A) => v(\"deleteAnnotation\", A)), (r.changes.updated || []).filter((A) => [\n ...A.bodiesCreated || [],\n ...A.bodiesDeleted || [],\n ...A.bodiesUpdated || []\n ].length > 0).forEach(({ oldValue: A, newValue: R }) => {\n const N = p.find((x) => x.id === A.id) || A;\n p = p.map((x) => x.id === A.id ? R : x), v(\"updateAnnotation\", R, N);\n });\n }, { origin: S.LOCAL }), d.observe((r) => {\n if (p) {\n const u = new Set(p.map((h) => h.id)), s = (r.changes.updated || []).filter(({ newValue: h }) => u.has(h.id)).map(({ newValue: h }) => h);\n s.length > 0 && (p = p.map((h) => {\n const A = s.find((R) => R.id === h.id);\n return A || h;\n }));\n }\n }, { origin: S.REMOTE });\n const O = (r) => (u) => {\n const { updated: s } = u;\n r ? (s || []).forEach((h) => v(\"updateAnnotation\", h.oldValue, h.newValue)) : (s || []).forEach((h) => v(\"updateAnnotation\", h.newValue, h.oldValue));\n };\n return n.on(\"undo\", O(!0)), n.on(\"redo\", O(!1)), { on: E, off: m, emit: v };\n}, xe = (e) => (n) => n.map((t) => e.serialize(t)), ce = (e) => (n) => n.reduce((t, o) => {\n const { parsed: d, error: f } = e.parse(o);\n return f ? {\n parsed: t.parsed,\n failed: [...t.failed, o]\n } : d ? {\n parsed: [...t.parsed, d],\n failed: t.failed\n } : {\n ...t\n };\n}, { parsed: [], failed: [] }), Ie = (e, n, t) => {\n const { store: o, selection: d } = e, f = (r) => {\n if (t) {\n const { parsed: u, error: s } = t.parse(r);\n u ? o.addAnnotation(u, S.REMOTE) : console.error(s);\n } else\n o.addAnnotation(r, S.REMOTE);\n }, w = () => d.clear(), b = () => o.clear(), y = (r) => {\n const u = o.getAnnotation(r);\n return t && u ? t.serialize(u) : u;\n }, p = () => t ? o.all().map(t.serialize) : o.all(), L = () => {\n var s;\n const u = (((s = d.selected) == null ? void 0 : s.map((h) => h.id)) || []).map((h) => o.getAnnotation(h)).filter(Boolean);\n return t ? u.map(t.serialize) : u;\n }, a = (r, u = !0) => fetch(r).then((s) => s.json()).then((s) => (m(s, u), s)), E = (r) => {\n if (typeof r == \"string\") {\n const u = o.getAnnotation(r);\n if (o.deleteAnnotation(r), u)\n return t ? t.serialize(u) : u;\n } else {\n const u = t ? t.parse(r).parsed : r;\n if (u)\n return o.deleteAnnotation(u), r;\n }\n }, m = (r, u = !0) => {\n if (t) {\n const { parsed: s, failed: h } = ce(t)(r);\n h.length > 0 && console.warn(`Discarded ${h.length} invalid annotations`, h), o.bulkAddAnnotation(s, u, S.REMOTE);\n } else\n o.bulkAddAnnotation(r, u, S.REMOTE);\n }, v = (r, u) => {\n r ? d.setSelected(r, u) : d.clear();\n }, U = (r) => {\n d.clear(), d.setUserSelectAction(r);\n }, O = (r) => {\n if (t) {\n const u = t.parse(r).parsed, s = t.serialize(o.getAnnotation(u.id));\n return o.updateAnnotation(u), s;\n } else {\n const u = o.getAnnotation(r.id);\n return o.updateAnnotation(r), u;\n }\n };\n return {\n addAnnotation: f,\n cancelSelected: w,\n canRedo: n.canRedo,\n canUndo: n.canUndo,\n clearAnnotations: b,\n getAnnotationById: y,\n getAnnotations: p,\n getSelected: L,\n loadAnnotations: a,\n redo: n.redo,\n removeAnnotation: E,\n setAnnotations: m,\n setSelected: v,\n setUserSelectAction: U,\n undo: n.undo,\n updateAnnotation: O\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, d = -~(1.6 * o * n / e.length);\n return (f = n) => {\n let w = \"\";\n for (; ; ) {\n let b = t(d), y = d;\n for (; y--; )\n if (w += e[b[y] & o] || \"\", w.length === f) 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, d = n.length; o < d; o++) {\n let f = n.charCodeAt(o);\n t = (t << 5) - t + f, 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: d, purpose: f, value: w, created: b, modified: y, creator: p, ...L } = t;\n return {\n id: o || `temp-${ge(t)}`,\n annotation: n,\n type: d,\n purpose: f,\n value: w,\n creator: me(p),\n created: b ? new Date(b) : void 0,\n updated: y ? new Date(y) : void 0,\n ...L\n };\n}), $e = (e) => e.map((n) => {\n var b;\n const { annotation: t, created: o, updated: d, ...f } = n, w = {\n ...f,\n created: o == null ? void 0 : o.toISOString(),\n modified: d == null ? void 0 : d.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), d = e[o];\n return e.splice(o, 1), d;\n }, releaseColor: (o) => e.push(o) };\n}, ve = () => {\n const e = be();\n return { addUser: (o, d) => {\n const f = e.assignRandomColor();\n return {\n label: d.name || d.id,\n avatar: d.avatar,\n color: f\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(), d = (a, E) => {\n if (t.has(a)) {\n console.warn(\"Attempt to add user that is already present\", a, E);\n return;\n }\n const m = e.addUser(a, E);\n t.set(a, {\n ...E,\n presenceKey: a,\n appearance: m\n });\n }, f = (a) => {\n const E = t.get(a);\n if (!E) {\n console.warn(\"Attempt to remove user that is not present\", a);\n return;\n }\n e.removeUser(E), t.delete(a);\n }, w = (a) => {\n const E = new Set(a.map((U) => U.presenceKey)), m = a.filter(({ presenceKey: U }) => !t.has(U)), v = Array.from(t.values()).filter((U) => !E.has(U.presenceKey));\n m.forEach(({ presenceKey: U, user: O }) => d(U, O)), v.forEach((U) => {\n const { presenceKey: O } = U;\n o.has(O) && n.emit(\"selectionChange\", U, null), f(O);\n }), (m.length > 0 || v.length > 0) && n.emit(\"presence\", p());\n }, b = (a, E) => {\n const m = t.get(a);\n if (!m) {\n console.warn(\"Activity notification from user that is not present\");\n return;\n }\n const v = o.get(a);\n (!v || !Ee(v, E)) && (o.set(a, E), n.emit(\"selectionChange\", m, E));\n }, y = (a, E) => {\n const m = t.get(a);\n if (!m) {\n console.warn(\"Selection change for user that is not present\", a);\n return;\n }\n E ? o.set(a, E) : o.delete(a), n.emit(\"selectionChange\", m, E);\n }, p = () => [...Array.from(t.values())];\n return {\n getPresentUsers: p,\n notifyActivity: b,\n on: (a, E) => n.on(a, E),\n syncUsers: w,\n updateSelection: y\n };\n};\nexport {\n se as Ignore,\n S as Origin,\n ze as PRESENCE_KEY,\n F as UserSelectAction,\n ke as createAnonymousGuest,\n Ie as createBaseAnnotator,\n Se as createBody,\n ve as createDefaultAppearenceProvider,\n Ce as createHoverState,\n Be as createLifecycleObserver,\n Ve as createPresenceState,\n Ue as createSelectionState,\n Oe as createStore,\n De as createUndoStack,\n Re as createViewportState,\n be as defaultColorProvider,\n q as diffAnnotations,\n Le as getContributors,\n de as mergeChanges,\n P as onUserSelect,\n ce as parseAll,\n Ne as parseW3CBodies,\n me as parseW3CUser,\n xe 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 if (w3cTargets.length === 0) {\n return { error: Error(`No targets found for annotation: ${annotation.id}`) };\n }\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 styleClass: w3cTargets[0].styleClass\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 {\n getClientRectsPonyfill,\n isRevived,\n mergeClientRects,\n normalizeRectWithOffset,\n reviveSelector\n} 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 /**\n * Offset the merged client rects so that coords\n * are relative to the parent container\n */\n const merged = mergeClientRects(rects).map(rect => normalizeRectWithOffset(rect, offset));\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, all = false): string[] => {\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 all ? hits.map(h => h.annotation.id) : [ hits[0].annotation.id ];\n } else {\n return [];\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 { Filter, UserSelectAction, Store, ViewportState, UserSelectActionExpression } 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 defaultUserAction?: UserSelectActionExpression<TextAnnotation>\n): TextAnnotatorState => {\n\n const store: Store<TextAnnotation> = createStore<TextAnnotation>();\n\n const tree = createSpatialTree(store, container);\n\n const selection = createSelectionState<TextAnnotation>(store, defaultUserAction);\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, filter?: Filter): TextAnnotation | undefined => {\n const annotations = tree.getAt(x, y, Boolean(filter)).map(id => store.getAnnotation(id));\n const filtered = filter ? annotations.filter(filter) : annotations;\n return filtered.length > 0 ? filtered[0] : undefined;\n }\n\n const getAnnotationBounds = (id: string, x?: number, y?: number, buffer = 5): DOMRect | undefined => {\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.bind(tree),\n getAnnotationRects: tree.getAnnotationRects.bind(tree),\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, HighlightPainter } from '../highlight';\nimport type { PresencePainterOptions } from '../presence';\nimport type { ViewportBounds } from '../highlight/viewport';\n\nimport './PresencePainter.css';\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-presence-layer';\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 document.body.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}\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, UserSelectActionExpression, User } 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 annotatingEnabled?: boolean;\n\n renderer?: RendererType;\n\n offsetReferenceSelector?: string;\n\n userAction?: UserSelectActionExpression<TextAnnotation>,\n\n presence?: PresencePainterOptions;\n\n style?: HighlightStyleExpression;\n\n user?: User;\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 annotatingEnabled: opts.annotatingEnabled ?? defaults.annotatingEnabled,\n user: opts.user || defaults.user,\n };\n\n};\n","/**! \n * hotkeys-js v3.13.7 \n * A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies. \n * \n * Copyright (c) 2024 kenny wong <wowohoo@qq.com> \n * https://github.com/jaywcjlove/hotkeys-js.git \n * \n * @website: https://jaywcjlove.github.io/hotkeys-js\n \n * Licensed under the MIT license \n */\n\nconst isff = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0 : false;\n\n// 绑定事件\nfunction addEvent(object, event, method, useCapture) {\n if (object.addEventListener) {\n object.addEventListener(event, method, useCapture);\n } else if (object.attachEvent) {\n object.attachEvent(\"on\".concat(event), method);\n }\n}\nfunction removeEvent(object, event, method, useCapture) {\n if (object.removeEventListener) {\n object.removeEventListener(event, method, useCapture);\n } else if (object.detachEvent) {\n object.detachEvent(\"on\".concat(event), method);\n }\n}\n\n// 修饰键转换成对应的键码\nfunction getMods(modifier, key) {\n const mods = key.slice(0, key.length - 1);\n for (let i = 0; i < mods.length; i++) mods[i] = modifier[mods[i].toLowerCase()];\n return mods;\n}\n\n// 处理传的key字符串转换成数组\nfunction getKeys(key) {\n if (typeof key !== 'string') key = '';\n key = key.replace(/\\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等\n const keys = key.split(','); // 同时设置多个快捷键,以','分割\n let index = keys.lastIndexOf('');\n\n // 快捷键可能包含',',需特殊处理\n for (; index >= 0;) {\n keys[index - 1] += ',';\n keys.splice(index, 1);\n index = keys.lastIndexOf('');\n }\n return keys;\n}\n\n// 比较修饰键的数组\nfunction compareArray(a1, a2) {\n const arr1 = a1.length >= a2.length ? a1 : a2;\n const arr2 = a1.length >= a2.length ? a2 : a1;\n let isIndex = true;\n for (let i = 0; i < arr1.length; i++) {\n if (arr2.indexOf(arr1[i]) === -1) isIndex = false;\n }\n return isIndex;\n}\n\n// Special Keys\nconst _keyMap = {\n backspace: 8,\n '⌫': 8,\n tab: 9,\n clear: 12,\n enter: 13,\n '↩': 13,\n return: 13,\n esc: 27,\n escape: 27,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n del: 46,\n delete: 46,\n ins: 45,\n insert: 45,\n home: 36,\n end: 35,\n pageup: 33,\n pagedown: 34,\n capslock: 20,\n num_0: 96,\n num_1: 97,\n num_2: 98,\n num_3: 99,\n num_4: 100,\n num_5: 101,\n num_6: 102,\n num_7: 103,\n num_8: 104,\n num_9: 105,\n num_multiply: 106,\n num_add: 107,\n num_enter: 108,\n num_subtract: 109,\n num_decimal: 110,\n num_divide: 111,\n '⇪': 20,\n ',': 188,\n '.': 190,\n '/': 191,\n '`': 192,\n '-': isff ? 173 : 189,\n '=': isff ? 61 : 187,\n ';': isff ? 59 : 186,\n '\\'': 222,\n '[': 219,\n ']': 221,\n '\\\\': 220\n};\n\n// Modifier Keys\nconst _modifier = {\n // shiftKey\n '⇧': 16,\n shift: 16,\n // altKey\n '⌥': 18,\n alt: 18,\n option: 18,\n // ctrlKey\n '⌃': 17,\n ctrl: 17,\n control: 17,\n // metaKey\n '⌘': 91,\n cmd: 91,\n command: 91\n};\nconst modifierMap = {\n 16: 'shiftKey',\n 18: 'altKey',\n 17: 'ctrlKey',\n 91: 'metaKey',\n shiftKey: 16,\n ctrlKey: 17,\n altKey: 18,\n metaKey: 91\n};\nconst _mods = {\n 16: false,\n 18: false,\n 17: false,\n 91: false\n};\nconst _handlers = {};\n\n// F1~F12 special key\nfor (let k = 1; k < 20; k++) {\n _keyMap[\"f\".concat(k)] = 111 + k;\n}\n\nlet _downKeys = []; // 记录摁下的绑定键\nlet winListendFocus = null; // window是否已经监听了focus事件\nlet _scope = 'all'; // 默认热键范围\nconst elementEventMap = new Map(); // 已绑定事件的节点记录\n\n// 返回键码\nconst code = x => _keyMap[x.toLowerCase()] || _modifier[x.toLowerCase()] || x.toUpperCase().charCodeAt(0);\nconst getKey = x => Object.keys(_keyMap).find(k => _keyMap[k] === x);\nconst getModifier = x => Object.keys(_modifier).find(k => _modifier[k] === x);\n\n// 设置获取当前范围(默认为'所有')\nfunction setScope(scope) {\n _scope = scope || 'all';\n}\n// 获取当前范围\nfunction getScope() {\n return _scope || 'all';\n}\n// 获取摁下绑定键的键值\nfunction getPressedKeyCodes() {\n return _downKeys.slice(0);\n}\nfunction getPressedKeyString() {\n return _downKeys.map(c => getKey(c) || getModifier(c) || String.fromCharCode(c));\n}\nfunction getAllKeyCodes() {\n const result = [];\n Object.keys(_handlers).forEach(k => {\n _handlers[k].forEach(_ref => {\n let {\n key,\n scope,\n mods,\n shortcut\n } = _ref;\n result.push({\n scope,\n shortcut,\n mods,\n keys: key.split('+').map(v => code(v))\n });\n });\n });\n return result;\n}\n\n// 表单控件控件判断 返回 Boolean\n// hotkey is effective only when filter return true\nfunction filter(event) {\n const target = event.target || event.srcElement;\n const {\n tagName\n } = target;\n let flag = true;\n const isInput = tagName === 'INPUT' && !['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(target.type);\n // ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>\n if (target.isContentEditable || (isInput || tagName === 'TEXTAREA' || tagName === 'SELECT') && !target.readOnly) {\n flag = false;\n }\n return flag;\n}\n\n// 判断摁下的键是否为某个键,返回true或者false\nfunction isPressed(keyCode) {\n if (typeof keyCode === 'string') {\n keyCode = code(keyCode); // 转换成键码\n }\n return _downKeys.indexOf(keyCode) !== -1;\n}\n\n// 循环删除handlers中的所有 scope(范围)\nfunction deleteScope(scope, newScope) {\n let handlers;\n let i;\n\n // 没有指定scope,获取scope\n if (!scope) scope = getScope();\n for (const key in _handlers) {\n if (Object.prototype.hasOwnProperty.call(_handlers, key)) {\n handlers = _handlers[key];\n for (i = 0; i < handlers.length;) {\n if (handlers[i].scope === scope) {\n const deleteItems = handlers.splice(i, 1);\n deleteItems.forEach(_ref2 => {\n let {\n element\n } = _ref2;\n return removeKeyEvent(element);\n });\n } else {\n i++;\n }\n }\n }\n }\n\n // 如果scope被删除,将scope重置为all\n if (getScope() === scope) setScope(newScope || 'all');\n}\n\n// 清除修饰键\nfunction clearModifier(event) {\n let key = event.keyCode || event.which || event.charCode;\n const i = _downKeys.indexOf(key);\n\n // 从列表中清除按压过的键\n if (i >= 0) {\n _downKeys.splice(i, 1);\n }\n // 特殊处理 cmmand 键,在 cmmand 组合快捷键 keyup 只执行一次的问题\n if (event.key && event.key.toLowerCase() === 'meta') {\n _downKeys.splice(0, _downKeys.length);\n }\n\n // 修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除\n if (key === 93 || key === 224) key = 91;\n if (key in _mods) {\n _mods[key] = false;\n\n // 将修饰键重置为false\n for (const k in _modifier) if (_modifier[k] === key) hotkeys[k] = false;\n }\n}\nfunction unbind(keysInfo) {\n // unbind(), unbind all keys\n if (typeof keysInfo === 'undefined') {\n Object.keys(_handlers).forEach(key => {\n Array.isArray(_handlers[key]) && _handlers[key].forEach(info => eachUnbind(info));\n delete _handlers[key];\n });\n removeKeyEvent(null);\n } else if (Array.isArray(keysInfo)) {\n // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])\n keysInfo.forEach(info => {\n if (info.key) eachUnbind(info);\n });\n } else if (typeof keysInfo === 'object') {\n // support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})\n if (keysInfo.key) eachUnbind(keysInfo);\n } else if (typeof keysInfo === 'string') {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n // support old method\n // eslint-disable-line\n let [scope, method] = args;\n if (typeof scope === 'function') {\n method = scope;\n scope = '';\n }\n eachUnbind({\n key: keysInfo,\n scope,\n method,\n splitKey: '+'\n });\n }\n}\n\n// 解除绑定某个范围的快捷键\nconst eachUnbind = _ref3 => {\n let {\n key,\n scope,\n method,\n splitKey = '+'\n } = _ref3;\n const multipleKeys = getKeys(key);\n multipleKeys.forEach(originKey => {\n const unbindKeys = originKey.split(splitKey);\n const len = unbindKeys.length;\n const lastKey = unbindKeys[len - 1];\n const keyCode = lastKey === '*' ? '*' : code(lastKey);\n if (!_handlers[keyCode]) return;\n // 判断是否传入范围,没有就获取范围\n if (!scope) scope = getScope();\n const mods = len > 1 ? getMods(_modifier, unbindKeys) : [];\n const unbindElements = [];\n _handlers[keyCode] = _handlers[keyCode].filter(record => {\n // 通过函数判断,是否解除绑定,函数相等直接返回\n const isMatchingMethod = method ? record.method === method : true;\n const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods);\n if (isUnbind) unbindElements.push(record.element);\n return !isUnbind;\n });\n unbindElements.forEach(element => removeKeyEvent(element));\n });\n};\n\n// 对监听对应快捷键的回调函数进行处理\nfunction eventHandler(event, handler, scope, element) {\n if (handler.element !== element) {\n return;\n }\n let modifiersMatch;\n\n // 看它是否在当前范围\n if (handler.scope === scope || handler.scope === 'all') {\n // 检查是否匹配修饰符(如果有返回true)\n modifiersMatch = handler.mods.length > 0;\n for (const y in _mods) {\n if (Object.prototype.hasOwnProperty.call(_mods, y)) {\n if (!_mods[y] && handler.mods.indexOf(+y) > -1 || _mods[y] && handler.mods.indexOf(+y) === -1) {\n modifiersMatch = false;\n }\n }\n }\n\n // 调用处理程序,如果是修饰键不做处理\n if (handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91] || modifiersMatch || handler.shortcut === '*') {\n handler.keys = [];\n handler.keys = handler.keys.concat(_downKeys);\n if (handler.method(event, handler) === false) {\n if (event.preventDefault) event.preventDefault();else event.returnValue = false;\n if (event.stopPropagation) event.stopPropagation();\n if (event.cancelBubble) event.cancelBubble = true;\n }\n }\n }\n}\n\n// 处理keydown事件\nfunction dispatch(event, element) {\n const asterisk = _handlers['*'];\n let key = event.keyCode || event.which || event.charCode;\n\n // 表单控件过滤 默认表单控件不触发快捷键\n if (!hotkeys.filter.call(this, event)) return;\n\n // Gecko(Firefox)的command键值224,在Webkit(Chrome)中保持一致\n // Webkit左右 command 键值不一样\n if (key === 93 || key === 224) key = 91;\n\n /**\n * Collect bound keys\n * If an Input Method Editor is processing key input and the event is keydown, return 229.\n * https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229\n * http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n */\n if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);\n /**\n * Jest test cases are required.\n * ===============================\n */\n ['ctrlKey', 'altKey', 'shiftKey', 'metaKey'].forEach(keyName => {\n const keyNum = modifierMap[keyName];\n if (event[keyName] && _downKeys.indexOf(keyNum) === -1) {\n _downKeys.push(keyNum);\n } else if (!event[keyName] && _downKeys.indexOf(keyNum) > -1) {\n _downKeys.splice(_downKeys.indexOf(keyNum), 1);\n } else if (keyName === 'metaKey' && event[keyName] && _downKeys.length === 3) {\n /**\n * Fix if Command is pressed:\n * ===============================\n */\n if (!(event.ctrlKey || event.shiftKey || event.altKey)) {\n _downKeys = _downKeys.slice(_downKeys.indexOf(keyNum));\n }\n }\n });\n /**\n * -------------------------------\n */\n\n if (key in _mods) {\n _mods[key] = true;\n\n // 将特殊字符的key注册到 hotkeys 上\n for (const k in _modifier) {\n if (_modifier[k] === key) hotkeys[k] = true;\n }\n if (!asterisk) return;\n }\n\n // 将 modifierMap 里面的修饰键绑定到 event 中\n for (const e in _mods) {\n if (Object.prototype.hasOwnProperty.call(_mods, e)) {\n _mods[e] = event[modifierMap[e]];\n }\n }\n /**\n * https://github.com/jaywcjlove/hotkeys/pull/129\n * This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.\n * An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.\n * Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate\n */\n if (event.getModifierState && !(event.altKey && !event.ctrlKey) && event.getModifierState('AltGraph')) {\n if (_downKeys.indexOf(17) === -1) {\n _downKeys.push(17);\n }\n if (_downKeys.indexOf(18) === -1) {\n _downKeys.push(18);\n }\n _mods[17] = true;\n _mods[18] = true;\n }\n\n // 获取范围 默认为 `all`\n const scope = getScope();\n // 对任何快捷键都需要做的处理\n if (asterisk) {\n for (let i = 0; i < asterisk.length; i++) {\n if (asterisk[i].scope === scope && (event.type === 'keydown' && asterisk[i].keydown || event.type === 'keyup' && asterisk[i].keyup)) {\n eventHandler(event, asterisk[i], scope, element);\n }\n }\n }\n // key 不在 _handlers 中返回\n if (!(key in _handlers)) return;\n const handlerKey = _handlers[key];\n const keyLen = handlerKey.length;\n for (let i = 0; i < keyLen; i++) {\n if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) {\n if (handlerKey[i].key) {\n const record = handlerKey[i];\n const {\n splitKey\n } = record;\n const keyShortcut = record.key.split(splitKey);\n const _downKeysCurrent = []; // 记录当前按键键值\n for (let a = 0; a < keyShortcut.length; a++) {\n _downKeysCurrent.push(code(keyShortcut[a]));\n }\n if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {\n // 找到处理内容\n eventHandler(event, record, scope, element);\n }\n }\n }\n }\n}\nfunction hotkeys(key, option, method) {\n _downKeys = [];\n const keys = getKeys(key); // 需要处理的快捷键列表\n let mods = [];\n let scope = 'all'; // scope默认为all,所有范围都有效\n let element = document; // 快捷键事件绑定节点\n let i = 0;\n let keyup = false;\n let keydown = true;\n let splitKey = '+';\n let capture = false;\n let single = false; // 单个callback\n\n // 对为设定范围的判断\n if (method === undefined && typeof option === 'function') {\n method = option;\n }\n if (Object.prototype.toString.call(option) === '[object Object]') {\n if (option.scope) scope = option.scope; // eslint-disable-line\n if (option.element) element = option.element; // eslint-disable-line\n if (option.keyup) keyup = option.keyup; // eslint-disable-line\n if (option.keydown !== undefined) keydown = option.keydown; // eslint-disable-line\n if (option.capture !== undefined) capture = option.capture; // eslint-disable-line\n if (typeof option.splitKey === 'string') splitKey = option.splitKey; // eslint-disable-line\n if (option.single === true) single = true; // eslint-disable-line\n }\n if (typeof option === 'string') scope = option;\n\n // 如果只允许单个callback,先unbind\n if (single) unbind(key, scope);\n\n // 对于每个快捷键进行处理\n for (; i < keys.length; i++) {\n key = keys[i].split(splitKey); // 按键列表\n mods = [];\n\n // 如果是组合快捷键取得组合快捷键\n if (key.length > 1) mods = getMods(_modifier, key);\n\n // 将非修饰键转化为键码\n key = key[key.length - 1];\n key = key === '*' ? '*' : code(key); // *表示匹配所有快捷键\n\n // 判断key是否在_handlers中,不在就赋一个空数组\n if (!(key in _handlers)) _handlers[key] = [];\n _handlers[key].push({\n keyup,\n keydown,\n scope,\n mods,\n shortcut: keys[i],\n method,\n key: keys[i],\n splitKey,\n element\n });\n }\n // 在全局document上设置快捷键\n if (typeof element !== 'undefined' && window) {\n if (!elementEventMap.has(element)) {\n const keydownListener = function () {\n let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;\n return dispatch(event, element);\n };\n const keyupListenr = function () {\n let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;\n dispatch(event, element);\n clearModifier(event);\n };\n elementEventMap.set(element, {\n keydownListener,\n keyupListenr,\n capture\n });\n addEvent(element, 'keydown', keydownListener, capture);\n addEvent(element, 'keyup', keyupListenr, capture);\n }\n if (!winListendFocus) {\n const listener = () => {\n _downKeys = [];\n };\n winListendFocus = {\n listener,\n capture\n };\n addEvent(window, 'focus', listener, capture);\n }\n }\n}\nfunction trigger(shortcut) {\n let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';\n Object.keys(_handlers).forEach(key => {\n const dataList = _handlers[key].filter(item => item.scope === scope && item.shortcut === shortcut);\n dataList.forEach(data => {\n if (data && data.method) {\n data.method();\n }\n });\n });\n}\n\n// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听\nfunction removeKeyEvent(element) {\n const values = Object.values(_handlers).flat();\n const findindex = values.findIndex(_ref4 => {\n let {\n element: el\n } = _ref4;\n return el === element;\n });\n if (findindex < 0) {\n const {\n keydownListener,\n keyupListenr,\n capture\n } = elementEventMap.get(element) || {};\n if (keydownListener && keyupListenr) {\n removeEvent(element, 'keyup', keyupListenr, capture);\n removeEvent(element, 'keydown', keydownListener, capture);\n elementEventMap.delete(element);\n }\n }\n if (values.length <= 0 || elementEventMap.size <= 0) {\n // 移除所有的元素上的监听\n const eventKeys = Object.keys(elementEventMap);\n eventKeys.forEach(el => {\n const {\n keydownListener,\n keyupListenr,\n capture\n } = elementEventMap.get(el) || {};\n if (keydownListener && keyupListenr) {\n removeEvent(el, 'keyup', keyupListenr, capture);\n removeEvent(el, 'keydown', keydownListener, capture);\n elementEventMap.delete(el);\n }\n });\n // 清空 elementEventMap\n elementEventMap.clear();\n // 清空 _handlers\n Object.keys(_handlers).forEach(key => delete _handlers[key]);\n // 移除window上的focus监听\n if (winListendFocus) {\n const {\n listener,\n capture\n } = winListendFocus;\n removeEvent(window, 'focus', listener, capture);\n winListendFocus = null;\n }\n }\n}\nconst _api = {\n getPressedKeyString,\n setScope,\n getScope,\n deleteScope,\n getPressedKeyCodes,\n getAllKeyCodes,\n isPressed,\n filter,\n trigger,\n unbind,\n keyMap: _keyMap,\n modifier: _modifier,\n modifierMap\n};\nfor (const a in _api) {\n if (Object.prototype.hasOwnProperty.call(_api, a)) {\n hotkeys[a] = _api[a];\n }\n}\nif (typeof window !== 'undefined') {\n const _hotkeys = window.hotkeys;\n hotkeys.noConflict = deep => {\n if (deep && window.hotkeys === hotkeys) {\n window.hotkeys = _hotkeys;\n }\n return hotkeys;\n };\n window.hotkeys = hotkeys;\n}\n\nexport { hotkeys as default };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * An enum that includes all non-printable string values one can expect from $event.key.\n * For example, this enum includes values like \"CapsLock\", \"Backspace\", and \"AudioVolumeMute\",\n * but does not include values like \"a\", \"A\", \"#\", \"é\", or \"¿\".\n * Auto generated from MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values#Speech_recognition_keys\n */\nvar Key;\n(function (Key) {\n /**\n * The user agent wasn't able to map the event's virtual keycode to a\n * specific key value.\n * This can happen due to hardware or software constraints, or because of\n * constraints around the platform on which the user agent is running.\n */\n Key[\"Unidentified\"] = \"Unidentified\";\n /** The Alt (Alternative) key. */\n Key[\"Alt\"] = \"Alt\";\n /**\n * The AltGr or AltGraph (Alternate Graphics) key.\n * Enables the ISO Level 3 shift modifier (where Shift is the\n * level 2 modifier).\n */\n Key[\"AltGraph\"] = \"AltGraph\";\n /**\n * The Caps Lock key. Toggles the capital character lock on and\n * off for subsequent input.\n */\n Key[\"CapsLock\"] = \"CapsLock\";\n /**\n * The Control, Ctrl, or Ctl key. Allows\n * typing control characters.\n */\n Key[\"Control\"] = \"Control\";\n /**\n * The Fn (Function modifier) key. Used to allow generating\n * function key (F1–F15, for instance) characters on\n * keyboards without a dedicated function key area. Often handled in\n * hardware so that events aren't generated for this key.\n */\n Key[\"Fn\"] = \"Fn\";\n /**\n * The FnLock or F-Lock (Function Lock) key.Toggles\n * the function key mode described by \"Fn\" on and off. Often\n * handled in hardware so that events aren't generated for this key.\n */\n Key[\"FnLock\"] = \"FnLock\";\n /** The Hyper key. */\n Key[\"Hyper\"] = \"Hyper\";\n /**\n * The Meta key. Allows issuing special command inputs. This is\n * the Windows logo key, or the Command or\n * ⌘ key on Mac keyboards.\n */\n Key[\"Meta\"] = \"Meta\";\n /**\n * The NumLock (Number Lock) key. Toggles the numeric keypad\n * between number entry some other mode (often directional arrows).\n */\n Key[\"NumLock\"] = \"NumLock\";\n /**\n * The Scroll Lock key. Toggles between scrolling and cursor\n * movement modes.\n */\n Key[\"ScrollLock\"] = \"ScrollLock\";\n /**\n * The Shift key. Modifies keystrokes to allow typing upper (or\n * other) case letters, and to support typing punctuation and other special\n * characters.\n */\n Key[\"Shift\"] = \"Shift\";\n /** The Super key. */\n Key[\"Super\"] = \"Super\";\n /** The Symbol modifier key (found on certain virtual keyboards). */\n Key[\"Symbol\"] = \"Symbol\";\n /** The Symbol Lock key. */\n Key[\"SymbolLock\"] = \"SymbolLock\";\n /**\n * The Enter or ↵ key (sometimes labeled\n * Return).\n */\n Key[\"Enter\"] = \"Enter\";\n /** The Horizontal Tab key, Tab. */\n Key[\"Tab\"] = \"Tab\";\n /** The down arrow key. */\n Key[\"ArrowDown\"] = \"ArrowDown\";\n /** The left arrow key. */\n Key[\"ArrowLeft\"] = \"ArrowLeft\";\n /** The right arrow key. */\n Key[\"ArrowRight\"] = \"ArrowRight\";\n /** The up arrow key. */\n Key[\"ArrowUp\"] = \"ArrowUp\";\n /** The End key. Moves to the end of content. */\n Key[\"End\"] = \"End\";\n /** The Home key. Moves to the start of content. */\n Key[\"Home\"] = \"Home\";\n /**\n * The Page Down (or PgDn) key. Scrolls down or\n * displays the next page of content.\n */\n Key[\"PageDown\"] = \"PageDown\";\n /**\n * The Page Up (or PgUp) key. Scrolls up or displays\n * the previous page of content.\n */\n Key[\"PageUp\"] = \"PageUp\";\n /**\n * The Backspace key. This key is labeled Delete on\n * Mac keyboards.\n */\n Key[\"Backspace\"] = \"Backspace\";\n /** The Clear key. Removes the currently selected input. */\n Key[\"Clear\"] = \"Clear\";\n /** The Copy key (on certain extended keyboards). */\n Key[\"Copy\"] = \"Copy\";\n /** The Cursor Select key, CrSel. */\n Key[\"CrSel\"] = \"CrSel\";\n /** The Cut key (on certain extended keyboards). */\n Key[\"Cut\"] = \"Cut\";\n /** The Delete key, Del. */\n Key[\"Delete\"] = \"Delete\";\n /**\n * Erase to End of Field. Deletes all characters from the current cursor\n * position to the end of the current field.\n */\n Key[\"EraseEof\"] = \"EraseEof\";\n /** The ExSel (Extend Selection) key. */\n Key[\"ExSel\"] = \"ExSel\";\n /**\n * The Insert key, Ins. Toggles between inserting and\n * overwriting text.\n */\n Key[\"Insert\"] = \"Insert\";\n /** Paste from the clipboard. */\n Key[\"Paste\"] = \"Paste\";\n /** Redo the last action. */\n Key[\"Redo\"] = \"Redo\";\n /** Undo the last action. */\n Key[\"Undo\"] = \"Undo\";\n /**\n * The Accept, Commit, or OK key or\n * button. Accepts the currently selected option or input method sequence\n * conversion.\n */\n Key[\"Accept\"] = \"Accept\";\n /** The Again key. Redoes or repeats a previous action. */\n Key[\"Again\"] = \"Again\";\n /** The Attn (Attention) key. */\n Key[\"Attn\"] = \"Attn\";\n /** The Cancel key. */\n Key[\"Cancel\"] = \"Cancel\";\n /**\n * Shows the context menu. Typically found between the\n * Windows (or OS) key and the Control key\n * on the right side of the keyboard.\n */\n Key[\"ContextMenu\"] = \"ContextMenu\";\n /**\n * The Esc (Escape) key. Typically used as an exit, cancel, or\n * \"escape this operation\" button. Historically, the Escape character was\n * used to signal the start of a special control sequence of characters\n * called an \"escape sequence.\"\n */\n Key[\"Escape\"] = \"Escape\";\n /** The Execute key. */\n Key[\"Execute\"] = \"Execute\";\n /**\n * The Find key. Opens an interface (typically a dialog box) for\n * performing a find/search operation.\n */\n Key[\"Find\"] = \"Find\";\n /** The Finish key. */\n Key[\"Finish\"] = \"Finish\";\n /**\n * The Help key. Opens or toggles the display of help\n * information.\n */\n Key[\"Help\"] = \"Help\";\n /**\n * The Pause key. Pauses the current application or state, if\n * applicable.\n * Note: This shouldn't be confused with the\n * \"MediaPause\" key value, which is used for media\n * controllers, rather than to control applications and processes.\n */\n Key[\"Pause\"] = \"Pause\";\n /**\n * The Play key. Resumes a previously paused application, if\n * applicable.\n * Note: This shouldn't be confused with the\n * \"MediaPlay\" key value, which is used for media\n * controllers, rather than to control applications and processes.\n */\n Key[\"Play\"] = \"Play\";\n /** The Props (Properties) key. */\n Key[\"Props\"] = \"Props\";\n /** The Select key. */\n Key[\"Select\"] = \"Select\";\n /** The ZoomIn key. */\n Key[\"ZoomIn\"] = \"ZoomIn\";\n /** The ZoomOut key. */\n Key[\"ZoomOut\"] = \"ZoomOut\";\n /**\n * The Brightness Down key. Typically used to reduce the brightness of the\n * display.\n */\n Key[\"BrightnessDown\"] = \"BrightnessDown\";\n /**\n * The Brightness Up key. Typically increases the brightness of the\n * display.\n */\n Key[\"BrightnessUp\"] = \"BrightnessUp\";\n /**\n * The Eject key. Ejects removable media (or toggles an optical\n * storage device tray open and closed).\n */\n Key[\"Eject\"] = \"Eject\";\n /** The LogOff key. */\n Key[\"LogOff\"] = \"LogOff\";\n /**\n * The Power button or key, to toggle power on and off.\n * Note: Not all systems pass this key through to the\n * user agent.\n */\n Key[\"Power\"] = \"Power\";\n /**\n * The PowerOff or PowerDown key. Shuts off the\n * system.\n */\n Key[\"PowerOff\"] = \"PowerOff\";\n /**\n * The PrintScreen or PrtScr key. Sometimes\n * SnapShot. Captures the screen and prints it or saves it to\n * disk.\n */\n Key[\"PrintScreen\"] = \"PrintScreen\";\n /**\n * The Hibernate key. This saves the state of the computer to\n * disk and then shuts down; the computer can be returned to its previous\n * state by restoring the saved state information.\n */\n Key[\"Hibernate\"] = \"Hibernate\";\n /**\n * The Standby key. (Also known as Suspend or\n * Sleep.) This turns off the display and puts the computer in a\n * low power consumption mode, without completely powering off.\n */\n Key[\"Standby\"] = \"Standby\";\n /**\n * The WakeUp key. Used to wake the computer from the\n * hibernation or standby modes.\n */\n Key[\"WakeUp\"] = \"WakeUp\";\n /**\n * The All Candidates key, which starts multi-candidate mode, in\n * which multiple candidates are displayed for the ongoing input.\n */\n Key[\"AllCandidates\"] = \"AllCandidates\";\n /** The Alphanumeric key. */\n Key[\"Alphanumeric\"] = \"Alphanumeric\";\n /**\n * The Code Input key, which enables code input mode, which lets\n * the user enter characters by typing their code points (their Unicode\n * character numbers, typically).\n */\n Key[\"CodeInput\"] = \"CodeInput\";\n /** The Compose key. */\n Key[\"Compose\"] = \"Compose\";\n /**\n * The Convert key, which instructs the IME to convert the\n * current input method sequence into the resulting character.\n */\n Key[\"Convert\"] = \"Convert\";\n /**\n * A dead \"combining\" key; that is, a key which is used in tandem with\n * other keys to generate accented and other modified characters. If\n * pressed by itself, it doesn't generate a character.\n * If you wish to identify which specific dead key was pressed (in cases\n * where more than one exists), you can do so by examining the\n * KeyboardEvent's associated\n * compositionupdate event's\n * data property.\n */\n Key[\"Dead\"] = \"Dead\";\n /**\n * The Final (Final Mode) key is used on some Asian keyboards to\n * enter final mode when using IMEs.\n */\n Key[\"FinalMode\"] = \"FinalMode\";\n /**\n * Switches to the first character group on an\n * ISO/IEC 9995 keyboard. Each key may have multiple groups of characters, each in its own\n * column. Pressing this key instructs the device to interpret keypresses\n * as coming from the first column on subsequent keystrokes.\n */\n Key[\"GroupFirst\"] = \"GroupFirst\";\n /**\n * Switches to the last character group on an\n * ISO/IEC 9995 keyboard.\n */\n Key[\"GroupLast\"] = \"GroupLast\";\n /**\n * Switches to the next character group on an\n * ISO/IEC 9995 keyboard.\n */\n Key[\"GroupNext\"] = \"GroupNext\";\n /**\n * Switches to the previous character group on an\n * ISO/IEC 9995 keyboard.\n */\n Key[\"GroupPrevious\"] = \"GroupPrevious\";\n /** The Mode Change key. Toggles or cycles among input modes of IMEs. */\n Key[\"ModeChange\"] = \"ModeChange\";\n /**\n * The Next Candidate function key. Selects the next possible match for the\n * ongoing input.\n */\n Key[\"NextCandidate\"] = \"NextCandidate\";\n /**\n * The NonConvert (\"Don't convert\") key. This accepts the\n * current input method sequence without running conversion when using an\n * IME.\n */\n Key[\"NonConvert\"] = \"NonConvert\";\n /**\n * The Previous Candidate key. Selects the previous possible match for the\n * ongoing input.\n */\n Key[\"PreviousCandidate\"] = \"PreviousCandidate\";\n /** The Process key. Instructs the IME to process the conversion. */\n Key[\"Process\"] = \"Process\";\n /**\n * The Single Candidate key. Enables single candidate mode (as opposed to\n * multi-candidate mode); in this mode, only one candidate is displayed at\n * a time.\n */\n Key[\"SingleCandidate\"] = \"SingleCandidate\";\n /**\n * The Hangul (Korean character set) mode key, which toggles\n * between Hangul and English entry modes.\n */\n Key[\"HangulMode\"] = \"HangulMode\";\n /**\n * Selects the Hanja mode, for converting Hangul characters to the more\n * specific Hanja characters.\n */\n Key[\"HanjaMode\"] = \"HanjaMode\";\n /**\n * Selects the Junja mode, in which Korean is represented using single-byte\n * Latin characters.\n */\n Key[\"JunjaMode\"] = \"JunjaMode\";\n /**\n * The Eisu key. This key's purpose is defined by the IME, but\n * may be used to close the IME.\n */\n Key[\"Eisu\"] = \"Eisu\";\n /** The Hankaku (half-width characters) key. */\n Key[\"Hankaku\"] = \"Hankaku\";\n /** The Hiragana key; selects Kana characters mode. */\n Key[\"Hiragana\"] = \"Hiragana\";\n /** Toggles between the Hiragana and Katakana writing systems. */\n Key[\"HiraganaKatakana\"] = \"HiraganaKatakana\";\n /** The Kana Mode (Kana Lock) key. */\n Key[\"KanaMode\"] = \"KanaMode\";\n /**\n * The Kanji Mode key. Enables entering Japanese text using the\n * ideographic characters of Chinese origin.\n */\n Key[\"KanjiMode\"] = \"KanjiMode\";\n /** The Katakana key. */\n Key[\"Katakana\"] = \"Katakana\";\n /** The Romaji key; selects the Roman character set. */\n Key[\"Romaji\"] = \"Romaji\";\n /** The Zenkaku (full width) characters key. */\n Key[\"Zenkaku\"] = \"Zenkaku\";\n /** The Zenkaku/Hankaku (full width/half width) toggle key. */\n Key[\"ZenkakuHanaku\"] = \"ZenkakuHanaku\";\n /** The first general-purpose function key, F1. */\n Key[\"F1\"] = \"F1\";\n /** The F2 key. */\n Key[\"F2\"] = \"F2\";\n /** The F3 key. */\n Key[\"F3\"] = \"F3\";\n /** The F4 key. */\n Key[\"F4\"] = \"F4\";\n /** The F5 key. */\n Key[\"F5\"] = \"F5\";\n /** The F6 key. */\n Key[\"F6\"] = \"F6\";\n /** The F7 key. */\n Key[\"F7\"] = \"F7\";\n /** The F8 key. */\n Key[\"F8\"] = \"F8\";\n /** The F9 key. */\n Key[\"F9\"] = \"F9\";\n /** The F10 key. */\n Key[\"F10\"] = \"F10\";\n /** The F11 key. */\n Key[\"F11\"] = \"F11\";\n /** The F12 key. */\n Key[\"F12\"] = \"F12\";\n /** The F13 key. */\n Key[\"F13\"] = \"F13\";\n /** The F14 key. */\n Key[\"F14\"] = \"F14\";\n /** The F15 key. */\n Key[\"F15\"] = \"F15\";\n /** The F16 key. */\n Key[\"F16\"] = \"F16\";\n /** The F17 key. */\n Key[\"F17\"] = \"F17\";\n /** The F18 key. */\n Key[\"F18\"] = \"F18\";\n /** The F19 key. */\n Key[\"F19\"] = \"F19\";\n /** The F20 key. */\n Key[\"F20\"] = \"F20\";\n /** The first general-purpose virtual function key. */\n Key[\"Soft1\"] = \"Soft1\";\n /** The second general-purpose virtual function key. */\n Key[\"Soft2\"] = \"Soft2\";\n /** The third general-purpose virtual function key. */\n Key[\"Soft3\"] = \"Soft3\";\n /** The fourth general-purpose virtual function key. */\n Key[\"Soft4\"] = \"Soft4\";\n /**\n * Presents a list of recently-used applications which lets the user change\n * apps quickly.\n */\n Key[\"AppSwitch\"] = \"AppSwitch\";\n /** The Call key. Dials the number which has been entered. */\n Key[\"Call\"] = \"Call\";\n /** The Camera key. Activates the camera. */\n Key[\"Camera\"] = \"Camera\";\n /** The Focus key. Focuses the camera. */\n Key[\"CameraFocus\"] = \"CameraFocus\";\n /** The End Call or Hang Up button. */\n Key[\"EndCall\"] = \"EndCall\";\n /** The Back button. */\n Key[\"GoBack\"] = \"GoBack\";\n /**\n * The Home button. Returns the user to the phone's main screen\n * (usually an application launcher).\n */\n Key[\"GoHome\"] = \"GoHome\";\n /**\n * The Headset Hook key. This is typically actually a button on\n * the headset which is used to hang up calls and play or pause media.\n */\n Key[\"HeadsetHook\"] = \"HeadsetHook\";\n /** The Redial button. Redials the last-called number. */\n Key[\"LastNumberRedial\"] = \"LastNumberRedial\";\n /** The Notification key. */\n Key[\"Notification\"] = \"Notification\";\n /**\n * A button which cycles among the notification modes: silent, vibrate,\n * ring, and so forth.\n */\n Key[\"MannerMode\"] = \"MannerMode\";\n /** The Voice Dial key. Initiates voice dialing. */\n Key[\"VoiceDial\"] = \"VoiceDial\";\n /** Switches to the previous channel. */\n Key[\"ChannelDown\"] = \"ChannelDown\";\n /** Switches to the next channel. */\n Key[\"ChannelUp\"] = \"ChannelUp\";\n /** Starts, continues, or increases the speed of fast forwarding the media. */\n Key[\"MediaFastForward\"] = \"MediaFastForward\";\n /**\n * Pauses the currently playing media.\n * Note: Some older applications use\n * \"Pause\", but this is not correct.\n */\n Key[\"MediaPause\"] = \"MediaPause\";\n /**\n * Starts or continues playing media at normal speed, if not already doing\n * so. Has no effect otherwise.\n */\n Key[\"MediaPlay\"] = \"MediaPlay\";\n /** Toggles between playing and pausing the current media. */\n Key[\"MediaPlayPause\"] = \"MediaPlayPause\";\n /** Starts or resumes recording media. */\n Key[\"MediaRecord\"] = \"MediaRecord\";\n /** Starts, continues, or increases the speed of rewinding the media. */\n Key[\"MediaRewind\"] = \"MediaRewind\";\n /**\n * Stops the current media activity (such as playing, recording, pausing,\n * forwarding, or rewinding). Has no effect if the media is currently\n * stopped already.\n */\n Key[\"MediaStop\"] = \"MediaStop\";\n /** Seeks to the next media or program track. */\n Key[\"MediaTrackNext\"] = \"MediaTrackNext\";\n /** Seeks to the previous media or program track. */\n Key[\"MediaTrackPrevious\"] = \"MediaTrackPrevious\";\n /** Adjusts audio balance toward the left. */\n Key[\"AudioBalanceLeft\"] = \"AudioBalanceLeft\";\n /** Adjusts audio balance toward the right. */\n Key[\"AudioBalanceRight\"] = \"AudioBalanceRight\";\n /** Decreases the amount of bass. */\n Key[\"AudioBassDown\"] = \"AudioBassDown\";\n /**\n * Reduces bass boosting or cycles downward through bass boost modes or\n * states.\n */\n Key[\"AudioBassBoostDown\"] = \"AudioBassBoostDown\";\n /** Toggles bass boosting on and off. */\n Key[\"AudioBassBoostToggle\"] = \"AudioBassBoostToggle\";\n /**\n * Increases the amount of bass boosting, or cycles upward through a set of\n * bass boost modes or states.\n */\n Key[\"AudioBassBoostUp\"] = \"AudioBassBoostUp\";\n /** Increases the amount of bass. */\n Key[\"AudioBassUp\"] = \"AudioBassUp\";\n /** Adjusts the audio fader toward the front. */\n Key[\"AudioFaderFront\"] = \"AudioFaderFront\";\n /** Adjusts the audio fader toward the rear. */\n Key[\"AudioFaderRear\"] = \"AudioFaderRear\";\n /** Selects the next available surround sound mode. */\n Key[\"AudioSurroundModeNext\"] = \"AudioSurroundModeNext\";\n /** Decreases the amount of treble. */\n Key[\"AudioTrebleDown\"] = \"AudioTrebleDown\";\n /** Increases the amount of treble. */\n Key[\"AudioTrebleUp\"] = \"AudioTrebleUp\";\n /** Decreases the audio volume. */\n Key[\"AudioVolumeDown\"] = \"AudioVolumeDown\";\n /** Mutes the audio. */\n Key[\"AudioVolumeMute\"] = \"AudioVolumeMute\";\n /** Increases the audio volume. */\n Key[\"AudioVolumeUp\"] = \"AudioVolumeUp\";\n /** Toggles the microphone on and off. */\n Key[\"MicrophoneToggle\"] = \"MicrophoneToggle\";\n /** Decreases the microphone's input volume. */\n Key[\"MicrophoneVolumeDown\"] = \"MicrophoneVolumeDown\";\n /** Mutes the microphone input. */\n Key[\"MicrophoneVolumeMute\"] = \"MicrophoneVolumeMute\";\n /** Increases the microphone's input volume. */\n Key[\"MicrophoneVolumeUp\"] = \"MicrophoneVolumeUp\";\n /** Switches into TV viewing mode. */\n Key[\"TV\"] = \"TV\";\n /** Toggles 3D TV mode on and off. */\n Key[\"TV3DMode\"] = \"TV3DMode\";\n /** Toggles between antenna and cable inputs. */\n Key[\"TVAntennaCable\"] = \"TVAntennaCable\";\n /** Toggles audio description mode on and off. */\n Key[\"TVAudioDescription\"] = \"TVAudioDescription\";\n /**\n * Decreases the audio description's mixing volume; reduces the volume of\n * the audio descriptions relative to the program sound.\n */\n Key[\"TVAudioDescriptionMixDown\"] = \"TVAudioDescriptionMixDown\";\n /**\n * Increases the audio description's mixing volume; increases the volume of\n * the audio descriptions relative to the program sound.\n */\n Key[\"TVAudioDescriptionMixUp\"] = \"TVAudioDescriptionMixUp\";\n /**\n * Displays or hides the media contents available for playback (this may be\n * a channel guide showing the currently airing programs, or a list of\n * media files to play).\n */\n Key[\"TVContentsMenu\"] = \"TVContentsMenu\";\n /** Displays or hides the TV's data service menu. */\n Key[\"TVDataService\"] = \"TVDataService\";\n /** Cycles the input mode on an external TV. */\n Key[\"TVInput\"] = \"TVInput\";\n /** Switches to the input \"Component 1.\" */\n Key[\"TVInputComponent1\"] = \"TVInputComponent1\";\n /** Switches to the input \"Component 2.\" */\n Key[\"TVInputComponent2\"] = \"TVInputComponent2\";\n /** Switches to the input \"Composite 1.\" */\n Key[\"TVInputComposite1\"] = \"TVInputComposite1\";\n /** Switches to the input \"Composite 2.\" */\n Key[\"TVInputComposite2\"] = \"TVInputComposite2\";\n /** Switches to the input \"HDMI 1.\" */\n Key[\"TVInputHDMI1\"] = \"TVInputHDMI1\";\n /** Switches to the input \"HDMI 2.\" */\n Key[\"TVInputHDMI2\"] = \"TVInputHDMI2\";\n /** Switches to the input \"HDMI 3.\" */\n Key[\"TVInputHDMI3\"] = \"TVInputHDMI3\";\n /** Switches to the input \"HDMI 4.\" */\n Key[\"TVInputHDMI4\"] = \"TVInputHDMI4\";\n /** Switches to the input \"VGA 1.\" */\n Key[\"TVInputVGA1\"] = \"TVInputVGA1\";\n /** The Media Context menu key. */\n Key[\"TVMediaContext\"] = \"TVMediaContext\";\n /** Toggle the TV's network connection on and off. */\n Key[\"TVNetwork\"] = \"TVNetwork\";\n /** Put the TV into number entry mode. */\n Key[\"TVNumberEntry\"] = \"TVNumberEntry\";\n /** The device's power button. */\n Key[\"TVPower\"] = \"TVPower\";\n /** Radio button. */\n Key[\"TVRadioService\"] = \"TVRadioService\";\n /** Satellite button. */\n Key[\"TVSatellite\"] = \"TVSatellite\";\n /** Broadcast Satellite button. */\n Key[\"TVSatelliteBS\"] = \"TVSatelliteBS\";\n /** Communication Satellite button. */\n Key[\"TVSatelliteCS\"] = \"TVSatelliteCS\";\n /** Toggles among available satellites. */\n Key[\"TVSatelliteToggle\"] = \"TVSatelliteToggle\";\n /**\n * Selects analog terrestrial television service (analog cable or antenna\n * reception).\n */\n Key[\"TVTerrestrialAnalog\"] = \"TVTerrestrialAnalog\";\n /**\n * Selects digital terrestrial television service (digital cable or antenna\n * reception).\n */\n Key[\"TVTerrestrialDigital\"] = \"TVTerrestrialDigital\";\n /** Timer programming button. */\n Key[\"TVTimer\"] = \"TVTimer\";\n /** Changes the input mode on an external audio/video receiver (AVR) unit. */\n Key[\"AVRInput\"] = \"AVRInput\";\n /** Toggles the power on an external AVR unit. */\n Key[\"AVRPower\"] = \"AVRPower\";\n /**\n * General-purpose media function key, color-coded red. This has index\n * 0 among the colored keys.\n */\n Key[\"ColorF0Red\"] = \"ColorF0Red\";\n /**\n * General-purpose media function key, color-coded green. This has index\n * 1 among the colored keys.\n */\n Key[\"ColorF1Green\"] = \"ColorF1Green\";\n /**\n * General-purpose media function key, color-coded yellow. This has index\n * 2 among the colored keys.\n */\n Key[\"ColorF2Yellow\"] = \"ColorF2Yellow\";\n /**\n * General-purpose media function key, color-coded blue. This has index\n * 3 among the colored keys.\n */\n Key[\"ColorF3Blue\"] = \"ColorF3Blue\";\n /**\n * General-purpose media function key, color-coded grey. This has index\n * 4 among the colored keys.\n */\n Key[\"ColorF4Grey\"] = \"ColorF4Grey\";\n /**\n * General-purpose media function key, color-coded brown. This has index\n * 5 among the colored keys.\n */\n Key[\"ColorF5Brown\"] = \"ColorF5Brown\";\n /** Toggles closed captioning on and off. */\n Key[\"ClosedCaptionToggle\"] = \"ClosedCaptionToggle\";\n /**\n * Adjusts the brightness of the device by toggling between two brightness\n * levels or by cycling among multiple brightness levels.\n */\n Key[\"Dimmer\"] = \"Dimmer\";\n /** Cycles among video sources. */\n Key[\"DisplaySwap\"] = \"DisplaySwap\";\n /** Switches the input source to the Digital Video Recorder (DVR). */\n Key[\"DVR\"] = \"DVR\";\n /** The Exit button, which exits the current application or menu. */\n Key[\"Exit\"] = \"Exit\";\n /** Clears the program or content stored in the first favorites list slot. */\n Key[\"FavoriteClear0\"] = \"FavoriteClear0\";\n /** Clears the program or content stored in the second favorites list slot. */\n Key[\"FavoriteClear1\"] = \"FavoriteClear1\";\n /** Clears the program or content stored in the third favorites list slot. */\n Key[\"FavoriteClear2\"] = \"FavoriteClear2\";\n /** Clears the program or content stored in the fourth favorites list slot. */\n Key[\"FavoriteClear3\"] = \"FavoriteClear3\";\n /**\n * Selects (recalls) the program or content stored in the first favorites\n * list slot.\n */\n Key[\"FavoriteRecall0\"] = \"FavoriteRecall0\";\n /**\n * Selects (recalls) the program or content stored in the second favorites\n * list slot.\n */\n Key[\"FavoriteRecall1\"] = \"FavoriteRecall1\";\n /**\n * Selects (recalls) the program or content stored in the third favorites\n * list slot.\n */\n Key[\"FavoriteRecall2\"] = \"FavoriteRecall2\";\n /**\n * Selects (recalls) the program or content stored in the fourth favorites\n * list slot.\n */\n Key[\"FavoriteRecall3\"] = \"FavoriteRecall3\";\n /**\n * Stores the current program or content into the first favorites list\n * slot.\n */\n Key[\"FavoriteStore0\"] = \"FavoriteStore0\";\n /**\n * Stores the current program or content into the second favorites list\n * slot.\n */\n Key[\"FavoriteStore1\"] = \"FavoriteStore1\";\n /**\n * Stores the current program or content into the third favorites list\n * slot.\n */\n Key[\"FavoriteStore2\"] = \"FavoriteStore2\";\n /**\n * Stores the current program or content into the fourth favorites list\n * slot.\n */\n Key[\"FavoriteStore3\"] = \"FavoriteStore3\";\n /** Toggles the display of the program or content guide. */\n Key[\"Guide\"] = \"Guide\";\n /**\n * If the guide is currently displayed, this button tells the guide to\n * display the next day's content.\n */\n Key[\"GuideNextDay\"] = \"GuideNextDay\";\n /**\n * If the guide is currently displayed, this button tells the guide to\n * display the previous day's content.\n */\n Key[\"GuidePreviousDay\"] = \"GuidePreviousDay\";\n /**\n * Toggles the display of information about the currently selected content,\n * program, or media.\n */\n Key[\"Info\"] = \"Info\";\n /**\n * Tells the device to perform an instant replay (typically some form of\n * jumping back a short amount of time then playing it again, possibly but\n * not usually in slow motion).\n */\n Key[\"InstantReplay\"] = \"InstantReplay\";\n /** Opens content linked to the current program, if available and possible. */\n Key[\"Link\"] = \"Link\";\n /** Lists the current program. */\n Key[\"ListProgram\"] = \"ListProgram\";\n /** Toggles a display listing currently available live content or programs. */\n Key[\"LiveContent\"] = \"LiveContent\";\n /** Locks or unlocks the currently selected content or pgoram. */\n Key[\"Lock\"] = \"Lock\";\n /**\n * Presents a list of media applications, such as photo viewers, audio and\n * video players, and games. [1]\n */\n Key[\"MediaApps\"] = \"MediaApps\";\n /** The Audio Track key. */\n Key[\"MediaAudioTrack\"] = \"MediaAudioTrack\";\n /** Jumps back to the last-viewed content, program, or other media. */\n Key[\"MediaLast\"] = \"MediaLast\";\n /** Skips backward to the previous content or program. */\n Key[\"MediaSkipBackward\"] = \"MediaSkipBackward\";\n /** Skips forward to the next content or program. */\n Key[\"MediaSkipForward\"] = \"MediaSkipForward\";\n /** Steps backward to the previous content or program. */\n Key[\"MediaStepBackward\"] = \"MediaStepBackward\";\n /** Steps forward to the next content or program. */\n Key[\"MediaStepForward\"] = \"MediaStepForward\";\n /**\n * Top Menu button. Opens the media's main menu (e.g., for a DVD or Blu-Ray\n * disc).\n */\n Key[\"MediaTopMenu\"] = \"MediaTopMenu\";\n /** Navigates into a submenu or option. */\n Key[\"NavigateIn\"] = \"NavigateIn\";\n /** Navigates to the next item. */\n Key[\"NavigateNext\"] = \"NavigateNext\";\n /** Navigates out of the current screen or menu. */\n Key[\"NavigateOut\"] = \"NavigateOut\";\n /** Navigates to the previous item. */\n Key[\"NavigatePrevious\"] = \"NavigatePrevious\";\n /** Cycles to the next channel in the favorites list. */\n Key[\"NextFavoriteChannel\"] = \"NextFavoriteChannel\";\n /**\n * Cycles to the next saved user profile, if this feature is supported and\n * multiple profiles exist.\n */\n Key[\"NextUserProfile\"] = \"NextUserProfile\";\n /**\n * Opens the user interface for selecting on demand content or programs to\n * watch.\n */\n Key[\"OnDemand\"] = \"OnDemand\";\n /** Starts the process of pairing the remote with a device to be controlled. */\n Key[\"Pairing\"] = \"Pairing\";\n /** A button to move the picture-in-picture view downward. */\n Key[\"PinPDown\"] = \"PinPDown\";\n /** A button to control moving the picture-in-picture view. */\n Key[\"PinPMove\"] = \"PinPMove\";\n /** Toggles display of the picture-in-picture view on and off. */\n Key[\"PinPToggle\"] = \"PinPToggle\";\n /** A button to move the picture-in-picture view upward. */\n Key[\"PinPUp\"] = \"PinPUp\";\n /** Decreases the media playback rate. */\n Key[\"PlaySpeedDown\"] = \"PlaySpeedDown\";\n /** Returns the media playback rate to normal. */\n Key[\"PlaySpeedReset\"] = \"PlaySpeedReset\";\n /** Increases the media playback rate. */\n Key[\"PlaySpeedUp\"] = \"PlaySpeedUp\";\n /** Toggles random media (also known as \"shuffle mode\") on and off. */\n Key[\"RandomToggle\"] = \"RandomToggle\";\n /**\n * A code sent when the remote control's battery is low. This doesn't\n * actually correspond to a physical key at all.\n */\n Key[\"RcLowBattery\"] = \"RcLowBattery\";\n /** Cycles among the available media recording speeds. */\n Key[\"RecordSpeedNext\"] = \"RecordSpeedNext\";\n /**\n * Toggles radio frequency (RF) input bypass mode on and off. RF bypass\n * mode passes RF input directly to the RF output without any processing or\n * filtering.\n */\n Key[\"RfBypass\"] = \"RfBypass\";\n /**\n * Toggles the channel scan mode on and off. This is a mode which flips\n * through channels automatically until the user stops the scan.\n */\n Key[\"ScanChannelsToggle\"] = \"ScanChannelsToggle\";\n /** Cycles through the available screen display modes. */\n Key[\"ScreenModeNext\"] = \"ScreenModeNext\";\n /** Toggles display of the device's settings screen on and off. */\n Key[\"Settings\"] = \"Settings\";\n /** Toggles split screen display mode on and off. */\n Key[\"SplitScreenToggle\"] = \"SplitScreenToggle\";\n /** Cycles among input modes on an external set-top box (STB). */\n Key[\"STBInput\"] = \"STBInput\";\n /** Toggles on and off an external STB. */\n Key[\"STBPower\"] = \"STBPower\";\n /** Toggles the display of subtitles on and off if they're available. */\n Key[\"Subtitle\"] = \"Subtitle\";\n /**\n * Toggles display of [teletext](https://en.wikipedia.org/wiki/Teletext),\n * if available.\n */\n Key[\"Teletext\"] = \"Teletext\";\n /** Cycles through the available video modes. */\n Key[\"VideoModeNext\"] = \"VideoModeNext\";\n /**\n * Causes the device to identify itself in some fashion, such as by\n * flashing a light, briefly changing the brightness of indicator lights,\n * or emitting a tone.\n */\n Key[\"Wink\"] = \"Wink\";\n /**\n * Toggles between fullscreen and scaled content display, or otherwise\n * change the magnification level.\n */\n Key[\"ZoomToggle\"] = \"ZoomToggle\";\n /**\n * Presents a list of possible corrections for a word which was incorrectly\n * identified.\n */\n Key[\"SpeechCorrectionList\"] = \"SpeechCorrectionList\";\n /**\n * Toggles between dictation mode and command/control mode. This lets the\n * speech engine know whether to interpret spoken words as input text or as\n * commands.\n */\n Key[\"SpeechInputToggle\"] = \"SpeechInputToggle\";\n /** Closes the current document or message. Must not exit the application. */\n Key[\"Close\"] = \"Close\";\n /** Creates a new document or message. */\n Key[\"New\"] = \"New\";\n /** Opens an existing document or message. */\n Key[\"Open\"] = \"Open\";\n /** Prints the current document or message. */\n Key[\"Print\"] = \"Print\";\n /** Saves the current document or message. */\n Key[\"Save\"] = \"Save\";\n /** Starts spell checking the current document. */\n Key[\"SpellCheck\"] = \"SpellCheck\";\n /** Opens the user interface to forward a message. */\n Key[\"MailForward\"] = \"MailForward\";\n /** Opens the user interface to reply to a message. */\n Key[\"MailReply\"] = \"MailReply\";\n /** Sends the current message. */\n Key[\"MailSend\"] = \"MailSend\";\n /**\n * The Calculator key, often labeled with an icon. This is often\n * used as a generic application launcher key\n * (APPCOMMAND_LAUNCH_APP2).\n */\n Key[\"LaunchCalculator\"] = \"LaunchCalculator\";\n /** The Calendar key. Often labeled with an icon. */\n Key[\"LaunchCalendar\"] = \"LaunchCalendar\";\n /** The Contacts key. */\n Key[\"LaunchContacts\"] = \"LaunchContacts\";\n /** The Mail key. Often labeled with an icon. */\n Key[\"LaunchMail\"] = \"LaunchMail\";\n /** The Media Player key. */\n Key[\"LaunchMediaPlayer\"] = \"LaunchMediaPlayer\";\n /** The Music Player key. Often labeled with an icon. */\n Key[\"LaunchMusicPlayer\"] = \"LaunchMusicPlayer\";\n /**\n * The My Computer key on Windows keyboards. This is often used\n * as a generic application launcher key\n * (APPCOMMAND_LAUNCH_APP1).\n */\n Key[\"LaunchMyComputer\"] = \"LaunchMyComputer\";\n /**\n * The Phone key. Opens the phone dialer application (if one is\n * present).\n */\n Key[\"LaunchPhone\"] = \"LaunchPhone\";\n /** The Screen Saver key. */\n Key[\"LaunchScreenSaver\"] = \"LaunchScreenSaver\";\n /** The Spreadsheet key. This key may be labeled with an icon. */\n Key[\"LaunchSpreadsheet\"] = \"LaunchSpreadsheet\";\n /**\n * The Web Browser key. This key is frequently labeled with an\n * icon.\n */\n Key[\"LaunchWebBrowser\"] = \"LaunchWebBrowser\";\n /** The WebCam key. Opens the webcam application. */\n Key[\"LaunchWebCam\"] = \"LaunchWebCam\";\n /**\n * The Word Processor key. This may be an icon of a specific\n * word processor application, or a generic document icon.\n */\n Key[\"LaunchWordProcessor\"] = \"LaunchWordProcessor\";\n /** The first generic application launcher button. */\n Key[\"LaunchApplication1\"] = \"LaunchApplication1\";\n /** The second generic application launcher button. */\n Key[\"LaunchApplication2\"] = \"LaunchApplication2\";\n /** The third generic application launcher button. */\n Key[\"LaunchApplication3\"] = \"LaunchApplication3\";\n /** The fourth generic application launcher button. */\n Key[\"LaunchApplication4\"] = \"LaunchApplication4\";\n /** The fifth generic application launcher button. */\n Key[\"LaunchApplication5\"] = \"LaunchApplication5\";\n /** The sixth generic application launcher button. */\n Key[\"LaunchApplication6\"] = \"LaunchApplication6\";\n /** The seventh generic application launcher button. */\n Key[\"LaunchApplication7\"] = \"LaunchApplication7\";\n /** The eighth generic application launcher button. */\n Key[\"LaunchApplication8\"] = \"LaunchApplication8\";\n /** The ninth generic application launcher button. */\n Key[\"LaunchApplication9\"] = \"LaunchApplication9\";\n /** The 10th generic application launcher button. */\n Key[\"LaunchApplication10\"] = \"LaunchApplication10\";\n /** The 11th generic application launcher button. */\n Key[\"LaunchApplication11\"] = \"LaunchApplication11\";\n /** The 12th generic application launcher button. */\n Key[\"LaunchApplication12\"] = \"LaunchApplication12\";\n /** The 13th generic application launcher button. */\n Key[\"LaunchApplication13\"] = \"LaunchApplication13\";\n /** The 14th generic application launcher button. */\n Key[\"LaunchApplication14\"] = \"LaunchApplication14\";\n /** The 15th generic application launcher button. */\n Key[\"LaunchApplication15\"] = \"LaunchApplication15\";\n /** The 16th generic application launcher button. */\n Key[\"LaunchApplication16\"] = \"LaunchApplication16\";\n /**\n * Navigates to the previous content or page in the current Web view's\n * history.\n */\n Key[\"BrowserBack\"] = \"BrowserBack\";\n /** Opens the user's list of bookmarks/favorites. */\n Key[\"BrowserFavorites\"] = \"BrowserFavorites\";\n /** Navigates to the next content or page in the current Web view's history. */\n Key[\"BrowserForward\"] = \"BrowserForward\";\n /** Navigates to the user's preferred home page. */\n Key[\"BrowserHome\"] = \"BrowserHome\";\n /** Refreshes the current page or content. */\n Key[\"BrowserRefresh\"] = \"BrowserRefresh\";\n /**\n * Activates the user's preferred search engine or the search interface\n * within their browser.\n */\n Key[\"BrowserSearch\"] = \"BrowserSearch\";\n /** Stops loading the currently displayed Web view or content. */\n Key[\"BrowserStop\"] = \"BrowserStop\";\n /**\n * The decimal point key (typically . or\n * , depending on the region).\n * In newer browsers, this value to be the character generated by the\n * decimal key (one of those two characters). [1]\n */\n Key[\"Decimal\"] = \"Decimal\";\n /** The 11 key found on certain media numeric keypads. */\n Key[\"Key11\"] = \"Key11\";\n /** The 12 key found on certain media numeric keypads. */\n Key[\"Key12\"] = \"Key12\";\n /** The numeric keypad's multiplication key, *. */\n Key[\"Multiply\"] = \"Multiply\";\n /** The numeric keypad's addition key, +. */\n Key[\"Add\"] = \"Add\";\n /** The numeric keypad's division key, /. */\n Key[\"Divide\"] = \"Divide\";\n /** The numeric keypad's subtraction key, -. */\n Key[\"Subtract\"] = \"Subtract\";\n /**\n * The numeric keypad's places separator character.\n * (In the United States this is a comma, but elsewhere it is frequently\n * a period.)\n */\n Key[\"Separator\"] = \"Separator\";\n})(Key = exports.Key || (exports.Key = {}));\n","import { Filter, Origin, type Selection, type User } from '@annotorious/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport hotkeys from 'hotkeys-js';\nimport { Key } from 'ts-key-enum';\nimport type { TextAnnotatorState } from './state';\nimport type { TextAnnotationTarget } from './model';\nimport {\n clonePointerEvent,\n cloneKeyboardEvent,\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 annotatingEnabled: boolean,\n offsetReferenceSelector?: string\n) => {\n\n let currentUser: User | undefined;\n\n const setUser = (user?: User) => currentUser = user;\n\n let currentFilter: Filter | undefined;\n\n const setFilter = (filter?: Filter) => currentFilter = filter;\n\n const { store, selection } = state;\n\n let currentTarget: TextAnnotationTarget | undefined;\n\n let isLeftClick: boolean | undefined;\n\n let lastDownEvent: Selection['event'] | undefined;\n\n const onSelectStart = (evt: Event) => {\n if (isLeftClick === false)\n return;\n\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 */\n const annotatable = !(evt.target as Node).parentElement?.closest(NOT_ANNOTATABLE_SELECTOR);\n\n currentTarget = annotatable ? {\n annotation: uuidv4(),\n selector: [],\n creator: currentUser,\n created: new Date()\n } : undefined;\n }\n\n if (annotatingEnabled)\n container.addEventListener('selectstart', onSelectStart);\n\n const onSelectionChange = debounce((evt: Event) => {\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 - (lastDownEvent?.timeStamp || evt.timeStamp) < 1000 && !currentTarget) {\n onSelectStart(lastDownEvent || evt);\n }\n\n if (sel.isCollapsed || !currentTarget || isLeftClick === false)\n return;\n\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 }, Origin.LOCAL);\n\n // ...then make the new annotation the current selection\n selection.userSelect(currentTarget.annotation, lastDownEvent);\n }\n })\n\n if (annotatingEnabled)\n document.addEventListener('selectionchange', onSelectionChange);\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 */\n const onPointerDown = (evt: PointerEvent) => {\n /**\n * Cloning the event to prevent it from accidentally being `undefined`\n * @see https://github.com/recogito/text-annotator-js/commit/65d13f3108c429311cf8c2523f6babbbc946013d#r144033948\n */\n lastDownEvent = clonePointerEvent(evt);\n isLeftClick = lastDownEvent.button === 0;\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\n const userSelect = () => {\n const { x, y } = container.getBoundingClientRect();\n\n const hovered = store.getAt(evt.clientX - x, evt.clientY - y, currentFilter);\n if (hovered) {\n const { selected } = selection;\n\n if (selected.length !== 1 || selected[0].id !== hovered.id)\n selection.userSelect(hovered.id, evt);\n } else if (!selection.isEmpty()) {\n selection.clear();\n }\n }\n\n const timeDifference = evt.timeStamp - lastDownEvent.timeStamp;\n\n // Just a click, not a selection\n if (document.getSelection().isCollapsed && timeDifference < 300) {\n currentTarget = undefined;\n userSelect();\n } else if (currentTarget) {\n selection.userSelect(currentTarget.annotation, evt);\n }\n }\n document.addEventListener('pointerup', onPointerUp);\n\n /**\n * Track arbitrary keydown events to use them during\n * the `selectionchange` annotation selection.\n */\n hotkeys('*', { element: container, keyup: false, keydown: true }, (evt, handler) => {\n if (!evt.repeat) {\n lastDownEvent = cloneKeyboardEvent(evt);\n }\n });\n\n /**\n * Track the \"Shift\" key lift which signifies the end of a select operation.\n * Unfortunately, we cannot track modifier key immediately, so the wildcard is used.\n */\n hotkeys('*', { keyup: true, keydown: false }, (evt) => {\n if (hotkeys.shift && evt.key === Key.Shift) {\n if (!evt.repeat && currentTarget) {\n selection.userSelect(currentTarget.annotation, evt);\n }\n }\n });\n\n /**\n * Track the \"select all\" command on lifting the keys.\n * Unfortunately, system-related shortcuts can be captured\n * only on `keydown` event, so an additional flag is used.\n */\n let selectAllCaptured = false;\n hotkeys('ctrl+a, ⌘+a', { keyup: false, keydown: true }, () => {\n selectAllCaptured = true;\n });\n hotkeys('*', { keyup: true, keydown: false }, (evt) => {\n if (selectAllCaptured) {\n if (!evt.repeat && currentTarget) {\n selection.userSelect(currentTarget.annotation, evt);\n }\n }\n selectAllCaptured = false;\n });\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 hotkeys.unbind();\n }\n\n return {\n destroy,\n setFilter,\n setUser\n }\n\n}\n\n","import {\n createAnonymousGuest,\n createLifecycleObserver,\n createBaseAnnotator,\n Filter,\n createUndoStack\n} from '@annotorious/core';\nimport type { Annotator, User, PresenceProvider } from '@annotorious/core';\nimport {\n createCanvasRenderer,\n createHighlightsRenderer,\n createSpansRenderer,\n type HighlightStyleExpression\n} from './highlight';\nimport { createPresencePainter } from './presence';\nimport { scrollIntoView } from './api';\nimport { TextAnnotationStore, TextAnnotatorState, createTextAnnotatorState } from './state';\nimport type { TextAnnotation } from './model';\nimport { cancelSingleClickEvents, programmaticallyFocusable } 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 redraw(force?: boolean): 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 // Make sure that the container is focusable and can receive both pointer and keyboard events\n programmaticallyFocusable(container);\n\n const opts = fillDefaults<E>(options, {\n annotatingEnabled: true,\n user: createAnonymousGuest()\n });\n\n const state: TextAnnotatorState = createTextAnnotatorState(container, opts.userAction);\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 = opts.user;\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.annotatingEnabled, 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 selectionHandler.setFilter(filter);\n };\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 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: highlightRenderer.setStyle.bind(highlightRenderer),\n redraw: highlightRenderer.redraw.bind(highlightRenderer),\n setUser,\n setSelected,\n setPresenceProvider,\n setVisible: highlightRenderer.setVisible.bind(highlightRenderer),\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","programmaticallyFocusable","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","toDomRectList","i","rangeToSelector","quote","start","end","reviveSelector","iterator","runningOffset","startCounting","len","reviveTarget","target","reviveAnnotation","annotation","normalizeRectWithOffset","rect","offset","denormalizeRectWithOffset","clonePointerEvent","cloneKeyboardEvent","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","h","offsetRects","underlineOffset","createCanvasRenderer","t","e","u","o","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","all","intersects","getLength","total","intersecting","highlightLayer","shouldRedraw","span","createSpansRenderer","byteToHex","unsafeStringify","arr","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","B","z","k","Y","Ce","F","V","Ue","U","P","L","O","E","_","J","Q","X","Z","W","K","Se","ee","te","ne","oe","q","S","ie","de","re","Oe","C","T","I","A","R","G","ae","De","Re","Be","ce","Ie","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","allRects","getAt","hits","getAnnotationBounds","getAnnotationRects","indexed","annotationIds","createTextAnnotatorState","defaultUserAction","createStore","createSelectionState","createHoverState","createViewportState","addAnnotation","origin","Origin","revived","isValid","bulkAddAnnotation","couldNotRevive","bulkUpsertAnnotations","updateTarget","bulkUpdateTargets","filtered","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","isff","addEvent","object","method","useCapture","removeEvent","getMods","modifier","key","mods","getKeys","keys","compareArray","a1","a2","arr1","arr2","isIndex","_keyMap","_modifier","modifierMap","_mods","_handlers","_downKeys","winListendFocus","_scope","elementEventMap","code","getKey","getModifier","setScope","scope","getScope","getPressedKeyCodes","getPressedKeyString","getAllKeyCodes","_ref","shortcut","tagName","flag","isInput","isPressed","keyCode","deleteScope","newScope","handlers","_ref2","element","removeKeyEvent","clearModifier","hotkeys","unbind","keysInfo","info","eachUnbind","_len","_key","_ref3","splitKey","originKey","unbindKeys","lastKey","unbindElements","isUnbind","eventHandler","handler","modifiersMatch","dispatch","asterisk","keyName","keyNum","handlerKey","keyLen","keyShortcut","_downKeysCurrent","option","keyup","keydown","capture","single","keydownListener","keyupListenr","listener","trigger","values","_ref4","_api","_hotkeys","deep","exports","Key","SelectionHandler","annotatingEnabled","currentUser","setUser","currentTarget","isLeftClick","lastDownEvent","onSelectStart","evt","onSelectionChange","sel","selectionRange","onPointerDown","onPointerUp","userSelect","timeDifference","selectAllCaptured","USE_DEFAULT_RENDERER","createTextAnnotator","createAnonymousGuest","undoStack","createUndoStack","lifecycle","createLifecycleObserver","useRenderer","highlightRenderer","selectionHandler","createBaseAnnotator","getUser","setPresenceProvider","setSelected","arg"],"mappings":"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","x_google_ignoreList":[21,23,25,26,27,28,29,31,32,38,39]}
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/programmaticallyFocusable.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/utils/normalizeRects.ts","../src/utils/cloneEvents.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","../../../node_modules/nanoevents/index.js","../src/state/spatialTree.ts","../src/state/TextAnnotatorState.ts","../src/presence/PresencePainter.ts","../src/api/scrollIntoView.ts","../src/TextAnnotatorOptions.ts","../../../node_modules/hotkeys-js/dist/hotkeys.esm.js","../../../node_modules/ts-key-enum/dist/js/Key.enum.js","../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}\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","/**\n * Makes an element programmatically focusable by adding a `tabindex=\"-1\"` attribute.\n * Or does nothing if the element is already focusable 🤷🏻\n * It's required to process keyboard events on an element that is not natively focusable.\n */\nexport const programmaticallyFocusable = (container: HTMLElement) => {\n if (!container.hasAttribute('tabindex') && container.tabIndex < 0) {\n container.setAttribute('tabindex', '-1');\n }\n\n container.classList.add('no-focus-outline');\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<DOMRect[]>((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}, []);\n\nexport const toDomRectList = (rects: DOMRect[]): DOMRectList => ({\n length: rects.length,\n item: (index) => rects[index],\n [Symbol.iterator]: function* (): IterableIterator<DOMRect> {\n for (let i = 0; i < this.length; i++)\n yield this.item(i)!;\n }\n})\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) });","export const normalizeRectWithOffset = (rect: DOMRect, offset: DOMRect): DOMRect => {\n const { left, top, right, bottom } = rect;\n return new DOMRect(left - offset.left, top - offset.top, right - left, bottom - top);\n};\n\nexport const denormalizeRectWithOffset = (rect: DOMRect, offset: DOMRect): DOMRect => {\n const { left, top, right, bottom } = rect;\n return new DOMRect(left + offset.left, top + offset.top, right - left, bottom - top);\n}\n","/**\n * Events need to be manually mapped into new objects:\n * 1. It preserves the `target` and `currentTarget` properties.\n * Otherwise, they will be `null` when the event is read beyond the handler.\n * 2. Spread operator can copy only own enumerable properties, not inherited ones.\n * Therefore, we need to manually copy the props we're interested in.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget\n * @see https://github.com/recogito/text-annotator-js/commit/65d13f3108c429311cf8c2523f6babbbc946013d#r144041390\n */\n\nexport const clonePointerEvent = (event: PointerEvent): PointerEvent => ({\n ...event,\n type: event.type,\n x: event.x,\n y: event.y,\n clientX: event.clientX,\n clientY: event.clientY,\n offsetX: event.offsetX,\n offsetY: event.offsetY,\n screenX: event.screenX,\n screenY: event.screenY,\n isPrimary: event.isPrimary,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n button: event.button,\n buttons: event.buttons,\n currentTarget: event.currentTarget,\n target: event.target,\n defaultPrevented: event.defaultPrevented,\n detail: event.detail,\n eventPhase: event.eventPhase,\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n timeStamp: event.timeStamp\n})\n\nexport const cloneKeyboardEvent = (event: KeyboardEvent): KeyboardEvent => ({\n ...event,\n type: event.type,\n key: event.key,\n code: event.code,\n location: event.location,\n repeat: event.repeat,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n currentTarget: event.currentTarget,\n target: event.target,\n defaultPrevented: event.defaultPrevented,\n detail: event.detail,\n timeStamp: event.timeStamp\n})\n","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, currentFilter);\n if (hit) {\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 { ViewportState } from '@annotorious/core';\nimport type { TextAnnotatorState } from '../../state';\nimport { debounce } from '../../utils';\nimport type { ViewportBounds } from '../viewport';\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';\n\nimport './canvasRenderer.css';\n\nconst createCanvas = () => {\n const canvas = document.createElement('canvas');\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n canvas.className = 'r6o-canvas-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 document.body.appendChild(canvas);\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 offsetRects.forEach(({ x, y, width, height }) =>\n ctx.fillRect(x, y, width, height)\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 = 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 canvas.remove();\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());\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","import type { ViewportState } from '@annotorious/core';\nimport { colord } from 'colord';\nimport { dequal } from 'dequal/lite';\nimport type { Rect, TextAnnotatorState } from '../../state';\nimport { type HighlightPainter, paint } 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: Highlight[]): 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 const getLength = (h: Highlight) => \n h.rects.reduce((total, rect) => total + rect.width, 0);\n\n // Any highlights that intersect this rect, sorted by total length\n const intersecting = all.filter(({ rects }) => rects.some(r => intersects(rect, r)));\n intersecting.sort((a, b) => getLength(b) - getLength(a));\n\n return intersecting.findIndex(h => h.rects.includes(rect));\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 highlights.forEach(highlight => {\n highlight.rects.map(rect => {\n const zIndex = computeZIndex(rect, highlights);\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 span.style.backgroundColor = colord(style?.fill || DEFAULT_STYLE.fill)\n .alpha(style?.fillOpacity === undefined ? DEFAULT_STYLE.fillOpacity : style.fillOpacity)\n .toHex();\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 d(b) {\n if (H(e, b) && (e = b, t)) {\n const y = !k.length;\n for (const p of o)\n p[1](), k.push(p, e);\n if (y) {\n for (let p = 0; p < k.length; p += 2)\n k[p][0](k[p + 1]);\n k.length = 0;\n }\n }\n }\n function f(b) {\n d(b(e));\n }\n function w(b, y = z) {\n const p = [b, y];\n return o.add(p), o.size === 1 && (t = n(d, f) || z), b(e), () => {\n o.delete(p), o.size === 0 && t && (t(), t = null);\n };\n }\n return { set: d, update: f, subscribe: w };\n}\nconst Ce = (e) => {\n const { subscribe: n, set: t } = Y();\n let o;\n return n((d) => o = d), e.observe(({ changes: d }) => {\n if (o) {\n (d.deleted || []).some((b) => b.id === o) && t(void 0);\n const w = (d.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: [] }, Ue = (e, n = \"EDIT\") => {\n const { subscribe: t, set: o } = Y(V);\n let d = n, f = V;\n t((m) => f = m);\n const w = () => o(V), b = () => {\n var m;\n return ((m = f.selected) == null ? void 0 : m.length) === 0;\n }, y = (m) => {\n if (b())\n return !1;\n const v = typeof m == \"string\" ? m : m.id;\n return f.selected.some((U) => U.id === v);\n }, p = (m, v) => {\n const U = e.getAnnotation(m);\n if (!U) {\n console.warn(\"Invalid selection: \" + m);\n return;\n }\n switch (P(U, d)) {\n case \"EDIT\":\n o({ selected: [{ id: m, editable: !0 }], event: v });\n break;\n case \"SELECT\":\n o({ selected: [{ id: m }], event: v });\n break;\n default:\n o({ selected: [], event: v });\n }\n }, L = (m, v) => {\n const U = Array.isArray(m) ? m : [m], O = U.map((r) => e.getAnnotation(r)).filter((r) => !!r);\n o({\n selected: O.map((r) => {\n const u = v === void 0 ? P(r, d) === \"EDIT\" : v;\n return { id: r.id, editable: u };\n })\n }), O.length !== U.length && console.warn(\"Invalid selection\", m);\n }, a = (m) => {\n if (b())\n return !1;\n const { selected: v } = f;\n v.some(({ id: O }) => m.includes(O)) && o({ selected: v.filter(({ id: O }) => !m.includes(O)) });\n }, E = (m) => d = m;\n return e.observe(\n ({ changes: m }) => a((m.deleted || []).map((v) => v.id))\n ), {\n get event() {\n return f ? f.event : null;\n },\n get selected() {\n return f ? [...f.selected] : null;\n },\n clear: w,\n isEmpty: b,\n isSelected: y,\n setSelected: L,\n setUserSelectAction: E,\n subscribe: t,\n userSelect: p\n };\n}, P = (e, n) => typeof n == \"function\" ? n(e) : 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 Le = (e) => {\n const { creator: n, updatedBy: t } = e.target, o = e.bodies.reduce((d, f) => [...d, f.creator, f.updatedBy].filter(Boolean), []);\n return [\n n,\n t,\n ...o\n ].filter((d) => d);\n}, Se = (e, n, t, o) => ({\n id: K(),\n annotation: typeof e == \"string\" ? e : 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((d) => d.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), d = 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: d.length > 0 ? d : 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 || {}), S = /* @__PURE__ */ ((e) => (e.LOCAL = \"LOCAL\", e.REMOTE = \"REMOTE\", e))(S || {});\nconst ie = (e, n) => {\n var f, 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 = (L) => L && L.length > 0;\n if (!(y(t.created) || y(t.deleted))) {\n const L = (f = t.updated) == null ? void 0 : f.some((E) => y(E.bodiesCreated) || y(E.bodiesDeleted) || y(E.bodiesUpdated)), a = (w = t.updated) == null ? void 0 : w.some((E) => E.targetUpdated);\n if (b === \"BODY_ONLY\" && L && !a || b === \"TARGET_ONLY\" && a && !L)\n return !1;\n }\n }\n if (e.options.annotations) {\n const b = /* @__PURE__ */ new Set([\n ...(t.created || []).map((p) => p.id),\n ...(t.deleted || []).map((p) => p.id),\n ...(t.updated || []).map(({ oldValue: p }) => p.id)\n ]);\n return !!(Array.isArray(e.options.annotations) ? e.options.annotations : [e.options.annotations]).find((p) => b.has(p));\n } else\n return !0;\n}, de = (e, n) => {\n const t = new Set((e.created || []).map((a) => a.id)), o = new Set((e.updated || []).map(({ newValue: a }) => a.id)), d = new Set((n.created || []).map((a) => a.id)), f = new Set((n.deleted || []).map((a) => a.id)), w = new Set((n.updated || []).map(({ oldValue: a }) => a.id)), b = new Set((n.updated || []).filter(({ oldValue: a }) => t.has(a.id) || o.has(a.id)).map(({ oldValue: a }) => a.id)), y = [\n ...(e.created || []).filter((a) => !f.has(a.id)).map((a) => w.has(a.id) ? n.updated.find(({ oldValue: E }) => E.id === a.id).newValue : a),\n ...n.created || []\n ], p = [\n ...(e.deleted || []).filter((a) => !d.has(a.id)),\n ...(n.deleted || []).filter((a) => !t.has(a.id))\n ], L = [\n ...(e.updated || []).filter(({ newValue: a }) => !f.has(a.id)).map((a) => {\n const { oldValue: E, newValue: m } = a;\n if (w.has(m.id)) {\n const v = n.updated.find((U) => U.oldValue.id === m.id).newValue;\n return q(E, v);\n } else\n return a;\n }),\n ...(n.updated || []).filter(({ oldValue: a }) => !b.has(a.id))\n ];\n return { created: y, deleted: p, updated: L };\n}, re = (e) => e.id !== void 0, Oe = () => {\n const e = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), t = [], o = (i, c = {}) => t.push({ onChange: i, options: c }), d = (i) => {\n const c = t.findIndex((l) => l.onChange == i);\n c > -1 && t.splice(c, 1);\n }, f = (i, c) => {\n const l = {\n origin: i,\n changes: {\n created: c.created || [],\n updated: c.updated || [],\n deleted: c.deleted || []\n },\n state: [...e.values()]\n };\n t.forEach((g) => {\n ie(g, l) && g.onChange(l);\n });\n }, w = (i, c = S.LOCAL) => {\n if (e.get(i.id))\n throw Error(`Cannot add annotation ${i.id} - exists already`);\n e.set(i.id, i), i.bodies.forEach((g) => n.set(g.id, i.id)), f(c, { created: [i] });\n }, b = (i, c) => {\n const l = typeof i == \"string\" ? c : i, g = typeof i == \"string\" ? i : i.id, C = e.get(g);\n if (C) {\n const T = q(C, l);\n return g === l.id ? e.set(g, l) : (e.delete(g), e.set(l.id, l)), C.bodies.forEach((I) => n.delete(I.id)), l.bodies.forEach((I) => n.set(I.id, l.id)), T;\n } else\n console.warn(`Cannot update annotation ${g} - does not exist`);\n }, y = (i, c = S.LOCAL, l = S.LOCAL) => {\n const g = re(c) ? l : c, C = b(i, c);\n C && f(g, { updated: [C] });\n }, p = (i, c = S.LOCAL) => {\n const l = i.reduce((g, C) => {\n const T = b(C);\n return T ? [...g, T] : g;\n }, []);\n l.length > 0 && f(c, { updated: l });\n }, L = (i, c = S.LOCAL) => {\n const l = e.get(i.annotation);\n if (l) {\n const g = {\n ...l,\n bodies: [...l.bodies, i]\n };\n e.set(l.id, g), n.set(i.id, g.id), f(c, { updated: [{\n oldValue: l,\n newValue: g,\n bodiesCreated: [i]\n }] });\n } else\n console.warn(`Attempt to add body to missing annotation: ${i.annotation}`);\n }, a = () => [...e.values()], E = (i = S.LOCAL) => {\n const c = [...e.values()];\n e.clear(), n.clear(), f(i, { deleted: c });\n }, m = (i, c = !0, l = S.LOCAL) => {\n if (c) {\n const g = [...e.values()];\n e.clear(), n.clear(), i.forEach((C) => {\n e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));\n }), f(l, { created: i, deleted: g });\n } else {\n const g = i.reduce((C, T) => {\n const I = e.get(T.id);\n return I ? [...C, I] : C;\n }, []);\n if (g.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${g.map((C) => C.id).join(\", \")}`);\n i.forEach((C) => {\n e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));\n }), f(l, { created: i });\n }\n }, v = (i) => {\n const c = typeof i == \"string\" ? i : i.id, l = e.get(c);\n if (l)\n return e.delete(c), l.bodies.forEach((g) => n.delete(g.id)), l;\n console.warn(`Attempt to delete missing annotation: ${c}`);\n }, U = (i, c = S.LOCAL) => {\n const l = v(i);\n l && f(c, { deleted: [l] });\n }, O = (i, c = S.LOCAL) => {\n const l = i.reduce((g, C) => {\n const T = v(C);\n return T ? [...g, T] : g;\n }, []);\n l.length > 0 && f(c, { deleted: l });\n }, r = (i) => {\n const c = e.get(i.annotation);\n if (c) {\n const l = c.bodies.find((g) => g.id === i.id);\n if (l) {\n n.delete(l.id);\n const g = {\n ...c,\n bodies: c.bodies.filter((T) => T.id !== i.id)\n };\n return e.set(c.id, g), {\n oldValue: c,\n newValue: g,\n bodiesDeleted: [l]\n };\n } else\n console.warn(`Attempt to delete missing body ${i.id} from annotation ${i.annotation}`);\n } else\n console.warn(`Attempt to delete body from missing annotation ${i.annotation}`);\n }, u = (i, c = S.LOCAL) => {\n const l = r(i);\n l && f(c, { updated: [l] });\n }, s = (i, c = S.LOCAL) => {\n const l = i.map((g) => r(g)).filter(Boolean);\n l.length > 0 && f(c, { updated: l });\n }, h = (i) => {\n const c = e.get(i);\n return c ? { ...c } : void 0;\n }, A = (i) => {\n const c = n.get(i);\n if (c) {\n const g = h(c).bodies.find((C) => C.id === i);\n if (g)\n return g;\n console.error(`Store integrity error: body ${i} in index, but not in annotation`);\n } else\n console.warn(`Attempt to retrieve missing body: ${i}`);\n }, R = (i, c) => {\n if (i.annotation !== c.annotation)\n throw \"Annotation integrity violation: annotation ID must be the same when updating bodies\";\n const l = e.get(i.annotation);\n if (l) {\n const g = l.bodies.find((T) => T.id === i.id), C = {\n ...l,\n bodies: l.bodies.map((T) => T.id === g.id ? c : T)\n };\n return e.set(l.id, C), g.id !== c.id && (n.delete(g.id), n.set(c.id, C.id)), {\n oldValue: l,\n newValue: C,\n bodiesUpdated: [{ oldBody: g, newBody: c }]\n };\n } else\n console.warn(`Attempt to add body to missing annotation ${i.annotation}`);\n }, N = (i, c, l = S.LOCAL) => {\n const g = R(i, c);\n g && f(l, { updated: [g] });\n }, x = (i, c = S.LOCAL) => {\n const l = i.map((g) => R({ id: g.id, annotation: g.annotation }, g)).filter(Boolean);\n f(c, { updated: l });\n }, j = (i) => {\n const c = e.get(i.annotation);\n if (c) {\n const l = {\n ...c,\n target: {\n ...c.target,\n ...i\n }\n };\n return e.set(c.id, l), {\n oldValue: c,\n newValue: l,\n targetUpdated: {\n oldTarget: c.target,\n newTarget: i\n }\n };\n } else\n console.warn(`Attempt to update target on missing annotation: ${i.annotation}`);\n };\n return {\n addAnnotation: w,\n addBody: L,\n all: a,\n bulkAddAnnotation: m,\n bulkDeleteAnnotation: O,\n bulkDeleteBodies: s,\n bulkUpdateAnnotation: p,\n bulkUpdateBodies: x,\n bulkUpdateTargets: (i, c = S.LOCAL) => {\n const l = i.map((g) => j(g)).filter(Boolean);\n l.length > 0 && f(c, { updated: l });\n },\n clear: E,\n deleteAnnotation: U,\n deleteBody: u,\n getAnnotation: h,\n getBody: A,\n observe: o,\n unobserve: d,\n updateAnnotation: y,\n updateBody: N,\n updateTarget: (i, c = S.LOCAL) => {\n const l = j(i);\n l && f(c, { updated: [l] });\n }\n };\n}, Te = (e) => ({\n ...e,\n subscribe: (t) => {\n const o = (d) => t(d.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] || [], d = o.length; t < d; 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((d) => n !== d);\n };\n }\n});\nconst ae = 250, De = (e) => {\n const n = G(), t = [];\n let o = -1, d = !1, f = 0;\n const w = (s) => {\n if (!d) {\n const { changes: h } = s, A = performance.now();\n if (A - f > ae)\n t.splice(o + 1), t.push(h), o = t.length - 1;\n else {\n const R = t.length - 1;\n t[R] = de(t[R], h);\n }\n f = A;\n }\n d = !1;\n };\n e.observe(w, { origin: S.LOCAL });\n const b = (s) => s && s.length > 0 && e.bulkDeleteAnnotation(s), y = (s) => s && s.length > 0 && e.bulkAddAnnotation(s, !1), p = (s) => s && s.length > 0 && e.bulkUpdateAnnotation(s.map(({ oldValue: h }) => h)), L = (s) => s && s.length > 0 && e.bulkUpdateAnnotation(s.map(({ newValue: h }) => h)), a = (s) => s && s.length > 0 && e.bulkAddAnnotation(s, !1), E = (s) => s && s.length > 0 && e.bulkDeleteAnnotation(s);\n return {\n canRedo: () => t.length - 1 > o,\n canUndo: () => o > -1,\n destroy: () => e.unobserve(w),\n on: (s, h) => n.on(s, h),\n redo: () => {\n if (t.length - 1 > o) {\n d = !0;\n const { created: s, updated: h, deleted: A } = t[o + 1];\n y(s), L(h), E(A), n.emit(\"redo\", t[o + 1]), o += 1;\n }\n },\n undo: () => {\n if (o > -1) {\n d = !0;\n const { created: s, updated: h, deleted: A } = t[o];\n b(s), p(h), a(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: d, selection: f, hover: w, viewport: b } = e, y = /* @__PURE__ */ new Map();\n let p = [], L, a;\n const E = (r, u) => {\n y.has(r) ? y.get(r).push(u) : y.set(r, [u]);\n }, m = (r, u) => {\n const s = y.get(r);\n if (s) {\n const h = s.indexOf(u);\n h !== -1 && s.splice(h, 1);\n }\n }, v = (r, u, s) => {\n y.has(r) && setTimeout(() => {\n y.get(r).forEach((h) => {\n if (t) {\n const A = Array.isArray(u) ? u.map((N) => t.serialize(N)) : t.serialize(u), R = s ? s instanceof PointerEvent ? s : t.serialize(s) : void 0;\n h(A, R);\n } else\n h(u, s);\n });\n }, 1);\n }, U = () => {\n const { selected: r } = f, u = (r || []).map(({ id: s }) => d.getAnnotation(s));\n u.forEach((s) => {\n const h = p.find((A) => A.id === s.id);\n (!h || !B(h, s)) && v(\"updateAnnotation\", s, h);\n }), p = p.map((s) => {\n const h = u.find(({ id: A }) => A === s.id);\n return h || s;\n });\n };\n f.subscribe(({ selected: r }) => {\n if (!(p.length === 0 && r.length === 0)) {\n if (p.length === 0 && r.length > 0)\n p = r.map(({ id: u }) => d.getAnnotation(u));\n else if (p.length > 0 && r.length === 0)\n p.forEach((u) => {\n const s = d.getAnnotation(u.id);\n s && !B(s, u) && v(\"updateAnnotation\", s, u);\n }), p = [];\n else {\n const u = new Set(p.map((A) => A.id)), s = new Set(r.map(({ id: A }) => A));\n p.filter((A) => !s.has(A.id)).forEach((A) => {\n const R = d.getAnnotation(A.id);\n R && !B(R, A) && v(\"updateAnnotation\", R, A);\n }), p = [\n // Remove annotations that were deselected\n ...p.filter((A) => s.has(A.id)),\n // Add editable annotations that were selected\n ...r.filter(({ id: A }) => !u.has(A)).map(({ id: A }) => d.getAnnotation(A))\n ];\n }\n v(\"selectionChanged\", p);\n }\n }), w.subscribe((r) => {\n !L && r ? v(\"mouseEnterAnnotation\", d.getAnnotation(r)) : L && !r ? v(\"mouseLeaveAnnotation\", d.getAnnotation(L)) : L && r && (v(\"mouseLeaveAnnotation\", d.getAnnotation(L)), v(\"mouseEnterAnnotation\", d.getAnnotation(r))), L = r;\n }), b == null || b.subscribe((r) => v(\"viewportIntersect\", r.map((u) => d.getAnnotation(u)))), d.observe((r) => {\n o && (a && clearTimeout(a), a = setTimeout(U, 1e3));\n const { created: u, deleted: s } = r.changes;\n (u || []).forEach((A) => v(\"createAnnotation\", A)), (s || []).forEach((A) => v(\"deleteAnnotation\", A)), (r.changes.updated || []).filter((A) => [\n ...A.bodiesCreated || [],\n ...A.bodiesDeleted || [],\n ...A.bodiesUpdated || []\n ].length > 0).forEach(({ oldValue: A, newValue: R }) => {\n const N = p.find((x) => x.id === A.id) || A;\n p = p.map((x) => x.id === A.id ? R : x), v(\"updateAnnotation\", R, N);\n });\n }, { origin: S.LOCAL }), d.observe((r) => {\n if (p) {\n const u = new Set(p.map((h) => h.id)), s = (r.changes.updated || []).filter(({ newValue: h }) => u.has(h.id)).map(({ newValue: h }) => h);\n s.length > 0 && (p = p.map((h) => {\n const A = s.find((R) => R.id === h.id);\n return A || h;\n }));\n }\n }, { origin: S.REMOTE });\n const O = (r) => (u) => {\n const { updated: s } = u;\n r ? (s || []).forEach((h) => v(\"updateAnnotation\", h.oldValue, h.newValue)) : (s || []).forEach((h) => v(\"updateAnnotation\", h.newValue, h.oldValue));\n };\n return n.on(\"undo\", O(!0)), n.on(\"redo\", O(!1)), { on: E, off: m, emit: v };\n}, xe = (e) => (n) => n.map((t) => e.serialize(t)), ce = (e) => (n) => n.reduce((t, o) => {\n const { parsed: d, error: f } = e.parse(o);\n return f ? {\n parsed: t.parsed,\n failed: [...t.failed, o]\n } : d ? {\n parsed: [...t.parsed, d],\n failed: t.failed\n } : {\n ...t\n };\n}, { parsed: [], failed: [] }), Ie = (e, n, t) => {\n const { store: o, selection: d } = e, f = (r) => {\n if (t) {\n const { parsed: u, error: s } = t.parse(r);\n u ? o.addAnnotation(u, S.REMOTE) : console.error(s);\n } else\n o.addAnnotation(r, S.REMOTE);\n }, w = () => d.clear(), b = () => o.clear(), y = (r) => {\n const u = o.getAnnotation(r);\n return t && u ? t.serialize(u) : u;\n }, p = () => t ? o.all().map(t.serialize) : o.all(), L = () => {\n var s;\n const u = (((s = d.selected) == null ? void 0 : s.map((h) => h.id)) || []).map((h) => o.getAnnotation(h)).filter(Boolean);\n return t ? u.map(t.serialize) : u;\n }, a = (r, u = !0) => fetch(r).then((s) => s.json()).then((s) => (m(s, u), s)), E = (r) => {\n if (typeof r == \"string\") {\n const u = o.getAnnotation(r);\n if (o.deleteAnnotation(r), u)\n return t ? t.serialize(u) : u;\n } else {\n const u = t ? t.parse(r).parsed : r;\n if (u)\n return o.deleteAnnotation(u), r;\n }\n }, m = (r, u = !0) => {\n if (t) {\n const { parsed: s, failed: h } = ce(t)(r);\n h.length > 0 && console.warn(`Discarded ${h.length} invalid annotations`, h), o.bulkAddAnnotation(s, u, S.REMOTE);\n } else\n o.bulkAddAnnotation(r, u, S.REMOTE);\n }, v = (r, u) => {\n r ? d.setSelected(r, u) : d.clear();\n }, U = (r) => {\n d.clear(), d.setUserSelectAction(r);\n }, O = (r) => {\n if (t) {\n const u = t.parse(r).parsed, s = t.serialize(o.getAnnotation(u.id));\n return o.updateAnnotation(u), s;\n } else {\n const u = o.getAnnotation(r.id);\n return o.updateAnnotation(r), u;\n }\n };\n return {\n addAnnotation: f,\n cancelSelected: w,\n canRedo: n.canRedo,\n canUndo: n.canUndo,\n clearAnnotations: b,\n getAnnotationById: y,\n getAnnotations: p,\n getSelected: L,\n loadAnnotations: a,\n redo: n.redo,\n removeAnnotation: E,\n setAnnotations: m,\n setSelected: v,\n setUserSelectAction: U,\n undo: n.undo,\n updateAnnotation: O\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, d = -~(1.6 * o * n / e.length);\n return (f = n) => {\n let w = \"\";\n for (; ; ) {\n let b = t(d), y = d;\n for (; y--; )\n if (w += e[b[y] & o] || \"\", w.length === f) 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, d = n.length; o < d; o++) {\n let f = n.charCodeAt(o);\n t = (t << 5) - t + f, 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: d, purpose: f, value: w, created: b, modified: y, creator: p, ...L } = t;\n return {\n id: o || `temp-${ge(t)}`,\n annotation: n,\n type: d,\n purpose: f,\n value: w,\n creator: me(p),\n created: b ? new Date(b) : void 0,\n updated: y ? new Date(y) : void 0,\n ...L\n };\n}), $e = (e) => e.map((n) => {\n var b;\n const { annotation: t, created: o, updated: d, ...f } = n, w = {\n ...f,\n created: o == null ? void 0 : o.toISOString(),\n modified: d == null ? void 0 : d.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), d = e[o];\n return e.splice(o, 1), d;\n }, releaseColor: (o) => e.push(o) };\n}, ve = () => {\n const e = be();\n return { addUser: (o, d) => {\n const f = e.assignRandomColor();\n return {\n label: d.name || d.id,\n avatar: d.avatar,\n color: f\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(), d = (a, E) => {\n if (t.has(a)) {\n console.warn(\"Attempt to add user that is already present\", a, E);\n return;\n }\n const m = e.addUser(a, E);\n t.set(a, {\n ...E,\n presenceKey: a,\n appearance: m\n });\n }, f = (a) => {\n const E = t.get(a);\n if (!E) {\n console.warn(\"Attempt to remove user that is not present\", a);\n return;\n }\n e.removeUser(E), t.delete(a);\n }, w = (a) => {\n const E = new Set(a.map((U) => U.presenceKey)), m = a.filter(({ presenceKey: U }) => !t.has(U)), v = Array.from(t.values()).filter((U) => !E.has(U.presenceKey));\n m.forEach(({ presenceKey: U, user: O }) => d(U, O)), v.forEach((U) => {\n const { presenceKey: O } = U;\n o.has(O) && n.emit(\"selectionChange\", U, null), f(O);\n }), (m.length > 0 || v.length > 0) && n.emit(\"presence\", p());\n }, b = (a, E) => {\n const m = t.get(a);\n if (!m) {\n console.warn(\"Activity notification from user that is not present\");\n return;\n }\n const v = o.get(a);\n (!v || !Ee(v, E)) && (o.set(a, E), n.emit(\"selectionChange\", m, E));\n }, y = (a, E) => {\n const m = t.get(a);\n if (!m) {\n console.warn(\"Selection change for user that is not present\", a);\n return;\n }\n E ? o.set(a, E) : o.delete(a), n.emit(\"selectionChange\", m, E);\n }, p = () => [...Array.from(t.values())];\n return {\n getPresentUsers: p,\n notifyActivity: b,\n on: (a, E) => n.on(a, E),\n syncUsers: w,\n updateSelection: y\n };\n};\nexport {\n se as Ignore,\n S as Origin,\n ze as PRESENCE_KEY,\n F as UserSelectAction,\n ke as createAnonymousGuest,\n Ie as createBaseAnnotator,\n Se as createBody,\n ve as createDefaultAppearenceProvider,\n Ce as createHoverState,\n Be as createLifecycleObserver,\n Ve as createPresenceState,\n Ue as createSelectionState,\n Oe as createStore,\n De as createUndoStack,\n Re as createViewportState,\n be as defaultColorProvider,\n q as diffAnnotations,\n Le as getContributors,\n de as mergeChanges,\n P as onUserSelect,\n ce as parseAll,\n Ne as parseW3CBodies,\n me as parseW3CUser,\n xe 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 if (w3cTargets.length === 0) {\n return { error: Error(`No targets found for annotation: ${annotation.id}`) };\n }\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 styleClass: w3cTargets[0].styleClass\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","export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let i = 0,\n callbacks = this.events[event] || [],\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n","import RBush from 'rbush';\nimport type { Store } from '@annotorious/core';\nimport { createNanoEvents, type Unsubscribe } from 'nanoevents';\n\nimport type { TextAnnotation, TextAnnotationTarget } from '../model';\nimport {\n getClientRectsPonyfill,\n isRevived,\n mergeClientRects,\n normalizeRectWithOffset,\n reviveSelector\n} 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 interface SpatialTreeEvents {\n\n recalculate(): void;\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 const emitter = createNanoEvents<SpatialTreeEvents>();\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 /**\n * Offset the merged client rects so that coords\n * are relative to the parent container\n */\n const merged = mergeClientRects(rects).map(rect => normalizeRectWithOffset(rect, offset));\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, all = false): string[] => {\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 all ? hits.map(h => h.annotation.id) : [ hits[0].annotation.id ];\n } else {\n return [];\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 emitter.emit('recalculate');\n };\n\n const on = <E extends keyof SpatialTreeEvents>(event: E, callback: SpatialTreeEvents[E]): Unsubscribe => emitter.on(event, callback);\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 on\n }\n\n}\n","import type { Filter, UserSelectAction, Store, ViewportState, UserSelectActionExpression } 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, type SpatialTreeEvents } 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 defaultUserSelectAction?: UserSelectActionExpression<TextAnnotation>\n): TextAnnotatorState => {\n\n const store: Store<TextAnnotation> = createStore<TextAnnotation>();\n\n const tree = createSpatialTree(store, container);\n\n const selection = createSelectionState<TextAnnotation>(store, defaultUserSelectAction);\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, filter?: Filter): TextAnnotation | undefined => {\n const annotations = tree.getAt(x, y, Boolean(filter)).map(id => store.getAnnotation(id));\n const filtered = filter ? annotations.filter(filter) : annotations;\n return filtered.length > 0 ? filtered[0] : undefined;\n }\n\n const getAnnotationBounds = (id: string, x?: number, y?: number, buffer = 5): DOMRect | undefined => {\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 const onRecalculatePositions = (callback: SpatialTreeEvents['recalculate']) => tree.on('recalculate', callback);\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.bind(tree),\n getAnnotationRects: tree.getAnnotationRects.bind(tree),\n recalculatePositions,\n onRecalculatePositions,\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, HighlightPainter } from '../highlight';\nimport type { PresencePainterOptions } from '../presence';\nimport type { ViewportBounds } from '../highlight/viewport';\n\nimport './PresencePainter.css';\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-presence-layer';\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 document.body.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}\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, UserSelectActionExpression, User } 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 annotatingEnabled?: boolean;\n\n renderer?: RendererType;\n\n offsetReferenceSelector?: string;\n\n userSelectAction?: UserSelectActionExpression<TextAnnotation>,\n\n presence?: PresencePainterOptions;\n\n style?: HighlightStyleExpression;\n\n user?: User;\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 annotatingEnabled: opts.annotatingEnabled ?? defaults.annotatingEnabled,\n user: opts.user || defaults.user,\n };\n\n};\n","/**! \n * hotkeys-js v3.13.7 \n * A simple micro-library for defining and dispatching keyboard shortcuts. It has no dependencies. \n * \n * Copyright (c) 2024 kenny wong <wowohoo@qq.com> \n * https://github.com/jaywcjlove/hotkeys-js.git \n * \n * @website: https://jaywcjlove.github.io/hotkeys-js\n \n * Licensed under the MIT license \n */\n\nconst isff = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0 : false;\n\n// 绑定事件\nfunction addEvent(object, event, method, useCapture) {\n if (object.addEventListener) {\n object.addEventListener(event, method, useCapture);\n } else if (object.attachEvent) {\n object.attachEvent(\"on\".concat(event), method);\n }\n}\nfunction removeEvent(object, event, method, useCapture) {\n if (object.removeEventListener) {\n object.removeEventListener(event, method, useCapture);\n } else if (object.detachEvent) {\n object.detachEvent(\"on\".concat(event), method);\n }\n}\n\n// 修饰键转换成对应的键码\nfunction getMods(modifier, key) {\n const mods = key.slice(0, key.length - 1);\n for (let i = 0; i < mods.length; i++) mods[i] = modifier[mods[i].toLowerCase()];\n return mods;\n}\n\n// 处理传的key字符串转换成数组\nfunction getKeys(key) {\n if (typeof key !== 'string') key = '';\n key = key.replace(/\\s/g, ''); // 匹配任何空白字符,包括空格、制表符、换页符等等\n const keys = key.split(','); // 同时设置多个快捷键,以','分割\n let index = keys.lastIndexOf('');\n\n // 快捷键可能包含',',需特殊处理\n for (; index >= 0;) {\n keys[index - 1] += ',';\n keys.splice(index, 1);\n index = keys.lastIndexOf('');\n }\n return keys;\n}\n\n// 比较修饰键的数组\nfunction compareArray(a1, a2) {\n const arr1 = a1.length >= a2.length ? a1 : a2;\n const arr2 = a1.length >= a2.length ? a2 : a1;\n let isIndex = true;\n for (let i = 0; i < arr1.length; i++) {\n if (arr2.indexOf(arr1[i]) === -1) isIndex = false;\n }\n return isIndex;\n}\n\n// Special Keys\nconst _keyMap = {\n backspace: 8,\n '⌫': 8,\n tab: 9,\n clear: 12,\n enter: 13,\n '↩': 13,\n return: 13,\n esc: 27,\n escape: 27,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n del: 46,\n delete: 46,\n ins: 45,\n insert: 45,\n home: 36,\n end: 35,\n pageup: 33,\n pagedown: 34,\n capslock: 20,\n num_0: 96,\n num_1: 97,\n num_2: 98,\n num_3: 99,\n num_4: 100,\n num_5: 101,\n num_6: 102,\n num_7: 103,\n num_8: 104,\n num_9: 105,\n num_multiply: 106,\n num_add: 107,\n num_enter: 108,\n num_subtract: 109,\n num_decimal: 110,\n num_divide: 111,\n '⇪': 20,\n ',': 188,\n '.': 190,\n '/': 191,\n '`': 192,\n '-': isff ? 173 : 189,\n '=': isff ? 61 : 187,\n ';': isff ? 59 : 186,\n '\\'': 222,\n '[': 219,\n ']': 221,\n '\\\\': 220\n};\n\n// Modifier Keys\nconst _modifier = {\n // shiftKey\n '⇧': 16,\n shift: 16,\n // altKey\n '⌥': 18,\n alt: 18,\n option: 18,\n // ctrlKey\n '⌃': 17,\n ctrl: 17,\n control: 17,\n // metaKey\n '⌘': 91,\n cmd: 91,\n command: 91\n};\nconst modifierMap = {\n 16: 'shiftKey',\n 18: 'altKey',\n 17: 'ctrlKey',\n 91: 'metaKey',\n shiftKey: 16,\n ctrlKey: 17,\n altKey: 18,\n metaKey: 91\n};\nconst _mods = {\n 16: false,\n 18: false,\n 17: false,\n 91: false\n};\nconst _handlers = {};\n\n// F1~F12 special key\nfor (let k = 1; k < 20; k++) {\n _keyMap[\"f\".concat(k)] = 111 + k;\n}\n\nlet _downKeys = []; // 记录摁下的绑定键\nlet winListendFocus = null; // window是否已经监听了focus事件\nlet _scope = 'all'; // 默认热键范围\nconst elementEventMap = new Map(); // 已绑定事件的节点记录\n\n// 返回键码\nconst code = x => _keyMap[x.toLowerCase()] || _modifier[x.toLowerCase()] || x.toUpperCase().charCodeAt(0);\nconst getKey = x => Object.keys(_keyMap).find(k => _keyMap[k] === x);\nconst getModifier = x => Object.keys(_modifier).find(k => _modifier[k] === x);\n\n// 设置获取当前范围(默认为'所有')\nfunction setScope(scope) {\n _scope = scope || 'all';\n}\n// 获取当前范围\nfunction getScope() {\n return _scope || 'all';\n}\n// 获取摁下绑定键的键值\nfunction getPressedKeyCodes() {\n return _downKeys.slice(0);\n}\nfunction getPressedKeyString() {\n return _downKeys.map(c => getKey(c) || getModifier(c) || String.fromCharCode(c));\n}\nfunction getAllKeyCodes() {\n const result = [];\n Object.keys(_handlers).forEach(k => {\n _handlers[k].forEach(_ref => {\n let {\n key,\n scope,\n mods,\n shortcut\n } = _ref;\n result.push({\n scope,\n shortcut,\n mods,\n keys: key.split('+').map(v => code(v))\n });\n });\n });\n return result;\n}\n\n// 表单控件控件判断 返回 Boolean\n// hotkey is effective only when filter return true\nfunction filter(event) {\n const target = event.target || event.srcElement;\n const {\n tagName\n } = target;\n let flag = true;\n const isInput = tagName === 'INPUT' && !['checkbox', 'radio', 'range', 'button', 'file', 'reset', 'submit', 'color'].includes(target.type);\n // ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>\n if (target.isContentEditable || (isInput || tagName === 'TEXTAREA' || tagName === 'SELECT') && !target.readOnly) {\n flag = false;\n }\n return flag;\n}\n\n// 判断摁下的键是否为某个键,返回true或者false\nfunction isPressed(keyCode) {\n if (typeof keyCode === 'string') {\n keyCode = code(keyCode); // 转换成键码\n }\n return _downKeys.indexOf(keyCode) !== -1;\n}\n\n// 循环删除handlers中的所有 scope(范围)\nfunction deleteScope(scope, newScope) {\n let handlers;\n let i;\n\n // 没有指定scope,获取scope\n if (!scope) scope = getScope();\n for (const key in _handlers) {\n if (Object.prototype.hasOwnProperty.call(_handlers, key)) {\n handlers = _handlers[key];\n for (i = 0; i < handlers.length;) {\n if (handlers[i].scope === scope) {\n const deleteItems = handlers.splice(i, 1);\n deleteItems.forEach(_ref2 => {\n let {\n element\n } = _ref2;\n return removeKeyEvent(element);\n });\n } else {\n i++;\n }\n }\n }\n }\n\n // 如果scope被删除,将scope重置为all\n if (getScope() === scope) setScope(newScope || 'all');\n}\n\n// 清除修饰键\nfunction clearModifier(event) {\n let key = event.keyCode || event.which || event.charCode;\n const i = _downKeys.indexOf(key);\n\n // 从列表中清除按压过的键\n if (i >= 0) {\n _downKeys.splice(i, 1);\n }\n // 特殊处理 cmmand 键,在 cmmand 组合快捷键 keyup 只执行一次的问题\n if (event.key && event.key.toLowerCase() === 'meta') {\n _downKeys.splice(0, _downKeys.length);\n }\n\n // 修饰键 shiftKey altKey ctrlKey (command||metaKey) 清除\n if (key === 93 || key === 224) key = 91;\n if (key in _mods) {\n _mods[key] = false;\n\n // 将修饰键重置为false\n for (const k in _modifier) if (_modifier[k] === key) hotkeys[k] = false;\n }\n}\nfunction unbind(keysInfo) {\n // unbind(), unbind all keys\n if (typeof keysInfo === 'undefined') {\n Object.keys(_handlers).forEach(key => {\n Array.isArray(_handlers[key]) && _handlers[key].forEach(info => eachUnbind(info));\n delete _handlers[key];\n });\n removeKeyEvent(null);\n } else if (Array.isArray(keysInfo)) {\n // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])\n keysInfo.forEach(info => {\n if (info.key) eachUnbind(info);\n });\n } else if (typeof keysInfo === 'object') {\n // support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})\n if (keysInfo.key) eachUnbind(keysInfo);\n } else if (typeof keysInfo === 'string') {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n // support old method\n // eslint-disable-line\n let [scope, method] = args;\n if (typeof scope === 'function') {\n method = scope;\n scope = '';\n }\n eachUnbind({\n key: keysInfo,\n scope,\n method,\n splitKey: '+'\n });\n }\n}\n\n// 解除绑定某个范围的快捷键\nconst eachUnbind = _ref3 => {\n let {\n key,\n scope,\n method,\n splitKey = '+'\n } = _ref3;\n const multipleKeys = getKeys(key);\n multipleKeys.forEach(originKey => {\n const unbindKeys = originKey.split(splitKey);\n const len = unbindKeys.length;\n const lastKey = unbindKeys[len - 1];\n const keyCode = lastKey === '*' ? '*' : code(lastKey);\n if (!_handlers[keyCode]) return;\n // 判断是否传入范围,没有就获取范围\n if (!scope) scope = getScope();\n const mods = len > 1 ? getMods(_modifier, unbindKeys) : [];\n const unbindElements = [];\n _handlers[keyCode] = _handlers[keyCode].filter(record => {\n // 通过函数判断,是否解除绑定,函数相等直接返回\n const isMatchingMethod = method ? record.method === method : true;\n const isUnbind = isMatchingMethod && record.scope === scope && compareArray(record.mods, mods);\n if (isUnbind) unbindElements.push(record.element);\n return !isUnbind;\n });\n unbindElements.forEach(element => removeKeyEvent(element));\n });\n};\n\n// 对监听对应快捷键的回调函数进行处理\nfunction eventHandler(event, handler, scope, element) {\n if (handler.element !== element) {\n return;\n }\n let modifiersMatch;\n\n // 看它是否在当前范围\n if (handler.scope === scope || handler.scope === 'all') {\n // 检查是否匹配修饰符(如果有返回true)\n modifiersMatch = handler.mods.length > 0;\n for (const y in _mods) {\n if (Object.prototype.hasOwnProperty.call(_mods, y)) {\n if (!_mods[y] && handler.mods.indexOf(+y) > -1 || _mods[y] && handler.mods.indexOf(+y) === -1) {\n modifiersMatch = false;\n }\n }\n }\n\n // 调用处理程序,如果是修饰键不做处理\n if (handler.mods.length === 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91] || modifiersMatch || handler.shortcut === '*') {\n handler.keys = [];\n handler.keys = handler.keys.concat(_downKeys);\n if (handler.method(event, handler) === false) {\n if (event.preventDefault) event.preventDefault();else event.returnValue = false;\n if (event.stopPropagation) event.stopPropagation();\n if (event.cancelBubble) event.cancelBubble = true;\n }\n }\n }\n}\n\n// 处理keydown事件\nfunction dispatch(event, element) {\n const asterisk = _handlers['*'];\n let key = event.keyCode || event.which || event.charCode;\n\n // 表单控件过滤 默认表单控件不触发快捷键\n if (!hotkeys.filter.call(this, event)) return;\n\n // Gecko(Firefox)的command键值224,在Webkit(Chrome)中保持一致\n // Webkit左右 command 键值不一样\n if (key === 93 || key === 224) key = 91;\n\n /**\n * Collect bound keys\n * If an Input Method Editor is processing key input and the event is keydown, return 229.\n * https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229\n * http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n */\n if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);\n /**\n * Jest test cases are required.\n * ===============================\n */\n ['ctrlKey', 'altKey', 'shiftKey', 'metaKey'].forEach(keyName => {\n const keyNum = modifierMap[keyName];\n if (event[keyName] && _downKeys.indexOf(keyNum) === -1) {\n _downKeys.push(keyNum);\n } else if (!event[keyName] && _downKeys.indexOf(keyNum) > -1) {\n _downKeys.splice(_downKeys.indexOf(keyNum), 1);\n } else if (keyName === 'metaKey' && event[keyName] && _downKeys.length === 3) {\n /**\n * Fix if Command is pressed:\n * ===============================\n */\n if (!(event.ctrlKey || event.shiftKey || event.altKey)) {\n _downKeys = _downKeys.slice(_downKeys.indexOf(keyNum));\n }\n }\n });\n /**\n * -------------------------------\n */\n\n if (key in _mods) {\n _mods[key] = true;\n\n // 将特殊字符的key注册到 hotkeys 上\n for (const k in _modifier) {\n if (_modifier[k] === key) hotkeys[k] = true;\n }\n if (!asterisk) return;\n }\n\n // 将 modifierMap 里面的修饰键绑定到 event 中\n for (const e in _mods) {\n if (Object.prototype.hasOwnProperty.call(_mods, e)) {\n _mods[e] = event[modifierMap[e]];\n }\n }\n /**\n * https://github.com/jaywcjlove/hotkeys/pull/129\n * This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.\n * An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.\n * Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate\n */\n if (event.getModifierState && !(event.altKey && !event.ctrlKey) && event.getModifierState('AltGraph')) {\n if (_downKeys.indexOf(17) === -1) {\n _downKeys.push(17);\n }\n if (_downKeys.indexOf(18) === -1) {\n _downKeys.push(18);\n }\n _mods[17] = true;\n _mods[18] = true;\n }\n\n // 获取范围 默认为 `all`\n const scope = getScope();\n // 对任何快捷键都需要做的处理\n if (asterisk) {\n for (let i = 0; i < asterisk.length; i++) {\n if (asterisk[i].scope === scope && (event.type === 'keydown' && asterisk[i].keydown || event.type === 'keyup' && asterisk[i].keyup)) {\n eventHandler(event, asterisk[i], scope, element);\n }\n }\n }\n // key 不在 _handlers 中返回\n if (!(key in _handlers)) return;\n const handlerKey = _handlers[key];\n const keyLen = handlerKey.length;\n for (let i = 0; i < keyLen; i++) {\n if (event.type === 'keydown' && handlerKey[i].keydown || event.type === 'keyup' && handlerKey[i].keyup) {\n if (handlerKey[i].key) {\n const record = handlerKey[i];\n const {\n splitKey\n } = record;\n const keyShortcut = record.key.split(splitKey);\n const _downKeysCurrent = []; // 记录当前按键键值\n for (let a = 0; a < keyShortcut.length; a++) {\n _downKeysCurrent.push(code(keyShortcut[a]));\n }\n if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {\n // 找到处理内容\n eventHandler(event, record, scope, element);\n }\n }\n }\n }\n}\nfunction hotkeys(key, option, method) {\n _downKeys = [];\n const keys = getKeys(key); // 需要处理的快捷键列表\n let mods = [];\n let scope = 'all'; // scope默认为all,所有范围都有效\n let element = document; // 快捷键事件绑定节点\n let i = 0;\n let keyup = false;\n let keydown = true;\n let splitKey = '+';\n let capture = false;\n let single = false; // 单个callback\n\n // 对为设定范围的判断\n if (method === undefined && typeof option === 'function') {\n method = option;\n }\n if (Object.prototype.toString.call(option) === '[object Object]') {\n if (option.scope) scope = option.scope; // eslint-disable-line\n if (option.element) element = option.element; // eslint-disable-line\n if (option.keyup) keyup = option.keyup; // eslint-disable-line\n if (option.keydown !== undefined) keydown = option.keydown; // eslint-disable-line\n if (option.capture !== undefined) capture = option.capture; // eslint-disable-line\n if (typeof option.splitKey === 'string') splitKey = option.splitKey; // eslint-disable-line\n if (option.single === true) single = true; // eslint-disable-line\n }\n if (typeof option === 'string') scope = option;\n\n // 如果只允许单个callback,先unbind\n if (single) unbind(key, scope);\n\n // 对于每个快捷键进行处理\n for (; i < keys.length; i++) {\n key = keys[i].split(splitKey); // 按键列表\n mods = [];\n\n // 如果是组合快捷键取得组合快捷键\n if (key.length > 1) mods = getMods(_modifier, key);\n\n // 将非修饰键转化为键码\n key = key[key.length - 1];\n key = key === '*' ? '*' : code(key); // *表示匹配所有快捷键\n\n // 判断key是否在_handlers中,不在就赋一个空数组\n if (!(key in _handlers)) _handlers[key] = [];\n _handlers[key].push({\n keyup,\n keydown,\n scope,\n mods,\n shortcut: keys[i],\n method,\n key: keys[i],\n splitKey,\n element\n });\n }\n // 在全局document上设置快捷键\n if (typeof element !== 'undefined' && window) {\n if (!elementEventMap.has(element)) {\n const keydownListener = function () {\n let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;\n return dispatch(event, element);\n };\n const keyupListenr = function () {\n let event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.event;\n dispatch(event, element);\n clearModifier(event);\n };\n elementEventMap.set(element, {\n keydownListener,\n keyupListenr,\n capture\n });\n addEvent(element, 'keydown', keydownListener, capture);\n addEvent(element, 'keyup', keyupListenr, capture);\n }\n if (!winListendFocus) {\n const listener = () => {\n _downKeys = [];\n };\n winListendFocus = {\n listener,\n capture\n };\n addEvent(window, 'focus', listener, capture);\n }\n }\n}\nfunction trigger(shortcut) {\n let scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';\n Object.keys(_handlers).forEach(key => {\n const dataList = _handlers[key].filter(item => item.scope === scope && item.shortcut === shortcut);\n dataList.forEach(data => {\n if (data && data.method) {\n data.method();\n }\n });\n });\n}\n\n// 销毁事件,unbind之后判断element上是否还有键盘快捷键,如果没有移除监听\nfunction removeKeyEvent(element) {\n const values = Object.values(_handlers).flat();\n const findindex = values.findIndex(_ref4 => {\n let {\n element: el\n } = _ref4;\n return el === element;\n });\n if (findindex < 0) {\n const {\n keydownListener,\n keyupListenr,\n capture\n } = elementEventMap.get(element) || {};\n if (keydownListener && keyupListenr) {\n removeEvent(element, 'keyup', keyupListenr, capture);\n removeEvent(element, 'keydown', keydownListener, capture);\n elementEventMap.delete(element);\n }\n }\n if (values.length <= 0 || elementEventMap.size <= 0) {\n // 移除所有的元素上的监听\n const eventKeys = Object.keys(elementEventMap);\n eventKeys.forEach(el => {\n const {\n keydownListener,\n keyupListenr,\n capture\n } = elementEventMap.get(el) || {};\n if (keydownListener && keyupListenr) {\n removeEvent(el, 'keyup', keyupListenr, capture);\n removeEvent(el, 'keydown', keydownListener, capture);\n elementEventMap.delete(el);\n }\n });\n // 清空 elementEventMap\n elementEventMap.clear();\n // 清空 _handlers\n Object.keys(_handlers).forEach(key => delete _handlers[key]);\n // 移除window上的focus监听\n if (winListendFocus) {\n const {\n listener,\n capture\n } = winListendFocus;\n removeEvent(window, 'focus', listener, capture);\n winListendFocus = null;\n }\n }\n}\nconst _api = {\n getPressedKeyString,\n setScope,\n getScope,\n deleteScope,\n getPressedKeyCodes,\n getAllKeyCodes,\n isPressed,\n filter,\n trigger,\n unbind,\n keyMap: _keyMap,\n modifier: _modifier,\n modifierMap\n};\nfor (const a in _api) {\n if (Object.prototype.hasOwnProperty.call(_api, a)) {\n hotkeys[a] = _api[a];\n }\n}\nif (typeof window !== 'undefined') {\n const _hotkeys = window.hotkeys;\n hotkeys.noConflict = deep => {\n if (deep && window.hotkeys === hotkeys) {\n window.hotkeys = _hotkeys;\n }\n return hotkeys;\n };\n window.hotkeys = hotkeys;\n}\n\nexport { hotkeys as default };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * An enum that includes all non-printable string values one can expect from $event.key.\n * For example, this enum includes values like \"CapsLock\", \"Backspace\", and \"AudioVolumeMute\",\n * but does not include values like \"a\", \"A\", \"#\", \"é\", or \"¿\".\n * Auto generated from MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values#Speech_recognition_keys\n */\nvar Key;\n(function (Key) {\n /**\n * The user agent wasn't able to map the event's virtual keycode to a\n * specific key value.\n * This can happen due to hardware or software constraints, or because of\n * constraints around the platform on which the user agent is running.\n */\n Key[\"Unidentified\"] = \"Unidentified\";\n /** The Alt (Alternative) key. */\n Key[\"Alt\"] = \"Alt\";\n /**\n * The AltGr or AltGraph (Alternate Graphics) key.\n * Enables the ISO Level 3 shift modifier (where Shift is the\n * level 2 modifier).\n */\n Key[\"AltGraph\"] = \"AltGraph\";\n /**\n * The Caps Lock key. Toggles the capital character lock on and\n * off for subsequent input.\n */\n Key[\"CapsLock\"] = \"CapsLock\";\n /**\n * The Control, Ctrl, or Ctl key. Allows\n * typing control characters.\n */\n Key[\"Control\"] = \"Control\";\n /**\n * The Fn (Function modifier) key. Used to allow generating\n * function key (F1–F15, for instance) characters on\n * keyboards without a dedicated function key area. Often handled in\n * hardware so that events aren't generated for this key.\n */\n Key[\"Fn\"] = \"Fn\";\n /**\n * The FnLock or F-Lock (Function Lock) key.Toggles\n * the function key mode described by \"Fn\" on and off. Often\n * handled in hardware so that events aren't generated for this key.\n */\n Key[\"FnLock\"] = \"FnLock\";\n /** The Hyper key. */\n Key[\"Hyper\"] = \"Hyper\";\n /**\n * The Meta key. Allows issuing special command inputs. This is\n * the Windows logo key, or the Command or\n * ⌘ key on Mac keyboards.\n */\n Key[\"Meta\"] = \"Meta\";\n /**\n * The NumLock (Number Lock) key. Toggles the numeric keypad\n * between number entry some other mode (often directional arrows).\n */\n Key[\"NumLock\"] = \"NumLock\";\n /**\n * The Scroll Lock key. Toggles between scrolling and cursor\n * movement modes.\n */\n Key[\"ScrollLock\"] = \"ScrollLock\";\n /**\n * The Shift key. Modifies keystrokes to allow typing upper (or\n * other) case letters, and to support typing punctuation and other special\n * characters.\n */\n Key[\"Shift\"] = \"Shift\";\n /** The Super key. */\n Key[\"Super\"] = \"Super\";\n /** The Symbol modifier key (found on certain virtual keyboards). */\n Key[\"Symbol\"] = \"Symbol\";\n /** The Symbol Lock key. */\n Key[\"SymbolLock\"] = \"SymbolLock\";\n /**\n * The Enter or ↵ key (sometimes labeled\n * Return).\n */\n Key[\"Enter\"] = \"Enter\";\n /** The Horizontal Tab key, Tab. */\n Key[\"Tab\"] = \"Tab\";\n /** The down arrow key. */\n Key[\"ArrowDown\"] = \"ArrowDown\";\n /** The left arrow key. */\n Key[\"ArrowLeft\"] = \"ArrowLeft\";\n /** The right arrow key. */\n Key[\"ArrowRight\"] = \"ArrowRight\";\n /** The up arrow key. */\n Key[\"ArrowUp\"] = \"ArrowUp\";\n /** The End key. Moves to the end of content. */\n Key[\"End\"] = \"End\";\n /** The Home key. Moves to the start of content. */\n Key[\"Home\"] = \"Home\";\n /**\n * The Page Down (or PgDn) key. Scrolls down or\n * displays the next page of content.\n */\n Key[\"PageDown\"] = \"PageDown\";\n /**\n * The Page Up (or PgUp) key. Scrolls up or displays\n * the previous page of content.\n */\n Key[\"PageUp\"] = \"PageUp\";\n /**\n * The Backspace key. This key is labeled Delete on\n * Mac keyboards.\n */\n Key[\"Backspace\"] = \"Backspace\";\n /** The Clear key. Removes the currently selected input. */\n Key[\"Clear\"] = \"Clear\";\n /** The Copy key (on certain extended keyboards). */\n Key[\"Copy\"] = \"Copy\";\n /** The Cursor Select key, CrSel. */\n Key[\"CrSel\"] = \"CrSel\";\n /** The Cut key (on certain extended keyboards). */\n Key[\"Cut\"] = \"Cut\";\n /** The Delete key, Del. */\n Key[\"Delete\"] = \"Delete\";\n /**\n * Erase to End of Field. Deletes all characters from the current cursor\n * position to the end of the current field.\n */\n Key[\"EraseEof\"] = \"EraseEof\";\n /** The ExSel (Extend Selection) key. */\n Key[\"ExSel\"] = \"ExSel\";\n /**\n * The Insert key, Ins. Toggles between inserting and\n * overwriting text.\n */\n Key[\"Insert\"] = \"Insert\";\n /** Paste from the clipboard. */\n Key[\"Paste\"] = \"Paste\";\n /** Redo the last action. */\n Key[\"Redo\"] = \"Redo\";\n /** Undo the last action. */\n Key[\"Undo\"] = \"Undo\";\n /**\n * The Accept, Commit, or OK key or\n * button. Accepts the currently selected option or input method sequence\n * conversion.\n */\n Key[\"Accept\"] = \"Accept\";\n /** The Again key. Redoes or repeats a previous action. */\n Key[\"Again\"] = \"Again\";\n /** The Attn (Attention) key. */\n Key[\"Attn\"] = \"Attn\";\n /** The Cancel key. */\n Key[\"Cancel\"] = \"Cancel\";\n /**\n * Shows the context menu. Typically found between the\n * Windows (or OS) key and the Control key\n * on the right side of the keyboard.\n */\n Key[\"ContextMenu\"] = \"ContextMenu\";\n /**\n * The Esc (Escape) key. Typically used as an exit, cancel, or\n * \"escape this operation\" button. Historically, the Escape character was\n * used to signal the start of a special control sequence of characters\n * called an \"escape sequence.\"\n */\n Key[\"Escape\"] = \"Escape\";\n /** The Execute key. */\n Key[\"Execute\"] = \"Execute\";\n /**\n * The Find key. Opens an interface (typically a dialog box) for\n * performing a find/search operation.\n */\n Key[\"Find\"] = \"Find\";\n /** The Finish key. */\n Key[\"Finish\"] = \"Finish\";\n /**\n * The Help key. Opens or toggles the display of help\n * information.\n */\n Key[\"Help\"] = \"Help\";\n /**\n * The Pause key. Pauses the current application or state, if\n * applicable.\n * Note: This shouldn't be confused with the\n * \"MediaPause\" key value, which is used for media\n * controllers, rather than to control applications and processes.\n */\n Key[\"Pause\"] = \"Pause\";\n /**\n * The Play key. Resumes a previously paused application, if\n * applicable.\n * Note: This shouldn't be confused with the\n * \"MediaPlay\" key value, which is used for media\n * controllers, rather than to control applications and processes.\n */\n Key[\"Play\"] = \"Play\";\n /** The Props (Properties) key. */\n Key[\"Props\"] = \"Props\";\n /** The Select key. */\n Key[\"Select\"] = \"Select\";\n /** The ZoomIn key. */\n Key[\"ZoomIn\"] = \"ZoomIn\";\n /** The ZoomOut key. */\n Key[\"ZoomOut\"] = \"ZoomOut\";\n /**\n * The Brightness Down key. Typically used to reduce the brightness of the\n * display.\n */\n Key[\"BrightnessDown\"] = \"BrightnessDown\";\n /**\n * The Brightness Up key. Typically increases the brightness of the\n * display.\n */\n Key[\"BrightnessUp\"] = \"BrightnessUp\";\n /**\n * The Eject key. Ejects removable media (or toggles an optical\n * storage device tray open and closed).\n */\n Key[\"Eject\"] = \"Eject\";\n /** The LogOff key. */\n Key[\"LogOff\"] = \"LogOff\";\n /**\n * The Power button or key, to toggle power on and off.\n * Note: Not all systems pass this key through to the\n * user agent.\n */\n Key[\"Power\"] = \"Power\";\n /**\n * The PowerOff or PowerDown key. Shuts off the\n * system.\n */\n Key[\"PowerOff\"] = \"PowerOff\";\n /**\n * The PrintScreen or PrtScr key. Sometimes\n * SnapShot. Captures the screen and prints it or saves it to\n * disk.\n */\n Key[\"PrintScreen\"] = \"PrintScreen\";\n /**\n * The Hibernate key. This saves the state of the computer to\n * disk and then shuts down; the computer can be returned to its previous\n * state by restoring the saved state information.\n */\n Key[\"Hibernate\"] = \"Hibernate\";\n /**\n * The Standby key. (Also known as Suspend or\n * Sleep.) This turns off the display and puts the computer in a\n * low power consumption mode, without completely powering off.\n */\n Key[\"Standby\"] = \"Standby\";\n /**\n * The WakeUp key. Used to wake the computer from the\n * hibernation or standby modes.\n */\n Key[\"WakeUp\"] = \"WakeUp\";\n /**\n * The All Candidates key, which starts multi-candidate mode, in\n * which multiple candidates are displayed for the ongoing input.\n */\n Key[\"AllCandidates\"] = \"AllCandidates\";\n /** The Alphanumeric key. */\n Key[\"Alphanumeric\"] = \"Alphanumeric\";\n /**\n * The Code Input key, which enables code input mode, which lets\n * the user enter characters by typing their code points (their Unicode\n * character numbers, typically).\n */\n Key[\"CodeInput\"] = \"CodeInput\";\n /** The Compose key. */\n Key[\"Compose\"] = \"Compose\";\n /**\n * The Convert key, which instructs the IME to convert the\n * current input method sequence into the resulting character.\n */\n Key[\"Convert\"] = \"Convert\";\n /**\n * A dead \"combining\" key; that is, a key which is used in tandem with\n * other keys to generate accented and other modified characters. If\n * pressed by itself, it doesn't generate a character.\n * If you wish to identify which specific dead key was pressed (in cases\n * where more than one exists), you can do so by examining the\n * KeyboardEvent's associated\n * compositionupdate event's\n * data property.\n */\n Key[\"Dead\"] = \"Dead\";\n /**\n * The Final (Final Mode) key is used on some Asian keyboards to\n * enter final mode when using IMEs.\n */\n Key[\"FinalMode\"] = \"FinalMode\";\n /**\n * Switches to the first character group on an\n * ISO/IEC 9995 keyboard. Each key may have multiple groups of characters, each in its own\n * column. Pressing this key instructs the device to interpret keypresses\n * as coming from the first column on subsequent keystrokes.\n */\n Key[\"GroupFirst\"] = \"GroupFirst\";\n /**\n * Switches to the last character group on an\n * ISO/IEC 9995 keyboard.\n */\n Key[\"GroupLast\"] = \"GroupLast\";\n /**\n * Switches to the next character group on an\n * ISO/IEC 9995 keyboard.\n */\n Key[\"GroupNext\"] = \"GroupNext\";\n /**\n * Switches to the previous character group on an\n * ISO/IEC 9995 keyboard.\n */\n Key[\"GroupPrevious\"] = \"GroupPrevious\";\n /** The Mode Change key. Toggles or cycles among input modes of IMEs. */\n Key[\"ModeChange\"] = \"ModeChange\";\n /**\n * The Next Candidate function key. Selects the next possible match for the\n * ongoing input.\n */\n Key[\"NextCandidate\"] = \"NextCandidate\";\n /**\n * The NonConvert (\"Don't convert\") key. This accepts the\n * current input method sequence without running conversion when using an\n * IME.\n */\n Key[\"NonConvert\"] = \"NonConvert\";\n /**\n * The Previous Candidate key. Selects the previous possible match for the\n * ongoing input.\n */\n Key[\"PreviousCandidate\"] = \"PreviousCandidate\";\n /** The Process key. Instructs the IME to process the conversion. */\n Key[\"Process\"] = \"Process\";\n /**\n * The Single Candidate key. Enables single candidate mode (as opposed to\n * multi-candidate mode); in this mode, only one candidate is displayed at\n * a time.\n */\n Key[\"SingleCandidate\"] = \"SingleCandidate\";\n /**\n * The Hangul (Korean character set) mode key, which toggles\n * between Hangul and English entry modes.\n */\n Key[\"HangulMode\"] = \"HangulMode\";\n /**\n * Selects the Hanja mode, for converting Hangul characters to the more\n * specific Hanja characters.\n */\n Key[\"HanjaMode\"] = \"HanjaMode\";\n /**\n * Selects the Junja mode, in which Korean is represented using single-byte\n * Latin characters.\n */\n Key[\"JunjaMode\"] = \"JunjaMode\";\n /**\n * The Eisu key. This key's purpose is defined by the IME, but\n * may be used to close the IME.\n */\n Key[\"Eisu\"] = \"Eisu\";\n /** The Hankaku (half-width characters) key. */\n Key[\"Hankaku\"] = \"Hankaku\";\n /** The Hiragana key; selects Kana characters mode. */\n Key[\"Hiragana\"] = \"Hiragana\";\n /** Toggles between the Hiragana and Katakana writing systems. */\n Key[\"HiraganaKatakana\"] = \"HiraganaKatakana\";\n /** The Kana Mode (Kana Lock) key. */\n Key[\"KanaMode\"] = \"KanaMode\";\n /**\n * The Kanji Mode key. Enables entering Japanese text using the\n * ideographic characters of Chinese origin.\n */\n Key[\"KanjiMode\"] = \"KanjiMode\";\n /** The Katakana key. */\n Key[\"Katakana\"] = \"Katakana\";\n /** The Romaji key; selects the Roman character set. */\n Key[\"Romaji\"] = \"Romaji\";\n /** The Zenkaku (full width) characters key. */\n Key[\"Zenkaku\"] = \"Zenkaku\";\n /** The Zenkaku/Hankaku (full width/half width) toggle key. */\n Key[\"ZenkakuHanaku\"] = \"ZenkakuHanaku\";\n /** The first general-purpose function key, F1. */\n Key[\"F1\"] = \"F1\";\n /** The F2 key. */\n Key[\"F2\"] = \"F2\";\n /** The F3 key. */\n Key[\"F3\"] = \"F3\";\n /** The F4 key. */\n Key[\"F4\"] = \"F4\";\n /** The F5 key. */\n Key[\"F5\"] = \"F5\";\n /** The F6 key. */\n Key[\"F6\"] = \"F6\";\n /** The F7 key. */\n Key[\"F7\"] = \"F7\";\n /** The F8 key. */\n Key[\"F8\"] = \"F8\";\n /** The F9 key. */\n Key[\"F9\"] = \"F9\";\n /** The F10 key. */\n Key[\"F10\"] = \"F10\";\n /** The F11 key. */\n Key[\"F11\"] = \"F11\";\n /** The F12 key. */\n Key[\"F12\"] = \"F12\";\n /** The F13 key. */\n Key[\"F13\"] = \"F13\";\n /** The F14 key. */\n Key[\"F14\"] = \"F14\";\n /** The F15 key. */\n Key[\"F15\"] = \"F15\";\n /** The F16 key. */\n Key[\"F16\"] = \"F16\";\n /** The F17 key. */\n Key[\"F17\"] = \"F17\";\n /** The F18 key. */\n Key[\"F18\"] = \"F18\";\n /** The F19 key. */\n Key[\"F19\"] = \"F19\";\n /** The F20 key. */\n Key[\"F20\"] = \"F20\";\n /** The first general-purpose virtual function key. */\n Key[\"Soft1\"] = \"Soft1\";\n /** The second general-purpose virtual function key. */\n Key[\"Soft2\"] = \"Soft2\";\n /** The third general-purpose virtual function key. */\n Key[\"Soft3\"] = \"Soft3\";\n /** The fourth general-purpose virtual function key. */\n Key[\"Soft4\"] = \"Soft4\";\n /**\n * Presents a list of recently-used applications which lets the user change\n * apps quickly.\n */\n Key[\"AppSwitch\"] = \"AppSwitch\";\n /** The Call key. Dials the number which has been entered. */\n Key[\"Call\"] = \"Call\";\n /** The Camera key. Activates the camera. */\n Key[\"Camera\"] = \"Camera\";\n /** The Focus key. Focuses the camera. */\n Key[\"CameraFocus\"] = \"CameraFocus\";\n /** The End Call or Hang Up button. */\n Key[\"EndCall\"] = \"EndCall\";\n /** The Back button. */\n Key[\"GoBack\"] = \"GoBack\";\n /**\n * The Home button. Returns the user to the phone's main screen\n * (usually an application launcher).\n */\n Key[\"GoHome\"] = \"GoHome\";\n /**\n * The Headset Hook key. This is typically actually a button on\n * the headset which is used to hang up calls and play or pause media.\n */\n Key[\"HeadsetHook\"] = \"HeadsetHook\";\n /** The Redial button. Redials the last-called number. */\n Key[\"LastNumberRedial\"] = \"LastNumberRedial\";\n /** The Notification key. */\n Key[\"Notification\"] = \"Notification\";\n /**\n * A button which cycles among the notification modes: silent, vibrate,\n * ring, and so forth.\n */\n Key[\"MannerMode\"] = \"MannerMode\";\n /** The Voice Dial key. Initiates voice dialing. */\n Key[\"VoiceDial\"] = \"VoiceDial\";\n /** Switches to the previous channel. */\n Key[\"ChannelDown\"] = \"ChannelDown\";\n /** Switches to the next channel. */\n Key[\"ChannelUp\"] = \"ChannelUp\";\n /** Starts, continues, or increases the speed of fast forwarding the media. */\n Key[\"MediaFastForward\"] = \"MediaFastForward\";\n /**\n * Pauses the currently playing media.\n * Note: Some older applications use\n * \"Pause\", but this is not correct.\n */\n Key[\"MediaPause\"] = \"MediaPause\";\n /**\n * Starts or continues playing media at normal speed, if not already doing\n * so. Has no effect otherwise.\n */\n Key[\"MediaPlay\"] = \"MediaPlay\";\n /** Toggles between playing and pausing the current media. */\n Key[\"MediaPlayPause\"] = \"MediaPlayPause\";\n /** Starts or resumes recording media. */\n Key[\"MediaRecord\"] = \"MediaRecord\";\n /** Starts, continues, or increases the speed of rewinding the media. */\n Key[\"MediaRewind\"] = \"MediaRewind\";\n /**\n * Stops the current media activity (such as playing, recording, pausing,\n * forwarding, or rewinding). Has no effect if the media is currently\n * stopped already.\n */\n Key[\"MediaStop\"] = \"MediaStop\";\n /** Seeks to the next media or program track. */\n Key[\"MediaTrackNext\"] = \"MediaTrackNext\";\n /** Seeks to the previous media or program track. */\n Key[\"MediaTrackPrevious\"] = \"MediaTrackPrevious\";\n /** Adjusts audio balance toward the left. */\n Key[\"AudioBalanceLeft\"] = \"AudioBalanceLeft\";\n /** Adjusts audio balance toward the right. */\n Key[\"AudioBalanceRight\"] = \"AudioBalanceRight\";\n /** Decreases the amount of bass. */\n Key[\"AudioBassDown\"] = \"AudioBassDown\";\n /**\n * Reduces bass boosting or cycles downward through bass boost modes or\n * states.\n */\n Key[\"AudioBassBoostDown\"] = \"AudioBassBoostDown\";\n /** Toggles bass boosting on and off. */\n Key[\"AudioBassBoostToggle\"] = \"AudioBassBoostToggle\";\n /**\n * Increases the amount of bass boosting, or cycles upward through a set of\n * bass boost modes or states.\n */\n Key[\"AudioBassBoostUp\"] = \"AudioBassBoostUp\";\n /** Increases the amount of bass. */\n Key[\"AudioBassUp\"] = \"AudioBassUp\";\n /** Adjusts the audio fader toward the front. */\n Key[\"AudioFaderFront\"] = \"AudioFaderFront\";\n /** Adjusts the audio fader toward the rear. */\n Key[\"AudioFaderRear\"] = \"AudioFaderRear\";\n /** Selects the next available surround sound mode. */\n Key[\"AudioSurroundModeNext\"] = \"AudioSurroundModeNext\";\n /** Decreases the amount of treble. */\n Key[\"AudioTrebleDown\"] = \"AudioTrebleDown\";\n /** Increases the amount of treble. */\n Key[\"AudioTrebleUp\"] = \"AudioTrebleUp\";\n /** Decreases the audio volume. */\n Key[\"AudioVolumeDown\"] = \"AudioVolumeDown\";\n /** Mutes the audio. */\n Key[\"AudioVolumeMute\"] = \"AudioVolumeMute\";\n /** Increases the audio volume. */\n Key[\"AudioVolumeUp\"] = \"AudioVolumeUp\";\n /** Toggles the microphone on and off. */\n Key[\"MicrophoneToggle\"] = \"MicrophoneToggle\";\n /** Decreases the microphone's input volume. */\n Key[\"MicrophoneVolumeDown\"] = \"MicrophoneVolumeDown\";\n /** Mutes the microphone input. */\n Key[\"MicrophoneVolumeMute\"] = \"MicrophoneVolumeMute\";\n /** Increases the microphone's input volume. */\n Key[\"MicrophoneVolumeUp\"] = \"MicrophoneVolumeUp\";\n /** Switches into TV viewing mode. */\n Key[\"TV\"] = \"TV\";\n /** Toggles 3D TV mode on and off. */\n Key[\"TV3DMode\"] = \"TV3DMode\";\n /** Toggles between antenna and cable inputs. */\n Key[\"TVAntennaCable\"] = \"TVAntennaCable\";\n /** Toggles audio description mode on and off. */\n Key[\"TVAudioDescription\"] = \"TVAudioDescription\";\n /**\n * Decreases the audio description's mixing volume; reduces the volume of\n * the audio descriptions relative to the program sound.\n */\n Key[\"TVAudioDescriptionMixDown\"] = \"TVAudioDescriptionMixDown\";\n /**\n * Increases the audio description's mixing volume; increases the volume of\n * the audio descriptions relative to the program sound.\n */\n Key[\"TVAudioDescriptionMixUp\"] = \"TVAudioDescriptionMixUp\";\n /**\n * Displays or hides the media contents available for playback (this may be\n * a channel guide showing the currently airing programs, or a list of\n * media files to play).\n */\n Key[\"TVContentsMenu\"] = \"TVContentsMenu\";\n /** Displays or hides the TV's data service menu. */\n Key[\"TVDataService\"] = \"TVDataService\";\n /** Cycles the input mode on an external TV. */\n Key[\"TVInput\"] = \"TVInput\";\n /** Switches to the input \"Component 1.\" */\n Key[\"TVInputComponent1\"] = \"TVInputComponent1\";\n /** Switches to the input \"Component 2.\" */\n Key[\"TVInputComponent2\"] = \"TVInputComponent2\";\n /** Switches to the input \"Composite 1.\" */\n Key[\"TVInputComposite1\"] = \"TVInputComposite1\";\n /** Switches to the input \"Composite 2.\" */\n Key[\"TVInputComposite2\"] = \"TVInputComposite2\";\n /** Switches to the input \"HDMI 1.\" */\n Key[\"TVInputHDMI1\"] = \"TVInputHDMI1\";\n /** Switches to the input \"HDMI 2.\" */\n Key[\"TVInputHDMI2\"] = \"TVInputHDMI2\";\n /** Switches to the input \"HDMI 3.\" */\n Key[\"TVInputHDMI3\"] = \"TVInputHDMI3\";\n /** Switches to the input \"HDMI 4.\" */\n Key[\"TVInputHDMI4\"] = \"TVInputHDMI4\";\n /** Switches to the input \"VGA 1.\" */\n Key[\"TVInputVGA1\"] = \"TVInputVGA1\";\n /** The Media Context menu key. */\n Key[\"TVMediaContext\"] = \"TVMediaContext\";\n /** Toggle the TV's network connection on and off. */\n Key[\"TVNetwork\"] = \"TVNetwork\";\n /** Put the TV into number entry mode. */\n Key[\"TVNumberEntry\"] = \"TVNumberEntry\";\n /** The device's power button. */\n Key[\"TVPower\"] = \"TVPower\";\n /** Radio button. */\n Key[\"TVRadioService\"] = \"TVRadioService\";\n /** Satellite button. */\n Key[\"TVSatellite\"] = \"TVSatellite\";\n /** Broadcast Satellite button. */\n Key[\"TVSatelliteBS\"] = \"TVSatelliteBS\";\n /** Communication Satellite button. */\n Key[\"TVSatelliteCS\"] = \"TVSatelliteCS\";\n /** Toggles among available satellites. */\n Key[\"TVSatelliteToggle\"] = \"TVSatelliteToggle\";\n /**\n * Selects analog terrestrial television service (analog cable or antenna\n * reception).\n */\n Key[\"TVTerrestrialAnalog\"] = \"TVTerrestrialAnalog\";\n /**\n * Selects digital terrestrial television service (digital cable or antenna\n * reception).\n */\n Key[\"TVTerrestrialDigital\"] = \"TVTerrestrialDigital\";\n /** Timer programming button. */\n Key[\"TVTimer\"] = \"TVTimer\";\n /** Changes the input mode on an external audio/video receiver (AVR) unit. */\n Key[\"AVRInput\"] = \"AVRInput\";\n /** Toggles the power on an external AVR unit. */\n Key[\"AVRPower\"] = \"AVRPower\";\n /**\n * General-purpose media function key, color-coded red. This has index\n * 0 among the colored keys.\n */\n Key[\"ColorF0Red\"] = \"ColorF0Red\";\n /**\n * General-purpose media function key, color-coded green. This has index\n * 1 among the colored keys.\n */\n Key[\"ColorF1Green\"] = \"ColorF1Green\";\n /**\n * General-purpose media function key, color-coded yellow. This has index\n * 2 among the colored keys.\n */\n Key[\"ColorF2Yellow\"] = \"ColorF2Yellow\";\n /**\n * General-purpose media function key, color-coded blue. This has index\n * 3 among the colored keys.\n */\n Key[\"ColorF3Blue\"] = \"ColorF3Blue\";\n /**\n * General-purpose media function key, color-coded grey. This has index\n * 4 among the colored keys.\n */\n Key[\"ColorF4Grey\"] = \"ColorF4Grey\";\n /**\n * General-purpose media function key, color-coded brown. This has index\n * 5 among the colored keys.\n */\n Key[\"ColorF5Brown\"] = \"ColorF5Brown\";\n /** Toggles closed captioning on and off. */\n Key[\"ClosedCaptionToggle\"] = \"ClosedCaptionToggle\";\n /**\n * Adjusts the brightness of the device by toggling between two brightness\n * levels or by cycling among multiple brightness levels.\n */\n Key[\"Dimmer\"] = \"Dimmer\";\n /** Cycles among video sources. */\n Key[\"DisplaySwap\"] = \"DisplaySwap\";\n /** Switches the input source to the Digital Video Recorder (DVR). */\n Key[\"DVR\"] = \"DVR\";\n /** The Exit button, which exits the current application or menu. */\n Key[\"Exit\"] = \"Exit\";\n /** Clears the program or content stored in the first favorites list slot. */\n Key[\"FavoriteClear0\"] = \"FavoriteClear0\";\n /** Clears the program or content stored in the second favorites list slot. */\n Key[\"FavoriteClear1\"] = \"FavoriteClear1\";\n /** Clears the program or content stored in the third favorites list slot. */\n Key[\"FavoriteClear2\"] = \"FavoriteClear2\";\n /** Clears the program or content stored in the fourth favorites list slot. */\n Key[\"FavoriteClear3\"] = \"FavoriteClear3\";\n /**\n * Selects (recalls) the program or content stored in the first favorites\n * list slot.\n */\n Key[\"FavoriteRecall0\"] = \"FavoriteRecall0\";\n /**\n * Selects (recalls) the program or content stored in the second favorites\n * list slot.\n */\n Key[\"FavoriteRecall1\"] = \"FavoriteRecall1\";\n /**\n * Selects (recalls) the program or content stored in the third favorites\n * list slot.\n */\n Key[\"FavoriteRecall2\"] = \"FavoriteRecall2\";\n /**\n * Selects (recalls) the program or content stored in the fourth favorites\n * list slot.\n */\n Key[\"FavoriteRecall3\"] = \"FavoriteRecall3\";\n /**\n * Stores the current program or content into the first favorites list\n * slot.\n */\n Key[\"FavoriteStore0\"] = \"FavoriteStore0\";\n /**\n * Stores the current program or content into the second favorites list\n * slot.\n */\n Key[\"FavoriteStore1\"] = \"FavoriteStore1\";\n /**\n * Stores the current program or content into the third favorites list\n * slot.\n */\n Key[\"FavoriteStore2\"] = \"FavoriteStore2\";\n /**\n * Stores the current program or content into the fourth favorites list\n * slot.\n */\n Key[\"FavoriteStore3\"] = \"FavoriteStore3\";\n /** Toggles the display of the program or content guide. */\n Key[\"Guide\"] = \"Guide\";\n /**\n * If the guide is currently displayed, this button tells the guide to\n * display the next day's content.\n */\n Key[\"GuideNextDay\"] = \"GuideNextDay\";\n /**\n * If the guide is currently displayed, this button tells the guide to\n * display the previous day's content.\n */\n Key[\"GuidePreviousDay\"] = \"GuidePreviousDay\";\n /**\n * Toggles the display of information about the currently selected content,\n * program, or media.\n */\n Key[\"Info\"] = \"Info\";\n /**\n * Tells the device to perform an instant replay (typically some form of\n * jumping back a short amount of time then playing it again, possibly but\n * not usually in slow motion).\n */\n Key[\"InstantReplay\"] = \"InstantReplay\";\n /** Opens content linked to the current program, if available and possible. */\n Key[\"Link\"] = \"Link\";\n /** Lists the current program. */\n Key[\"ListProgram\"] = \"ListProgram\";\n /** Toggles a display listing currently available live content or programs. */\n Key[\"LiveContent\"] = \"LiveContent\";\n /** Locks or unlocks the currently selected content or pgoram. */\n Key[\"Lock\"] = \"Lock\";\n /**\n * Presents a list of media applications, such as photo viewers, audio and\n * video players, and games. [1]\n */\n Key[\"MediaApps\"] = \"MediaApps\";\n /** The Audio Track key. */\n Key[\"MediaAudioTrack\"] = \"MediaAudioTrack\";\n /** Jumps back to the last-viewed content, program, or other media. */\n Key[\"MediaLast\"] = \"MediaLast\";\n /** Skips backward to the previous content or program. */\n Key[\"MediaSkipBackward\"] = \"MediaSkipBackward\";\n /** Skips forward to the next content or program. */\n Key[\"MediaSkipForward\"] = \"MediaSkipForward\";\n /** Steps backward to the previous content or program. */\n Key[\"MediaStepBackward\"] = \"MediaStepBackward\";\n /** Steps forward to the next content or program. */\n Key[\"MediaStepForward\"] = \"MediaStepForward\";\n /**\n * Top Menu button. Opens the media's main menu (e.g., for a DVD or Blu-Ray\n * disc).\n */\n Key[\"MediaTopMenu\"] = \"MediaTopMenu\";\n /** Navigates into a submenu or option. */\n Key[\"NavigateIn\"] = \"NavigateIn\";\n /** Navigates to the next item. */\n Key[\"NavigateNext\"] = \"NavigateNext\";\n /** Navigates out of the current screen or menu. */\n Key[\"NavigateOut\"] = \"NavigateOut\";\n /** Navigates to the previous item. */\n Key[\"NavigatePrevious\"] = \"NavigatePrevious\";\n /** Cycles to the next channel in the favorites list. */\n Key[\"NextFavoriteChannel\"] = \"NextFavoriteChannel\";\n /**\n * Cycles to the next saved user profile, if this feature is supported and\n * multiple profiles exist.\n */\n Key[\"NextUserProfile\"] = \"NextUserProfile\";\n /**\n * Opens the user interface for selecting on demand content or programs to\n * watch.\n */\n Key[\"OnDemand\"] = \"OnDemand\";\n /** Starts the process of pairing the remote with a device to be controlled. */\n Key[\"Pairing\"] = \"Pairing\";\n /** A button to move the picture-in-picture view downward. */\n Key[\"PinPDown\"] = \"PinPDown\";\n /** A button to control moving the picture-in-picture view. */\n Key[\"PinPMove\"] = \"PinPMove\";\n /** Toggles display of the picture-in-picture view on and off. */\n Key[\"PinPToggle\"] = \"PinPToggle\";\n /** A button to move the picture-in-picture view upward. */\n Key[\"PinPUp\"] = \"PinPUp\";\n /** Decreases the media playback rate. */\n Key[\"PlaySpeedDown\"] = \"PlaySpeedDown\";\n /** Returns the media playback rate to normal. */\n Key[\"PlaySpeedReset\"] = \"PlaySpeedReset\";\n /** Increases the media playback rate. */\n Key[\"PlaySpeedUp\"] = \"PlaySpeedUp\";\n /** Toggles random media (also known as \"shuffle mode\") on and off. */\n Key[\"RandomToggle\"] = \"RandomToggle\";\n /**\n * A code sent when the remote control's battery is low. This doesn't\n * actually correspond to a physical key at all.\n */\n Key[\"RcLowBattery\"] = \"RcLowBattery\";\n /** Cycles among the available media recording speeds. */\n Key[\"RecordSpeedNext\"] = \"RecordSpeedNext\";\n /**\n * Toggles radio frequency (RF) input bypass mode on and off. RF bypass\n * mode passes RF input directly to the RF output without any processing or\n * filtering.\n */\n Key[\"RfBypass\"] = \"RfBypass\";\n /**\n * Toggles the channel scan mode on and off. This is a mode which flips\n * through channels automatically until the user stops the scan.\n */\n Key[\"ScanChannelsToggle\"] = \"ScanChannelsToggle\";\n /** Cycles through the available screen display modes. */\n Key[\"ScreenModeNext\"] = \"ScreenModeNext\";\n /** Toggles display of the device's settings screen on and off. */\n Key[\"Settings\"] = \"Settings\";\n /** Toggles split screen display mode on and off. */\n Key[\"SplitScreenToggle\"] = \"SplitScreenToggle\";\n /** Cycles among input modes on an external set-top box (STB). */\n Key[\"STBInput\"] = \"STBInput\";\n /** Toggles on and off an external STB. */\n Key[\"STBPower\"] = \"STBPower\";\n /** Toggles the display of subtitles on and off if they're available. */\n Key[\"Subtitle\"] = \"Subtitle\";\n /**\n * Toggles display of [teletext](https://en.wikipedia.org/wiki/Teletext),\n * if available.\n */\n Key[\"Teletext\"] = \"Teletext\";\n /** Cycles through the available video modes. */\n Key[\"VideoModeNext\"] = \"VideoModeNext\";\n /**\n * Causes the device to identify itself in some fashion, such as by\n * flashing a light, briefly changing the brightness of indicator lights,\n * or emitting a tone.\n */\n Key[\"Wink\"] = \"Wink\";\n /**\n * Toggles between fullscreen and scaled content display, or otherwise\n * change the magnification level.\n */\n Key[\"ZoomToggle\"] = \"ZoomToggle\";\n /**\n * Presents a list of possible corrections for a word which was incorrectly\n * identified.\n */\n Key[\"SpeechCorrectionList\"] = \"SpeechCorrectionList\";\n /**\n * Toggles between dictation mode and command/control mode. This lets the\n * speech engine know whether to interpret spoken words as input text or as\n * commands.\n */\n Key[\"SpeechInputToggle\"] = \"SpeechInputToggle\";\n /** Closes the current document or message. Must not exit the application. */\n Key[\"Close\"] = \"Close\";\n /** Creates a new document or message. */\n Key[\"New\"] = \"New\";\n /** Opens an existing document or message. */\n Key[\"Open\"] = \"Open\";\n /** Prints the current document or message. */\n Key[\"Print\"] = \"Print\";\n /** Saves the current document or message. */\n Key[\"Save\"] = \"Save\";\n /** Starts spell checking the current document. */\n Key[\"SpellCheck\"] = \"SpellCheck\";\n /** Opens the user interface to forward a message. */\n Key[\"MailForward\"] = \"MailForward\";\n /** Opens the user interface to reply to a message. */\n Key[\"MailReply\"] = \"MailReply\";\n /** Sends the current message. */\n Key[\"MailSend\"] = \"MailSend\";\n /**\n * The Calculator key, often labeled with an icon. This is often\n * used as a generic application launcher key\n * (APPCOMMAND_LAUNCH_APP2).\n */\n Key[\"LaunchCalculator\"] = \"LaunchCalculator\";\n /** The Calendar key. Often labeled with an icon. */\n Key[\"LaunchCalendar\"] = \"LaunchCalendar\";\n /** The Contacts key. */\n Key[\"LaunchContacts\"] = \"LaunchContacts\";\n /** The Mail key. Often labeled with an icon. */\n Key[\"LaunchMail\"] = \"LaunchMail\";\n /** The Media Player key. */\n Key[\"LaunchMediaPlayer\"] = \"LaunchMediaPlayer\";\n /** The Music Player key. Often labeled with an icon. */\n Key[\"LaunchMusicPlayer\"] = \"LaunchMusicPlayer\";\n /**\n * The My Computer key on Windows keyboards. This is often used\n * as a generic application launcher key\n * (APPCOMMAND_LAUNCH_APP1).\n */\n Key[\"LaunchMyComputer\"] = \"LaunchMyComputer\";\n /**\n * The Phone key. Opens the phone dialer application (if one is\n * present).\n */\n Key[\"LaunchPhone\"] = \"LaunchPhone\";\n /** The Screen Saver key. */\n Key[\"LaunchScreenSaver\"] = \"LaunchScreenSaver\";\n /** The Spreadsheet key. This key may be labeled with an icon. */\n Key[\"LaunchSpreadsheet\"] = \"LaunchSpreadsheet\";\n /**\n * The Web Browser key. This key is frequently labeled with an\n * icon.\n */\n Key[\"LaunchWebBrowser\"] = \"LaunchWebBrowser\";\n /** The WebCam key. Opens the webcam application. */\n Key[\"LaunchWebCam\"] = \"LaunchWebCam\";\n /**\n * The Word Processor key. This may be an icon of a specific\n * word processor application, or a generic document icon.\n */\n Key[\"LaunchWordProcessor\"] = \"LaunchWordProcessor\";\n /** The first generic application launcher button. */\n Key[\"LaunchApplication1\"] = \"LaunchApplication1\";\n /** The second generic application launcher button. */\n Key[\"LaunchApplication2\"] = \"LaunchApplication2\";\n /** The third generic application launcher button. */\n Key[\"LaunchApplication3\"] = \"LaunchApplication3\";\n /** The fourth generic application launcher button. */\n Key[\"LaunchApplication4\"] = \"LaunchApplication4\";\n /** The fifth generic application launcher button. */\n Key[\"LaunchApplication5\"] = \"LaunchApplication5\";\n /** The sixth generic application launcher button. */\n Key[\"LaunchApplication6\"] = \"LaunchApplication6\";\n /** The seventh generic application launcher button. */\n Key[\"LaunchApplication7\"] = \"LaunchApplication7\";\n /** The eighth generic application launcher button. */\n Key[\"LaunchApplication8\"] = \"LaunchApplication8\";\n /** The ninth generic application launcher button. */\n Key[\"LaunchApplication9\"] = \"LaunchApplication9\";\n /** The 10th generic application launcher button. */\n Key[\"LaunchApplication10\"] = \"LaunchApplication10\";\n /** The 11th generic application launcher button. */\n Key[\"LaunchApplication11\"] = \"LaunchApplication11\";\n /** The 12th generic application launcher button. */\n Key[\"LaunchApplication12\"] = \"LaunchApplication12\";\n /** The 13th generic application launcher button. */\n Key[\"LaunchApplication13\"] = \"LaunchApplication13\";\n /** The 14th generic application launcher button. */\n Key[\"LaunchApplication14\"] = \"LaunchApplication14\";\n /** The 15th generic application launcher button. */\n Key[\"LaunchApplication15\"] = \"LaunchApplication15\";\n /** The 16th generic application launcher button. */\n Key[\"LaunchApplication16\"] = \"LaunchApplication16\";\n /**\n * Navigates to the previous content or page in the current Web view's\n * history.\n */\n Key[\"BrowserBack\"] = \"BrowserBack\";\n /** Opens the user's list of bookmarks/favorites. */\n Key[\"BrowserFavorites\"] = \"BrowserFavorites\";\n /** Navigates to the next content or page in the current Web view's history. */\n Key[\"BrowserForward\"] = \"BrowserForward\";\n /** Navigates to the user's preferred home page. */\n Key[\"BrowserHome\"] = \"BrowserHome\";\n /** Refreshes the current page or content. */\n Key[\"BrowserRefresh\"] = \"BrowserRefresh\";\n /**\n * Activates the user's preferred search engine or the search interface\n * within their browser.\n */\n Key[\"BrowserSearch\"] = \"BrowserSearch\";\n /** Stops loading the currently displayed Web view or content. */\n Key[\"BrowserStop\"] = \"BrowserStop\";\n /**\n * The decimal point key (typically . or\n * , depending on the region).\n * In newer browsers, this value to be the character generated by the\n * decimal key (one of those two characters). [1]\n */\n Key[\"Decimal\"] = \"Decimal\";\n /** The 11 key found on certain media numeric keypads. */\n Key[\"Key11\"] = \"Key11\";\n /** The 12 key found on certain media numeric keypads. */\n Key[\"Key12\"] = \"Key12\";\n /** The numeric keypad's multiplication key, *. */\n Key[\"Multiply\"] = \"Multiply\";\n /** The numeric keypad's addition key, +. */\n Key[\"Add\"] = \"Add\";\n /** The numeric keypad's division key, /. */\n Key[\"Divide\"] = \"Divide\";\n /** The numeric keypad's subtraction key, -. */\n Key[\"Subtract\"] = \"Subtract\";\n /**\n * The numeric keypad's places separator character.\n * (In the United States this is a comma, but elsewhere it is frequently\n * a period.)\n */\n Key[\"Separator\"] = \"Separator\";\n})(Key = exports.Key || (exports.Key = {}));\n","import { Filter, Origin, type Selection, type User } from '@annotorious/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport hotkeys from 'hotkeys-js';\nimport { Key } from 'ts-key-enum';\nimport type { TextAnnotatorState } from './state';\nimport type { TextAnnotationTarget } from './model';\nimport {\n clonePointerEvent,\n cloneKeyboardEvent,\n debounce,\n splitAnnotatableRanges,\n rangeToSelector,\n isWhitespaceOrEmpty,\n NOT_ANNOTATABLE_SELECTOR\n} from './utils';\n\nexport const createSelectionHandler = (\n container: HTMLElement,\n state: TextAnnotatorState,\n offsetReferenceSelector?: string\n) => {\n\n let currentUser: User | undefined;\n\n const setUser = (user?: User) => currentUser = user;\n\n let currentFilter: Filter | undefined;\n\n const setFilter = (filter?: Filter) => currentFilter = filter;\n\n let currentAnnotatingEnabled = true;\n\n const setAnnotatingEnabled = (enabled: boolean) => currentAnnotatingEnabled = enabled;\n\n const { store, selection } = state;\n\n let currentTarget: TextAnnotationTarget | undefined;\n\n let isLeftClick: boolean | undefined;\n\n let lastDownEvent: Selection['event'] | undefined;\n\n const onSelectStart = (evt: Event) => {\n if (!currentAnnotatingEnabled) return;\n\n if (isLeftClick === false)\n return;\n\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 */\n const annotatable = !(evt.target as Node).parentElement?.closest(NOT_ANNOTATABLE_SELECTOR);\n\n currentTarget = annotatable ? {\n annotation: uuidv4(),\n selector: [],\n creator: currentUser,\n created: new Date()\n } : undefined;\n }\n\n container.addEventListener('selectstart', onSelectStart);\n\n const onSelectionChange = debounce((evt: Event) => {\n if (!currentAnnotatingEnabled) return;\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 - (lastDownEvent?.timeStamp || evt.timeStamp) < 1000 && !currentTarget) {\n onSelectStart(lastDownEvent || evt);\n }\n\n if (sel.isCollapsed || !currentTarget || isLeftClick === false)\n return;\n\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 }, Origin.LOCAL);\n\n // ...then make the new annotation the current selection\n selection.userSelect(currentTarget.annotation, lastDownEvent);\n }\n })\n\n document.addEventListener('selectionchange', onSelectionChange);\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 */\n const onPointerDown = (evt: PointerEvent) => {\n /**\n * Cloning the event to prevent it from accidentally being `undefined`\n * @see https://github.com/recogito/text-annotator-js/commit/65d13f3108c429311cf8c2523f6babbbc946013d#r144033948\n */\n lastDownEvent = clonePointerEvent(evt);\n isLeftClick = lastDownEvent.button === 0;\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\n const userSelect = () => {\n const { x, y } = container.getBoundingClientRect();\n\n const hovered = store.getAt(evt.clientX - x, evt.clientY - y, currentFilter);\n if (hovered) {\n const { selected } = selection;\n\n if (selected.length !== 1 || selected[0].id !== hovered.id)\n selection.userSelect(hovered.id, evt);\n } else if (!selection.isEmpty()) {\n selection.clear();\n }\n }\n\n const timeDifference = evt.timeStamp - lastDownEvent.timeStamp;\n\n // Just a click, not a selection\n if (document.getSelection().isCollapsed && timeDifference < 300) {\n currentTarget = undefined;\n userSelect();\n } else if (currentTarget) {\n selection.userSelect(currentTarget.annotation, evt);\n }\n }\n document.addEventListener('pointerup', onPointerUp);\n\n /**\n * Track arbitrary keydown events to use them during\n * the `selectionchange` annotation selection.\n */\n hotkeys('*', { element: container, keyup: false, keydown: true }, (evt, handler) => {\n if (!evt.repeat) {\n lastDownEvent = cloneKeyboardEvent(evt);\n }\n });\n\n /**\n * Track the \"Shift\" key lift which signifies the end of a select operation.\n * Unfortunately, we cannot track modifier key immediately, so the wildcard is used.\n */\n hotkeys('*', { keyup: true, keydown: false }, (evt) => {\n if (hotkeys.shift && evt.key === Key.Shift) {\n if (!evt.repeat && currentTarget) {\n selection.userSelect(currentTarget.annotation, evt);\n }\n }\n });\n\n /**\n * Track the \"select all\" command on lifting the keys.\n * Unfortunately, system-related shortcuts can be captured\n * only on `keydown` event, so an additional flag is used.\n */\n let selectAllCaptured = false;\n hotkeys('ctrl+a, ⌘+a', { keyup: false, keydown: true }, () => {\n selectAllCaptured = true;\n });\n hotkeys('*', { keyup: true, keydown: false }, (evt) => {\n if (selectAllCaptured) {\n if (!evt.repeat && currentTarget) {\n selection.userSelect(currentTarget.annotation, evt);\n }\n }\n selectAllCaptured = false;\n });\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 hotkeys.unbind();\n }\n\n return {\n destroy,\n setFilter,\n setUser,\n setAnnotatingEnabled\n }\n\n}\n\n","import {\n createAnonymousGuest,\n createLifecycleObserver,\n createBaseAnnotator,\n Filter,\n createUndoStack\n} from '@annotorious/core';\nimport type { Annotator, User, PresenceProvider } from '@annotorious/core';\nimport {\n createCanvasRenderer,\n createHighlightsRenderer,\n createSpansRenderer,\n type HighlightStyleExpression\n} from './highlight';\nimport { createPresencePainter } from './presence';\nimport { scrollIntoView } from './api';\nimport { TextAnnotationStore, TextAnnotatorState, createTextAnnotatorState } from './state';\nimport type { TextAnnotation } from './model';\nimport { cancelSingleClickEvents, programmaticallyFocusable } from './utils';\nimport { fillDefaults, type RendererType, type TextAnnotatorOptions } from './TextAnnotatorOptions';\nimport { createSelectionHandler } 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 redraw(force?: boolean): void;\n\n // Returns true if successful (or false if the annotation is not currently rendered)\n scrollIntoView(annotation: TextAnnotation): boolean;\n\n setAnnotatingEnabled: (enabled: boolean) => void;\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 // Make sure that the container is focusable and can receive both pointer and keyboard events\n programmaticallyFocusable(container);\n\n const opts = fillDefaults<E>(options, {\n annotatingEnabled: true,\n user: createAnonymousGuest()\n });\n\n const state: TextAnnotatorState = createTextAnnotatorState(container, opts.userSelectAction);\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 = opts.user;\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 = createSelectionHandler(container, state, opts.offsetReferenceSelector);\n selectionHandler.setUser(currentUser);\n selectionHandler.setAnnotatingEnabled(opts.annotatingEnabled);\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 setAnnotatingEnabled = (enabled: boolean) => {\n selectionHandler.setAnnotatingEnabled(enabled);\n };\n\n const setFilter = (filter?: Filter) => {\n highlightRenderer.setFilter(filter);\n selectionHandler.setFilter(filter);\n };\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 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 setAnnotatingEnabled,\n setFilter,\n setStyle: highlightRenderer.setStyle.bind(highlightRenderer),\n redraw: highlightRenderer.redraw.bind(highlightRenderer),\n setUser,\n setSelected,\n setPresenceProvider,\n setVisible: highlightRenderer.setVisible.bind(highlightRenderer),\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","programmaticallyFocusable","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","toDomRectList","i","rangeToSelector","quote","start","end","reviveSelector","iterator","runningOffset","startCounting","len","reviveTarget","target","reviveAnnotation","annotation","normalizeRectWithOffset","rect","offset","denormalizeRectWithOffset","clonePointerEvent","cloneKeyboardEvent","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","h","offsetRects","underlineOffset","createCanvasRenderer","t","e","u","o","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","all","intersects","getLength","total","intersecting","highlightLayer","shouldRedraw","span","createSpansRenderer","byteToHex","unsafeStringify","arr","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","B","z","k","Y","Ce","F","V","Ue","U","P","L","O","E","_","J","Q","X","Z","W","K","Se","ee","te","ne","oe","q","S","ie","de","re","Oe","C","T","I","A","R","G","ae","De","Re","Be","ce","Ie","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","createNanoEvents","callbacks","cb","createSpatialTree","tree","emitter","toItems","revivedRange","clear","insert","remove","update","set","targets","replace","rectsByTarget","allRects","getAt","hits","getAnnotationBounds","getAnnotationRects","indexed","annotationIds","callback","createTextAnnotatorState","defaultUserSelectAction","createStore","createSelectionState","createHoverState","createViewportState","addAnnotation","origin","Origin","revived","isValid","bulkAddAnnotation","couldNotRevive","bulkUpsertAnnotations","updateTarget","bulkUpdateTargets","filtered","buffer","match","recalculatePositions","onRecalculatePositions","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","isff","addEvent","object","method","useCapture","removeEvent","getMods","modifier","key","mods","getKeys","keys","compareArray","a1","a2","arr1","arr2","isIndex","_keyMap","_modifier","modifierMap","_mods","_handlers","_downKeys","winListendFocus","_scope","elementEventMap","code","getKey","getModifier","setScope","scope","getScope","getPressedKeyCodes","getPressedKeyString","getAllKeyCodes","_ref","shortcut","tagName","flag","isInput","isPressed","keyCode","deleteScope","newScope","handlers","_ref2","element","removeKeyEvent","clearModifier","hotkeys","unbind","keysInfo","info","eachUnbind","_len","_key","_ref3","splitKey","originKey","unbindKeys","lastKey","unbindElements","isUnbind","eventHandler","handler","modifiersMatch","dispatch","asterisk","keyName","keyNum","handlerKey","keyLen","keyShortcut","_downKeysCurrent","option","keyup","keydown","capture","single","keydownListener","keyupListenr","listener","trigger","values","_ref4","_api","_hotkeys","deep","exports","Key","createSelectionHandler","currentUser","setUser","currentAnnotatingEnabled","setAnnotatingEnabled","enabled","currentTarget","isLeftClick","lastDownEvent","onSelectStart","evt","onSelectionChange","sel","selectionRange","onPointerDown","onPointerUp","userSelect","timeDifference","selectAllCaptured","USE_DEFAULT_RENDERER","createTextAnnotator","createAnonymousGuest","undoStack","createUndoStack","lifecycle","createLifecycleObserver","useRenderer","highlightRenderer","selectionHandler","createBaseAnnotator","getUser","setPresenceProvider","setSelected","arg"],"mappings":"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","x_google_ignoreList":[21,23,25,26,27,28,29,31,32,33,39,40]}