@annotorious/core 3.0.0-rc.21 → 3.0.0-rc.4

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 (90) hide show
  1. package/package.json +15 -18
  2. package/{dist/index.d.ts → src/index.ts} +0 -1
  3. package/src/lifecycle/Lifecycle.ts +211 -0
  4. package/src/lifecycle/LifecycleEvents.ts +21 -0
  5. package/src/lifecycle/index.ts +2 -0
  6. package/src/model/Annotation.ts +73 -0
  7. package/src/model/Annotator.ts +199 -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 +344 -0
  25. package/src/state/StoreObserver.ts +194 -0
  26. package/src/state/SvelteStore.ts +54 -0
  27. package/src/state/UndoStack.ts +143 -0
  28. package/src/state/Viewport.ts +14 -0
  29. package/{dist/state/index.d.ts → src/state/index.ts} +1 -2
  30. package/src/utils/annotationUtils.ts +33 -0
  31. package/src/utils/diffAnnotations.ts +39 -0
  32. package/{dist/utils/index.d.ts → src/utils/index.ts} +1 -1
  33. package/src/vite-env.d.ts +1 -0
  34. package/dist/annotorious-core.es.js +0 -776
  35. package/dist/annotorious-core.es.js.map +0 -1
  36. package/dist/index.d.ts.map +0 -1
  37. package/dist/lifecycle/Lifecycle.d.ts +0 -10
  38. package/dist/lifecycle/Lifecycle.d.ts.map +0 -1
  39. package/dist/lifecycle/LifecycleEvents.d.ts +0 -12
  40. package/dist/lifecycle/LifecycleEvents.d.ts.map +0 -1
  41. package/dist/lifecycle/index.d.ts +0 -3
  42. package/dist/lifecycle/index.d.ts.map +0 -1
  43. package/dist/model/Annotation.d.ts +0 -32
  44. package/dist/model/Annotation.d.ts.map +0 -1
  45. package/dist/model/Annotator.d.ts +0 -63
  46. package/dist/model/Annotator.d.ts.map +0 -1
  47. package/dist/model/DrawingStyle.d.ts.map +0 -1
  48. package/dist/model/Filter.d.ts.map +0 -1
  49. package/dist/model/FormatAdapter.d.ts +0 -15
  50. package/dist/model/FormatAdapter.d.ts.map +0 -1
  51. package/dist/model/User.d.ts +0 -11
  52. package/dist/model/User.d.ts.map +0 -1
  53. package/dist/model/W3CAnnotation.d.ts +0 -41
  54. package/dist/model/W3CAnnotation.d.ts.map +0 -1
  55. package/dist/model/index.d.ts.map +0 -1
  56. package/dist/presence/Appearance.d.ts +0 -6
  57. package/dist/presence/Appearance.d.ts.map +0 -1
  58. package/dist/presence/AppearanceProvider.d.ts +0 -16
  59. package/dist/presence/AppearanceProvider.d.ts.map +0 -1
  60. package/dist/presence/ColorPalette.d.ts +0 -3
  61. package/dist/presence/ColorPalette.d.ts.map +0 -1
  62. package/dist/presence/PresenceEvents.d.ts +0 -6
  63. package/dist/presence/PresenceEvents.d.ts.map +0 -1
  64. package/dist/presence/PresenceProvider.d.ts +0 -5
  65. package/dist/presence/PresenceProvider.d.ts.map +0 -1
  66. package/dist/presence/PresenceState.d.ts +0 -18
  67. package/dist/presence/PresenceState.d.ts.map +0 -1
  68. package/dist/presence/PresentUser.d.ts +0 -7
  69. package/dist/presence/PresentUser.d.ts.map +0 -1
  70. package/dist/presence/index.d.ts.map +0 -1
  71. package/dist/state/Hover.d.ts +0 -10
  72. package/dist/state/Hover.d.ts.map +0 -1
  73. package/dist/state/Selection.d.ts +0 -31
  74. package/dist/state/Selection.d.ts.map +0 -1
  75. package/dist/state/Store.d.ts +0 -30
  76. package/dist/state/Store.d.ts.map +0 -1
  77. package/dist/state/StoreObserver.d.ts +0 -57
  78. package/dist/state/StoreObserver.d.ts.map +0 -1
  79. package/dist/state/SvelteStore.d.ts +0 -22
  80. package/dist/state/SvelteStore.d.ts.map +0 -1
  81. package/dist/state/UndoStack.d.ts +0 -18
  82. package/dist/state/UndoStack.d.ts.map +0 -1
  83. package/dist/state/Viewport.d.ts +0 -7
  84. package/dist/state/Viewport.d.ts.map +0 -1
  85. package/dist/state/index.d.ts.map +0 -1
  86. package/dist/utils/annotationUtils.d.ts +0 -11
  87. package/dist/utils/annotationUtils.d.ts.map +0 -1
  88. package/dist/utils/diffAnnotations.d.ts +0 -4
  89. package/dist/utils/diffAnnotations.d.ts.map +0 -1
  90. package/dist/utils/index.d.ts.map +0 -1
