@ingcreators/annot-annotator 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -6,23 +6,26 @@ import { DOMParser as i, XMLSerializer as a } from "@xmldom/xmldom";
6
6
  var o = "data-annot-version", s = "annot", c = "https://ingcreators.com/annot/ns/1.0/";
7
7
  new TextEncoder().encode("http://ns.adobe.com/xap/1.0/\0"), new TextEncoder().encode("annot:OriginalImage\0");
8
8
  var l = new TextEncoder().encode("XML:com.adobe.xmp");
9
- function u(e, t, n, r) {
10
- let i = r && Object.keys(r).length > 0 ? JSON.stringify(r) : "";
11
- return `<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
9
+ function u(e) {
10
+ return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
11
+ }
12
+ function d(e) {
13
+ let t = [], n = (e, n) => t.push(`\n <${s}:${e}>${n}</${s}:${e}>`), r = e.tags && Object.keys(e.tags).length > 0 ? JSON.stringify(e.tags) : "";
14
+ return r && n("tags", u(r)), e.sourceUrl && n("sourceUrl", u(e.sourceUrl)), e.createdAt && n("createdAt", u(e.createdAt)), e.producer && n("producer", u(e.producer)), e.dpr && e.dpr > 0 && n("dpr", String(e.dpr)), `<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
12
15
  <x:xmpmeta xmlns:x="adobe:ns:meta/">
13
16
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
14
17
  <rdf:Description rdf:about=""
15
18
  xmlns:${s}="${c}">
16
- <${s}:annotations><![CDATA[${e}]]></${s}:annotations>
17
- <${s}:width>${t}</${s}:width>
18
- <${s}:height>${n}</${s}:height>
19
- <${s}:version>1.0</${s}:version>${i ? `\n <${s}:tags>${i}</${s}:tags>` : ""}
19
+ <${s}:annotations><![CDATA[${e.annotationsSvg}]]></${s}:annotations>
20
+ <${s}:width>${e.width}</${s}:width>
21
+ <${s}:height>${e.height}</${s}:height>
22
+ <${s}:version>2.0</${s}:version>${t.join("")}
20
23
  </rdf:Description>
21
24
  </rdf:RDF>
22
25
  </x:xmpmeta>
23
26
  <?xpacket end="w"?>`;
24
27
  }
25
- function d(e) {
28
+ function f(e) {
26
29
  return new Uint8Array([
27
30
  e >> 24 & 255,
28
31
  e >> 16 & 255,
@@ -30,28 +33,28 @@ function d(e) {
30
33
  e & 255
31
34
  ]);
32
35
  }
33
- function f(e, t) {
36
+ function p(e, t) {
34
37
  return (e[t] << 24 | e[t + 1] << 16 | e[t + 2] << 8 | e[t + 3]) >>> 0;
35
38
  }
36
- function p(...e) {
39
+ function m(...e) {
37
40
  let t = 0;
38
41
  for (let n of e) t += n.length;
39
42
  let n = new Uint8Array(t), r = 0;
40
43
  for (let t of e) n.set(t, r), r += t.length;
41
44
  return n;
42
45
  }
43
- function m(e, t, n) {
46
+ function h(e, t, n) {
44
47
  if (t + n.length > e.length) return !1;
45
48
  for (let r = 0; r < n.length; r++) if (e[t + r] !== n[r]) return !1;
46
49
  return !0;
47
50
  }
48
- function h(e) {
51
+ function g(e) {
49
52
  let t = e.split(",")[1] || "", n = atob(t), r = new Uint8Array(n.length);
50
53
  for (let e = 0; e < n.length; e++) r[e] = n.charCodeAt(e);
51
54
  return r;
52
55
  }
53
- var g = (() => {
54
- let e = new Uint32Array(256);
56
+ var _ = (() => {
57
+ let e = /* @__PURE__ */ new Uint32Array(256);
55
58
  for (let t = 0; t < 256; t++) {
56
59
  let n = t;
57
60
  for (let e = 0; e < 8; e++) n & 1 ? n = 3988292384 ^ n >>> 1 : n >>>= 1;
@@ -59,56 +62,56 @@ var g = (() => {
59
62
  }
60
63
  return e;
61
64
  })();
62
- function _(e) {
65
+ function v(e) {
63
66
  let t = 4294967295;
64
- for (let n = 0; n < e.length; n++) t = g[(t ^ e[n]) & 255] ^ t >>> 8;
67
+ for (let n = 0; n < e.length; n++) t = _[(t ^ e[n]) & 255] ^ t >>> 8;
65
68
  return (t ^ 4294967295) >>> 0;
66
69
  }
67
- function v(e, t) {
68
- let n = p(e, t), r = _(n);
69
- return p(d(t.length), n, d(r));
70
+ function y(e, t) {
71
+ let n = m(e, t), r = v(n);
72
+ return m(f(t.length), n, f(r));
70
73
  }
71
- function y(e) {
72
- let t = p(l, new Uint8Array([
74
+ function b(e) {
75
+ let t = m(l, new Uint8Array([
73
76
  0,
74
77
  0,
75
78
  0,
76
79
  0,
77
80
  0
78
81
  ]), e);
79
- return v(new TextEncoder().encode("iTXt"), t);
82
+ return y(new TextEncoder().encode("iTXt"), t);
80
83
  }
81
- function b(e) {
84
+ function x(e) {
82
85
  let t = [e.slice(0, 8)], n = 8;
83
86
  for (; n + 12 <= e.length;) {
84
- let r = f(e, n), i = e.slice(n + 4, n + 8), a = n + 8, o = a + r + 4;
87
+ let r = p(e, n), i = e.slice(n + 4, n + 8), a = n + 8, o = a + r + 4;
85
88
  if (o > e.length) break;
86
89
  let s = String.fromCharCode(...i);
87
- !(s === "iTXt" && m(e, a, l)) && s !== "svGo" && t.push(e.slice(n, o)), n = o;
90
+ !(s === "iTXt" && h(e, a, l)) && s !== "svGo" && t.push(e.slice(n, o)), n = o;
88
91
  }
89
- return p(...t);
92
+ return m(...t);
90
93
  }
91
- function x(e, t, n) {
92
- let r = y(t), i = v(new TextEncoder().encode("svGo"), n), a = b(e), o = a.length - 12;
93
- return p(a.slice(0, o), r, i, a.slice(o));
94
+ function S(e, t, n) {
95
+ let r = b(t), i = y(new TextEncoder().encode("svGo"), n), a = x(e), o = a.length - 12;
96
+ return m(a.slice(0, o), r, i, a.slice(o));
94
97
  }
95
- function S(e) {
96
- let t = u(e.annotationsSvg, e.width, e.height, e.tags), n = new TextEncoder().encode(t), r = typeof e.originalImage == "string" ? h(e.originalImage) : e.originalImage;
97
- return x(e.renderedPng, n, r);
98
+ function C(e) {
99
+ let t = d(e), n = new TextEncoder().encode(t), r = typeof e.originalImage == "string" ? g(e.originalImage) : e.originalImage;
100
+ return S(e.renderedPng, n, r);
98
101
  }
99
102
  //#endregion
100
103
  //#region ../core/src/encode/options.ts
101
- var C = {
104
+ var w = {
102
105
  light: 1280,
103
106
  standard: 1920,
104
107
  highQuality: 2560,
105
108
  original: null
106
- }, w = {
109
+ }, T = {
107
110
  light: "Light (1280px)",
108
111
  standard: "Standard (1920px)",
109
112
  highQuality: "High Quality (2560px)",
110
113
  original: "Original"
111
- }, T = {
114
+ }, E = {
112
115
  format: "smart",
113
116
  smartFallback: "png",
114
117
  smartColorThreshold: 15e3,
@@ -116,8 +119,8 @@ var C = {
116
119
  saveSizePreset: "standard",
117
120
  quantizer: "median-cut"
118
121
  };
119
- function E(e, t, n) {
120
- let r = C[n];
122
+ function D(e, t, n) {
123
+ let r = w[n];
121
124
  if (r === null || e <= r) return {
122
125
  width: e,
123
126
  height: t,
@@ -132,7 +135,7 @@ function E(e, t, n) {
132
135
  }
133
136
  //#endregion
134
137
  //#region ../core/src/encode/png8.ts
135
- var D = new Uint8Array([
138
+ var O = new Uint8Array([
136
139
  137,
137
140
  80,
138
141
  78,
@@ -141,8 +144,8 @@ var D = new Uint8Array([
141
144
  10,
142
145
  26,
143
146
  10
144
- ]), O = (() => {
145
- let e = new Uint32Array(256);
147
+ ]), k = (() => {
148
+ let e = /* @__PURE__ */ new Uint32Array(256);
146
149
  for (let t = 0; t < 256; t++) {
147
150
  let n = t;
148
151
  for (let e = 0; e < 8; e++) n = n & 1 ? 3988292384 ^ n >>> 1 : n >>> 1;
@@ -150,26 +153,26 @@ var D = new Uint8Array([
150
153
  }
151
154
  return e;
152
155
  })();
153
- function k(e) {
156
+ function A(e) {
154
157
  let t = 4294967295;
155
- for (let n = 0; n < e.length; n++) t = O[(t ^ e[n]) & 255] ^ t >>> 8;
158
+ for (let n = 0; n < e.length; n++) t = k[(t ^ e[n]) & 255] ^ t >>> 8;
156
159
  return (t ^ 4294967295) >>> 0;
157
160
  }
158
- function A(e, t) {
161
+ function j(e, t) {
159
162
  let n = new Uint8Array(12 + t.length), r = new DataView(n.buffer);
160
163
  r.setUint32(0, t.length, !1);
161
164
  for (let t = 0; t < 4; t++) n[4 + t] = e.charCodeAt(t);
162
165
  n.set(t, 8);
163
166
  let i = n.subarray(4, 8 + t.length);
164
- return r.setUint32(8 + t.length, k(i), !1), n;
167
+ return r.setUint32(8 + t.length, A(i), !1), n;
165
168
  }
166
- function j(e, t, n, i, a = 9) {
169
+ function ee(e, t, n, i, a = 9) {
167
170
  if (n <= 0 || i <= 0) throw Error("encodePng8: invalid dimensions");
168
171
  if (e.length % 4 != 0) throw Error("encodePng8: palette must be RGBA bytes (multiple of 4)");
169
172
  let o = e.length >>> 2;
170
173
  if (o < 1 || o > 256) throw Error(`encodePng8: palette must have 1–256 colors, got ${o}`);
171
174
  if (t.length !== n * i) throw Error(`encodePng8: indices length ${t.length} != width*height ${n * i}`);
172
- let s = new Uint8Array(13), c = new DataView(s.buffer);
175
+ let s = /* @__PURE__ */ new Uint8Array(13), c = new DataView(s.buffer);
173
176
  c.setUint32(0, n, !1), c.setUint32(4, i, !1), s[8] = 8, s[9] = 3, s[10] = 0, s[11] = 0, s[12] = 0;
174
177
  let l = new Uint8Array(o * 3), u = !1, d = -1;
175
178
  for (let t = 0; t < o; t++) l[t * 3] = e[t * 4], l[t * 3 + 1] = e[t * 4 + 1], l[t * 3 + 2] = e[t * 4 + 2], e[t * 4 + 3] < 255 && (u = !0, d = t);
@@ -188,11 +191,11 @@ function j(e, t, n, i, a = 9) {
188
191
  memLevel: 9,
189
192
  windowBits: 15
190
193
  }), g = [
191
- D,
192
- A("IHDR", s),
193
- A("PLTE", l)
194
+ O,
195
+ j("IHDR", s),
196
+ j("PLTE", l)
194
197
  ];
195
- f && g.push(A("tRNS", f)), g.push(A("IDAT", h)), g.push(A("IEND", new Uint8Array()));
198
+ f && g.push(j("tRNS", f)), g.push(j("IDAT", h)), g.push(j("IEND", /* @__PURE__ */ new Uint8Array()));
196
199
  let _ = 0;
197
200
  for (let e of g) _ += e.length;
198
201
  let v = new Uint8Array(_), y = 0;
@@ -201,12 +204,12 @@ function j(e, t, n, i, a = 9) {
201
204
  }
202
205
  //#endregion
203
206
  //#region ../core/src/encode/quantize-median-cut.ts
204
- function M(e, t, n, r) {
207
+ function te(e, t, n, r) {
205
208
  if (!Number.isInteger(t) || t <= 0) throw Error(`quantizeMedianCut: invalid width ${t}`);
206
209
  if (!Number.isInteger(n) || n <= 0) throw Error(`quantizeMedianCut: invalid height ${n}`);
207
210
  let i = t * n * 4;
208
211
  if (e.length !== i) throw Error(`quantizeMedianCut: rgba length ${e.length} != width*height*4 = ${i}`);
209
- let a = Math.max(1, Math.min(256, Math.floor(r))), { opaqueSamples: o, hasTransparent: s, transparentCount: c } = P(e), l = F(o, s ? Math.max(1, a - 1) : a), u = l.length, d = u + +!!s, f = new Uint8Array(d * 4), p = 0;
212
+ let a = Math.max(1, Math.min(256, Math.floor(r))), { opaqueSamples: o, hasTransparent: s, transparentCount: c } = ne(e), l = re(o, s ? Math.max(1, a - 1) : a), u = l.length, d = u + +!!s, f = new Uint8Array(d * 4), p = 0;
210
213
  s && (f[0] = 0, f[1] = 0, f[2] = 0, f[3] = 0, p = 1);
211
214
  let m = p * 4;
212
215
  for (let e = 0; e < u; e++) {
@@ -215,14 +218,14 @@ function M(e, t, n, r) {
215
218
  }
216
219
  return {
217
220
  palette: f,
218
- indices: te(e, t, n, f, m, s, c > 0)
221
+ indices: ae(e, t, n, f, m, s, c > 0)
219
222
  };
220
223
  }
221
- var N = 16;
222
- function P(e) {
224
+ var M = 16;
225
+ function ne(e) {
223
226
  let t = /* @__PURE__ */ new Map(), n = 0, r = e.length;
224
227
  for (let i = 0; i < r; i += 4) {
225
- if (e[i + 3] < N) {
228
+ if (e[i + 3] < M) {
226
229
  n++;
227
230
  continue;
228
231
  }
@@ -242,10 +245,10 @@ function P(e) {
242
245
  transparentCount: n
243
246
  };
244
247
  }
245
- function F(e, t) {
248
+ function re(e, t) {
246
249
  if (e.length === 0) return [];
247
- if (t <= 1) return [I(e, 0, e.length, 0)];
248
- let n = [I(e, 0, e.length, 0)], r = 1;
250
+ if (t <= 1) return [N(e, 0, e.length, 0)];
251
+ let n = [N(e, 0, e.length, 0)], r = 1;
249
252
  for (; n.length < t;) {
250
253
  let t = -1, i = -1, a = Infinity;
251
254
  for (let e = 0; e < n.length; e++) {
@@ -254,19 +257,19 @@ function F(e, t) {
254
257
  }
255
258
  if (t < 0) break;
256
259
  let o = n[t], s = o.rMax - o.rMin, c = o.gMax - o.gMin, l = o.bMax - o.bMin, u;
257
- u = s >= c && s >= l ? 0 : c >= l ? 1 : 2, ee(e, o.start, o.end, u);
260
+ u = s >= c && s >= l ? 0 : c >= l ? 1 : 2, ie(e, o.start, o.end, u);
258
261
  let d = o.population >>> 1, f = 0, p = o.start + 1;
259
262
  for (let t = o.start; t < o.end; t++) if (f += e[t].count, f >= d) {
260
263
  p = t + 1;
261
264
  break;
262
265
  }
263
266
  p <= o.start && (p = o.start + 1), p >= o.end && (p = o.end - 1);
264
- let m = I(e, o.start, p, r++), h = I(e, p, o.end, r++);
267
+ let m = N(e, o.start, p, r++), h = N(e, p, o.end, r++);
265
268
  n[t] = m, n.push(h);
266
269
  }
267
270
  return n;
268
271
  }
269
- function I(e, t, n, r) {
272
+ function N(e, t, n, r) {
270
273
  let i = 255, a = 0, o = 255, s = 0, c = 255, l = 0, u = 0, d = 0, f = 0, p = 0;
271
274
  for (let r = t; r < n; r++) {
272
275
  let t = e[r];
@@ -290,12 +293,12 @@ function I(e, t, n, r) {
290
293
  insertOrder: r
291
294
  };
292
295
  }
293
- function ee(e, t, n, r) {
296
+ function ie(e, t, n, r) {
294
297
  let i = e.slice(t, n);
295
298
  r === 0 ? i.sort((e, t) => e.r - t.r) : r === 1 ? i.sort((e, t) => e.g - t.g) : i.sort((e, t) => e.b - t.b);
296
299
  for (let n = 0; n < i.length; n++) e[t + n] = i[n];
297
300
  }
298
- function te(e, t, n, r, i, a, o) {
301
+ function ae(e, t, n, r, i, a, o) {
299
302
  let s = t * n, c = new Uint8Array(s), l = new Float32Array(t), u = new Float32Array(t), d = new Float32Array(t), f = new Float32Array(t), p = new Float32Array(t), m = new Float32Array(t), h = r.length - i >>> 2, g = new Int32Array(h), _ = new Int32Array(h), v = new Int32Array(h);
300
303
  for (let e = 0; e < h; e++) {
301
304
  let t = i + e * 4;
@@ -306,7 +309,7 @@ function te(e, t, n, r, i, a, o) {
306
309
  f.fill(0), p.fill(0), m.fill(0);
307
310
  for (let n = 0; n < t; n++) {
308
311
  let i = r * t + n, o = i * 4, s = e[o + 3];
309
- if (a && s < N) {
312
+ if (a && s < M) {
310
313
  c[i] = 0;
311
314
  continue;
312
315
  }
@@ -330,11 +333,11 @@ function te(e, t, n, r, i, a, o) {
330
333
  }
331
334
  //#endregion
332
335
  //#region src/encode/quantize.ts
333
- function ne(e, t, n) {
334
- let { palette: r, indices: i } = M(e, t, n, 256);
335
- return j(r, i, t, n, 9);
336
+ function oe(e, t, n) {
337
+ let { palette: r, indices: i } = te(e, t, n, 256);
338
+ return ee(r, i, t, n, 9);
336
339
  }
337
- function L(e, t) {
340
+ function P(e, t) {
338
341
  let n = new Uint32Array(e.buffer, e.byteOffset, e.byteLength >>> 2), r = n.length;
339
342
  if (r === 0) return !1;
340
343
  let i = Math.max(1, Math.floor(r / 5e4)), a = /* @__PURE__ */ new Set();
@@ -343,64 +346,64 @@ function L(e, t) {
343
346
  }
344
347
  //#endregion
345
348
  //#region src/encode/encode.ts
346
- var re = 1e7;
347
- async function R(e, t, n, r = T) {
348
- let i = E(t, n, r.saveSizePreset ?? "original"), a = i.scaled ? ae(e, t, n, i.width, i.height) : e, o = i.width, s = i.height;
349
+ var se = 1e7;
350
+ async function F(e, t, n, r = E) {
351
+ let i = D(t, n, r.saveSizePreset ?? "original"), a = i.scaled ? le(e, t, n, i.width, i.height) : e, o = i.width, s = i.height;
349
352
  return r.format === "png" ? {
350
- bytes: z(a, o, s),
353
+ bytes: I(a, o, s),
351
354
  chosen: "png",
352
355
  width: o,
353
356
  height: s
354
357
  } : r.format === "jpeg" ? {
355
- bytes: B(a, o, s, r.jpegPercent / 100),
358
+ bytes: L(a, o, s, r.jpegPercent / 100),
356
359
  chosen: "jpeg",
357
360
  width: o,
358
361
  height: s
359
- } : o * s > re ? {
360
- bytes: z(a, o, s),
362
+ } : o * s > se ? {
363
+ bytes: I(a, o, s),
361
364
  chosen: "png",
362
365
  reason: "too-large-for-png8",
363
366
  width: o,
364
367
  height: s
365
- } : L(a, r.smartColorThreshold) ? r.smartFallback === "jpeg" ? {
366
- bytes: B(a, o, s, r.jpegPercent / 100),
368
+ } : P(a, r.smartColorThreshold) ? r.smartFallback === "jpeg" ? {
369
+ bytes: L(a, o, s, r.jpegPercent / 100),
367
370
  chosen: "jpeg",
368
371
  reason: "photo-fallback-jpeg",
369
372
  width: o,
370
373
  height: s
371
374
  } : {
372
- bytes: z(a, o, s),
375
+ bytes: I(a, o, s),
373
376
  chosen: "png",
374
377
  reason: "photo-fallback-png",
375
378
  width: o,
376
379
  height: s
377
380
  } : {
378
- bytes: ne(a, o, s),
381
+ bytes: oe(a, o, s),
379
382
  chosen: "png",
380
383
  reason: "png-8",
381
384
  width: o,
382
385
  height: s
383
386
  };
384
387
  }
385
- async function ie(e, r = T) {
388
+ async function ce(e, r = E) {
386
389
  let i = await n(Buffer.from(e)), a = t(i.width, i.height).getContext("2d");
387
390
  a.drawImage(i, 0, 0);
388
391
  let o = a.getImageData(0, 0, i.width, i.height).data;
389
- return R(new Uint8Array(o.buffer, o.byteOffset, o.byteLength), i.width, i.height, r);
392
+ return F(new Uint8Array(o.buffer, o.byteOffset, o.byteLength), i.width, i.height, r);
390
393
  }
391
- function z(e, n, r) {
394
+ function I(e, n, r) {
392
395
  let i = t(n, r), a = i.getContext("2d"), o = a.createImageData(n, r);
393
396
  o.data.set(e), a.putImageData(o, 0, 0);
394
397
  let s = i.toBuffer("image/png");
395
398
  return new Uint8Array(s.buffer, s.byteOffset, s.byteLength);
396
399
  }
397
- function B(e, n, r, i) {
400
+ function L(e, n, r, i) {
398
401
  let a = t(n, r), o = a.getContext("2d"), s = o.createImageData(n, r);
399
402
  s.data.set(e), o.putImageData(s, 0, 0);
400
403
  let c = a.toBuffer("image/jpeg", i);
401
404
  return new Uint8Array(c.buffer, c.byteOffset, c.byteLength);
402
405
  }
403
- function ae(e, n, r, i, a) {
406
+ function le(e, n, r, i, a) {
404
407
  let o = t(n, r), s = o.getContext("2d"), c = s.createImageData(n, r);
405
408
  c.data.set(e), s.putImageData(c, 0, 0);
406
409
  let l = t(i, a).getContext("2d");
@@ -410,7 +413,7 @@ function ae(e, n, r, i, a) {
410
413
  }
411
414
  //#endregion
412
415
  //#region src/sanitise-svg.ts
413
- function oe(e) {
416
+ function ue(e) {
414
417
  if (!e || e.trim().length === 0) return "";
415
418
  let t = new i(), n;
416
419
  try {
@@ -426,7 +429,7 @@ function oe(e) {
426
429
  if (!t || t.nodeType !== 1) continue;
427
430
  let n = t, i = n.localName ?? n.tagName ?? "";
428
431
  if (i === "defs") {
429
- let e = se(n);
432
+ let e = de(n);
430
433
  e !== null && (s += o.serializeToString(e));
431
434
  continue;
432
435
  }
@@ -443,7 +446,7 @@ function oe(e) {
443
446
  }
444
447
  return s;
445
448
  }
446
- function se(e) {
449
+ function de(e) {
447
450
  let t = e.cloneNode(!0);
448
451
  for (let e = t.childNodes.length - 1; e >= 0; e--) {
449
452
  let n = t.childNodes.item(e);
@@ -455,7 +458,7 @@ function se(e) {
455
458
  }
456
459
  //#endregion
457
460
  //#region src/annotator.ts
458
- function V(t = {}) {
461
+ function fe(t = {}) {
459
462
  let n = {
460
463
  loadSystemFonts: t.loadSystemFonts ?? !1,
461
464
  ...t.fontFiles ? { fontFiles: t.fontFiles } : {},
@@ -463,7 +466,7 @@ function V(t = {}) {
463
466
  ...t.defaultFontFamily ? { defaultFontFamily: t.defaultFontFamily } : {}
464
467
  };
465
468
  function r(t) {
466
- let r = new e(H(t), {
469
+ let r = new e(R(t), {
467
470
  fitTo: {
468
471
  mode: "width",
469
472
  value: t.width
@@ -479,10 +482,10 @@ function V(t = {}) {
479
482
  }
480
483
  return {
481
484
  toSvg(e) {
482
- return H(e);
485
+ return R(e);
483
486
  },
484
487
  toPng(t) {
485
- return new e(H(t), {
488
+ return new e(R(t), {
486
489
  fitTo: {
487
490
  mode: "width",
488
491
  value: t.width
@@ -492,8 +495,8 @@ function V(t = {}) {
492
495
  }).render().asPng();
493
496
  },
494
497
  toEditablePng(t) {
495
- return S({
496
- renderedPng: new e(H(t), {
498
+ return C({
499
+ renderedPng: new e(R(t), {
497
500
  fitTo: {
498
501
  mode: "width",
499
502
  value: t.width
@@ -505,22 +508,212 @@ function V(t = {}) {
505
508
  annotationsSvg: t.annotationsSvg,
506
509
  width: t.width,
507
510
  height: t.height,
508
- tags: t.tags
511
+ tags: t.tags,
512
+ sourceUrl: t.sourceUrl,
513
+ createdAt: t.createdAt,
514
+ producer: t.producer || "annotator",
515
+ dpr: t.dpr
509
516
  });
510
517
  },
511
518
  async toEncoded(e, t) {
512
519
  let { pixels: n, width: i, height: a } = r(e);
513
- return R(n, i, a, t);
520
+ return F(n, i, a, t);
514
521
  }
515
522
  };
516
523
  }
517
- function H(e) {
518
- let t = oe(e.annotationsSvg);
524
+ function R(e) {
525
+ let t = ue(e.annotationsSvg);
519
526
  return `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ${o}="1" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}"><image href="${e.originalDataUrl}" width="${e.width}" height="${e.height}"/>` + t + "</svg>";
