@soomo/react-text-annotator 3.2.0-staging.8 → 3.2.0-staging.9

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,5 +1,5 @@
1
1
  import { jsx as g, Fragment as U, jsxs as W } from "react/jsx-runtime";
2
- import { useRef as y, useEffect as c, useContext as P, useCallback as x, Children as _, cloneElement as j, useState as S, useMemo as D } from "react";
2
+ import { useRef as y, useEffect as l, useContext as P, useCallback as x, Children as _, cloneElement as j, useState as S, useMemo as D } from "react";
3
3
  import H from "CETEIcean";
4
4
  import { AnnotoriousContext as R, useAnnotationStore as Q, Origin as z, useAnnotator as V, useSelection as Y } from "@annotorious/react";
5
5
  import { AnnotoriousPlugin as Oe } from "@annotorious/react";
@@ -10,7 +10,7 @@ import { W3CTextFormat as Ie, parseW3CTextAnnotation as Be, serializeW3CTextAnno
10
10
  import "@soomo/text-annotator/dist/text-annotator.css";
11
11
  import { Ignore as G } from "@annotorious/core";
12
12
  import { Origin as ke, UserSelectAction as Ue, createBody as We } from "@annotorious/core";
13
- import { useFloating as K, autoUpdate as X, inline as Z, offset as ee, flip as te, shift as ne, arrow as oe, useDismiss as re, useRole as se, useInteractions as ie, FloatingPortal as le, FloatingFocusManager as ce, FloatingArrow as ae } from "@floating-ui/react";
13
+ import { useFloating as K, autoUpdate as X, inline as Z, offset as ee, flip as te, shift as ne, arrow as oe, useDismiss as re, useRole as se, useInteractions as ie, FloatingPortal as ce, FloatingFocusManager as le, FloatingArrow as ue } from "@floating-ui/react";
14
14
  const O = {
15
15
  tei: {
16
16
  ref: (e) => {
@@ -21,9 +21,9 @@ const O = {
21
21
  },
22
22
  // Cf. https://github.com/TEIC/CETEIcean/issues/67
23
23
  graphic: (e) => {
24
- var l;
24
+ var c;
25
25
  const r = new Image();
26
- r.src = (l = e.getAttribute("url")) == null ? void 0 : l.trim(), e.hasAttribute("width") && r.setAttribute("width", e.getAttribute("width")), e.hasAttribute("height") && r.setAttribute("height", e.getAttribute("height")), e.appendChild(r);
26
+ r.src = (c = e.getAttribute("url")) == null ? void 0 : c.trim(), e.hasAttribute("width") && r.setAttribute("width", e.getAttribute("width")), e.hasAttribute("height") && r.setAttribute("height", e.getAttribute("height")), e.appendChild(r);
27
27
  },
28
28
  list: null,
29
29
  note: null,
@@ -34,8 +34,8 @@ const O = {
34
34
  }
35
35
  }, ve = (e) => {
36
36
  const r = y(null);
37
- return c(() => {
38
- var l;
37
+ return l(() => {
38
+ var c;
39
39
  if (e.tei) {
40
40
  const n = new H(e.initArgs);
41
41
  n.addBehaviors({
@@ -43,14 +43,14 @@ const O = {
43
43
  ...e.behaviors || {},
44
44
  tei: {
45
45
  ...O.tei,
46
- ...((l = e.behaviors) == null ? void 0 : l.tei) || {}
46
+ ...((c = e.behaviors) == null ? void 0 : c.tei) || {}
47
47
  }
48
48
  }), n.makeHTML5(e.tei, (s) => {
49
49
  r.current.appendChild(s), e.onLoad(r.current);
50
50
  });
51
51
  }
52
52
  return () => {
53
- r.current.innerHTML = "";
53
+ r.current && (r.current.innerHTML = "");
54
54
  };
55
55
  }, [e.tei, JSON.stringify(e.initArgs), e.onLoad]), /* @__PURE__ */ g(
56
56
  "div",
@@ -60,67 +60,67 @@ const O = {
60
60
  }
61
61
  );
62
62
  }, xe = (e) => {
63
- const { children: r, ...l } = e, { anno: n, setAnno: s } = P(R), i = x((t) => {
64
- const a = $(I(t, l));
65
- s(a);
63
+ const { children: r, ...c } = e, { anno: n, setAnno: s } = P(R), i = x((t) => {
64
+ const u = $(I(t, c));
65
+ s(u);
66
66
  }, []);
67
- return c(() => {
67
+ return l(() => {
68
68
  n && n.setStyle(e.style);
69
- }, [e.style]), c(() => {
69
+ }, [e.style]), l(() => {
70
70
  n && n.setFilter(e.filter);
71
71
  }, [e.filter]), e.children ? /* @__PURE__ */ g(U, { children: _.toArray(e.children).map((t) => j(t, { onLoad: i })) }) : null;
72
72
  }, v = (e, r = { timeout: 250 }) => {
73
- const l = Q(), [n, s] = S(!0);
74
- return c(() => {
75
- if (!l || !e) return;
73
+ const c = Q(), [n, s] = S(!0);
74
+ return l(() => {
75
+ if (!c || !e) return;
76
76
  let i;
77
- const t = (a) => {
78
- const { changes: { updated: u } } = a;
79
- (u == null ? void 0 : u.some((o) => {
77
+ const t = (u) => {
78
+ const { changes: { updated: a } } = u;
79
+ (a == null ? void 0 : a.some((o) => {
80
80
  const { targetUpdated: f } = o;
81
81
  if (f) {
82
82
  const { oldTarget: p, newTarget: m } = f;
83
- return ue(p, m);
83
+ return ae(p, m);
84
84
  }
85
85
  })) && (s(!1), clearTimeout(i), i = setTimeout(() => s(!0), r.timeout));
86
86
  };
87
- return l.observe(t, {
87
+ return c.observe(t, {
88
88
  annotations: e,
89
89
  ignore: G.BODY_ONLY,
90
90
  origin: z.LOCAL
91
91
  }), () => {
92
- clearTimeout(i), l.unobserve(t);
92
+ clearTimeout(i), c.unobserve(t);
93
93
  };
94
- }, [l, e, r.timeout]), n;
95
- }, ue = (e, r) => {
96
- const { selector: l } = e, n = l.map(({ quote: t }) => t), { selector: s } = r, i = s.map(({ quote: t }) => t);
94
+ }, [c, e, r.timeout]), n;
95
+ }, ae = (e, r) => {
96
+ const { selector: c } = e, n = c.map(({ quote: t }) => t), { selector: s } = r, i = s.map(({ quote: t }) => t);
97
97
  return n.join() !== i.join();
98
98
  }, Se = (e) => {
99
- const r = y(null), { className: l, children: n, ...s } = e, { style: i, filter: t, user: a, annotatingEnabled: u, userSelectAction: A } = s, { anno: o, setAnno: f } = P(R);
100
- return c(() => {
99
+ const r = y(null), { className: c, children: n, ...s } = e, { style: i, filter: t, user: u, annotatingEnabled: a, userSelectAction: A } = s, { anno: o, setAnno: f } = P(R);
100
+ return l(() => {
101
101
  if (!f) return;
102
102
  const p = typeof s.adapter == "function" ? s.adapter(r.current) : s.adapter, m = I(r.current, { ...s, adapter: p });
103
103
  return f(m), () => m.destroy();
104
- }, [f]), c(() => o == null ? void 0 : o.setStyle(i), [o, i]), c(() => o == null ? void 0 : o.setFilter(t), [o, t]), c(() => o == null ? void 0 : o.setFilter(t), [o, t]), c(() => o == null ? void 0 : o.setUserSelectAction(A), [o, A]), c(() => o == null ? void 0 : o.setUser(a), [o, a]), c(() => o == null ? void 0 : o.setAnnotatingEnabled(u), [o, u]), /* @__PURE__ */ g("div", { ref: r, className: `r6o-annotatable no-focus-outline ${l}`, children: n });
104
+ }, [f]), l(() => o == null ? void 0 : o.setStyle(i), [o, i]), l(() => o == null ? void 0 : o.setFilter(t), [o, t]), l(() => o == null ? void 0 : o.setFilter(t), [o, t]), l(() => o == null ? void 0 : o.setUserSelectAction(A), [o, A]), l(() => o == null ? void 0 : o.setUser(u), [o, u]), l(() => o == null ? void 0 : o.setAnnotatingEnabled(a), [o, a]), /* @__PURE__ */ g("div", { ref: r, className: `r6o-annotatable no-focus-outline ${c}`, children: n });
105
105
  }, L = () => {
106
106
  if (typeof navigator > "u") return !1;
107
107
  var e = navigator.userAgent || navigator.vendor || (window == null ? void 0 : window.opera);
108
108
  return !!(/android/i.test(e) || /iPad|iPhone/.test(e) && !window.MSStream);
109
109
  }, de = (e) => {
110
110
  var E;
111
- const { popup: r, ariaNavigationMessage: l } = e, n = V(), { selected: s, event: i } = Y(), t = (E = s[0]) == null ? void 0 : E.annotation;
111
+ const { popup: r, ariaNavigationMessage: c } = e, n = V(), { selected: s, event: i } = Y(), t = (E = s[0]) == null ? void 0 : E.annotation;
112
112
  v(t == null ? void 0 : t.id);
113
- const [a, u] = S((s == null ? void 0 : s.length) > 0), A = () => n == null ? void 0 : n.cancelSelected(), [o, f] = S(!1);
113
+ const [u, a] = S((s == null ? void 0 : s.length) > 0), A = () => n == null ? void 0 : n.cancelSelected(), [o, f] = S(!1);
114
114
  x(() => f(!0), []);
115
115
  const p = x(() => f(!1), []);
116
- c(() => {
117
- a || p();
118
- }, [a, p]);
116
+ l(() => {
117
+ u || p();
118
+ }, [u, p]);
119
119
  const m = y(null), { refs: T, floatingStyles: B, update: C, context: w } = K({
120
120
  placement: L() ? "bottom" : "top",
121
- open: a,
121
+ open: u,
122
122
  onOpenChange: (d, h, b) => {
123
- !d && (b === "escape-key" || b === "focus-out") && (u(d), A());
123
+ !d && (b === "escape-key" || b === "focus-out") && (a(d), A());
124
124
  },
125
125
  middleware: [
126
126
  Z(),
@@ -131,16 +131,16 @@ const O = {
131
131
  ],
132
132
  whileElementsMounted: X
133
133
  }), N = re(w), M = se(w, { role: "dialog" }), { getFloatingProps: fe } = ie([N, M]);
134
- c(() => {
134
+ l(() => {
135
135
  if (!n) return;
136
136
  const d = t == null ? void 0 : t.id, h = t == null ? void 0 : t.target.selector.length;
137
137
  if (d && h > 0 && v) {
138
138
  const b = n == null ? void 0 : n.state.store.getAnnotationBounds(t.id);
139
- u(!!b);
139
+ a(!!b);
140
140
  } else
141
- u(!1);
142
- }, [t == null ? void 0 : t.id, t == null ? void 0 : t.target.selector, v, n == null ? void 0 : n.state.store]), c(() => {
143
- n && (a && (t != null && t.id) ? T.setPositionReference({
141
+ a(!1);
142
+ }, [t == null ? void 0 : t.id, t == null ? void 0 : t.target.selector, v, n == null ? void 0 : n.state.store]), l(() => {
143
+ n && (u && (t != null && t.id) ? T.setPositionReference({
144
144
  getBoundingClientRect: () => {
145
145
  const d = n.state.store.getAnnotationBounds(t.id);
146
146
  return d ? F(d, n.element.getBoundingClientRect()) : new DOMRect();
@@ -152,15 +152,15 @@ const O = {
152
152
  return J(h);
153
153
  }
154
154
  }) : T.setPositionReference(null));
155
- }, [a, t == null ? void 0 : t.id, t == null ? void 0 : t.target, n]), c(() => {
155
+ }, [u, t == null ? void 0 : t.id, t == null ? void 0 : t.target, n]), l(() => {
156
156
  const d = { attributes: !0, childList: !0, subtree: !0 }, h = new MutationObserver(() => C());
157
157
  return h.observe(document.body, d), window.document.addEventListener("scroll", C, !0), () => {
158
158
  h.disconnect(), window.document.removeEventListener("scroll", C, !0);
159
159
  };
160
160
  }, [C]);
161
161
  const k = D(() => (i == null ? void 0 : i.type) === "keyup" || (i == null ? void 0 : i.type) === "contextmenu" || L() ? -1 : 0, [i]);
162
- return a && t ? /* @__PURE__ */ g(le, { children: /* @__PURE__ */ g(
163
- ce,
162
+ return u && t ? /* @__PURE__ */ g(ce, { children: /* @__PURE__ */ g(
163
+ le,
164
164
  {
165
165
  context: w,
166
166
  modal: !1,
@@ -180,7 +180,7 @@ const O = {
180
180
  event: i
181
181
  }),
182
182
  e.arrow && /* @__PURE__ */ g(
183
- ae,
183
+ ue,
184
184
  {
185
185
  ref: m,
186
186
  context: w,
@@ -193,7 +193,7 @@ const O = {
193
193
  )
194
194
  }
195
195
  ) }) : null;
196
- }, ye = (e) => (c(() => {
196
+ }, ye = (e) => (l(() => {
197
197
  console.warn("TextAnnotatorPopup is deprecated and will be removed in a future version. Please use TextAnnotationPopup instead.");
198
198
  }, []), /* @__PURE__ */ g(de, { ...e }));
199
199
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"react-text-annotator.es.js","sources":["../src/tei/CETEIcean.tsx","../src/tei/TEIAnnotator.tsx","../src/hooks/useAnnotationQuoteIdle.ts","../src/TextAnnotator.tsx","../src/TextAnnotationPopup/isMobile.ts","../src/TextAnnotationPopup/TextAnnotationPopup.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 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 { TEIPlugin } from '@recogito/text-annotator-tei';\nimport { createTextAnnotator, HighlightStyleExpression } from '@soomo/text-annotator';\nimport type { TextAnnotatorOptions } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/text-annotator.css';\n\nexport type TEIAnnotatorProps = TextAnnotatorOptions & {\n\n children?: ReactNode | JSX.Element;\n\n filter?: Filter;\n\n style?: HighlightStyleExpression\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 = TEIPlugin(createTextAnnotator(element, opts));\n setAnno(anno);\n }, []);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setStyle(props.style);\n }, [props.style]);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setFilter(props.filter);\n }, [props.filter]);\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 '@soomo/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 type { HighlightStyleExpression, TextAnnotation, TextAnnotatorOptions } from '@soomo/text-annotator';\nimport { createTextAnnotator } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/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>) | null;\n\n filter?: Filter<I>;\n\n style?: HighlightStyleExpression;\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 const { style, filter, user, annotatingEnabled, userSelectAction } = opts;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n useEffect(() => {\n if (!setAnno) 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?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setUserSelectAction(userSelectAction), [anno, userSelectAction]);\n\n useEffect(() => anno?.setUser(user), [anno, user]);\n\n useEffect(() => anno?.setAnnotatingEnabled(annotatingEnabled), [anno, annotatingEnabled]);\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 React, { FC, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useAnnotator, useSelection } from '@annotorious/react';\nimport {\n NOT_ANNOTATABLE_CLASS,\n type TextAnnotation,\n type TextAnnotator,\n toDomRectList,\n toViewportBounds\n} from '@soomo/text-annotator';\nimport {\n arrow,\n autoUpdate,\n flip,\n FloatingArrow,\n FloatingArrowProps,\n FloatingFocusManager,\n FloatingPortal,\n inline,\n offset,\n shift,\n useDismiss,\n useFloating,\n useInteractions,\n useRole\n} from '@floating-ui/react';\nimport { isMobile } from './isMobile';\nimport { useAnnotationQuoteIdle } from '../hooks';\n\nimport './TextAnnotationPopup.css';\n\ninterface TextAnnotationPopupProps {\n\n ariaNavigationMessage?: string;\n\n ariaCloseWarning?: string;\n\n arrow?: boolean;\n\n arrowProps?: Omit<FloatingArrowProps, 'context' | 'ref'>;\n\n popup(props: TextAnnotationPopupContentProps): ReactNode;\n\n}\n\nexport interface TextAnnotationPopupContentProps {\n\n annotation: TextAnnotation;\n\n editable?: boolean;\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nexport const TextAnnotationPopup: FC<TextAnnotationPopupProps> = (props) => {\n\n const { popup, ariaNavigationMessage } = props;\n\n const r = useAnnotator<TextAnnotator>();\n\n const { selected, event } = useSelection<TextAnnotation>();\n const annotation = selected[0]?.annotation;\n\n const isAnnotationQuoteIdle = useAnnotationQuoteIdle(annotation?.id);\n\n const [isOpen, setOpen] = useState(selected?.length > 0);\n const handleClose = () => r?.cancelSelected();\n\n const [isFocused, setFocused] = useState(false);\n const handleFocus = useCallback(() => setFocused(true), []);\n const handleBlur = useCallback(() => setFocused(false), []);\n useEffect(() => {\n if (!isOpen) handleBlur();\n }, [isOpen, handleBlur]);\n\n const arrowRef = useRef(null);\n\n const { refs, floatingStyles, update, context } = useFloating({\n placement: isMobile() ? 'bottom' : 'top',\n open: isOpen,\n onOpenChange: (open, _event, reason) => {\n if (!open && (reason === 'escape-key' || reason === 'focus-out')) {\n setOpen(open);\n handleClose();\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 const dismiss = useDismiss(context);\n\n const role = useRole(context, { role: 'dialog' });\n\n const { getFloatingProps } = useInteractions([dismiss, role]);\n\n useEffect(() => {\n if (!r) return;\n\n const annotationId = annotation?.id;\n const annotationSelectorsLength = annotation?.target.selector.length;\n\n if (annotationId && annotationSelectorsLength > 0 && useAnnotationQuoteIdle) {\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, useAnnotationQuoteIdle, r?.state.store]);\n\n useEffect(() => {\n if (!r) return;\n\n if (isOpen && annotation?.id) {\n refs.setPositionReference({\n getBoundingClientRect: () => {\n const bounds = r.state.store.getAnnotationBounds(annotation.id);\n return bounds\n ? toViewportBounds(bounds, r.element.getBoundingClientRect())\n : new DOMRect();\n },\n getClientRects: () => {\n const rects = r.state.store.getAnnotationRects(annotation.id);\n const denormalizedRects = rects.map((rect) =>\n toViewportBounds(rect, r.element.getBoundingClientRect())\n );\n return toDomRectList(denormalizedRects);\n }\n });\n } else {\n refs.setPositionReference(null);\n }\n }, [isOpen, annotation?.id, annotation?.target, r]);\n\n useEffect(() => {\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]);\n\n // Don't shift focus to the floating element if selected via keyboard or on mobile.\n const initialFocus = useMemo(() => {\n return (event?.type === 'keyup' || event?.type === 'contextmenu' || isMobile()) ? -1 : 0;\n }, [event]);\n\n /**\n * Announce the navigation hint only on the keyboard selection,\n * because the focus isn't shifted to the popup automatically then\n */\n // useAnnouncePopupNavigation({\n // disabled: isFocused,\n // floatingOpen: isOpen,\n // message: ariaNavigationMessage,\n // });\n\n return isOpen && annotation ? (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={true}\n returnFocus={false}\n initialFocus={initialFocus}>\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,\n editable: selected[0].editable,\n event\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={handleClose}>\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/**\n * Prevent text-annotator from handling the irrelevant events\n * triggered from the popup/toolbar/dialog\n *\nconst getStopEventsPropagationProps = <T extends HTMLElement = HTMLElement>() => ({\n onPointerUp: (event: React.PointerEvent<T>) => event.stopPropagation(),\n onPointerDown: (event: React.PointerEvent<T>) => event.stopPropagation(),\n onMouseDown: (event: React.MouseEvent<T>) => event.stopPropagation(),\n onMouseUp: (event: React.MouseEvent<T>) => event.stopPropagation()\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","_a","CETEIcean","props","el","useRef","useEffect","ceteicean","CETEI","data","jsx","TEIAnnotator","children","opts","anno","setAnno","useContext","AnnotoriousContext","onLoad","useCallback","element","TEIPlugin","createTextAnnotator","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","adapter","isMobile","userAgent","TextAnnotationPopup","popup","ariaNavigationMessage","r","useAnnotator","selected","useSelection","annotation","isOpen","setOpen","handleClose","isFocused","setFocused","handleBlur","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","dismiss","useDismiss","role","useRole","getFloatingProps","useInteractions","annotationSelectorsLength","bounds","toViewportBounds","denormalizedRects","rect","toDomRectList","config","mutationObserver","initialFocus","useMemo","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/TEIAnnotator.tsx","../src/hooks/useAnnotationQuoteIdle.ts","../src/TextAnnotator.tsx","../src/TextAnnotationPopup/isMobile.ts","../src/TextAnnotationPopup/TextAnnotationPopup.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 { TEIPlugin } from '@recogito/text-annotator-tei';\nimport { createTextAnnotator, HighlightStyleExpression } from '@soomo/text-annotator';\nimport type { TextAnnotatorOptions } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/text-annotator.css';\n\nexport type TEIAnnotatorProps = TextAnnotatorOptions & {\n\n children?: ReactNode | JSX.Element;\n\n filter?: Filter;\n\n style?: HighlightStyleExpression\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 = TEIPlugin(createTextAnnotator(element, opts));\n setAnno(anno);\n }, []);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setStyle(props.style);\n }, [props.style]);\n\n useEffect(() => {\n if (!anno)\n return;\n \n anno.setFilter(props.filter);\n }, [props.filter]);\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 '@soomo/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 type { HighlightStyleExpression, TextAnnotation, TextAnnotatorOptions } from '@soomo/text-annotator';\nimport { createTextAnnotator } from '@soomo/text-annotator';\n\nimport '@soomo/text-annotator/dist/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>) | null;\n\n filter?: Filter<I>;\n\n style?: HighlightStyleExpression;\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 const { style, filter, user, annotatingEnabled, userSelectAction } = opts;\n\n const { anno, setAnno } = useContext(AnnotoriousContext);\n\n useEffect(() => {\n if (!setAnno) 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?.setFilter(filter), [anno, filter]);\n\n useEffect(() => anno?.setUserSelectAction(userSelectAction), [anno, userSelectAction]);\n\n useEffect(() => anno?.setUser(user), [anno, user]);\n\n useEffect(() => anno?.setAnnotatingEnabled(annotatingEnabled), [anno, annotatingEnabled]);\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 React, { FC, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useAnnotator, useSelection } from '@annotorious/react';\nimport {\n NOT_ANNOTATABLE_CLASS,\n type TextAnnotation,\n type TextAnnotator,\n toDomRectList,\n toViewportBounds\n} from '@soomo/text-annotator';\nimport {\n arrow,\n autoUpdate,\n flip,\n FloatingArrow,\n FloatingArrowProps,\n FloatingFocusManager,\n FloatingPortal,\n inline,\n offset,\n shift,\n useDismiss,\n useFloating,\n useInteractions,\n useRole\n} from '@floating-ui/react';\nimport { isMobile } from './isMobile';\nimport { useAnnotationQuoteIdle } from '../hooks';\n\nimport './TextAnnotationPopup.css';\n\ninterface TextAnnotationPopupProps {\n\n ariaNavigationMessage?: string;\n\n ariaCloseWarning?: string;\n\n arrow?: boolean;\n\n arrowProps?: Omit<FloatingArrowProps, 'context' | 'ref'>;\n\n popup(props: TextAnnotationPopupContentProps): ReactNode;\n\n}\n\nexport interface TextAnnotationPopupContentProps {\n\n annotation: TextAnnotation;\n\n editable?: boolean;\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nexport const TextAnnotationPopup: FC<TextAnnotationPopupProps> = (props) => {\n\n const { popup, ariaNavigationMessage } = props;\n\n const r = useAnnotator<TextAnnotator>();\n\n const { selected, event } = useSelection<TextAnnotation>();\n const annotation = selected[0]?.annotation;\n\n const isAnnotationQuoteIdle = useAnnotationQuoteIdle(annotation?.id);\n\n const [isOpen, setOpen] = useState(selected?.length > 0);\n const handleClose = () => r?.cancelSelected();\n\n const [isFocused, setFocused] = useState(false);\n const handleFocus = useCallback(() => setFocused(true), []);\n const handleBlur = useCallback(() => setFocused(false), []);\n useEffect(() => {\n if (!isOpen) handleBlur();\n }, [isOpen, handleBlur]);\n\n const arrowRef = useRef(null);\n\n const { refs, floatingStyles, update, context } = useFloating({\n placement: isMobile() ? 'bottom' : 'top',\n open: isOpen,\n onOpenChange: (open, _event, reason) => {\n if (!open && (reason === 'escape-key' || reason === 'focus-out')) {\n setOpen(open);\n handleClose();\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 const dismiss = useDismiss(context);\n\n const role = useRole(context, { role: 'dialog' });\n\n const { getFloatingProps } = useInteractions([dismiss, role]);\n\n useEffect(() => {\n if (!r) return;\n\n const annotationId = annotation?.id;\n const annotationSelectorsLength = annotation?.target.selector.length;\n\n if (annotationId && annotationSelectorsLength > 0 && useAnnotationQuoteIdle) {\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, useAnnotationQuoteIdle, r?.state.store]);\n\n useEffect(() => {\n if (!r) return;\n\n if (isOpen && annotation?.id) {\n refs.setPositionReference({\n getBoundingClientRect: () => {\n const bounds = r.state.store.getAnnotationBounds(annotation.id);\n return bounds\n ? toViewportBounds(bounds, r.element.getBoundingClientRect())\n : new DOMRect();\n },\n getClientRects: () => {\n const rects = r.state.store.getAnnotationRects(annotation.id);\n const denormalizedRects = rects.map((rect) =>\n toViewportBounds(rect, r.element.getBoundingClientRect())\n );\n return toDomRectList(denormalizedRects);\n }\n });\n } else {\n refs.setPositionReference(null);\n }\n }, [isOpen, annotation?.id, annotation?.target, r]);\n\n useEffect(() => {\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]);\n\n // Don't shift focus to the floating element if selected via keyboard or on mobile.\n const initialFocus = useMemo(() => {\n return (event?.type === 'keyup' || event?.type === 'contextmenu' || isMobile()) ? -1 : 0;\n }, [event]);\n\n /**\n * Announce the navigation hint only on the keyboard selection,\n * because the focus isn't shifted to the popup automatically then\n */\n // useAnnouncePopupNavigation({\n // disabled: isFocused,\n // floatingOpen: isOpen,\n // message: ariaNavigationMessage,\n // });\n\n return isOpen && annotation ? (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n closeOnFocusOut={true}\n returnFocus={false}\n initialFocus={initialFocus}>\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,\n editable: selected[0].editable,\n event\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={handleClose}>\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/**\n * Prevent text-annotator from handling the irrelevant events\n * triggered from the popup/toolbar/dialog\n *\nconst getStopEventsPropagationProps = <T extends HTMLElement = HTMLElement>() => ({\n onPointerUp: (event: React.PointerEvent<T>) => event.stopPropagation(),\n onPointerDown: (event: React.PointerEvent<T>) => event.stopPropagation(),\n onMouseDown: (event: React.MouseEvent<T>) => event.stopPropagation(),\n onMouseUp: (event: React.MouseEvent<T>) => event.stopPropagation()\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","_a","CETEIcean","props","el","useRef","useEffect","ceteicean","CETEI","data","jsx","TEIAnnotator","children","opts","anno","setAnno","useContext","AnnotoriousContext","onLoad","useCallback","element","TEIPlugin","createTextAnnotator","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","adapter","isMobile","userAgent","TextAnnotationPopup","popup","ariaNavigationMessage","r","useAnnotator","selected","useSelection","annotation","isOpen","setOpen","handleClose","isFocused","setFocused","handleBlur","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","dismiss","useDismiss","role","useRole","getFloatingProps","useInteractions","annotationSelectorsLength","bounds","toViewportBounds","denormalizedRects","rect","toDomRectList","config","mutationObserver","initialFocus","useMemo","FloatingPortal","FloatingFocusManager","jsxs","NOT_ANNOTATABLE_CLASS","FloatingArrow","TextAnnotatorPopup"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CETEIcean.d.ts","sourceRoot":"","sources":["../../src/tei/CETEIcean.tsx"],"names":[],"mappings":"AAGA,UAAU,cAAc;IAEtB,QAAQ,CAAC,EAAE,GAAG,CAAC;IAEf,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAEhC,SAAS,CAAC,EAAE,GAAG,CAAC;CAEjB;AAwCD,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,4CAkC9C,CAAA"}
1
+ {"version":3,"file":"CETEIcean.d.ts","sourceRoot":"","sources":["../../src/tei/CETEIcean.tsx"],"names":[],"mappings":"AAGA,UAAU,cAAc;IAEtB,QAAQ,CAAC,EAAE,GAAG,CAAC;IAEf,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAEhC,SAAS,CAAC,EAAE,GAAG,CAAC;CAEjB;AAwCD,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,4CAmC9C,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soomo/react-text-annotator",
3
- "version": "3.2.0-staging.8",
3
+ "version": "3.2.0-staging.9",
4
4
  "description": "Recogito Text Annotator React bindings",
5
5
  "author": "Rainer Simon",
6
6
  "license": "BSD-3-Clause",
@@ -24,9 +24,9 @@
24
24
  "module": "./dist/react-text-annotator.es.js",
25
25
  "types": "./dist/index.d.ts",
26
26
  "devDependencies": {
27
- "@types/react": "^19.1.4",
27
+ "@types/react": "^19.1.6",
28
28
  "@types/react-dom": "^19.1.5",
29
- "@vitejs/plugin-react": "^4.4.1",
29
+ "@vitejs/plugin-react": "^4.5.0",
30
30
  "react": "^18.3.1",
31
31
  "react-dom": "^18.3.1",
32
32
  "typescript": "5.8.3",
@@ -48,10 +48,10 @@
48
48
  "dependencies": {
49
49
  "@annotorious/core": "^3.3.6",
50
50
  "@annotorious/react": "^3.3.6",
51
- "@floating-ui/react": "^0.27.8",
51
+ "@floating-ui/react": "^0.27.9",
52
52
  "@react-aria/live-announcer": "^3.3.4",
53
- "@soomo/text-annotator": "3.2.0-staging.8",
54
- "@recogito/text-annotator-tei": "3.0.3",
53
+ "@soomo/text-annotator": "3.2.0-staging.9",
54
+ "@recogito/text-annotator-tei": "3.0.5",
55
55
  "CETEIcean": "^1.9.4",
56
56
  "dequal": "^2.0.3",
57
57
  "unique-random": "^4.0.0"