@soomo/react-text-annotator 3.4.2-staging.1 → 3.4.9-staging.0

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.
@@ -15,6 +15,10 @@ interface TextAnnotationPopupProps {
15
15
  }
16
16
  export interface TextAnnotationPopupContentProps<T extends TextAnnotation = TextAnnotation> {
17
17
  annotation: T;
18
+ selected: {
19
+ annotation: T;
20
+ editable?: boolean;
21
+ }[];
18
22
  editable?: boolean;
19
23
  event?: PointerEvent | KeyboardEvent;
20
24
  }
@@ -1,13 +1,13 @@
1
1
  import { JSX, ReactNode } from 'react';
2
2
  import { Filter } from '@annotorious/react';
3
3
  import type { FormatAdapter } from '@annotorious/core';
4
- import type { HighlightStyleExpression, TextAnnotation, TextAnnotatorOptions } from '@soomo/text-annotator';
5
- import '@soomo/text-annotator/dist/text-annotator.css';
4
+ import type { AnnotatingMode, TextAnnotation, TextAnnotatorOptions } from '@soomo/text-annotator';
5
+ import '@soomo/text-annotator/text-annotator.css';
6
6
  export interface TextAnnotatorProps<I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation> extends Omit<TextAnnotatorOptions<I, E>, 'adapter'> {
7
7
  children?: ReactNode | JSX.Element;
8
8
  adapter?: FormatAdapter<I, E> | ((container: HTMLElement) => FormatAdapter<I, E>) | null;
9
+ annotatingMode?: AnnotatingMode;
9
10
  filter?: Filter<I>;
10
- style?: HighlightStyleExpression;
11
11
  className?: string;
12
12
  }
