@recogito/react-text-annotator 4.2.0 → 4.2.2
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":"react-text-annotator.es.js","sources":["../src/tei/ceteicean.tsx","../src/tei/tei-annotator.tsx","../src/hooks/use-annotation-quote-idle.ts","../src/text-annotator.tsx","../src/text-annotation-popup/is-mobile.ts","../src/text-annotation-popup/text-annotation-popup.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport CETEI from 'CETEIcean';\n\ninterface CETEIceanProps {\n\n initArgs?: any;\n\n tei?: string;\n\n onLoad?(element: Element): void;\n\n behaviors?: any;\n\n}\n\n// Override default list, note, table, and ref behaviors \n// so they don't introduce text into the DOM that interferes\n// with annotation. Apply a patch to graphics for robustness.\nconst PRESET_BEHAVIORS = {\n tei: {\n ref: (elem: Element) => {\n const a = document.createElement('a');\n\n while(elem.firstChild) {\n a.appendChild(elem.removeChild(elem.firstChild));\n }\n\n a.setAttribute('href', elem.getAttribute('target')!);\n\n elem.appendChild(a);\n },\n // Cf. https://github.com/TEIC/CETEIcean/issues/67\n graphic: (elem: Element) => {\n const content = new Image();\n content.src = elem.getAttribute('url')?.trim()!;\n\n if (elem.hasAttribute('width'))\n content.setAttribute('width', elem.getAttribute('width')!);\n\n if (elem.hasAttribute('height'))\n content.setAttribute('height', elem.getAttribute('height')!);\n\n elem.appendChild(content);\n },\n list: null,\n note: null,\n table: null,\n teiHeader: (elem: HTMLElement) => {\n elem.hidden = true;\n }\n }\n}\n\nexport const CETEIcean = (props: CETEIceanProps) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (props.tei) {\n const ceteicean = new CETEI(props.initArgs);\n\n ceteicean.addBehaviors({\n ...PRESET_BEHAVIORS,\n ...(props.behaviors || {}),\n tei: {\n ...PRESET_BEHAVIORS.tei,\n ...(props.behaviors?.tei || {})\n }\n });\n\n ceteicean.makeHTML5(props.tei, (data: Element) => {\n el.current?.appendChild(data);\n props.onLoad?.(el.current!);\n });\n }\n\n return () => {\n if (el.current)\n el.current.innerHTML = '';\n }\n }, [props.tei, JSON.stringify(props.initArgs), props.onLoad]);\n\n return (\n <div \n ref={el}\n className=\"tei-container\" />\n )\n\n}","import { Children, JSX, ReactElement, ReactNode, cloneElement, useCallback, useContext, useEffect } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport { createTEIAnnotator } from '@recogito/text-annotator-tei';\nimport type { AnnotatingMode, TextAnnotatorOptions } from '@recogito/text-annotator';\n\nimport '@recogito/text-annotator/text-annotator.css';\n\nexport type TEIAnnotatorProps = TextAnnotatorOptions & {\n\n children?: ReactNode | JSX.Element;\n\n annotatingMode?: AnnotatingMode;\n\n filter?: Filter;\n\n}\n\nexport const TEIAnnotator = (props: TEIAnnotatorProps) => {\n\n const { children, ...opts } = props;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n const onLoad = useCallback((element: HTMLElement) => {\n // @ts-ignore\n const anno = createTEIAnnotator(element, opts);\n setAnno(anno);\n }, []);\n\n useEffect(() => anno?.setStyle(props.style), [anno, props.style]);\n\n useEffect(() => anno?.setFilter(props.filter), [anno, props.filter]);\n\n useEffect(() => anno?.setUser(opts.user), [anno, opts.user]);\n\n useEffect(() => anno?.setAnnotatingEnabled(opts.annotatingEnabled), [anno, opts.annotatingEnabled]);\n\n useEffect(() => anno?.setAnnotatingMode(opts.annotatingMode), [anno, opts.annotatingMode]);\n\n return props.children ? (\n <>\n {Children.toArray(props.children).map(child => \n cloneElement(child as ReactElement, { onLoad } as any))}\n </>\n ) : null;\n\n}\n","import { useEffect, useState } from 'react';\nimport { Origin, useAnnotationStore } from '@annotorious/react';\nimport { Ignore, type StoreChangeEvent } from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationStore, TextAnnotationTarget } from '@recogito/text-annotator';\n\nexport const useAnnotationQuoteIdle = (\n annotationId: string | undefined,\n options: { timeout: number } = { timeout: 250 }\n) => {\n const store = useAnnotationStore<TextAnnotationStore>();\n\n const [isIdle, setIsIdle] = useState(true);\n\n useEffect(() => {\n if (!store || !annotationId) return;\n\n let idleTimeout: ReturnType<typeof setTimeout>;\n\n const scheduleSetIsIdle = (event: StoreChangeEvent<TextAnnotation>) => {\n const { changes: { updated } } = event;\n\n const hasChanged = updated?.some(update => {\n const { targetUpdated } = update;\n if (targetUpdated) {\n const { oldTarget, newTarget } = targetUpdated;\n return hasQuoteChanged(oldTarget, newTarget);\n }\n });\n\n if (hasChanged) {\n setIsIdle(false);\n clearTimeout(idleTimeout);\n idleTimeout = setTimeout(() => setIsIdle(true), options.timeout);\n }\n };\n\n store.observe(scheduleSetIsIdle, {\n annotations: annotationId,\n ignore: Ignore.BODY_ONLY,\n origin: Origin.LOCAL\n });\n\n return () => {\n clearTimeout(idleTimeout);\n store.unobserve(scheduleSetIsIdle);\n };\n }, [store, annotationId, options.timeout]);\n\n return isIdle;\n};\n\nconst hasQuoteChanged = (oldValue: TextAnnotationTarget, newValue: TextAnnotationTarget) => {\n const { selector: oldSelector } = oldValue;\n const oldQuotes = oldSelector.map(({ quote }) => quote);\n\n const { selector: newSelector } = newValue;\n const newQuotes = newSelector.map(({ quote }) => quote);\n\n return oldQuotes.join() !== newQuotes.join();\n};\n","import { JSX, ReactNode, useContext, useEffect, useRef } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport type { FormatAdapter } from '@annotorious/core';\nimport { createTextAnnotator } from '@recogito/text-annotator';\nimport type { AnnotatingMode, TextAnnotation, TextAnnotatorOptions } from '@recogito/text-annotator';\n\nimport '@recogito/text-annotator/text-annotator.css';\n\nexport interface TextAnnotatorProps<I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation> extends Omit<TextAnnotatorOptions<I, E>, 'adapter'> {\n\n children?: ReactNode | JSX.Element;\n\n adapter?: FormatAdapter<I, E> | ((container: HTMLElement) => FormatAdapter<I, E>);\n\n annotatingMode?: AnnotatingMode;\n\n filter?: Filter<I>;\n\n className?: string;\n\n}\n\nexport const TextAnnotator = <I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation>(\n props: TextAnnotatorProps<I, E>\n) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n const { className, children, ...opts } = props;\n\n const { style, filter, user, annotatingEnabled, userSelectAction, annotatingMode } = opts;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n useEffect(() => {\n if (!setAnno || !el.current) return;\n\n const adapter = typeof opts.adapter === 'function' ? opts.adapter(el.current) : opts.adapter;\n\n const anno = createTextAnnotator(el.current!, { ...opts, adapter });\n setAnno(anno);\n\n return () => anno.destroy();\n }, [setAnno]);\n\n useEffect(() => anno?.setStyle(style), [anno, style]);\n\n useEffect(() => anno?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setUser(user), [anno, user]);\n\n useEffect(() => anno?.setUserSelectAction(userSelectAction), [anno, userSelectAction]);\n\n useEffect(() => anno?.setAnnotatingEnabled(annotatingEnabled), [anno, annotatingEnabled]);\n\n useEffect(() => anno?.setAnnotatingMode(annotatingMode), [anno, annotatingMode]);\n\n return (\n <div ref={el} className={`r6o-annotatable no-focus-outline ${className}`}>\n {children}\n </div>\n );\n\n}\n","// https://stackoverflow.com/questions/21741841/detecting-ios-android-operating-system\nexport const isMobile = () => {\n if (typeof navigator === 'undefined') return false;\n\n // @ts-ignore\n var userAgent: string = navigator.userAgent || navigator.vendor || window?.opera;\n\n if (/android/i.test(userAgent)) \n return true;\n\n // @ts-ignore\n // Note: as of recently, this NO LONGER DETECTS FIREFOX ON iOS!\n // This means FF/iOS will behave like on the desktop, and loose\n // selection handlebars after the popup opens.\n if (/iPad|iPhone/.test(userAgent) && !window.MSStream)\n return true;\n\n return false;\n}","import { ReactNode, useEffect, useRef, useState } from 'react';\nimport debounce from 'debounce';\nimport { useAnnotator, useSelection } from '@annotorious/react';\nimport {\n NOT_ANNOTATABLE_CLASS,\n TextAnnotationStore,\n toViewportBounds,\n toDomRectList,\n type TextAnnotation,\n type TextAnnotator,\n} from '@recogito/text-annotator';\nimport {\n arrow,\n autoUpdate,\n flip,\n FloatingArrow,\n FloatingArrowProps,\n FloatingFocusManager,\n FloatingPortal,\n inline,\n offset,\n Placement,\n shift,\n useFloating\n} from '@floating-ui/react';\nimport { isMobile } from './is-mobile';\nimport { useAnnotationQuoteIdle } from '../hooks';\n\nimport './text-annotation-popup.css';\n\ninterface TextAnnotationPopupProps {\n\n ariaCloseWarning?: string;\n\n arrow?: boolean;\n\n arrowProps?: Omit<FloatingArrowProps, 'context' | 'ref'>;\n\n asPortal?: boolean;\n\n autoFocus?: boolean;\n\n placement?: Placement;\n\n popup(props: TextAnnotationPopupContentProps): ReactNode;\n\n onClose?(): void;\n\n}\n\nexport interface TextAnnotationPopupContentProps<T extends TextAnnotation = TextAnnotation> {\n\n annotation: T;\n\n selected: { annotation: T; editable?: boolean; }[];\n\n editable?: boolean;\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nlet cachedBounds: DOMRect | null = null;\n\nconst updateViewportBounds = debounce((annotationId: string, store: TextAnnotationStore, container: HTMLElement) => {\n requestAnimationFrame(() => {\n const bounds = store.getAnnotationBounds(annotationId);\n if (!bounds) return;\n cachedBounds = toViewportBounds(bounds, container.getBoundingClientRect());\n });\n}, 250);\n\nexport const TextAnnotationPopup = (props: TextAnnotationPopupProps) => {\n\n const r = useAnnotator<TextAnnotator>();\n\n const { selected, event } = useSelection<TextAnnotation>();\n\n const annotation = selected[0]?.annotation;\n\n const isAnnotationQuoteIdle = useAnnotationQuoteIdle(annotation?.id);\n\n const [isOpen, setOpen] = useState(selected?.length > 0);\n\n // So we can reliably trigger the onClose callback\n const wasOpenRef = useRef(false);\n\n const arrowRef = useRef(null);\n\n const { refs, floatingStyles, update, context } = useFloating({\n placement: isMobile() ? 'bottom' : props.placement || 'top',\n strategy: 'absolute',\n open: isOpen,\n onOpenChange: (open, _event, reason) => {\n if (!open && (reason === 'escape-key' || reason === 'focus-out')) {\n setOpen(open);\n r?.cancelSelected();\n }\n },\n middleware: [\n inline(),\n offset(10),\n flip({ crossAxis: true }),\n shift({ crossAxis: true, padding: 10, }),\n arrow({ element: arrowRef })\n ],\n whileElementsMounted: autoUpdate\n });\n\n useEffect(() => {\n if (annotation?.id && isAnnotationQuoteIdle) {\n const bounds = r?.state.store.getAnnotationBounds(annotation.id);\n setOpen(Boolean(bounds));\n } else {\n setOpen(false);\n }\n }, [annotation?.id, annotation?.target.selector, isAnnotationQuoteIdle, r?.state.store]);\n\n useEffect(() => {\n if (!props.onClose) return;\n\n if (isOpen) {\n wasOpenRef.current = true;\n } else if (wasOpenRef.current) {\n wasOpenRef.current = false;\n props.onClose();\n }\n }, [props.onClose, isOpen]);\n\n useEffect(() => {\n if (!r) return;\n\n if (isOpen && annotation?.id) {\n refs.setPositionReference({\n getBoundingClientRect: () => {\n updateViewportBounds(annotation.id, r.state.store, r.element);\n return cachedBounds ? cachedBounds : new DOMRect();\n },\n getClientRects: () => {\n const rects = r.state.store.getAnnotationRects(annotation.id);\n const viewportRects = rects.map((rect) =>\n toViewportBounds(rect, r.element.getBoundingClientRect())\n );\n return toDomRectList(viewportRects);\n }\n });\n } else {\n refs.setPositionReference(null);\n }\n }, [isOpen, annotation?.id, annotation?.target, r]);\n\n useEffect(() => {\n if (!props.asPortal) return;\n\n const config: MutationObserverInit = { attributes: true, childList: true, subtree: true };\n\n const mutationObserver = new MutationObserver(() => update());\n mutationObserver.observe(document.body, config);\n\n window.document.addEventListener('scroll', update, true);\n\n return () => {\n mutationObserver.disconnect();\n window.document.removeEventListener('scroll', update, true);\n };\n }, [update, props.asPortal]);\n\n const onClose = () => r?.cancelSelected();\n\n return isOpen && annotation ? (\n <FloatingPortal\n root={props.asPortal ? undefined : r.element}>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={true}\n returnFocus={false}\n initialFocus={-1}>\n <div\n className={`a9s-popup r6o-popup annotation-popup r6o-text-popup ${NOT_ANNOTATABLE_CLASS}`}\n ref={refs.setFloating}\n style={floatingStyles}>\n {props.popup({\n annotation: selected[0].annotation, // for backwards compatibility\n editable: selected[0].editable,\n selected,\n event\n })}\n\n {props.arrow && (\n <FloatingArrow\n ref={arrowRef}\n context={context}\n {...(props.arrowProps || {})} />\n )}\n\n <button className=\"r6o-popup-sr-only\" aria-live=\"assertive\" onClick={onClose}>\n {props.ariaCloseWarning || 'Click or leave this dialog to close it.'}\n </button>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n ) : null;\n\n};\n\n/** For backwards compatibility **/\n/** @deprecated Use TextAnnotationPopup instead */\nexport const TextAnnotatorPopup = (props: TextAnnotationPopupProps) => {\n\n useEffect(() => {\n console.warn('TextAnnotatorPopup is deprecated and will be removed in a future version. Please use TextAnnotationPopup instead.');\n }, []);\n\n return <TextAnnotationPopup {...props} />;\n};\n"],"names":["PRESET_BEHAVIORS","elem","a","content","CETEIcean","props","el","useRef","useEffect","ceteicean","CETEI","data","jsx","TEIAnnotator","children","opts","anno","setAnno","useContext","AnnotoriousContext","onLoad","useCallback","element","createTEIAnnotator","Fragment","Children","child","cloneElement","useAnnotationQuoteIdle","annotationId","options","store","useAnnotationStore","isIdle","setIsIdle","useState","idleTimeout","scheduleSetIsIdle","event","updated","update","targetUpdated","oldTarget","newTarget","hasQuoteChanged","Ignore","Origin","oldValue","newValue","oldSelector","oldQuotes","quote","newSelector","newQuotes","TextAnnotator","className","style","filter","user","annotatingEnabled","userSelectAction","annotatingMode","adapter","createTextAnnotator","isMobile","userAgent","cachedBounds","updateViewportBounds","debounce","container","bounds","toViewportBounds","TextAnnotationPopup","r","useAnnotator","selected","useSelection","annotation","isAnnotationQuoteIdle","isOpen","setOpen","wasOpenRef","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","viewportRects","rect","toDomRectList","config","mutationObserver","onClose","FloatingPortal","FloatingFocusManager","jsxs","NOT_ANNOTATABLE_CLASS","FloatingArrow","TextAnnotatorPopup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-text-annotator.es.js","sources":["../src/tei/ceteicean.tsx","../src/tei/tei-annotator.tsx","../src/hooks/use-annotation-quote-idle.ts","../src/text-annotator.tsx","../src/text-annotation-popup/is-mobile.ts","../src/text-annotation-popup/text-annotation-popup.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport CETEI from 'CETEIcean';\n\ninterface CETEIceanProps {\n\n initArgs?: any;\n\n tei?: string;\n\n onLoad?(element: Element): void;\n\n behaviors?: any;\n\n}\n\n// Override default list, note, table, and ref behaviors \n// so they don't introduce text into the DOM that interferes\n// with annotation. Apply a patch to graphics for robustness.\nconst PRESET_BEHAVIORS = {\n tei: {\n ref: (elem: Element) => {\n const a = document.createElement('a');\n\n while(elem.firstChild) {\n a.appendChild(elem.removeChild(elem.firstChild));\n }\n\n a.setAttribute('href', elem.getAttribute('target')!);\n\n elem.appendChild(a);\n },\n // Cf. https://github.com/TEIC/CETEIcean/issues/67\n graphic: (elem: Element) => {\n const content = new Image();\n content.src = elem.getAttribute('url')?.trim()!;\n\n if (elem.hasAttribute('width'))\n content.setAttribute('width', elem.getAttribute('width')!);\n\n if (elem.hasAttribute('height'))\n content.setAttribute('height', elem.getAttribute('height')!);\n\n elem.appendChild(content);\n },\n list: null,\n note: null,\n table: null,\n teiHeader: (elem: HTMLElement) => {\n elem.hidden = true;\n }\n }\n}\n\nexport const CETEIcean = (props: CETEIceanProps) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (props.tei) {\n const ceteicean = new CETEI(props.initArgs);\n\n ceteicean.addBehaviors({\n ...PRESET_BEHAVIORS,\n ...(props.behaviors || {}),\n tei: {\n ...PRESET_BEHAVIORS.tei,\n ...(props.behaviors?.tei || {})\n }\n });\n\n ceteicean.makeHTML5(props.tei, (data: Element) => {\n el.current?.appendChild(data);\n props.onLoad?.(el.current!);\n });\n }\n\n return () => {\n if (el.current)\n el.current.innerHTML = '';\n }\n }, [props.tei, JSON.stringify(props.initArgs), props.onLoad]);\n\n return (\n <div \n ref={el}\n className=\"tei-container\" />\n )\n\n}","import { Children, JSX, ReactElement, ReactNode, cloneElement, useCallback, useContext, useEffect } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport { createTEIAnnotator, TEIAnnotation } from '@recogito/text-annotator-tei';\nimport type { AnnotatingMode, TextAnnotatorOptions } from '@recogito/text-annotator';\n\nimport '@recogito/text-annotator/text-annotator.css';\n\nexport type TEIAnnotatorProps = TextAnnotatorOptions<TEIAnnotation, unknown> & {\n\n children?: ReactNode | JSX.Element;\n\n annotatingMode?: AnnotatingMode;\n\n filter?: Filter;\n\n}\n\nexport const TEIAnnotator = (props: TEIAnnotatorProps) => {\n\n const { children, ...opts } = props;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n const onLoad = useCallback((element: HTMLElement) => {\n const anno = createTEIAnnotator(element, opts);\n setAnno(anno);\n }, []);\n\n useEffect(() => anno?.setStyle(props.style), [anno, props.style]);\n\n useEffect(() => anno?.setFilter(props.filter), [anno, props.filter]);\n\n useEffect(() => anno?.setUser(opts.user), [anno, opts.user]);\n\n useEffect(() => anno?.setAnnotatingEnabled(opts.annotatingEnabled), [anno, opts.annotatingEnabled]);\n\n useEffect(() => anno?.setAnnotatingMode(opts.annotatingMode), [anno, opts.annotatingMode]);\n\n return props.children ? (\n <>\n {Children.toArray(props.children).map(child => \n cloneElement(child as ReactElement, { onLoad } as any))}\n </>\n ) : null;\n\n}\n","import { useEffect, useState } from 'react';\nimport { Origin, useAnnotationStore } from '@annotorious/react';\nimport { Ignore, type StoreChangeEvent } from '@annotorious/core';\nimport type { TextAnnotation, TextAnnotationStore, TextAnnotationTarget } from '@recogito/text-annotator';\n\nexport const useAnnotationQuoteIdle = (\n annotationId: string | undefined,\n options: { timeout: number } = { timeout: 250 }\n) => {\n const store = useAnnotationStore<TextAnnotationStore>();\n\n const [isIdle, setIsIdle] = useState(true);\n\n useEffect(() => {\n if (!store || !annotationId) return;\n\n let idleTimeout: ReturnType<typeof setTimeout>;\n\n const scheduleSetIsIdle = (event: StoreChangeEvent<TextAnnotation>) => {\n const { changes: { updated } } = event;\n\n const hasChanged = updated?.some(update => {\n const { targetUpdated } = update;\n if (targetUpdated) {\n const { oldTarget, newTarget } = targetUpdated;\n return hasQuoteChanged(oldTarget, newTarget);\n }\n });\n\n if (hasChanged) {\n setIsIdle(false);\n clearTimeout(idleTimeout);\n idleTimeout = setTimeout(() => setIsIdle(true), options.timeout);\n }\n };\n\n store.observe(scheduleSetIsIdle, {\n annotations: annotationId,\n ignore: Ignore.BODY_ONLY,\n origin: Origin.LOCAL\n });\n\n return () => {\n clearTimeout(idleTimeout);\n store.unobserve(scheduleSetIsIdle);\n };\n }, [store, annotationId, options.timeout]);\n\n return isIdle;\n};\n\nconst hasQuoteChanged = (oldValue: TextAnnotationTarget, newValue: TextAnnotationTarget) => {\n const { selector: oldSelector } = oldValue;\n const oldQuotes = oldSelector.map(({ quote }) => quote);\n\n const { selector: newSelector } = newValue;\n const newQuotes = newSelector.map(({ quote }) => quote);\n\n return oldQuotes.join() !== newQuotes.join();\n};\n","import { JSX, ReactNode, useContext, useEffect, useRef } from 'react';\nimport { AnnotoriousContext, Filter } from '@annotorious/react';\nimport type { FormatAdapter } from '@annotorious/core';\nimport { createTextAnnotator } from '@recogito/text-annotator';\nimport type { AnnotatingMode, TextAnnotation, TextAnnotatorOptions } from '@recogito/text-annotator';\n\nimport '@recogito/text-annotator/text-annotator.css';\n\nexport interface TextAnnotatorProps<I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation> extends Omit<TextAnnotatorOptions<I, E>, 'adapter'> {\n\n children?: ReactNode | JSX.Element;\n\n adapter?: FormatAdapter<I, E> | ((container: HTMLElement) => FormatAdapter<I, E>);\n\n annotatingMode?: AnnotatingMode;\n\n filter?: Filter<I>;\n\n className?: string;\n\n}\n\nexport const TextAnnotator = <I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation>(\n props: TextAnnotatorProps<I, E>\n) => {\n\n const el = useRef<HTMLDivElement>(null);\n\n const { className, children, ...opts } = props;\n\n const { style, filter, user, annotatingEnabled, userSelectAction, annotatingMode } = opts;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n useEffect(() => {\n if (!setAnno || !el.current) return;\n\n const adapter = typeof opts.adapter === 'function' ? opts.adapter(el.current) : opts.adapter;\n\n const anno = createTextAnnotator(el.current!, { ...opts, adapter });\n setAnno(anno);\n\n return () => anno.destroy();\n }, [setAnno]);\n\n useEffect(() => anno?.setStyle(style), [anno, style]);\n\n useEffect(() => anno?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setUser(user), [anno, user]);\n\n useEffect(() => anno?.setUserSelectAction(userSelectAction), [anno, userSelectAction]);\n\n useEffect(() => anno?.setAnnotatingEnabled(annotatingEnabled), [anno, annotatingEnabled]);\n\n useEffect(() => anno?.setAnnotatingMode(annotatingMode), [anno, annotatingMode]);\n\n return (\n <div ref={el} className={`r6o-annotatable no-focus-outline ${className}`}>\n {children}\n </div>\n );\n\n}\n","// https://stackoverflow.com/questions/21741841/detecting-ios-android-operating-system\nexport const isMobile = () => {\n if (typeof navigator === 'undefined') return false;\n\n // @ts-ignore\n var userAgent: string = navigator.userAgent || navigator.vendor || window?.opera;\n\n if (/android/i.test(userAgent)) \n return true;\n\n // @ts-ignore\n // Note: as of recently, this NO LONGER DETECTS FIREFOX ON iOS!\n // This means FF/iOS will behave like on the desktop, and loose\n // selection handlebars after the popup opens.\n if (/iPad|iPhone/.test(userAgent) && !window.MSStream)\n return true;\n\n return false;\n}","import { ReactNode, useEffect, useRef, useState } from 'react';\nimport debounce from 'debounce';\nimport { useAnnotator, useSelection } from '@annotorious/react';\nimport {\n NOT_ANNOTATABLE_CLASS,\n TextAnnotationStore,\n toViewportBounds,\n toDomRectList,\n type TextAnnotation,\n type TextAnnotator,\n} from '@recogito/text-annotator';\nimport {\n arrow,\n autoUpdate,\n flip,\n FloatingArrow,\n FloatingArrowProps,\n FloatingFocusManager,\n FloatingPortal,\n inline,\n offset,\n Placement,\n shift,\n useFloating\n} from '@floating-ui/react';\nimport { isMobile } from './is-mobile';\nimport { useAnnotationQuoteIdle } from '../hooks';\n\nimport './text-annotation-popup.css';\n\ninterface TextAnnotationPopupProps {\n\n ariaCloseWarning?: string;\n\n arrow?: boolean;\n\n arrowProps?: Omit<FloatingArrowProps, 'context' | 'ref'>;\n\n asPortal?: boolean;\n\n autoFocus?: boolean;\n\n placement?: Placement;\n\n popup(props: TextAnnotationPopupContentProps): ReactNode;\n\n onClose?(): void;\n\n}\n\nexport interface TextAnnotationPopupContentProps<T extends TextAnnotation = TextAnnotation> {\n\n annotation: T;\n\n selected: { annotation: T; editable?: boolean; }[];\n\n editable?: boolean;\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nlet cachedBounds: DOMRect | null = null;\n\nconst updateViewportBounds = debounce((annotationId: string, store: TextAnnotationStore, container: HTMLElement) => {\n requestAnimationFrame(() => {\n const bounds = store.getAnnotationBounds(annotationId);\n if (!bounds) return;\n cachedBounds = toViewportBounds(bounds, container.getBoundingClientRect());\n });\n}, 250);\n\nexport const TextAnnotationPopup = (props: TextAnnotationPopupProps) => {\n\n const r = useAnnotator<TextAnnotator>();\n\n const { selected, event } = useSelection<TextAnnotation>();\n\n const annotation = selected[0]?.annotation;\n\n const isAnnotationQuoteIdle = useAnnotationQuoteIdle(annotation?.id);\n\n const [isOpen, setOpen] = useState(selected?.length > 0);\n\n // So we can reliably trigger the onClose callback\n const wasOpenRef = useRef(false);\n\n const arrowRef = useRef(null);\n\n const { refs, floatingStyles, update, context } = useFloating({\n placement: isMobile() ? 'bottom' : props.placement || 'top',\n strategy: 'absolute',\n open: isOpen,\n onOpenChange: (open, _event, reason) => {\n if (!open && (reason === 'escape-key' || reason === 'focus-out')) {\n setOpen(open);\n r?.cancelSelected();\n }\n },\n middleware: [\n inline(),\n offset(10),\n flip({ crossAxis: true }),\n shift({ crossAxis: true, padding: 10, }),\n arrow({ element: arrowRef })\n ],\n whileElementsMounted: autoUpdate\n });\n\n useEffect(() => {\n if (annotation?.id && isAnnotationQuoteIdle) {\n const bounds = r?.state.store.getAnnotationBounds(annotation.id);\n setOpen(Boolean(bounds));\n } else {\n setOpen(false);\n }\n }, [annotation?.id, annotation?.target.selector, isAnnotationQuoteIdle, r?.state.store]);\n\n useEffect(() => {\n if (!props.onClose) return;\n\n if (isOpen) {\n wasOpenRef.current = true;\n } else if (wasOpenRef.current) {\n wasOpenRef.current = false;\n props.onClose();\n }\n }, [props.onClose, isOpen]);\n\n useEffect(() => {\n if (!r) return;\n\n if (isOpen && annotation?.id) {\n refs.setPositionReference({\n getBoundingClientRect: () => {\n updateViewportBounds(annotation.id, r.state.store, r.element);\n return cachedBounds ? cachedBounds : new DOMRect();\n },\n getClientRects: () => {\n const rects = r.state.store.getAnnotationRects(annotation.id);\n const viewportRects = rects.map((rect) =>\n toViewportBounds(rect, r.element.getBoundingClientRect())\n );\n return toDomRectList(viewportRects);\n }\n });\n } else {\n refs.setPositionReference(null);\n }\n }, [isOpen, annotation?.id, annotation?.target, r]);\n\n useEffect(() => {\n if (!props.asPortal) return;\n\n const config: MutationObserverInit = { attributes: true, childList: true, subtree: true };\n\n const mutationObserver = new MutationObserver(() => update());\n mutationObserver.observe(document.body, config);\n\n window.document.addEventListener('scroll', update, true);\n\n return () => {\n mutationObserver.disconnect();\n window.document.removeEventListener('scroll', update, true);\n };\n }, [update, props.asPortal]);\n\n const onClose = () => r?.cancelSelected();\n\n return isOpen && annotation ? (\n <FloatingPortal\n root={props.asPortal ? undefined : r.element}>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={true}\n returnFocus={false}\n initialFocus={-1}>\n <div\n className={`a9s-popup r6o-popup annotation-popup r6o-text-popup ${NOT_ANNOTATABLE_CLASS}`}\n ref={refs.setFloating}\n style={floatingStyles}>\n {props.popup({\n annotation: selected[0].annotation, // for backwards compatibility\n editable: selected[0].editable,\n selected,\n event\n })}\n\n {props.arrow && (\n <FloatingArrow\n ref={arrowRef}\n context={context}\n {...(props.arrowProps || {})} />\n )}\n\n <button className=\"r6o-popup-sr-only\" aria-live=\"assertive\" onClick={onClose}>\n {props.ariaCloseWarning || 'Click or leave this dialog to close it.'}\n </button>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n ) : null;\n\n};\n\n/** For backwards compatibility **/\n/** @deprecated Use TextAnnotationPopup instead */\nexport const TextAnnotatorPopup = (props: TextAnnotationPopupProps) => {\n\n useEffect(() => {\n console.warn('TextAnnotatorPopup is deprecated and will be removed in a future version. Please use TextAnnotationPopup instead.');\n }, []);\n\n return <TextAnnotationPopup {...props} />;\n};\n"],"names":["PRESET_BEHAVIORS","elem","a","content","CETEIcean","props","el","useRef","useEffect","ceteicean","CETEI","data","jsx","TEIAnnotator","children","opts","anno","setAnno","useContext","AnnotoriousContext","onLoad","useCallback","element","createTEIAnnotator","Fragment","Children","child","cloneElement","useAnnotationQuoteIdle","annotationId","options","store","useAnnotationStore","isIdle","setIsIdle","useState","idleTimeout","scheduleSetIsIdle","event","updated","update","targetUpdated","oldTarget","newTarget","hasQuoteChanged","Ignore","Origin","oldValue","newValue","oldSelector","oldQuotes","quote","newSelector","newQuotes","TextAnnotator","className","style","filter","user","annotatingEnabled","userSelectAction","annotatingMode","adapter","createTextAnnotator","isMobile","userAgent","cachedBounds","updateViewportBounds","debounce","container","bounds","toViewportBounds","TextAnnotationPopup","r","useAnnotator","selected","useSelection","annotation","isAnnotationQuoteIdle","isOpen","setOpen","wasOpenRef","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","viewportRects","rect","toDomRectList","config","mutationObserver","onClose","FloatingPortal","FloatingFocusManager","jsxs","NOT_ANNOTATABLE_CLASS","FloatingArrow","TextAnnotatorPopup"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { JSX, ReactNode } from 'react';
|
|
2
2
|
import { Filter } from '@annotorious/react';
|
|
3
|
+
import { TEIAnnotation } from '@recogito/text-annotator-tei';
|
|
3
4
|
import type { AnnotatingMode, TextAnnotatorOptions } from '@recogito/text-annotator';
|
|
4
5
|
import '@recogito/text-annotator/text-annotator.css';
|
|
5
|
-
export type TEIAnnotatorProps = TextAnnotatorOptions & {
|
|
6
|
+
export type TEIAnnotatorProps = TextAnnotatorOptions<TEIAnnotation, unknown> & {
|
|
6
7
|
children?: ReactNode | JSX.Element;
|
|
7
8
|
annotatingMode?: AnnotatingMode;
|
|
8
9
|
filter?: Filter;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recogito/react-text-annotator",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.2",
|
|
4
4
|
"description": "Recogito Text Annotator React bindings",
|
|
5
5
|
"author": "Rainer Simon",
|
|
6
6
|
"license": "BSD-3-Clause",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"@annotorious/core": "^3.8.2",
|
|
49
49
|
"@annotorious/react": "^3.8.2",
|
|
50
50
|
"@floating-ui/react": "^0.27.19",
|
|
51
|
-
"@recogito/text-annotator": "4.2.
|
|
52
|
-
"@recogito/text-annotator-tei": "4.2.
|
|
51
|
+
"@recogito/text-annotator": "4.2.2",
|
|
52
|
+
"@recogito/text-annotator-tei": "4.2.2",
|
|
53
53
|
"CETEIcean": "^1.9.5",
|
|
54
54
|
"debounce": "^3.0.0"
|
|
55
55
|
}
|