@recogito/react-text-annotator 4.1.1 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export * from './hooks';
|
|
|
3
3
|
export * from './text-annotator';
|
|
4
4
|
export * from './text-annotation-popup';
|
|
5
5
|
export * from './text-annotator-plugin';
|
|
6
|
-
export type { Annotation, AnnotationBody, AnnotationTarget, Annotator, AnnotatorState,
|
|
6
|
+
export type { Annotation, AnnotationBody, AnnotationTarget, Annotator, AnnotatorState, Filter, FormatAdapter, HoverState, Selection, SelectionState, Store, StoreChangeEvent, StoreObserver, ParseResult, User, UserSelectActionExpression, W3CAnnotation, W3CAnnotationBody, W3CAnnotationTarget } from '@annotorious/core';
|
|
7
7
|
export { createBody, Origin, UserSelectAction } from '@annotorious/core';
|
|
8
8
|
export { AnnotoriousPlugin } from '@annotorious/react';
|
|
9
9
|
export type { AnnotatingMode, HighlightStyle, HighlightStyleExpression, TextAnnotation, TextAnnotationTarget, TextSelector, W3CTextAnnotation, W3CTextAnnotationTarget, W3CTextSelector, W3CAnnotationStylesheet, TextAnnotator as RecogitoTextAnnotator, TextAnnotationStore } from '@recogito/text-annotator';
|
|
@@ -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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"}
|
package/dist/tei/ceteicean.d.ts
CHANGED
|
@@ -4,5 +4,5 @@ interface CETEIceanProps {
|
|
|
4
4
|
onLoad?(element: Element): void;
|
|
5
5
|
behaviors?: any;
|
|
6
6
|
}
|
|
7
|
-
export declare const CETEIcean: (props: CETEIceanProps) => import("react
|
|
7
|
+
export declare const CETEIcean: (props: CETEIceanProps) => import("react").JSX.Element;
|
|
8
8
|
export {};
|
|
@@ -1,10 +1,11 @@
|
|
|
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;
|
|
9
10
|
};
|
|
10
|
-
export declare const TEIAnnotator: (props: TEIAnnotatorProps) =>
|
|
11
|
+
export declare const TEIAnnotator: (props: TEIAnnotatorProps) => JSX.Element;
|
|
@@ -21,8 +21,8 @@ export interface TextAnnotationPopupContentProps<T extends TextAnnotation = Text
|
|
|
21
21
|
editable?: boolean;
|
|
22
22
|
event?: PointerEvent | KeyboardEvent;
|
|
23
23
|
}
|
|
24
|
-
export declare const TextAnnotationPopup: (props: TextAnnotationPopupProps) => import("react
|
|
24
|
+
export declare const TextAnnotationPopup: (props: TextAnnotationPopupProps) => import("react").JSX.Element;
|
|
25
25
|
/** For backwards compatibility **/
|
|
26
26
|
/** @deprecated Use TextAnnotationPopup instead */
|
|
27
|
-
export declare const TextAnnotatorPopup: (props: TextAnnotationPopupProps) => import("react
|
|
27
|
+
export declare const TextAnnotatorPopup: (props: TextAnnotationPopupProps) => import("react").JSX.Element;
|
|
28
28
|
export {};
|
package/dist/text-annotator.d.ts
CHANGED
|
@@ -10,4 +10,4 @@ export interface TextAnnotatorProps<I extends TextAnnotation = TextAnnotation, E
|
|
|
10
10
|
filter?: Filter<I>;
|
|
11
11
|
className?: string;
|
|
12
12
|
}
|
|
13
|
-
export declare const TextAnnotator: <I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation>(props: TextAnnotatorProps<I, E>) =>
|
|
13
|
+
export declare const TextAnnotator: <I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation>(props: TextAnnotatorProps<I, E>) => JSX.Element;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recogito/react-text-annotator",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.1",
|
|
4
4
|
"description": "Recogito Text Annotator React bindings",
|
|
5
5
|
"author": "Rainer Simon",
|
|
6
6
|
"license": "BSD-3-Clause",
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
"module": "./dist/react-text-annotator.es.js",
|
|
25
25
|
"types": "./dist/index.d.ts",
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@types/react": "^19.2.
|
|
27
|
+
"@types/react": "^19.2.17",
|
|
28
28
|
"@types/react-dom": "^19.2.3",
|
|
29
29
|
"@vitejs/plugin-react": "^5.2.0",
|
|
30
|
-
"react": "^19.2.
|
|
31
|
-
"react-dom": "^19.2.
|
|
30
|
+
"react": "^19.2.7",
|
|
31
|
+
"react-dom": "^19.2.7",
|
|
32
32
|
"typescript": "^5.9.3",
|
|
33
|
-
"vite": "^7.3.
|
|
33
|
+
"vite": "^7.3.5",
|
|
34
34
|
"vite-plugin-externalize-deps": "^0.10.0",
|
|
35
35
|
"vite-tsconfig-paths": "^5.1.4"
|
|
36
36
|
},
|
|
@@ -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.
|
|
52
|
-
"@recogito/text-annotator-tei": "4.
|
|
51
|
+
"@recogito/text-annotator": "4.2.1",
|
|
52
|
+
"@recogito/text-annotator-tei": "4.2.1",
|
|
53
53
|
"CETEIcean": "^1.9.5",
|
|
54
54
|
"debounce": "^3.0.0"
|
|
55
55
|
}
|