13
13
  export declare const TextAnnotator: <I extends TextAnnotation = TextAnnotation, E extends unknown = TextAnnotation>(props: TextAnnotatorProps<I, E>) => import("react/jsx-runtime").JSX.Element;
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export * from './TextAnnotatorPlugin';
6
6
  export type { Annotation, AnnotationBody, AnnotationTarget, Annotator, AnnotatorState, Color, 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
- export type { HighlightStyle, HighlightStyleExpression, TextAnnotation, TextAnnotationTarget, TextSelector, W3CTextAnnotation, W3CTextAnnotationTarget, W3CTextSelector, W3CAnnotationStylesheet, TextAnnotator as RecogitoTextAnnotator, TextAnnotationStore } from '@soomo/text-annotator';
9
+ export type { AnnotatingMode, HighlightStyle, HighlightStyleExpression, TextAnnotation, TextAnnotationTarget, TextSelector, W3CTextAnnotation, W3CTextAnnotationTarget, W3CTextSelector, W3CAnnotationStylesheet, TextAnnotator as RecogitoTextAnnotator, TextAnnotationStore } from '@soomo/text-annotator';
10
10
  export { W3CTextFormat, parseW3CTextAnnotation, serializeW3CTextAnnotation } from '@soomo/text-annotator';
11
11
  export type { RecogitoTEIAnnotator, TEIAnnotation, TEIAnnotationTarget, TEIRangeSelector, W3CTEIAnnotation, W3CTEIAnnotationTarget, W3CTEIRangeSelector } from '@recogito/text-annotator-tei';
12
12
  export { serializeW3CTEIAnnotation } from '@recogito/text-annotator-tei';
@@ -1,204 +1,199 @@
1
- import { jsx as f, Fragment as N, jsxs as M } from "react/jsx-runtime";
2
- import { useRef as w, useEffect as u, useContext as P, useCallback as v, Children as k, cloneElement as U, useState as x, useMemo as W } from "react";
3
- import _ from "CETEIcean";
4
- import { AnnotoriousContext as B, useAnnotationStore as j, Origin as H, useAnnotator as Q, useSelection as D } from "@annotorious/react";
5
- import { AnnotoriousPlugin as Se } from "@annotorious/react";
6
- import { TEIPlugin as V } from "@recogito/text-annotator-tei";
7
- import { serializeW3CTEIAnnotation as Ee } from "@recogito/text-annotator-tei";
8
- import { createTextAnnotator as L, toViewportBounds as R, toDomRectList as z, NOT_ANNOTATABLE_CLASS as Y } from "@soomo/text-annotator";
9
- import { W3CTextFormat as Oe, parseW3CTextAnnotation as Pe, serializeW3CTextAnnotation as Be } from "@soomo/text-annotator";
10
- import "@soomo/text-annotator/dist/text-annotator.css";
11
- import { Ignore as $ } from "@annotorious/core";
12
- import { Origin as Re, UserSelectAction as Ie, createBody as Ne } from "@annotorious/core";
13
- import q from "debounce";
14
- import { useFloating as J, autoUpdate as G, inline as K, offset as X, flip as Z, shift as ee, arrow as te, FloatingPortal as ne, FloatingFocusManager as oe, FloatingArrow as re } from "@floating-ui/react";
15
- const F = {
1
+ import { jsx as d, Fragment as R, jsxs as I } from "react/jsx-runtime";
2
+ import { useRef as v, useEffect as i, useContext as P, useCallback as x, Children as M, cloneElement as N, useState as E } from "react";
3
+ import U from "CETEIcean";
4
+ import { AnnotoriousContext as F, useAnnotationStore as k, Origin as W, useAnnotator as _, useSelection as j } from "@annotorious/react";
5
+ import { AnnotoriousPlugin as Tt } from "@annotorious/react";
6
+ import { TEIPlugin as H } from "@recogito/text-annotator-tei";
7
+ import { serializeW3CTEIAnnotation as Et } from "@recogito/text-annotator-tei";
8
+ import { createTextAnnotator as B, toViewportBounds as L, toDomRectList as Q, NOT_ANNOTATABLE_CLASS as D } from "@soomo/text-annotator";
9
+ import { W3CTextFormat as Ot, parseW3CTextAnnotation as yt, serializeW3CTextAnnotation as Pt } from "@soomo/text-annotator";
10
+ import "@soomo/text-annotator/text-annotator.css";
11
+ import { Ignore as V } from "@annotorious/core";
12
+ import { Origin as Bt, UserSelectAction as Lt, createBody as Rt } from "@annotorious/core";
13
+ import z from "debounce";
14
+ import { useFloating as Y, autoUpdate as $, inline as q, offset as J, flip as G, shift as K, arrow as X, FloatingPortal as Z, FloatingFocusManager as tt, FloatingArrow as et } from "@floating-ui/react";
15
+ const y = {
16
16
  tei: {
17
- ref: (e) => {
18
- const t = document.createElement("a");
19
- for (; e.firstChild; )
20
- t.appendChild(e.removeChild(e.firstChild));
21
- t.setAttribute("href", e.getAttribute("target")), e.appendChild(t);
17
+ ref: (t) => {
18
+ const e = document.createElement("a");
19
+ for (; t.firstChild; )
20
+ e.appendChild(t.removeChild(t.firstChild));
21
+ e.setAttribute("href", t.getAttribute("target")), t.appendChild(e);
22
22
  },
23
23
  // Cf. https://github.com/TEIC/CETEIcean/issues/67
24
- graphic: (e) => {
25
- var r;
26
- const t = new Image();
27
- t.src = (r = e.getAttribute("url")) == null ? void 0 : r.trim(), e.hasAttribute("width") && t.setAttribute("width", e.getAttribute("width")), e.hasAttribute("height") && t.setAttribute("height", e.getAttribute("height")), e.appendChild(t);
24
+ graphic: (t) => {
25
+ const e = new Image();
26
+ e.src = t.getAttribute("url")?.trim(), t.hasAttribute("width") && e.setAttribute("width", t.getAttribute("width")), t.hasAttribute("height") && e.setAttribute("height", t.getAttribute("height")), t.appendChild(e);
28
27
  },
29
28
  list: null,
30
29
  note: null,
31
30
  table: null,
32
- teiHeader: (e) => {
33
- e.hidden = !0;
31
+ teiHeader: (t) => {
32
+ t.hidden = !0;
34
33
  }
35
34
  }
36
- }, Ce = (e) => {
37
- const t = w(null);
38
- return u(() => {
39
- var r;
40
- if (e.tei) {
41
- const i = new _(e.initArgs);
42
- i.addBehaviors({
43
- ...F,
44
- ...e.behaviors || {},
35
+ }, At = (t) => {
36
+ const e = v(null);
37
+ return i(() => {
38
+ if (t.tei) {
39
+ const n = new U(t.initArgs);
40
+ n.addBehaviors({
41
+ ...y,
42
+ ...t.behaviors || {},
45
43
  tei: {
46
- ...F.tei,
47
- ...((r = e.behaviors) == null ? void 0 : r.tei) || {}
44
+ ...y.tei,
45
+ ...t.behaviors?.tei || {}
48
46
  }
49
- }), i.makeHTML5(e.tei, (n) => {
50
- t.current.appendChild(n), e.onLoad(t.current);
47
+ }), n.makeHTML5(t.tei, (r) => {
48
+ e.current.appendChild(r), t.onLoad(e.current);
51
49
  });
52
50
  }
53
51
  return () => {
54
- t.current && (t.current.innerHTML = "");
52
+ e.current && (e.current.innerHTML = "");
55
53
  };
56
- }, [e.tei, JSON.stringify(e.initArgs), e.onLoad]), /* @__PURE__ */ f(
54
+ }, [t.tei, JSON.stringify(t.initArgs), t.onLoad]), /* @__PURE__ */ d(
57
55
  "div",
58
56
  {
59
- ref: t,
57
+ ref: e,
60
58
  className: "tei-container"
61
59
  }
62
60
  );
63
- }, pe = (e) => {
64
- const { children: t, ...r } = e, { anno: i, setAnno: n } = P(B), s = v((l) => {
65
- const c = V(L(l, r));
66
- n(c);
61
+ }, bt = (t) => {
62
+ const { children: e, ...n } = t, { anno: r, setAnno: o } = P(F), s = x((l) => {
63
+ const c = H(B(l, n));
64
+ o(c);
67
65
  }, []);
68
- return u(() => {
69
- i && i.setStyle(e.style);
70
- }, [e.style]), u(() => {
71
- i && i.setFilter(e.filter);
72
- }, [e.filter]), e.children ? /* @__PURE__ */ f(N, { children: k.toArray(e.children).map((l) => U(l, { onLoad: s })) }) : null;
73
- }, T = (e, t = { timeout: 250 }) => {
74
- const r = j(), [i, n] = x(!0);
75
- return u(() => {
76
- if (!r || !e) return;
66
+ return i(() => r?.setStyle(t.style), [r, t.style]), i(() => r?.setFilter(t.filter), [r, t.filter]), i(() => r?.setUser(n.user), [r, n.user]), i(() => r?.setAnnotatingEnabled(n.annotatingEnabled), [r, n.annotatingEnabled]), i(() => r?.setAnnotatingMode(n.annotatingMode), [r, n.annotatingMode]), t.children ? /* @__PURE__ */ d(R, { children: M.toArray(t.children).map((l) => N(l, { onLoad: s })) }) : null;
67
+ }, T = (t, e = { timeout: 250 }) => {
68
+ const n = k(), [r, o] = E(!0);
69
+ return i(() => {
70
+ if (!n || !t) return;
77
71
  let s;
78
72
  const l = (c) => {
79
- const { changes: { updated: g } } = c;
80
- (g == null ? void 0 : g.some((o) => {
81
- const { targetUpdated: a } = o;
73
+ const { changes: { updated: p } } = c;
74
+ p?.some((f) => {
75
+ const { targetUpdated: a } = f;
82
76
  if (a) {
83
- const { oldTarget: b, newTarget: d } = a;
84
- return ie(b, d);
77
+ const { oldTarget: u, newTarget: g } = a;
78
+ return nt(u, g);
85
79
  }
86
- })) && (n(!1), clearTimeout(s), s = setTimeout(() => n(!0), t.timeout));
80
+ }) && (o(!1), clearTimeout(s), s = setTimeout(() => o(!0), e.timeout));
87
81
  };
88
- return r.observe(l, {
89
- annotations: e,
90
- ignore: $.BODY_ONLY,
91
- origin: H.LOCAL
82
+ return n.observe(l, {
83
+ annotations: t,
84
+ ignore: V.BODY_ONLY,
85
+ origin: W.LOCAL
92
86
  }), () => {
93
- clearTimeout(s), r.unobserve(l);
87
+ clearTimeout(s), n.unobserve(l);
94
88
  };
95
- }, [r, e, t.timeout]), i;
96
- }, ie = (e, t) => {
97
- const { selector: r } = e, i = r.map(({ quote: l }) => l), { selector: n } = t, s = n.map(({ quote: l }) => l);
98
- return i.join() !== s.join();
99
- }, we = (e) => {
100
- const t = w(null), { className: r, children: i, ...n } = e, { style: s, filter: l, user: c, annotatingEnabled: g, userSelectAction: A } = n, { anno: o, setAnno: a } = P(B);
101
- return u(() => {
102
- if (!a) return;
103
- const b = typeof n.adapter == "function" ? n.adapter(t.current) : n.adapter, d = L(t.current, { ...n, adapter: b });
104
- return a(d), () => d.destroy();
105
- }, [a]), u(() => o == null ? void 0 : o.setStyle(s), [o, s]), u(() => o == null ? void 0 : o.setFilter(l), [o, l]), u(() => o == null ? void 0 : o.setFilter(l), [o, l]), u(() => o == null ? void 0 : o.setUserSelectAction(A), [o, A]), u(() => o == null ? void 0 : o.setUser(c), [o, c]), u(() => o == null ? void 0 : o.setAnnotatingEnabled(g), [o, g]), /* @__PURE__ */ f("div", { ref: t, className: `r6o-annotatable no-focus-outline ${r}`, children: i });
106
- }, O = () => {
89
+ }, [n, t, e.timeout]), r;
90
+ }, nt = (t, e) => {
91
+ const { selector: n } = t, r = n.map(({ quote: l }) => l), { selector: o } = e, s = o.map(({ quote: l }) => l);
92
+ return r.join() !== s.join();
93
+ }, pt = (t) => {
94
+ const e = v(null), { className: n, children: r, ...o } = t, { style: s, filter: l, user: c, annotatingEnabled: p, userSelectAction: A, annotatingMode: f } = o, { anno: a, setAnno: u } = P(F);
95
+ return i(() => {
96
+ if (!u) return;
97
+ const g = typeof o.adapter == "function" ? o.adapter(e.current) : o.adapter, C = B(e.current, { ...o, adapter: g });
98
+ return u(C), () => C.destroy();
99
+ }, [u]), i(() => a?.setStyle(s), [a, s]), i(() => a?.setFilter(l), [a, l]), i(() => a?.setUser(c), [a, c]), i(() => a?.setUserSelectAction(A), [a, A]), i(() => a?.setAnnotatingEnabled(p), [a, p]), i(() => a?.setAnnotatingMode(f), [a, f]), /* @__PURE__ */ d("div", { ref: e, className: `r6o-annotatable no-focus-outline ${n}`, children: r });
100
+ }, ot = () => {
107
101
  if (typeof navigator > "u") return !1;
108
- var e = navigator.userAgent || navigator.vendor || (window == null ? void 0 : window.opera);
109
- return !!(/android/i.test(e) || /iPad|iPhone/.test(e) && !window.MSStream);
102
+ var t = navigator.userAgent || navigator.vendor || window?.opera;
103
+ return !!(/android/i.test(t) || /iPad|iPhone/.test(t) && !window.MSStream);
110
104
  };
111
105
  let S = null;
112
- const se = q((e, t, r) => {
106
+ const rt = z((t, e, n) => {
113
107
  requestAnimationFrame(() => {
114
- const i = t.getAnnotationBounds(e);
115
- i && (S = R(i, r.getBoundingClientRect()));
108
+ const r = e.getAnnotationBounds(t);
109
+ r && (S = L(r, n.getBoundingClientRect()));
116
110
  });
117
- }, 250), le = (e) => {
118
- var E;
119
- const t = Q(), { selected: r, event: i } = D(), n = (E = r[0]) == null ? void 0 : E.annotation;
120
- T(n == null ? void 0 : n.id);
121
- const [s, l] = x((r == null ? void 0 : r.length) > 0), c = () => t == null ? void 0 : t.cancelSelected(), [g, A] = x(!1);
122
- v(() => A(!0), []);
123
- const o = v(() => A(!1), []);
124
- u(() => {
125
- s || o();
126
- }, [s, o]);
127
- const a = w(!1), b = w(null), { refs: d, floatingStyles: I, update: p, context: y } = J({
128
- placement: O() ? "bottom" : e.placement || "top",
111
+ }, 250), it = (t) => {
112
+ const e = _(), { selected: n, event: r } = j(), o = n[0]?.annotation;
113
+ T(o?.id);
114
+ const [s, l] = E(n?.length > 0), c = () => e?.cancelSelected(), [p, A] = E(!1);
115
+ x(() => A(!0), []);
116
+ const f = x(() => A(!1), []);
117
+ i(() => {
118
+ s || f();
119
+ }, [s, f]);
120
+ const a = v(!1), u = v(null), { refs: g, floatingStyles: C, update: w, context: O } = Y({
121
+ placement: ot() ? "bottom" : t.placement || "top",
129
122
  strategy: "absolute",
130
123
  open: s,
131
- onOpenChange: (m, h, C) => {
132
- !m && (C === "escape-key" || C === "focus-out") && (l(m), c());
124
+ onOpenChange: (m, h, b) => {
125
+ !m && (b === "escape-key" || b === "focus-out") && (l(m), c());
133
126
  },
134
127
  middleware: [
135
- K(),
136
- X(10),
137
- Z({ crossAxis: !0 }),
138
- ee({ crossAxis: !0, padding: 10 }),
139
- te({ element: b })
128
+ q(),
129
+ J(10),
130
+ G({ crossAxis: !0 }),
131
+ K({ crossAxis: !0, padding: 10 }),
132
+ X({ element: u })
140
133
  ],
141
- whileElementsMounted: G
134
+ whileElementsMounted: $
142
135
  });
143
- return u(() => {
144
- if (!t) return;
145
- const m = n == null ? void 0 : n.id, h = n == null ? void 0 : n.target.selector.length;
136
+ return i(() => {
137
+ if (!e) return;
138
+ const m = o?.id, h = o?.target.selector.length;
146
139
  if (m && h > 0 && T) {
147
- const C = t == null ? void 0 : t.state.store.getAnnotationBounds(n.id);
148
- l(!!C);
140
+ const b = e?.state.store.getAnnotationBounds(o.id);
141
+ l(!!b);
149
142
  } else
150
143
  l(!1);
151
- }, [n == null ? void 0 : n.id, n == null ? void 0 : n.target.selector, T, t == null ? void 0 : t.state.store]), u(() => {
152
- e.onClose && (s ? a.current = !0 : a.current && (a.current = !1, e.onClose()));
153
- }, [e.onClose, s]), u(() => {
154
- t && (s && (n != null && n.id) ? d.setPositionReference({
155
- getBoundingClientRect: () => (se(n.id, t.state.store, t.element), S || new DOMRect()),
144
+ }, [o?.id, o?.target.selector, T, e?.state.store]), i(() => {
145
+ t.onClose && (s ? a.current = !0 : a.current && (a.current = !1, t.onClose()));
146
+ }, [t.onClose, s]), i(() => {
147
+ e && (s && o?.id ? g.setPositionReference({
148
+ getBoundingClientRect: () => (rt(o.id, e.state.store, e.element), S || new DOMRect()),
156
149
  getClientRects: () => {
157
- const h = t.state.store.getAnnotationRects(n.id).map(
158
- (C) => R(C, t.element.getBoundingClientRect())
150
+ const h = e.state.store.getAnnotationRects(o.id).map(
151
+ (b) => L(b, e.element.getBoundingClientRect())
159
152
  );
160
- return z(h);
153
+ return Q(h);
161
154
  }
162
- }) : d.setPositionReference(null));
163
- }, [s, n == null ? void 0 : n.id, n == null ? void 0 : n.target, t]), u(() => {
164
- if (!e.asPortal) return;
165
- const m = { attributes: !0, childList: !0, subtree: !0 }, h = new MutationObserver(() => p());
166
- return h.observe(document.body, m), window.document.addEventListener("scroll", p, !0), () => {
167
- h.disconnect(), window.document.removeEventListener("scroll", p, !0);
155
+ }) : g.setPositionReference(null));
156
+ }, [s, o?.id, o?.target, e]), i(() => {
157
+ if (!t.asPortal) return;
158
+ const m = { attributes: !0, childList: !0, subtree: !0 }, h = new MutationObserver(() => w());
159
+ return h.observe(document.body, m), window.document.addEventListener("scroll", w, !0), () => {
160
+ h.disconnect(), window.document.removeEventListener("scroll", w, !0);
168
161
  };
169
- }, [p, e.asPortal]), W(() => e.autoFocus === !1 || (i == null ? void 0 : i.type) === "keyup" || (i == null ? void 0 : i.type) === "contextmenu" || O() ? -1 : 0, [e.autoFocus, i]), s && n ? /* @__PURE__ */ f(
170
- ne,
162
+ }, [w, t.asPortal]), s && o ? /* @__PURE__ */ d(
163
+ Z,
171
164
  {
172
- root: e.asPortal ? void 0 : t.element,
173
- children: /* @__PURE__ */ f(
174
- oe,
165
+ root: t.asPortal ? void 0 : e.element,
166
+ children: /* @__PURE__ */ d(
167
+ tt,
175
168
  {
176
- context: y,
169
+ context: O,
177
170
  modal: !1,
178
171
  closeOnFocusOut: !0,
179
172
  returnFocus: !1,
180
173
  initialFocus: -1,
181
- children: /* @__PURE__ */ M(
174
+ children: /* @__PURE__ */ I(
182
175
  "div",
183
176
  {
184
- className: `a9s-popup r6o-popup annotation-popup r6o-text-popup ${Y}`,
185
- ref: d.setFloating,
186
- style: I,
177
+ className: `a9s-popup r6o-popup annotation-popup r6o-text-popup ${D}`,
178
+ ref: g.setFloating,
179
+ style: C,
187
180
  children: [
188
- e.popup({
189
- annotation: r[0].annotation,
190
- editable: r[0].editable,
191
- event: i
181
+ t.popup({
182
+ annotation: n[0].annotation,
183
+ // for backwards compatibility
184
+ editable: n[0].editable,
185
+ selected: n,
186
+ event: r
192
187
  }),
193
- e.arrow && /* @__PURE__ */ f(
194
- re,
188
+ t.arrow && /* @__PURE__ */ d(
189
+ et,
195
190
  {
196
- ref: b,
197
- context: y,
198
- ...e.arrowProps || {}
191
+ ref: u,
192
+ context: O,
193
+ ...t.arrowProps || {}
199
194
  }
200
195
  ),
201
- /* @__PURE__ */ f("button", { className: "r6o-popup-sr-only", "aria-live": "assertive", onClick: c, children: e.ariaCloseWarning || "Click or leave this dialog to close it." })
196
+ /* @__PURE__ */ d("button", { className: "r6o-popup-sr-only", "aria-live": "assertive", onClick: c, children: t.ariaCloseWarning || "Click or leave this dialog to close it." })
202
197
  ]
203
198
  }
204
199
  )
@@ -206,23 +201,23 @@ const se = q((e, t, r) => {
206
201
  )
207
202
  }
208
203
  ) : null;
209
- }, Te = (e) => (u(() => {
204
+ }, Ct = (t) => (i(() => {
210
205
  console.warn("TextAnnotatorPopup is deprecated and will be removed in a future version. Please use TextAnnotationPopup instead.");
211
- }, []), /* @__PURE__ */ f(le, { ...e }));
206
+ }, []), /* @__PURE__ */ d(it, { ...t }));
212
207
  export {
213
- Se as AnnotoriousPlugin,
214
- Ce as CETEIcean,
215
- Re as Origin,
216
- pe as TEIAnnotator,
217
- le as TextAnnotationPopup,
218
- we as TextAnnotator,
219
- Te as TextAnnotatorPopup,
220
- Ie as UserSelectAction,
221
- Oe as W3CTextFormat,
222
- Ne as createBody,
223
- Pe as parseW3CTextAnnotation,
224
- Ee as serializeW3CTEIAnnotation,
225
- Be as serializeW3CTextAnnotation,
208
+ Tt as AnnotoriousPlugin,
209
+ At as CETEIcean,
210
+ Bt as Origin,
211
+ bt as TEIAnnotator,
212
+ it as TextAnnotationPopup,
213
+ pt as TextAnnotator,
214
+ Ct as TextAnnotatorPopup,
215
+ Lt as UserSelectAction,
216
+ Ot as W3CTextFormat,
217
+ Rt as createBody,
218
+ yt as parseW3CTextAnnotation,
219
+ Et as serializeW3CTEIAnnotation,
220
+ Pt as serializeW3CTextAnnotation,
226
221
  T as useAnnotationQuoteIdle
227
222
  };
228
223
  //# sourceMappingURL=react-text-annotator.es.js.map
@@ -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 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 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 '@soomo/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 './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 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 editable?: boolean;\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nlet cachedBounds = 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 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 // 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 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 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 (!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 // Don't shift focus to the floating element if selected via keyboard or on mobile.\n const initialFocus = useMemo(() => {\n return (\n props.autoFocus === false || \n event?.type === 'keyup' || \n event?.type === 'contextmenu' || \n isMobile()\n ) ? -1 : 0;\n }, [props.autoFocus, 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 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,\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/** 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","cachedBounds","updateViewportBounds","debounce","container","bounds","toViewportBounds","TextAnnotationPopup","r","useAnnotator","selected","useSelection","annotation","isOpen","setOpen","handleClose","isFocused","setFocused","handleBlur","wasOpenRef","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","annotationSelectorsLength","viewportRects","rect","toDomRectList","config","mutationObserver","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 } from '@soomo/text-annotator';\nimport type { AnnotatingMode, TextAnnotatorOptions } from '@soomo/text-annotator';\n\nimport '@soomo/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 const anno = TEIPlugin(createTextAnnotator(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 '@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 { AnnotatingMode, TextAnnotation, TextAnnotatorOptions } from '@soomo/text-annotator';\nimport { createTextAnnotator } from '@soomo/text-annotator';\n\nimport '@soomo/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>) | null;\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) 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 React, { FC, ReactNode, useCallback, 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 '@soomo/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 './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 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 = 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 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 // 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 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 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 (!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 /**\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 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{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/** 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","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","annotatingMode","adapter","isMobile","userAgent","cachedBounds","updateViewportBounds","debounce","container","bounds","toViewportBounds","TextAnnotationPopup","r","useAnnotator","selected","useSelection","annotation","isOpen","setOpen","handleClose","isFocused","setFocused","handleBlur","wasOpenRef","arrowRef","refs","floatingStyles","context","useFloating","open","_event","reason","inline","offset","flip","shift","arrow","autoUpdate","annotationSelectorsLength","viewportRects","rect","toDomRectList","config","mutationObserver","FloatingPortal","FloatingFocusManager","jsxs","NOT_ANNOTATABLE_CLASS","FloatingArrow","TextAnnotatorPopup"],"mappings":"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"}
@@ -1,11 +1,10 @@
1
1
  import { JSX, ReactNode } from 'react';
2
2
  import { Filter } from '@annotorious/react';
3
- import { HighlightStyleExpression } from '@soomo/text-annotator';
4
- import type { TextAnnotatorOptions } from '@soomo/text-annotator';
5
- import '@soomo/text-annotator/dist/text-annotator.css';
3
+ import type { AnnotatingMode, TextAnnotatorOptions } from '@soomo/text-annotator';
4
+ import '@soomo/text-annotator/text-annotator.css';
6
5
  export type TEIAnnotatorProps = TextAnnotatorOptions & {
7
6
  children?: ReactNode | JSX.Element;
7
+ annotatingMode?: AnnotatingMode;
8
8
  filter?: Filter;
9
- style?: HighlightStyleExpression;
10
9
  };
11
10
  export declare const TEIAnnotator: (props: TEIAnnotatorProps) => import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soomo/react-text-annotator",
3
- "version": "3.4.2-staging.1",
3
+ "version": "3.4.9-staging.0",
4
4
  "description": "Recogito Text Annotator React bindings",
5
5
  "author": "Rainer Simon",
6
6
  "license": "BSD-3-Clause",
@@ -24,20 +24,20 @@
24
24
  "module": "./dist/react-text-annotator.es.js",
25
25
  "types": "./dist/index.d.ts",
26
26
  "devDependencies": {
27
- "@types/react": "^19.2.2",
28
- "@types/react-dom": "^19.2.1",
29
- "@vitejs/plugin-react": "^4.7.0",
27
+ "@types/react": "^19.2.5",
28
+ "@types/react-dom": "^19.2.3",
29
+ "@vitejs/plugin-react": "^5.1.1",
30
30
  "react": "^19.2.0",
31
31
  "react-dom": "^19.2.0",
32
32
  "typescript": "5.9.3",
33
- "vite": "^6.3.6",
33
+ "vite": "^7.2.2",
34
34
  "vite-plugin-externalize-deps": "^0.10.0",
35
35
  "vite-tsconfig-paths": "^5.1.4"
36
36
  },
37
37
  "peerDependencies": {
38
- "openseadragon": "^3.0.0 || ^4.0.0 || ^5.0.0",
39
- "react": ">=18.x || >=19.x",
40
- "react-dom": ">=18.x || >=19.x"
38
+ "openseadragon": ">= ^4.0 || >= ^5.0",
39
+ "react": ">= ^18.x || >= ^19.x",
40
+ "react-dom": ">= ^18.x || >= ^19.x"
41
41
  },
42
42
  "peerDependenciesMeta": {
43
43
  "openseadragon": {
@@ -45,14 +45,14 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@annotorious/core": "^3.7.11",
49
- "@annotorious/react": "^3.7.11",
48
+ "@annotorious/core": "^3.7.13",
49
+ "@annotorious/react": "^3.7.13",
50
50
  "@floating-ui/react": "^0.27.16",
51
51
  "@react-aria/live-announcer": "^3.3.4",
52
- "@soomo/text-annotator": "3.4.2-staging.1",
53
- "@recogito/text-annotator-tei": "3.4.0",
52
+ "@soomo/text-annotator": "3.4.9-staging.0",
53
+ "@recogito/text-annotator-tei": "3.4.9",
54
54
  "CETEIcean": "^1.9.5",
55
- "debounce": "^2.2.0",
55
+ "debounce": "^3.0.0",
56
56
  "dequal": "^2.0.3",
57
57
  "unique-random": "^4.0.0"
58
58
  }