@annotorious/core 3.0.0-rc.3 → 3.0.0-rc.31

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.
Files changed (94) hide show
  1. package/dist/annotorious-core.es.js +799 -0
  2. package/dist/annotorious-core.es.js.map +1 -0
  3. package/{src/index.ts → dist/index.d.ts} +1 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/lifecycle/Lifecycle.d.ts +11 -0
  6. package/dist/lifecycle/Lifecycle.d.ts.map +1 -0
  7. package/dist/lifecycle/LifecycleEvents.d.ts +13 -0
  8. package/dist/lifecycle/LifecycleEvents.d.ts.map +1 -0
  9. package/dist/lifecycle/index.d.ts +3 -0
  10. package/dist/lifecycle/index.d.ts.map +1 -0
  11. package/dist/model/Annotation.d.ts +34 -0
  12. package/dist/model/Annotation.d.ts.map +1 -0
  13. package/dist/model/AnnotationState.d.ts +8 -0
  14. package/dist/model/AnnotationState.d.ts.map +1 -0
  15. package/dist/model/Annotator.d.ts +67 -0
  16. package/dist/model/Annotator.d.ts.map +1 -0
  17. package/dist/model/DrawingStyle.d.ts +17 -0
  18. package/dist/model/DrawingStyle.d.ts.map +1 -0
  19. package/dist/model/Filter.d.ts +4 -0
  20. package/dist/model/Filter.d.ts.map +1 -0
  21. package/dist/model/FormatAdapter.d.ts +16 -0
  22. package/dist/model/FormatAdapter.d.ts.map +1 -0
  23. package/dist/model/User.d.ts +11 -0
  24. package/dist/model/User.d.ts.map +1 -0
  25. package/dist/model/W3CAnnotation.d.ts +43 -0
  26. package/dist/model/W3CAnnotation.d.ts.map +1 -0
  27. package/{src/model/index.ts → dist/model/index.d.ts} +3 -1
  28. package/dist/model/index.d.ts.map +1 -0
  29. package/dist/presence/Appearance.d.ts +6 -0
  30. package/dist/presence/Appearance.d.ts.map +1 -0
  31. package/dist/presence/AppearanceProvider.d.ts +17 -0
  32. package/dist/presence/AppearanceProvider.d.ts.map +1 -0
  33. package/dist/presence/ColorPalette.d.ts +3 -0
  34. package/dist/presence/ColorPalette.d.ts.map +1 -0
  35. package/dist/presence/PresenceEvents.d.ts +7 -0
  36. package/dist/presence/PresenceEvents.d.ts.map +1 -0
  37. package/dist/presence/PresenceProvider.d.ts +6 -0
  38. package/dist/presence/PresenceProvider.d.ts.map +1 -0
  39. package/dist/presence/PresenceState.d.ts +19 -0
  40. package/dist/presence/PresenceState.d.ts.map +1 -0
  41. package/dist/presence/PresentUser.d.ts +8 -0
  42. package/dist/presence/PresentUser.d.ts.map +1 -0
  43. package/{src/presence/index.ts → dist/presence/index.d.ts} +2 -1
  44. package/dist/presence/index.d.ts.map +1 -0
  45. package/dist/state/Hover.d.ts +10 -0
  46. package/dist/state/Hover.d.ts.map +1 -0
  47. package/dist/state/Selection.d.ts +34 -0
  48. package/dist/state/Selection.d.ts.map +1 -0
  49. package/dist/state/Store.d.ts +35 -0
  50. package/dist/state/Store.d.ts.map +1 -0
  51. package/dist/state/StoreObserver.d.ts +58 -0
  52. package/dist/state/StoreObserver.d.ts.map +1 -0
  53. package/dist/state/SvelteStore.d.ts +23 -0
  54. package/dist/state/SvelteStore.d.ts.map +1 -0
  55. package/dist/state/UndoStack.d.ts +19 -0
  56. package/dist/state/UndoStack.d.ts.map +1 -0
  57. package/dist/state/Viewport.d.ts +6 -0
  58. package/dist/state/Viewport.d.ts.map +1 -0
  59. package/{src/state/index.ts → dist/state/index.d.ts} +2 -1
  60. package/dist/state/index.d.ts.map +1 -0
  61. package/dist/utils/annotationUtils.d.ts +12 -0
  62. package/dist/utils/annotationUtils.d.ts.map +1 -0
  63. package/dist/utils/diffAnnotations.d.ts +5 -0
  64. package/dist/utils/diffAnnotations.d.ts.map +1 -0
  65. package/{src/utils/index.ts → dist/utils/index.d.ts} +1 -1
  66. package/dist/utils/index.d.ts.map +1 -0
  67. package/package.json +20 -17
  68. package/src/lifecycle/Lifecycle.ts +0 -197
  69. package/src/lifecycle/LifecycleEvents.ts +0 -21
  70. package/src/lifecycle/index.ts +0 -2
  71. package/src/model/Annotation.ts +0 -73
  72. package/src/model/Annotator.ts +0 -161
  73. package/src/model/DrawingStyle.ts +0 -19
  74. package/src/model/Filter.ts +0 -3
  75. package/src/model/FormatAdapter.ts +0 -36
  76. package/src/model/User.ts +0 -19
  77. package/src/model/W3CAnnotation.ts +0 -118
  78. package/src/presence/Appearance.ts +0 -9
  79. package/src/presence/AppearanceProvider.ts +0 -53
  80. package/src/presence/ColorPalette.ts +0 -14
  81. package/src/presence/PresenceEvents.ts +0 -9
  82. package/src/presence/PresenceProvider.ts +0 -7
  83. package/src/presence/PresenceState.ts +0 -145
  84. package/src/presence/PresentUser.ts +0 -10
  85. package/src/state/Hover.ts +0 -34
  86. package/src/state/Selection.ts +0 -113
  87. package/src/state/Store.ts +0 -344
  88. package/src/state/StoreObserver.ts +0 -194
  89. package/src/state/SvelteStore.ts +0 -54
  90. package/src/state/UndoStack.ts +0 -112
  91. package/src/state/Viewport.ts +0 -14
  92. package/src/utils/annotationUtils.ts +0 -33
  93. package/src/utils/diffAnnotations.ts +0 -39
  94. package/src/vite-env.d.ts +0 -1