520
527
  }
521
528
  //#endregion
529
+ //#region src/redact-burn.ts
530
+ var pe = "solid", me = "#000000", z = 16, he = 12;
531
+ async function B(e, r) {
532
+ if (r.length === 0) return e;
533
+ let i = await n(Buffer.from(e)), a = t(i.width, i.height), o = a.getContext("2d");
534
+ o.drawImage(i, 0, 0);
535
+ for (let e of r) if (!(e.bbox.width <= 0 || e.bbox.height <= 0)) switch (e.style ?? pe) {
536
+ case "solid":
537
+ ge(o, e.bbox, e.color ?? me);
538
+ break;
539
+ case "mosaic":
540
+ _e(o, i, e.bbox);
541
+ break;
542
+ case "blur":
543
+ ve(o, i, e.bbox);
544
+ break;
545
+ }
546
+ let s = a.toBuffer("image/png");
547
+ return new Uint8Array(s.buffer, s.byteOffset, s.byteLength);
548
+ }
549
+ function ge(e, t, n) {
550
+ e.save(), e.fillStyle = n, e.fillRect(t.x, t.y, t.width, t.height), e.restore();
551
+ }
552
+ function _e(e, n, r) {
553
+ let i = Math.max(1, Math.round(r.width / z)), a = Math.max(1, Math.round(r.height / z)), o = t(i, a), s = o.getContext("2d");
554
+ s.imageSmoothingEnabled = !1, s.drawImage(n, r.x, r.y, r.width, r.height, 0, 0, i, a), e.save(), e.imageSmoothingEnabled = !1, e.drawImage(o, 0, 0, i, a, r.x, r.y, r.width, r.height), e.restore();
555
+ }
556
+ function ve(e, t, n) {
557
+ e.save(), e.beginPath(), e.rect(n.x, n.y, n.width, n.height), e.clip(), e.filter = `blur(${he}px)`, e.drawImage(t, 0, 0), e.restore();
558
+ }
559
+ var ye = B;
560
+ //#endregion
561
+ //#region ../../node_modules/.pnpm/pixelmatch@7.2.0/node_modules/pixelmatch/index.js
562
+ function be(e, t, n, r, i, a = {}) {
563
+ let { threshold: o = .1, alpha: s = .1, aaColor: c = [
564
+ 255,
565
+ 255,
566
+ 0
567
+ ], diffColor: l = [
568
+ 255,
569
+ 0,
570
+ 0
571
+ ], checkerboard: u = !0, includeAA: d, diffColorAlt: f, diffMask: p } = a;
572
+ if (!V(e) || !V(t) || n && !V(n)) throw Error("Image data: Uint8Array, Uint8ClampedArray or Buffer expected.");
573
+ if (e.length !== t.length || n && n.length !== e.length) throw Error(`Image sizes do not match. Image 1 size: ${e.length}, image 2 size: ${t.length}`);
574
+ if (e.length !== r * i * 4) throw Error(`Image data size does not match width/height. Expecting ${r * i * 4}. Got ${e.length}`);
575
+ let m = r * i, h = new Uint32Array(e.buffer, e.byteOffset, m), g = new Uint32Array(t.buffer, t.byteOffset, m), _ = !0;
576
+ for (let e = 0; e < m; e++) if (h[e] !== g[e]) {
577
+ _ = !1;
578
+ break;
579
+ }
580
+ if (_) {
581
+ if (n && !p) for (let t = 0, r = 0; t < m; t++, r += 4) G(e, r, s, n);
582
+ return 0;
583
+ }
584
+ let v = 35215 * o * o, [y, b, x] = c, [S, C, w] = l, [T, E, D] = f || l, O = 0;
585
+ for (let a = 0, o = 0; a < m; a++, o += 4) {
586
+ let c = h[a] === g[a] ? 0 : xe(e, t, o, o, u);
587
+ if (Math.abs(c) > v) {
588
+ let s = a % r, l = a / r | 0;
589
+ !d && (H(e, s, l, r, i, h, g, u) || H(t, s, l, r, i, g, h, u)) ? n && !p && W(n, o, y, b, x) : (n && (c < 0 ? W(n, o, T, E, D) : W(n, o, S, C, w)), O++);
590
+ } else n && !p && G(e, o, s, n);
591
+ }
592
+ return O;
593
+ }
594
+ function V(e) {
595
+ return ArrayBuffer.isView(e) && e.BYTES_PER_ELEMENT === 1;
596
+ }
597
+ function H(e, t, n, r, i, a, o, s) {
598
+ let c = Math.max(t - 1, 0), l = Math.max(n - 1, 0), u = Math.min(t + 1, r - 1), d = Math.min(n + 1, i - 1), f = (n * r + t) * 4, p = e[f], m = e[f + 1], h = e[f + 2], g = e[f + 3], _ = +(t === c || t === u || n === l || n === d), v = 0, y = 0, b = 0, x = 0, S = 0, C = 0;
599
+ for (let i = c; i <= u; i++) for (let a = l; a <= d; a++) {
600
+ if (i === t && a === n) continue;
601
+ let o = Se(e, f, (a * r + i) * 4, p, m, h, g, s);
602
+ if (o === 0) {
603
+ if (_++, _ > 2) return !1;
604
+ } else o < v ? (v = o, b = i, x = a) : o > y && (y = o, S = i, C = a);
605
+ }
606
+ return v === 0 || y === 0 ? !1 : U(a, b, x, r, i) && U(o, b, x, r, i) || U(a, S, C, r, i) && U(o, S, C, r, i);
607
+ }
608
+ function U(e, t, n, r, i) {
609
+ let a = Math.max(t - 1, 0), o = Math.max(n - 1, 0), s = Math.min(t + 1, r - 1), c = Math.min(n + 1, i - 1), l = e[n * r + t], u = +(t === a || t === s || n === o || n === c);
610
+ for (let i = a; i <= s; i++) for (let a = o; a <= c; a++) if (!(i === t && a === n) && (u += +(l === e[a * r + i]), u > 2)) return !0;
611
+ return !1;
612
+ }
613
+ function xe(e, t, n, r, i) {
614
+ let a = e[n], o = e[n + 1], s = e[n + 2], c = e[n + 3], l = t[r], u = t[r + 1], d = t[r + 2], f = t[r + 3], p = a - l, m = o - u, h = s - d, g = c - f;
615
+ if (c < 255 || f < 255) {
616
+ let e = 255, t = 255, r = 255;
617
+ i && (e = 48 + n % 2 * 159, t = 48 + 159 * ((n / 1.618033988749895 | 0) % 2), r = 48 + 159 * ((n / 2.618033988749895 | 0) % 2)), p = (a * c - l * f - e * g) / 255, m = (o * c - u * f - t * g) / 255, h = (s * c - d * f - r * g) / 255;
618
+ }
619
+ let _ = p * .29889531 + m * .58662247 + h * .11448223, v = p * .59597799 - m * .2741761 - h * .32180189, y = p * .21147017 - m * .52261711 + h * .31114694, b = .5053 * _ * _ + .299 * v * v + .1957 * y * y;
620
+ return _ > 0 ? -b : b;
621
+ }
622
+ function Se(e, t, n, r, i, a, o, s) {
623
+ let c = e[n], l = e[n + 1], u = e[n + 2], d = e[n + 3], f = r - c, p = i - l, m = a - u, h = o - d;
624
+ if (!f && !p && !m && !h) return 0;
625
+ if (o < 255 || d < 255) {
626
+ let e = 255, n = 255, g = 255;
627
+ s && (e = 48 + t % 2 * 159, n = 48 + 159 * ((t / 1.618033988749895 | 0) % 2), g = 48 + 159 * ((t / 2.618033988749895 | 0) % 2)), f = (r * o - c * d - e * h) / 255, p = (i * o - l * d - n * h) / 255, m = (a * o - u * d - g * h) / 255;
628
+ }
629
+ return f * .29889531 + p * .58662247 + m * .11448223;
630
+ }
631
+ function W(e, t, n, r, i) {
632
+ e[t] = n, e[t + 1] = r, e[t + 2] = i, e[t + 3] = 255;
633
+ }
634
+ function G(e, t, n, r) {
635
+ let i = 255 + (e[t] * .29889531 + e[t + 1] * .58662247 + e[t + 2] * .11448223 - 255) * n * e[t + 3] / 255;
636
+ W(r, t, i, i, i);
637
+ }
638
+ //#endregion
639
+ //#region src/diff-aggregate.ts
640
+ var Ce = 4;
641
+ function K(e, t, n) {
642
+ let r = new Uint8Array(t * n), i = [];
643
+ for (let a = 0; a < n; a++) for (let o = 0; o < t; o++) {
644
+ let s = a * t + o;
645
+ if (r[s] || !we(e, s)) continue;
646
+ let c = Te(e, r, o, a, t, n);
647
+ c.count >= Ce && i.push({
648
+ x: c.minX,
649
+ y: c.minY,
650
+ width: c.maxX - c.minX + 1,
651
+ height: c.maxY - c.minY + 1
652
+ });
653
+ }
654
+ return i;
655
+ }
656
+ function we(e, t) {
657
+ return e[t * 4 + 3] > 0;
658
+ }
659
+ function Te(e, t, n, r, i, a) {
660
+ let o = {
661
+ count: 0,
662
+ minX: n,
663
+ minY: r,
664
+ maxX: n,
665
+ maxY: r
666
+ }, s = [n, r];
667
+ for (; s.length > 0;) {
668
+ let n = s.pop(), r = s.pop();
669
+ if (r < 0 || r >= i || n < 0 || n >= a) continue;
670
+ let c = n * i + r;
671
+ t[c] || we(e, c) && (t[c] = 1, o.count += 1, r < o.minX && (o.minX = r), n < o.minY && (o.minY = n), r > o.maxX && (o.maxX = r), n > o.maxY && (o.maxY = n), s.push(r + 1, n), s.push(r - 1, n), s.push(r, n + 1), s.push(r, n - 1));
672
+ }
673
+ return o;
674
+ }
675
+ //#endregion
676
+ //#region src/diff.ts
677
+ var Ee = class extends Error {
678
+ constructor(e, t) {
679
+ super(`Cannot compare screenshots of different dimensions: before is ${e.width}×${e.height}, after is ${t.width}×${t.height}.`), this.name = "DimensionMismatchError";
680
+ }
681
+ };
682
+ async function De(e, t, r = {}) {
683
+ let [i, a] = await Promise.all([n(Buffer.from(e)), n(Buffer.from(t))]);
684
+ if (i.width !== a.width || i.height !== a.height) throw new Ee({
685
+ width: i.width,
686
+ height: i.height
687
+ }, {
688
+ width: a.width,
689
+ height: a.height
690
+ });
691
+ let { width: o, height: s } = i, c = Oe(i, o, s), l = Oe(a, o, s), u = new Uint8Array(o * s * 4);
692
+ return {
693
+ mismatchedPixels: be(c, l, u, o, s, {
694
+ threshold: r.threshold ?? .1,
695
+ includeAA: !1,
696
+ diffMask: !0
697
+ }),
698
+ regions: K(u, o, s),
699
+ width: o,
700
+ height: s
701
+ };
702
+ }
703
+ function Oe(e, n, r) {
704
+ let i = t(n, r).getContext("2d");
705
+ i.drawImage(e, 0, 0);
706
+ let a = i.getImageData(0, 0, n, r).data;
707
+ return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
708
+ }
709
+ //#endregion
710
+ //#region src/flatten-editable-png.ts
711
+ function ke(e) {
712
+ return x(e);
713
+ }
714
+ //#endregion
522
715
  //#region src/dsl/schema.ts
