@pacem/pacem-2d 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,2600 @@
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/2d/dist/esm/index-components.js
8
+ var index_components_exports = {};
9
+ __export(index_components_exports, {
10
+ Drawing: () => index_components_drawing_exports
11
+ });
12
+
13
+ // packages/2d/dist/esm/index-components-drawing.js
14
+ var index_components_drawing_exports = {};
15
+ __export(index_components_drawing_exports, {
16
+ AdapterUtils: () => AdapterUtils,
17
+ CornerType: () => CornerType,
18
+ DrawableElement: () => DrawableElement,
19
+ Pacem2DElement: () => Pacem2DElement,
20
+ PacemCanvasAdapterElement: () => PacemCanvasAdapterElement,
21
+ PacemCircleElement: () => PacemCircleElement,
22
+ PacemEllipseElement: () => PacemEllipseElement,
23
+ PacemGroupElement: () => PacemGroupElement,
24
+ PacemImageElement: () => PacemImageElement,
25
+ PacemLineElement: () => PacemLineElement,
26
+ PacemPathElement: () => PacemPathElement,
27
+ PacemPolygonElement: () => PacemPolygonElement,
28
+ PacemPolylineElement: () => PacemPolylineElement,
29
+ PacemRectElement: () => PacemRectElement,
30
+ PacemSvgAdapterElement: () => PacemSvgAdapterElement,
31
+ PacemTextElement: () => PacemTextElement,
32
+ PresentationElement: () => PresentationElement,
33
+ ShapeElement: () => ShapeElement,
34
+ UiElement: () => UiElement,
35
+ getStageOptions: () => getStageOptions
36
+ });
37
+
38
+ // packages/2d/dist/esm/drawable-element.js
39
+ import { Components as Components2, CustomElementUtils, PropertyConverters as PropertyConverters2, Watch as Watch2 } from "@pacem/pacem-core";
40
+
41
+ // packages/2d/dist/esm/stage.js
42
+ import { CustomElement, Watch, ViewChild, Debounce, PCSS, P, Utils as Utils2, PropertyConverters, PropertyChangeEvent, CustomEventUtils, avoidHandler, EventKeyModifier, Components } from "@pacem/pacem-core";
43
+ import { Rect, Matrix2D as Matrix2D2 } from "@pacem/pacem-foundation";
44
+
45
+ // packages/2d/dist/esm/constants.js
46
+ var TAG_MIDDLE_NAME = "2d";
47
+ var TWO_PI = 2 * Math.PI;
48
+
49
+ // packages/2d/dist/esm/drawing.js
50
+ var drawing_exports = {};
51
+ __export(drawing_exports, {
52
+ DragEvent: () => DragEvent,
53
+ DrawableEvent: () => DrawableEvent,
54
+ PresentationState: () => PresentationState,
55
+ Shape: () => Shape,
56
+ StageEvent: () => StageEvent,
57
+ UI2DEvent: () => UI2DEvent,
58
+ isDrawable: () => isDrawable,
59
+ isGroup: () => isGroup,
60
+ isImage: () => isImage,
61
+ isLinearGradient: () => isLinearGradient,
62
+ isPresentationObject: () => isPresentationObject,
63
+ isRadialGradient: () => isRadialGradient,
64
+ isShape: () => isShape,
65
+ isText: () => isText,
66
+ isUiObject: () => isUiObject
67
+ });
68
+ import { Utils, CustomUIEvent } from "@pacem/pacem-core";
69
+ import { Point, Matrix2D } from "@pacem/pacem-foundation";
70
+ function isDrawable(object) {
71
+ return !Utils.isNull(object) && "stage" in object;
72
+ }
73
+ function isUiObject(object) {
74
+ return (
75
+ /*'transformMatrix' in object &&*/
76
+ isDrawable(object)
77
+ );
78
+ }
79
+ function isGradient(object) {
80
+ return "stops" in object && Utils.isArray(object.stops);
81
+ }
82
+ function isLinearGradient(object) {
83
+ return isGradient(object) && "start" in object && Point.isPoint(object.start) && "end" in object && Point.isPoint(object.end);
84
+ }
85
+ function isRadialGradient(object) {
86
+ return isGradient(object) && "center" in object && Point.isPoint(object.center) && "radius" in object && typeof object.radius === "number";
87
+ }
88
+ var PresentationState = class {
89
+ static combine(lhs, rhs, precomputedMatrix = null) {
90
+ return {
91
+ opacity: (lhs.opacity ?? 1) * (rhs.opacity ?? 1),
92
+ transformMatrix: precomputedMatrix ?? Matrix2D.multiply(rhs.transformMatrix, lhs.transformMatrix),
93
+ dashArray: lhs.dashArray ?? rhs.dashArray,
94
+ fill: lhs.fill ?? rhs.fill,
95
+ lineCap: lhs.lineCap ?? rhs.lineCap,
96
+ lineJoin: lhs.lineJoin ?? rhs.lineJoin,
97
+ lineWidth: lhs.lineWidth ?? rhs.lineWidth,
98
+ stroke: lhs.stroke ?? rhs.stroke
99
+ };
100
+ }
101
+ };
102
+ function isPresentationObject(object) {
103
+ return isUiObject(object) && ("fill" in object || "transformMatrix" in object || "stroke" in object || "lineJoin" in object || "dashArray" in object || "lineWidth" in object || "opacity" in object || "lineCap" in object);
104
+ }
105
+ function isShape(object) {
106
+ return isUiObject(object) && "pathData" in object;
107
+ }
108
+ function isGroup(object) {
109
+ return isUiObject(object) && "childDrawables" in object && !Utils.isNullOrEmpty(object["childDrawables"]);
110
+ }
111
+ function isText(object) {
112
+ return isUiObject(object) && "text" in object && typeof object["text"] === "string";
113
+ }
114
+ function isImage(object) {
115
+ return isUiObject(object) && "src" in object && typeof object["src"] === "string";
116
+ }
117
+ var UI2DEvent = class extends CustomUIEvent {
118
+ constructor(type, eventInit, originalEvent, transformMatrix) {
119
+ super(type, eventInit, originalEvent);
120
+ this.#transformMatrix = transformMatrix;
121
+ }
122
+ #transformMatrix;
123
+ /** Gets the screen transform matrix. */
124
+ get transformMatrix() {
125
+ return this.#transformMatrix;
126
+ }
127
+ project(pt = { x: this.screenX, y: this.screenY }) {
128
+ return Matrix2D.multiply(pt, this.#transformMatrix);
129
+ }
130
+ };
131
+ var Shape = class {
132
+ static empty() {
133
+ return { pathData: "", vertices: [], boundingRect: { x: 0, y: 0, width: 0, height: 0 } };
134
+ }
135
+ };
136
+ var DragEvent = class extends UI2DEvent {
137
+ };
138
+ var DrawableEvent = class extends UI2DEvent {
139
+ constructor(type, args, originalEvent, m) {
140
+ super(type, { detail: args, bubbles: true, cancelable: true }, originalEvent, m);
141
+ }
142
+ };
143
+ var StageEvent = class extends UI2DEvent {
144
+ constructor(type, args, originalEvent, m = args.transformMatrix) {
145
+ super(type, { detail: args, bubbles: true, cancelable: true }, originalEvent, m);
146
+ }
147
+ };
148
+
149
+ // packages/2d/dist/esm/stage.js
150
+ var __decorate = function(decorators, target, key, desc) {
151
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
152
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
153
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
154
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
155
+ };
156
+ var ASPECTRATIO_PATTERN = /^\s*[xX]\s*([Mm](in|ax|id))\s*[yY]\s*([Mm](in|ax|id))(\s+(none|slice|meet))?\s*$/;
157
+ var aspectRatioPropertyConverter = {
158
+ convert: (attr) => {
159
+ const regArr = ASPECTRATIO_PATTERN.exec(attr);
160
+ if (regArr && regArr.length >= 4) {
161
+ return {
162
+ x: regArr[1].toLowerCase(),
163
+ y: regArr[3].toLowerCase(),
164
+ slice: regArr[6] === "slice"
165
+ };
166
+ }
167
+ return "none";
168
+ },
169
+ convertBack: (val) => {
170
+ if (Utils2.isNull(val) || typeof val === "string") {
171
+ return "none";
172
+ }
173
+ return `xM${val.x.substring(1)}YM${val.y.substring(1)} ${val.slice ? "slice" : "meet"}`;
174
+ }
175
+ };
176
+ var DEFAULT_STAGE_OPTIONS = {
177
+ panControl: true,
178
+ zoomControl: true,
179
+ panModifiers: [EventKeyModifier.AltKey],
180
+ zoomModifiers: [EventKeyModifier.AltKey],
181
+ clickModifiers: []
182
+ };
183
+ function getStageOptions(stage) {
184
+ const options = stage instanceof Pacem2DElement ? stage.options : {};
185
+ return Utils2.extend({}, DEFAULT_STAGE_OPTIONS, options);
186
+ }
187
+ var Pacem2DElement = class Pacem2DElement2 extends Components.PacemItemsContainerElement {
188
+ constructor() {
189
+ super(...arguments);
190
+ this.#transformMatrix = Matrix2D2.identity;
191
+ this.#options = DEFAULT_STAGE_OPTIONS;
192
+ this._resizeHandler = (evt) => {
193
+ this.#size = { x: evt.detail.left, y: evt.detail.top, width: evt.detail.width, height: evt.detail.height };
194
+ const adapter = this.adapter;
195
+ if (!Utils2.isNull(adapter)) {
196
+ this._invalidateSize();
197
+ }
198
+ };
199
+ this._zoomHandler = (evt) => {
200
+ if (!evt.isTrusted) {
201
+ return;
202
+ }
203
+ const opts = this.#options;
204
+ if (opts.zoomControl && CustomEventUtils.matchModifiers(evt, opts.zoomModifiers)) {
205
+ avoidHandler(evt);
206
+ const zoomingOut = evt.deltaY < 0;
207
+ const factor = 0.1, sign = zoomingOut ? -1 : 1, factorWSign = factor * sign, scale = 1 + factorWSign;
208
+ const stageRect = Utils2.offsetRect(evt.currentTarget), pt = { x: evt.clientX, y: evt.clientY };
209
+ this._zoom(scale, stageRect, pt);
210
+ }
211
+ };
212
+ this._panHandler = (evt) => {
213
+ const state = this.#panningStart, actual = this._getPanPoint(evt);
214
+ if (!Utils2.isNullOrEmpty(state && state.point) && !Utils2.isNull(actual)) {
215
+ avoidHandler(evt);
216
+ const factor = state.factor, vbox = state.box, start = state.point;
217
+ this.viewbox = {
218
+ x: vbox.x - factor * (actual.x - start.x),
219
+ y: vbox.y - factor * (actual.y - start.y),
220
+ width: vbox.width,
221
+ height: vbox.height
222
+ };
223
+ }
224
+ };
225
+ this._panStartHandler = (evt) => {
226
+ const opts = this.#options;
227
+ if (!opts.panControl) {
228
+ return;
229
+ }
230
+ if (!evt.isTrusted) {
231
+ return;
232
+ }
233
+ const size = this.#size, vbox = this.viewbox || { x: 0, y: 0, width: size.width, height: size.height }, start = this._getPanPoint(evt);
234
+ if (start) {
235
+ avoidHandler(evt);
236
+ this._stage.style.pointerEvents = "none";
237
+ const aspectRatio = this._getActualAspectRatio();
238
+ const wBased = vbox.width / size.width, hBased = vbox.height / size.height, factor = aspectRatio.slice ? Math.min(wBased, hBased) : Math.max(wBased, hBased);
239
+ this.#panningStart = { point: start, box: vbox, factor };
240
+ }
241
+ };
242
+ this._panEndHandler = (evt) => {
243
+ this._stage.style.pointerEvents = "";
244
+ this.#panningStart = null;
245
+ };
246
+ }
247
+ get stage() {
248
+ return this._stage;
249
+ }
250
+ snapshot(bgColor, type, quality) {
251
+ const adapter = this.adapter;
252
+ if (Utils2.isNull(adapter)) {
253
+ return Promise.resolve(null);
254
+ }
255
+ return adapter.snapshot(this, bgColor, type, quality);
256
+ }
257
+ #originalViewBox;
258
+ #transformMatrix;
259
+ get transformMatrix() {
260
+ return this.#transformMatrix;
261
+ }
262
+ _transformMatrixScale() {
263
+ const sizeObj = this.#size || Utils2.offsetRect(this._stage);
264
+ var origVbox = this.#originalViewBox || sizeObj;
265
+ const vbox = this.viewbox || origVbox;
266
+ const aspectRatio = this.aspectRatio || "none";
267
+ const mode = aspectRatio === "none" ? "stretch" : aspectRatio.slice ? "cover" : "contain";
268
+ const actual = Rect.findTransform(vbox, origVbox, mode);
269
+ return actual.a;
270
+ }
271
+ validate(item) {
272
+ return item instanceof DrawableElement && /* only direct items */
273
+ Utils2.isNull(item.parent);
274
+ }
275
+ draw(item, redraw = false) {
276
+ const adapter = this.adapter;
277
+ if (!this.disabled && !Utils2.isNull(adapter)) {
278
+ let cancelable = new CustomEvent("predraw", { cancelable: true });
279
+ this.dispatchEvent(cancelable);
280
+ if (!cancelable.defaultPrevented) {
281
+ adapter.draw(this, item, redraw);
282
+ this.dispatchEvent(new CustomEvent("draw"));
283
+ }
284
+ }
285
+ }
286
+ _drawDebounced(item, force = false) {
287
+ if (!Utils2.isNull(item) && isGroup(item)) {
288
+ this.draw(item, force);
289
+ } else {
290
+ this.draw(item);
291
+ }
292
+ }
293
+ requestDraw(item, redraw = false) {
294
+ this._drawDebounced(item, redraw);
295
+ }
296
+ _buildUpDatasourceFromDOM() {
297
+ this.datasource = (this.items || []).slice();
298
+ }
299
+ #options;
300
+ #size;
301
+ _getActualAspectRatio() {
302
+ const aspectRatio = this.aspectRatio || "none";
303
+ const alignmentX = aspectRatio === "none" ? "mid" : aspectRatio.x;
304
+ const alignmentY = aspectRatio === "none" ? "mid" : aspectRatio.y;
305
+ const slice = aspectRatio === "none" ? false : aspectRatio.slice;
306
+ return { x: alignmentX, y: alignmentY, slice };
307
+ }
308
+ _zoomFromValue(scale) {
309
+ const sizeObj = this.#size;
310
+ if (Utils2.isNull(sizeObj)) {
311
+ return;
312
+ }
313
+ const sizeRect = sizeObj;
314
+ const origVbox = this.#originalViewBox || sizeRect, vbox = this.viewbox || origVbox;
315
+ const aspectRatio = this.aspectRatio || "none";
316
+ const mode = aspectRatio === "none" ? "stretch" : aspectRatio.slice ? "cover" : "contain";
317
+ const actual = Rect.findTransform(vbox, sizeRect, mode);
318
+ const original = Rect.findTransform(origVbox, sizeRect, mode);
319
+ const actualScale = actual.a;
320
+ const origScale = original.a;
321
+ const targetScale = origScale * scale;
322
+ const incrementalInverseScale = actualScale / targetScale;
323
+ this._zoom(incrementalInverseScale);
324
+ }
325
+ _zoom(scale, stageRect, pt) {
326
+ if (Utils2.isNull(stageRect)) {
327
+ stageRect = Utils2.offsetRect(this._stage);
328
+ }
329
+ if (Utils2.isNull(pt)) {
330
+ pt = { x: stageRect.x + stageRect.width * 0.5, y: stageRect.y + stageRect.height * 0.5 };
331
+ }
332
+ const sizeObj = this.#size, vbox = this.viewbox || sizeObj;
333
+ const vsize = Math.min(vbox.width, vbox.height), targetWidth = vsize * scale, targetHeight = vsize * scale;
334
+ if (targetWidth > 0 && targetHeight > 0) {
335
+ const aspectRatio = this._getActualAspectRatio();
336
+ const alignmentX = aspectRatio.x;
337
+ const alignmentY = aspectRatio.y;
338
+ const slice = aspectRatio.slice;
339
+ const vboxRatio = vbox.width / vbox.height, size = slice ? Math.max(stageRect.width, stageRect.height) : Math.min(stageRect.width, stageRect.height);
340
+ let adjX, adjY;
341
+ ;
342
+ switch (alignmentX) {
343
+ case "mid":
344
+ adjX = (targetWidth - vbox.width) * (pt.x - stageRect.x - 0.5 * (stageRect.width - size)) / (size * vboxRatio);
345
+ break;
346
+ case "max":
347
+ adjX = (targetWidth - vbox.width) * (pt.x - stageRect.x - (stageRect.width - size)) / (size * vboxRatio);
348
+ break;
349
+ default:
350
+ adjX = (targetWidth - vbox.width) * (pt.x - stageRect.x) / (size * vboxRatio);
351
+ break;
352
+ }
353
+ switch (alignmentY) {
354
+ case "mid":
355
+ adjY = (targetHeight - vbox.height) * (pt.y - stageRect.y - 0.5 * (stageRect.height - size)) / (size * vboxRatio);
356
+ break;
357
+ case "max":
358
+ adjY = (targetHeight - vbox.height) * (pt.y - stageRect.y - (stageRect.height - size)) / (size * vboxRatio);
359
+ break;
360
+ default:
361
+ adjY = (targetHeight - vbox.height) * (pt.y - stageRect.y) / (size * vboxRatio);
362
+ break;
363
+ }
364
+ const targetX = vbox.x - adjX, targetY = vbox.y - adjY;
365
+ this.viewbox = { x: targetX, y: targetY, width: targetWidth, height: targetHeight };
366
+ }
367
+ }
368
+ _getPanPoint(evt) {
369
+ const opts = this.#options;
370
+ if (evt instanceof MouseEvent && CustomEventUtils.matchModifiers(evt, opts.panModifiers)) {
371
+ return CustomEventUtils.getEventCoordinates(evt).page;
372
+ }
373
+ return null;
374
+ }
375
+ #panningStart;
376
+ _invalidateSize() {
377
+ this.adapter.invalidateSize(this, this.#size);
378
+ const prevTransformMatrix = this.#transformMatrix;
379
+ this.#transformMatrix = this.adapter.getTransformMatrix(this);
380
+ this.dispatchEvent(new PropertyChangeEvent({ propertyName: "transformMatrix", currentValue: this.#transformMatrix, oldValue: prevTransformMatrix }));
381
+ this.zoom = this._transformMatrixScale();
382
+ this.dispatchEvent(new Components.ResizeEvent(this.#size));
383
+ }
384
+ viewActivatedCallback() {
385
+ super.viewActivatedCallback();
386
+ const adapter = this.adapter;
387
+ if (!Utils2.isNull(adapter)) {
388
+ adapter.initialize(this);
389
+ this._invalidateSize();
390
+ this._drawDebounced();
391
+ }
392
+ const resize = this._resize;
393
+ resize.addEventListener(Components.ResizeEventName, this._resizeHandler, false);
394
+ const stage = this._stage;
395
+ resize.target = stage;
396
+ const options = { capture: false, passive: true };
397
+ stage.addEventListener("wheel", this._zoomHandler, false);
398
+ stage.addEventListener("mousedown", this._panStartHandler, false);
399
+ stage.addEventListener("touchstart", this._panStartHandler, options);
400
+ window.addEventListener("mousemove", this._panHandler, false);
401
+ window.addEventListener("mouseup", this._panEndHandler, false);
402
+ window.addEventListener("touchmove", this._panHandler, options);
403
+ window.addEventListener("touchend", this._panEndHandler, options);
404
+ }
405
+ propertyChangedCallback(name, old, val, first) {
406
+ super.propertyChangedCallback(name, old, val, first);
407
+ switch (name) {
408
+ case "adapter":
409
+ if (!Utils2.isNull(old)) {
410
+ old.dispose(this);
411
+ }
412
+ if (!Utils2.isNull(val)) {
413
+ val.initialize(this);
414
+ this._invalidateSize();
415
+ this._drawDebounced();
416
+ }
417
+ break;
418
+ case "aspectRatio":
419
+ if (!Utils2.isNull(this.adapter)) {
420
+ this._invalidateSize();
421
+ }
422
+ break;
423
+ case "viewbox":
424
+ if (!Utils2.isNull(this.adapter)) {
425
+ this._invalidateSize();
426
+ }
427
+ this.#originalViewBox ??= this.viewbox || null;
428
+ break;
429
+ case "items":
430
+ this._buildUpDatasourceFromDOM();
431
+ break;
432
+ case "zoom":
433
+ if (val !== this._transformMatrixScale()) {
434
+ this._zoomFromValue(val);
435
+ }
436
+ break;
437
+ case "options":
438
+ this.#options = getStageOptions(this);
439
+ break;
440
+ case "disabled":
441
+ case "datasource":
442
+ this._drawDebounced();
443
+ break;
444
+ }
445
+ }
446
+ disconnectedCallback() {
447
+ const resizer = this._resize, stage = this._stage;
448
+ if (!Utils2.isNull(resizer)) {
449
+ resizer.removeEventListener(Components.ResizeEventName, this._resizeHandler, false);
450
+ }
451
+ if (!Utils2.isNull(stage)) {
452
+ stage.removeEventListener("wheel", this._zoomHandler, false);
453
+ stage.removeEventListener("mousedown", this._panStartHandler, false);
454
+ stage.removeEventListener("touchstart", this._panStartHandler);
455
+ window.removeEventListener("mousemove", this._panHandler, false);
456
+ window.removeEventListener("mouseup", this._panEndHandler, false);
457
+ window.removeEventListener("touchmove", this._panHandler);
458
+ window.removeEventListener("touchend", this._panEndHandler);
459
+ }
460
+ if (!Utils2.isNull(this.adapter)) {
461
+ this.adapter.dispose(this);
462
+ }
463
+ super.disconnectedCallback();
464
+ }
465
+ };
466
+ __decorate([
467
+ Watch({ converter: PropertyConverters.Element })
468
+ ], Pacem2DElement.prototype, "adapter", void 0);
469
+ __decorate([
470
+ Watch({ reflectBack: true, converter: PropertyConverters.Rect })
471
+ ], Pacem2DElement.prototype, "viewbox", void 0);
472
+ __decorate([
473
+ Watch({ emit: false, reflectBack: true, converter: aspectRatioPropertyConverter })
474
+ ], Pacem2DElement.prototype, "aspectRatio", void 0);
475
+ __decorate([
476
+ Watch({ emit: false, converter: PropertyConverters.Json })
477
+ ], Pacem2DElement.prototype, "datasource", void 0);
478
+ __decorate([
479
+ Watch({ emit: false, converter: PropertyConverters.Json })
480
+ ], Pacem2DElement.prototype, "options", void 0);
481
+ __decorate([
482
+ Watch({ converter: PropertyConverters.Number })
483
+ ], Pacem2DElement.prototype, "zoom", void 0);
484
+ __decorate([
485
+ ViewChild("." + PCSS + "-2d")
486
+ ], Pacem2DElement.prototype, "_stage", void 0);
487
+ __decorate([
488
+ ViewChild(P + "-resize")
489
+ ], Pacem2DElement.prototype, "_resize", void 0);
490
+ __decorate([
491
+ Debounce(true)
492
+ ], Pacem2DElement.prototype, "_drawDebounced", null);
493
+ Pacem2DElement = __decorate([
494
+ CustomElement({ tagName: P + "-" + TAG_MIDDLE_NAME, shadow: true, template: `<${P}-resize watch-position="true"></${P}-resize><div class="${PCSS}-2d" part="container"></div><slot></slot>` })
495
+ ], Pacem2DElement);
496
+
497
+ // packages/2d/dist/esm/drawable-element.js
498
+ var __decorate2 = function(decorators, target, key, desc) {
499
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
500
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
501
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
502
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
503
+ };
504
+ var DrawableElement = class _DrawableElement extends Components2.PacemCrossItemsContainerElement {
505
+ validate(_) {
506
+ return false;
507
+ }
508
+ findContainer() {
509
+ return this.parent || this.stage;
510
+ }
511
+ get stage() {
512
+ return this["_scene"] = this["_scene"] || CustomElementUtils.findAncestorOfType(this, Pacem2DElement);
513
+ }
514
+ get parent() {
515
+ return this["_drawableParent"] = this["_drawableParent"] || CustomElementUtils.findAncestor(this, (i) => i instanceof _DrawableElement);
516
+ }
517
+ disconnectedCallback() {
518
+ delete this["_scene"];
519
+ delete this["_drawableParent"];
520
+ super.disconnectedCallback();
521
+ }
522
+ propertyChangedCallback(name, old, val, first) {
523
+ super.propertyChangedCallback(name, old, val, first);
524
+ if (!first) {
525
+ switch (name) {
526
+ case "hide":
527
+ this.stage?.draw(this);
528
+ break;
529
+ }
530
+ }
531
+ }
532
+ };
533
+ __decorate2([
534
+ Watch2({ emit: false, reflectBack: true, converter: PropertyConverters2.String })
535
+ ], DrawableElement.prototype, "tag", void 0);
536
+ __decorate2([
537
+ Watch2({ emit: false, converter: PropertyConverters2.Boolean })
538
+ ], DrawableElement.prototype, "inert", void 0);
539
+
540
+ // packages/2d/dist/esm/types.js
541
+ import { Watch as Watch3, PropertyConverters as PropertyConverters3, Utils as Utils3 } from "@pacem/pacem-core";
542
+ import { Matrix2D as Matrix2D3 } from "@pacem/pacem-foundation";
543
+ var __decorate3 = function(decorators, target, key, desc) {
544
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
545
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
546
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
547
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
548
+ };
549
+ var DEG2RAD = Math.PI / 180;
550
+ var UiElement = class extends DrawableElement {
551
+ #transformMatrix = Matrix2D3.identity;
552
+ viewActivatedCallback() {
553
+ super.viewActivatedCallback();
554
+ this._updateTransformMatrix();
555
+ }
556
+ propertyChangedCallback(name, old, val, first) {
557
+ super.propertyChangedCallback(name, old, val, first);
558
+ if (!first) {
559
+ switch (name) {
560
+ case "rotate":
561
+ case "scaleX":
562
+ case "scaleY":
563
+ case "translateX":
564
+ case "translateY":
565
+ this._updateTransformMatrix();
566
+ // flow down
567
+ case "opacity":
568
+ this.stage?.draw(this);
569
+ break;
570
+ }
571
+ }
572
+ }
573
+ _updateTransformMatrix() {
574
+ let rotation = DEG2RAD * (this.rotate ?? 0), cos = Math.cos(rotation), sin = Math.sin(rotation), a = (this.scaleX ?? 1) * cos, b = -sin, c = sin, d = (this.scaleY ?? 1) * cos, e = this.translateX ?? 0, f = this.translateY ?? 0;
575
+ this.#transformMatrix = { a, b, c, d, e, f };
576
+ }
577
+ /** @internal */
578
+ get transformMatrix() {
579
+ const m = this.#transformMatrix;
580
+ return { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e, f: m.f };
581
+ }
582
+ };
583
+ __decorate3([
584
+ Watch3({ emit: false, converter: PropertyConverters3.Number })
585
+ ], UiElement.prototype, "rotate", void 0);
586
+ __decorate3([
587
+ Watch3({ emit: false, converter: PropertyConverters3.Number })
588
+ ], UiElement.prototype, "scaleX", void 0);
589
+ __decorate3([
590
+ Watch3({ emit: false, converter: PropertyConverters3.Number })
591
+ ], UiElement.prototype, "scaleY", void 0);
592
+ __decorate3([
593
+ Watch3({ emit: false, converter: PropertyConverters3.Number })
594
+ ], UiElement.prototype, "translateX", void 0);
595
+ __decorate3([
596
+ Watch3({ emit: false, converter: PropertyConverters3.Number })
597
+ ], UiElement.prototype, "translateY", void 0);
598
+ __decorate3([
599
+ Watch3({ emit: false, converter: PropertyConverters3.Number })
600
+ ], UiElement.prototype, "opacity", void 0);
601
+ var PresentationElement = class extends UiElement {
602
+ propertyChangedCallback(name, old, val, first) {
603
+ super.propertyChangedCallback(name, old, val, first);
604
+ if (!first) {
605
+ switch (name) {
606
+ case "stroke":
607
+ case "lineWidth":
608
+ case "lineJoin":
609
+ case "lineCap":
610
+ case "dashArray":
611
+ case "fill":
612
+ if (!Utils3.isNull(this.stage)) {
613
+ this.stage.draw(this);
614
+ }
615
+ break;
616
+ }
617
+ }
618
+ }
619
+ };
620
+ __decorate3([
621
+ Watch3({ emit: false, converter: PropertyConverters3.String })
622
+ ], PresentationElement.prototype, "stroke", void 0);
623
+ __decorate3([
624
+ Watch3({ emit: false, converter: PropertyConverters3.String })
625
+ ], PresentationElement.prototype, "fill", void 0);
626
+ __decorate3([
627
+ Watch3({
628
+ emit: false,
629
+ converter: {
630
+ convert: (attr) => attr?.split(",").map((i) => parseInt(i)).filter((i) => !Number.isNaN(i)),
631
+ convertBack: (prop) => prop?.join(",")
632
+ }
633
+ })
634
+ ], PresentationElement.prototype, "dashArray", void 0);
635
+ __decorate3([
636
+ Watch3({ emit: false, converter: PropertyConverters3.Number })
637
+ ], PresentationElement.prototype, "lineWidth", void 0);
638
+ __decorate3([
639
+ Watch3({ emit: false, converter: PropertyConverters3.String })
640
+ ], PresentationElement.prototype, "lineJoin", void 0);
641
+ __decorate3([
642
+ Watch3({ emit: false, converter: PropertyConverters3.String })
643
+ ], PresentationElement.prototype, "lineCap", void 0);
644
+ var ShapeElement = class extends PresentationElement {
645
+ propertyChangedCallback(name, old, val, first) {
646
+ super.propertyChangedCallback(name, old, val, first);
647
+ if (!first) {
648
+ switch (name) {
649
+ case "data":
650
+ this.stage?.draw(this);
651
+ break;
652
+ }
653
+ }
654
+ }
655
+ viewActivatedCallback() {
656
+ super.viewActivatedCallback();
657
+ this.recomputeShape();
658
+ }
659
+ recomputeShape() {
660
+ const { pathData, vertices, boundingRect } = this.getShapeGeometry();
661
+ this.#vertices = vertices;
662
+ this.#boundingRect = boundingRect;
663
+ this.data = pathData;
664
+ }
665
+ get pathData() {
666
+ return this.data;
667
+ }
668
+ #boundingRect;
669
+ get boundingRect() {
670
+ return this.#boundingRect;
671
+ }
672
+ #vertices;
673
+ get vertices() {
674
+ return this.#vertices;
675
+ }
676
+ };
677
+ __decorate3([
678
+ Watch3({ emit: false, converter: PropertyConverters3.String })
679
+ ], ShapeElement.prototype, "data", void 0);
680
+
681
+ // packages/2d/dist/esm/group.js
682
+ import { CustomElement as CustomElement2, Watch as Watch4, P as P2, Utils as Utils4 } from "@pacem/pacem-core";
683
+ var __decorate4 = function(decorators, target, key, desc) {
684
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
685
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
686
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
687
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
688
+ };
689
+ var PacemGroupElement = class PacemGroupElement2 extends PresentationElement {
690
+ validate(item) {
691
+ return item instanceof DrawableElement && item.parent === this;
692
+ }
693
+ #children = [];
694
+ get childDrawables() {
695
+ return this.#children;
696
+ }
697
+ propertyChangedCallback(name, old, val, first) {
698
+ super.propertyChangedCallback(name, old, val, first);
699
+ switch (name) {
700
+ case "items":
701
+ case "datasource":
702
+ this.#children = val || [];
703
+ const scene = this.stage;
704
+ if (!Utils4.isNull(scene)) {
705
+ scene.draw(this, true);
706
+ }
707
+ break;
708
+ }
709
+ }
710
+ };
711
+ __decorate4([
712
+ Watch4({ emit: false })
713
+ ], PacemGroupElement.prototype, "datasource", void 0);
714
+ PacemGroupElement = __decorate4([
715
+ CustomElement2({ tagName: P2 + "-" + TAG_MIDDLE_NAME + "-group" })
716
+ ], PacemGroupElement);
717
+
718
+ // packages/2d/dist/esm/ellipse.js
719
+ import { CustomElement as CustomElement3, Watch as Watch5, PropertyConverters as PropertyConverters4, P as P3, Utils as Utils5 } from "@pacem/pacem-core";
720
+ import { Rect as Rect2 } from "@pacem/pacem-foundation";
721
+ var __decorate5 = function(decorators, target, key, desc) {
722
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
723
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
724
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
725
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
726
+ };
727
+ var PacemEllipseElement_1;
728
+ var PacemCircleElement_1;
729
+ function full(c, rx, ry) {
730
+ const d = 2 * rx, cx = c.x, cy = c.y;
731
+ return {
732
+ pathData: `M ${cx} ${cy} m ${-rx},0 a ${rx},${ry} 0 1,1 ${d},0 a ${rx},${ry} 0 1,1 ${-d},0`,
733
+ vertices: [],
734
+ boundingRect: { x: cx - rx, y: cy - ry, width: 2 * rx, height: 2 * ry }
735
+ };
736
+ }
737
+ function sect(c, rx, ry, start, end) {
738
+ const degToRad = Math.PI / 180;
739
+ const s = degToRad * start, e = degToRad * end;
740
+ const polar = (theta) => rx * ry / Math.sqrt(Math.pow(Math.cos(theta) * ry, 2) + Math.pow(Math.sin(theta) * rx, 2));
741
+ const rhoStart = polar(s), rhoEnd = polar(e);
742
+ const cartesian = (rho, theta) => {
743
+ return { x: rho * Math.cos(theta), y: rho * Math.sin(theta) };
744
+ };
745
+ const cartStart = cartesian(rhoStart, s), cartEnd = cartesian(rhoEnd, e);
746
+ const p0 = { x: c.x + cartStart.x, y: c.y + cartStart.y }, p1 = { x: c.x + cartEnd.x, y: c.y + cartEnd.y };
747
+ let boundingRect = Rect2.expand(c, p0, p1);
748
+ if (end < start)
749
+ end += 360;
750
+ if (start <= 0 && end > 0 || end >= 360) {
751
+ boundingRect = Rect2.expand(boundingRect, { x: c.x + rx, y: c.y });
752
+ }
753
+ if (start <= 90 && end > 90 || end >= 450) {
754
+ boundingRect = Rect2.expand(boundingRect, { x: c.x, y: c.y + ry });
755
+ }
756
+ if (start <= 180 && end > 180 || end >= 540) {
757
+ boundingRect = Rect2.expand(boundingRect, { x: c.x - rx, y: c.y });
758
+ }
759
+ if (start <= 270 && end > 270 || end >= 630) {
760
+ boundingRect = Rect2.expand(boundingRect, { x: c.x, y: c.y - ry });
761
+ }
762
+ const flag = e - s > Math.PI ? "1" : "0";
763
+ return {
764
+ pathData: `M ${p0.x} ${p0.y} A ${rx},${ry} 0 ${flag},1 ${p1.x},${p1.y} L ${c.x},${c.y} Z`,
765
+ vertices: [p0, p1],
766
+ boundingRect
767
+ };
768
+ }
769
+ function getShapeGeometry(c, rx, ry, start, end) {
770
+ start ??= 0, end ??= 0;
771
+ start %= 360;
772
+ end %= 360;
773
+ while (start < 0)
774
+ start += 360;
775
+ while (end < start)
776
+ end += 360;
777
+ const threesixty = (start - end).isCloseTo(0);
778
+ return threesixty ? full(c, rx, ry) : sect(c, rx, ry, start, end);
779
+ }
780
+ var PacemEllipseElement = PacemEllipseElement_1 = class PacemEllipseElement2 extends ShapeElement {
781
+ propertyChangedCallback(name, old, val, first) {
782
+ super.propertyChangedCallback(name, old, val, first);
783
+ if (!first) {
784
+ switch (name) {
785
+ case "center":
786
+ case "rx":
787
+ case "ry":
788
+ case "start":
789
+ case "end":
790
+ this.recomputeShape();
791
+ break;
792
+ }
793
+ }
794
+ }
795
+ getPathData() {
796
+ const a = this.rx, b = this.ry, c = this.center, s = this.start ?? 0, e = this.end ?? 0;
797
+ if (!Utils5.isNull(c) && !Utils5.isNull(a) && !Utils5.isNull(b)) {
798
+ return PacemEllipseElement_1.getPathData(c, a, b, s, e);
799
+ }
800
+ return null;
801
+ }
802
+ getShapeGeometry() {
803
+ const center = this.center ?? { x: 0, y: 0 };
804
+ const a = this.rx ?? 0, b = this.ry ?? 0;
805
+ return getShapeGeometry(center, a, b, this.start, this.end);
806
+ }
807
+ static getPathData(c = { x: NaN, y: NaN }, rx = NaN, ry = NaN, start, end) {
808
+ const { pathData } = getShapeGeometry(c, rx, ry, start, end);
809
+ return pathData;
810
+ }
811
+ };
812
+ __decorate5([
813
+ Watch5({ emit: false, converter: PropertyConverters4.Point })
814
+ ], PacemEllipseElement.prototype, "center", void 0);
815
+ __decorate5([
816
+ Watch5({ emit: false, converter: PropertyConverters4.Number })
817
+ ], PacemEllipseElement.prototype, "rx", void 0);
818
+ __decorate5([
819
+ Watch5({ emit: false, converter: PropertyConverters4.Number })
820
+ ], PacemEllipseElement.prototype, "ry", void 0);
821
+ __decorate5([
822
+ Watch5({ emit: false, converter: PropertyConverters4.Number })
823
+ ], PacemEllipseElement.prototype, "start", void 0);
824
+ __decorate5([
825
+ Watch5({ emit: false, converter: PropertyConverters4.Number })
826
+ ], PacemEllipseElement.prototype, "end", void 0);
827
+ PacemEllipseElement = PacemEllipseElement_1 = __decorate5([
828
+ CustomElement3({ tagName: P3 + "-" + TAG_MIDDLE_NAME + "-ellipse" })
829
+ ], PacemEllipseElement);
830
+ var PacemCircleElement = PacemCircleElement_1 = class PacemCircleElement2 extends ShapeElement {
831
+ propertyChangedCallback(name, old, val, first) {
832
+ super.propertyChangedCallback(name, old, val, first);
833
+ if (!first) {
834
+ switch (name) {
835
+ case "center":
836
+ case "radius":
837
+ case "start":
838
+ case "end":
839
+ this.recomputeShape();
840
+ break;
841
+ }
842
+ }
843
+ }
844
+ getPathData() {
845
+ const r = this.radius, c = this.center;
846
+ if (!Utils5.isNull(c) && !Utils5.isNull(r)) {
847
+ return PacemCircleElement_1.getPathData(c, r, this.start, this.end);
848
+ }
849
+ return null;
850
+ }
851
+ getShapeGeometry() {
852
+ const center = this.center ?? { x: 0, y: 0 };
853
+ const r = this.radius ?? 0;
854
+ return getShapeGeometry(center, r, r, this.start, this.end);
855
+ }
856
+ static getPathData(c = { x: NaN, y: NaN }, r = NaN, start, end) {
857
+ return PacemEllipseElement.getPathData(c, r, r, start, end);
858
+ }
859
+ };
860
+ __decorate5([
861
+ Watch5({ emit: false, converter: PropertyConverters4.Point })
862
+ ], PacemCircleElement.prototype, "center", void 0);
863
+ __decorate5([
864
+ Watch5({ emit: false, converter: PropertyConverters4.Number })
865
+ ], PacemCircleElement.prototype, "radius", void 0);
866
+ __decorate5([
867
+ Watch5({ emit: false, converter: PropertyConverters4.Number })
868
+ ], PacemCircleElement.prototype, "start", void 0);
869
+ __decorate5([
870
+ Watch5({ emit: false, converter: PropertyConverters4.Number })
871
+ ], PacemCircleElement.prototype, "end", void 0);
872
+ PacemCircleElement = PacemCircleElement_1 = __decorate5([
873
+ CustomElement3({ tagName: P3 + "-" + TAG_MIDDLE_NAME + "-circle" })
874
+ ], PacemCircleElement);
875
+
876
+ // packages/2d/dist/esm/rect.js
877
+ import { CustomElement as CustomElement4, Watch as Watch6, PropertyConverters as PropertyConverters5, P as P4, Utils as Utils6 } from "@pacem/pacem-core";
878
+ var __decorate6 = function(decorators, target, key, desc) {
879
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
880
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
881
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
882
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
883
+ };
884
+ var PacemRectElement_1;
885
+ function parseCornerRadius(radius) {
886
+ const rx = radius[2], ry = radius[4] ?? rx, type = radius[6] === "cut" ? CornerType.Cut : CornerType.Rounded;
887
+ return { rx: parseCornerRadiusComponent(rx), ry: parseCornerRadiusComponent(ry), type };
888
+ }
889
+ function parseCornerRadiusComponent(radius) {
890
+ const val = parseFloat(radius);
891
+ return { value: val, unit: radius.endsWith("%") ? "pct" : "u" };
892
+ }
893
+ function stringifyCornerRadiusComponent(radius) {
894
+ return `${radius.value}${radius.unit === "pct" ? "%" : ""}`;
895
+ }
896
+ var CORNERS_PATTERN = /(([\d\.]+%?)(\s*,?\s*([\d\.]+%?))?(\s+(cut|round))?)/g;
897
+ function parseCornerRadii(radii) {
898
+ let numbers;
899
+ const acc = [];
900
+ while (numbers = CORNERS_PATTERN.exec(radii)) {
901
+ acc.push(numbers);
902
+ }
903
+ switch (acc.length) {
904
+ case 1:
905
+ const single = parseCornerRadius(acc[0]);
906
+ return [single, single, single, single];
907
+ case 4:
908
+ const topLeft = parseCornerRadius(acc[0]);
909
+ const topRight = parseCornerRadius(acc[1]);
910
+ const bottomRight = parseCornerRadius(acc[2]);
911
+ const bottomLeft = parseCornerRadius(acc[3]);
912
+ return [topLeft, topRight, bottomRight, bottomLeft];
913
+ default:
914
+ return null;
915
+ }
916
+ }
917
+ function stringifyCornerRadii(radii) {
918
+ const topLeft = radii[0], topRight = radii[1], bottomRight = radii[2], bottomLeft = radii[3];
919
+ const tlX = stringifyCornerRadiusComponent(topLeft.rx), tlY = stringifyCornerRadiusComponent(topLeft.ry);
920
+ const trX = stringifyCornerRadiusComponent(topRight.rx), trY = stringifyCornerRadiusComponent(topRight.ry);
921
+ const brX = stringifyCornerRadiusComponent(bottomRight.rx), brY = stringifyCornerRadiusComponent(bottomRight.ry);
922
+ const blX = stringifyCornerRadiusComponent(bottomLeft.rx), blY = stringifyCornerRadiusComponent(bottomLeft.ry);
923
+ return `${tlX},${tlY} ${trX},${trY} ${brX},${brY} ${blX},${blY}`;
924
+ }
925
+ var CornerType;
926
+ (function(CornerType2) {
927
+ CornerType2["Rounded"] = "rounded";
928
+ CornerType2["Cut"] = "cut";
929
+ })(CornerType || (CornerType = {}));
930
+ var PacemRectElement = PacemRectElement_1 = class PacemRectElement2 extends ShapeElement {
931
+ propertyChangedCallback(name, old, val, first) {
932
+ super.propertyChangedCallback(name, old, val, first);
933
+ if (!first && (name === "x" || name === "y" || name === "w" || name === "h" || name === "r" || name === "cornerType")) {
934
+ this.recomputeShape();
935
+ }
936
+ }
937
+ getPathData() {
938
+ const x = this.x, y = this.y, w = this.w, h = this.h;
939
+ let r = this.r ?? { rx: { value: 0 }, ry: { value: 0 }, type: CornerType.Rounded };
940
+ if (!Utils6.isArray(r)) {
941
+ r = [r, r, r, r];
942
+ }
943
+ r = r.map((i) => {
944
+ return typeof i === "number" ? { rx: { value: i }, ry: { value: i }, type: this.cornerType } : i;
945
+ });
946
+ if (!Utils6.isNull(x) && !Utils6.isNull(y) && !Utils6.isNull(w) && !Utils6.isNull(h)) {
947
+ return PacemRectElement_1.getPathData(x, y, w, h, r);
948
+ }
949
+ return null;
950
+ }
951
+ getShapeGeometry() {
952
+ const x = this.x, y = this.y, x1 = x + this.w, y1 = y + this.h;
953
+ return {
954
+ pathData: this.getPathData(),
955
+ vertices: [{ x, y }, { x: x1, y }, { x: x1, y: y1 }, { x, y: y1 }],
956
+ boundingRect: { x, y, width: this.w, height: this.h }
957
+ };
958
+ }
959
+ static getPathData(x = NaN, y = NaN, w = NaN, h = NaN, r = null) {
960
+ if (!r) {
961
+ return `M ${x} ${y} h ${w} v ${h} h ${-w} z`;
962
+ }
963
+ if (!Utils6.isArray(r)) {
964
+ r = [r, r, r, r];
965
+ }
966
+ const tl = r[0], tr = r[1], br = r[2], bl = r[3];
967
+ const vx = (rx) => rx.unit === "pct" ? rx.value * 0.01 * w : rx.value;
968
+ const vy = (ry) => ry.unit === "pct" ? ry.value * 0.01 * h : ry.value;
969
+ const tlX = vx(tl.rx), tlY = vy(tl.ry);
970
+ const trX = vx(tr.rx), trY = vy(tr.ry);
971
+ const brX = vx(br.rx), brY = vy(br.ry);
972
+ const blX = vx(bl.rx), blY = vy(bl.ry);
973
+ let retval = `M ${x},${y + tlY}`;
974
+ switch (tl.type) {
975
+ case "cut":
976
+ retval += ` l ${tlX},${-tlY}`;
977
+ break;
978
+ default:
979
+ retval += ` a ${tlX} ${tlY} 0 0 1 ${tlX} ${-tlY}`;
980
+ break;
981
+ }
982
+ retval += ` h ${w - tlX - trX}`;
983
+ switch (tr.type) {
984
+ case "cut":
985
+ retval += ` l ${trX},${trY}`;
986
+ break;
987
+ default:
988
+ retval += ` a ${trX} ${trY} 0 0 1 ${trX} ${trY}`;
989
+ break;
990
+ }
991
+ retval += ` v ${h - trY - brY}`;
992
+ switch (br.type) {
993
+ case "cut":
994
+ retval += ` l ${-brX},${brY}`;
995
+ break;
996
+ default:
997
+ retval += ` a ${brX} ${brY} 0 0 1 ${-brX} ${brY}`;
998
+ break;
999
+ }
1000
+ retval += ` h ${-(w - brX - blX)}`;
1001
+ switch (bl.type) {
1002
+ case "cut":
1003
+ retval += ` l ${-blX},${-blY}`;
1004
+ break;
1005
+ default:
1006
+ retval += ` a ${blX} ${blY} 0 0 1 ${-blX} ${-blY}`;
1007
+ break;
1008
+ }
1009
+ return retval + " z";
1010
+ }
1011
+ };
1012
+ __decorate6([
1013
+ Watch6({ emit: false, converter: PropertyConverters5.Number })
1014
+ ], PacemRectElement.prototype, "x", void 0);
1015
+ __decorate6([
1016
+ Watch6({ emit: false, converter: PropertyConverters5.Number })
1017
+ ], PacemRectElement.prototype, "y", void 0);
1018
+ __decorate6([
1019
+ Watch6({ emit: false, converter: PropertyConverters5.Number })
1020
+ ], PacemRectElement.prototype, "w", void 0);
1021
+ __decorate6([
1022
+ Watch6({ emit: false, converter: PropertyConverters5.Number })
1023
+ ], PacemRectElement.prototype, "h", void 0);
1024
+ __decorate6([
1025
+ Watch6({
1026
+ emit: false,
1027
+ converter: {
1028
+ convert: (attr) => parseCornerRadii(attr),
1029
+ convertBack: (radii) => stringifyCornerRadii(radii)
1030
+ }
1031
+ })
1032
+ ], PacemRectElement.prototype, "r", void 0);
1033
+ __decorate6([
1034
+ Watch6({ emit: false, converter: PropertyConverters5.String })
1035
+ ], PacemRectElement.prototype, "cornerType", void 0);
1036
+ PacemRectElement = PacemRectElement_1 = __decorate6([
1037
+ CustomElement4({ tagName: P4 + "-" + TAG_MIDDLE_NAME + "-rect" })
1038
+ ], PacemRectElement);
1039
+
1040
+ // packages/2d/dist/esm/line.js
1041
+ import { CustomElement as CustomElement5, Watch as Watch7, PropertyConverters as PropertyConverters6, P as P5, Utils as Utils7 } from "@pacem/pacem-core";
1042
+ var __decorate7 = function(decorators, target, key, desc) {
1043
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1044
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1045
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1046
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1047
+ };
1048
+ var PacemLineElement_1;
1049
+ var PacemLineElement = PacemLineElement_1 = class PacemLineElement2 extends ShapeElement {
1050
+ propertyChangedCallback(name, old, val, first) {
1051
+ super.propertyChangedCallback(name, old, val, first);
1052
+ if (!first) {
1053
+ switch (name) {
1054
+ case "from":
1055
+ case "to":
1056
+ this.recomputeShape();
1057
+ break;
1058
+ }
1059
+ }
1060
+ }
1061
+ getShapeGeometry() {
1062
+ const from = this.from, to = this.to;
1063
+ if (Utils7.isNull(from) || Utils7.isNull(to)) {
1064
+ return Shape.empty();
1065
+ }
1066
+ const x0 = from.x, y0 = from.y, x1 = to.x, y1 = to.y;
1067
+ const boundingRect = { x: Math.min(x0, x1), y: Math.min(y0, y1), width: Math.abs(x0 - x1), height: Math.abs(y0 - y1) };
1068
+ return { pathData: this.getPathData(), vertices: [from, to], boundingRect };
1069
+ }
1070
+ getPathData() {
1071
+ const from = this.from, to = this.to;
1072
+ if (!Utils7.isNull(from) && !Utils7.isNull(to)) {
1073
+ return PacemLineElement_1.getPathData(from, to);
1074
+ }
1075
+ return null;
1076
+ }
1077
+ static getPathData(from = { x: NaN, y: NaN }, to = { x: NaN, y: NaN }) {
1078
+ const x0 = from.x, y0 = from.y, x1 = to.x, y1 = to.y;
1079
+ return `M ${x0} ${y0} L ${x1} ${y1}`;
1080
+ }
1081
+ };
1082
+ __decorate7([
1083
+ Watch7({ emit: false, converter: PropertyConverters6.Point })
1084
+ ], PacemLineElement.prototype, "from", void 0);
1085
+ __decorate7([
1086
+ Watch7({ emit: false, converter: PropertyConverters6.Point })
1087
+ ], PacemLineElement.prototype, "to", void 0);
1088
+ PacemLineElement = PacemLineElement_1 = __decorate7([
1089
+ CustomElement5({ tagName: P5 + "-" + TAG_MIDDLE_NAME + "-line" })
1090
+ ], PacemLineElement);
1091
+
1092
+ // packages/2d/dist/esm/path.js
1093
+ import { CustomElement as CustomElement6, Watch as Watch8, PropertyConverters as PropertyConverters7, P as P6 } from "@pacem/pacem-core";
1094
+ var __decorate8 = function(decorators, target, key, desc) {
1095
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1096
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1097
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1098
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1099
+ };
1100
+ var PacemPathElement = class PacemPathElement2 extends ShapeElement {
1101
+ constructor() {
1102
+ super(...arguments);
1103
+ this.getPathData = () => this.d;
1104
+ }
1105
+ propertyChangedCallback(name, old, val, first) {
1106
+ super.propertyChangedCallback(name, old, val, first);
1107
+ if (name === "d" && !first) {
1108
+ this.recomputeShape();
1109
+ }
1110
+ }
1111
+ getShapeGeometry() {
1112
+ return {
1113
+ pathData: this.getPathData(),
1114
+ /* TODO: parse d */
1115
+ boundingRect: null,
1116
+ vertices: []
1117
+ };
1118
+ }
1119
+ };
1120
+ __decorate8([
1121
+ Watch8({ emit: false, converter: PropertyConverters7.String })
1122
+ ], PacemPathElement.prototype, "d", void 0);
1123
+ PacemPathElement = __decorate8([
1124
+ CustomElement6({ tagName: P6 + "-" + TAG_MIDDLE_NAME + "-path" })
1125
+ ], PacemPathElement);
1126
+
1127
+ // packages/2d/dist/esm/polygon.js
1128
+ import { CustomElement as CustomElement7, Watch as Watch9, PropertyConverters as PropertyConverters8, P as P7, Utils as Utils8 } from "@pacem/pacem-core";
1129
+ var __decorate9 = function(decorators, target, key, desc) {
1130
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1131
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1132
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1133
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1134
+ };
1135
+ var PacemPolygonElement_1;
1136
+ var PacemPolygonElement = PacemPolygonElement_1 = class PacemPolygonElement2 extends ShapeElement {
1137
+ propertyChangedCallback(name, old, val, first) {
1138
+ super.propertyChangedCallback(name, old, val, first);
1139
+ if (!first) {
1140
+ switch (name) {
1141
+ case "radius":
1142
+ case "starIndent":
1143
+ case "sides":
1144
+ this.recomputeShape();
1145
+ break;
1146
+ }
1147
+ }
1148
+ }
1149
+ getPathData() {
1150
+ const sides = this.sides, radius = this.radius, center = this.center;
1151
+ if (!Utils8.isNull(sides) && !Utils8.isNull(radius)) {
1152
+ return PacemPolygonElement_1.getPathData(center, radius, sides, this.starIndent);
1153
+ }
1154
+ return null;
1155
+ }
1156
+ getShapeGeometry() {
1157
+ const c = this.center ?? { x: 0, y: 0 }, r = this.radius ?? 0, sides = this.sides ?? 3, si = this.starIndent;
1158
+ if (sides < 3) {
1159
+ return Shape.empty();
1160
+ }
1161
+ return PacemPolygonElement_1.getShapeGeometry(c, r, sides, si);
1162
+ }
1163
+ static getShapeGeometry(center, radius, sides, starIndent = 0) {
1164
+ const p0 = { x: center.x, y: center.y - radius };
1165
+ let retval = `M ${p0.x} ${p0.y}`;
1166
+ const vertices = [p0];
1167
+ const theta = 2 * Math.PI / sides, theta2 = 0.5 * theta, isStar = starIndent > 0, apothem = radius * Math.cos(theta2);
1168
+ for (let j = 1; j < sides; j++) {
1169
+ const angle = j * theta, x = center.x + Math.sin(angle) * radius, y = center.y - Math.cos(angle) * radius;
1170
+ if (isStar) {
1171
+ const innerRadius = apothem * (1 - starIndent);
1172
+ const angle2 = angle - theta2, x1 = center.x + Math.sin(angle2) * innerRadius, y1 = center.y - Math.cos(angle2) * innerRadius;
1173
+ retval += ` L ${x1} ${y1} L ${x} ${y}`;
1174
+ vertices.push({ x: x1, y: y1 });
1175
+ } else {
1176
+ retval += ` L ${x} ${y}`;
1177
+ }
1178
+ vertices.push({ x, y });
1179
+ }
1180
+ if (isStar) {
1181
+ const innerRadius = apothem * (1 - starIndent);
1182
+ const angle2 = 2 * Math.PI - theta2, x1 = center.x + Math.sin(angle2) * innerRadius, y1 = center.y - Math.cos(angle2) * innerRadius;
1183
+ retval += ` L ${x1} ${y1}`;
1184
+ vertices.push({ x: x1, y: y1 });
1185
+ }
1186
+ vertices.push(p0);
1187
+ const width = radius * 2;
1188
+ return {
1189
+ pathData: retval + " Z",
1190
+ vertices,
1191
+ boundingRect: { x: p0.x - radius, y: p0.y, width, height: width }
1192
+ };
1193
+ }
1194
+ static getPathData(center, radius, sides, starIndent = 0) {
1195
+ const { pathData } = PacemPolygonElement_1.getShapeGeometry(center, radius, sides, starIndent);
1196
+ return pathData;
1197
+ }
1198
+ };
1199
+ __decorate9([
1200
+ Watch9({ emit: false, converter: PropertyConverters8.Number })
1201
+ ], PacemPolygonElement.prototype, "sides", void 0);
1202
+ __decorate9([
1203
+ Watch9({ emit: false, converter: PropertyConverters8.Number })
1204
+ ], PacemPolygonElement.prototype, "radius", void 0);
1205
+ __decorate9([
1206
+ Watch9({ emit: false, converter: PropertyConverters8.Point })
1207
+ ], PacemPolygonElement.prototype, "center", void 0);
1208
+ __decorate9([
1209
+ Watch9({ emit: false, converter: PropertyConverters8.Number })
1210
+ ], PacemPolygonElement.prototype, "starIndent", void 0);
1211
+ PacemPolygonElement = PacemPolygonElement_1 = __decorate9([
1212
+ CustomElement7({ tagName: P7 + "-" + TAG_MIDDLE_NAME + "-polygon" })
1213
+ ], PacemPolygonElement);
1214
+
1215
+ // packages/2d/dist/esm/polyline.js
1216
+ import { CustomElement as CustomElement8, Watch as Watch10, PropertyConverters as PropertyConverters9, P as P8, Utils as Utils9 } from "@pacem/pacem-core";
1217
+ import { parseAsNumericalArray } from "@pacem/pacem-foundation";
1218
+ var __decorate10 = function(decorators, target, key, desc) {
1219
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1220
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1221
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1222
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1223
+ };
1224
+ var PacemPolylineElement_1;
1225
+ var PointArrayOrJsonConverter = {
1226
+ convert: (attr) => {
1227
+ const arr = parseAsNumericalArray(attr);
1228
+ if (arr.length % 2 === 0) {
1229
+ const retval = [];
1230
+ for (let j = 0; j < arr.length; j += 2) {
1231
+ retval.push({ x: arr[j], y: arr[j + 1] });
1232
+ }
1233
+ return retval;
1234
+ }
1235
+ return JSON.parse(attr);
1236
+ },
1237
+ convertBack: (prop) => JSON.stringify(prop)
1238
+ };
1239
+ var PacemPolylineElement = PacemPolylineElement_1 = class PacemPolylineElement2 extends ShapeElement {
1240
+ propertyChangedCallback(name, old, val, first) {
1241
+ super.propertyChangedCallback(name, old, val, first);
1242
+ if (!first) {
1243
+ switch (name) {
1244
+ case "points":
1245
+ case "closed":
1246
+ this.recomputeShape();
1247
+ break;
1248
+ }
1249
+ }
1250
+ }
1251
+ static getShapeGeometry(points, closed) {
1252
+ if (Utils9.isNullOrEmpty(points)) {
1253
+ return Shape.empty();
1254
+ }
1255
+ let d = "";
1256
+ let xmin = Number.MAX_VALUE, ymin = Number.MAX_VALUE, xmax = Number.MIN_VALUE, ymax = Number.MIN_VALUE;
1257
+ for (let j = 0; j < points.length; j++) {
1258
+ const { x, y } = points[j];
1259
+ d += `${j === 0 ? "M" : "L"} ${x} ${y} `;
1260
+ xmin = Math.min(xmin, x);
1261
+ xmax = Math.max(xmax, x);
1262
+ ymin = Math.min(ymin, y);
1263
+ ymax = Math.max(ymax, y);
1264
+ }
1265
+ const boundingRect = { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin };
1266
+ if (closed) {
1267
+ d += "Z";
1268
+ }
1269
+ return { pathData: d, vertices: points, boundingRect };
1270
+ }
1271
+ getShapeGeometry() {
1272
+ return PacemPolylineElement_1.getShapeGeometry(this.points, this.closed);
1273
+ }
1274
+ getPathData() {
1275
+ const { pathData } = this.getShapeGeometry();
1276
+ return pathData;
1277
+ }
1278
+ static getPathData(points, closed) {
1279
+ const { pathData } = PacemPolylineElement_1.getShapeGeometry(points, closed);
1280
+ return pathData;
1281
+ }
1282
+ };
1283
+ __decorate10([
1284
+ Watch10({ emit: false, converter: PointArrayOrJsonConverter })
1285
+ ], PacemPolylineElement.prototype, "points", void 0);
1286
+ __decorate10([
1287
+ Watch10({ emit: false, converter: PropertyConverters9.Boolean })
1288
+ ], PacemPolylineElement.prototype, "closed", void 0);
1289
+ PacemPolylineElement = PacemPolylineElement_1 = __decorate10([
1290
+ CustomElement8({ tagName: P8 + "-" + TAG_MIDDLE_NAME + "-polyline" })
1291
+ ], PacemPolylineElement);
1292
+
1293
+ // packages/2d/dist/esm/image.js
1294
+ import { CustomElement as CustomElement9, Watch as Watch11, PropertyConverters as PropertyConverters10, P as P9 } from "@pacem/pacem-core";
1295
+ var __decorate11 = function(decorators, target, key, desc) {
1296
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1297
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1298
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1299
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1300
+ };
1301
+ var PacemImageElement = class PacemImageElement2 extends UiElement {
1302
+ propertyChangedCallback(name, old, val, first) {
1303
+ super.propertyChangedCallback(name, old, val, first);
1304
+ if (!first) {
1305
+ switch (name) {
1306
+ case "src":
1307
+ case "x":
1308
+ case "y":
1309
+ case "width":
1310
+ case "height":
1311
+ this.stage?.draw(this);
1312
+ break;
1313
+ }
1314
+ }
1315
+ }
1316
+ };
1317
+ __decorate11([
1318
+ Watch11({ emit: false, converter: PropertyConverters10.String })
1319
+ ], PacemImageElement.prototype, "src", void 0);
1320
+ __decorate11([
1321
+ Watch11({ emit: false, converter: PropertyConverters10.Number })
1322
+ ], PacemImageElement.prototype, "x", void 0);
1323
+ __decorate11([
1324
+ Watch11({ emit: false, converter: PropertyConverters10.Number })
1325
+ ], PacemImageElement.prototype, "y", void 0);
1326
+ __decorate11([
1327
+ Watch11({ emit: false, converter: PropertyConverters10.Number })
1328
+ ], PacemImageElement.prototype, "width", void 0);
1329
+ __decorate11([
1330
+ Watch11({ emit: false, converter: PropertyConverters10.Number })
1331
+ ], PacemImageElement.prototype, "height", void 0);
1332
+ PacemImageElement = __decorate11([
1333
+ CustomElement9({ tagName: P9 + "-" + TAG_MIDDLE_NAME + "-image" })
1334
+ ], PacemImageElement);
1335
+
1336
+ // packages/2d/dist/esm/text.js
1337
+ import { CustomElement as CustomElement10, Watch as Watch12, PropertyConverters as PropertyConverters11, P as P10, Utils as Utils10 } from "@pacem/pacem-core";
1338
+ var __decorate12 = function(decorators, target, key, desc) {
1339
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1340
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1341
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1342
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1343
+ };
1344
+ var PacemTextElement = class PacemTextElement2 extends UiElement {
1345
+ propertyChangedCallback(name, old, val, first) {
1346
+ if (!first) {
1347
+ switch (name) {
1348
+ case "text":
1349
+ case "color":
1350
+ case "fontFamily":
1351
+ case "fontSize":
1352
+ case "fontWeight":
1353
+ case "fontStyle":
1354
+ case "anchor":
1355
+ if (!Utils10.isNull(this.stage)) {
1356
+ this.stage.draw(this);
1357
+ }
1358
+ break;
1359
+ }
1360
+ }
1361
+ }
1362
+ };
1363
+ __decorate12([
1364
+ Watch12({ emit: false, converter: PropertyConverters11.String })
1365
+ ], PacemTextElement.prototype, "text", void 0);
1366
+ __decorate12([
1367
+ Watch12({ emit: false, converter: PropertyConverters11.String })
1368
+ ], PacemTextElement.prototype, "color", void 0);
1369
+ __decorate12([
1370
+ Watch12({ emit: false, converter: PropertyConverters11.String })
1371
+ ], PacemTextElement.prototype, "fontFamily", void 0);
1372
+ __decorate12([
1373
+ Watch12({ emit: false, converter: PropertyConverters11.Number })
1374
+ ], PacemTextElement.prototype, "fontSize", void 0);
1375
+ __decorate12([
1376
+ Watch12({ emit: false, converter: PropertyConverters11.String })
1377
+ ], PacemTextElement.prototype, "fontWeight", void 0);
1378
+ __decorate12([
1379
+ Watch12({ emit: false, converter: PropertyConverters11.String })
1380
+ ], PacemTextElement.prototype, "fontStyle", void 0);
1381
+ __decorate12([
1382
+ Watch12({ emit: false, converter: PropertyConverters11.Point })
1383
+ ], PacemTextElement.prototype, "anchor", void 0);
1384
+ __decorate12([
1385
+ Watch12({ emit: false, converter: PropertyConverters11.String })
1386
+ ], PacemTextElement.prototype, "textAnchor", void 0);
1387
+ PacemTextElement = __decorate12([
1388
+ CustomElement10({ tagName: P10 + "-" + TAG_MIDDLE_NAME + "-text" })
1389
+ ], PacemTextElement);
1390
+
1391
+ // packages/2d/dist/esm/adapters/utils.js
1392
+ import { Utils as Utils11, UI } from "@pacem/pacem-core";
1393
+ import { Rect as Rect3 } from "@pacem/pacem-foundation";
1394
+ var AdapterUtils = class {
1395
+ static stageDispatch(stage, type, evt) {
1396
+ if (stage instanceof EventTarget) {
1397
+ stage.dispatchEvent(new StageEvent("stage" + type, stage, evt, stage.transformMatrix));
1398
+ }
1399
+ }
1400
+ static isValidViewbox(viewbox) {
1401
+ return !Utils11.isNullOrEmpty(viewbox) && Rect3.isRect(viewbox) && Number.isFinite(viewbox.x) && Number.isFinite(viewbox.y) && Number.isFinite(viewbox.width) && Number.isFinite(viewbox.height);
1402
+ }
1403
+ static itemDispatch(target, type, offset) {
1404
+ if (Utils11.isNull(target?.stage)) {
1405
+ return false;
1406
+ }
1407
+ var dragArgs, originalEvent, evtType;
1408
+ if (offset instanceof Event) {
1409
+ originalEvent = offset;
1410
+ } else {
1411
+ dragArgs = { item: target, offset };
1412
+ }
1413
+ if (typeof type === "string") {
1414
+ evtType = type;
1415
+ } else {
1416
+ evtType = type.type;
1417
+ originalEvent = type.originalEvent;
1418
+ }
1419
+ const m = target.stage.transformMatrix;
1420
+ const evt = () => offset instanceof Event ? new DrawableEvent(evtType, target, originalEvent, m) : new DragEvent(evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m);
1421
+ const itemevt = offset instanceof Event ? new DrawableEvent("item" + evtType, target, originalEvent, m) : new DragEvent("item" + evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m);
1422
+ var prevent = false;
1423
+ if (target instanceof EventTarget) {
1424
+ const evnt = evt();
1425
+ target.dispatchEvent(evnt);
1426
+ prevent = evnt.defaultPrevented;
1427
+ }
1428
+ target.stage.dispatchEvent(itemevt);
1429
+ return prevent || itemevt.defaultPrevented;
1430
+ }
1431
+ };
1432
+
1433
+ // packages/2d/dist/esm/adapters/canvasadapter.js
1434
+ import { CustomElement as CustomElement11, P as P11, CustomElementUtils as CustomElementUtils2, Utils as Utils13, Logging, CustomEventUtils as CustomEventUtils2, UI as UI2, avoidHandler as avoidHandler2 } from "@pacem/pacem-core";
1435
+ import { Matrix2D as Matrix2D4, Rect as Rect4 } from "@pacem/pacem-foundation";
1436
+
1437
+ // packages/2d/dist/esm/adapter.js
1438
+ import { PacemEventTarget, Utils as Utils12 } from "@pacem/pacem-core";
1439
+ var JPEG_QUALITY = 0.9;
1440
+ var Pacem2DAdapterElement = class extends PacemEventTarget {
1441
+ constructor() {
1442
+ super(...arguments);
1443
+ this.DefaultShapeValues = {
1444
+ stroke: "#000",
1445
+ lineWidth: 1,
1446
+ fill: "#fff"
1447
+ };
1448
+ }
1449
+ snapshotElement(element, bgColor, type, quality) {
1450
+ const jpeg = !Utils12.isNullOrEmpty(bgColor), mime = type ?? (jpeg ? "image/jpeg" : null), compression = quality ?? (jpeg ? JPEG_QUALITY : null);
1451
+ return Utils12.snapshotElement(element, bgColor, mime, compression);
1452
+ }
1453
+ };
1454
+
1455
+ // packages/2d/dist/esm/adapters/canvasadapter.js
1456
+ var __decorate13 = function(decorators, target, key, desc) {
1457
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1458
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1459
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1460
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1461
+ };
1462
+ var CANVAS_SCENE_VAR = "pacem:2d-canvas-scene";
1463
+ var PARENT_MATRIX_VAR = "pacem:2d-parent-matrix";
1464
+ var WORLD_MATRIX_VAR = "pacem:2d-world-matrix";
1465
+ var SETVAR = CustomElementUtils2.setAttachedPropertyValue;
1466
+ var GETVAR = CustomElementUtils2.getAttachedPropertyValue;
1467
+ function isNone(fillOrStroke) {
1468
+ return fillOrStroke === "none" || Utils13.isNullOrEmpty(fillOrStroke);
1469
+ }
1470
+ function fallback(v, f) {
1471
+ return Utils13.isNull(v) ? f : v;
1472
+ }
1473
+ var PacemCanvasAdapterElement = class PacemCanvasAdapterElement2 extends Pacem2DAdapterElement {
1474
+ constructor() {
1475
+ super(...arguments);
1476
+ this._pointer = {
1477
+ page: { x: Number.NaN, y: Number.NaN },
1478
+ screen: { x: Number.NaN, y: Number.NaN },
1479
+ client: { x: Number.NaN, y: Number.NaN }
1480
+ };
1481
+ this._dragInitHandler = (evt) => {
1482
+ const hitTarget = this._hitTarget;
1483
+ if (Utils13.isNull(hitTarget) || !isUiObject(hitTarget) || !hitTarget.draggable) {
1484
+ evt.preventDefault();
1485
+ return;
1486
+ }
1487
+ const args = evt.detail, drawable = hitTarget, initialMatrix = hitTarget.transformMatrix ?? Matrix2D4.identity, parentMatrix = GETVAR(hitTarget, PARENT_MATRIX_VAR, Matrix2D4.identity);
1488
+ args.data = {
1489
+ item: drawable,
1490
+ initialTransformMatrix: initialMatrix,
1491
+ parentMatrix
1492
+ };
1493
+ const reject = AdapterUtils.itemDispatch(drawable, evt, { x: 0, y: 0 });
1494
+ if (reject) {
1495
+ evt.preventDefault();
1496
+ }
1497
+ };
1498
+ this._draggingHandler = (evt) => {
1499
+ avoidHandler2(evt);
1500
+ this._dragging = true;
1501
+ const args = evt.detail;
1502
+ const data = args.data;
1503
+ const screenOffset = { x: args.currentPosition.x - args.origin.x, y: args.currentPosition.y - args.origin.y };
1504
+ const offset = {
1505
+ x: screenOffset.x * data.parentMatrix.a + data.initialTransformMatrix.e,
1506
+ y: screenOffset.y * data.parentMatrix.d + data.initialTransformMatrix.f
1507
+ };
1508
+ const stageTransformMatrix = data.item.stage.transformMatrix;
1509
+ const rejected = AdapterUtils.itemDispatch(data.item, evt, { x: screenOffset.x * stageTransformMatrix.a + stageTransformMatrix.e, y: screenOffset.y * stageTransformMatrix.d + stageTransformMatrix.f });
1510
+ if (!rejected) {
1511
+ if (data.item instanceof UiElement) {
1512
+ data.item.translateX = offset.x;
1513
+ data.item.translateY = offset.y;
1514
+ } else {
1515
+ const init = data.initialTransformMatrix, actual = { a: init.a, b: init.b, c: init.c, d: init.d, e: offset.x, f: offset.y };
1516
+ Utils13.extend(data.item, { transformMatrix: actual });
1517
+ }
1518
+ }
1519
+ };
1520
+ this._dragEndHandler = (evt) => {
1521
+ this._dragging = false;
1522
+ const args = evt.detail, data = args.data, transform = data.item.transformMatrix;
1523
+ AdapterUtils.itemDispatch(data.item, evt, { x: transform.e, y: transform.f });
1524
+ };
1525
+ this._mouseleaveHandler = (evt) => {
1526
+ if (this._dragging) {
1527
+ return;
1528
+ }
1529
+ const hitTarget = this._hitTarget;
1530
+ if (Utils13.isNull(hitTarget)) {
1531
+ return;
1532
+ }
1533
+ this._scopeEvent = evt;
1534
+ const nap = { x: Number.NaN, y: Number.NaN };
1535
+ this._pointer = { page: nap, screen: nap, client: nap };
1536
+ const canvas = evt.srcElement;
1537
+ const stage = GETVAR(canvas, CANVAS_SCENE_VAR);
1538
+ this._requestDraw(stage);
1539
+ };
1540
+ this._mousemoveHandler = (evt) => {
1541
+ this._scopeEvent = evt;
1542
+ this._pointer = CustomEventUtils2.getEventCoordinates(evt);
1543
+ const canvas = evt.srcElement;
1544
+ const stage = GETVAR(canvas, CANVAS_SCENE_VAR);
1545
+ this._requestDraw(stage);
1546
+ if (!this._dragging) {
1547
+ if (!Utils13.isNull(this._hitTarget)) {
1548
+ AdapterUtils.stageDispatch(stage, "move", evt);
1549
+ }
1550
+ }
1551
+ };
1552
+ this._mouseDownUpHandler = (evt) => {
1553
+ this._scopeEvent = evt;
1554
+ this._pointer = CustomEventUtils2.getEventCoordinates(evt);
1555
+ const canvas = evt.target;
1556
+ if (canvas instanceof HTMLCanvasElement) {
1557
+ const stage = GETVAR(canvas, CANVAS_SCENE_VAR), hitTarget = this._hitTarget;
1558
+ const type = evt.type.replace(/^(mouse|touch)/, ""), fineType = type === "end" ? "click" : type;
1559
+ const opts = getStageOptions(stage);
1560
+ if (CustomEventUtils2.matchModifiers(evt, opts.clickModifiers)) {
1561
+ if (!Utils13.isNull(hitTarget) && hitTarget.stage === stage) {
1562
+ AdapterUtils.itemDispatch(hitTarget, fineType, evt);
1563
+ } else {
1564
+ AdapterUtils.stageDispatch(stage, fineType, evt);
1565
+ }
1566
+ }
1567
+ }
1568
+ };
1569
+ this._scenes = /* @__PURE__ */ new WeakMap();
1570
+ this._handles = /* @__PURE__ */ new WeakMap();
1571
+ }
1572
+ snapshot(stage, backgroundColor, type, quality) {
1573
+ const scenes = this._scenes;
1574
+ if (scenes.has(stage)) {
1575
+ const ctx2d = scenes.get(stage).context, srcCanvas = ctx2d.canvas;
1576
+ return this.snapshotElement(srcCanvas, backgroundColor, type, quality);
1577
+ } else {
1578
+ return Promise.resolve(null);
1579
+ }
1580
+ }
1581
+ getCanvas(stage) {
1582
+ const scenes = this._scenes;
1583
+ if (scenes.has(stage)) {
1584
+ const ctx2d = scenes.get(stage).context;
1585
+ return ctx2d.canvas;
1586
+ } else {
1587
+ return null;
1588
+ }
1589
+ }
1590
+ _getScreenInverseMatrix(m, offset) {
1591
+ return Matrix2D4.invert({ a: m.a, b: m.b, c: m.c, d: m.d, e: m.e + offset.x, f: m.f + offset.y });
1592
+ }
1593
+ getTransformMatrix(scene) {
1594
+ const scenes = this._scenes;
1595
+ if (scenes.has(scene)) {
1596
+ return scenes.get(scene).screenInverseMatrix;
1597
+ }
1598
+ return Matrix2D4.identity;
1599
+ }
1600
+ #dragger;
1601
+ viewActivatedCallback() {
1602
+ super.viewActivatedCallback();
1603
+ const dragDrop = this.#dragger = document.createElement(P11 + "-drag-drop");
1604
+ dragDrop.mode = UI2.DragDataMode.Copy;
1605
+ dragDrop.dropBehavior = UI2.DropBehavior.None;
1606
+ dragDrop.spillBehavior = UI2.DropTargetMissedBehavior.None;
1607
+ const floater = document.createElement("div");
1608
+ floater.hidden = true;
1609
+ dragDrop.floater = floater;
1610
+ const shell = CustomElementUtils2.findAncestorShell(this);
1611
+ shell.appendChild(dragDrop);
1612
+ dragDrop.addEventListener(UI2.DragDropEventType.Init, this._dragInitHandler, false);
1613
+ dragDrop.addEventListener(UI2.DragDropEventType.Drag, this._draggingHandler, false);
1614
+ dragDrop.addEventListener(UI2.DragDropEventType.End, this._dragEndHandler, false);
1615
+ }
1616
+ disconnectedCallback() {
1617
+ const dragger = this.#dragger;
1618
+ if (!Utils13.isNull(dragger)) {
1619
+ dragger.removeEventListener(UI2.DragDropEventType.Init, this._dragInitHandler, false);
1620
+ dragger.removeEventListener(UI2.DragDropEventType.Drag, this._draggingHandler, false);
1621
+ dragger.removeEventListener(UI2.DragDropEventType.End, this._dragEndHandler, false);
1622
+ dragger.remove();
1623
+ }
1624
+ super.disconnectedCallback();
1625
+ }
1626
+ invalidateSize(scene, size) {
1627
+ const scenes = this._scenes;
1628
+ if (!Utils13.isNull(scene) && !Utils13.isNullOrEmpty(size)) {
1629
+ if (scenes.has(scene)) {
1630
+ const tuple = scenes.get(scene), ctx = tuple.context;
1631
+ ctx.canvas.width = size.width;
1632
+ ctx.canvas.height = size.height;
1633
+ const offset = tuple.offset = Utils13.offsetRect(ctx.canvas);
1634
+ const stage = { x: 0, y: 0, width: size.width, height: size.height }, aspectRatio = scene.aspectRatio, viewbox = scene.viewbox;
1635
+ if (AdapterUtils.isValidViewbox(viewbox)) {
1636
+ let mode = "contain", align = "center", valign = "middle";
1637
+ if (typeof aspectRatio === "object") {
1638
+ mode = aspectRatio.slice ? "cover" : "contain";
1639
+ switch (aspectRatio.x) {
1640
+ case "min":
1641
+ align = "left";
1642
+ break;
1643
+ case "max":
1644
+ align = "right";
1645
+ break;
1646
+ }
1647
+ switch (aspectRatio.y) {
1648
+ case "min":
1649
+ valign = "top";
1650
+ break;
1651
+ case "max":
1652
+ valign = "bottom";
1653
+ break;
1654
+ }
1655
+ }
1656
+ ;
1657
+ const mscale = Rect4.findTransform({ x: 0, y: 0, width: viewbox.width, height: viewbox.height }, stage, mode, align, valign);
1658
+ const m = Matrix2D4.translate(mscale, { x: -mscale.a * viewbox.x, y: -mscale.a * viewbox.y });
1659
+ tuple.transformMatrix = m;
1660
+ tuple.screenInverseMatrix = this._getScreenInverseMatrix(m, offset);
1661
+ } else {
1662
+ tuple.transformMatrix = Matrix2D4.identity;
1663
+ }
1664
+ }
1665
+ }
1666
+ this._requestDraw(scene);
1667
+ }
1668
+ getHitTarget(stage) {
1669
+ const target = this._hitTarget;
1670
+ if (!Utils13.isNull(target) && target.stage === stage) {
1671
+ return target;
1672
+ }
1673
+ return null;
1674
+ }
1675
+ initialize(scene) {
1676
+ if (Utils13.isNull(scene)) {
1677
+ throw "Provided scene is null or undefined.";
1678
+ }
1679
+ const scenes = this._scenes;
1680
+ const dragger = this.#dragger;
1681
+ if (scenes.has(scene)) {
1682
+ const canvas2 = scenes.get(scene).context.canvas;
1683
+ if (!Utils13.isNull(dragger)) {
1684
+ dragger.register(canvas2);
1685
+ }
1686
+ return canvas2;
1687
+ }
1688
+ const stage = scene.stage;
1689
+ stage.innerHTML = "";
1690
+ const canvas = document.createElement("canvas");
1691
+ canvas.setAttribute("part", "stage");
1692
+ SETVAR(canvas, CANVAS_SCENE_VAR, scene);
1693
+ const context = canvas.getContext("2d");
1694
+ canvas.addEventListener("mousemove", this._mousemoveHandler, false);
1695
+ canvas.addEventListener("mouseleave", this._mouseleaveHandler, false);
1696
+ canvas.addEventListener("touchstart", this._mouseDownUpHandler, { passive: true });
1697
+ canvas.addEventListener("touchmove", this._mouseDownUpHandler, { passive: true });
1698
+ canvas.addEventListener("touchend", this._mouseDownUpHandler, { passive: true });
1699
+ canvas.addEventListener("click", this._mouseDownUpHandler, false);
1700
+ canvas.addEventListener("mousedown", this._mouseDownUpHandler, false);
1701
+ canvas.addEventListener("mouseup", this._mouseDownUpHandler, false);
1702
+ stage.appendChild(canvas);
1703
+ scenes.set(scene, { context, transformMatrix: Matrix2D4.identity, offset: Utils13.offsetRect(canvas), screenInverseMatrix: Matrix2D4.identity });
1704
+ if (!Utils13.isNull(dragger)) {
1705
+ dragger.register(canvas);
1706
+ }
1707
+ return canvas;
1708
+ }
1709
+ dispose(scene) {
1710
+ const scenes = this._scenes;
1711
+ if (scenes.has(scene)) {
1712
+ var tuple = scenes.get(scene), context = tuple.context, canvas = context.canvas;
1713
+ const dragger = this.#dragger;
1714
+ if (!Utils13.isNull(dragger)) {
1715
+ dragger.unregister(canvas);
1716
+ }
1717
+ canvas.removeEventListener("click", this._mouseDownUpHandler, false);
1718
+ canvas.removeEventListener("touchend", this._mouseDownUpHandler, false);
1719
+ canvas.removeEventListener("mousedown", this._mouseDownUpHandler, false);
1720
+ canvas.removeEventListener("mouseup", this._mouseDownUpHandler, false);
1721
+ canvas.removeEventListener("touchstart", this._mouseDownUpHandler);
1722
+ canvas.removeEventListener("mouseleave", this._mouseleaveHandler, false);
1723
+ canvas.removeEventListener("mousemove", this._mousemoveHandler, false);
1724
+ canvas.remove();
1725
+ scenes.delete(scene);
1726
+ }
1727
+ }
1728
+ _requestDraw(scene) {
1729
+ const handles = this._handles;
1730
+ if (handles.has(scene)) {
1731
+ cancelAnimationFrame(handles.get(scene));
1732
+ }
1733
+ const throttle = () => {
1734
+ this.draw(scene);
1735
+ return requestAnimationFrame(() => {
1736
+ });
1737
+ };
1738
+ handles.set(scene, throttle());
1739
+ }
1740
+ #canvasCssStyle;
1741
+ draw(scene) {
1742
+ const scenes = this._scenes, handles = this._handles;
1743
+ if (!Utils13.isNull(scene)) {
1744
+ if (scene.adapter !== this) {
1745
+ if (scenes.has(scene)) {
1746
+ scenes.delete(scene);
1747
+ handles.get(scene);
1748
+ }
1749
+ return;
1750
+ }
1751
+ if (!scenes.has(scene)) {
1752
+ this.initialize(scene);
1753
+ return;
1754
+ }
1755
+ if (handles.has(scene)) {
1756
+ cancelAnimationFrame(handles.get(scene));
1757
+ }
1758
+ const formerHitTarget = this._hitTarget;
1759
+ const items = scene.datasource || [];
1760
+ this._hitTarget = null;
1761
+ const tuple = scenes.get(scene), context = tuple.context, canvas = context.canvas;
1762
+ this.#canvasCssStyle = getComputedStyle(canvas);
1763
+ context.resetTransform();
1764
+ context.clearRect(0, 0, canvas.width, canvas.height);
1765
+ const m = tuple.transformMatrix;
1766
+ context.setTransform(m);
1767
+ const pointer = this._pointer, offset = tuple.offset, point = Number.isNaN(pointer.page.x) || Number.isNaN(pointer.page.y) ? null : { x: pointer.page.x - offset.x, y: pointer.page.y - offset.y };
1768
+ for (let drawable of items) {
1769
+ this._draw(scene, context, drawable, { transformMatrix: m }, point);
1770
+ }
1771
+ const currentHitTarget = this._hitTarget;
1772
+ if (currentHitTarget != formerHitTarget) {
1773
+ if (!Utils13.isNull(formerHitTarget)) {
1774
+ if (formerHitTarget instanceof Element) {
1775
+ formerHitTarget.dispatchEvent(new DrawableEvent("out", formerHitTarget, this._scopeEvent, m));
1776
+ }
1777
+ scene.dispatchEvent(new DrawableEvent("itemout", formerHitTarget, this._scopeEvent, m));
1778
+ }
1779
+ if (!Utils13.isNull(currentHitTarget)) {
1780
+ if (currentHitTarget instanceof Element) {
1781
+ currentHitTarget.dispatchEvent(new DrawableEvent("over", currentHitTarget, this._scopeEvent, m));
1782
+ }
1783
+ scene.dispatchEvent(new DrawableEvent("itemover", currentHitTarget, this._scopeEvent, m));
1784
+ }
1785
+ }
1786
+ }
1787
+ }
1788
+ _draw(scene, ctx, item, state, point) {
1789
+ item.stage ??= scene;
1790
+ if (isDrawable(item)) {
1791
+ if (item.hide) {
1792
+ return;
1793
+ }
1794
+ }
1795
+ if (isUiObject(item) && item.draggable && !item.hide && !item.inert) {
1796
+ SETVAR(item, PARENT_MATRIX_VAR, ctx.getTransform().inverse());
1797
+ }
1798
+ let t;
1799
+ if (isUiObject(item)) {
1800
+ t = item.transformMatrix;
1801
+ if (!Utils13.isNull(t) && !Matrix2D4.isIdentity(t)) {
1802
+ ctx.transform(t.a, t.b, t.c, t.d, t.e, t.f);
1803
+ }
1804
+ }
1805
+ let contextPresentationState = state;
1806
+ if (isPresentationObject(item)) {
1807
+ contextPresentationState = PresentationState.combine(item, state, ctx.getTransform());
1808
+ this._setPresentationState(ctx, contextPresentationState);
1809
+ }
1810
+ if (isShape(item) || item instanceof ShapeElement) {
1811
+ this._drawShape(ctx, item, point);
1812
+ } else if (isText(item) || item instanceof PacemTextElement) {
1813
+ this._drawText(ctx, item, point);
1814
+ } else if (isImage(item) || item instanceof PacemImageElement) {
1815
+ this._drawImage(ctx, item, point);
1816
+ } else if (isGroup(item) || item instanceof PacemGroupElement) {
1817
+ for (let child of item.childDrawables || []) {
1818
+ this._draw(scene, ctx, child, contextPresentationState, point);
1819
+ }
1820
+ }
1821
+ if (isUiObject(item) && item.draggable && !item.hide && !item.inert) {
1822
+ SETVAR(item, WORLD_MATRIX_VAR, ctx.getTransform().inverse());
1823
+ }
1824
+ this._setPresentationState(ctx, state);
1825
+ }
1826
+ _setPresentationState(ctx, item) {
1827
+ ctx.setTransform(item.transformMatrix);
1828
+ if (!Utils13.isNullOrEmpty(item.stroke) && !isNone(item.stroke)) {
1829
+ ctx.strokeStyle = item.stroke;
1830
+ } else {
1831
+ ctx.strokeStyle = "transparent";
1832
+ }
1833
+ if (!Utils13.isNullOrEmpty(item.lineWidth)) {
1834
+ ctx.lineWidth = item.lineWidth;
1835
+ } else {
1836
+ ctx.lineWidth = 0;
1837
+ }
1838
+ if (!Utils13.isNullOrEmpty(item.dashArray)) {
1839
+ ctx.setLineDash(item.dashArray);
1840
+ } else {
1841
+ ctx.setLineDash([]);
1842
+ }
1843
+ if (!Utils13.isNullOrEmpty(item.lineCap)) {
1844
+ ctx.lineCap = item.lineCap;
1845
+ } else {
1846
+ ctx.lineCap = "butt";
1847
+ }
1848
+ if (!Utils13.isNullOrEmpty(item.lineJoin)) {
1849
+ ctx.lineJoin = item.lineJoin;
1850
+ } else {
1851
+ ctx.lineJoin = "miter";
1852
+ }
1853
+ if (typeof item.fill === "object" && !Utils13.isNullOrEmpty(item.fill)) {
1854
+ const { stops } = item.fill;
1855
+ let gradient;
1856
+ if (isLinearGradient(item.fill)) {
1857
+ const { start, end } = item.fill;
1858
+ gradient = ctx.createLinearGradient(start.x, start.y, end.x, end.y);
1859
+ } else if (isRadialGradient(item.fill)) {
1860
+ const { center, radius } = item.fill;
1861
+ gradient = ctx.createRadialGradient(center.x, center.y, radius, center.x, center.y, radius);
1862
+ } else {
1863
+ throw new Error("Unmanaged gradient type.");
1864
+ }
1865
+ for (let stop of stops) {
1866
+ gradient.addColorStop(stop.offset, stop.color);
1867
+ }
1868
+ ctx.fillStyle = gradient;
1869
+ } else if (!Utils13.isNullOrEmpty(item.fill) && typeof item.fill === "string" && !isNone(item.fill)) {
1870
+ ctx.fillStyle = item.fill;
1871
+ } else {
1872
+ ctx.fillStyle = "transparent";
1873
+ }
1874
+ if (!Utils13.isNullOrEmpty(item.opacity)) {
1875
+ ctx.globalAlpha = item.opacity;
1876
+ } else {
1877
+ ctx.globalAlpha = 1;
1878
+ }
1879
+ }
1880
+ _drawImage(ctx, item, point) {
1881
+ const CANVAS_IMAGESOURCE_VAR = "pacem:2d-canvas-imagesrc";
1882
+ let img = GETVAR(item, CANVAS_IMAGESOURCE_VAR);
1883
+ const imgLoadHandler = () => {
1884
+ let dw = img.naturalWidth, dh = img.naturalHeight, w = item.width, h = item.height;
1885
+ if (w > 0 && h > 0) {
1886
+ } else if (w > 0) {
1887
+ h = dh * w / dw;
1888
+ } else if (h > 0) {
1889
+ w = dw * h / dh;
1890
+ } else {
1891
+ w = dw;
1892
+ h = dh;
1893
+ }
1894
+ if (!this._dragging && !item.inert && !Utils13.isNull(point)) {
1895
+ const path2D = new Path2D(`M ${item.x} ${item.y} h ${w} v ${h} H ${item.x} Z`);
1896
+ if (ctx.isPointInPath(path2D, point.x, point.y)) {
1897
+ this._hitTarget = item;
1898
+ }
1899
+ }
1900
+ ctx.globalAlpha = fallback(item.opacity, 1);
1901
+ ctx.drawImage(img, item.x, item.y, w, h);
1902
+ };
1903
+ if (Utils13.isNull(img)) {
1904
+ img = new Image();
1905
+ img.src = item.src;
1906
+ img.onload = () => {
1907
+ SETVAR(item, CANVAS_IMAGESOURCE_VAR, img);
1908
+ imgLoadHandler();
1909
+ };
1910
+ } else {
1911
+ imgLoadHandler();
1912
+ }
1913
+ }
1914
+ _drawText(ctx, item, point) {
1915
+ const defaults = this.DefaultShapeValues;
1916
+ const color = ctx.fillStyle = fallback(item.color, defaults.stroke);
1917
+ const m = ctx.getTransform(), fontSize = item.fontSize > 0 ? `${item.fontSize}px` : this.#canvasCssStyle.fontSize, fontStyle = item.fontStyle || this.#canvasCssStyle.fontStyle, fontWeight = item.fontWeight || this.#canvasCssStyle.fontWeight;
1918
+ ctx.font = `${fontStyle} ${fontWeight} ${fontSize} ${item.fontFamily ?? this.#canvasCssStyle.fontFamily}`;
1919
+ ctx.textAlign = item.textAnchor === "middle" ? "center" : item.textAnchor;
1920
+ ctx.fillText(item.text, item.anchor.x, item.anchor.y);
1921
+ ctx.globalAlpha = fallback(item.opacity, 1);
1922
+ const hasColor = !isNone(color);
1923
+ if (!this._dragging && !item.inert && !Utils13.isNull(point)) {
1924
+ const bbox = ctx.measureText(item.text);
1925
+ const width = bbox.width, height = bbox.actualBoundingBoxAscent + bbox.actualBoundingBoxDescent, x = item.anchor.x - bbox.actualBoundingBoxLeft, y = item.anchor.y - bbox.actualBoundingBoxAscent;
1926
+ const path2D = new Path2D(`M ${x} ${y} h ${width} v ${height} H ${x} z`);
1927
+ if (hasColor && ctx.isPointInPath(path2D, point.x, point.y)) {
1928
+ this._hitTarget = item;
1929
+ }
1930
+ }
1931
+ }
1932
+ _drawShape(ctx, item, point) {
1933
+ if (Utils13.isNullOrEmpty(item?.pathData)) {
1934
+ return;
1935
+ }
1936
+ ctx.beginPath();
1937
+ const hasFill = typeof ctx.fillStyle !== "string" || !isNone(ctx.fillStyle), hasStroke = typeof ctx.strokeStyle !== "string" || !isNone(ctx.strokeStyle);
1938
+ var path2D = new Path2D(item.pathData);
1939
+ if (!this._dragging && !item.inert && !Utils13.isNull(point)) {
1940
+ if (hasFill && ctx.isPointInPath(path2D, point.x, point.y) || hasStroke && ctx.isPointInStroke(path2D, point.x, point.y)) {
1941
+ this._hitTarget = item;
1942
+ }
1943
+ }
1944
+ if (hasStroke) {
1945
+ ctx.stroke(path2D);
1946
+ }
1947
+ if (hasFill) {
1948
+ ctx.fill(path2D);
1949
+ }
1950
+ const hasEnoughVertices = !Utils13.isNullOrEmpty(item.vertices) && item.vertices.length > 1, hasMarkerEnd = !Utils13.isNull(item.markerEnd), hasMarkerStart = !Utils13.isNull(item.markerStart), hasMarkerMid = !Utils13.isNull(item.markerMid);
1951
+ if (hasMarkerEnd || hasMarkerMid || hasMarkerStart) {
1952
+ if (!hasEnoughVertices) {
1953
+ this.log(Logging.LogLevel.Warn, "Not enough vertices were explicited in order to make markers renderable.");
1954
+ }
1955
+ }
1956
+ if (hasEnoughVertices) {
1957
+ const matrix = ctx.getTransform();
1958
+ if (hasMarkerStart) {
1959
+ const marker = item.markerEnd, from = item.vertices[1], to = item.vertices[0];
1960
+ const orientation = Math.atan2(to.y - from.y, to.x - from.x);
1961
+ this._drawMarker(ctx, marker, to, orientation);
1962
+ }
1963
+ if (hasMarkerMid) {
1964
+ const marker = item.markerEnd;
1965
+ for (let j = 1; j < item.vertices.length - 1; j++) {
1966
+ ctx.setTransform(matrix);
1967
+ const from = item.vertices[j], to = item.vertices[j + 1];
1968
+ const orientation = Math.atan2(to.y - from.y, to.x - from.x);
1969
+ this._drawMarker(ctx, marker, to, orientation);
1970
+ }
1971
+ }
1972
+ if (hasMarkerEnd) {
1973
+ ctx.setTransform(matrix);
1974
+ const marker = item.markerEnd, from = item.vertices[item.vertices.length - 2], to = item.vertices[item.vertices.length - 1];
1975
+ const orientation = Math.atan2(to.y - from.y, to.x - from.x);
1976
+ this._drawMarker(ctx, marker, to, orientation);
1977
+ }
1978
+ }
1979
+ }
1980
+ _drawMarker(ctx, marker, point, orientation) {
1981
+ const defaults = this.DefaultShapeValues;
1982
+ const refX = marker.ref?.x || 0, refY = marker.ref?.y || 0;
1983
+ const width = (marker.width || 1) * ctx.lineWidth, height = (marker.width || 1) * ctx.lineWidth;
1984
+ let viewbox = marker.viewbox, stage = { x: 0, y: 0, width, height };
1985
+ if (Utils13.isNull(viewbox)) {
1986
+ viewbox = stage;
1987
+ }
1988
+ const mscale = { a: stage.width / viewbox.width, d: stage.height / viewbox.height };
1989
+ ctx.translate(point.x, point.y);
1990
+ ctx.rotate(orientation);
1991
+ ctx.scale(mscale.a, mscale.d);
1992
+ ctx.translate(-refX, -refY);
1993
+ ctx.fillStyle = fallback(marker.fill, defaults.fill);
1994
+ ctx.strokeStyle = fallback(marker.stroke, defaults.stroke);
1995
+ const hasMarkerFill = !isNone(marker.fill), hasMarkerStroke = !isNone(marker.stroke);
1996
+ var markerPath2D = new Path2D(marker.pathData);
1997
+ if (hasMarkerFill) {
1998
+ ctx.fill(markerPath2D);
1999
+ }
2000
+ if (hasMarkerStroke) {
2001
+ ctx.stroke(markerPath2D);
2002
+ }
2003
+ }
2004
+ };
2005
+ PacemCanvasAdapterElement = __decorate13([
2006
+ CustomElement11({ tagName: P11 + "-" + TAG_MIDDLE_NAME + "-canvas-adapter" })
2007
+ ], PacemCanvasAdapterElement);
2008
+
2009
+ // packages/2d/dist/esm/adapters/svgadapter.js
2010
+ import { CustomElement as CustomElement12, P as P12, CustomElementUtils as CustomElementUtils3, CustomEventUtils as CustomEventUtils3, Utils as Utils14, UI as UI3, avoidHandler as avoidHandler3 } from "@pacem/pacem-core";
2011
+ import { Matrix2D as Matrix2D5 } from "@pacem/pacem-foundation";
2012
+ var __decorate14 = function(decorators, target, key, desc) {
2013
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2014
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
2015
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2016
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2017
+ };
2018
+ var SVG_NS = "http://www.w3.org/2000/svg";
2019
+ var DRAWABLE_VAR = "pacem:2-svg-drawable";
2020
+ var STAGE_VAR = "pacem:2d-svg-stage";
2021
+ var GETVAR2 = CustomElementUtils3.getAttachedPropertyValue;
2022
+ var SETVAR2 = CustomElementUtils3.setAttachedPropertyValue;
2023
+ var DELVAR = CustomElementUtils3.deleteAttachedPropertyValue;
2024
+ function fallback2(v, f) {
2025
+ return Utils14.isNull(v) ? f : v;
2026
+ }
2027
+ function replaceChildAt(parent, newChild, targetIndex) {
2028
+ if (targetIndex >= parent.children.length) {
2029
+ parent.appendChild(newChild);
2030
+ return null;
2031
+ } else {
2032
+ return parent.replaceChild(newChild, parent.children.item(targetIndex));
2033
+ }
2034
+ }
2035
+ var PacemSvgAdapterElement = class PacemSvgAdapterElement2 extends Pacem2DAdapterElement {
2036
+ constructor() {
2037
+ super(...arguments);
2038
+ this._hitTarget = null;
2039
+ this._dragInitHandler = (evt) => {
2040
+ const args = evt.detail, el = args.element, drawable = GETVAR2(el, DRAWABLE_VAR), stageTransformMatrix = drawable.stage.transformMatrix, initialMatrix = drawable.transformMatrix ?? Matrix2D5.identity;
2041
+ args.data = {
2042
+ stageTransformMatrix,
2043
+ item: drawable,
2044
+ initialTransformMatrix: initialMatrix
2045
+ };
2046
+ const reject = AdapterUtils.itemDispatch(drawable, evt, { x: 0, y: 0 });
2047
+ if (reject) {
2048
+ evt.preventDefault();
2049
+ }
2050
+ };
2051
+ this._draggingHandler = (evt) => {
2052
+ avoidHandler3(evt);
2053
+ this.#dragging = true;
2054
+ const el = evt.detail.element;
2055
+ const data = evt.detail.data;
2056
+ const args = evt.detail;
2057
+ const screenOffset = { x: (args.currentPosition.x - args.origin.x) * data.stageTransformMatrix.a, y: (args.currentPosition.y - args.origin.y) * data.stageTransformMatrix.d };
2058
+ const offset = {
2059
+ x: screenOffset.x + data.initialTransformMatrix.e,
2060
+ y: screenOffset.y + data.initialTransformMatrix.f
2061
+ }, stageOffset = {
2062
+ x: screenOffset.x + data.stageTransformMatrix.e,
2063
+ y: screenOffset.y + data.stageTransformMatrix.f
2064
+ };
2065
+ const rejected = AdapterUtils.itemDispatch(data.item, evt, stageOffset);
2066
+ if (!rejected) {
2067
+ const init = data.initialTransformMatrix;
2068
+ el.style.transform = `matrix(${init.a},${init.b},${init.c},${init.d},${offset.x},${offset.y})`;
2069
+ }
2070
+ };
2071
+ this._dragEndHandler = (evt) => {
2072
+ this.#dragging = false;
2073
+ const args = evt.detail, el = args.element, data = args.data, transform = Utils14.deserializeTransform(el.style);
2074
+ const offset = { x: transform.e, y: transform.f };
2075
+ if (data.item instanceof UiElement) {
2076
+ data.item.translateX = offset.x;
2077
+ data.item.translateY = offset.y;
2078
+ } else {
2079
+ const init = data.initialTransformMatrix, actual = { a: init.a, b: init.b, c: init.c, d: init.d, e: offset.x, f: offset.y };
2080
+ Utils14.extend(data.item, { transformMatrix: actual });
2081
+ }
2082
+ el.style.transform = "";
2083
+ AdapterUtils.itemDispatch(data.item, evt, offset);
2084
+ };
2085
+ this._mouseleaveHandler = (evt) => {
2086
+ if (this.#dragging) {
2087
+ return;
2088
+ }
2089
+ const hitTarget = this._hitTarget;
2090
+ if (Utils14.isNull(hitTarget)) {
2091
+ return;
2092
+ }
2093
+ this._hitTarget = null;
2094
+ if (!Utils14.isNull(hitTarget)) {
2095
+ this.#dragger.unregister(this._items.get(hitTarget));
2096
+ AdapterUtils.itemDispatch(hitTarget, "out", evt);
2097
+ }
2098
+ };
2099
+ this._mousemoveHandler = (evt) => {
2100
+ var pt = CustomEventUtils3.getEventCoordinates(evt).client;
2101
+ if (!this.#dragging) {
2102
+ var d = null;
2103
+ const root = evt.target.getRootNode();
2104
+ root.elementsFromPoint(pt.x, pt.y).find((i) => {
2105
+ d = GETVAR2(i, DRAWABLE_VAR);
2106
+ return d && !d.inert;
2107
+ });
2108
+ var old = this._hitTarget, val = d;
2109
+ if (Utils14.isNull(d && d.stage) || !this._scenes.has(d.stage) || d.inert) {
2110
+ val = null;
2111
+ }
2112
+ const hitTarget = this._hitTarget = val;
2113
+ if (val !== old) {
2114
+ if (!Utils14.isNull(old)) {
2115
+ this.#dragger.unregister(this._items.get(old));
2116
+ AdapterUtils.itemDispatch(old, "out", evt);
2117
+ }
2118
+ if (!Utils14.isNull(val)) {
2119
+ if (val.draggable) {
2120
+ this.#dragger.register(this._items.get(val));
2121
+ }
2122
+ AdapterUtils.itemDispatch(val, "over", evt);
2123
+ }
2124
+ }
2125
+ if (Utils14.isNull(hitTarget)) {
2126
+ const svg = evt.currentTarget;
2127
+ const stage = GETVAR2(svg, STAGE_VAR);
2128
+ if (!Utils14.isNull(stage)) {
2129
+ AdapterUtils.stageDispatch(stage, "move", evt);
2130
+ }
2131
+ }
2132
+ }
2133
+ };
2134
+ this._mouseDownUpHandler = (evt) => {
2135
+ const svg = evt.currentTarget;
2136
+ if (svg instanceof SVGSVGElement) {
2137
+ const stage = GETVAR2(svg, STAGE_VAR), hitTarget = this._hitTarget;
2138
+ const type = evt.type.replace(/^mouse/, "");
2139
+ const opts = getStageOptions(stage);
2140
+ if (CustomEventUtils3.matchModifiers(evt, opts.clickModifiers)) {
2141
+ if (!Utils14.isNull(hitTarget) && hitTarget.stage === stage) {
2142
+ AdapterUtils.itemDispatch(hitTarget, type, evt);
2143
+ } else {
2144
+ AdapterUtils.stageDispatch(stage, type, evt);
2145
+ }
2146
+ }
2147
+ }
2148
+ };
2149
+ this._scenes = /* @__PURE__ */ new WeakMap();
2150
+ this._markers = /* @__PURE__ */ new WeakMap();
2151
+ this._gradients = /* @__PURE__ */ new WeakMap();
2152
+ this._items = /* @__PURE__ */ new WeakMap();
2153
+ }
2154
+ snapshot(stage, background, type, quality) {
2155
+ if (this._scenes.has(stage)) {
2156
+ const svg = this._scenes.get(stage);
2157
+ return this.snapshotElement(svg, background, type, quality);
2158
+ } else {
2159
+ return Promise.resolve(null);
2160
+ }
2161
+ }
2162
+ getTransformMatrix(scene) {
2163
+ const scenes = this._scenes;
2164
+ if (scenes.has(scene)) {
2165
+ return scenes.get(scene).getScreenCTM().inverse();
2166
+ }
2167
+ return Matrix2D5.identity;
2168
+ }
2169
+ #dragger;
2170
+ viewActivatedCallback() {
2171
+ super.viewActivatedCallback();
2172
+ const dragDrop = this.#dragger = document.createElement(P12 + "-drag-drop");
2173
+ dragDrop.mode = UI3.DragDataMode.Self;
2174
+ const shell = CustomElementUtils3.findAncestorShell(this);
2175
+ shell.appendChild(dragDrop);
2176
+ dragDrop.addEventListener(UI3.DragDropEventType.Init, this._dragInitHandler, false);
2177
+ dragDrop.addEventListener(UI3.DragDropEventType.Drag, this._draggingHandler, false);
2178
+ dragDrop.addEventListener(UI3.DragDropEventType.End, this._dragEndHandler, false);
2179
+ }
2180
+ disconnectedCallback() {
2181
+ const dragger = this.#dragger;
2182
+ if (!Utils14.isNull(dragger)) {
2183
+ dragger.removeEventListener(UI3.DragDropEventType.Init, this._dragInitHandler, false);
2184
+ dragger.removeEventListener(UI3.DragDropEventType.Drag, this._draggingHandler, false);
2185
+ dragger.removeEventListener(UI3.DragDropEventType.End, this._dragEndHandler, false);
2186
+ dragger.remove();
2187
+ }
2188
+ super.disconnectedCallback();
2189
+ }
2190
+ invalidateSize(scene, size) {
2191
+ const scenes = this._scenes;
2192
+ if (!Utils14.isNull(scene) && !Utils14.isNullOrEmpty(size)) {
2193
+ if (scenes.has(scene)) {
2194
+ var svg = scenes.get(scene);
2195
+ svg.setAttribute("width", size.width + "");
2196
+ svg.setAttribute("height", size.height + "");
2197
+ const rect = scene.viewbox, aspectRatio = scene.aspectRatio;
2198
+ if (AdapterUtils.isValidViewbox(rect)) {
2199
+ svg.setAttribute("viewBox", `${rect.x} ${rect.y} ${rect.width} ${rect.height}`);
2200
+ } else {
2201
+ svg.removeAttribute("viewBox");
2202
+ }
2203
+ if (Utils14.isNullOrEmpty(aspectRatio) || typeof aspectRatio === "string") {
2204
+ svg.removeAttribute("preserveAspectRatio");
2205
+ } else {
2206
+ svg.setAttribute("preserveAspectRatio", `xM${aspectRatio.x.substring(1)}YM${aspectRatio.y.substring(1)} ${aspectRatio.slice ? "slice" : "meet"}`);
2207
+ }
2208
+ }
2209
+ }
2210
+ }
2211
+ initialize(scene) {
2212
+ if (Utils14.isNull(scene)) {
2213
+ throw "Provided scene is null or undefined.";
2214
+ }
2215
+ const scenes = this._scenes;
2216
+ if (scenes.has(scene)) {
2217
+ return scenes.get(scene);
2218
+ }
2219
+ const stage = scene.stage;
2220
+ stage.innerHTML = "";
2221
+ this._items = /* @__PURE__ */ new WeakMap();
2222
+ var svg = document.createElementNS(SVG_NS, "svg");
2223
+ svg.setAttribute("part", "stage");
2224
+ SETVAR2(svg, STAGE_VAR, scene);
2225
+ stage.appendChild(svg);
2226
+ scenes.set(scene, svg);
2227
+ const options = { passive: false, capture: true };
2228
+ svg.addEventListener("mousemove", this._mousemoveHandler, false);
2229
+ svg.addEventListener("click", this._mouseDownUpHandler, false);
2230
+ svg.addEventListener("mousedown", this._mouseDownUpHandler, false);
2231
+ svg.addEventListener("mouseup", this._mouseDownUpHandler, false);
2232
+ svg.addEventListener("mouseleave", this._mouseleaveHandler, false);
2233
+ return svg;
2234
+ }
2235
+ dispose(scene) {
2236
+ const scenes = this._scenes;
2237
+ if (scenes.has(scene)) {
2238
+ var svg = scenes.get(scene);
2239
+ svg.removeEventListener("mousemove", this._mousemoveHandler);
2240
+ svg.removeEventListener("click", this._mouseDownUpHandler);
2241
+ svg.removeEventListener("mousedown", this._mouseDownUpHandler);
2242
+ svg.removeEventListener("mouseup", this._mouseDownUpHandler);
2243
+ svg.removeEventListener("mouseleave", this._mouseleaveHandler);
2244
+ DELVAR(svg, STAGE_VAR);
2245
+ svg.remove();
2246
+ scenes.delete(scene);
2247
+ }
2248
+ }
2249
+ getHitTarget(scene) {
2250
+ return this._hitTarget;
2251
+ }
2252
+ draw(scene, item, deepRedraw = false) {
2253
+ const scenes = this._scenes, dict = this._items;
2254
+ if (!Utils14.isNull(scene)) {
2255
+ if (scene.adapter === this) {
2256
+ if (!scenes.has(scene)) {
2257
+ this.initialize(scene);
2258
+ }
2259
+ } else {
2260
+ if (scenes.has(scene)) {
2261
+ scenes.delete(scene);
2262
+ }
2263
+ return;
2264
+ }
2265
+ } else {
2266
+ return;
2267
+ }
2268
+ var items = scene.datasource, flow = true, parent = scenes.get(scene);
2269
+ if (!Utils14.isNull(item) && dict.has(item)) {
2270
+ items = [item];
2271
+ parent = dict.get(item).parentNode;
2272
+ flow = false;
2273
+ }
2274
+ if (flow) {
2275
+ parent.innerHTML = "<defs></defs>";
2276
+ this._markers = /* @__PURE__ */ new WeakMap();
2277
+ }
2278
+ this._draw(scene, parent, items || [], flow, deepRedraw);
2279
+ }
2280
+ #dragging;
2281
+ _hasItems(object) {
2282
+ return isGroup(object);
2283
+ }
2284
+ _disposeSvg(el) {
2285
+ if (!Utils14.isNull(el)) {
2286
+ var drawable = GETVAR2(el, DRAWABLE_VAR);
2287
+ DELVAR(el, DRAWABLE_VAR);
2288
+ this._items.delete(drawable);
2289
+ }
2290
+ }
2291
+ _draw(scene, parent, items, flow, deepRedraw) {
2292
+ const dict = this._items;
2293
+ let j = 0;
2294
+ if (parent.firstElementChild instanceof SVGDefsElement) {
2295
+ j++;
2296
+ }
2297
+ if (!Utils14.isNullOrEmpty(items)) {
2298
+ for (let item of items) {
2299
+ item.stage ??= scene;
2300
+ let el;
2301
+ if (!dict.has(item)) {
2302
+ el = this._buildSVGElement(item);
2303
+ SETVAR2(el, DRAWABLE_VAR, item);
2304
+ this._disposeSvg(replaceChildAt(parent, el, j));
2305
+ dict.set(item, el);
2306
+ } else {
2307
+ el = dict.get(item);
2308
+ if (el.parentNode !== parent) {
2309
+ this._disposeSvg(replaceChildAt(parent, el, j));
2310
+ }
2311
+ }
2312
+ if (isDrawable(item)) {
2313
+ if (item.hide) {
2314
+ el.setAttribute("display", "none");
2315
+ } else {
2316
+ el.removeAttribute("display");
2317
+ }
2318
+ el.style.transform = "";
2319
+ }
2320
+ if (isShape(item)) {
2321
+ const path = el;
2322
+ path.setAttribute("d", fallback2(item.pathData, "M0,0"));
2323
+ for (let { marker, suffix } of [{ marker: item.markerStart, suffix: "start" }, { marker: item.markerEnd, suffix: "end" }, { marker: item.markerMid, suffix: "mid" }]) {
2324
+ if (marker) {
2325
+ const markerSvg = this._ensureMarker(parent, marker);
2326
+ path.setAttribute("marker-" + suffix, `url(#${markerSvg.id})`);
2327
+ } else {
2328
+ path.removeAttribute("marker-" + suffix);
2329
+ }
2330
+ }
2331
+ } else if (isText(item)) {
2332
+ const text = el;
2333
+ text.textContent = item.text;
2334
+ text.style.fill = Utils14.isNullOrEmpty(item.color) ? "" : item.color;
2335
+ text.style.fontFamily = Utils14.isNullOrEmpty(item.fontFamily) ? "" : item.fontFamily;
2336
+ text.style.fontSize = Utils14.isNull(item.fontSize) ? "" : item.fontSize + "px";
2337
+ if (!Utils14.isNullOrEmpty(item.fontWeight)) {
2338
+ text.style.fontWeight = item.fontWeight;
2339
+ }
2340
+ if (!Utils14.isNullOrEmpty(item.fontStyle)) {
2341
+ text.style.fontStyle = item.fontStyle;
2342
+ }
2343
+ text.setAttribute("text-anchor", fallback2(item.textAnchor, "start"));
2344
+ if (!Utils14.isNull(item.anchor)) {
2345
+ text.setAttribute("x", item.anchor.x.toString());
2346
+ text.setAttribute("y", item.anchor.y.toString());
2347
+ } else {
2348
+ text.removeAttribute("x");
2349
+ text.removeAttribute("y");
2350
+ }
2351
+ } else if (isImage(item)) {
2352
+ const img = el;
2353
+ img.setAttribute("href", item.src);
2354
+ img.setAttribute("preserveAspectRatio", "none");
2355
+ if (item.width > 0) {
2356
+ img.setAttribute("width", "" + item.width);
2357
+ } else {
2358
+ img.removeAttribute("width");
2359
+ }
2360
+ if (item.height > 0) {
2361
+ img.setAttribute("height", "" + item.height);
2362
+ } else {
2363
+ img.removeAttribute("height");
2364
+ }
2365
+ if (!Utils14.isNull(item.x)) {
2366
+ img.setAttribute("x", "" + item.x);
2367
+ } else {
2368
+ img.removeAttribute("x");
2369
+ }
2370
+ if (!Utils14.isNull(item.y)) {
2371
+ img.setAttribute("y", "" + item.y);
2372
+ } else {
2373
+ img.removeAttribute("y");
2374
+ }
2375
+ }
2376
+ if (isUiObject(item)) {
2377
+ const t = item.transformMatrix;
2378
+ if (Utils14.isNull(t) || Matrix2D5.isIdentity(t)) {
2379
+ el.removeAttribute("transform");
2380
+ } else {
2381
+ el.setAttribute("transform", `matrix(${t.a} ${t.b} ${t.c} ${t.d} ${t.e} ${t.f})`);
2382
+ }
2383
+ const opacity = fallback2(item.opacity, 1);
2384
+ if (opacity === 1) {
2385
+ el.removeAttribute("opacity");
2386
+ } else {
2387
+ el.setAttribute("opacity", "" + opacity);
2388
+ }
2389
+ }
2390
+ if (isPresentationObject(item)) {
2391
+ if (Utils14.isNullOrEmpty(item.fill)) {
2392
+ el.removeAttribute("fill");
2393
+ } else if (typeof item.fill === "string") {
2394
+ el.setAttribute("fill", item.fill);
2395
+ } else {
2396
+ const grad = this._ensureGradient(parent, item.fill);
2397
+ el.setAttribute("fill", `url(#${grad.id})`);
2398
+ }
2399
+ if (Utils14.isNullOrEmpty(item.stroke)) {
2400
+ el.removeAttribute("stroke");
2401
+ } else {
2402
+ el.setAttribute("stroke", item.stroke);
2403
+ }
2404
+ if (Utils14.isNullOrEmpty(item.dashArray)) {
2405
+ el.removeAttribute("stroke-dasharray");
2406
+ } else {
2407
+ el.setAttribute("stroke-dasharray", item.dashArray.join(" "));
2408
+ }
2409
+ if (Utils14.isNullOrEmpty(item.lineCap)) {
2410
+ el.removeAttribute("stroke-linecap");
2411
+ } else {
2412
+ el.setAttribute("stroke-linecap", item.lineCap);
2413
+ }
2414
+ if (Utils14.isNullOrEmpty(item.lineJoin)) {
2415
+ el.removeAttribute("stroke-linejoin");
2416
+ } else {
2417
+ el.setAttribute("stroke-linejoin", item.lineJoin);
2418
+ }
2419
+ if (Utils14.isNullOrEmpty(item.lineWidth)) {
2420
+ el.removeAttribute("stroke-width");
2421
+ } else {
2422
+ el.setAttribute("stroke-width", "" + item.lineWidth);
2423
+ }
2424
+ }
2425
+ if (item.inert) {
2426
+ el.style.pointerEvents = "none";
2427
+ } else {
2428
+ el.style.pointerEvents = "";
2429
+ }
2430
+ if ((flow || deepRedraw) && this._hasItems(item)) {
2431
+ this._draw(scene, el, item.childDrawables, true, deepRedraw);
2432
+ }
2433
+ j++;
2434
+ }
2435
+ }
2436
+ if (flow) {
2437
+ for (let k = parent.children.length - 1; k >= j; k--) {
2438
+ const el = parent.children.item(k);
2439
+ this._disposeSvg(el);
2440
+ el.remove();
2441
+ }
2442
+ }
2443
+ }
2444
+ _buildSVGElement(item) {
2445
+ if (isShape(item) || item instanceof ShapeElement) {
2446
+ return document.createElementNS(SVG_NS, "path");
2447
+ }
2448
+ if (isText(item) || item instanceof PacemTextElement) {
2449
+ return document.createElementNS(SVG_NS, "text");
2450
+ }
2451
+ if (isImage(item) || item instanceof PacemImageElement) {
2452
+ return document.createElementNS(SVG_NS, "image");
2453
+ }
2454
+ return document.createElementNS(SVG_NS, "g");
2455
+ }
2456
+ _ensureGradient(parent, gradient) {
2457
+ const store = this._gradients;
2458
+ if (!store.has(parent)) {
2459
+ store.set(parent, /* @__PURE__ */ new WeakMap());
2460
+ }
2461
+ const map = store.get(parent);
2462
+ const isLinear = isLinearGradient(gradient), isRadial = isRadialGradient(gradient);
2463
+ if (map.has(gradient)) {
2464
+ const current = map.get(gradient);
2465
+ if (isLinear && current instanceof SVGLinearGradientElement || isRadial && current instanceof SVGRadialGradientElement) {
2466
+ current.remove();
2467
+ map.delete(gradient);
2468
+ }
2469
+ }
2470
+ if (!map.has(gradient)) {
2471
+ let defsContainer = parent;
2472
+ let defs;
2473
+ while (Utils14.isNull(defs = defsContainer.querySelector(":scope > defs"))) {
2474
+ const parent1 = defsContainer.parentElement;
2475
+ if (parent1 instanceof SVGElement) {
2476
+ defsContainer = parent1;
2477
+ } else {
2478
+ break;
2479
+ }
2480
+ }
2481
+ if (Utils14.isNull(defs)) {
2482
+ throw new Error("Must provide a <defs> element.");
2483
+ }
2484
+ var gradientSvg = null;
2485
+ if (isLinear) {
2486
+ gradientSvg = document.createElementNS(SVG_NS, "linearGradient");
2487
+ } else if (isRadialGradient(gradient)) {
2488
+ gradientSvg = document.createElementNS(SVG_NS, "radialGradient");
2489
+ } else {
2490
+ throw new Error("Unmanaged gradient type.");
2491
+ }
2492
+ gradientSvg.setAttribute("gradientUnits", "userSpaceOnUse");
2493
+ gradientSvg.setAttribute("id", `grad-${Utils14.uniqueCode()}`);
2494
+ defs.appendChild(gradientSvg);
2495
+ map.set(gradient, gradientSvg);
2496
+ }
2497
+ const retval = map.get(gradient);
2498
+ if (isLinear) {
2499
+ retval.setAttribute("x1", gradient.start.x.toString());
2500
+ retval.setAttribute("y1", gradient.start.y.toString());
2501
+ retval.setAttribute("x2", gradient.end.x.toString());
2502
+ retval.setAttribute("y2", gradient.end.y.toString());
2503
+ } else if (isRadial) {
2504
+ retval.setAttribute("cx", gradient.center.x.toString());
2505
+ retval.setAttribute("cy", gradient.center.y.toString());
2506
+ retval.setAttribute("r", gradient.radius.toString());
2507
+ }
2508
+ let j = 0;
2509
+ for (let stop of gradient.stops) {
2510
+ while (retval.children.length <= j) {
2511
+ const stopSvgAdd = document.createElementNS(SVG_NS, "stop");
2512
+ retval.appendChild(stopSvgAdd);
2513
+ }
2514
+ const stopSvg = retval.children.item(j);
2515
+ stopSvg.setAttribute("offset", stop.offset * 100 + "%");
2516
+ stopSvg.setAttribute("stop-color", stop.color);
2517
+ if (!Utils14.isNull(stop.opacity)) {
2518
+ stopSvg.setAttribute("stop-opacity", stop.opacity.toString());
2519
+ }
2520
+ j++;
2521
+ }
2522
+ while (retval.children.length > gradient.stops.length) {
2523
+ const lastChild = retval.children.item(retval.children.length - 1);
2524
+ retval.removeChild(lastChild);
2525
+ }
2526
+ return retval;
2527
+ }
2528
+ _ensureMarker(parent, marker) {
2529
+ const store = this._markers;
2530
+ if (!store.has(parent)) {
2531
+ store.set(parent, /* @__PURE__ */ new WeakMap());
2532
+ }
2533
+ const map = store.get(parent);
2534
+ if (!map.has(marker)) {
2535
+ const markerSvg2 = document.createElementNS(SVG_NS, "marker");
2536
+ map.set(marker, markerSvg2);
2537
+ const markerPath2 = document.createElementNS(SVG_NS, "path");
2538
+ markerSvg2.appendChild(markerPath2);
2539
+ markerSvg2.setAttribute("id", "mark" + Utils14.uniqueCode());
2540
+ let defsContainer = parent;
2541
+ let defs;
2542
+ while (Utils14.isNull(defs = defsContainer.querySelector(":scope > defs"))) {
2543
+ const parent1 = defsContainer.parentElement;
2544
+ if (parent1 instanceof SVGElement) {
2545
+ defsContainer = parent1;
2546
+ } else {
2547
+ break;
2548
+ }
2549
+ }
2550
+ if (Utils14.isNull(defs)) {
2551
+ throw new Error("Must provide a <defs> element.");
2552
+ }
2553
+ defs.appendChild(markerSvg2);
2554
+ }
2555
+ const markerSvg = map.get(marker), markerPath = markerSvg.firstElementChild;
2556
+ markerSvg.setAttribute("orient", "auto-start-reverse");
2557
+ if (!Utils14.isNullOrEmpty(marker.viewbox)) {
2558
+ markerSvg.setAttribute("viewBox", `${marker.viewbox.x} ${marker.viewbox.y} ${marker.viewbox.width} ${marker.viewbox.height}`);
2559
+ } else {
2560
+ markerSvg.removeAttribute("viewBox");
2561
+ }
2562
+ if (!Utils14.isNullOrEmpty(marker.ref)) {
2563
+ markerSvg.setAttribute("refX", marker.ref.x.toString());
2564
+ markerSvg.setAttribute("refY", marker.ref.y.toString());
2565
+ } else {
2566
+ markerSvg.removeAttribute("refX");
2567
+ markerSvg.removeAttribute("refY");
2568
+ }
2569
+ if (marker.height > 0) {
2570
+ markerSvg.setAttribute("markerHeight", marker.height.toString());
2571
+ } else {
2572
+ markerSvg.removeAttribute("markerHeight");
2573
+ }
2574
+ if (marker.width > 0) {
2575
+ markerSvg.setAttribute("markerWidth", marker.width.toString());
2576
+ } else {
2577
+ markerSvg.removeAttribute("markerWidth");
2578
+ }
2579
+ markerPath.setAttribute("d", marker.pathData);
2580
+ if (!Utils14.isNullOrEmpty(marker.fill)) {
2581
+ markerPath.setAttribute("fill", marker.fill);
2582
+ } else {
2583
+ markerPath.removeAttribute("fill");
2584
+ }
2585
+ if (!Utils14.isNullOrEmpty(marker.stroke)) {
2586
+ markerPath.setAttribute("stroke", marker.stroke);
2587
+ } else {
2588
+ markerPath.removeAttribute("stroke");
2589
+ }
2590
+ return markerSvg;
2591
+ }
2592
+ };
2593
+ PacemSvgAdapterElement = __decorate14([
2594
+ CustomElement12({ tagName: P12 + "-" + TAG_MIDDLE_NAME + "-svg-adapter" })
2595
+ ], PacemSvgAdapterElement);
2596
+ export {
2597
+ index_components_exports as Components,
2598
+ drawing_exports as Drawing
2599
+ };
2600
+ //# sourceMappingURL=pacem-2d.mjs.map