@annotorious/core 3.0.0-rc.19 → 3.0.0-rc.2

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