523
- var U = {
716
+ var Ae = {
524
717
  BBox: {
525
718
  type: "object",
526
719
  required: [
@@ -576,7 +769,7 @@ var U = {
576
769
  color: { type: "string" }
577
770
  }
578
771
  }
579
- }, W = { oneOf: [
772
+ }, je = { oneOf: [
580
773
  {
581
774
  type: "object",
582
775
  required: ["type", "bbox"],
@@ -731,6 +924,57 @@ var U = {
731
924
  color: { type: "string" }
732
925
  }
733
926
  },
927
+ {
928
+ type: "object",
929
+ required: ["type", "path"],
930
+ additionalProperties: !1,
931
+ properties: {
932
+ type: { const: "freehand" },
933
+ path: {
934
+ type: "string",
935
+ minLength: 1
936
+ },
937
+ intent: { $ref: "#/$defs/Intent" },
938
+ stroke: { type: "string" },
939
+ strokeWidth: {
940
+ type: "number",
941
+ minimum: 0
942
+ },
943
+ fill: { type: "string" },
944
+ color: { type: "string" }
945
+ }
946
+ },
947
+ {
948
+ type: "object",
949
+ required: [
950
+ "type",
951
+ "cutout",
952
+ "imageWidth",
953
+ "imageHeight"
954
+ ],
955
+ additionalProperties: !1,
956
+ properties: {
957
+ type: { const: "focusMask" },
958
+ cutout: { $ref: "#/$defs/BBox" },
959
+ imageWidth: {
960
+ type: "number",
961
+ minimum: 0
962
+ },
963
+ imageHeight: {
964
+ type: "number",
965
+ minimum: 0
966
+ },
967
+ dimColor: { type: "string" },
968
+ intent: { $ref: "#/$defs/Intent" },
969
+ stroke: { type: "string" },
970
+ strokeWidth: {
971
+ type: "number",
972
+ minimum: 0
973
+ },
974
+ fill: { type: "string" },
975
+ color: { type: "string" }
976
+ }
977
+ },
734
978
  {
735
979
  type: "object",
736
980
  required: ["type", "svgFragment"],
@@ -740,7 +984,7 @@ var U = {
740
984
  svgFragment: { type: "string" }
741
985
  }
742
986
  }
743
- ] }, G = {
987
+ ] }, Me = {
744
988
  type: "object",
745
989
  required: ["bbox"],
746
990
  additionalProperties: !1,
@@ -759,31 +1003,31 @@ var U = {
759
1003
  };
760
1004
  //#endregion
761
1005
  //#region src/dsl/svg-primitives.ts
762
- function K(e, t = {}) {
1006
+ function q(e, t = {}) {
763
1007
  let n = t.stroke ?? "red", r = t.strokeWidth ?? 2, i = t.fill ?? "none";
764
- return `<rect x="${e.x}" y="${e.y}" width="${e.width}" height="${e.height}" fill="${X(i)}" stroke="${X(n)}" stroke-width="${r}"/>`;
765
- }
766
- function q(e, t, n = {}) {
767
- let r = n.color ?? "red", i = n.strokeWidth ?? 2, a = `annot-arrow-${ce()}`;
768
- return `<defs><marker id="${a}" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto" markerUnits="strokeWidth"><path d="M 0 0 L 10 5 L 0 10 z" fill="${X(r)}"/></marker></defs><line x1="${e.x}" y1="${e.y}" x2="${t.x}" y2="${t.y}" stroke="${X(r)}" stroke-width="${i}" marker-end="url(#${a})"/>`;
1008
+ return `<rect x="${e.x}" y="${e.y}" width="${e.width}" height="${e.height}" fill="${Z(i)}" stroke="${Z(n)}" stroke-width="${r}"/>`;
769
1009
  }
770
1010
  function J(e, t, n = {}) {
1011
+ let r = n.color ?? "red", i = n.strokeWidth ?? 2, a = `annot-arrow-${Ne()}`;
1012
+ return `<defs><marker id="${a}" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto" markerUnits="strokeWidth"><path d="M 0 0 L 10 5 L 0 10 z" fill="${Z(r)}"/></marker></defs><line x1="${e.x}" y1="${e.y}" x2="${t.x}" y2="${t.y}" stroke="${Z(r)}" stroke-width="${i}" marker-end="url(#${a})"/>`;
1013
+ }
1014
+ function Y(e, t, n = {}) {
771
1015
  let r = n.color ?? "red", i = n.fontSize ?? 14, a = n.anchor ?? "start";
772
- return `<text x="${e.x}" y="${e.y}" fill="${X(r)}" font-size="${i}" text-anchor="${a}">` + le(t) + "</text>";
1016
+ return `<text x="${e.x}" y="${e.y}" fill="${Z(r)}" font-size="${i}" text-anchor="${a}">` + Pe(t) + "</text>";
773
1017
  }
774
- var Y = 0;
775
- function ce() {
776
- return Y = Y + 1 | 0, Y;
1018
+ var X = 0;
1019
+ function Ne() {
1020
+ return X = X + 1 | 0, X;
777
1021
  }
778
- function X(e) {
1022
+ function Z(e) {
779
1023
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
780
1024
  }
781
- function le(e) {
1025
+ function Pe(e) {
782
1026
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
783
1027
  }
784
1028
  //#endregion
785
1029
  //#region src/dsl/to-svg.ts
786
- var ue = {
1030
+ var Fe = {
787
1031
  info: {
788
1032
  stroke: "#3b82f6",
789
1033
  fill: "rgba(59, 130, 246, 0.12)",
@@ -809,84 +1053,95 @@ var ue = {
809
1053
  fill: "rgba(107, 114, 128, 0.12)",
810
1054
  text: "#374151"
811
1055
  }
812
- }, de = "error";
813
- function Z(e) {
814
- let t = ue[e.intent ?? de];
1056
+ }, Ie = "error";
1057
+ function Q(e) {
1058
+ let t = Fe[e.intent ?? Ie];
815
1059
  return {
816
1060
  stroke: e.stroke ?? t.stroke,
817
1061
  fill: e.fill ?? "none",
818
1062
  text: e.color ?? t.text
819
1063
  };
820
1064
  }
821
- function fe(e) {
822
- return e.map(pe).join("");
1065
+ function Le(e) {
1066
+ return e.map(Re).join("");
823
1067
  }
824
- function pe(e) {
1068
+ function Re(e) {
825
1069
  switch (e.type) {
826
- case "rect": return me(e);
827
- case "circle": return he(e);
828
- case "arrow": return ge(e);
829
- case "text": return _e(e);
830
- case "callout": return ve(e);
831
- case "numberedBadge": return xe(e);
832
- case "raw": return ye(e);
833
- }
834
- }
835
- function me(e) {
836
- let t = Z(e);
837
- return K(e.bbox, {
1070
+ case "rect": return ze(e);
1071
+ case "circle": return Be(e);
1072
+ case "arrow": return Ve(e);
1073
+ case "text": return He(e);
1074
+ case "callout": return Ue(e);
1075
+ case "numberedBadge": return Ye(e);
1076
+ case "freehand": return Ge(e);
1077
+ case "focusMask": return qe(e);
1078
+ case "raw": return We(e);
1079
+ }
1080
+ }
1081
+ function ze(e) {
1082
+ let t = Q(e);
1083
+ return q(e.bbox, {
838
1084
  stroke: t.stroke,
839
1085
  strokeWidth: e.strokeWidth ?? 2,
840
1086
  fill: t.fill
841
1087
  });
842
1088
  }
843
- function he(e) {
844
- let t = Z(e), n = e.strokeWidth ?? 2;
1089
+ function Be(e) {
1090
+ let t = Q(e), n = e.strokeWidth ?? 2;
845
1091
  return `<circle cx="${e.center.x}" cy="${e.center.y}" r="${e.radius}" fill="${$(t.fill)}" stroke="${$(t.stroke)}" stroke-width="${n}"/>`;
846
1092
  }
847
- function ge(e) {
848
- let t = Z(e);
849
- return q(e.from, e.to, {
1093
+ function Ve(e) {
1094
+ let t = Q(e);
1095
+ return J(e.from, e.to, {
850
1096
  color: t.stroke,
851
1097
  strokeWidth: e.strokeWidth ?? 2
852
1098
  });
853
1099
  }
854
- function _e(e) {
855
- let t = Z(e);
856
- return J(e.at, e.content, {
1100
+ function He(e) {
1101
+ let t = Q(e);
1102
+ return Y(e.at, e.content, {
857
1103
  color: t.text,
858
1104
  fontSize: e.fontSize ?? 14,
859
1105
  anchor: e.anchor ?? "start"
860
1106
  });
861
1107
  }
862
- function ve(e) {
863
- let t = Z(e), n = e.targetBbox, r = we(n, e.at);
864
- return K(n, {
1108
+ function Ue(e) {
1109
+ let t = Q(e), n = e.targetBbox, r = Qe(n, e.at);
1110
+ return q(n, {
865
1111
  stroke: t.stroke,
866
1112
  strokeWidth: e.strokeWidth ?? 2,
867
1113
  fill: t.fill
868
- }) + q(e.at, r, {
1114
+ }) + J(e.at, r, {
869
1115
  color: t.stroke,
870
1116
  strokeWidth: 2
871
- }) + J(e.at, e.content, {
1117
+ }) + Y(e.at, e.content, {
872
1118
  color: t.text,
873
1119
  fontSize: 14,
874
1120
  anchor: "start"
875
1121
  });
876
1122
  }
877
- function ye(e) {
1123
+ function We(e) {
878
1124
  return e.svgFragment;
879
1125
  }
880
- var be = 40;
881
- function xe(e) {
882
- let t = Z(e), n = e.badgeSize ?? be, r = Se(e, n), i = K(e.bbox, {
1126
+ function Ge(e) {
1127
+ let t = Q(e), n = e.fill ?? "none", r = e.strokeWidth ?? 2;
1128
+ return `<path d="${$(e.path)}" fill="${$(n)}" stroke="${$(t.stroke)}" stroke-width="${r}" stroke-linecap="round" stroke-linejoin="round"/>`;
1129
+ }
1130
+ var Ke = "rgba(0,0,0,0.5)";
1131
+ function qe(e) {
1132
+ let { cutout: t, imageWidth: n, imageHeight: r } = e, i = e.dimColor ?? Ke;
1133
+ return `<path d="${$(`M0,0 H${n} V${r} H0 Z M${t.x},${t.y} H${t.x + t.width} V${t.y + t.height} H${t.x} Z`)}" fill="${$(i)}" fill-rule="evenodd" stroke="none"/>`;
1134
+ }
1135
+ var Je = 40;
1136
+ function Ye(e) {
1137
+ let t = Q(e), n = e.badgeSize ?? Je, r = Xe(e, n), i = q(e.bbox, {
883
1138
  stroke: t.stroke,
884
1139
  strokeWidth: e.strokeWidth ?? 3,
885
1140
  fill: e.fill ?? "none"
886
- }), a = Ce(e.bbox, r), o = n / 2, s = `<circle cx="${a.x}" cy="${a.y}" r="${o}" fill="${t.stroke}" stroke="#ffffff" stroke-width="${Math.max(2, o * .12)}" />`, c = Math.round(o * 1.1), l = `<text x="${a.x}" y="${a.y}" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif" font-size="${c}" font-weight="700" fill="#ffffff" text-anchor="middle" dominant-baseline="central">${$(String(e.number))}</text>`;
1141
+ }), a = Ze(e.bbox, r), o = n / 2, s = `<circle cx="${a.x}" cy="${a.y}" r="${o}" fill="${t.stroke}" stroke="#ffffff" stroke-width="${Math.max(2, o * .12)}" />`, c = Math.round(o * 1.1), l = `<text x="${a.x}" y="${a.y}" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif" font-size="${c}" font-weight="700" fill="#ffffff" text-anchor="middle" dominant-baseline="central">${$(String(e.number))}</text>`;
887
1142
  return i + s + l;
888
1143
  }
889
- function Se(e, t) {
1144
+ function Xe(e, t) {
890
1145
  if (e.placement && e.placement !== "auto") return e.placement;
891
1146
  if (e.imageWidth === void 0 || e.imageHeight === void 0) return "topRight";
892
1147
  let n = t / 2, r = [
@@ -917,7 +1172,7 @@ function Se(e, t) {
917
1172
  }
918
1173
  return i.kind;
919
1174
  }
920
- function Ce(e, t) {
1175
+ function Ze(e, t) {
921
1176
  switch (t) {
922
1177
  case "topLeft": return {
923
1178
  x: e.x,
@@ -937,17 +1192,17 @@ function Ce(e, t) {
937
1192
  };
938
1193
  }
939
1194
  }
940
- function we(e, t) {
1195
+ function Qe(e, t) {
941
1196
  return {
942
- x: Q(t.x, e.x, e.x + e.width),
943
- y: Q(t.y, e.y, e.y + e.height)
1197
+ x: $e(t.x, e.x, e.x + e.width),
1198
+ y: $e(t.y, e.y, e.y + e.height)
944
1199
  };
945
1200
  }
946
- function Q(e, t, n) {
1201
+ function $e(e, t, n) {
947
1202
  return Math.min(Math.max(e, t), n);
948
1203
  }
949
1204
  function $(e) {
950
1205
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
951
1206
  }
952
1207
  //#endregion
953
- export { W as BBOX_ANNOTATION_SCHEMA, G as BBOX_REDACT_REGION_SCHEMA, T as DEFAULT_ENCODE_OPTIONS, w as SAVE_SIZE_LABEL, C as SAVE_SIZE_MAX_WIDTH, U as SHARED_DEFS, q as arrowBetween, fe as bboxAnnotationsToSvg, E as computeResizeTarget, V as createAnnotator, ie as decodeAndEncodeImage, R as encodeRgba, L as isPhotoHeavy, K as rectForBoundingBox, J as textAt };
1208
+ export { je as BBOX_ANNOTATION_SCHEMA, Me as BBOX_REDACT_REGION_SCHEMA, E as DEFAULT_ENCODE_OPTIONS, Ee as DimensionMismatchError, T as SAVE_SIZE_LABEL, w as SAVE_SIZE_MAX_WIDTH, Ae as SHARED_DEFS, K as aggregateDiffRegions, J as arrowBetween, Le as bboxAnnotationsToSvg, B as burnRedactions, ye as burnRegions, D as computeResizeTarget, fe as createAnnotator, ce as decodeAndEncodeImage, De as diffScreenshots, F as encodeRgba, ke as flattenEditablePng, P as isPhotoHeavy, q as rectForBoundingBox, Y as textAt };