@@ -1,776 +0,0 @@
1
- var _ = 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 (_.call(e, t) && ++o && !_.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 z() {
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 Y(e, n = z) {
34
- let t;
35
- const o = /* @__PURE__ */ new Set();
36
- function i(E) {
37
- if (W(e, E) && (e = E, 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(E) {
49
- i(E(e));
50
- }
51
- function U(E, w = z) {
52
- const u = [E, w];
53
- return o.add(u), o.size === 1 && (t = n(i, p) || z), E(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 ve = (e) => {
60
- const { subscribe: n, set: t } = Y();
61
- let o;
62
- return n((i) => o = i), e.observe(({ changes: i }) => {
63
- if (o) {
64
- (i.deleted || []).some((E) => E.id === o) && t(void 0);
65
- const U = (i.updated || []).find(({ oldValue: E }) => E.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: [] }, ye = (e, n = "EDIT") => {
78
- const { subscribe: t, set: o } = Y(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
- }, E = (s) => {
85
- if (i.selected.length === 0)
86
- return !1;
87
- const h = typeof s == "string" ? s : s.id;
88
- return i.selected.some((C) => C.id === h);
89
- }, w = (s, h) => {
90
- const C = e.getAnnotation(s);
91
- if (C) {
92
- const b = G(C, n);
93
- o(b === "EDIT" ? { selected: [{ id: s, editable: !0 }], pointerEvent: h } : b === "SELECT" ? { selected: [{ id: s }], pointerEvent: h } : { selected: [], pointerEvent: h });
94
- } else
95
- console.warn("Invalid selection: " + s);
96
- }, u = (s, h = !0) => {
97
- const C = Array.isArray(s) ? s : [s], b = C.map((S) => e.getAnnotation(S)).filter(Boolean);
98
- o({ selected: b.map(({ id: S }) => ({ id: S, editable: h })) }), b.length !== C.length && console.warn("Invalid selection", s);
99
- }, L = (s) => {
100
- if (i.selected.length === 0)
101
- return !1;
102
- const { selected: h } = i;
103
- h.filter(({ id: b }) => s.includes(b)).length > 0 && o({ selected: h.filter(({ id: b }) => !s.includes(b)) });
104
- };
105
- return e.observe(({ changes: s }) => L((s.deleted || []).map((h) => h.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: E,
116
- setSelected: u,
117
- subscribe: t
118
- };
119
- }, G = (e, n) => typeof n == "function" ? n(e) || "EDIT" : n || "EDIT";
120
- let $;
121
- const H = new Uint8Array(16);
122
- function F() {
123
- if (!$ && ($ = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !$))
124
- throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
125
- return $(H);
126
- }
127
- const D = [];
128
- for (let e = 0; e < 256; ++e)
129
- D.push((e + 256).toString(16).slice(1));
130
- function J(e, n = 0) {
131
- 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]];
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 we = (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
- }, Ce = (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 || {}), O = /* @__PURE__ */ ((e) => (e.LOCAL = "LOCAL", e.REMOTE = "REMOTE", e))(O || {});
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: E } = e.options, w = (L) => L && L.length > 0;
190
- if (!(w(t.created) || w(t.deleted))) {
191
- const L = (p = t.updated) == null ? void 0 : p.some((h) => w(h.bodiesCreated) || w(h.bodiesDeleted) || w(h.bodiesUpdated)), s = (U = t.updated) == null ? void 0 : U.some((h) => h.targetUpdated);
192
- if (E === "BODY_ONLY" && L && !s || E === "TARGET_ONLY" && s && !L)
193
- return !1;
194
- }
195
- }
196
- if (e.options.annotations) {
197
- const E = /* @__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) => E.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)), E = 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: h }) => h.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
- ], L = [
213
- ...(e.updated || []).filter(({ newValue: s }) => !p.has(s.id)).map((s) => {
214
- const { oldValue: h, newValue: C } = s;
215
- if (U.has(C.id)) {
216
- const b = n.updated.find((S) => S.oldValue.id === C.id).newValue;
217
- return M(h, b);
218
- } else
219
- return s;
220
- }),
221
- ...(n.updated || []).filter(({ oldValue: s }) => !E.has(s.id))
222
- ];
223
- return { created: w, deleted: u, updated: L };
224
- }, ie = (e) => e.id !== void 0, Ue = () => {
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((a) => a.onChange == d);
227
- l > -1 && t.splice(l, 1);
228
- }, p = (d, l) => {
229
- const a = {
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, a) && f.onChange(a);
240
- });
241
- }, U = (d, l = O.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
- }, E = (d, l) => {
246
- const a = typeof d == "string" ? l : d, f = typeof d == "string" ? d : d.id, v = e.get(f);
247
- if (v) {
248
- const T = M(v, a);
249
- return f === a.id ? e.set(f, a) : (e.delete(f), e.set(a.id, a)), v.bodies.forEach((B) => n.delete(B.id)), a.bodies.forEach((B) => n.set(B.id, a.id)), T;
250
- } else
251
- console.warn(`Cannot update annotation ${f} - does not exist`);
252
- }, w = (d, l = O.LOCAL, a = O.LOCAL) => {
253
- const f = ie(l) ? a : l, v = E(d, l);
254
- v && p(f, { updated: [v] });
255
- }, u = (d, l = O.LOCAL) => {
256
- const a = d.reduce((f, v) => {
257
- const T = E(v);
258
- return T ? [...f, T] : f;
259
- }, []);
260
- a.length > 0 && p(l, { updated: a });
261
- }, L = (d, l = O.LOCAL) => {
262
- const a = e.get(d.annotation);
263
- if (a) {
264
- const f = {
265
- ...a,
266
- bodies: [...a.bodies, d]
267
- };
268
- e.set(a.id, f), n.set(d.id, f.id), p(l, { updated: [{
269
- oldValue: a,
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()], h = (d = O.LOCAL) => {
276
- const l = [...e.values()];
277
- e.clear(), n.clear(), p(d, { deleted: l });
278
- }, C = (d, l = !0, a = O.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((T) => n.set(T.id, v.id));
283
- }), p(a, { created: d, deleted: f });
284
- } else {
285
- const f = d.reduce((v, T) => {
286
- const B = e.get(T.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((T) => n.set(T.id, v.id));
293
- }), p(a, { created: d });
294
- }
295
- }, b = (d) => {
296
- const l = typeof d == "string" ? d : d.id, a = e.get(l);
297
- if (a)
298
- return e.delete(l), a.bodies.forEach((f) => n.delete(f.id)), a;
299
- console.warn(`Attempt to delete missing annotation: ${l}`);
300
- }, S = (d, l = O.LOCAL) => {
301
- const a = b(d);
302
- a && p(l, { deleted: [a] });
303
- }, y = (d, l = O.LOCAL) => {
304
- const a = d.reduce((f, v) => {
305
- const T = b(v);
306
- return T ? [...f, T] : f;
307
- }, []);
308
- a.length > 0 && p(l, { deleted: a });
309
- }, c = (d, l = O.LOCAL) => {
310
- const a = e.get(d.annotation);
311
- if (a) {
312
- const f = a.bodies.find((v) => v.id === d.id);
313
- if (f) {
314
- n.delete(f.id);
315
- const v = {
316
- ...a,
317
- bodies: a.bodies.filter((B) => B.id !== d.id)
318
- };
319
- e.set(a.id, v), p(l, { updated: [{
320
- oldValue: a,
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
- }, g = (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 = g(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
- }, A = (d, l) => {
341
- if (d.annotation !== l.annotation)
342
- throw "Annotation integrity violation: annotation ID must be the same when updating bodies";
343
- const a = e.get(d.annotation);
344
- if (a) {
345
- const f = a.bodies.find((T) => T.id === d.id), v = {
346
- ...a,
347
- bodies: a.bodies.map((T) => T.id === f.id ? l : T)
348
- };
349
- return e.set(a.id, v), f.id !== l.id && (n.delete(f.id), n.set(l.id, v.id)), {
350
- oldValue: a,
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
- }, m = (d, l, a = O.LOCAL) => {
357
- const f = A(d, l);
358
- f && p(a, { updated: [f] });
359
- }, R = (d, l = O.LOCAL) => {
360
- const a = d.map((f) => A({ id: f.id, annotation: f.annotation }, f)).filter(Boolean);
361
- p(l, { updated: a });
362
- }, I = (d) => {
363
- const l = e.get(d.annotation);
364
- if (l) {
365
- const a = {
366
- ...l,
367
- target: {
368
- ...l.target,
369
- ...d
370
- }
371
- };
372
- return e.set(l.id, a), {
373
- oldValue: l,
374
- newValue: a,
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: L,
386
- all: s,
387
- bulkAddAnnotation: C,
388
- bulkDeleteAnnotation: y,
389
- bulkUpdateAnnotation: u,
390
- bulkUpdateBodies: R,
391
- bulkUpdateTargets: (d, l = O.LOCAL) => {
392
- const a = d.map((f) => I(f)).filter(Boolean);
393
- a.length > 0 && p(l, { updated: a });
394
- },
395
- clear: h,
396
- deleteAnnotation: S,
397
- deleteBody: c,
398
- getAnnotation: g,
399
- getBody: r,
400
- observe: o,
401
- unobserve: i,
402
- updateAnnotation: w,
403
- updateBody: m,
404
- updateTarget: (d, l = O.LOCAL) => {
405
- const a = I(d);
406
- a && p(l, { updated: [a] });
407
- }
408
- };
409
- }, Le = (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, Se = (e) => {
431
- const n = P(), t = [];
432
- let o = -1, i = !1, p = 0;
433
- const U = (r) => {
434
- if (!i) {
435
- const { changes: A } = r, m = performance.now();
436
- if (m - p > de)
437
- t.splice(o + 1), t.push(A), o = t.length - 1;
438
- else {
439
- const R = t.length - 1;
440
- t[R] = se(t[R], A);
441
- }
442
- p = m;
443
- }
444
- i = !1;
445
- };
446
- e.observe(U, { origin: O.LOCAL });
447
- const E = (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: A }) => A)), L = (r) => r && r.length > 0 && e.bulkUpdateAnnotation(r.map(({ newValue: A }) => A)), s = (r) => r && r.length > 0 && e.bulkAddAnnotation(r, !1), h = (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, A) => n.on(r, A),
453
- redo: () => {
454
- if (t.length - 1 > o) {
455
- i = !0;
456
- const { created: r, updated: A, deleted: m } = t[o + 1];
457
- w(r), L(A), h(m), n.emit("redo", t[o + 1]), o += 1;
458
- }
459
- },
460
- undo: () => {
461
- if (o > -1) {
462
- i = !0;
463
- const { created: r, updated: A, deleted: m } = t[o];
464
- E(r), u(A), s(m), n.emit("undo", t[o]), o -= 1;
465
- }
466
- }
467
- };
468
- }, Oe = () => {
469
- const { subscribe: e, set: n } = Y([]);
470
- return {
471
- subscribe: e,
472
- set: n
473
- };
474
- }, Te = (e, n, t, o) => {
475
- const { store: i, selection: p, hover: U, viewport: E } = e, w = /* @__PURE__ */ new Map();
476
- let u = [], L, s;
477
- const h = (c, g) => {
478
- w.has(c) ? w.get(c).push(g) : w.set(c, [g]);
479
- }, C = (c, g) => {
480
- const r = w.get(c);
481
- r && r.indexOf(g) > 0 && r.splice(r.indexOf(g), 1);
482
- }, b = (c, g, r) => {
483
- w.has(c) && setTimeout(() => {
484
- w.get(c).forEach((A) => {
485
- if (t) {
486
- const m = Array.isArray(g) ? g.map((I) => t.serialize(I)) : t.serialize(g), R = r ? r instanceof PointerEvent ? r : t.serialize(r) : void 0;
487
- A(m, R);
488
- } else
489
- A(g, r);
490
- });
491
- }, 1);
492
- }, S = () => {
493
- const { selected: c } = p, g = (c || []).map(({ id: r }) => i.getAnnotation(r));
494
- g.forEach((r) => {
495
- const A = u.find((m) => m.id === r.id);
496
- (!A || !x(A, r)) && b("updateAnnotation", r, A);
497
- }), u = u.map((r) => {
498
- const A = g.find(({ id: m }) => m === r.id);
499
- return A || r;
500
- });
501
- };
502
- p.subscribe(({ selected: c }) => {
503
- if (!(u.length === 0 && c.length === 0)) {
504
- if (u.length === 0 && c.length > 0)
505
- u = c.map(({ id: g }) => i.getAnnotation(g));
506
- else if (u.length > 0 && c.length === 0)
507
- u.forEach((g) => {
508
- const r = i.getAnnotation(g.id);
509
- r && !x(r, g) && b("updateAnnotation", r, g);
510
- }), u = [];
511
- else {
512
- const g = new Set(u.map((m) => m.id)), r = new Set(c.map(({ id: m }) => m));
513
- u.filter((m) => !r.has(m.id)).forEach((m) => {
514
- const R = i.getAnnotation(m.id);
515
- R && !x(R, m) && b("updateAnnotation", R, m);
516
- }), u = [
517
- // Remove annotations that were deselected
518
- ...u.filter((m) => r.has(m.id)),
519
- // Add editable annotations that were selected
520
- ...c.filter(({ id: m }) => !g.has(m)).map(({ id: m }) => i.getAnnotation(m))
521
- ];
522
- }
523
- b("selectionChanged", u);
524
- }
525
- }), U.subscribe((c) => {
526
- !L && c ? b("mouseEnterAnnotation", i.getAnnotation(c)) : L && !c ? b("mouseLeaveAnnotation", i.getAnnotation(L)) : L && c && (b("mouseLeaveAnnotation", i.getAnnotation(L)), b("mouseEnterAnnotation", i.getAnnotation(c))), L = c;
527
- }), E == null || E.subscribe((c) => b("viewportIntersect", c.map((g) => i.getAnnotation(g)))), i.observe((c) => {
528
- o && (s && clearTimeout(s), s = setTimeout(S, 1e3));
529
- const { created: g, deleted: r } = c.changes;
530
- (g || []).forEach((m) => b("createAnnotation", m)), (r || []).forEach((m) => b("deleteAnnotation", m)), (c.changes.updated || []).filter((m) => [
531
- ...m.bodiesCreated || [],
532
- ...m.bodiesDeleted || [],
533
- ...m.bodiesUpdated || []
534
- ].length > 0).forEach(({ oldValue: m, newValue: R }) => {
535
- const I = u.find((N) => N.id === m.id) || m;
536
- u = u.map((N) => N.id === m.id ? R : N), b("updateAnnotation", R, I);
537
- });
538
- }, { origin: O.LOCAL }), i.observe((c) => {
539
- if (u) {
540
- const g = new Set(u.map((A) => A.id)), r = (c.changes.updated || []).filter(({ newValue: A }) => g.has(A.id)).map(({ newValue: A }) => A);
541
- r.length > 0 && (u = u.map((A) => {
542
- const m = r.find((R) => R.id === A.id);
543
- return m || A;
544
- }));
545
- }
546
- }, { origin: O.REMOTE });
547
- const y = (c) => (g) => {
548
- const { updated: r } = g;
549
- c ? (r || []).forEach((A) => b("updateAnnotation", A.oldValue, A.newValue)) : (r || []).forEach((A) => b("updateAnnotation", A.newValue, A.oldValue));
550
- };
551
- return n.on("undo", y(!0)), n.on("redo", y(!1)), { on: h, off: C, emit: b };
552
- }, De = (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: [] }), Re = (e, n, t) => {
564
- const { store: o, selection: i } = e, p = (y) => {
565
- if (t) {
566
- const { parsed: c, error: g } = t.parse(y);
567
- c ? o.addAnnotation(c, O.REMOTE) : console.error(g);
568
- } else
569
- o.addAnnotation(y, O.REMOTE);
570
- }, U = () => i.clear(), E = () => o.clear(), w = (y) => {
571
- const c = o.getAnnotation(y);
572
- return t && c ? t.serialize(c) : c;
573
- }, u = () => t ? o.all().map(t.serialize) : o.all(), L = () => {
574
- var g;
575
- const c = (((g = i.selected) == null ? void 0 : g.map((r) => r.id)) || []).map((r) => o.getAnnotation(r)).filter(Boolean);
576
- return t ? c.map(t.serialize) : c;
577
- }, s = (y, c = !0) => fetch(y).then((g) => g.json()).then((g) => (C(g, c), g)), h = (y) => {
578
- if (typeof y == "string") {
579
- const c = o.getAnnotation(y);
580
- if (o.deleteAnnotation(y), c)
581
- return t ? t.serialize(c) : c;
582
- } else {
583
- const c = t ? t.parse(y).parsed : y;
584
- if (c)
585
- return o.deleteAnnotation(c), y;
586
- }
587
- }, C = (y, c = !0) => {
588
- if (t) {
589
- const { parsed: g, failed: r } = re(t)(y);
590
- r.length > 0 && console.warn(`Discarded ${r.length} invalid annotations`, r), o.bulkAddAnnotation(g, c, O.REMOTE);
591
- } else
592
- o.bulkAddAnnotation(y, c, O.REMOTE);
593
- }, b = (y) => {
594
- y ? i.setSelected(y) : i.clear();
595
- }, S = (y) => {
596
- if (t) {
597
- const c = t.parse(y).parsed, g = t.serialize(o.getAnnotation(c.id));
598
- return o.updateAnnotation(c), g;
599
- } else {
600
- const c = o.getAnnotation(y.id);
601
- return o.updateAnnotation(y), c;
602
- }
603
- };
604
- return {
605
- addAnnotation: p,
606
- cancelSelected: U,
607
- canRedo: n.canRedo,
608
- canUndo: n.canUndo,
609
- clearAnnotations: E,
610
- getAnnotationById: w,
611
- getAnnotations: u,
612
- getSelected: L,
613
- loadAnnotations: s,
614
- redo: n.redo,
615
- removeAnnotation: h,
616
- setAnnotations: C,
617
- setSelected: b,
618
- undo: n.undo,
619
- updateAnnotation: S
620
- };
621
- }, ae = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
622
- let ce = (e) => crypto.getRandomValues(new Uint8Array(e)), le = (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 E = t(i), w = i;
628
- for (; w--; )
629
- if (U += e[E[w] & o] || "", U.length === p)
630
- return U;
631
- }
632
- };
633
- }, ue = (e, n = 21) => le(e, n, ce), fe = (e = 21) => {
634
- let n = "", t = crypto.getRandomValues(new Uint8Array(e));
635
- for (; e--; )
636
- n += ae[t[e] & 63];
637
- return n;
638
- };
639
- const Be = () => ({ isGuest: !0, id: ue("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_", 20)() }), pe = (e) => {
640
- const n = JSON.stringify(e);
641
- let t = 0;
642
- for (let o = 0, i = n.length; o < i; o++) {
643
- let p = n.charCodeAt(o);
644
- t = (t << 5) - t + p, t |= 0;
645
- }
646
- return `${t}`;
647
- }, he = (e) => e ? typeof e == "object" ? { ...e } : e : void 0, xe = (e, n) => (Array.isArray(e) ? e : [e]).map((t) => {
648
- const { id: o, type: i, purpose: p, value: U, created: E, creator: w, ...u } = t;
649
- return {
650
- id: o || `temp-${pe(t)}`,
651
- annotation: n,
652
- type: i,
653
- purpose: p,
654
- value: U,
655
- created: E ? new Date(E) : void 0,
656
- creator: he(w),
657
- ...u
658
- };
659
- }), Ie = (e) => e.map((n) => {
660
- var o, i;
661
- const t = { ...n };
662
- return delete t.annotation, (o = t.id) != null && o.startsWith("temp-") && delete t.id, { ...t, created: (i = t.created) == null ? void 0 : i.toISOString() };
663
- }), ge = [
664
- "#ff7c00",
665
- // orange
666
- "#1ac938",
667
- // green
668
- "#e8000b",
669
- // red
670
- "#8b2be2",
671
- // purple
672
- "#9f4800",
673
- // brown
674
- "#f14cc1",
675
- // pink
676
- "#ffc400",
677
- // khaki
678
- "#00d7ff",
679
- // cyan
680
- "#023eff"
681
- // blue
682
- ], me = () => {
683
- const e = [...ge];
684
- return { assignRandomColor: () => {
685
- const o = Math.floor(Math.random() * e.length), i = e[o];
686
- return e.splice(o, 1), i;
687
- }, releaseColor: (o) => e.push(o) };
688
- }, Ae = () => {
689
- const e = me();
690
- return { addUser: (o, i) => {
691
- const p = e.assignRandomColor();
692
- return {
693
- label: i.name || i.id,
694
- avatar: i.avatar,
695
- color: p
696
- };
697
- }, removeUser: (o) => e.releaseColor(o.appearance.color) };
698
- }, be = (e, n) => e.every((t) => e.includes(t)) && n.every((t) => e.includes(t)), ke = fe(), Ne = (e = Ae()) => {
699
- const n = P(), t = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), i = (s, h) => {
700
- if (t.has(s)) {
701
- console.warn("Attempt to add user that is already present", s, h);
702
- return;
703
- }
704
- const C = e.addUser(s, h);
705
- t.set(s, {
706
- ...h,
707
- presenceKey: s,
708
- appearance: C
709
- });
710
- }, p = (s) => {
711
- const h = t.get(s);
712
- if (!h) {
713
- console.warn("Attempt to remove user that is not present", s);
714
- return;
715
- }
716
- e.removeUser(h), t.delete(s);
717
- }, U = (s) => {
718
- const h = new Set(s.map((S) => S.presenceKey)), C = s.filter(({ presenceKey: S }) => !t.has(S)), b = Array.from(t.values()).filter((S) => !h.has(S.presenceKey));
719
- C.forEach(({ presenceKey: S, user: y }) => i(S, y)), b.forEach((S) => {
720
- const { presenceKey: y } = S;
721
- o.has(y) && n.emit("selectionChange", S, null), p(y);
722
- }), (C.length > 0 || b.length > 0) && n.emit("presence", u());
723
- }, E = (s, h) => {
724
- const C = t.get(s);
725
- if (!C) {
726
- console.warn("Activity notification from user that is not present");
727
- return;
728
- }
729
- const b = o.get(s);
730
- (!b || !be(b, h)) && (o.set(s, h), n.emit("selectionChange", C, h));
731
- }, w = (s, h) => {
732
- const C = t.get(s);
733
- if (!C) {
734
- console.warn("Selection change for user that is not present", s);
735
- return;
736
- }
737
- h ? o.set(s, h) : o.delete(s), n.emit("selectionChange", C, h);
738
- }, u = () => [...Array.from(t.values())];
739
- return {
740
- getPresentUsers: u,
741
- notifyActivity: E,
742
- on: (s, h) => n.on(s, h),
743
- syncUsers: U,
744
- updateSelection: w
745
- };
746
- };
747
- export {
748
- ne as Ignore,
749
- O as Origin,
750
- ke as PRESENCE_KEY,
751
- q as PointerSelectAction,
752
- Be as createAnonymousGuest,
753
- Re as createBaseAnnotator,
754
- Ce as createBody,
755
- Ae as createDefaultAppearenceProvider,
756
- ve as createHoverState,
757
- Te as createLifecyleObserver,
758
- Ne as createPresenceState,
759
- ye as createSelectionState,
760
- Ue as createStore,
761
- Se as createUndoStack,
762
- Oe as createViewportState,
763
- me as defaultColorProvider,
764
- M as diffAnnotations,
765
- we as getContributors,
766
- se as mergeChanges,
767
- G as onPointerSelect,
768
- re as parseAll,
769
- xe as parseW3CBodies,
770
- he as parseW3CUser,
771
- De as serializeAll,
772
- Ie as serializeW3CBodies,
773
- oe as shouldNotify,
774
- Le as toSvelteStore
775
- };
776
- //# sourceMappingURL=annotorious-core.es.js.map