@pacem/pacem-foundation 1.0.0-abel

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.
@@ -0,0 +1,2013 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // packages/foundation/dist/esm/number-extensions.js
8
+ Number.prototype.isCloseTo = function(other, precision = 14) {
9
+ const delta = Number(`1e-${precision}`);
10
+ return this > other - delta && this < other + delta;
11
+ };
12
+ Number.prototype.roundoff = function(precision = 14) {
13
+ return parseFloat(this.toFixed(precision));
14
+ };
15
+ Number.prototype.clamp = function(min, max) {
16
+ let value = this;
17
+ if (min != null && !isNaN(min)) {
18
+ value = Math.max(value, min);
19
+ }
20
+ if (max != null && !isNaN(max)) {
21
+ value = Math.min(value, max);
22
+ }
23
+ return value;
24
+ };
25
+ Number.prototype.toBase62 = function() {
26
+ var alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
27
+ var temp = this;
28
+ var sb = "";
29
+ while (temp != 0) {
30
+ var mod = temp % 62;
31
+ sb = alphabet.charAt(mod) + sb;
32
+ temp = Math.floor(temp / 62);
33
+ }
34
+ return sb;
35
+ };
36
+ Number.prototype.toBase36 = function() {
37
+ return this.toString(36);
38
+ };
39
+
40
+ // packages/foundation/dist/esm/dates.js
41
+ var JSON_DATE_PATTERN = /^\/Date\([\d]+\)\/$/i;
42
+ var Dates = class _Dates {
43
+ static parse(input) {
44
+ let d;
45
+ if (typeof input === "string") {
46
+ if (JSON_DATE_PATTERN.test(input))
47
+ d = parseInt(input.substring(6));
48
+ else
49
+ d = Date.parse(input);
50
+ return new Date(d);
51
+ } else if (typeof input === "number") {
52
+ return new Date(input);
53
+ } else
54
+ return input;
55
+ }
56
+ static isLeapYear(year) {
57
+ return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
58
+ }
59
+ static daysInMonth(year, month) {
60
+ return [31, _Dates.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
61
+ }
62
+ /**
63
+ * Gets whether a date is an `Invalid Date` or not.
64
+ * @param date
65
+ */
66
+ static isDate(date) {
67
+ return date instanceof Date && !isNaN(date.valueOf());
68
+ }
69
+ /**
70
+ * Returns the date-only equaivalent of a provided datetime.
71
+ * @param datetime
72
+ */
73
+ static dateOnly(datetime) {
74
+ return new Date(datetime.getFullYear(), datetime.getMonth(), datetime.getDate());
75
+ }
76
+ static addMonths(input, value) {
77
+ let n = input.getDate(), i = new Date(input), month = i.getMonth() + value, years = 0;
78
+ while (month < 0) {
79
+ month += 12;
80
+ years--;
81
+ }
82
+ i.setDate(1);
83
+ i.setMonth(month % 12);
84
+ i.setFullYear(i.getFullYear() + years + Math.floor(month / 12));
85
+ i.setDate(Math.min(n, _Dates.daysInMonth(i.getFullYear(), i.getMonth())));
86
+ return i;
87
+ }
88
+ static addDays(input, value) {
89
+ return new Date(input.valueOf() + value * 864e5);
90
+ }
91
+ static daysBetween(start, end) {
92
+ return (end.valueOf() - start.valueOf()) / 864e5;
93
+ }
94
+ };
95
+
96
+ // packages/foundation/dist/esm/null-checker.js
97
+ var NullChecker = class _NullChecker {
98
+ static isNull(o) {
99
+ return o === null || o === void 0;
100
+ }
101
+ static isEmpty(o) {
102
+ try {
103
+ return Array.isArray(o) && o.length === 0 || typeof o === "string" && o === "" || typeof o === "object" && Object.keys(o).length === 0 && !Dates.isDate(o) && !(o instanceof RegExp) && !(o instanceof FileSystemDirectoryHandle) && !(o instanceof FileSystemFileHandle);
104
+ } catch (e) {
105
+ return false;
106
+ }
107
+ }
108
+ static isNullOrEmpty(o) {
109
+ return _NullChecker.isNull(o) || _NullChecker.isEmpty(o);
110
+ }
111
+ };
112
+
113
+ // packages/foundation/dist/esm/array-extensions.js
114
+ Array.prototype.distinct = function() {
115
+ return Array.from(new Set(this));
116
+ };
117
+ Array.prototype.union = function(other) {
118
+ const thisEmpty = NullChecker.isNullOrEmpty(this), thatEmpty = NullChecker.isNullOrEmpty(other);
119
+ if (thisEmpty && thatEmpty) {
120
+ return [];
121
+ }
122
+ if (thatEmpty) {
123
+ return this.slice();
124
+ }
125
+ if (thisEmpty) {
126
+ return other.slice();
127
+ }
128
+ return this.concat(other).distinct();
129
+ };
130
+ Array.prototype.moveWithin = function(from, to) {
131
+ const OUT_OF_RANGE = "Index must be greater or equal than 0 and less or equal than the length of the array.";
132
+ var arr = this;
133
+ if (from < 0 || from > arr.length)
134
+ throw new Error(OUT_OF_RANGE);
135
+ if (to < 0 || to > arr.length)
136
+ throw new Error(OUT_OF_RANGE);
137
+ arr.splice(
138
+ to,
139
+ 0,
140
+ /* avoid to trigger a double change on a single command */
141
+ Array.prototype.splice.apply(arr, [from, 1])[0]
142
+ );
143
+ };
144
+ Array.prototype.equalsContent = function(other) {
145
+ if (other == null || this.length !== other.length) {
146
+ return false;
147
+ }
148
+ for (let j = 0; j < this.length; j++) {
149
+ if (this[j] !== other[j]) {
150
+ return false;
151
+ }
152
+ }
153
+ return true;
154
+ };
155
+ Array.prototype.cloneFrom = function(other) {
156
+ if (other == null) {
157
+ throw "Cannot clone array from null object.";
158
+ }
159
+ const length = other.length;
160
+ var changes = this.length !== other.length;
161
+ for (let j = 0; j < length; j++) {
162
+ const item = other[j];
163
+ if (this.length > j) {
164
+ if (this[j] !== item) {
165
+ this[j] = item;
166
+ changes = true;
167
+ }
168
+ } else {
169
+ Array.prototype.push.apply(this, [item]);
170
+ changes = true;
171
+ }
172
+ }
173
+ if (changes) {
174
+ this.splice(length);
175
+ }
176
+ };
177
+
178
+ // packages/foundation/dist/esm/deepmerger.js
179
+ function isPlainObject(value) {
180
+ return value != null && typeof value === "object" && !Array.isArray(value) && (value.constructor === Object || value.constructor === void 0);
181
+ }
182
+ function deepMerge(target, source) {
183
+ const output = target;
184
+ for (const key of Object.keys(source)) {
185
+ const sourceValue = source[key];
186
+ const targetValue = output[key];
187
+ if (isPlainObject(sourceValue)) {
188
+ output[key] = deepMerge(isPlainObject(targetValue) ? targetValue : {}, sourceValue);
189
+ } else if (Array.isArray(sourceValue)) {
190
+ output[key] = sourceValue.slice();
191
+ } else {
192
+ output[key] = sourceValue;
193
+ }
194
+ }
195
+ return output;
196
+ }
197
+ var DeepMerger = class {
198
+ constructor() {
199
+ }
200
+ static merge(source, target) {
201
+ target ??= globalThis["Pacem"] ??= {};
202
+ return deepMerge(target, source);
203
+ }
204
+ };
205
+
206
+ // packages/foundation/dist/esm/arrays.js
207
+ var Arrays = class {
208
+ static range(min, max, items = 2) {
209
+ let x = min;
210
+ if (NullChecker.isNull(max)) {
211
+ max = items = min;
212
+ min = 1;
213
+ }
214
+ const step = (max - min) / (items - 1);
215
+ const output = [];
216
+ if (step > 0) {
217
+ while (output.length < items) {
218
+ output.push(x.roundoff());
219
+ x += step;
220
+ }
221
+ }
222
+ return output;
223
+ }
224
+ static chunkify(source, size) {
225
+ if (NullChecker.isNullOrEmpty(source)) {
226
+ return [];
227
+ }
228
+ if (size <= 0 || size % 1 !== 0) {
229
+ throw new Error("Provide a positive integer number.");
230
+ }
231
+ const length = Math.ceil(source.length / size);
232
+ return Array.from({ length }, (_, index) => {
233
+ const start = index * size, end = start + size;
234
+ return source.slice(start, end);
235
+ });
236
+ }
237
+ };
238
+
239
+ // packages/foundation/dist/esm/blobs.js
240
+ var Blobs = class _Blobs {
241
+ static blobToDataURL(blob) {
242
+ return new Promise((resolve, _) => {
243
+ const a = new FileReader();
244
+ a.onload = (e) => {
245
+ resolve(e.target.result);
246
+ };
247
+ a.readAsDataURL(blob);
248
+ });
249
+ }
250
+ static _b64ToUint8Array(bstr) {
251
+ let n = bstr.length;
252
+ const u8arr = new Uint8Array(n);
253
+ while (n--) {
254
+ u8arr[n] = bstr.charCodeAt(n);
255
+ }
256
+ return u8arr;
257
+ }
258
+ static base64ToBlob(bstr, options) {
259
+ const u8arr = _Blobs._b64ToUint8Array(atob(bstr));
260
+ return new Blob([u8arr], options);
261
+ }
262
+ static dataURLToBlob(dataurl) {
263
+ const coma = dataurl.indexOf(",");
264
+ if (coma === -1) {
265
+ return _Blobs.base64ToBlob(dataurl);
266
+ } else {
267
+ const bstr = dataurl.substring(coma + 1), data = dataurl.substring(0, coma);
268
+ const mime = data.match(/:(.*?);/)[1];
269
+ return _Blobs.base64ToBlob(bstr, { type: mime });
270
+ }
271
+ }
272
+ static async blobToText(blob, encoding) {
273
+ const buffer = await blob.arrayBuffer();
274
+ const decoder = new TextDecoder(encoding, { fatal: false });
275
+ return decoder.decode(buffer);
276
+ }
277
+ static textToBlob(content, type = "text/plain", charset = "utf-8", bom, lossyChar = 63) {
278
+ let charsetLower = charset.toLowerCase();
279
+ const fullType = () => `${type};charset=${charsetLower}`;
280
+ switch (charsetLower) {
281
+ // -------------------------
282
+ // UTF-8 (native, safe)
283
+ // -------------------------
284
+ case "utf-8": {
285
+ const encoder = new TextEncoder();
286
+ const bytes = encoder.encode(content);
287
+ const parts = bom ? [new Uint8Array([239, 187, 191]), bytes] : [bytes];
288
+ return new Blob(parts, { type: fullType() });
289
+ }
290
+ // -------------------------
291
+ // UTF-16 (explicit LE/BE)
292
+ // -------------------------
293
+ case "utf-16":
294
+ charsetLower = "utf-16le";
295
+ bom ??= true;
296
+ case "utf-16le":
297
+ case "utf-16be": {
298
+ const littleEndian = charsetLower !== "utf-16be";
299
+ const offset = bom ? 1 : 0;
300
+ const buffer = new ArrayBuffer((content.length + offset) * 2);
301
+ const view = new DataView(buffer);
302
+ if (bom) {
303
+ view.setUint16(0, 65279, littleEndian);
304
+ }
305
+ for (let i = 0; i < content.length; i++) {
306
+ view.setUint16((i + offset) * 2, content.charCodeAt(i), littleEndian);
307
+ }
308
+ return new Blob([buffer], {
309
+ type: fullType()
310
+ });
311
+ }
312
+ // -------------------------
313
+ // Latin-1 (ISO-8859-1)
314
+ // -------------------------
315
+ case "ascii":
316
+ case "iso-8859-1":
317
+ case "latin1": {
318
+ const boundary = charsetLower === "ascii" ? 127 : 255;
319
+ const buffer = new Uint8Array(content.length);
320
+ const lossy = lossyChar > 0;
321
+ for (let i = 0; i < content.length; i++) {
322
+ const code = content.charCodeAt(i);
323
+ if (code > boundary) {
324
+ if (lossy) {
325
+ buffer[i] = lossyChar;
326
+ } else {
327
+ throw new Error(`Character "${content[i]}" cannot be encoded in ${charset}.`);
328
+ }
329
+ } else {
330
+ buffer[i] = code;
331
+ }
332
+ }
333
+ return new Blob([buffer], { type: fullType() });
334
+ }
335
+ // -------------------------
336
+ // Explicitly unsupported
337
+ // -------------------------
338
+ default:
339
+ throw new Error(`Encoding "${charset}" is not supported safely in the browser. Use UTF-8 or any supported encoding.`);
340
+ }
341
+ }
342
+ };
343
+
344
+ // packages/foundation/dist/esm/browser.js
345
+ var browserVersion = (userAgent, regex) => {
346
+ const match2 = userAgent.match(regex);
347
+ return match2 ? match2[2] : null;
348
+ };
349
+ function detect(userAgent = navigator.userAgent) {
350
+ let browser = "unknown";
351
+ let version = null;
352
+ if (/ucbrowser/i.test(userAgent)) {
353
+ browser = "UCBrowser";
354
+ } else if (/edg/i.test(userAgent)) {
355
+ browser = "Edge";
356
+ } else if (/googlebot/i.test(userAgent)) {
357
+ browser = "GoogleBot";
358
+ } else if (/chromium/i.test(userAgent)) {
359
+ browser = "Chromium";
360
+ } else if (/firefox|fxios/i.test(userAgent) && !/seamonkey/i.test(userAgent)) {
361
+ browser = "Firefox";
362
+ } else if (/; msie|trident/i.test(userAgent) && !/ucbrowser/i.test(userAgent)) {
363
+ browser = "IE";
364
+ } else if (/chrome|crios/i.test(userAgent) && !/opr|opera|chromium|edg|ucbrowser|googlebot/i.test(userAgent)) {
365
+ browser = "Chrome";
366
+ } else if (/safari/i.test(userAgent) && !/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i.test(userAgent)) {
367
+ browser = "Safari";
368
+ } else if (/opr|opera/i.test(userAgent)) {
369
+ browser = "Opera";
370
+ }
371
+ switch (browser) {
372
+ case "UCBrowser":
373
+ version = browserVersion(userAgent, /(ucbrowser)\/([\d\.]+)/i);
374
+ break;
375
+ case "Edge":
376
+ version = browserVersion(userAgent, /(edge|edga|edgios|edg)\/([\d\.]+)/i);
377
+ break;
378
+ case "GoogleBot":
379
+ version = browserVersion(userAgent, /(googlebot)\/([\d\.]+)/i);
380
+ break;
381
+ case "Chromium":
382
+ version = browserVersion(userAgent, /(chromium)\/([\d\.]+)/i);
383
+ break;
384
+ case "Firefox":
385
+ version = browserVersion(userAgent, /(firefox|fxios)\/([\d\.]+)/i);
386
+ break;
387
+ case "Chrome":
388
+ version = browserVersion(userAgent, /(chrome|crios)\/([\d\.]+)/i);
389
+ break;
390
+ case "Safari":
391
+ version = browserVersion(userAgent, /(safari)\/([\d\.]+)/i);
392
+ break;
393
+ case "Opera":
394
+ version = browserVersion(userAgent, /(opera|opr)\/([\d\.]+)/i);
395
+ break;
396
+ case "IE": {
397
+ const tridentVersion = browserVersion(userAgent, /(trident)\/([\d\.]+)/i);
398
+ version = tridentVersion ? `${parseFloat(tridentVersion) + 4}` : "7.0";
399
+ break;
400
+ }
401
+ default:
402
+ version = "0.0.0.0";
403
+ break;
404
+ }
405
+ return { name: browser, version };
406
+ }
407
+
408
+ // packages/foundation/dist/esm/colors.js
409
+ var HSL_PATTERN = /^hsl\s*\(\s*([\d\.]+)\s*,\s*([\d\.]+)%\s*,\s*([\d\.]+)%\s*\)$/;
410
+ var HSLA_PATTERN = /^hsla\s*\(\s*([\d\.]+)\s*,\s*([\d\.]+)%\s*,\s*([\d\.]+)%\s*,\s*([\d\.]+)\)$/;
411
+ var RGB_PATTERN = /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/;
412
+ var RGBA_PATTERN = /^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d\.]+)\)$/;
413
+ var HEX_PATTERN = /^#[a-f0-9]{6}$/;
414
+ var HEX_SHORT_PATTERN = /^#[a-f0-9]{3}$/;
415
+ function isRgb(clr) {
416
+ const base = !NullChecker.isNullOrEmpty(clr) && typeof clr === "object" && "r" in clr && "g" in clr && "b" in clr && typeof clr.r === "number" && typeof clr.b === "number" && typeof clr.g === "number";
417
+ if (!base) {
418
+ return false;
419
+ }
420
+ clr.a ??= 1;
421
+ return clr.r >= 0 && clr.r <= 1 && clr.g >= 0 && clr.g <= 1 && clr.b >= 0 && clr.b <= 1 && clr.a >= 0 && clr.a <= 1;
422
+ }
423
+ function isHsl(clr) {
424
+ const base = !NullChecker.isNullOrEmpty(clr) && typeof clr === "object" && "h" in clr && "s" in clr && "l" in clr && typeof clr.h === "number" && typeof clr.s === "number" && typeof clr.l === "number";
425
+ if (!base) {
426
+ return false;
427
+ }
428
+ clr.a ??= 1;
429
+ return clr.h >= 0 && clr.h <= 360 && clr.s >= 0 && clr.s <= 1 && clr.l >= 0 && clr.l <= 1 && clr.a >= 0 && clr.a <= 1;
430
+ }
431
+ function luminance(rgb) {
432
+ const r = rgb.r, g = rgb.g, b = rgb.b;
433
+ const l = 0.5 * (Math.max(r, g, b) + Math.min(r, g, b));
434
+ return l.clamp(0, 1);
435
+ }
436
+ var cieUtils = {
437
+ adjustRgbChannel: (v) => {
438
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
439
+ },
440
+ adjustRgbChannelInv: (v) => {
441
+ return v <= 304e-5 ? v * 12.92 : 1.055 * (Math.pow(v, 1 / 2.4) - 0.055);
442
+ },
443
+ adjustRgb: (rgb) => {
444
+ const rgbOut = { r: cieUtils.adjustRgbChannel(rgb.r), g: cieUtils.adjustRgbChannel(rgb.g), b: cieUtils.adjustRgbChannel(rgb.b), a: rgb.a };
445
+ return rgbOut;
446
+ },
447
+ adjustRgbInv: (rgb) => {
448
+ const rgbOut = { r: cieUtils.adjustRgbChannelInv(rgb.r), g: cieUtils.adjustRgbChannelInv(rgb.g), b: cieUtils.adjustRgbChannelInv(rgb.b), a: rgb.a };
449
+ return rgbOut;
450
+ },
451
+ X: (adjustedRgb) => {
452
+ return 0.4125 * adjustedRgb.r + 0.3576 * adjustedRgb.g + 0.1804 * adjustedRgb.b;
453
+ },
454
+ Y: (adjustedRgb) => {
455
+ return 0.2126 * adjustedRgb.r + 0.7152 * adjustedRgb.g + 0.0722 * adjustedRgb.b;
456
+ },
457
+ Z: (adjustedRgb) => {
458
+ return 0.0193 * adjustedRgb.r + 0.1191 * adjustedRgb.g + 0.9503 * adjustedRgb.b;
459
+ },
460
+ relativeLuminance: (rgb) => {
461
+ const adjRgb = cieUtils.adjustRgb(rgb);
462
+ return cieUtils.Y(adjRgb);
463
+ },
464
+ rgbToCieXYZ: (rgb) => {
465
+ const adjRgb = cieUtils.adjustRgb(rgb);
466
+ const xyz = { x: cieUtils.X(adjRgb), y: cieUtils.Y(adjRgb), z: cieUtils.Z(adjRgb), a: rgb.a };
467
+ return xyz;
468
+ },
469
+ cieXYZToRgb: (xyz) => {
470
+ const r = 3.241 * xyz.x - 1.5374 * xyz.y - 0.4986 * xyz.z, g = -0.9692 * xyz.x + 1.876 * xyz.y + 0.0416 * xyz.z, b = 0.0556 * xyz.x - 0.204 * xyz.y + 1.057 * xyz.z;
471
+ return cieUtils.adjustRgbInv({ r, g, b, a: xyz.a });
472
+ },
473
+ /**
474
+ * Returns the contrast ratio between two colors.
475
+ * @param rgb1 Color 1
476
+ * @param rgb2 Color 2
477
+ * @returns A numeric value between 1 and 21.
478
+ */
479
+ contrastRatio: (rgb1, rgb2) => {
480
+ const l1 = cieUtils.relativeLuminance(rgb1) + 0.05, l2 = cieUtils.relativeLuminance(rgb2) + 0.05;
481
+ return l1 > l2 ? l1 / l2 : l2 / l1;
482
+ }
483
+ };
484
+ function saturation(rgb, l) {
485
+ const r = rgb.r, g = rgb.g, b = rgb.b;
486
+ const max = Math.max(r, g, b);
487
+ const min = Math.min(r, g, b);
488
+ const s = l === 0 || l === 1 ? 0 : (max - min) / (1 - Math.abs(2 * l - 1));
489
+ return s.clamp(0, 1);
490
+ }
491
+ function hueCircle(rgb) {
492
+ const r = rgb.r, g = rgb.g, b = rgb.b;
493
+ const max = Math.max(r, g, b);
494
+ const min = Math.min(r, g, b);
495
+ let hue = 0;
496
+ if (max !== min) {
497
+ if (max === r) {
498
+ hue = (60 * ((g - b) / (max - min)) + 360) % 360;
499
+ } else if (max === g) {
500
+ hue = (60 * ((b - r) / (max - min)) + 120) % 360;
501
+ } else {
502
+ hue = (60 * ((r - g) / (max - min)) + 240) % 360;
503
+ }
504
+ }
505
+ return hue.clamp(0, 360);
506
+ }
507
+ function hexify(v) {
508
+ return v.toString(16).padStart(2, "0");
509
+ }
510
+ var Colors = class _Colors {
511
+ static {
512
+ this.WCAG_MINIMUM_CONTRAST = 3;
513
+ }
514
+ static {
515
+ this.WCAG_NORMAL_TEXT_CONTRAST = 4.5;
516
+ }
517
+ static {
518
+ this.WCAG_SAFE_CONTRAST = 7;
519
+ }
520
+ static _clampRGB(rgb) {
521
+ const clmp = (n) => Math.min(1, Math.max(0, n));
522
+ if (rgb[3] == null) {
523
+ rgb[3] = 1;
524
+ }
525
+ return { r: clmp(rgb[0]), g: clmp(rgb[1]), b: clmp(rgb[2]), a: Math.min(1, Math.max(0, rgb[3])) };
526
+ }
527
+ static _normalize(rgb) {
528
+ return [rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, rgb[3]];
529
+ }
530
+ static parse(clr) {
531
+ clr = (clr || "").toLowerCase();
532
+ if (RGB_PATTERN.test(clr)) {
533
+ let rgbArr = RGB_PATTERN.exec(clr);
534
+ return this._clampRGB(this._normalize([parseInt(rgbArr[1]), parseInt(rgbArr[2]), parseInt(rgbArr[3]), 1]));
535
+ }
536
+ if (RGBA_PATTERN.test(clr)) {
537
+ let rgbArr = RGBA_PATTERN.exec(clr);
538
+ return this._clampRGB(this._normalize([parseInt(rgbArr[1]), parseInt(rgbArr[2]), parseInt(rgbArr[3]), parseFloat(rgbArr[4])]));
539
+ }
540
+ if (HEX_PATTERN.test(clr)) {
541
+ let hex = HEX_PATTERN.exec(clr)[0];
542
+ return this._clampRGB(this._normalize([parseInt("0x" + hex.substr(1, 2)), parseInt("0x" + hex.substr(3, 2)), parseInt("0x" + hex.substr(5, 2)), 1]));
543
+ }
544
+ if (HEX_SHORT_PATTERN.test(clr)) {
545
+ let hex = HEX_SHORT_PATTERN.exec(clr)[0];
546
+ let r = hex.substr(1, 1), g = hex.substr(2, 1), b = hex.substr(3, 1);
547
+ return this._clampRGB(this._normalize([parseInt("0x" + r + r), parseInt("0x" + g + g), parseInt("0x" + b + b), 1]));
548
+ }
549
+ if (HSL_PATTERN.test(clr)) {
550
+ let hslArr = HSL_PATTERN.exec(clr);
551
+ const hsl = { h: parseFloat(hslArr[1]), s: parseFloat(hslArr[2]) * 0.01, l: parseFloat(hslArr[3]) * 0.01 };
552
+ return this.rgb(hsl);
553
+ }
554
+ if (HSLA_PATTERN.test(clr)) {
555
+ let hslaArr = HSLA_PATTERN.exec(clr);
556
+ const hsla = { h: parseFloat(hslaArr[1]), s: parseFloat(hslaArr[2]) * 0.01, l: parseFloat(hslaArr[3]) * 0.01, a: parseFloat(hslaArr[4]) };
557
+ return this.rgb(hsla);
558
+ }
559
+ }
560
+ static hsl(rgb) {
561
+ const l = luminance(rgb), s = saturation(rgb, l), h = hueCircle(rgb);
562
+ return { h, s, l, a: rgb.a };
563
+ }
564
+ static cieXYZ(clr) {
565
+ if (isHsl(clr)) {
566
+ clr = this.rgb(clr);
567
+ }
568
+ return cieUtils.rgbToCieXYZ(clr);
569
+ }
570
+ static rgb(clr) {
571
+ if (isHsl(clr)) {
572
+ const h = clr.h, s = clr.s, l = clr.l, h6 = h / 60;
573
+ const C = (1 - Math.abs(2 * l - 1)) * s;
574
+ const X = C * (1 - Math.abs(h6 % 2 - 1));
575
+ const m = l - C / 2;
576
+ const compose = (r, g, b) => this._clampRGB([r + m, g + m, b + m, clr.a]);
577
+ if (h6 <= 1) {
578
+ return compose(C, X, 0);
579
+ } else if (h6 <= 2) {
580
+ return compose(X, C, 0);
581
+ } else if (h6 <= 3) {
582
+ return compose(0, C, X);
583
+ } else if (h6 <= 4) {
584
+ return compose(0, X, C);
585
+ } else if (h6 <= 5) {
586
+ return compose(X, 0, C);
587
+ } else if (h6 <= 6) {
588
+ return compose(C, 0, X);
589
+ }
590
+ } else {
591
+ const rgb = cieUtils.cieXYZToRgb(clr);
592
+ return this._clampRGB([rgb.r, rgb.g, rgb.b, rgb.a]);
593
+ }
594
+ }
595
+ static stringify(clr, arg1 = 1) {
596
+ if (isHsl(clr)) {
597
+ arg1 ??= 1;
598
+ clr.a ??= 1;
599
+ const precision = typeof arg1 === "number" ? arg1 : 1;
600
+ return `hsla(${clr.h.roundoff(precision)},${(clr.s * 100).roundoff(precision)}%,${(clr.l * 100).roundoff(precision)}%,${clr.a.roundoff()})`;
601
+ } else if (isRgb(clr)) {
602
+ arg1 ??= true;
603
+ clr.a ??= 1;
604
+ const hex = typeof arg1 === "boolean" ? arg1 : !!arg1, r = Math.round(clr.r * 255), g = Math.round(clr.g * 255), b = Math.round(clr.b * 255), a = clr.a.roundoff();
605
+ if (a === 1) {
606
+ if (hex) {
607
+ return ("#" + hexify(r) + hexify(g) + hexify(b)).toUpperCase();
608
+ }
609
+ return `rgb(${r},${g},${b})`;
610
+ }
611
+ return `rgba(${r},${g},${b},${a})`;
612
+ }
613
+ return void 0;
614
+ }
615
+ /**
616
+ * Contrast ratio betwen two colors (useful for accessibility assessments). Output range: 1 (no-contrast) to 21 (maximum contrast)
617
+ */
618
+ static contrastRatio(clr1, clr2) {
619
+ if (isHsl(clr1)) {
620
+ clr1 = this.rgb(clr1);
621
+ }
622
+ if (isHsl(clr2)) {
623
+ clr2 = this.rgb(clr2);
624
+ }
625
+ return cieUtils.contrastRatio(clr1, clr2);
626
+ }
627
+ /**
628
+ * Returns the relative luminance as of WCAG specs.
629
+ */
630
+ static luminance(clr) {
631
+ if (isHsl(clr)) {
632
+ clr = _Colors.rgb(clr);
633
+ }
634
+ return cieUtils.relativeLuminance(clr);
635
+ }
636
+ static lighten(clr, amount = 0.1) {
637
+ amount ||= 0;
638
+ if (isHsl(clr)) {
639
+ const l = Math.min(1, Math.max(0, clr.l + amount));
640
+ return Object.assign({}, clr, { l });
641
+ }
642
+ if (isRgb(clr)) {
643
+ const hsl = this.lighten(this.hsl(clr), amount);
644
+ return this.rgb(hsl);
645
+ }
646
+ return clr;
647
+ }
648
+ static darken(clr, amount = 0.1) {
649
+ return this.lighten(clr, -amount);
650
+ }
651
+ static saturate(clr, amount = 0.1) {
652
+ amount ||= 0;
653
+ if (isHsl(clr)) {
654
+ const s = Math.min(1, Math.max(0, clr.s + amount));
655
+ return Object.assign({}, clr, { s });
656
+ }
657
+ if (isRgb(clr)) {
658
+ const hsl = this.saturate(this.hsl(clr), amount);
659
+ return this.rgb(hsl);
660
+ }
661
+ return clr;
662
+ }
663
+ static desaturate(clr, amount = 0.1) {
664
+ return this.saturate(clr, -amount);
665
+ }
666
+ static interpolate(clr1, clr2, weight1, weight2) {
667
+ weight1 ??= 0.5;
668
+ weight2 ??= weight1;
669
+ const weight = (weight1 + weight2).roundoff();
670
+ const ratio1 = (weight1 / weight).roundoff(), ratio2 = (weight2 / weight).roundoff();
671
+ const rgb = isRgb(clr1), hsl = isHsl(clr1);
672
+ const toCieXYZ = (c) => {
673
+ if (isRgb(c) || isHsl(c)) {
674
+ return _Colors.cieXYZ(c);
675
+ }
676
+ return c;
677
+ };
678
+ clr1 = toCieXYZ(clr1);
679
+ clr2 = toCieXYZ(clr2);
680
+ const clr = {
681
+ x: (clr1.x * ratio1 + clr2.x * ratio2).roundoff(),
682
+ y: (clr1.y * ratio1 + clr2.y * ratio2).roundoff(),
683
+ z: (clr1.z * ratio1 + clr2.z * ratio2).roundoff(),
684
+ a: (clr1.a * ratio1 + clr2.a * ratio2).roundoff()
685
+ };
686
+ if (rgb) {
687
+ return _Colors.rgb(clr);
688
+ }
689
+ if (hsl) {
690
+ return _Colors.hsl(_Colors.rgb(clr));
691
+ }
692
+ return clr;
693
+ }
694
+ };
695
+
696
+ // packages/foundation/dist/esm/geom.js
697
+ var FLOAT_PATTERN = /[-+]?([\d]+(\.[\d]+(e-[\d]+)?)?|[\d]*(\.[\d]+(e-[\d]+)?))/g;
698
+ function parseAsNumericalArray(input) {
699
+ const arr = [];
700
+ let reg = input.match(FLOAT_PATTERN);
701
+ if (reg && reg.length > 0) {
702
+ reg.forEach((i) => arr.push(parseFloat(i)));
703
+ }
704
+ return arr;
705
+ }
706
+ var Angle = class _Angle {
707
+ static isAngle(obj) {
708
+ return typeof obj === "object" && "vertex" in obj && Point.isPoint(obj["vertex"]) && "start" in obj && Point.isPoint(obj["start"]) && "end" in obj && Point.isPoint(obj["end"]);
709
+ }
710
+ /**
711
+ * Returns the angle span in radians.
712
+ * Clockwise angles are positive, counterclockwise angles are negative.
713
+ */
714
+ static value(angle) {
715
+ if (NullChecker.isNullOrEmpty(angle) || !_Angle.isAngle(angle)) {
716
+ return Number.NaN;
717
+ }
718
+ const { vertex, start, end } = angle;
719
+ return _Angle.angleBetween(vertex, start, end);
720
+ }
721
+ /**
722
+ * Returns the angle (in radians) given the angle vertex and two points belonging to the rays that combine to build the angle sides.
723
+ * Clockwise angles are positive, counterclockwise angles are negative.
724
+ * @param vertex Angle vertex
725
+ * @param start Point belonging to the start side
726
+ * @param end Point belonging to the end side
727
+ * @returns Angle span in radians [-pi, pi]
728
+ */
729
+ static angleBetween(vertex, start, end) {
730
+ const v1 = { x: start.x - vertex.x, y: start.y - vertex.y }, v2 = { x: end.x - vertex.x, y: end.y - vertex.y };
731
+ const dot = v1.x * v2.x + v1.y * v2.y;
732
+ const cross = v1.x * v2.y - v1.y * v2.x;
733
+ return -Math.atan2(cross, dot);
734
+ }
735
+ };
736
+ var Size = class {
737
+ static parse(sz) {
738
+ let arr = parseAsNumericalArray(sz);
739
+ if (arr && arr.length === 2) {
740
+ return { width: arr[0], height: arr[1] };
741
+ }
742
+ throw new Error(`Cannot parse "${sz}" as a valid Size.`);
743
+ }
744
+ static isSize(obj) {
745
+ return typeof obj === "object" && "width" in obj && typeof obj["width"] === "number" && "height" in obj && typeof obj["height"] === "number";
746
+ }
747
+ };
748
+ var Point = class {
749
+ static parse(pt) {
750
+ let arr = parseAsNumericalArray(pt);
751
+ if (arr && arr.length === 2) {
752
+ return { x: arr[0], y: arr[1] };
753
+ }
754
+ throw new Error(`Cannot parse "${pt}" as a valid Point.`);
755
+ }
756
+ static isPoint(obj) {
757
+ return typeof obj === "object" && "x" in obj && typeof obj["x"] === "number" && "y" in obj && typeof obj["y"] === "number";
758
+ }
759
+ /**
760
+ * Computes the distance between two points.
761
+ * @param p1 Point 1
762
+ * @param p2 Point 2
763
+ */
764
+ static distance(p1, p2) {
765
+ return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
766
+ }
767
+ /**
768
+ * Subtracts a point p from another and returns the resulting vector.
769
+ * @param p Point to subtract
770
+ * @param from Point to be subtracted from
771
+ */
772
+ static subtract(p, from) {
773
+ return { x: from.x - p.x, y: from.y - p.y };
774
+ }
775
+ /**
776
+ * Adds a set of points together and returns the resulting vector.
777
+ * @param points Points to add
778
+ */
779
+ static add(...points) {
780
+ var point = { x: 0, y: 0 };
781
+ for (var p of points) {
782
+ point.x += p.x;
783
+ point.y += p.y;
784
+ }
785
+ return point;
786
+ }
787
+ /**
788
+ * Memberwise multiplication.
789
+ * @param p Original Point object
790
+ * @param f Factor
791
+ * @returns New Point object.
792
+ */
793
+ static multiply(p, f) {
794
+ return { x: p.x * f, y: p.y * f };
795
+ }
796
+ };
797
+
798
+ // packages/foundation/dist/esm/matrix2d.js
799
+ var Matrix2D = class _Matrix2D {
800
+ static isIdentity(m) {
801
+ return m.a === 1 && m.d === 1 && m.b === 0 && m.f === 0 && m.c === 0 && m.e === 0;
802
+ }
803
+ static get identity() {
804
+ return { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };
805
+ }
806
+ static copy(m) {
807
+ return { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e, f: m.f };
808
+ }
809
+ static scale(m, sx, sy = sx) {
810
+ return { a: m.a * sx, b: m.b, c: m.c, d: m.d * sy, e: m.e, f: m.f };
811
+ }
812
+ static translate(m, t) {
813
+ return { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e + t.x, f: m.f + t.y };
814
+ }
815
+ static rotate(m, rad) {
816
+ const cos = Math.cos(rad), sin = Math.sin(rad);
817
+ return _Matrix2D.multiply(m, { a: cos, b: sin, c: -sin, d: cos, e: 0, f: 0 });
818
+ }
819
+ static multiply(m1, m2) {
820
+ if ("x" in m1 && "y" in m1) {
821
+ if (typeof m2 === "number") {
822
+ return { x: m1.x * m2, y: m1.y * m2 };
823
+ } else {
824
+ return { x: m1.x * m2.a + m1.y * m2.c + m2.e, y: m1.x * m2.b + m1.y * m2.d + m2.f };
825
+ }
826
+ }
827
+ if (typeof m2 === "number") {
828
+ return {
829
+ a: m1.a * m2,
830
+ b: m1.b * m2,
831
+ c: m1.c * m2,
832
+ d: m1.d * m2,
833
+ e: m1.e * m2,
834
+ f: m1.f * m2
835
+ };
836
+ }
837
+ return {
838
+ a: m1.a * m2.a + m1.b * m2.c,
839
+ b: m1.a * m2.b + m1.b * m2.d,
840
+ c: m1.c * m2.a + m1.d * m2.c,
841
+ d: m1.c * m2.b + m1.d * m2.d,
842
+ e: m1.e * m2.a + m1.f * m2.c + m2.e,
843
+ f: m1.e * m2.b + m1.f * m2.d + m2.f
844
+ };
845
+ }
846
+ static det(m) {
847
+ return m.a * m.d - m.c * m.b;
848
+ }
849
+ static invert(m) {
850
+ const det = this.det(m);
851
+ if (det === 0) {
852
+ return null;
853
+ }
854
+ const invdet = 1 / det;
855
+ return this.multiply({
856
+ a: m.d,
857
+ b: -m.b,
858
+ c: -m.c,
859
+ d: m.a,
860
+ e: -m.e * m.d + m.c * m.f,
861
+ f: m.e * m.b - m.a * m.f
862
+ }, invdet);
863
+ }
864
+ static toComponents(m, transformOrigin = { x: 0, y: 0 }) {
865
+ const scaleX = Math.sqrt(m.a * m.a + m.c * m.c);
866
+ const scaleY = Math.sqrt(m.b * m.b + m.d * m.d);
867
+ const cos = scaleX != 0 ? m.a / scaleX : 0;
868
+ const sin = scaleX != 0 ? m.c / scaleX : 0;
869
+ const rotation = Math.atan2(sin, cos);
870
+ const { x: px, y: py } = transformOrigin;
871
+ const translation = {
872
+ x: m.e - px * (scaleX * cos - 1) + py * scaleX * sin,
873
+ y: m.f - py * (scaleY * cos - 1) - px * scaleY * sin
874
+ };
875
+ return {
876
+ scaleX,
877
+ scaleY,
878
+ rotation,
879
+ translation
880
+ };
881
+ }
882
+ /**
883
+ * Returns the matrix that transforms the triangle defined by the points p0, p1, p2 into the triangle defined by the points q0, q1, q2.
884
+ * @param param0 Triangle defined by the points p0, p1, p2 (before transformation).
885
+ * @param param1 Triangle defined by the points q0, q1, q2 (after transformation).
886
+ * @returns Transformation matrix.
887
+ */
888
+ static fromTransform([p0, p1, p2], [q0, q1, q2]) {
889
+ const det = p0.x * (p1.y - p2.y) - p0.y * (p1.x - p2.x) + (p1.x * p2.y - p2.x * p1.y);
890
+ if (Math.abs(det) < 1e-10) {
891
+ throw new Error("Points are collinear; matrix is singular and cannot be solved.");
892
+ }
893
+ const idet = 1 / det;
894
+ return {
895
+ a: idet * (q0.x * (p1.y - p2.y) + q1.x * (p2.y - p0.y) + q2.x * (p0.y - p1.y)),
896
+ b: idet * (q0.y * (p1.y - p2.y) + q1.y * (p2.y - p0.y) + q2.y * (p0.y - p1.y)),
897
+ c: idet * (q0.x * (p2.x - p1.x) + q1.x * (p0.x - p2.x) + q2.x * (p1.x - p0.x)),
898
+ d: idet * (q0.y * (p2.x - p1.x) + q1.y * (p0.x - p2.x) + q2.y * (p1.x - p0.x)),
899
+ e: idet * (q0.x * (p1.x * p2.y - p2.x * p1.y) + q1.x * (p2.x * p0.y - p0.x * p2.y) + q2.x * (p0.x * p1.y - p1.x * p0.y)),
900
+ f: idet * (q0.y * (p1.x * p2.y - p2.x * p1.y) + q1.y * (p2.x * p0.y - p0.x * p2.y) + q2.y * (p0.x * p1.y - p1.x * p0.y))
901
+ };
902
+ }
903
+ /**
904
+ * Returns whether two matrices are equal to each other, within a certain precision (number of decimal digits).
905
+ * @param m1
906
+ * @param m2
907
+ * @param precision
908
+ * @returns
909
+ */
910
+ static areClose(m1, m2, precision = 12) {
911
+ return m1.a.isCloseTo(m2.a, precision) && m1.b.isCloseTo(m2.b, precision) && m1.c.isCloseTo(m2.c, precision) && m1.d.isCloseTo(m2.d, precision) && m1.e.isCloseTo(m2.e, precision) && m1.f.isCloseTo(m2.f, precision);
912
+ }
913
+ };
914
+
915
+ // packages/foundation/dist/esm/rect.js
916
+ var Rect = class _Rect {
917
+ static parse(rect) {
918
+ let arr = parseAsNumericalArray(rect);
919
+ if (arr && arr.length === 4) {
920
+ return { x: arr[0], y: arr[1], width: arr[2], height: arr[3] };
921
+ }
922
+ throw new Error(`Cannot parse "${rect}" as a valid Rect.`);
923
+ }
924
+ static isRect(obj) {
925
+ return Point.isPoint(obj) && Size.isSize(obj);
926
+ }
927
+ static _stretch(from, to) {
928
+ return { a: to.width / from.width, b: 0, c: 0, d: to.height / from.height, e: to.x - from.x, f: to.y - from.y };
929
+ }
930
+ static _contain(from, to, align, valign) {
931
+ let scale = 1;
932
+ const fromRatio = from.width / from.height, toRatio = to.width / to.height;
933
+ if (fromRatio >= toRatio) {
934
+ scale = to.width / from.width;
935
+ } else {
936
+ scale = to.height / from.height;
937
+ }
938
+ const w = from.width * scale, h = from.height * scale;
939
+ const translation = this._align({ x: from.x, y: from.y, width: w, height: h }, to, align, valign);
940
+ return Matrix2D.translate({ a: scale, b: 0, c: 0, d: scale, e: 0, f: 0 }, translation);
941
+ }
942
+ static _cover(from, to, align, valign) {
943
+ let scale = 1;
944
+ const fromRatio = from.width / from.height, toRatio = to.width / to.height;
945
+ if (fromRatio < toRatio) {
946
+ scale = to.width / from.width;
947
+ } else {
948
+ scale = to.height / from.height;
949
+ }
950
+ const w = from.width * scale, h = from.height * scale;
951
+ const translation = this._align({ x: from.x, y: from.y, width: w, height: h }, to, align, valign);
952
+ return Matrix2D.translate({ a: scale, b: 0, c: 0, d: scale, e: 0, f: 0 }, translation);
953
+ }
954
+ static _align(from, to, align, valign) {
955
+ let x = 0, y = 0;
956
+ switch (align) {
957
+ case "left":
958
+ x = to.x - from.x;
959
+ break;
960
+ case "right":
961
+ x = to.x + to.width - from.width - from.x;
962
+ break;
963
+ default:
964
+ x = to.x + to.width * 0.5 - from.width * 0.5 - from.x;
965
+ break;
966
+ }
967
+ switch (valign) {
968
+ case "top":
969
+ y = to.y - from.y;
970
+ break;
971
+ case "bottom":
972
+ y = to.y + to.height - from.height - from.y;
973
+ break;
974
+ default:
975
+ y = to.y + to.height * 0.5 - from.height * 0.5 - from.y;
976
+ break;
977
+ }
978
+ return { x, y };
979
+ }
980
+ /**
981
+ * Computes the 2D matrix that transforms one rect into another.
982
+ * @param a Rect from
983
+ * @param b Rect to
984
+ * @param mode Transformation mode
985
+ * @param align Horizontal alignment
986
+ * @param valign Vertical alignment
987
+ */
988
+ static findTransform(a, b, mode = "stretch", align = "center", valign = "middle") {
989
+ switch (mode) {
990
+ case "contain":
991
+ return this._contain(a, b, align, valign);
992
+ case "cover":
993
+ return this._cover(a, b, align, valign);
994
+ default:
995
+ return this._stretch(a, b);
996
+ }
997
+ }
998
+ /**
999
+ * Computes the intersection rect among a set of provided rects.
1000
+ * @param rects Rects to intersect
1001
+ */
1002
+ static intersect(...rects) {
1003
+ const empty = { x: 0, y: 0, height: 0, width: 0 }, arr = Array.from(rects || []);
1004
+ if (arr.length <= 0) {
1005
+ return empty;
1006
+ }
1007
+ var rect = arr[0];
1008
+ for (var i = 1; i < arr.length; i++) {
1009
+ const r = arr[i];
1010
+ const x = Math.max(r.x, rect.x), y = Math.max(r.y, rect.y), xw = Math.min(r.x + r.width, rect.x + rect.width), xh = Math.min(r.y + r.height, rect.y + rect.height), w = xw - x, h = xh - y;
1011
+ if (w < 0 || h <= 0) {
1012
+ return empty;
1013
+ }
1014
+ rect = { x, y, width: w, height: h };
1015
+ }
1016
+ return rect;
1017
+ }
1018
+ static expand(rect, ...args) {
1019
+ const arr = Array.from(args || []);
1020
+ let x0 = rect.x, y0 = rect.y, x1 = x0, y1 = y0;
1021
+ if (_Rect.isRect(rect)) {
1022
+ x1 += rect.width;
1023
+ y1 += rect.height;
1024
+ }
1025
+ for (let p of arr) {
1026
+ x0 = Math.min(p.x, x0);
1027
+ y0 = Math.min(p.y, y0);
1028
+ x1 = Math.max(p.x, x1);
1029
+ y1 = Math.max(p.y, y1);
1030
+ }
1031
+ return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
1032
+ }
1033
+ };
1034
+
1035
+ // packages/foundation/dist/esm/history-svc.js
1036
+ var HistoryService = class {
1037
+ constructor(state, maxlength) {
1038
+ this.#current = state;
1039
+ this.#maxlength = maxlength;
1040
+ }
1041
+ // it's a queue
1042
+ #backwards = [];
1043
+ // it's a stack
1044
+ #forwards = [];
1045
+ // max number of items (queue + stack)
1046
+ #maxlength;
1047
+ #current;
1048
+ /**
1049
+ * Gets the current state.
1050
+ */
1051
+ get current() {
1052
+ return this.#current;
1053
+ }
1054
+ get canUndo() {
1055
+ return this.#backwards.length > 0;
1056
+ }
1057
+ get canRedo() {
1058
+ return this.#forwards.length > 0;
1059
+ }
1060
+ /** Sets the maximum number of stored states, queue + stack.
1061
+ */
1062
+ set maxlength(v) {
1063
+ this.#maxlength = v;
1064
+ }
1065
+ undo() {
1066
+ if (this.canUndo) {
1067
+ const back = this.#backwards, fore = this.#forwards, current = this.#current;
1068
+ fore.unshift(current);
1069
+ this.#current = back.pop();
1070
+ }
1071
+ }
1072
+ redo() {
1073
+ if (this.canRedo) {
1074
+ const back = this.#backwards, fore = this.#forwards, current = this.#current;
1075
+ back.push(current);
1076
+ this.#current = fore.shift();
1077
+ }
1078
+ }
1079
+ push(state) {
1080
+ this.#forwards.splice(0);
1081
+ this.#backwards.push(this.#current);
1082
+ this.#current = state;
1083
+ const max = this.#maxlength, queue = this.#backwards;
1084
+ if (max > 0 && queue.length > max) {
1085
+ queue.splice(0, queue.length - max);
1086
+ }
1087
+ }
1088
+ reset() {
1089
+ this.#forwards.splice(0);
1090
+ this.#backwards.splice(0);
1091
+ }
1092
+ };
1093
+
1094
+ // packages/foundation/dist/esm/imaging.js
1095
+ var DefaultImagingResizeOptions = {
1096
+ mode: "stretch",
1097
+ align: "center",
1098
+ valign: "middle",
1099
+ quality: 1,
1100
+ type: "image/jpeg"
1101
+ };
1102
+ var Imaging = class _Imaging {
1103
+ static async loadImage(url) {
1104
+ const response = await fetch(url);
1105
+ if (!response.ok) {
1106
+ return null;
1107
+ }
1108
+ const blob = await response.blob();
1109
+ return blob;
1110
+ }
1111
+ static async resizeImage(img, width, height, options) {
1112
+ if (width <= 0 || height <= 0 || isNaN(width) || isNaN(height)) {
1113
+ throw new Error("Invalid target size");
1114
+ }
1115
+ if (typeof img === "string") {
1116
+ img = await _Imaging.loadImage(img);
1117
+ }
1118
+ const el = await self.createImageBitmap(img);
1119
+ const origWidth = el.width, origHeight = el.height;
1120
+ const cnv = new OffscreenCanvas(origWidth, origHeight);
1121
+ const ctx = cnv.getContext("2d");
1122
+ ctx.imageSmoothingEnabled = ctx["mozImageSmoothingEnabled"] = ctx["oImageSmoothingEnabled"] = ctx["webkitImageSmoothingEnabled"] = true;
1123
+ const { quality, type, mode, align, valign, background } = Object.assign({}, DefaultImagingResizeOptions, options ?? {});
1124
+ const from = { width: origWidth, height: origHeight, x: 0, y: 0 }, to = { x: 0, y: 0, width, height };
1125
+ const transformMatrix = Rect.findTransform(from, to, mode, align, valign);
1126
+ cnv.width = width;
1127
+ cnv.height = height;
1128
+ if (background) {
1129
+ ctx.fillStyle = background;
1130
+ ctx.fillRect(0, 0, cnv.width, cnv.height);
1131
+ }
1132
+ ctx.setTransform(transformMatrix);
1133
+ ctx.drawImage(el, 0, 0);
1134
+ const retval = await cnv.convertToBlob({ quality, type });
1135
+ return retval;
1136
+ }
1137
+ };
1138
+
1139
+ // packages/foundation/dist/esm/keygenerator.js
1140
+ var Keys = class _Keys {
1141
+ static #seed;
1142
+ static uniqueId() {
1143
+ let seed = _Keys.#seed || Date.now();
1144
+ return _Keys.#seed = ++seed;
1145
+ }
1146
+ static uniqueCode() {
1147
+ const newid = _Keys.uniqueId();
1148
+ return newid.toBase62();
1149
+ }
1150
+ static randomString(length) {
1151
+ let retval = "";
1152
+ do {
1153
+ retval += (Math.random() * 62).toBase62();
1154
+ } while (retval.length < length);
1155
+ return retval;
1156
+ }
1157
+ };
1158
+
1159
+ // packages/foundation/dist/esm/numbers.js
1160
+ var Numbers = class {
1161
+ static round(x, step = 1) {
1162
+ return Math.round(x / step) * step;
1163
+ }
1164
+ static log(x, base) {
1165
+ return Math.log10(x) / Math.log10(base);
1166
+ }
1167
+ static rebase(v, from, to) {
1168
+ const vStr = v.toString();
1169
+ const firstPass = parseInt(vStr, from);
1170
+ if (!vStr.endsWith(firstPass.toString(from))) {
1171
+ return Number.NaN.toString();
1172
+ }
1173
+ return parseInt(v.toString(), from).toString(to);
1174
+ }
1175
+ };
1176
+
1177
+ // packages/foundation/dist/esm/strings.js
1178
+ function lcs(aTokens, bTokens) {
1179
+ const m = aTokens.length;
1180
+ const n = bTokens.length;
1181
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
1182
+ for (let i = 1; i <= m; i++) {
1183
+ for (let j = 1; j <= n; j++) {
1184
+ if (aTokens[i - 1] === bTokens[j - 1]) {
1185
+ dp[i][j] = dp[i - 1][j - 1] + 1;
1186
+ } else {
1187
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
1188
+ }
1189
+ }
1190
+ }
1191
+ return dp;
1192
+ }
1193
+ function diffInternal(aTokens, bTokens, dp, joiner = "") {
1194
+ const m = aTokens.length;
1195
+ const n = bTokens.length;
1196
+ const result = [];
1197
+ let i = m, j = n;
1198
+ let currentToken = null;
1199
+ const finalizeToken = () => {
1200
+ if (currentToken) {
1201
+ result.push(currentToken);
1202
+ currentToken = null;
1203
+ }
1204
+ };
1205
+ while (i > 0 || j > 0) {
1206
+ var currentType = null;
1207
+ let currentValue = null;
1208
+ if (i > 0 && j > 0 && aTokens[i - 1] === bTokens[j - 1]) {
1209
+ currentType = "=";
1210
+ currentValue = aTokens[i - 1];
1211
+ i--;
1212
+ j--;
1213
+ } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
1214
+ currentType = "+";
1215
+ currentValue = bTokens[j - 1];
1216
+ j--;
1217
+ } else if (i > 0 && (j === 0 || dp[i - 1][j] > dp[i][j - 1])) {
1218
+ currentType = "-";
1219
+ currentValue = aTokens[i - 1];
1220
+ i--;
1221
+ }
1222
+ if (currentType && currentValue !== null) {
1223
+ if (currentToken && currentToken.type === currentType) {
1224
+ currentToken.value = currentValue + (currentToken.value ? joiner : "") + currentToken.value;
1225
+ } else {
1226
+ finalizeToken();
1227
+ currentToken = { type: currentType, value: currentValue };
1228
+ }
1229
+ } else {
1230
+ finalizeToken();
1231
+ }
1232
+ }
1233
+ finalizeToken();
1234
+ return result.reverse();
1235
+ }
1236
+ function diffChars(a, b) {
1237
+ const aTokens = a.split("");
1238
+ const bTokens = b.split("");
1239
+ const dp = lcs(aTokens, bTokens);
1240
+ return diffInternal(aTokens, bTokens, dp, "");
1241
+ }
1242
+ function diffWords(a, b) {
1243
+ const wordRegex = /(\S+|\s+)/g;
1244
+ const aTokens = a.match(wordRegex) || [];
1245
+ const bTokens = b.match(wordRegex) || [];
1246
+ const dp = lcs(aTokens, bTokens);
1247
+ return diffInternal(aTokens, bTokens, dp, "");
1248
+ }
1249
+ function diffLines(a, b) {
1250
+ const lineRegex = /\r?\n/;
1251
+ const aTokens = a.split(lineRegex);
1252
+ const bTokens = b.split(lineRegex);
1253
+ const dp = lcs(aTokens, bTokens);
1254
+ return diffInternal(aTokens, bTokens, dp, "\n");
1255
+ }
1256
+ var Strings = class {
1257
+ /** @deprecated Use String.prototype.padStart() instead. */
1258
+ static leftPad(v, targetLength, padChar) {
1259
+ let retval = v.toString();
1260
+ return retval.padStart(targetLength, padChar);
1261
+ }
1262
+ static format(template, ...args) {
1263
+ const array = Array.from(args);
1264
+ let retval = template;
1265
+ for (let j = 0; j < array.length; j++) {
1266
+ const regex = new RegExp("(^|[^\\{])\\{" + j + "\\}($|[^\\}])", "g");
1267
+ retval = retval.replaceAll(regex, (match2, ...args0) => {
1268
+ return match2.replace("{" + j + "}", array[j]);
1269
+ });
1270
+ }
1271
+ const check = /(^|[^\{}])\{(\d+)\}($|[^\}])/.exec(retval);
1272
+ if (!NullChecker.isNullOrEmpty(check)) {
1273
+ throw new Error(`Missing argument at index ${check[2]}.`);
1274
+ }
1275
+ return retval;
1276
+ }
1277
+ static diff(a, b, mode = "char") {
1278
+ switch (mode) {
1279
+ case "line":
1280
+ return diffLines(a, b);
1281
+ case "word":
1282
+ return diffWords(a, b);
1283
+ default:
1284
+ return diffChars(a, b);
1285
+ }
1286
+ }
1287
+ static async hash(input, algo = "SHA-256") {
1288
+ const hashBuffer = await crypto.subtle.digest(algo, new TextEncoder().encode(input));
1289
+ return Array.from(new Uint8Array(hashBuffer)).map((byte) => byte.toString(16).padStart(2, "0")).join("");
1290
+ }
1291
+ };
1292
+
1293
+ // packages/foundation/dist/esm/index-compile.js
1294
+ var index_compile_exports = {};
1295
+ __export(index_compile_exports, {
1296
+ Markdown: () => index_compile_markdown_exports,
1297
+ Parser: () => Parser
1298
+ });
1299
+
1300
+ // packages/foundation/dist/esm/index-compile-markdown.js
1301
+ var index_compile_markdown_exports = {};
1302
+ __export(index_compile_markdown_exports, {
1303
+ Parser: () => Parser2
1304
+ });
1305
+
1306
+ // packages/foundation/dist/esm/compile/parser.js
1307
+ var LexerClass = class {
1308
+ tokenize(input, grammar) {
1309
+ const tokens = [];
1310
+ while (input) {
1311
+ const start = input.length;
1312
+ for (let rule of grammar) {
1313
+ const newTokens = rule.exec(
1314
+ input,
1315
+ /* arguments that ease recursion when needed */
1316
+ this
1317
+ ), length = newTokens?.length;
1318
+ if (length > 0) {
1319
+ Array.prototype.push.apply(tokens, newTokens);
1320
+ const last = newTokens[length - 1];
1321
+ input = input.substr((last.index || 0) + last.raw.length);
1322
+ break;
1323
+ }
1324
+ }
1325
+ if (input.length >= start) {
1326
+ throw new Error(`Cannot parse
1327
+ "${input}"
1328
+ using the provided grammar.`);
1329
+ }
1330
+ }
1331
+ return tokens;
1332
+ }
1333
+ };
1334
+ var Parser = class {
1335
+ constructor(_lexer = new LexerClass()) {
1336
+ this._lexer = _lexer;
1337
+ }
1338
+ parse(input, grammar, renderer) {
1339
+ const tokens = this._lexer.tokenize(input, grammar);
1340
+ return renderer.render(tokens);
1341
+ }
1342
+ };
1343
+
1344
+ // packages/foundation/dist/esm/compile/markdown/parser.js
1345
+ function htmlEncode(input) {
1346
+ return (input ?? "").replace(/</g, "&lt;");
1347
+ }
1348
+ function extractReference(input) {
1349
+ if (NullChecker.isNullOrEmpty(input)) {
1350
+ return void 0;
1351
+ }
1352
+ if (/^\(/.test(input) && /\)$/.test(input)) {
1353
+ return void 0;
1354
+ }
1355
+ if (/^\[/.test(input) && /\]$/.test(input)) {
1356
+ input = input.substr(1, input.length - 2);
1357
+ }
1358
+ return input;
1359
+ }
1360
+ function regexMatchIndex(arr) {
1361
+ return arr?.index || void 0;
1362
+ }
1363
+ function extractUrl(input) {
1364
+ if (NullChecker.isNullOrEmpty(input)) {
1365
+ return void 0;
1366
+ }
1367
+ if (/^\[/.test(input) && /\]$/.test(input)) {
1368
+ return void 0;
1369
+ }
1370
+ if (/^\(/.test(input) && /\)$/.test(input)) {
1371
+ input = input.substr(1, input.length - 2);
1372
+ }
1373
+ return input;
1374
+ }
1375
+ function normalizeReference(input) {
1376
+ return input?.replace(/[^\w]+/g, " ").trim().replace(/ +/g, "-").toLowerCase();
1377
+ }
1378
+ function match(input, pattern, fn) {
1379
+ const arr = pattern.exec(input);
1380
+ if (arr && arr.length) {
1381
+ return fn(arr);
1382
+ }
1383
+ return null;
1384
+ }
1385
+ var COMMENT = /(<!--)([\s\S]*?)(-->|$)/;
1386
+ var HR = /^ {0,3}(={3,}|_{3,}|-{3,})(\r?\n|$)/;
1387
+ var HEADING = /^ {0,3}(#{1,6})\s+([^\n]+)(\r?\n|$)+/;
1388
+ var HEADING1 = /^ {0,3}([^\n]+)(\r?\n=+(\r?\n|$))+/;
1389
+ var HEADING2 = /^ {0,3}([^\n]+)(\r?\n-+(\r?\n|$))+/;
1390
+ var CODEBLOCK = /^ {4,}.+(\r?\n {4,}.+)*(\r?\n|$)+/;
1391
+ var FENCES = /^ {0,3}``` *([^\n]*)\r?\n(([\s\S](?!\r?\n {0,3}```))*.(\r?\n)+) {0,3}```(\r?\n|$)+/;
1392
+ var BLOCKQUOTE = /^ {0,3}> *([^\n]+)(\r?\n {0,3}> *([^\n]*))*(\r?\n|$)+/;
1393
+ var ULIST = /^( {0,3}([-+]).*\r?\n|$)((?!(?: {0,3}(?:\d+[.\)]|\r?\n\S))).*(\r?\n|$))*/;
1394
+ var OLIST = /^( {0,3}(\d+[.\)]).*\r?\n|$)((?!(?: {0,3}(?:[+-]|\r?\n\S))).*(\r?\n|$))*/;
1395
+ var LISTITEM = /^(?:[-+*]|\d+[.\)])/m;
1396
+ var PARAGRAPH = /^(?! {4,})(.+(\n(?! {0,3}```)(?! {0,3}([-+]|\d+[.\)]))(?! {4,})(?! {0,3}>).+)*)/;
1397
+ var REF = /^ {0,3}(!?)\[([^\]]+)\]: +(\S+)(?: +['"\(](.+)['"\)])?(\r?\n|$)+/;
1398
+ var IMAGE_OR_LINK = /!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?(\[[^\[\]]*\]|\([^\(\)]*\))?/;
1399
+ var EMPHASIZED_LINK = /(\*\*?|__?)(\[[^\]]*]\([^\)]+\))\1/;
1400
+ var CODE = /(?:(?<!\\)`)(.+?)(?:(?<!\\)`)/;
1401
+ var EMPHASIZE = /(\*\*?|__?)((?!\1\s?)(?:(?!\1)[\S\s])*[^\s])\1/;
1402
+ var STRIKE = /(~~?|__?)(?!\1\s?)([^\s][\s\S]*?(?!\1)[^\s])\1/;
1403
+ var QUOTE = /(:")(?!":\s?)([^\s][\s\S]*?(?!":)[^\s])":/;
1404
+ var SPACE = /^\s+/;
1405
+ var LINEBREAK = / {2,}\r?\n/;
1406
+ var TEXT = /^[^\r\n]+/;
1407
+ var MARKDOWN_TYPES;
1408
+ (function(MARKDOWN_TYPES2) {
1409
+ MARKDOWN_TYPES2["Html"] = "html";
1410
+ MARKDOWN_TYPES2["Text"] = "text";
1411
+ MARKDOWN_TYPES2["Paragraph"] = "paragraph";
1412
+ MARKDOWN_TYPES2["BlockQuote"] = "blockquote";
1413
+ MARKDOWN_TYPES2["Space"] = "space";
1414
+ MARKDOWN_TYPES2["Heading"] = "heading";
1415
+ MARKDOWN_TYPES2["Bold"] = "bold";
1416
+ MARKDOWN_TYPES2["Italic"] = "italic";
1417
+ MARKDOWN_TYPES2["CodeBlock"] = "codeblock";
1418
+ MARKDOWN_TYPES2["Code"] = "code";
1419
+ MARKDOWN_TYPES2["Image"] = "img";
1420
+ MARKDOWN_TYPES2["ImageLike"] = "imglike";
1421
+ MARKDOWN_TYPES2["Link"] = "link";
1422
+ MARKDOWN_TYPES2["LinkLike"] = "linklike";
1423
+ MARKDOWN_TYPES2["LineBreak"] = "br";
1424
+ MARKDOWN_TYPES2["StrikeThrough"] = "strike";
1425
+ MARKDOWN_TYPES2["Quote"] = "quote";
1426
+ MARKDOWN_TYPES2["HorizontalRule"] = "hr";
1427
+ MARKDOWN_TYPES2["OrderedList"] = "ol";
1428
+ MARKDOWN_TYPES2["UnorderedList"] = "ul";
1429
+ MARKDOWN_TYPES2["ListItem"] = "listitem";
1430
+ MARKDOWN_TYPES2["Reference"] = "ref";
1431
+ })(MARKDOWN_TYPES || (MARKDOWN_TYPES = {}));
1432
+ var MARKDOWN_RULES;
1433
+ (function(MARKDOWN_RULES2) {
1434
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Comment"] = 0] = "Comment";
1435
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Reference"] = 1] = "Reference";
1436
+ MARKDOWN_RULES2[MARKDOWN_RULES2["HorizontalRule"] = 2] = "HorizontalRule";
1437
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Heading"] = 3] = "Heading";
1438
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Heading1"] = 4] = "Heading1";
1439
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Heading2"] = 5] = "Heading2";
1440
+ MARKDOWN_RULES2[MARKDOWN_RULES2["CodeBlock"] = 6] = "CodeBlock";
1441
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Fences"] = 7] = "Fences";
1442
+ MARKDOWN_RULES2[MARKDOWN_RULES2["BlockQuote"] = 8] = "BlockQuote";
1443
+ MARKDOWN_RULES2[MARKDOWN_RULES2["OrderedList"] = 9] = "OrderedList";
1444
+ MARKDOWN_RULES2[MARKDOWN_RULES2["UnorderedList"] = 10] = "UnorderedList";
1445
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Paragraph"] = 11] = "Paragraph";
1446
+ MARKDOWN_RULES2[MARKDOWN_RULES2["EmphasizedLink"] = 12] = "EmphasizedLink";
1447
+ MARKDOWN_RULES2[MARKDOWN_RULES2["ImageOrLink"] = 13] = "ImageOrLink";
1448
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Emphasize"] = 14] = "Emphasize";
1449
+ MARKDOWN_RULES2[MARKDOWN_RULES2["StrikeThrough"] = 15] = "StrikeThrough";
1450
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Quote"] = 16] = "Quote";
1451
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Code"] = 17] = "Code";
1452
+ MARKDOWN_RULES2[MARKDOWN_RULES2["LineBreak"] = 18] = "LineBreak";
1453
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Text"] = 254] = "Text";
1454
+ MARKDOWN_RULES2[MARKDOWN_RULES2["Space"] = 255] = "Space";
1455
+ })(MARKDOWN_RULES || (MARKDOWN_RULES = {}));
1456
+ function getGrammar(extra = []) {
1457
+ const inert = {
1458
+ // comment
1459
+ [MARKDOWN_RULES.Comment]: {
1460
+ exec: (input, lexer) => match(input, COMMENT, (arr) => {
1461
+ const index = regexMatchIndex(arr);
1462
+ const output = [{
1463
+ type: MARKDOWN_TYPES.Html,
1464
+ index,
1465
+ raw: arr[0],
1466
+ text: arr[2]
1467
+ }];
1468
+ if (index > 0) {
1469
+ const left = input.substr(0, index), tokens = lexer.tokenize(left, blockRules);
1470
+ Array.prototype.unshift.apply(output, tokens);
1471
+ }
1472
+ return output;
1473
+ })
1474
+ },
1475
+ // reference
1476
+ [MARKDOWN_RULES.Reference]: {
1477
+ exec: (input) => match(input, REF, (arr) => {
1478
+ const index = regexMatchIndex(arr), raw = arr[0], text = raw, image = arr[1] === "!", id = arr[2], url = arr[3], title = arr[4];
1479
+ return [{
1480
+ type: MARKDOWN_TYPES.Reference,
1481
+ index,
1482
+ raw,
1483
+ text,
1484
+ id,
1485
+ image,
1486
+ url,
1487
+ title
1488
+ }];
1489
+ })
1490
+ }
1491
+ };
1492
+ const blockExtra = [], inlineExtra = [], codeExtra = {};
1493
+ for (let r of extra) {
1494
+ let rule, type = "inline";
1495
+ if ("type" in r) {
1496
+ type = r.type;
1497
+ rule = r.rule;
1498
+ } else {
1499
+ rule = r;
1500
+ }
1501
+ switch (type) {
1502
+ case "block":
1503
+ blockExtra.push(rule);
1504
+ break;
1505
+ case "code":
1506
+ if ("lang" in r) {
1507
+ const key = r.lang.toLowerCase();
1508
+ (codeExtra[key] = codeExtra[key] || []).push(rule);
1509
+ }
1510
+ break;
1511
+ default:
1512
+ const inlineRule = {
1513
+ exec: (input, lexer) => {
1514
+ const output = rule.exec(input, lexer);
1515
+ inPlaceInlineExec(input, output, lexer);
1516
+ return output;
1517
+ }
1518
+ };
1519
+ inlineExtra.push(inlineRule);
1520
+ break;
1521
+ }
1522
+ }
1523
+ const inlinelowpriority = {
1524
+ // text
1525
+ [MARKDOWN_RULES.Text]: {
1526
+ exec: (input) => match(input, TEXT, (arr) => {
1527
+ const raw = arr[0], text = raw;
1528
+ return [{
1529
+ index: regexMatchIndex(arr),
1530
+ raw,
1531
+ text,
1532
+ type: MARKDOWN_TYPES.Text
1533
+ }];
1534
+ })
1535
+ },
1536
+ // sparse lines
1537
+ [MARKDOWN_RULES.Space]: {
1538
+ exec: (input) => match(input, SPACE, (arr) => {
1539
+ const raw = arr[0];
1540
+ return [{
1541
+ type: MARKDOWN_TYPES.Space,
1542
+ raw,
1543
+ text: raw
1544
+ }];
1545
+ })
1546
+ }
1547
+ };
1548
+ const inline = {
1549
+ // link/image
1550
+ [MARKDOWN_RULES.ImageOrLink]: {
1551
+ exec: (input, lexer) => inlineMatch(input, IMAGE_OR_LINK, lexer, (arr) => {
1552
+ const index = regexMatchIndex(arr), raw = arr[0], image = raw.charAt(0) === "!", text = arr[1], url = extractUrl(arr[2]), ref = normalizeReference(extractReference(arr[2]) ?? text);
1553
+ if (image) {
1554
+ return [{
1555
+ index,
1556
+ type: url ? MARKDOWN_TYPES.Image : MARKDOWN_TYPES.ImageLike,
1557
+ raw,
1558
+ text,
1559
+ src: url,
1560
+ ref,
1561
+ tokens: lexer.tokenize(text, inlineRules)
1562
+ }];
1563
+ } else {
1564
+ return [{
1565
+ index,
1566
+ type: url ? MARKDOWN_TYPES.Link : MARKDOWN_TYPES.LinkLike,
1567
+ raw,
1568
+ text,
1569
+ href: url,
1570
+ ref,
1571
+ tokens: lexer.tokenize(text, inlineRules)
1572
+ }];
1573
+ }
1574
+ })
1575
+ },
1576
+ // code
1577
+ [MARKDOWN_RULES.Code]: {
1578
+ exec: (input, lexer) => inlineMatch(input, CODE, lexer, (arr) => {
1579
+ const text = htmlEncode(arr[1]);
1580
+ return [{
1581
+ type: MARKDOWN_TYPES.Code,
1582
+ raw: arr[0],
1583
+ text,
1584
+ index: regexMatchIndex(arr)
1585
+ }];
1586
+ })
1587
+ },
1588
+ // italic/bold link
1589
+ [MARKDOWN_RULES.EmphasizedLink]: {
1590
+ exec: (input, lexer) => inlineMatch(input, EMPHASIZED_LINK, lexer, (arr) => {
1591
+ if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {
1592
+ return null;
1593
+ }
1594
+ const type = arr[1].length > 1 ? MARKDOWN_TYPES.Bold : MARKDOWN_TYPES.Italic, text = arr[2];
1595
+ return [{
1596
+ index: regexMatchIndex(arr),
1597
+ type,
1598
+ raw: arr[0],
1599
+ text,
1600
+ tokens: lexer.tokenize(text, inlineRules)
1601
+ }];
1602
+ })
1603
+ },
1604
+ // italic/bold
1605
+ [MARKDOWN_RULES.Emphasize]: {
1606
+ exec: (input, lexer) => inlineMatch(input, EMPHASIZE, lexer, (arr) => {
1607
+ if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {
1608
+ return null;
1609
+ }
1610
+ const type = arr[1].length > 1 ? MARKDOWN_TYPES.Bold : MARKDOWN_TYPES.Italic, text = arr[2];
1611
+ return [{
1612
+ index: regexMatchIndex(arr),
1613
+ type,
1614
+ raw: arr[0],
1615
+ text,
1616
+ tokens: lexer.tokenize(text, inlineRules)
1617
+ }];
1618
+ })
1619
+ },
1620
+ // strike
1621
+ [MARKDOWN_RULES.StrikeThrough]: {
1622
+ exec: (input, lexer) => inlineMatch(input, STRIKE, lexer, (arr) => {
1623
+ if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {
1624
+ return null;
1625
+ }
1626
+ const type = MARKDOWN_TYPES.StrikeThrough, text = arr[2];
1627
+ return [{
1628
+ index: regexMatchIndex(arr),
1629
+ type,
1630
+ raw: arr[0],
1631
+ text,
1632
+ tokens: lexer.tokenize(text, inlineRules)
1633
+ }];
1634
+ })
1635
+ },
1636
+ // quote
1637
+ [MARKDOWN_RULES.Quote]: {
1638
+ exec: (input, lexer) => inlineMatch(input, QUOTE, lexer, (arr) => {
1639
+ if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {
1640
+ return null;
1641
+ }
1642
+ const type = MARKDOWN_TYPES.Quote, text = arr[2];
1643
+ return [{
1644
+ index: regexMatchIndex(arr),
1645
+ type,
1646
+ raw: arr[0],
1647
+ text,
1648
+ tokens: lexer.tokenize(text, inlineRules)
1649
+ }];
1650
+ })
1651
+ },
1652
+ // line break
1653
+ [MARKDOWN_RULES.LineBreak]: {
1654
+ exec: (input, lexer) => inlineMatch(input, LINEBREAK, lexer, (arr) => {
1655
+ const raw = arr[0], text = raw;
1656
+ return [{
1657
+ index: regexMatchIndex(arr),
1658
+ raw,
1659
+ text,
1660
+ type: MARKDOWN_TYPES.LineBreak
1661
+ }];
1662
+ })
1663
+ }
1664
+ };
1665
+ const inPlaceInlineExec = (input, output, lexer) => {
1666
+ const index = output?.length > 0 && output[0].index;
1667
+ if (index > 0) {
1668
+ const left = input.substr(0, index);
1669
+ const tokens = lexer.tokenize(left, inlineRules) || [];
1670
+ Array.prototype.unshift.apply(output, tokens);
1671
+ }
1672
+ };
1673
+ const inlineMatch = (input, pattern, lexer, fn) => {
1674
+ const output = match(input, pattern, (arr) => {
1675
+ if (pattern != CODE) {
1676
+ const codeCheck = CODE.exec(input);
1677
+ if (codeCheck && codeCheck.length && codeCheck.index < arr.index) {
1678
+ return null;
1679
+ }
1680
+ }
1681
+ return fn(arr);
1682
+ });
1683
+ inPlaceInlineExec(input, output, lexer);
1684
+ return output;
1685
+ };
1686
+ const inlineRules = Object.values(inline);
1687
+ Array.prototype.push.apply(inlineRules, inlineExtra);
1688
+ inlineRules.push(inlinelowpriority[MARKDOWN_RULES.Text], inlinelowpriority[MARKDOWN_RULES.Space]);
1689
+ const getLangGrammar = (lang) => {
1690
+ const retval = [inlinelowpriority[MARKDOWN_RULES.Text], inlinelowpriority[MARKDOWN_RULES.Space]];
1691
+ const key = lang?.toLowerCase() || "";
1692
+ if (key && key in codeExtra) {
1693
+ Array.prototype.unshift.apply(retval, codeExtra[key]);
1694
+ }
1695
+ return retval;
1696
+ };
1697
+ const lowpriority = {
1698
+ // paragraph
1699
+ [MARKDOWN_RULES.Paragraph]: {
1700
+ exec: (input, lexer) => match(input, PARAGRAPH, (arr) => {
1701
+ const raw = arr[0], text = raw;
1702
+ return [{
1703
+ type: MARKDOWN_TYPES.Paragraph,
1704
+ raw,
1705
+ text,
1706
+ // recursion (inline rules only)
1707
+ tokens: lexer.tokenize(text, inlineRules)
1708
+ }];
1709
+ })
1710
+ },
1711
+ // sparse lines
1712
+ [MARKDOWN_RULES.Space]: inlinelowpriority[MARKDOWN_RULES.Space]
1713
+ };
1714
+ const tokenizeListItem = (text, lexer) => {
1715
+ const grammar = !/^ {0,3}(`{3,}|$|>|[+-]\s|\d+[.\)])/m.test(text) ? inlineRules : blockRules;
1716
+ return lexer.tokenize(text, grammar);
1717
+ };
1718
+ const block = {
1719
+ // hr
1720
+ [MARKDOWN_RULES.HorizontalRule]: {
1721
+ exec: (input, lexer) => match(input, HR, (arr) => {
1722
+ const raw = arr[0], text = raw;
1723
+ return [{
1724
+ type: MARKDOWN_TYPES.HorizontalRule,
1725
+ raw,
1726
+ text
1727
+ }];
1728
+ })
1729
+ },
1730
+ // headings
1731
+ [MARKDOWN_RULES.Heading]: {
1732
+ exec: (input, lexer) => match(input, HEADING, (arr) => {
1733
+ const text = arr[2];
1734
+ return [{
1735
+ type: MARKDOWN_TYPES.Heading,
1736
+ raw: arr[0],
1737
+ text,
1738
+ level: arr[1].length,
1739
+ ref: normalizeReference(text),
1740
+ tokens: lexer.tokenize(text, inlineRules)
1741
+ }];
1742
+ })
1743
+ },
1744
+ [MARKDOWN_RULES.Heading1]: {
1745
+ exec: (input, lexer) => match(input, HEADING1, (arr) => {
1746
+ const text = arr[1];
1747
+ return [{
1748
+ type: MARKDOWN_TYPES.Heading,
1749
+ raw: arr[0],
1750
+ text,
1751
+ level: 1,
1752
+ ref: normalizeReference(text),
1753
+ tokens: lexer.tokenize(text, inlineRules)
1754
+ }];
1755
+ })
1756
+ },
1757
+ [MARKDOWN_RULES.Heading2]: {
1758
+ exec: (input, lexer) => match(input, HEADING2, (arr) => {
1759
+ const text = arr[1];
1760
+ return [{
1761
+ type: MARKDOWN_TYPES.Heading,
1762
+ raw: arr[0],
1763
+ text,
1764
+ level: 2,
1765
+ ref: normalizeReference(text),
1766
+ tokens: lexer.tokenize(text, inlineRules)
1767
+ }];
1768
+ })
1769
+ },
1770
+ // codeblock
1771
+ [MARKDOWN_RULES.CodeBlock]: {
1772
+ exec: (input, lexer) => match(input, CODEBLOCK, (arr) => {
1773
+ const raw = arr[0], text = htmlEncode(raw);
1774
+ return [{
1775
+ type: MARKDOWN_TYPES.CodeBlock,
1776
+ raw,
1777
+ text,
1778
+ tokens: lexer.tokenize(text, [])
1779
+ }];
1780
+ })
1781
+ },
1782
+ // codeblock
1783
+ [MARKDOWN_RULES.Fences]: {
1784
+ exec: (input, lexer) => match(input, FENCES, (arr) => {
1785
+ const text = htmlEncode(arr[2]), lang = arr[1]?.toLowerCase();
1786
+ return [{
1787
+ type: MARKDOWN_TYPES.CodeBlock,
1788
+ raw: arr[0],
1789
+ text,
1790
+ lang,
1791
+ tokens: lexer.tokenize(text, getLangGrammar(lang))
1792
+ }];
1793
+ })
1794
+ },
1795
+ // blockquote
1796
+ [MARKDOWN_RULES.BlockQuote]: {
1797
+ exec: (input, lexer) => match(input, BLOCKQUOTE, (arr) => {
1798
+ const raw = arr[0], text = raw.replace(/^ {0,3}> */gm, "");
1799
+ return [{
1800
+ type: MARKDOWN_TYPES.BlockQuote,
1801
+ raw,
1802
+ text,
1803
+ // recursion
1804
+ tokens: lexer.tokenize(text, [
1805
+ lowpriority[MARKDOWN_RULES.Paragraph],
1806
+ lowpriority[MARKDOWN_RULES.Space]
1807
+ ])
1808
+ }];
1809
+ })
1810
+ },
1811
+ // lists
1812
+ [MARKDOWN_RULES.OrderedList]: {
1813
+ exec: (input, lexer) => match(input, OLIST, (arr) => {
1814
+ const raw = arr[0], items = raw.replace(/^ {0,3}/gm, "").split(LISTITEM).filter((i) => !NullChecker.isNullOrEmpty(i)).map((i) => i.trim());
1815
+ return [{
1816
+ type: MARKDOWN_TYPES.OrderedList,
1817
+ start: parseInt(/\d/.exec(arr[0])[0]),
1818
+ raw,
1819
+ text: raw,
1820
+ tokens: items.map((i) => {
1821
+ return {
1822
+ type: MARKDOWN_TYPES.ListItem,
1823
+ raw: i,
1824
+ text: i,
1825
+ tokens: tokenizeListItem(i, lexer)
1826
+ };
1827
+ })
1828
+ }];
1829
+ })
1830
+ },
1831
+ [MARKDOWN_RULES.UnorderedList]: {
1832
+ exec: (input, lexer) => match(input, ULIST, (arr) => {
1833
+ const raw = arr[0], items = raw.replace(/^ {0,3}/gm, "").split(LISTITEM).filter((i) => !NullChecker.isNullOrEmpty(i)).map((i) => i.trim());
1834
+ return [{
1835
+ type: MARKDOWN_TYPES.UnorderedList,
1836
+ raw,
1837
+ text: raw,
1838
+ tokens: items.map((i) => {
1839
+ return {
1840
+ type: MARKDOWN_TYPES.ListItem,
1841
+ raw: i,
1842
+ text: i,
1843
+ tokens: tokenizeListItem(i, lexer)
1844
+ };
1845
+ })
1846
+ }];
1847
+ })
1848
+ }
1849
+ };
1850
+ const blockRules = Object.values(block);
1851
+ Array.prototype.push.apply(blockRules, blockExtra);
1852
+ blockRules.push(lowpriority[MARKDOWN_RULES.Paragraph], lowpriority[MARKDOWN_RULES.Space]);
1853
+ return [
1854
+ // comment first
1855
+ inert[MARKDOWN_RULES.Comment],
1856
+ inert[MARKDOWN_RULES.Reference]
1857
+ ].concat(
1858
+ // block rules contain recursive inline rules (at least)
1859
+ blockRules
1860
+ );
1861
+ }
1862
+ var CARRIAGE_RETURN_PLACEHOLDER = "\0";
1863
+ var TRIM_INSIDE = /[ \r\n]*\0+[ \r\n]*/g;
1864
+ function trim(input) {
1865
+ return input?.replace(TRIM_INSIDE, "\n").trim();
1866
+ }
1867
+ var HtmlRenderer = class {
1868
+ constructor(_extraItemRender = (token, __) => token?.text || "") {
1869
+ this._extraItemRender = _extraItemRender;
1870
+ this._renderContent = (token) => {
1871
+ const children = token.tokens;
1872
+ if (NullChecker.isNullOrEmpty(children)) {
1873
+ return token.text;
1874
+ }
1875
+ return this._render(children);
1876
+ };
1877
+ }
1878
+ _rendeItem(token, allTokens) {
1879
+ const r = this._renderContent, R = CARRIAGE_RETURN_PLACEHOLDER;
1880
+ switch (token?.type) {
1881
+ case MARKDOWN_TYPES.Reference:
1882
+ return "";
1883
+ case MARKDOWN_TYPES.Html:
1884
+ return token.raw;
1885
+ case MARKDOWN_TYPES.BlockQuote:
1886
+ return `<blockquote>
1887
+ ${r(token)}</blockquote>${R}`;
1888
+ case MARKDOWN_TYPES.Bold:
1889
+ return `<b>${r(token)}</b>`;
1890
+ case MARKDOWN_TYPES.CodeBlock:
1891
+ const lang = token["lang"];
1892
+ return `<pre>${R}<code${lang ? ' class="' + lang + '"' : ""}>${r(token)}</code>${R}</pre>${R}`;
1893
+ case MARKDOWN_TYPES.Code:
1894
+ return `<code>${r(token)}</code>`;
1895
+ case MARKDOWN_TYPES.HorizontalRule:
1896
+ return `<hr />${R}`;
1897
+ case MARKDOWN_TYPES.Heading:
1898
+ const hlevel = token["level"], hid = token["ref"];
1899
+ return `<h${hlevel} id="${hid}">${r(token)}</h${hlevel}>${R}`;
1900
+ case MARKDOWN_TYPES.Image:
1901
+ case MARKDOWN_TYPES.ImageLike:
1902
+ const itk = token;
1903
+ let isrc = itk.src, ititle = "";
1904
+ const alt = itk.text, iref = itk.ref;
1905
+ if (!isrc && iref) {
1906
+ const ireftk = allTokens.find((t) => t.type === MARKDOWN_TYPES.Reference && t["image"] === true && t["id"]?.toLowerCase() === iref.toLowerCase());
1907
+ if (ireftk) {
1908
+ isrc = ireftk.url;
1909
+ ititle = ireftk.title ?? "";
1910
+ }
1911
+ }
1912
+ return isrc ? `<img src="${isrc}" alt="${alt}"${ititle ? ' title="' + ititle + '"' : ""} />` : `![${r(token)}]`;
1913
+ case MARKDOWN_TYPES.Italic:
1914
+ return `<i>${r(token)}</i>`;
1915
+ case MARKDOWN_TYPES.StrikeThrough:
1916
+ return `<s>${r(token)}</s>`;
1917
+ case MARKDOWN_TYPES.Quote:
1918
+ return `<q>${r(token)}</q>`;
1919
+ case MARKDOWN_TYPES.LineBreak:
1920
+ return "<br />" + R;
1921
+ case MARKDOWN_TYPES.OrderedList:
1922
+ return `<ol start="${token["start"]}">
1923
+ ${r(token)}</ol>${R}`;
1924
+ case MARKDOWN_TYPES.UnorderedList:
1925
+ return `<ul>
1926
+ ${r(token)}</ul>${R}`;
1927
+ case MARKDOWN_TYPES.ListItem:
1928
+ return ` <li>${r(token)}</li>${R}`;
1929
+ case MARKDOWN_TYPES.Link:
1930
+ case MARKDOWN_TYPES.LinkLike:
1931
+ const atk = token;
1932
+ let ahref = atk.href, atitle = "";
1933
+ const aref = atk.ref;
1934
+ if (!ahref && aref) {
1935
+ const areftk = allTokens.find((t) => t.type === MARKDOWN_TYPES.Reference && t["image"] !== true && t["id"]?.toLowerCase() === aref.toLowerCase());
1936
+ if (areftk) {
1937
+ ahref = areftk.url;
1938
+ atitle = areftk.title ?? "";
1939
+ }
1940
+ }
1941
+ return ahref ? `<a href="${ahref}"${atitle ? ' title="' + atitle + '"' : ""}>${r(token)}</a>` : `[${r(token)}]`;
1942
+ case MARKDOWN_TYPES.Paragraph:
1943
+ return `<p>${r(token)}</p>${R}`;
1944
+ case MARKDOWN_TYPES.Text:
1945
+ case MARKDOWN_TYPES.Space:
1946
+ return token.text;
1947
+ }
1948
+ return this._extraItemRender(token, allTokens);
1949
+ }
1950
+ _render(tree) {
1951
+ let acc = "";
1952
+ for (let token of tree || []) {
1953
+ acc += this._rendeItem(token, tree);
1954
+ }
1955
+ return acc;
1956
+ }
1957
+ render(tree) {
1958
+ return trim(this._render(tree));
1959
+ }
1960
+ };
1961
+ var TokenRenderer = class {
1962
+ _render(token) {
1963
+ return NullChecker.isNullOrEmpty(token) ? "" : JSON.stringify(token);
1964
+ }
1965
+ render(tree) {
1966
+ return "[" + tree.filter((i) => !NullChecker.isNullOrEmpty(i)).map(this._render).join(",") + "]";
1967
+ }
1968
+ };
1969
+ function isRenderer(obj) {
1970
+ return obj && typeof obj === "object" && typeof obj.render === "function";
1971
+ }
1972
+ var Parser2 = class extends Parser {
1973
+ toHtml(input, extraGrammar, extraItemRenderer) {
1974
+ const renderer = new HtmlRenderer(extraItemRenderer);
1975
+ if (NullChecker.isNullOrEmpty(extraGrammar)) {
1976
+ return this.parse(input, renderer);
1977
+ }
1978
+ return this.parse(input, getGrammar(extraGrammar), renderer);
1979
+ }
1980
+ tokenize(input, extraGrammar) {
1981
+ const json = this.parse(input, getGrammar(extraGrammar), new TokenRenderer());
1982
+ return JSON.parse(json);
1983
+ }
1984
+ parse(input, grammarOrRenderer = getGrammar(), renderer = new HtmlRenderer()) {
1985
+ if (isRenderer(grammarOrRenderer)) {
1986
+ return super.parse(input, getGrammar(), grammarOrRenderer);
1987
+ } else {
1988
+ return super.parse(input, grammarOrRenderer, renderer);
1989
+ }
1990
+ }
1991
+ };
1992
+ export {
1993
+ Angle,
1994
+ Arrays,
1995
+ Blobs,
1996
+ Colors,
1997
+ index_compile_exports as Compile,
1998
+ Dates,
1999
+ DeepMerger,
2000
+ HistoryService,
2001
+ Imaging,
2002
+ Keys,
2003
+ Matrix2D,
2004
+ NullChecker,
2005
+ Numbers,
2006
+ Point,
2007
+ Rect,
2008
+ Size,
2009
+ Strings,
2010
+ detect,
2011
+ parseAsNumericalArray
2012
+ };
2013
+ //# sourceMappingURL=pacem-foundation.mjs.map