@@ -0,0 +1,799 @@
1
+ var M = Object.prototype.hasOwnProperty;
2
+ function B(e, n) {
3
+ var t, o;
4
+ if (e === n) return !0;
5
+ if (e && n && (t = e.constructor) === n.constructor) {
6
+ if (t === Date) return e.getTime() === n.getTime();
7
+ if (t === RegExp) return e.toString() === n.toString();
8
+ if (t === Array) {
9
+ if ((o = e.length) === n.length)
10
+ for (; o-- && B(e[o], n[o]); ) ;
11
+ return o === -1;
12
+ }
13
+ if (!t || typeof e == "object") {
14
+ o = 0;
15
+ for (t in e)
16
+ if (M.call(e, t) && ++o && !M.call(n, t) || !(t in n) || !B(e[t], n[t])) return !1;
17
+ return Object.keys(n).length === o;
18
+ }
19
+ }
20
+ return e !== e && n !== n;
21
+ }
22
+ function z() {
23
+ }
24
+ function H(e, n) {
25
+ return e != e ? n == n : e !== n || e && typeof e == "object" || typeof e == "function";
26
+ }
27
+ const k = [];
28
+ function Y(e, n = z) {
29
+ let t;
30
+ const o = /* @__PURE__ */ new Set();
31
+ function d(b) {
32
+ if (H(e, b) && (e = b, t)) {
33
+ const y = !k.length;
34
+ for (const p of o)
35
+ p[1](), k.push(p, e);
36
+ if (y) {
37
+ for (let p = 0; p < k.length; p += 2)
38
+ k[p][0](k[p + 1]);
39
+ k.length = 0;
40
+ }
41
+ }
42
+ }
43
+ function f(b) {
44
+ d(b(e));
45
+ }
46
+ function w(b, y = z) {
47
+ const p = [b, y];
48
+ return o.add(p), o.size === 1 && (t = n(d, f) || z), b(e), () => {
49
+ o.delete(p), o.size === 0 && t && (t(), t = null);
50
+ };
51
+ }
52
+ return { set: d, update: f, subscribe: w };
53
+ }
54
+ const Ce = (e) => {
55
+ const { subscribe: n, set: t } = Y();
56
+ let o;
57
+ return n((d) => o = d), e.observe(({ changes: d }) => {
58
+ if (o) {
59
+ (d.deleted || []).some((b) => b.id === o) && t(void 0);
60
+ const w = (d.updated || []).find(({ oldValue: b }) => b.id === o);
61
+ w && t(w.newValue.id);
62
+ }
63
+ }), {
64
+ get current() {
65
+ return o;
66
+ },
67
+ subscribe: n,
68
+ set: t
69
+ };
70
+ };
71
+ var F = /* @__PURE__ */ ((e) => (e.EDIT = "EDIT", e.SELECT = "SELECT", e.NONE = "NONE", e))(F || {});
72
+ const V = { selected: [] }, Ue = (e, n = "EDIT") => {
73
+ const { subscribe: t, set: o } = Y(V);
74
+ let d = n, f = V;
75
+ t((m) => f = m);
76
+ const w = () => o(V), b = () => {
77
+ var m;
78
+ return ((m = f.selected) == null ? void 0 : m.length) === 0;
79
+ }, y = (m) => {
80
+ if (b())
81
+ return !1;
82
+ const v = typeof m == "string" ? m : m.id;
83
+ return f.selected.some((U) => U.id === v);
84
+ }, p = (m, v) => {
85
+ const U = e.getAnnotation(m);
86
+ if (!U) {
87
+ console.warn("Invalid selection: " + m);
88
+ return;
89
+ }
90
+ switch (P(U, d)) {
91
+ case "EDIT":
92
+ o({ selected: [{ id: m, editable: !0 }], event: v });
93
+ break;
94
+ case "SELECT":
95
+ o({ selected: [{ id: m }], event: v });
96
+ break;
97
+ default:
98
+ o({ selected: [], event: v });
99
+ }
100
+ }, L = (m, v) => {
101
+ const U = Array.isArray(m) ? m : [m], O = U.map((r) => e.getAnnotation(r)).filter((r) => !!r);
102
+ o({
103
+ selected: O.map((r) => {
104
+ const u = v === void 0 ? P(r, d) === "EDIT" : v;
105
+ return { id: r.id, editable: u };
106
+ })
107
+ }), O.length !== U.length && console.warn("Invalid selection", m);
108
+ }, a = (m) => {
109
+ if (b())
110
+ return !1;
111
+ const { selected: v } = f;
112
+ v.some(({ id: O }) => m.includes(O)) && o({ selected: v.filter(({ id: O }) => !m.includes(O)) });
113
+ }, E = (m) => d = m;
114
+ return e.observe(
115
+ ({ changes: m }) => a((m.deleted || []).map((v) => v.id))
116
+ ), {
117
+ get event() {
118
+ return f ? f.event : null;
119
+ },
120
+ get selected() {
121
+ return f ? [...f.selected] : null;
122
+ },
123
+ clear: w,
124
+ isEmpty: b,
125
+ isSelected: y,
126
+ setSelected: L,
127
+ setUserSelectAction: E,
128
+ subscribe: t,
129
+ userSelect: p
130
+ };
131
+ }, P = (e, n) => typeof n == "function" ? n(e) : n || "EDIT";
132
+ var D = [];
133
+ for (var _ = 0; _ < 256; ++_)
134
+ D.push((_ + 256).toString(16).slice(1));
135
+ function J(e, n = 0) {
136
+ return (D[e[n + 0]] + D[e[n + 1]] + D[e[n + 2]] + D[e[n + 3]] + "-" + D[e[n + 4]] + D[e[n + 5]] + "-" + D[e[n + 6]] + D[e[n + 7]] + "-" + D[e[n + 8]] + D[e[n + 9]] + "-" + D[e[n + 10]] + D[e[n + 11]] + D[e[n + 12]] + D[e[n + 13]] + D[e[n + 14]] + D[e[n + 15]]).toLowerCase();
137
+ }
138
+ var $, Q = new Uint8Array(16);
139
+ function X() {
140
+ if (!$ && ($ = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !$))
141
+ throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
142
+ return $(Q);
143
+ }
144
+ var Z = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
145
+ const W = {
146
+ randomUUID: Z
147
+ };
148
+ function K(e, n, t) {
149
+ if (W.randomUUID && !n && !e)
150
+ return W.randomUUID();
151
+ e = e || {};
152
+ var o = e.random || (e.rng || X)();
153
+ return o[6] = o[6] & 15 | 64, o[8] = o[8] & 63 | 128, J(o);
154
+ }
155
+ const Le = (e) => {
156
+ const { creator: n, updatedBy: t } = e.target, o = e.bodies.reduce((d, f) => [...d, f.creator, f.updatedBy].filter(Boolean), []);
157
+ return [
158
+ n,
159
+ t,
160
+ ...o
161
+ ].filter((d) => d);
162
+ }, Se = (e, n, t, o) => ({
163
+ id: K(),
164
+ annotation: typeof e == "string" ? e : e.id,
165
+ created: t || /* @__PURE__ */ new Date(),
166
+ creator: o,
167
+ ...n
168
+ }), ee = (e, n) => {
169
+ const t = new Set(e.bodies.map((o) => o.id));
170
+ return n.bodies.filter((o) => !t.has(o.id));
171
+ }, te = (e, n) => {
172
+ const t = new Set(n.bodies.map((o) => o.id));
173
+ return e.bodies.filter((o) => !t.has(o.id));
174
+ }, ne = (e, n) => n.bodies.map((t) => {
175
+ const o = e.bodies.find((d) => d.id === t.id);
176
+ return { newBody: t, oldBody: o && !B(o, t) ? o : void 0 };
177
+ }).filter(({ oldBody: t }) => t).map(({ oldBody: t, newBody: o }) => ({ oldBody: t, newBody: o })), oe = (e, n) => !B(e.target, n.target), q = (e, n) => {
178
+ const t = ee(e, n), o = te(e, n), d = ne(e, n);
179
+ return {
180
+ oldValue: e,
181
+ newValue: n,
182
+ bodiesCreated: t.length > 0 ? t : void 0,
183
+ bodiesDeleted: o.length > 0 ? o : void 0,
184
+ bodiesUpdated: d.length > 0 ? d : void 0,
185
+ targetUpdated: oe(e, n) ? { oldTarget: e.target, newTarget: n.target } : void 0
186
+ };
187
+ };
188
+ var se = /* @__PURE__ */ ((e) => (e.BODY_ONLY = "BODY_ONLY", e.TARGET_ONLY = "TARGET_ONLY", e))(se || {}), S = /* @__PURE__ */ ((e) => (e.LOCAL = "LOCAL", e.REMOTE = "REMOTE", e))(S || {});
189
+ const ie = (e, n) => {
190
+ var f, w;
191
+ const { changes: t, origin: o } = n;
192
+ if (!(!e.options.origin || e.options.origin === o))
193
+ return !1;
194
+ if (e.options.ignore) {
195
+ const { ignore: b } = e.options, y = (L) => L && L.length > 0;
196
+ if (!(y(t.created) || y(t.deleted))) {
197
+ const L = (f = t.updated) == null ? void 0 : f.some((E) => y(E.bodiesCreated) || y(E.bodiesDeleted) || y(E.bodiesUpdated)), a = (w = t.updated) == null ? void 0 : w.some((E) => E.targetUpdated);
198
+ if (b === "BODY_ONLY" && L && !a || b === "TARGET_ONLY" && a && !L)
199
+ return !1;
200
+ }
201
+ }
202
+ if (e.options.annotations) {
203
+ const b = /* @__PURE__ */ new Set([
204
+ ...(t.created || []).map((p) => p.id),
205
+ ...(t.deleted || []).map((p) => p.id),
206
+ ...(t.updated || []).map(({ oldValue: p }) => p.id)
207
+ ]);
208
+ return !!(Array.isArray(e.options.annotations) ? e.options.annotations : [e.options.annotations]).find((p) => b.has(p));
209
+ } else
210
+ return !0;
211
+ }, de = (e, n) => {
212
+ const t = new Set((e.created || []).map((a) => a.id)), o = new Set((e.updated || []).map(({ newValue: a }) => a.id)), d = new Set((n.created || []).map((a) => a.id)), f = new Set((n.deleted || []).map((a) => a.id)), w = new Set((n.updated || []).map(({ oldValue: a }) => a.id)), b = new Set((n.updated || []).filter(({ oldValue: a }) => t.has(a.id) || o.has(a.id)).map(({ oldValue: a }) => a.id)), y = [
213
+ ...(e.created || []).filter((a) => !f.has(a.id)).map((a) => w.has(a.id) ? n.updated.find(({ oldValue: E }) => E.id === a.id).newValue : a),
214
+ ...n.created || []
215
+ ], p = [
216
+ ...(e.deleted || []).filter((a) => !d.has(a.id)),
217
+ ...(n.deleted || []).filter((a) => !t.has(a.id))
218
+ ], L = [
219
+ ...(e.updated || []).filter(({ newValue: a }) => !f.has(a.id)).map((a) => {
220
+ const { oldValue: E, newValue: m } = a;
221
+ if (w.has(m.id)) {
222
+ const v = n.updated.find((U) => U.oldValue.id === m.id).newValue;
223
+ return q(E, v);
224
+ } else
225
+ return a;
226
+ }),
227
+ ...(n.updated || []).filter(({ oldValue: a }) => !b.has(a.id))
228
+ ];
229
+ return { created: y, deleted: p, updated: L };
230
+ }, re = (e) => e.id !== void 0, Oe = () => {
231
+ const e = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), t = [], o = (i, c = {}) => t.push({ onChange: i, options: c }), d = (i) => {
232
+ const c = t.findIndex((l) => l.onChange == i);
233
+ c > -1 && t.splice(c, 1);
234
+ }, f = (i, c) => {
235
+ const l = {
236
+ origin: i,
237
+ changes: {
238
+ created: c.created || [],
239
+ updated: c.updated || [],
240
+ deleted: c.deleted || []
241
+ },
242
+ state: [...e.values()]
243
+ };
244
+ t.forEach((g) => {
245
+ ie(g, l) && g.onChange(l);
246
+ });
247
+ }, w = (i, c = S.LOCAL) => {
248
+ if (e.get(i.id))
249
+ throw Error(`Cannot add annotation ${i.id} - exists already`);
250
+ e.set(i.id, i), i.bodies.forEach((g) => n.set(g.id, i.id)), f(c, { created: [i] });
251
+ }, b = (i, c) => {
252
+ const l = typeof i == "string" ? c : i, g = typeof i == "string" ? i : i.id, C = e.get(g);
253
+ if (C) {
254
+ const T = q(C, l);
255
+ return g === l.id ? e.set(g, l) : (e.delete(g), e.set(l.id, l)), C.bodies.forEach((I) => n.delete(I.id)), l.bodies.forEach((I) => n.set(I.id, l.id)), T;
256
+ } else
257
+ console.warn(`Cannot update annotation ${g} - does not exist`);
258
+ }, y = (i, c = S.LOCAL, l = S.LOCAL) => {
259
+ const g = re(c) ? l : c, C = b(i, c);
260
+ C && f(g, { updated: [C] });
261
+ }, p = (i, c = S.LOCAL) => {
262
+ const l = i.reduce((g, C) => {
263
+ const T = b(C);
264
+ return T ? [...g, T] : g;
265
+ }, []);
266
+ l.length > 0 && f(c, { updated: l });
267
+ }, L = (i, c = S.LOCAL) => {
268
+ const l = e.get(i.annotation);
269
+ if (l) {
270
+ const g = {
271
+ ...l,
272
+ bodies: [...l.bodies, i]
273
+ };
274
+ e.set(l.id, g), n.set(i.id, g.id), f(c, { updated: [{
275
+ oldValue: l,
276
+ newValue: g,
277
+ bodiesCreated: [i]
278
+ }] });
279
+ } else
280
+ console.warn(`Attempt to add body to missing annotation: ${i.annotation}`);
281
+ }, a = () => [...e.values()], E = (i = S.LOCAL) => {
282
+ const c = [...e.values()];
283
+ e.clear(), n.clear(), f(i, { deleted: c });
284
+ }, m = (i, c = !0, l = S.LOCAL) => {
285
+ if (c) {
286
+ const g = [...e.values()];
287
+ e.clear(), n.clear(), i.forEach((C) => {
288
+ e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));
289
+ }), f(l, { created: i, deleted: g });
290
+ } else {
291
+ const g = i.reduce((C, T) => {
292
+ const I = e.get(T.id);
293
+ return I ? [...C, I] : C;
294
+ }, []);
295
+ if (g.length > 0)
296
+ throw Error(`Bulk insert would overwrite the following annotations: ${g.map((C) => C.id).join(", ")}`);
297
+ i.forEach((C) => {
298
+ e.set(C.id, C), C.bodies.forEach((T) => n.set(T.id, C.id));
299
+ }), f(l, { created: i });
300
+ }
301
+ }, v = (i) => {
302
+ const c = typeof i == "string" ? i : i.id, l = e.get(c);
303
+ if (l)
304
+ return e.delete(c), l.bodies.forEach((g) => n.delete(g.id)), l;
305
+ console.warn(`Attempt to delete missing annotation: ${c}`);
306
+ }, U = (i, c = S.LOCAL) => {
307
+ const l = v(i);
308
+ l && f(c, { deleted: [l] });
309
+ }, O = (i, c = S.LOCAL) => {
310
+ const l = i.reduce((g, C) => {
311
+ const T = v(C);
312
+ return T ? [...g, T] : g;
313
+ }, []);
314
+ l.length > 0 && f(c, { deleted: l });
315
+ }, r = (i) => {
316
+ const c = e.get(i.annotation);
317
+ if (c) {
318
+ const l = c.bodies.find((g) => g.id === i.id);
319
+ if (l) {
320
+ n.delete(l.id);
321
+ const g = {
322
+ ...c,
323
+ bodies: c.bodies.filter((T) => T.id !== i.id)
324
+ };
325
+ return e.set(c.id, g), {
326
+ oldValue: c,
327
+ newValue: g,
328
+ bodiesDeleted: [l]
329
+ };
330
+ } else
331
+ console.warn(`Attempt to delete missing body ${i.id} from annotation ${i.annotation}`);
332
+ } else
333
+ console.warn(`Attempt to delete body from missing annotation ${i.annotation}`);
334
+ }, u = (i, c = S.LOCAL) => {
335
+ const l = r(i);
336
+ l && f(c, { updated: [l] });
337
+ }, s = (i, c = S.LOCAL) => {
338
+ const l = i.map((g) => r(g)).filter(Boolean);
339
+ l.length > 0 && f(c, { updated: l });
340
+ }, h = (i) => {
341
+ const c = e.get(i);
342
+ return c ? { ...c } : void 0;
343
+ }, A = (i) => {
344
+ const c = n.get(i);
345
+ if (c) {
346
+ const g = h(c).bodies.find((C) => C.id === i);
347
+ if (g)
348
+ return g;
349
+ console.error(`Store integrity error: body ${i} in index, but not in annotation`);
350
+ } else
351
+ console.warn(`Attempt to retrieve missing body: ${i}`);
352
+ }, R = (i, c) => {
353
+ if (i.annotation !== c.annotation)
354
+ throw "Annotation integrity violation: annotation ID must be the same when updating bodies";
355
+ const l = e.get(i.annotation);
356
+ if (l) {
357
+ const g = l.bodies.find((T) => T.id === i.id), C = {
358
+ ...l,
359
+ bodies: l.bodies.map((T) => T.id === g.id ? c : T)
360
+ };
361
+ return e.set(l.id, C), g.id !== c.id && (n.delete(g.id), n.set(c.id, C.id)), {
362
+ oldValue: l,
363
+ newValue: C,
364
+ bodiesUpdated: [{ oldBody: g, newBody: c }]
365
+ };
366
+ } else
367
+ console.warn(`Attempt to add body to missing annotation ${i.annotation}`);
368
+ }, N = (i, c, l = S.LOCAL) => {
369
+ const g = R(i, c);
370
+ g && f(l, { updated: [g] });
371
+ }, x = (i, c = S.LOCAL) => {
372
+ const l = i.map((g) => R({ id: g.id, annotation: g.annotation }, g)).filter(Boolean);
373
+ f(c, { updated: l });
374
+ }, j = (i) => {
375
+ const c = e.get(i.annotation);
376
+ if (c) {
377
+ const l = {
378
+ ...c,
379
+ target: {
380
+ ...c.target,
381
+ ...i
382
+ }
383
+ };
384
+ return e.set(c.id, l), {
385
+ oldValue: c,
386
+ newValue: l,
387
+ targetUpdated: {
388
+ oldTarget: c.target,
389
+ newTarget: i
390
+ }
391
+ };
392
+ } else
393
+ console.warn(`Attempt to update target on missing annotation: ${i.annotation}`);
394
+ };
395
+ return {
396
+ addAnnotation: w,
397
+ addBody: L,
398
+ all: a,
399
+ bulkAddAnnotation: m,
400
+ bulkDeleteAnnotation: O,
401
+ bulkDeleteBodies: s,
402
+ bulkUpdateAnnotation: p,
403
+ bulkUpdateBodies: x,
404
+ bulkUpdateTargets: (i, c = S.LOCAL) => {
405
+ const l = i.map((g) => j(g)).filter(Boolean);
406
+ l.length > 0 && f(c, { updated: l });
407
+ },
408
+ clear: E,
409
+ deleteAnnotation: U,
410
+ deleteBody: u,
411
+ getAnnotation: h,
412
+ getBody: A,
413
+ observe: o,
414
+ unobserve: d,
415
+ updateAnnotation: y,
416
+ updateBody: N,
417
+ updateTarget: (i, c = S.LOCAL) => {
418
+ const l = j(i);
419
+ l && f(c, { updated: [l] });
420
+ }
421
+ };
422
+ }, Te = (e) => ({
423
+ ...e,
424
+ subscribe: (t) => {
425
+ const o = (d) => t(d.state);
426
+ return e.observe(o), t(e.all()), () => e.unobserve(o);
427
+ }
428
+ });
429
+ let G = () => ({
430
+ emit(e, ...n) {
431
+ for (let t = 0, o = this.events[e] || [], d = o.length; t < d; t++)
432
+ o[t](...n);
433
+ },
434
+ events: {},
435
+ on(e, n) {
436
+ var t;
437
+ return ((t = this.events)[e] || (t[e] = [])).push(n), () => {
438
+ var o;
439
+ this.events[e] = (o = this.events[e]) == null ? void 0 : o.filter((d) => n !== d);
440
+ };
441
+ }
442
+ });
443
+ const ae = 250, De = (e) => {
444
+ const n = G(), t = [];
445
+ let o = -1, d = !1, f = 0;
446
+ const w = (s) => {
447
+ if (!d) {
448
+ const { changes: h } = s, A = performance.now();
449
+ if (A - f > ae)
450
+ t.splice(o + 1), t.push(h), o = t.length - 1;
451
+ else {
452
+ const R = t.length - 1;
453
+ t[R] = de(t[R], h);
454
+ }
455
+ f = A;
456
+ }
457
+ d = !1;
458
+ };
459
+ e.observe(w, { origin: S.LOCAL });
460
+ const b = (s) => s && s.length > 0 && e.bulkDeleteAnnotation(s), y = (s) => s && s.length > 0 && e.bulkAddAnnotation(s, !1), p = (s) => s && s.length > 0 && e.bulkUpdateAnnotation(s.map(({ oldValue: h }) => h)), L = (s) => s && s.length > 0 && e.bulkUpdateAnnotation(s.map(({ newValue: h }) => h)), a = (s) => s && s.length > 0 && e.bulkAddAnnotation(s, !1), E = (s) => s && s.length > 0 && e.bulkDeleteAnnotation(s);
461
+ return {
462
+ canRedo: () => t.length - 1 > o,
463
+ canUndo: () => o > -1,
464
+ destroy: () => e.unobserve(w),
465
+ on: (s, h) => n.on(s, h),
466
+ redo: () => {
467
+ if (t.length - 1 > o) {
468
+ d = !0;
469
+ const { created: s, updated: h, deleted: A } = t[o + 1];
470
+ y(s), L(h), E(A), n.emit("redo", t[o + 1]), o += 1;
471
+ }
472
+ },
473
+ undo: () => {
474
+ if (o > -1) {
475
+ d = !0;
476
+ const { created: s, updated: h, deleted: A } = t[o];
477
+ b(s), p(h), a(A), n.emit("undo", t[o]), o -= 1;
478
+ }
479
+ }
480
+ };
481
+ }, Re = () => {
482
+ const { subscribe: e, set: n } = Y([]);
483
+ return {
484
+ subscribe: e,
485
+ set: n
486
+ };
487
+ }, Be = (e, n, t, o) => {
488
+ const { store: d, selection: f, hover: w, viewport: b } = e, y = /* @__PURE__ */ new Map();
489
+ let p = [], L, a;
490
+ const E = (r, u) => {
491
+ y.has(r) ? y.get(r).push(u) : y.set(r, [u]);
492
+ }, m = (r, u) => {
493
+ const s = y.get(r);
494
+ if (s) {
495
+ const h = s.indexOf(u);
496
+ h !== -1 && s.splice(h, 1);
497
+ }
498
+ }, v = (r, u, s) => {
499
+ y.has(r) && setTimeout(() => {
500
+ y.get(r).forEach((h) => {
501
+ if (t) {
502
+ const A = Array.isArray(u) ? u.map((N) => t.serialize(N)) : t.serialize(u), R = s ? s instanceof PointerEvent ? s : t.serialize(s) : void 0;
503
+ h(A, R);
504
+ } else
505
+ h(u, s);
506
+ });
507
+ }, 1);
508
+ }, U = () => {
509
+ const { selected: r } = f, u = (r || []).map(({ id: s }) => d.getAnnotation(s));
510
+ u.forEach((s) => {
511
+ const h = p.find((A) => A.id === s.id);
512
+ (!h || !B(h, s)) && v("updateAnnotation", s, h);
513
+ }), p = p.map((s) => {
514
+ const h = u.find(({ id: A }) => A === s.id);
515
+ return h || s;
516
+ });
517
+ };
518
+ f.subscribe(({ selected: r }) => {
519
+ if (!(p.length === 0 && r.length === 0)) {
520
+ if (p.length === 0 && r.length > 0)
521
+ p = r.map(({ id: u }) => d.getAnnotation(u));
522
+ else if (p.length > 0 && r.length === 0)
523
+ p.forEach((u) => {
524
+ const s = d.getAnnotation(u.id);
525
+ s && !B(s, u) && v("updateAnnotation", s, u);
526
+ }), p = [];
527
+ else {
528
+ const u = new Set(p.map((A) => A.id)), s = new Set(r.map(({ id: A }) => A));
529
+ p.filter((A) => !s.has(A.id)).forEach((A) => {
530
+ const R = d.getAnnotation(A.id);
531
+ R && !B(R, A) && v("updateAnnotation", R, A);
532
+ }), p = [
533
+ // Remove annotations that were deselected
534
+ ...p.filter((A) => s.has(A.id)),
535
+ // Add editable annotations that were selected
536
+ ...r.filter(({ id: A }) => !u.has(A)).map(({ id: A }) => d.getAnnotation(A))
537
+ ];
538
+ }
539
+ v("selectionChanged", p);
540
+ }
541
+ }), w.subscribe((r) => {
542
+ !L && r ? v("mouseEnterAnnotation", d.getAnnotation(r)) : L && !r ? v("mouseLeaveAnnotation", d.getAnnotation(L)) : L && r && (v("mouseLeaveAnnotation", d.getAnnotation(L)), v("mouseEnterAnnotation", d.getAnnotation(r))), L = r;
543
+ }), b == null || b.subscribe((r) => v("viewportIntersect", r.map((u) => d.getAnnotation(u)))), d.observe((r) => {
544
+ o && (a && clearTimeout(a), a = setTimeout(U, 1e3));
545
+ const { created: u, deleted: s } = r.changes;
546
+ (u || []).forEach((A) => v("createAnnotation", A)), (s || []).forEach((A) => v("deleteAnnotation", A)), (r.changes.updated || []).filter((A) => [
547
+ ...A.bodiesCreated || [],
548
+ ...A.bodiesDeleted || [],
549
+ ...A.bodiesUpdated || []
550
+ ].length > 0).forEach(({ oldValue: A, newValue: R }) => {
551
+ const N = p.find((x) => x.id === A.id) || A;
552
+ p = p.map((x) => x.id === A.id ? R : x), v("updateAnnotation", R, N);
553
+ });
554
+ }, { origin: S.LOCAL }), d.observe((r) => {
555
+ if (p) {
556
+ const u = new Set(p.map((h) => h.id)), s = (r.changes.updated || []).filter(({ newValue: h }) => u.has(h.id)).map(({ newValue: h }) => h);
557
+ s.length > 0 && (p = p.map((h) => {
558
+ const A = s.find((R) => R.id === h.id);
559
+ return A || h;
560
+ }));
561
+ }
562
+ }, { origin: S.REMOTE });
563
+ const O = (r) => (u) => {
564
+ const { updated: s } = u;
565
+ r ? (s || []).forEach((h) => v("updateAnnotation", h.oldValue, h.newValue)) : (s || []).forEach((h) => v("updateAnnotation", h.newValue, h.oldValue));
566
+ };
567
+ return n.on("undo", O(!0)), n.on("redo", O(!1)), { on: E, off: m, emit: v };
568
+ }, xe = (e) => (n) => n.map((t) => e.serialize(t)), ce = (e) => (n) => n.reduce((t, o) => {
569
+ const { parsed: d, error: f } = e.parse(o);
570
+ return f ? {
571
+ parsed: t.parsed,
572
+ failed: [...t.failed, o]
573
+ } : d ? {
574
+ parsed: [...t.parsed, d],
575
+ failed: t.failed
576
+ } : {
577
+ ...t
578
+ };
579
+ }, { parsed: [], failed: [] }), Ie = (e, n, t) => {
580
+ const { store: o, selection: d } = e, f = (r) => {
581
+ if (t) {
582
+ const { parsed: u, error: s } = t.parse(r);
583
+ u ? o.addAnnotation(u, S.REMOTE) : console.error(s);
584
+ } else
585
+ o.addAnnotation(r, S.REMOTE);
586
+ }, w = () => d.clear(), b = () => o.clear(), y = (r) => {
587
+ const u = o.getAnnotation(r);
588
+ return t && u ? t.serialize(u) : u;
589
+ }, p = () => t ? o.all().map(t.serialize) : o.all(), L = () => {
590
+ var s;
591
+ const u = (((s = d.selected) == null ? void 0 : s.map((h) => h.id)) || []).map((h) => o.getAnnotation(h)).filter(Boolean);
592
+ return t ? u.map(t.serialize) : u;
593
+ }, a = (r, u = !0) => fetch(r).then((s) => s.json()).then((s) => (m(s, u), s)), E = (r) => {
594
+ if (typeof r == "string") {
595
+ const u = o.getAnnotation(r);
596
+ if (o.deleteAnnotation(r), u)
597
+ return t ? t.serialize(u) : u;
598
+ } else {
599
+ const u = t ? t.parse(r).parsed : r;
600
+ if (u)
601
+ return o.deleteAnnotation(u), r;
602
+ }
603
+ }, m = (r, u = !0) => {
604
+ if (t) {
605
+ const { parsed: s, failed: h } = ce(t)(r);
606
+ h.length > 0 && console.warn(`Discarded ${h.length} invalid annotations`, h), o.bulkAddAnnotation(s, u, S.REMOTE);
607
+ } else
608
+ o.bulkAddAnnotation(r, u, S.REMOTE);
609
+ }, v = (r, u) => {
610
+ r ? d.setSelected(r, u) : d.clear();
611
+ }, U = (r) => {
612
+ d.clear(), d.setUserSelectAction(r);
613
+ }, O = (r) => {
614
+ if (t) {
615
+ const u = t.parse(r).parsed, s = t.serialize(o.getAnnotation(u.id));
616
+ return o.updateAnnotation(u), s;
617
+ } else {
618
+ const u = o.getAnnotation(r.id);
619
+ return o.updateAnnotation(r), u;
620
+ }
621
+ };
622
+ return {
623
+ addAnnotation: f,
624
+ cancelSelected: w,
625
+ canRedo: n.canRedo,
626
+ canUndo: n.canUndo,
627
+ clearAnnotations: b,
628
+ getAnnotationById: y,
629
+ getAnnotations: p,
630
+ getSelected: L,
631
+ loadAnnotations: a,
632
+ redo: n.redo,
633
+ removeAnnotation: E,
634
+ setAnnotations: m,
635
+ setSelected: v,
636
+ setUserSelectAction: U,
637
+ undo: n.undo,
638
+ updateAnnotation: O
639
+ };
640
+ }, le = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
641
+ let ue = (e) => crypto.getRandomValues(new Uint8Array(e)), fe = (e, n, t) => {
642
+ let o = (2 << Math.log(e.length - 1) / Math.LN2) - 1, d = -~(1.6 * o * n / e.length);
643
+ return (f = n) => {
644
+ let w = "";
645
+ for (; ; ) {
646
+ let b = t(d), y = d;
647
+ for (; y--; )
648
+ if (w += e[b[y] & o] || "", w.length === f) return w;
649
+ }
650
+ };
651
+ }, pe = (e, n = 21) => fe(e, n, ue), he = (e = 21) => {
652
+ let n = "", t = crypto.getRandomValues(new Uint8Array(e));
653
+ for (; e--; )
654
+ n += le[t[e] & 63];
655
+ return n;
656
+ };
657
+ const ke = () => ({ isGuest: !0, id: pe("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_", 20)() }), ge = (e) => {
658
+ const n = JSON.stringify(e);
659
+ let t = 0;
660
+ for (let o = 0, d = n.length; o < d; o++) {
661
+ let f = n.charCodeAt(o);
662
+ t = (t << 5) - t + f, t |= 0;
663
+ }
664
+ return `${t}`;
665
+ }, me = (e) => e ? typeof e == "object" ? { ...e } : e : void 0, Ne = (e, n) => (Array.isArray(e) ? e : [e]).map((t) => {
666
+ const { id: o, type: d, purpose: f, value: w, created: b, modified: y, creator: p, ...L } = t;
667
+ return {
668
+ id: o || `temp-${ge(t)}`,
669
+ annotation: n,
670
+ type: d,
671
+ purpose: f,
672
+ value: w,
673
+ creator: me(p),
674
+ created: b ? new Date(b) : void 0,
675
+ updated: y ? new Date(y) : void 0,
676
+ ...L
677
+ };
678
+ }), $e = (e) => e.map((n) => {
679
+ var b;
680
+ const { annotation: t, created: o, updated: d, ...f } = n, w = {
681
+ ...f,
682
+ created: o == null ? void 0 : o.toISOString(),
683
+ modified: d == null ? void 0 : d.toISOString()
684
+ };
685
+ return (b = w.id) != null && b.startsWith("temp-") && delete w.id, w;
686
+ }), Ae = [
687
+ "#ff7c00",
688
+ // orange
689
+ "#1ac938",
690
+ // green
691
+ "#e8000b",
692
+ // red
693
+ "#8b2be2",
694
+ // purple
695
+ "#9f4800",
696
+ // brown
697
+ "#f14cc1",
698
+ // pink
699
+ "#ffc400",
700
+ // khaki
701
+ "#00d7ff",
702
+ // cyan
703
+ "#023eff"
704
+ // blue
705
+ ], be = () => {
706
+ const e = [...Ae];
707
+ return { assignRandomColor: () => {
708
+ const o = Math.floor(Math.random() * e.length), d = e[o];
709
+ return e.splice(o, 1), d;
710
+ }, releaseColor: (o) => e.push(o) };
711
+ }, ve = () => {
712
+ const e = be();
713
+ return { addUser: (o, d) => {
714
+ const f = e.assignRandomColor();
715
+ return {
716
+ label: d.name || d.id,
717
+ avatar: d.avatar,
718
+ color: f
719
+ };
720
+ }, removeUser: (o) => e.releaseColor(o.appearance.color) };
721
+ }, Ee = (e, n) => e.every((t) => e.includes(t)) && n.every((t) => e.includes(t)), ze = he(), Ve = (e = ve()) => {
722
+ const n = G(), t = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), d = (a, E) => {
723
+ if (t.has(a)) {
724
+ console.warn("Attempt to add user that is already present", a, E);
725
+ return;
726
+ }
727
+ const m = e.addUser(a, E);
728
+ t.set(a, {
729
+ ...E,
730
+ presenceKey: a,
731
+ appearance: m
732
+ });
733
+ }, f = (a) => {
734
+ const E = t.get(a);
735
+ if (!E) {
736
+ console.warn("Attempt to remove user that is not present", a);
737
+ return;
738
+ }
739
+ e.removeUser(E), t.delete(a);
740
+ }, w = (a) => {
741
+ const E = new Set(a.map((U) => U.presenceKey)), m = a.filter(({ presenceKey: U }) => !t.has(U)), v = Array.from(t.values()).filter((U) => !E.has(U.presenceKey));
742
+ m.forEach(({ presenceKey: U, user: O }) => d(U, O)), v.forEach((U) => {
743
+ const { presenceKey: O } = U;
744
+ o.has(O) && n.emit("selectionChange", U, null), f(O);
745
+ }), (m.length > 0 || v.length > 0) && n.emit("presence", p());
746
+ }, b = (a, E) => {
747
+ const m = t.get(a);
748
+ if (!m) {
749
+ console.warn("Activity notification from user that is not present");
750
+ return;
751
+ }
752
+ const v = o.get(a);
753
+ (!v || !Ee(v, E)) && (o.set(a, E), n.emit("selectionChange", m, E));
754
+ }, y = (a, E) => {
755
+ const m = t.get(a);
756
+ if (!m) {
757
+ console.warn("Selection change for user that is not present", a);
758
+ return;
759
+ }
760
+ E ? o.set(a, E) : o.delete(a), n.emit("selectionChange", m, E);
761
+ }, p = () => [...Array.from(t.values())];
762
+ return {
763
+ getPresentUsers: p,
764
+ notifyActivity: b,
765
+ on: (a, E) => n.on(a, E),
766
+ syncUsers: w,
767
+ updateSelection: y
768
+ };
769
+ };
770
+ export {
771
+ se as Ignore,
772
+ S as Origin,
773
+ ze as PRESENCE_KEY,
774
+ F as UserSelectAction,
775
+ ke as createAnonymousGuest,
776
+ Ie as createBaseAnnotator,
777
+ Se as createBody,
778
+ ve as createDefaultAppearenceProvider,
779
+ Ce as createHoverState,
780
+ Be as createLifecycleObserver,
781
+ Ve as createPresenceState,
782
+ Ue as createSelectionState,
783
+ Oe as createStore,
784
+ De as createUndoStack,
785
+ Re as createViewportState,
786
+ be as defaultColorProvider,
787
+ q as diffAnnotations,
788
+ Le as getContributors,
789
+ de as mergeChanges,
790
+ P as onUserSelect,
791
+ ce as parseAll,
792
+ Ne as parseW3CBodies,
793
+ me as parseW3CUser,
794
+ xe as serializeAll,
795
+ $e as serializeW3CBodies,
796
+ ie as shouldNotify,
797
+ Te as toSvelteStore
798
+ };
799
+ //# sourceMappingURL=annotorious-core.es.js.map