diff --git a/.vscode/settings.json b/.vscode/settings.json index 3501822..8bc310a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "files.trimFinalNewlines": true, - "files.insertFinalNewline": true + "files.insertFinalNewline": true, + "javascript.format.semicolons": "remove" } diff --git a/dist/ueblueprint.js b/dist/ueblueprint.js index 385d0d2..d3392c4 100755 --- a/dist/ueblueprint.js +++ b/dist/ueblueprint.js @@ -812,11 +812,9 @@ class IEntity extends Observable { * @param {Object} values * @param {String} prefix */ - const defineAllAttributes = (target, attributes, values, prefix = "") => { - for (let attribute of Utility.mergeArrays( - Object.getOwnPropertyNames(attributes), - Object.getOwnPropertyNames(values ?? {}) - )) { + const defineAllAttributes = (target, attributes, values = {}, prefix = "") => { + const valuesPropertyNames = Object.getOwnPropertyNames(values); + for (let attribute of Utility.mergeArrays(Object.getOwnPropertyNames(attributes), valuesPropertyNames)) { let value = Utility.objectGet(values, [attribute]); let defaultValue = attributes[attribute]; let defaultType = Utility.getType(defaultValue); @@ -830,7 +828,8 @@ class IEntity extends Observable { `Attribute ${prefix}${attribute} in the serialized data is not defined in ${this.constructor.name}.attributes` ); } else if ( - !(attribute in values) + valuesPropertyNames.length > 0 + && !(attribute in values) && defaultValue !== undefined && !(defaultValue instanceof TypeInitialization && (!defaultValue.showDefault || defaultValue.ignored)) ) { @@ -2454,11 +2453,17 @@ class IPointing extends IInput { class IMouseWheel extends IPointing { - /** @type {(e: WheelEvent) => void} */ - #mouseWheelHandler + #mouseWheelHandler = + /** @param {WheelEvent} e */ + e => { + e.preventDefault(); + const location = this.locationFromEvent(e); + this.wheel(Math.sign(e.deltaY * Configuration.mouseWheelFactor), location); + } - /** @type {(e: WheelEvent) => void} */ - #mouseParentWheelHandler + #mouseParentWheelHandler = + /** @param {WheelEvent} e */ + e => e.preventDefault() /** * @param {HTMLElement} target @@ -2470,18 +2475,6 @@ class IMouseWheel extends IPointing { options.strictTarget ??= false; super(target, blueprint, options); this.strictTarget = options.strictTarget; - - const self = this; - this.#mouseWheelHandler = e => { - e.preventDefault(); - const location = self.locationFromEvent(e); - self.wheel(Math.sign(e.deltaY * Configuration.mouseWheelFactor), location); - }; - this.#mouseParentWheelHandler = e => e.preventDefault(); - - if (this.blueprint.focused) { - this.movementSpace.addEventListener("wheel", this.#mouseWheelHandler, false); - } } listenEvents() { @@ -2569,268 +2562,6 @@ class KeyboardSelectAll extends IKeyboardShortcut { } } -/** - * @typedef {import("../../Blueprint").default} Blueprint - * @typedef {import("../../element/IDraggableElement").default} IDraggableElement - */ - -/** - * @template {IDraggableElement} T - * @extends {IPointing} - */ -class IMouseClickDrag extends IPointing { - - /** @type {(e: MouseEvent) => void} */ - #mouseDownHandler - - /** @type {(e: MouseEvent) => void} */ - #mouseStartedMovingHandler - - /** @type {(e: MouseEvent) => void} */ - #mouseMoveHandler - - /** @type {(e: MouseEvent) => void} */ - #mouseUpHandler - - #trackingMouse = false - #movementListenedElement - #draggableElement - - started = false - stepSize = 1 - clickedPosition = [0, 0] - clickedOffset = [0, 0] - mouseLocation = [0, 0] - - /** - * - * @param {T} target - * @param {Blueprint} blueprint - * @param {Object} options - */ - constructor(target, blueprint, options = {}) { - options.clickButton ??= 0; - options.consumeEvent ??= true; - options.draggableElement ??= target; - options.exitAnyButton ??= true; - options.moveEverywhere ??= false; - options.movementSpace ??= blueprint?.getGridDOMElement(); - options.repositionOnClick ??= false; - options.strictTarget ??= false; - super(target, blueprint, options); - this.stepSize = parseInt(options?.stepSize ?? Configuration.gridSize); - - this.#movementListenedElement = this.options.moveEverywhere ? document.documentElement : this.movementSpace; - this.#draggableElement = this.options.draggableElement; - let self = this; - - this.#mouseDownHandler = e => { - self.blueprint.setFocused(true); - switch (e.button) { - case self.options.clickButton: - // Either doesn't matter or consider the click only when clicking on the parent, not descandants - if (!self.options.strictTarget || e.target == e.currentTarget) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation(); // Captured, don't call anyone else - } - // Attach the listeners - self.#movementListenedElement.addEventListener("mousemove", self.#mouseStartedMovingHandler); - document.addEventListener("mouseup", self.#mouseUpHandler); - self.clickedPosition = self.locationFromEvent(e); - self.clickedOffset = [ - self.clickedPosition[0] - self.target.locationX, - self.clickedPosition[1] - self.target.locationY, - ]; - self.clicked(self.clickedPosition); - } - break - default: - if (!self.options.exitAnyButton) { - self.#mouseUpHandler(e); - } - break - } - }; - - this.#mouseStartedMovingHandler = e => { - if (self.options.consumeEvent) { - e.stopImmediatePropagation(); // Captured, don't call anyone else - } - // Delegate from now on to self.#mouseMoveHandler - self.#movementListenedElement.removeEventListener("mousemove", self.#mouseStartedMovingHandler); - self.#movementListenedElement.addEventListener("mousemove", self.#mouseMoveHandler); - // Handler calls e.preventDefault() when it receives the event, this means dispatchEvent returns false - const dragEvent = self.getEvent(Configuration.trackingMouseEventName.begin); - self.#trackingMouse = self.target.dispatchEvent(dragEvent) == false; - const location = self.locationFromEvent(e); - // Do actual actions - this.mouseLocation = Utility.snapToGrid(this.clickedPosition, this.stepSize); - self.startDrag(location); - self.started = true; - }; - - this.#mouseMoveHandler = e => { - if (self.options.consumeEvent) { - e.stopImmediatePropagation(); // Captured, don't call anyone else - } - const location = self.locationFromEvent(e); - const movement = [e.movementX, e.movementY]; - self.dragTo(location, movement); - if (self.#trackingMouse) { - self.blueprint.mousePosition = self.locationFromEvent(e); - } - }; - - this.#mouseUpHandler = e => { - if (!self.options.exitAnyButton || e.button == self.options.clickButton) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation(); // Captured, don't call anyone else - } - // Remove the handlers of "mousemove" and "mouseup" - self.#movementListenedElement.removeEventListener("mousemove", self.#mouseStartedMovingHandler); - self.#movementListenedElement.removeEventListener("mousemove", self.#mouseMoveHandler); - document.removeEventListener("mouseup", self.#mouseUpHandler); - if (self.started) { - self.endDrag(); - } - self.unclicked(); - if (self.#trackingMouse) { - const dragEvent = self.getEvent(Configuration.trackingMouseEventName.end); - self.target.dispatchEvent(dragEvent); - self.#trackingMouse = false; - } - self.started = false; - } - }; - - this.listenEvents(); - } - - listenEvents() { - this.#draggableElement.addEventListener("mousedown", this.#mouseDownHandler); - if (this.options.clickButton == 2) { - this.#draggableElement.addEventListener("contextmenu", e => e.preventDefault()); - } - } - - unlistenEvents() { - this.#draggableElement.removeEventListener("mousedown", this.#mouseDownHandler); - } - - getEvent(eventName) { - return new CustomEvent(eventName, { - detail: { - tracker: this - }, - bubbles: true, - cancelable: true - }) - } - - /* Subclasses will override the following methods */ - clicked(location) { - } - - startDrag(location) { - } - - dragTo(location, offset) { - } - - endDrag() { - } - - unclicked(location) { - } -} - -class MouseScrollGraph extends IMouseClickDrag { - - startDrag() { - this.blueprint.scrolling = true; - } - - dragTo(location, movement) { - this.blueprint.scrollDelta([-movement[0], -movement[1]]); - } - - endDrag() { - this.blueprint.scrolling = false; - } -} - -class MouseTracking extends IPointing { - - /** @type {IPointing} */ - #mouseTracker = null - - /** @type {(e: MouseEvent) => void} */ - #mousemoveHandler - - /** @type {(e: CustomEvent) => void} */ - #trackingMouseStolenHandler - - /** @type {(e: CustomEvent) => void} */ - #trackingMouseGaveBackHandler - - constructor(target, blueprint, options = {}) { - options.listenOnFocus = true; - super(target, blueprint, options); - - let self = this; - - this.#mousemoveHandler = e => { - e.preventDefault(); - self.blueprint.mousePosition = self.locationFromEvent(e); - }; - - this.#trackingMouseStolenHandler = e => { - if (!self.#mouseTracker) { - e.preventDefault(); - this.#mouseTracker = e.detail.tracker; - self.unlistenMouseMove(); - } - }; - - this.#trackingMouseGaveBackHandler = e => { - if (self.#mouseTracker == e.detail.tracker) { - e.preventDefault(); - self.#mouseTracker = null; - self.listenMouseMove(); - } - }; - } - - listenMouseMove() { - this.target.addEventListener("mousemove", this.#mousemoveHandler); - } - - unlistenMouseMove() { - this.target.removeEventListener("mousemove", this.#mousemoveHandler); - } - - listenEvents() { - this.listenMouseMove(); - this.blueprint.addEventListener( - Configuration.trackingMouseEventName.begin, - /** @type {(e: Event) => any} */(this.#trackingMouseStolenHandler)); - this.blueprint.addEventListener( - Configuration.trackingMouseEventName.end, - /** @type {(e: Event) => any} */(this.#trackingMouseGaveBackHandler)); - } - - unlistenEvents() { - this.unlistenMouseMove(); - this.blueprint.removeEventListener( - Configuration.trackingMouseEventName.begin, - /** @type {(e: Event) => any} */(this.#trackingMouseStolenHandler)); - this.blueprint.removeEventListener( - Configuration.trackingMouseEventName.end, - /** @type {(e: Event) => any} */(this.#trackingMouseGaveBackHandler) - ); - } -} - /** * @typedef {import("../Blueprint").default} Blueprint * @typedef {import("../entity/IEntity").default} IEntity @@ -3037,6 +2768,264 @@ class IDraggableElement extends IElement { } } +/** + * @typedef {import("../../Blueprint").default} Blueprint + * @typedef {import("../../element/IElement").default} IElement + */ + +/** + * @template {IElement} T + * @extends {IPointing} + */ +class IMouseClickDrag extends IPointing { + + #mouseDownHandler = + /** @param {MouseEvent} e */ + e => { + this.blueprint.setFocused(true); + switch (e.button) { + case this.options.clickButton: + // Either doesn't matter or consider the click only when clicking on the parent, not descandants + if (!this.options.strictTarget || e.target == e.currentTarget) { + if (this.options.consumeEvent) { + e.stopImmediatePropagation(); // Captured, don't call anyone else + } + // Attach the listeners + this.#movementListenedElement.addEventListener("mousemove", this.#mouseStartedMovingHandler); + document.addEventListener("mouseup", this.#mouseUpHandler); + this.clickedPosition = this.locationFromEvent(e); + if (this.target instanceof IDraggableElement) { + this.clickedOffset = [ + this.clickedPosition[0] - this.target.locationX, + this.clickedPosition[1] - this.target.locationY, + ]; + } + this.clicked(this.clickedPosition); + } + break + default: + if (!this.options.exitAnyButton) { + this.#mouseUpHandler(e); + } + break + } + } + + #mouseStartedMovingHandler = + /** @param {MouseEvent} e */ + e => { + if (this.options.consumeEvent) { + e.stopImmediatePropagation(); // Captured, don't call anyone else + } + // Delegate from now on to this.#mouseMoveHandler + this.#movementListenedElement.removeEventListener("mousemove", this.#mouseStartedMovingHandler); + this.#movementListenedElement.addEventListener("mousemove", this.#mouseMoveHandler); + // Handler calls e.preventDefault() when it receives the event, this means dispatchEvent returns false + const dragEvent = this.getEvent(Configuration.trackingMouseEventName.begin); + this.#trackingMouse = this.target.dispatchEvent(dragEvent) == false; + const location = this.locationFromEvent(e); + // Do actual actions + this.mouseLocation = Utility.snapToGrid(this.clickedPosition, this.stepSize); + this.startDrag(location); + this.started = true; + } + + #mouseMoveHandler = + /** @param {MouseEvent} e */ + e => { + if (this.options.consumeEvent) { + e.stopImmediatePropagation(); // Captured, don't call anyone else + } + const location = this.locationFromEvent(e); + const movement = [e.movementX, e.movementY]; + this.dragTo(location, movement); + if (this.#trackingMouse) { + this.blueprint.mousePosition = this.locationFromEvent(e); + } + } + + #mouseUpHandler = + /** @param {MouseEvent} e */ + e => { + if (!this.options.exitAnyButton || e.button == this.options.clickButton) { + if (this.options.consumeEvent) { + e.stopImmediatePropagation(); // Captured, don't call anyone else + } + // Remove the handlers of "mousemove" and "mouseup" + this.#movementListenedElement.removeEventListener("mousemove", this.#mouseStartedMovingHandler); + this.#movementListenedElement.removeEventListener("mousemove", this.#mouseMoveHandler); + document.removeEventListener("mouseup", this.#mouseUpHandler); + if (this.started) { + this.endDrag(); + } + this.unclicked(); + if (this.#trackingMouse) { + const dragEvent = this.getEvent(Configuration.trackingMouseEventName.end); + this.target.dispatchEvent(dragEvent); + this.#trackingMouse = false; + } + this.started = false; + } + } + + #trackingMouse = false + #movementListenedElement + #draggableElement + + clickedOffset = [0, 0] + clickedPosition = [0, 0] + mouseLocation = [0, 0] + started = false + stepSize = 1 + + /** + * + * @param {T} target + * @param {Blueprint} blueprint + * @param {Object} options + */ + constructor(target, blueprint, options = {}) { + options.clickButton ??= 0; + options.consumeEvent ??= true; + options.draggableElement ??= target; + options.exitAnyButton ??= true; + options.moveEverywhere ??= false; + options.movementSpace ??= blueprint?.getGridDOMElement(); + options.repositionOnClick ??= false; + options.strictTarget ??= false; + super(target, blueprint, options); + this.stepSize = parseInt(options?.stepSize ?? Configuration.gridSize); + this.#movementListenedElement = this.options.moveEverywhere ? document.documentElement : this.movementSpace; + this.#draggableElement = this.options.draggableElement; + + this.listenEvents(); + } + + listenEvents() { + this.#draggableElement.addEventListener("mousedown", this.#mouseDownHandler); + if (this.options.clickButton == 2) { + this.#draggableElement.addEventListener("contextmenu", e => e.preventDefault()); + } + } + + unlistenEvents() { + this.#draggableElement.removeEventListener("mousedown", this.#mouseDownHandler); + } + + getEvent(eventName) { + return new CustomEvent(eventName, { + detail: { + tracker: this + }, + bubbles: true, + cancelable: true + }) + } + + /* Subclasses will override the following methods */ + clicked(location) { + } + + startDrag(location) { + } + + dragTo(location, offset) { + } + + endDrag() { + } + + unclicked(location) { + } +} + +class MouseScrollGraph extends IMouseClickDrag { + + startDrag() { + this.blueprint.scrolling = true; + } + + dragTo(location, movement) { + this.blueprint.scrollDelta([-movement[0], -movement[1]]); + } + + endDrag() { + this.blueprint.scrolling = false; + } +} + +class MouseTracking extends IPointing { + + /** @type {IPointing} */ + #mouseTracker = null + + /** @type {(e: MouseEvent) => void} */ + #mousemoveHandler + + /** @type {(e: CustomEvent) => void} */ + #trackingMouseStolenHandler + + /** @type {(e: CustomEvent) => void} */ + #trackingMouseGaveBackHandler + + constructor(target, blueprint, options = {}) { + options.listenOnFocus = true; + super(target, blueprint, options); + + let self = this; + + this.#mousemoveHandler = e => { + e.preventDefault(); + self.blueprint.mousePosition = self.locationFromEvent(e); + }; + + this.#trackingMouseStolenHandler = e => { + if (!self.#mouseTracker) { + e.preventDefault(); + this.#mouseTracker = e.detail.tracker; + self.unlistenMouseMove(); + } + }; + + this.#trackingMouseGaveBackHandler = e => { + if (self.#mouseTracker == e.detail.tracker) { + e.preventDefault(); + self.#mouseTracker = null; + self.listenMouseMove(); + } + }; + } + + listenMouseMove() { + this.target.addEventListener("mousemove", this.#mousemoveHandler); + } + + unlistenMouseMove() { + this.target.removeEventListener("mousemove", this.#mousemoveHandler); + } + + listenEvents() { + this.listenMouseMove(); + this.blueprint.addEventListener( + Configuration.trackingMouseEventName.begin, + /** @type {(e: Event) => any} */(this.#trackingMouseStolenHandler)); + this.blueprint.addEventListener( + Configuration.trackingMouseEventName.end, + /** @type {(e: Event) => any} */(this.#trackingMouseGaveBackHandler)); + } + + unlistenEvents() { + this.unlistenMouseMove(); + this.blueprint.removeEventListener( + Configuration.trackingMouseEventName.begin, + /** @type {(e: Event) => any} */(this.#trackingMouseStolenHandler)); + this.blueprint.removeEventListener( + Configuration.trackingMouseEventName.end, + /** @type {(e: Event) => any} */(this.#trackingMouseGaveBackHandler) + ); + } +} + /** * @typedef {import("../template/ISelectableDraggableTemplate").default} ISelectableDraggableTemplate * @typedef {import("../entity/IEntity").default} IEntity @@ -3731,11 +3720,39 @@ class MouseCreateLink extends IMouseClickDrag { /** @type {NodeListOf} */ #listenedPins - /** @type {(e: MouseEvent) => void} */ - #mouseenterHandler + #mouseenterHandler = + /** @param {MouseEvent} e */ + e => { + if (!this.enteredPin) { + this.linkValid = false; + this.enteredPin = /** @type {PinElement} */ (e.target); + const a = this.enteredPin; + const b = this.target; + if (a.getNodeElement() == b.getNodeElement()) { + this.link.setMessageSameNode(); + } else if (a.isOutput() == b.isOutput()) { + this.link.setMessageDirectionsIncompatible(); + } else if (a.isOutput() == b.isOutput()) { + this.link.setMessageDirectionsIncompatible(); + } else if (this.blueprint.getLinks([a, b]).length) { + this.link.setMessageReplaceLink(); + this.linkValid = true; + } else { + this.link.setMessageCorrect(); + this.linkValid = true; + } + } + } - /** @type {(e: MouseEvent) => void} */ - #mouseleaveHandler + #mouseleaveHandler = + /** @param {MouseEvent} e */ + e => { + if (this.enteredPin == e.target) { + this.enteredPin = null; + this.linkValid = false; + this.link?.setMessagePlaceNode(); + } + } /** @type {LinkElement?} */ link @@ -3745,39 +3762,6 @@ class MouseCreateLink extends IMouseClickDrag { linkValid = false - constructor(target, blueprint, options) { - super(target, blueprint, options); - let self = this; - this.#mouseenterHandler = e => { - if (!self.enteredPin) { - self.linkValid = false; - self.enteredPin = /** @type {PinElement} */ (e.target); - const a = self.enteredPin; - const b = self.target; - if (a.getNodeElement() == b.getNodeElement()) { - self.link.setMessageSameNode(); - } else if (a.isOutput() == b.isOutput()) { - self.link.setMessageDirectionsIncompatible(); - } else if (a.isOutput() == b.isOutput()) { - self.link.setMessageDirectionsIncompatible(); - } else if (self.blueprint.getLinks([a, b]).length) { - self.link.setMessageReplaceLink(); - self.linkValid = true; - } else { - self.link.setMessageCorrect(); - self.linkValid = true; - } - } - }; - this.#mouseleaveHandler = e => { - if (self.enteredPin == e.target) { - self.enteredPin = null; - self.linkValid = false; - self.link?.setMessagePlaceNode(); - } - }; - } - startDrag(location) { this.link = new LinkElement(this.target, null); this.blueprint.linksContainerElement.prepend(this.link); @@ -3785,8 +3769,9 @@ class MouseCreateLink extends IMouseClickDrag { this.#listenedPins = this.blueprint.querySelectorAll("ueb-pin"); this.#listenedPins.forEach(pin => { if (pin != this.target) { - pin.getClickableElement().addEventListener("mouseenter", this.#mouseenterHandler); - pin.getClickableElement().addEventListener("mouseleave", this.#mouseleaveHandler); + const clickableElement = pin.template.getClickableElement(); + clickableElement.addEventListener("mouseenter", this.#mouseenterHandler); + clickableElement.addEventListener("mouseleave", this.#mouseleaveHandler); } }); this.link.startDragging(); @@ -3832,6 +3817,12 @@ class MouseCreateLink extends IMouseClickDrag { */ class PinTemplate extends ITemplate { + /** @param {PinElement} element */ + constructed(element) { + super.constructed(element); + this.element.dataset.id = this.element.GetPinIdValue(); + } + connectedCallback() { super.connectedCallback(); this.element.nodeElement = this.element.closest("ueb-node"); @@ -3840,7 +3831,7 @@ class PinTemplate extends ITemplate { /** @returns {IInput[]} */ createInputObjects() { return [ - new MouseCreateLink(this.element.clickableElement, this.element.blueprint, { + new MouseCreateLink(this.getClickableElement(), this.element.blueprint, { moveEverywhere: true, }) ] @@ -3880,13 +3871,6 @@ class PinTemplate extends ITemplate { return w } - /** @param {Map} changedProperties */ - firstUpdated(changedProperties) { - super.firstUpdated(changedProperties); - this.element.dataset.id = this.element.GetPinIdValue(); - this.element.clickableElement = this.element; - } - getLinkLocation() { const rect = this.element.querySelector(".ueb-pin-icon").getBoundingClientRect(); const location = Utility.convertLocation( @@ -3895,6 +3879,10 @@ class PinTemplate extends ITemplate { ); return this.element.blueprint.compensateTranslation(location) } + + getClickableElement() { + return this.element + } } /** @@ -3905,18 +3893,18 @@ class BoolPinTemplate extends PinTemplate { /** @type {HTMLInputElement} */ #input + #onChangeHandler = _ => this.element.setDefaultValue(this.#input.checked) + /** @param {Map} changedProperties */ firstUpdated(changedProperties) { super.firstUpdated(changedProperties); this.#input = this.element.querySelector(".ueb-pin-input"); - let self = this; - this.onChangeHandler = _ => this.element.setDefaultValue(self.#input.checked); - this.#input.addEventListener("change", this.onChangeHandler); + this.#input.addEventListener("change", this.#onChangeHandler); } cleanup() { super.cleanup(); - this.#input.removeEventListener("change", this.onChangeHandler); + this.#input.removeEventListener("change", this.#onChangeHandler); } createInputObjects() { @@ -3950,6 +3938,173 @@ class ExecPinTemplate extends PinTemplate { } } +/** + * @template T + * @typedef {import("../element/PinElement").default} PinElement + */ + +/** + * @template T + * @extends PinTemplate + */ +class IInputPinTemplate extends PinTemplate { + + static singleLineInput = false + static selectOnFocus = true + + /** @type {HTMLElement[]} */ + #inputContentElements + get inputContentElements() { + return this.#inputContentElements + } + + /** @param {String} value */ + static stringFromInputToUE(value) { + return value + .replace(/(?=\n\s*)\n$/, "") // Remove trailing double newline + .replaceAll("\n", "\\r\n") // Replace newline with \r\n (default newline in UE) + } + + /** @param {String} value */ + static stringFromUEToInput(value) { + return value + .replaceAll(/(?:\r|(?<=(?:^|[^\\])(?:\\\\)*)\\r)(?=\n)/g, "") // Remove \r leftover from \r\n + .replace(/(?<=\n\s*)$/, "\n") // Put back trailing double newline + } + + #onFocusOutHandler = () => this.setInputs(this.getInputs(), true) + + /** @param {Map} changedProperties */ + firstUpdated(changedProperties) { + super.firstUpdated(changedProperties); + this.#inputContentElements = /** @type {HTMLElement[]} */([...this.element.querySelectorAll("ueb-input")]); + if (this.#inputContentElements.length) { + this.setInputs(this.getInputs(), false); + this.#inputContentElements.forEach(element => { + element.addEventListener("focusout", this.#onFocusOutHandler); + }); + } + } + + cleanup() { + super.cleanup(); + this.#inputContentElements.forEach(element => { + element.removeEventListener("focusout", this.#onFocusOutHandler); + }); + } + + createInputObjects() { + return [ + ...super.createInputObjects(), + ...this.#inputContentElements.map(elem => new MouseIgnore(elem, this.element.blueprint)), + ] + } + + getInput() { + return this.getInputs().reduce((acc, cur) => acc + cur, "") + } + + getInputs() { + return this.#inputContentElements.map(element => + // Faster than innerText which causes reflow + Utility.clearHTMLWhitespace(element.innerHTML) + ) + } + + /** @param {String[]?} values */ + setInputs(values = [], updateDefaultValue = true) { + // @ts-expect-error + this.#inputContentElements.forEach(this.constructor.singleLineInput + ? (elem, i) => elem.innerText = values[i] + : (elem, i) => elem.innerText = values[i].replaceAll("\n", "") + ); + if (updateDefaultValue) { + this.setDefaultValue(values.map(v => IInputPinTemplate.stringFromInputToUE(v)), values); + } + } + + setDefaultValue(values = [], rawValues = values) { + this.element.setDefaultValue( + // @ts-expect-error + values.join("") + ); + } + + renderInput() { + if (this.element.isInput() && !this.element.isLinked) { + // @ts-expect-error + const singleLine = this.constructor.singleLineInput; + // @ts-expect-error + const selectOnFocus = this.constructor.selectOnFocus; + return $` +
+ + +
+ ` + } + return w + } +} + +/** + * @template T + * @extends IInputPinTemplate + */ +class INumericPinTemplate extends IInputPinTemplate { + + static singleLineInput = true + + /** @param {String[]} values */ + setInputs(values = [], updateDefaultValue = false) { + if (!values || values.length == 0) { + values = [this.getInput()]; + } + let parsedValues = []; + for (const value of values) { + let num = parseFloat(value); + if (isNaN(num)) { + num = 0; + updateDefaultValue = false; + } + parsedValues.push(num); + } + super.setInputs(values, false); + this.setDefaultValue(parsedValues, values); + } + + /** + * @param {Number[]} values + * @param {String[]} rawValues + */ + setDefaultValue(values = [], rawValues) { + this.element.setDefaultValue(/** @type {T} */(values[0])); + } +} + +/** @typedef {import("../entity/IntegerEntity").default} IntEntity */ + +/** @extends INumericPinTemplate */ +class IntPinTemplate extends INumericPinTemplate { + + setDefaultValue(values = [], rawValues = values) { + this.element.setDefaultValue(values[0]); + } + + renderInput() { + if (this.element.isInput() && !this.element.isLinked) { + return $` +
+ + +
+ ` + } + return w + } +} + /** * @license * Copyright 2017 Google LLC @@ -4531,222 +4686,6 @@ class ColorPickerWindowTemplate extends WindowTemplate { } } -/** - * @template T - * @typedef {import("../element/PinElement").default} PinElement - */ - -/** - * @template T - * @extends PinTemplate - */ -class IInputPinTemplate extends PinTemplate { - - static singleLineInput = false - static selectOnFocus = true - - /** @type {HTMLElement[]} */ - #inputContentElements - get inputContentElements() { - return this.#inputContentElements - } - - /** @param {String} value */ - static stringFromInputToUE(value) { - return value - .replace(/(?=\n\s*)\n$/, "") // Remove trailing double newline - .replaceAll("\n", "\\r\n") // Replace newline with \r\n (default newline in UE) - } - - /** @param {String} value */ - static stringFromUEToInput(value) { - return value - .replaceAll(/(?:\r|(?<=(?:^|[^\\])(?:\\\\)*)\\r)(?=\n)/g, "") // Remove \r leftover from \r\n - .replace(/(?<=\n\s*)$/, "\n") // Put back trailing double newline - } - - #onFocusOutHandler = () => this.setInputs(this.getInputs(), true) - - /** @param {Map} changedProperties */ - firstUpdated(changedProperties) { - super.firstUpdated(changedProperties); - this.#inputContentElements = /** @type {HTMLElement[]} */([...this.element.querySelectorAll("ueb-input")]); - if (this.#inputContentElements.length) { - this.setInputs(this.getInputs(), false); - this.#inputContentElements.forEach(element => { - element.addEventListener("focusout", this.#onFocusOutHandler); - }); - } - } - - cleanup() { - super.cleanup(); - this.#inputContentElements.forEach(element => { - element.removeEventListener("focusout", this.#onFocusOutHandler); - }); - } - - createInputObjects() { - return [ - ...super.createInputObjects(), - ...this.#inputContentElements.map(elem => new MouseIgnore(elem, this.element.blueprint)), - ] - } - - getInput() { - return this.getInputs().reduce((acc, cur) => acc + cur, "") - } - - getInputs() { - return this.#inputContentElements.map(element => - // Faster than innerText which causes reflow - Utility.clearHTMLWhitespace(element.innerHTML) - ) - } - - /** @param {String[]?} values */ - setInputs(values = [], updateDefaultValue = true) { - // @ts-expect-error - this.#inputContentElements.forEach(this.constructor.singleLineInput - ? (elem, i) => elem.innerText = values[i] - : (elem, i) => elem.innerText = values[i].replaceAll("\n", "") - ); - if (updateDefaultValue) { - this.setDefaultValue(values.map(v => IInputPinTemplate.stringFromInputToUE(v)), values); - } - } - - setDefaultValue(values = [], rawValues = values) { - this.element.setDefaultValue( - // @ts-expect-error - values.join("") - ); - } - - renderInput() { - if (this.element.isInput() && !this.element.isLinked) { - // @ts-expect-error - const singleLine = this.constructor.singleLineInput; - // @ts-expect-error - const selectOnFocus = this.constructor.selectOnFocus; - return $` -
- - -
- ` - } - return w - } -} - -/** @typedef {import("../../Blueprint").default} Blueprint */ - -/** - * @template {HTMLElement} T - * @extends {IPointing} - */ -class IMouseClick extends IPointing { - - /** @type {(e: MouseEvent) => void} */ - #mouseDownHandler - - /** @type {(e: MouseEvent) => void} */ - #mouseUpHandler - - constructor(target, blueprint, options = {}) { - options.clickButton ??= 0; - options.consumeEvent ??= true; - options.exitAnyButton ??= true; - options.strictTarget ??= false; - super(target, blueprint, options); - this.clickedPosition = [0, 0]; - let self = this; - - this.#mouseDownHandler = e => { - self.blueprint.setFocused(true); - switch (e.button) { - case self.options.clickButton: - // Either doesn't matter or consider the click only when clicking on the target, not descandants - if (!self.options.strictTarget || e.target == e.currentTarget) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation(); // Captured, don't call anyone else - } - // Attach the listeners - document.addEventListener("mouseup", self.#mouseUpHandler); - self.clickedPosition = self.locationFromEvent(e); - self.clicked(self.clickedPosition); - } - break - default: - if (!self.options.exitAnyButton) { - self.#mouseUpHandler(e); - } - break - } - }; - - this.#mouseUpHandler = e => { - if (!self.options.exitAnyButton || e.button == self.options.clickButton) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation(); // Captured, don't call anyone else - } - // Remove the handlers of "mousemove" and "mouseup" - document.removeEventListener("mouseup", self.#mouseUpHandler); - self.unclicked(); - } - }; - - this.listenEvents(); - } - - listenEvents() { - this.target.addEventListener("mousedown", this.#mouseDownHandler); - if (this.options.clickButton == 2) { - this.target.addEventListener("contextmenu", e => e.preventDefault()); - } - } - - unlistenEvents() { - this.target.removeEventListener("mousedown", this.#mouseDownHandler); - } - - /* Subclasses will override the following methods */ - clicked(location) { - } - - unclicked(location) { - } -} - -class MouseClickAction extends IMouseClick { - - static #ignoreEvent = - /** @param {MouseClickAction} self */ - self => { } - - constructor( - target, - blueprint, - options, - onMouseDown = MouseClickAction.#ignoreEvent, - onMouseUp = MouseClickAction.#ignoreEvent - ) { - super(target, blueprint, options); - this.onMouseDown = onMouseDown; - this.onMouseUp = onMouseUp; - } - - clicked() { - this.onMouseDown(this); - } - - unclicked() { - this.onMouseUp(this); - } -} - /** * @template {WindowTemplate} T * @extends {IDraggableElement} @@ -4808,44 +4747,40 @@ class LinearColorPinTemplate extends IInputPinTemplate { /** @type {WindowElement} */ #window + #launchColorPickerWindow = + /** @param {MouseEvent} e */ + e => { + //e.preventDefault() + this.#window = new WindowElement({ + type: ColorPickerWindowTemplate, + windowOptions: { + // The created window will use the following functions to get and set the color + getPinColor: () => this.element.defaultValue, + /** @param {LinearColorEntity} color */ + setPinColor: color => this.element.setDefaultValue(color), + }, + }); + this.element.blueprint.append(this.#window); + const windowApplyHandler = () => { + this.element.setDefaultValue( + /** @type {ColorPickerWindowTemplate} */(this.#window.template).color + ); + }; + const windowCloseHandler = () => { + this.#window.removeEventListener(Configuration.windowApplyEventName, windowApplyHandler); + this.#window.removeEventListener(Configuration.windowCloseEventName, windowCloseHandler); + this.#window = null; + }; + this.#window.addEventListener(Configuration.windowApplyEventName, windowApplyHandler); + this.#window.addEventListener(Configuration.windowCloseEventName, windowCloseHandler); + } + /** @param {Map} changedProperties */ firstUpdated(changedProperties) { super.firstUpdated(changedProperties); this.#input = this.element.querySelector(".ueb-pin-input"); } - createInputObjects() { - return [ - ...super.createInputObjects(), - new MouseClickAction(this.#input, this.element.blueprint, undefined, - inputInstance => { - this.#window = new WindowElement({ - type: ColorPickerWindowTemplate, - windowOptions: { - // The created window will use the following functions to get and set the color - getPinColor: () => this.element.defaultValue, - /** @param {LinearColorEntity} color */ - setPinColor: color => this.element.setDefaultValue(color), - }, - }); - this.element.blueprint.append(this.#window); - const windowApplyHandler = () => { - this.element.setDefaultValue( - /** @type {ColorPickerWindowTemplate} */(this.#window.template).color - ); - }; - const windowCloseHandler = () => { - this.#window.removeEventListener(Configuration.windowApplyEventName, windowApplyHandler); - this.#window.removeEventListener(Configuration.windowCloseEventName, windowCloseHandler); - this.#window = null; - }; - this.#window.addEventListener(Configuration.windowApplyEventName, windowApplyHandler); - this.#window.addEventListener(Configuration.windowCloseEventName, windowCloseHandler); - }, - ), - ] - } - getInputs() { return [this.#input.dataset.linearColor] } @@ -4858,6 +4793,7 @@ class LinearColorPinTemplate extends IInputPinTemplate { if (this.element.isInput() && !this.element.isLinked) { return $` ` @@ -4873,41 +4809,6 @@ class NamePinTemplate extends IInputPinTemplate { static singleLineInput = true } -/** - * @template T - * @extends IInputPinTemplate - */ -class INumericPinTemplate extends IInputPinTemplate { - - static singleLineInput = true - - /** @param {String[]} values */ - setInputs(values = [], updateDefaultValue = false) { - if (!values || values.length == 0) { - values = [this.getInput()]; - } - let parsedValues = []; - for (const value of values) { - let num = parseFloat(value); - if (isNaN(num)) { - num = 0; - updateDefaultValue = false; - } - parsedValues.push(num); - } - super.setInputs(values, false); - this.setDefaultValue(parsedValues, values); - } - - /** - * @param {Number[]} values - * @param {String[]} rawValues - */ - setDefaultValue(values = [], rawValues) { - this.element.setDefaultValue(/** @type {T} */(values[0])); - } -} - /** * @template {Number} T * @extends INumericPinTemplate @@ -5039,28 +4940,6 @@ class VectorPinTemplate extends INumericPinTemplate { } } -/** @typedef {import("../entity/IntegerEntity").default} IntEntity */ - -/** @extends INumericPinTemplate */ -class IntPinTemplate extends INumericPinTemplate { - - setDefaultValue(values = [], rawValues = values) { - this.element.setDefaultValue(values[0]); - } - - renderInput() { - if (this.element.isInput() && !this.element.isLinked) { - return $` -
- - -
- ` - } - return w - } -} - /** * @typedef {import("../entity/GuidEntity").default} GuidEntity * @typedef {import("../entity/PinReferenceEntity").default} PinReferenceEntity @@ -5148,8 +5027,6 @@ class PinElement extends IElement { /** @type {NodeElement} */ nodeElement - /** @type {HTMLElement} */ - clickableElement connections = 0 @@ -5211,10 +5088,6 @@ class PinElement extends IElement { return this.entity.isOutput() } - getClickableElement() { - return this.clickableElement - } - getLinkLocation() { return this.template.getLinkLocation() } @@ -5285,7 +5158,10 @@ class PinElement extends IElement { /** @extends {ISelectableDraggableTemplate} */ class NodeTemplate extends ISelectableDraggableTemplate { - toggleAdvancedDisplayHandler + toggleAdvancedDisplayHandler = _ => { + this.element.toggleShowAdvancedPinDisplay(); + this.element.addNextUpdatedCallbacks(() => this.element.dispatchReflowEvent(), true); + } render() { return $` @@ -5328,7 +5204,7 @@ class NodeTemplate extends ISelectableDraggableTemplate { } /** @param {Map} changedProperties */ - async firstUpdated(changedProperties) { + firstUpdated(changedProperties) { super.firstUpdated(changedProperties); const inputContainer = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-inputs")); const outputContainer = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-outputs")); @@ -5340,10 +5216,6 @@ class NodeTemplate extends ISelectableDraggableTemplate { outputContainer.appendChild(p); } }); - this.toggleAdvancedDisplayHandler = _ => { - this.element.toggleShowAdvancedPinDisplay(); - this.element.addNextUpdatedCallbacks(() => this.element.dispatchReflowEvent(), true); - }; this.element.nodeNameElement = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-name-text")); } diff --git a/dist/ueblueprint.min.js b/dist/ueblueprint.min.js index 2dcfd95..5f48582 100644 --- a/dist/ueblueprint.min.js +++ b/dist/ueblueprint.min.js @@ -3,32 +3,32 @@ * Copyright 2019 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -const e=window.ShadowRoot&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,t=Symbol(),n=new WeakMap;class i{constructor(e,n,i){if(this._$cssResult$=!0,i!==t)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=n}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=n.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&n.set(i,t))}return t}toString(){return this.cssText}}const r=(e,...n)=>{const r=1===e.length?e[0]:n.reduce(((t,n,i)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if("number"==typeof e)return e;throw Error("Value passed to 'css' function must be a 'css' function result: "+e+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(n)+e[i+1]),e[0]);return new i(r,e,t)},s=e?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let n="";for(const t of e.cssRules)n+=t.cssText;return(e=>new i("string"==typeof e?e:e+"",void 0,t))(n)})(e):e +const e=window.ShadowRoot&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,t=Symbol(),i=new WeakMap;class n{constructor(e,i,n){if(this._$cssResult$=!0,n!==t)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=i}get styleSheet(){let t=this.o;const n=this.t;if(e&&void 0===t){const e=void 0!==n&&1===n.length;e&&(t=i.get(n)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&i.set(n,t))}return t}toString(){return this.cssText}}const s=(e,...i)=>{const s=1===e.length?e[0]:i.reduce(((t,i,n)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if("number"==typeof e)return e;throw Error("Value passed to 'css' function must be a 'css' function result: "+e+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[n+1]),e[0]);return new n(s,e,t)},r=e?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let i="";for(const t of e.cssRules)i+=t.cssText;return(e=>new n("string"==typeof e?e:e+"",void 0,t))(i)})(e):e /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */;var o;const a=window.trustedTypes,l=a?a.emptyScript:"",u=window.reactiveElementPolyfillSupport,c={toAttribute(e,t){switch(t){case Boolean:e=e?l:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let n=e;switch(t){case Boolean:n=null!==e;break;case Number:n=null===e?null:Number(e);break;case Object:case Array:try{n=JSON.parse(e)}catch(e){n=null}}return n}},h=(e,t)=>t!==e&&(t==t||e==e),d={attribute:!0,type:String,converter:c,reflect:!1,hasChanged:h};class p extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(e){var t;null!==(t=this.h)&&void 0!==t||(this.h=[]),this.h.push(e)}static get observedAttributes(){this.finalize();const e=[];return this.elementProperties.forEach(((t,n)=>{const i=this._$Ep(n,t);void 0!==i&&(this._$Ev.set(i,n),e.push(i))})),e}static createProperty(e,t=d){if(t.state&&(t.attribute=!1),this.finalize(),this.elementProperties.set(e,t),!t.noAccessor&&!this.prototype.hasOwnProperty(e)){const n="symbol"==typeof e?Symbol():"__"+e,i=this.getPropertyDescriptor(e,n,t);void 0!==i&&Object.defineProperty(this.prototype,e,i)}}static getPropertyDescriptor(e,t,n){return{get(){return this[t]},set(i){const r=this[e];this[t]=i,this.requestUpdate(e,r,n)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)||d}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const e=Object.getPrototypeOf(this);if(e.finalize(),this.elementProperties=new Map(e.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const e=this.properties,t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];for(const n of t)this.createProperty(n,e[n])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const n=new Set(e.flat(1/0).reverse());for(const e of n)t.unshift(s(e))}else void 0!==e&&t.push(s(e));return t}static _$Ep(e,t){const n=t.attribute;return!1===n?void 0:"string"==typeof n?n:"string"==typeof e?e.toLowerCase():void 0}u(){var e;this._$E_=new Promise((e=>this.enableUpdating=e)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(e=this.constructor.h)||void 0===e||e.forEach((e=>e(this)))}addController(e){var t,n;(null!==(t=this._$ES)&&void 0!==t?t:this._$ES=[]).push(e),void 0!==this.renderRoot&&this.isConnected&&(null===(n=e.hostConnected)||void 0===n||n.call(e))}removeController(e){var t;null===(t=this._$ES)||void 0===t||t.splice(this._$ES.indexOf(e)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((e,t)=>{this.hasOwnProperty(t)&&(this._$Ei.set(t,this[t]),delete this[t])}))}createRenderRoot(){var t;const n=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return((t,n)=>{e?t.adoptedStyleSheets=n.map((e=>e instanceof CSSStyleSheet?e:e.styleSheet)):n.forEach((e=>{const n=document.createElement("style"),i=window.litNonce;void 0!==i&&n.setAttribute("nonce",i),n.textContent=e.cssText,t.appendChild(n)}))})(n,this.constructor.elementStyles),n}connectedCallback(){var e;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostConnected)||void 0===t?void 0:t.call(e)}))}enableUpdating(e){}disconnectedCallback(){var e;null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostDisconnected)||void 0===t?void 0:t.call(e)}))}attributeChangedCallback(e,t,n){this._$AK(e,n)}_$EO(e,t,n=d){var i,r;const s=this.constructor._$Ep(e,n);if(void 0!==s&&!0===n.reflect){const o=(null!==(r=null===(i=n.converter)||void 0===i?void 0:i.toAttribute)&&void 0!==r?r:c.toAttribute)(t,n.type);this._$El=e,null==o?this.removeAttribute(s):this.setAttribute(s,o),this._$El=null}}_$AK(e,t){var n,i;const r=this.constructor,s=r._$Ev.get(e);if(void 0!==s&&this._$El!==s){const e=r.getPropertyOptions(s),o=e.converter,a=null!==(i=null!==(n=null==o?void 0:o.fromAttribute)&&void 0!==n?n:"function"==typeof o?o:null)&&void 0!==i?i:c.fromAttribute;this._$El=s,this[s]=a(t,e.type),this._$El=null}}requestUpdate(e,t,n){let i=!0;void 0!==e&&(((n=n||this.constructor.getPropertyOptions(e)).hasChanged||h)(this[e],t)?(this._$AL.has(e)||this._$AL.set(e,t),!0===n.reflect&&this._$El!==e&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(e,n))):i=!1),!this.isUpdatePending&&i&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var e;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((e,t)=>this[t]=e)),this._$Ei=void 0);let t=!1;const n=this._$AL;try{t=this.shouldUpdate(n),t?(this.willUpdate(n),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostUpdate)||void 0===t?void 0:t.call(e)})),this.update(n)):this._$Ek()}catch(e){throw t=!1,this._$Ek(),e}t&&this._$AE(n)}willUpdate(e){}_$AE(e){var t;null===(t=this._$ES)||void 0===t||t.forEach((e=>{var t;return null===(t=e.hostUpdated)||void 0===t?void 0:t.call(e)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(e){return!0}update(e){void 0!==this._$EC&&(this._$EC.forEach(((e,t)=>this._$EO(t,this[t],e))),this._$EC=void 0),this._$Ek()}updated(e){}firstUpdated(e){}} + */;var o;const a=window.trustedTypes,l=a?a.emptyScript:"",u=window.reactiveElementPolyfillSupport,c={toAttribute(e,t){switch(t){case Boolean:e=e?l:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},h=(e,t)=>t!==e&&(t==t||e==e),d={attribute:!0,type:String,converter:c,reflect:!1,hasChanged:h};class p extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(e){var t;null!==(t=this.h)&&void 0!==t||(this.h=[]),this.h.push(e)}static get observedAttributes(){this.finalize();const e=[];return this.elementProperties.forEach(((t,i)=>{const n=this._$Ep(i,t);void 0!==n&&(this._$Ev.set(n,i),e.push(n))})),e}static createProperty(e,t=d){if(t.state&&(t.attribute=!1),this.finalize(),this.elementProperties.set(e,t),!t.noAccessor&&!this.prototype.hasOwnProperty(e)){const i="symbol"==typeof e?Symbol():"__"+e,n=this.getPropertyDescriptor(e,i,t);void 0!==n&&Object.defineProperty(this.prototype,e,n)}}static getPropertyDescriptor(e,t,i){return{get(){return this[t]},set(n){const s=this[e];this[t]=n,this.requestUpdate(e,s,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)||d}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const e=Object.getPrototypeOf(this);if(e.finalize(),this.elementProperties=new Map(e.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const e=this.properties,t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];for(const i of t)this.createProperty(i,e[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(r(e))}else void 0!==e&&t.push(r(e));return t}static _$Ep(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof e?e.toLowerCase():void 0}u(){var e;this._$E_=new Promise((e=>this.enableUpdating=e)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(e=this.constructor.h)||void 0===e||e.forEach((e=>e(this)))}addController(e){var t,i;(null!==(t=this._$ES)&&void 0!==t?t:this._$ES=[]).push(e),void 0!==this.renderRoot&&this.isConnected&&(null===(i=e.hostConnected)||void 0===i||i.call(e))}removeController(e){var t;null===(t=this._$ES)||void 0===t||t.splice(this._$ES.indexOf(e)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((e,t)=>{this.hasOwnProperty(t)&&(this._$Ei.set(t,this[t]),delete this[t])}))}createRenderRoot(){var t;const i=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return((t,i)=>{e?t.adoptedStyleSheets=i.map((e=>e instanceof CSSStyleSheet?e:e.styleSheet)):i.forEach((e=>{const i=document.createElement("style"),n=window.litNonce;void 0!==n&&i.setAttribute("nonce",n),i.textContent=e.cssText,t.appendChild(i)}))})(i,this.constructor.elementStyles),i}connectedCallback(){var e;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostConnected)||void 0===t?void 0:t.call(e)}))}enableUpdating(e){}disconnectedCallback(){var e;null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostDisconnected)||void 0===t?void 0:t.call(e)}))}attributeChangedCallback(e,t,i){this._$AK(e,i)}_$EO(e,t,i=d){var n,s;const r=this.constructor._$Ep(e,i);if(void 0!==r&&!0===i.reflect){const o=(null!==(s=null===(n=i.converter)||void 0===n?void 0:n.toAttribute)&&void 0!==s?s:c.toAttribute)(t,i.type);this._$El=e,null==o?this.removeAttribute(r):this.setAttribute(r,o),this._$El=null}}_$AK(e,t){var i,n;const s=this.constructor,r=s._$Ev.get(e);if(void 0!==r&&this._$El!==r){const e=s.getPropertyOptions(r),o=e.converter,a=null!==(n=null!==(i=null==o?void 0:o.fromAttribute)&&void 0!==i?i:"function"==typeof o?o:null)&&void 0!==n?n:c.fromAttribute;this._$El=r,this[r]=a(t,e.type),this._$El=null}}requestUpdate(e,t,i){let n=!0;void 0!==e&&(((i=i||this.constructor.getPropertyOptions(e)).hasChanged||h)(this[e],t)?(this._$AL.has(e)||this._$AL.set(e,t),!0===i.reflect&&this._$El!==e&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(e,i))):n=!1),!this.isUpdatePending&&n&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var e;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((e,t)=>this[t]=e)),this._$Ei=void 0);let t=!1;const i=this._$AL;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),null===(e=this._$ES)||void 0===e||e.forEach((e=>{var t;return null===(t=e.hostUpdate)||void 0===t?void 0:t.call(e)})),this.update(i)):this._$Ek()}catch(e){throw t=!1,this._$Ek(),e}t&&this._$AE(i)}willUpdate(e){}_$AE(e){var t;null===(t=this._$ES)||void 0===t||t.forEach((e=>{var t;return null===(t=e.hostUpdated)||void 0===t?void 0:t.call(e)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(e){return!0}update(e){void 0!==this._$EC&&(this._$EC.forEach(((e,t)=>this._$EO(t,this[t],e))),this._$EC=void 0),this._$Ek()}updated(e){}firstUpdated(e){}} /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -var m;p.finalized=!0,p.elementProperties=new Map,p.elementStyles=[],p.shadowRootOptions={mode:"open"},null==u||u({ReactiveElement:p}),(null!==(o=globalThis.reactiveElementVersions)&&void 0!==o?o:globalThis.reactiveElementVersions=[]).push("1.3.4");const g=globalThis.trustedTypes,v=g?g.createPolicy("lit-html",{createHTML:e=>e}):void 0,b=`lit$${(Math.random()+"").slice(9)}$`,f="?"+b,y=`<${f}>`,E=document,w=(e="")=>E.createComment(e),S=e=>null===e||"object"!=typeof e&&"function"!=typeof e,k=Array.isArray,P=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,C=/-->/g,x=/>/g,A=RegExp(">|[ \t\n\f\r](?:([^\\s\"'>=/]+)([ \t\n\f\r]*=[ \t\n\f\r]*(?:[^ \t\n\f\r\"'`<>=]|(\"|')|))|$)","g"),N=/'/g,$=/"/g,L=/^(?:script|style|textarea|title)$/i,O=(e=>(t,...n)=>({_$litType$:e,strings:t,values:n}))(1),M=Symbol.for("lit-noChange"),T=Symbol.for("lit-nothing"),D=new WeakMap,H=E.createTreeWalker(E,129,null,!1),_=(e,t)=>{const n=e.length-1,i=[];let r,s=2===t?"":"",o=P;for(let t=0;t"===l[0]?(o=null!=r?r:P,u=-1):void 0===l[1]?u=-2:(u=o.lastIndex-l[2].length,a=l[1],o=void 0===l[3]?A:'"'===l[3]?$:N):o===$||o===N?o=A:o===C||o===x?o=P:(o=A,r=void 0);const h=o===A&&e[t+1].startsWith("/>")?" ":"";s+=o===P?n+y:u>=0?(i.push(a),n.slice(0,u)+"$lit$"+n.slice(u)+b+h):n+b+(-2===u?(i.push(void 0),t):h)}const a=s+(e[n]||"")+(2===t?"":"");if(!Array.isArray(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return[void 0!==v?v.createHTML(a):a,i]};class I{constructor({strings:e,_$litType$:t},n){let i;this.parts=[];let r=0,s=0;const o=e.length-1,a=this.parts,[l,u]=_(e,t);if(this.el=I.createElement(l,n),H.currentNode=this.el.content,2===t){const e=this.el.content,t=e.firstChild;t.remove(),e.append(...t.childNodes)}for(;null!==(i=H.nextNode())&&a.length0){i.textContent=g?g.emptyScript:"";for(let n=0;nk(e)||"function"==typeof(null==e?void 0:e[Symbol.iterator]))(e)?this.S(e):this.T(e)}j(e,t=this._$AB){return this._$AA.parentNode.insertBefore(e,t)}k(e){this._$AH!==e&&(this._$AR(),this._$AH=this.j(e))}T(e){this._$AH!==T&&S(this._$AH)?this._$AA.nextSibling.data=e:this.k(E.createTextNode(e)),this._$AH=e}$(e){var t;const{values:n,_$litType$:i}=e,r="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=I.createElement(i.h,this.options)),i);if((null===(t=this._$AH)||void 0===t?void 0:t._$AD)===r)this._$AH.m(n);else{const e=new R(r,this),t=e.p(this.options);e.m(n),this.k(t),this._$AH=e}}_$AC(e){let t=D.get(e.strings);return void 0===t&&D.set(e.strings,t=new I(e)),t}S(e){k(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let n,i=0;for(const r of e)i===t.length?t.push(n=new G(this.j(w()),this.j(w()),this,this.options)):n=t[i],n._$AI(r),i++;i2||""!==n[0]||""!==n[1]?(this._$AH=Array(n.length-1).fill(new String),this.strings=n):this._$AH=T}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(e,t=this,n,i){const r=this.strings;let s=!1;if(void 0===r)e=B(this,e,t,0),s=!S(e)||e!==this._$AH&&e!==M,s&&(this._$AH=e);else{const i=e;let o,a;for(e=r[0],o=0;oe}):void 0,b=`lit$${(Math.random()+"").slice(9)}$`,f="?"+b,y=`<${f}>`,E=document,w=(e="")=>E.createComment(e),S=e=>null===e||"object"!=typeof e&&"function"!=typeof e,k=Array.isArray,P=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,C=/-->/g,x=/>/g,A=RegExp(">|[ \t\n\f\r](?:([^\\s\"'>=/]+)([ \t\n\f\r]*=[ \t\n\f\r]*(?:[^ \t\n\f\r\"'`<>=]|(\"|')|))|$)","g"),N=/'/g,$=/"/g,L=/^(?:script|style|textarea|title)$/i,O=(e=>(t,...i)=>({_$litType$:e,strings:t,values:i}))(1),T=Symbol.for("lit-noChange"),M=Symbol.for("lit-nothing"),D=new WeakMap,H=E.createTreeWalker(E,129,null,!1),_=(e,t)=>{const i=e.length-1,n=[];let s,r=2===t?"":"",o=P;for(let t=0;t"===l[0]?(o=null!=s?s:P,u=-1):void 0===l[1]?u=-2:(u=o.lastIndex-l[2].length,a=l[1],o=void 0===l[3]?A:'"'===l[3]?$:N):o===$||o===N?o=A:o===C||o===x?o=P:(o=A,s=void 0);const h=o===A&&e[t+1].startsWith("/>")?" ":"";r+=o===P?i+y:u>=0?(n.push(a),i.slice(0,u)+"$lit$"+i.slice(u)+b+h):i+b+(-2===u?(n.push(void 0),t):h)}const a=r+(e[i]||"")+(2===t?"":"");if(!Array.isArray(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return[void 0!==v?v.createHTML(a):a,n]};class I{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let s=0,r=0;const o=e.length-1,a=this.parts,[l,u]=_(e,t);if(this.el=I.createElement(l,i),H.currentNode=this.el.content,2===t){const e=this.el.content,t=e.firstChild;t.remove(),e.append(...t.childNodes)}for(;null!==(n=H.nextNode())&&a.length0){n.textContent=g?g.emptyScript:"";for(let i=0;ik(e)||"function"==typeof(null==e?void 0:e[Symbol.iterator]))(e)?this.S(e):this.T(e)}j(e,t=this._$AB){return this._$AA.parentNode.insertBefore(e,t)}k(e){this._$AH!==e&&(this._$AR(),this._$AH=this.j(e))}T(e){this._$AH!==M&&S(this._$AH)?this._$AA.nextSibling.data=e:this.k(E.createTextNode(e)),this._$AH=e}$(e){var t;const{values:i,_$litType$:n}=e,s="number"==typeof n?this._$AC(e):(void 0===n.el&&(n.el=I.createElement(n.h,this.options)),n);if((null===(t=this._$AH)||void 0===t?void 0:t._$AD)===s)this._$AH.m(i);else{const e=new R(s,this),t=e.p(this.options);e.m(i),this.k(t),this._$AH=e}}_$AC(e){let t=D.get(e.strings);return void 0===t&&D.set(e.strings,t=new I(e)),t}S(e){k(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,n=0;for(const s of e)n===t.length?t.push(i=new G(this.j(w()),this.j(w()),this,this.options)):i=t[n],i._$AI(s),n++;n2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=M}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(e,t=this,i,n){const s=this.strings;let r=!1;if(void 0===s)e=B(this,e,t,0),r=!S(e)||e!==this._$AH&&e!==T,r&&(this._$AH=e);else{const n=e;let o,a;for(e=s[0],o=0;o{var i,r;const s=null!==(i=null==n?void 0:n.renderBefore)&&void 0!==i?i:t;let o=s._$litPart$;if(void 0===o){const e=null!==(r=null==n?void 0:n.renderBefore)&&void 0!==r?r:null;s._$litPart$=o=new G(t.insertBefore(w(),e),e,void 0,null!=n?n:{})}return o._$AI(e),o})(t,this.renderRoot,this.renderOptions)}connectedCallback(){var e;super.connectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!0)}disconnectedCallback(){var e;super.disconnectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!1)}render(){return M}}Y.finalized=!0,Y._$litElement$=!0,null===(q=globalThis.litElementHydrateSupport)||void 0===q||q.call(globalThis,{LitElement:Y});const Z=globalThis.litElementPolyfillSupport;null==Z||Z({LitElement:Y}),(null!==(X=globalThis.litElementVersions)&&void 0!==X?X:globalThis.litElementVersions=[]).push("3.2.2");class J{static alphaPattern="repeating-conic-gradient(#7c8184 0% 25%, #c2c3c4 0% 50%) 50% / 10px 10px";static colorDragEventName="ueb-color-drag";static colorPickEventName="ueb-color-pick";static colorWindowEventName="ueb-color-window";static deleteNodesKeyboardKey="Delete";static dragGeneralEventName="ueb-drag-general";static dragEventName="ueb-drag";static editTextEventName={begin:"ueb-edit-text-begin",end:"ueb-edit-text-end"};static enableZoomIn=["LeftControl","RightControl"];static expandGridSize=400;static focusEventName={begin:"blueprint-focus",end:"blueprint-unfocus"};static fontSize=r``;static gridAxisLineColor=r``;static gridExpandThreshold=.25;static gridLineColor=r``;static gridLineWidth=1;static gridSet=8;static gridSetLineColor=r``;static gridShrinkThreshold=4;static gridSize=16;static hexColorRegex=/^\s*#(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})([0-9a-fA-F]{2})?|#(?[0-9a-fA-F])(?[0-9a-fA-F])(?[0-9a-fA-F])\s*$/;static keysSeparator="+";static linkCurveHeight=15;static linkCurveWidth=80;static linkMinWidth=100;static linkRightSVGPath=(e,t,n)=>{let i=100-e;return`M ${e} 0 C ${t} 0, ${n} 0, 50 50 S ${i-t+e} 100, ${i} 100`};static maxZoom=7;static minZoom=-12;static mouseWheelFactor=.2;static nodeDeleteEventName="ueb-node-delete";static nodeDragGeneralEventName="ueb-node-drag-general";static nodeDragEventName="ueb-node-drag";static nodeName=(e,t)=>`${e}_${t}`;static nodeRadius=8;static nodeReflowEventName="ueb-node-reflow";static pinColor={"/Script/CoreUObject.LinearColor":r``,"/Script/CoreUObject.Rotator":r``,"/Script/CoreUObject.Transform":r``,"/Script/CoreUObject.Vector":r``,"/Script/Engine.Actor":r``,bool:r``,default:r``,exec:r``,int:r``,name:r``,real:r``,string:r``};static selectAllKeyboardKey="(bCtrl=True,Key=A)";static trackingMouseEventName={begin:"ueb-tracking-mouse-begin",end:"ueb-tracking-mouse-end"};static windowApplyEventName="ueb-window-apply";static windowCancelEventName="ueb-window-cancel";static windowCloseEventName="ueb-window-close";static ModifierKeys=["Ctrl","Shift","Alt","Meta"];static Keys={Backspace:"Backspace",Tab:"Tab",LeftControl:"ControlLeft",RightControl:"ControlRight",LeftShift:"ShiftLeft",RightShift:"ShiftRight",LeftAlt:"AltLeft",RightAlt:"AltRight",Enter:"Enter",Pause:"Pause",CapsLock:"CapsLock",Escape:"Escape",Space:"Space",PageUp:"PageUp",PageDown:"PageDown",End:"End",Home:"Home",ArrowLeft:"Left",ArrowUp:"Up",ArrowRight:"Right",ArrowDown:"Down",PrintScreen:"PrintScreen",Insert:"Insert",Delete:"Delete",Zero:"Digit0",One:"Digit1",Two:"Digit2",Three:"Digit3",Four:"Digit4",Five:"Digit5",Six:"Digit6",Seven:"Digit7",Eight:"Digit8",Nine:"Digit9",A:"KeyA",B:"KeyB",C:"KeyC",D:"KeyD",E:"KeyE",F:"KeyF",G:"KeyG",H:"KeyH",I:"KeyI",K:"KeyK",L:"KeyL",M:"KeyM",N:"KeyN",O:"KeyO",P:"KeyP",Q:"KeyQ",R:"KeyR",S:"KeyS",T:"KeyT",U:"KeyU",V:"KeyV",W:"KeyW",X:"KeyX",Y:"KeyY",Z:"KeyZ",NumPadZero:"Numpad0",NumPadOne:"Numpad1",NumPadTwo:"Numpad2",NumPadThree:"Numpad3",NumPadFour:"Numpad4",NumPadFive:"Numpad5",NumPadSix:"Numpad6",NumPadSeven:"Numpad7",NumPadEight:"Numpad8",NumPadNine:"Numpad9",Multiply:"NumpadMultiply",Add:"NumpadAdd",Subtract:"NumpadSubtract",Decimal:"NumpadDecimal",Divide:"NumpadDivide",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",NumLock:"NumLock",ScrollLock:"ScrollLock"}}class Q{#e;get target(){return this.#e}#t;get blueprint(){return this.#t}options;constructor(e,t,n={}){n.consumeEvent??=!1,n.listenOnFocus??=!1,n.unlistenOnTextEdit??=!1,this.#e=e,this.#t=t,this.options=n;let i=this;this.listenHandler=e=>i.listenEvents(),this.unlistenHandler=e=>i.unlistenEvents(),this.options.listenOnFocus&&(this.blueprint.addEventListener(J.focusEventName.begin,this.listenHandler),this.blueprint.addEventListener(J.focusEventName.end,this.unlistenHandler)),this.options.unlistenOnTextEdit&&(this.blueprint.addEventListener(J.editTextEventName.begin,this.unlistenHandler),this.blueprint.addEventListener(J.editTextEventName.end,this.listenHandler))}unlistenDOMElement(){this.unlistenEvents(),this.blueprint.removeEventListener(J.focusEventName.begin,this.listenHandler),this.blueprint.removeEventListener(J.focusEventName.end,this.unlistenHandler),this.blueprint.removeEventListener(J.editTextEventName.begin,this.unlistenHandler),this.blueprint.removeEventListener(J.editTextEventName.end,this.listenHandler)}listenEvents(){}unlistenEvents(){}}class ee{#n;constructor(e){this.#n=e}calculate(e){return this.#n(e)}}class te{static#i=new Map;static registerSerializer(e,t){te.#i.set(e,t)}static getSerializer(e){return te.#i.get(e)}}class ne{#r;get type(){return this.#r}set type(e){this.#r=e}#s=!0;get showDefault(){return this.#s}set showDefault(e){this.#s=e}#o;get value(){return this.#o}set value(e){this.#o=e}#a;get serialized(){return this.#a}set serialized(e){this.#a=e}#l;get ignored(){return this.#l}set ignored(e){this.#l=e}static sanitize(e,t){return void 0===t&&(t=e?.constructor),t&&!(e?.constructor===t||e instanceof t)&&(e=new t(e)),(e instanceof Boolean||e instanceof Number||e instanceof String)&&(e=e.valueOf()),e}constructor(e,t=!0,n,i=!1,r=!1){void 0===n&&(n=e instanceof Array?[]:i?"":()=>ne.sanitize(new e)),this.#r=e,this.#s=t,this.#o=n,this.#a=i,this.#l=r}}class ie{static emptyObj={};static booleanConverter={fromAttribute:(e,t)=>{},toAttribute:(e,t)=>!0===e?"true":!1===e?"false":""};static sigmoid(e,t=1.7){return 1/(1+e/(1-e)**-t)}static clamp(e,t,n){return Math.min(Math.max(e,t),n)}static getScale(e){const t=getComputedStyle(e).getPropertyValue("--ueb-scale");return""!=t?parseFloat(t):1}static minDecimals(e,t=1){const n=e*10**t;return Math.abs(n%1)>Number.EPSILON?e.toString():e.toFixed(t)}static roundDecimals(e,t=1){const n=10**t;return Math.round(e*n)/n}static convertLocation(e,t){const n=1/ie.getScale(t),i=t.getBoundingClientRect();return[Math.round((e[0]-i.x)*n),Math.round((e[1]-i.y)*n)]}static isSerialized(e,t,n=ie.objectGet(e.constructor.attributes,t)){return n instanceof ee?ie.isSerialized(e,t,n.calculate(e)):n instanceof ne&&(!!n.serialized||ie.isSerialized(e,t,n.type))}static objectGet(e,t,n){if(void 0!==e){if(!(t instanceof Array))throw new TypeError("Expected keys to be an array.");return 0!=t.length&&t[0]in e&&void 0!==e[t[0]]?1==t.length?e[t[0]]:ie.objectGet(e[t[0]],t.slice(1),n):n}}static objectSet(e,t,n,i=!1,r=Object){if(!(t instanceof Array))throw new TypeError("Expected keys to be an array.");if(1==t.length){if(i||t[0]in e||void 0===e[t[0]])return e[t[0]]=n,!0}else if(t.length>0)return!i||e[t[0]]instanceof Object||(e[t[0]]=new r),ie.objectSet(e[t[0]],t.slice(1),n,i,r);return!1}static equals(e,t){return(e=ne.sanitize(e))===(t=ne.sanitize(t))||(e instanceof Array&&t instanceof Array?e.length==t.length&&!e.find(((e,n)=>!ie.equals(e,t[n]))):void 0)}static getType(e){return null===e?null:e instanceof ne?ie.getType(e.type):e instanceof Function?e:e?.constructor}static snapToGrid(e,t){return 1===t?e:[t*Math.round(e[0]/t),t*Math.round(e[1]/t)]}static mergeArrays(e=[],t=[]){let n=[];for(let i=0;i","\n").replaceAll(/(\)/g,"")}static formatStringName(e){return e.trim().replace(/^b/,"").replaceAll(/(?<=[a-z])(?=[A-Z])|_|\s+/g," ")}static getIdFromReference(e){return e.replace(/(?:.+\.)?([^\.]+)$/,"$1").replaceAll(/(?<=[a-z\d])(?=[A-Z])|(?<=[a-zA-Z])(?=\d)|(?<=[A-Z]{2})(?=[A-Z][a-z])/g,"-").toLocaleLowerCase()}static printLinearColor(e){return`${Math.round(255*e.R.valueOf())}, ${Math.round(255*e.G.valueOf())}, ${Math.round(255*e.B.valueOf())}`}static getPolarCoordinates([e,t],n=!1){let i=Math.atan2(t,e);return n&&i<0&&(i=2*Math.PI+i),[Math.sqrt(e*e+t*t),i]}static getCartesianCoordinates([e,t]){return[e*Math.cos(t),e*Math.sin(t)]}static range(e,t,n=1){return Array.from({length:Math.ceil((t-e)/n)},((t,i)=>e+i*n))}}class re extends class{#u=new Map;subscribe(e,t){let n=this.#u;if(n.has(e)){let i=n.get(e);if(i.includes(t))return!1;i.push(t)}else{let i=!1,r=Object.getOwnPropertyDescriptor(this,e);if(!r&&(i=!0,r=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this),e)??{},!r))return!1;n.set(e,[t]);const s="value"in r,o="set"in r;if(!s&&!o)throw new Error(`Property ${e} is not a value or a setter`);const a=Symbol.for(e+"Storage"),l=Symbol.for(e+"ValInfo");Object.defineProperties(i?Object.getPrototypeOf(this):this,{[a]:{configurable:!0,enumerable:!1,...s?{value:this[e],writable:!0}:{get:r.get,set:r.set}},[l]:{configurable:!0,enumerable:!1,value:[i,s]},[e]:{configurable:!0,...s&&{get(){return this[a]}},set(t){this[a]=t,n.get(e).forEach((t=>{t(this[e])}))}}})}return!0}unsubscribe(e,t){let n=this.#u.get(e);if(!n?.includes(t))return!1;if(n.splice(n.indexOf(t),1),0==n.length){const t=Symbol.for(e+"Storage"),n=Symbol.for(e+"ValInfo"),i=this[n][0];this[n][1],Object.defineProperty(i?Object.getPrototypeOf(this):this,e,Object.getOwnPropertyDescriptor(i?Object.getPrototypeOf(this):this,t)),delete this[n],delete this[t]}return!0}}{static attributes={};constructor(e){super();const t=(e,n,i,r="")=>{for(let s of ie.mergeArrays(Object.getOwnPropertyNames(n),Object.getOwnPropertyNames(i??{}))){let o=ie.objectGet(i,[s]),a=n[s],l=ie.getType(a);if(a instanceof ee&&(a=a.calculate(this),l=ie.getType(a)),s in n?s in i||void 0===a||a instanceof ne&&(!a.showDefault||a.ignored)||console.warn(`${this.constructor.name} will add attribute ${r}${s} not defined in the serialized data`):console.warn(`Attribute ${r}${s} in the serialized data is not defined in ${this.constructor.name}.attributes`),l!==Object)if(void 0===o){if(a instanceof ne){if(!a.showDefault){e[s]=void 0;continue}a.serialized?a="":(l=a.type,a=a.value,a instanceof Function&&(a=a()))}a instanceof Array&&(a=[]),e[s]=ne.sanitize(a,l)}else o?.constructor===String&&a instanceof ne&&a.serialized&&a.type!==String&&(o=te.getSerializer(a.type).deserialize(o)),e[s]=ne.sanitize(o,ie.getType(a));else e[s]={},t(e[s],n[s],i[s],s+".")}},n=this.constructor.attributes;e.constructor!==Object&&1==Object.getOwnPropertyNames(n).length&&(e={[Object.getOwnPropertyNames(n)[0]]:e}),t(this,n,e)}}class se extends re{static attributes={type:String,path:String};constructor(e={}){super(e),this.type,this.path}}class oe extends re{static attributes={MemberParent:se,MemberName:""};constructor(e={}){super(e),this.MemberParent,this.MemberName}}class ae extends re{static attributes={value:String};static generateGuid(e=!0){let t=new Uint32Array(4);!0===e&&crypto.getRandomValues(t);let n="";return t.forEach((e=>{n+=("0".repeat(8)+e.toString(16).toUpperCase()).slice(-8)})),new ae({value:n})}constructor(e={}){super(e),this.value}valueOf(){return this.value}toString(){return this.value}}class le extends re{static attributes={value:String};static attributeConverter={fromAttribute:(e,t)=>new le(e),toAttribute:(e,t)=>e.toString()};constructor(e={}){super(e),this.value}valueOf(){return this.value}toString(){return this.value}}class ue extends re{static attributes={value:Number};constructor(e=0){super(e),this.value=Math.round(this.value)}valueOf(){return this.value}toString(){return this.value.toString()}}class ce extends re{static lookbehind="INVTEXT";static attributes={value:String};constructor(e={}){super(e),this.value}}class he extends re{static attributes={ActionName:"",bShift:!1,bCtrl:!1,bAlt:!1,bCmd:!1,Key:le};constructor(e={}){e.ActionName=e.ActionName??"",e.bShift=e.bShift??!1,e.bCtrl=e.bCtrl??!1,e.bAlt=e.bAlt??!1,e.bCmd=e.bCmd??!1,super(e),this.ActionName,this.bShift,this.bCtrl,this.bAlt,this.bCmd,this.Key}}class de extends re{static attributes={value:0};constructor(e=0){super(e),this.value=ie.clamp(this.value,0,1)}valueOf(){return this.value}toString(){return this.value.toFixed(6)}}class pe extends re{static attributes={R:de,G:de,B:de,A:new ne(de,!0,(()=>new de(1)),!1,!0),H:new ne(de,!0,void 0,!1,!0),S:new ne(de,!0,void 0,!1,!0),V:new ne(de,!0,void 0,!1,!0)};static linearToSRGB(e){return e<=0?0:e>=1?1:e<.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055}static sRGBtoLinear(e){return e<=0?0:e>=1?1:e<.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}constructor(e={}){super(e),this.R,this.G,this.B,this.A,this.H,this.S,this.V,this.#c()}#c(){const e=this.R.value,t=this.G.value,n=this.B.value;if(!(Math.abs(e-t)>Number.EPSILON||Math.abs(e-n)>Number.EPSILON||Math.abs(t-n)>Number.EPSILON))return void(this.V.value=0);const i=Math.max(e,t,n),r=Math.min(e,t,n),s=i-r;let o;switch(i){case r:o=0;break;case e:o=(t-n)/s+(te.toString(16).toUpperCase().padStart(2,"0"))).join("")}toSRGBAString(){return this.toSRGBA().map((e=>e.toString(16).toUpperCase().padStart(2,"0"))).join("")}toHSVA(){const e=this.R.value,t=this.G.value,n=this.B.value,i=this.A.value,r=Math.max(e,t,n),s=Math.min(e,t,n),o=0==r?0:(r-s)/r,a=r;return[this.H.value,o,a,i]}toNumber(){return(this.R.value<<24)+(this.G.value<<16)+(this.B.value<<8)+this.A.value}setFromRGBANumber(e){this.A.value=(255&e)/255,this.B.value=(e>>8&255)/255,this.G.value=(e>>16&255)/255,this.R.value=(e>>24&255)/255,this.#c()}setFromSRGBANumber(e){this.A.value=(255&e)/255,this.B.value=pe.sRGBtoLinear((e>>8&255)/255),this.G.value=pe.sRGBtoLinear((e>>16&255)/255),this.R.value=pe.sRGBtoLinear((e>>24&255)/255),this.#c()}toString(){return ie.printLinearColor(this)}}class me extends re{static lookbehind="NSLOCTEXT";static attributes={namespace:String,key:String,value:String};constructor(e={}){super(e),this.namespace,this.key,this.value}}class ge extends re{static attributes={value:String};constructor(e={}){super(e),this.value}valueOf(){return this.value}toString(){return this.value}}class ve extends re{static attributes={objectName:ge,pinGuid:ae};constructor(e={}){super(e),this.objectName,this.pinGuid}}class be extends re{static attributes={R:Number,P:Number,Y:Number};constructor(e={}){super(e),this.R,this.P,this.Y}}class fe extends be{}class ye extends re{static attributes={X:Number,Y:Number,Z:Number};constructor(e={}){super(e),this.X,this.Y,this.Z}}class Ee extends ye{}class we extends re{static#h={"/Script/CoreUObject.LinearColor":pe,"/Script/CoreUObject.Rotator":be,"/Script/CoreUObject.Vector":ye,bool:Boolean,exec:String,int:ue,name:String,real:Number,string:String};static#d={"/Script/CoreUObject.Vector":Ee,"/Script/CoreUObject.Rotator":fe};static lookbehind="Pin";static attributes={PinId:ae,PinName:"",PinFriendlyName:new ne(me,!1,null),PinToolTip:"",Direction:new ne(String,!1,""),PinType:{PinCategory:"",PinSubCategory:"",PinSubCategoryObject:se,PinSubCategoryMemberReference:null,PinValueType:null,ContainerType:se,bIsReference:!1,bIsConst:!1,bIsWeakPointer:!1,bIsUObjectWrapper:!1,bSerializeAsSinglePrecisionFloat:!1},LinkedTo:new ne([ve],!1),DefaultValue:new ee((e=>new ne(we.getEntityType(e.getType(),!0)??String,!1,void 0,!0))),AutogeneratedDefaultValue:new ne(String,!1),DefaultObject:new ne(se,!1,null),PersistentGuid:ae,bHidden:!1,bNotConnectable:!1,bDefaultValueIsReadOnly:!1,bDefaultValueIsIgnored:!1,bAdvancedView:!1,bOrphanedPin:!1};static getEntityType(e,t=!1){const[n,i]=[this.#h[e],this.#d[e]];return t&&void 0!==i?i:n}constructor(e={}){super(e),this.PinId,this.PinName,this.PinFriendlyName,this.PinToolTip,this.Direction,this.PinType,this.LinkedTo,this.DefaultValue,this.AutogeneratedDefaultValue,this.DefaultObject,this.PersistentGuid,this.bHidden,this.bNotConnectable,this.bDefaultValueIsReadOnly,this.bDefaultValueIsIgnored,this.bAdvancedView,this.bOrphanedPin}getType(){return"struct"==this.PinType.PinCategory||"object"==this.PinType.PinCategory?this.PinType.PinSubCategoryObject.path:this.PinType.PinCategory}getDefaultValue(){return this.DefaultValue}isHidden(){return this.bHidden}isInput(){return!this.bHidden&&"EGPD_Output"!=this.Direction}isOutput(){return!this.bHidden&&"EGPD_Output"==this.Direction}isLinked(){return this.LinkedTo?.length>0??!1}linkTo(e,t){this.LinkedTo;const n=this.LinkedTo?.find((n=>n.objectName.toString()==e&&n.pinGuid.valueOf()==t.PinId.valueOf()));return!n&&((this.LinkedTo??(this.LinkedTo=[])).push(new ve({objectName:e,pinGuid:t.PinId})),!0)}unlinkFrom(e,t){const n=this.LinkedTo?.findIndex((n=>n.objectName.toString()==e&&n.pinGuid.valueOf()==t.PinId.valueOf()));return n>=0&&(1==this.LinkedTo.length?this.LinkedTo=void 0:this.LinkedTo.splice(n,1),!0)}getSubCategory(){return this.PinType.PinSubCategoryObject.path}}class Se extends re{static attributes={MemberName:String,MemberGuid:ae,bSelfContext:!1}}class ke extends re{static attributes={Class:se,Name:"",bIsPureFunc:new ne(Boolean,!1,!1),VariableReference:new ne(Se,!1,null),FunctionReference:new ne(oe,!1,null),EventReference:new ne(oe,!1,null),TargetType:new ne(se,!1,null),NodePosX:ue,NodePosY:ue,AdvancedPinDisplay:new ne(le,!1,null),EnabledState:new ne(le,!1,null),NodeGuid:ae,ErrorType:new ne(ue,!1),ErrorMsg:new ne(String,!1,""),CustomProperties:[we]};static nameRegex=/(\w+)_(\d+)/;constructor(e={}){super(e),this.Class,this.Name,this.bIsPureFunc,this.VariableReference,this.FunctionReference,this.EventReference,this.TargetType,this.NodePosX,this.NodePosY,this.AdvancedPinDisplay,this.EnabledState,this.NodeGuid,this.ErrorType,this.ErrorMsg,this.CustomProperties}getObjectName(e=!1){return e?this.getNameAndCounter()[0]:this.Name}getNameAndCounter(){const e=this.getObjectName(!1).match(ke.nameRegex);return e&&3==e.length?[e[1],parseInt(e[2])]:["",0]}getDisplayName(){let e=this.FunctionReference?.MemberName;return e?(e=ie.formatStringName(e),e):(e=ie.formatStringName(this.getNameAndCounter()[0]),e)}getCounter(){return this.getNameAndCounter()[1]}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Pe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ce={exports:{}};"undefined"!=typeof self&&self;var xe=Pe(Ce.exports=function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:i})},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){function i(e){if(!(this instanceof i))return new i(e);this._=e}var r=i.prototype;function s(e,t){for(var n=0;n>7),buf:function(e){var t=o((function(e,t,n,i){return e.concat(n===i.length-1?Buffer.from([t,0]).readUInt16BE(0):i.readUInt16BE(n))}),[],e);return Buffer.from(a((function(e){return(e<<1&65535)>>8}),t))}(n.buf)}})),n}function u(){return"undefined"!=typeof Buffer}function c(){if(!u())throw new Error("Buffer global does not exist; please use webpack if you need to parse Buffers in the browser.")}function h(e){c();var t=o((function(e,t){return e+t}),0,e);if(t%8!=0)throw new Error("The bits ["+e.join(", ")+"] add up to "+t+" which is not an even number of bytes; the total should be divisible by 8");var n,r=t/8,s=(n=function(e){return e>48},o((function(e,t){return e||(n(t)?t:e)}),null,e));if(s)throw new Error(s+" bit range requested exceeds 48 bit (6 byte) Number max.");return new i((function(t,n){var i=r+n;return i>t.length?S(n,r.toString()+" bytes"):w(i,o((function(e,t){var n=l(t,e.buf);return{coll:e.coll.concat(n.v),buf:n.buf}}),{coll:[],buf:t.slice(n,i)},e).coll)}))}function d(e,t){return new i((function(n,i){return c(),i+t>n.length?S(i,t+" bytes for "+e):w(i+t,n.slice(i,i+t))}))}function p(e,t){if("number"!=typeof(n=t)||Math.floor(n)!==n||t<0||t>6)throw new Error(e+" requires integer length in range [0, 6].");var n}function m(e){return p("uintBE",e),d("uintBE("+e+")",e).map((function(t){return t.readUIntBE(0,e)}))}function g(e){return p("uintLE",e),d("uintLE("+e+")",e).map((function(t){return t.readUIntLE(0,e)}))}function v(e){return p("intBE",e),d("intBE("+e+")",e).map((function(t){return t.readIntBE(0,e)}))}function b(e){return p("intLE",e),d("intLE("+e+")",e).map((function(t){return t.readIntLE(0,e)}))}function f(e){return e instanceof i}function y(e){return"[object Array]"==={}.toString.call(e)}function E(e){return u()&&Buffer.isBuffer(e)}function w(e,t){return{status:!0,index:e,value:t,furthest:-1,expected:[]}}function S(e,t){return y(t)||(t=[t]),{status:!1,index:-1,value:null,furthest:e,expected:t}}function k(e,t){if(!t)return e;if(e.furthest>t.furthest)return e;var n=e.furthest===t.furthest?function(e,t){if(function(){if(void 0!==i._supportsSet)return i._supportsSet;var e="undefined"!=typeof Set;return i._supportsSet=e,e}()&&Array.from){for(var n=new Set(e),r=0;r=0;){if(o in n){i=n[o].line,0===s&&(s=n[o].lineStart);break}("\n"===e.charAt(o)||"\r"===e.charAt(o)&&"\n"!==e.charAt(o+1))&&(r++,0===s&&(s=o+1)),o--}var a=i+r,l=t-s;return n[t]={line:a,lineStart:s},{offset:t,line:a+1,column:l+1}}function x(e){if(!f(e))throw new Error("not a parser: "+e)}function A(e,t){return"string"==typeof e?e.charAt(t):e[t]}function N(e){if("number"!=typeof e)throw new Error("not a number: "+e)}function $(e){if("function"!=typeof e)throw new Error("not a function: "+e)}function L(e){if("string"!=typeof e)throw new Error("not a string: "+e)}var O=2,M=3,T=8,D=5*T,H=4*T,_=" ";function I(e,t){return new Array(t+1).join(e)}function B(e,t,n){var i=t-e.length;return i<=0?e:I(n,i)+e}function R(e,t,n,i){return{from:e-t>0?e-t:0,to:e+n>i?i:e+n}}function G(e,t){var n,i,r,s,l,u=t.index,c=u.offset,h=1;if(c===e.length)return"Got the end of the input";if(E(e)){var d=c-c%T,p=c-d,m=R(d,D,H+T,e.length),g=a((function(e){return a((function(e){return B(e.toString(16),2,"0")}),e)}),function(e,t){var n=e.length,i=[],r=0;if(n<=t)return[e.slice()];for(var s=0;s=4&&(n+=1),h=2,r=a((function(e){return e.length<=4?e.join(" "):e.slice(0,4).join(" ")+" "+e.slice(4).join(" ")}),g),(l=(8*(s.to>0?s.to-1:s.to)).toString(16).length)<2&&(l=2)}else{var v=e.split(/\r\n|[\n\r\u2028\u2029]/);n=u.column-1,i=u.line-1,s=R(i,O,M,v.length),r=v.slice(s.from,s.to),l=s.to.toString().length}var b=i-s.from;return E(e)&&(l=(8*(s.to>0?s.to-1:s.to)).toString(16).length)<2&&(l=2),o((function(t,i,r){var o,a=r===b,u=a?"> ":_;return o=E(e)?B((8*(s.from+r)).toString(16),l,"0"):B((s.from+r+1).toString(),l," "),[].concat(t,[u+o+" | "+i],a?[_+I(" ",l)+" | "+B("",n," ")+I("^",h)]:[])}),[],r).join("\n")}function F(e,t){return["\n","-- PARSING FAILED "+I("-",50),"\n\n",G(e,t),"\n\n",(n=t.expected,1===n.length?"Expected:\n\n"+n[0]:"Expected one of the following: \n\n"+n.join(", ")),"\n"].join("");var n}function z(e){return void 0!==e.flags?e.flags:[e.global?"g":"",e.ignoreCase?"i":"",e.multiline?"m":"",e.unicode?"u":"",e.sticky?"y":""].join("")}function j(){for(var e=[].slice.call(arguments),t=e.length,n=0;n=2?N(t):t=0;var n=function(e){return RegExp("^(?:"+e.source+")",z(e))}(e),r=""+e;return i((function(e,i){var s=n.exec(e.slice(i));if(s){if(0<=t&&t<=s.length){var o=s[0],a=s[t];return w(i+o.length,a)}return S(i,"valid match group (0 to "+s.length+") in "+r)}return S(i,r)}))}function Y(e){return i((function(t,n){return w(n,e)}))}function Z(e){return i((function(t,n){return S(n,e)}))}function J(e){if(f(e))return i((function(t,n){var i=e._(t,n);return i.index=n,i.value="",i}));if("string"==typeof e)return J(q(e));if(e instanceof RegExp)return J(X(e));throw new Error("not a string, regexp, or parser: "+e)}function Q(e){return x(e),i((function(t,n){var i=e._(t,n),r=t.slice(n,i.index);return i.status?S(n,'not "'+r+'"'):w(n,null)}))}function ee(e){return $(e),i((function(t,n){var i=A(t,n);return n=e.length?S(t,"any character/byte"):w(t+1,A(e,t))})),se=i((function(e,t){return w(e.length,e.slice(t))})),oe=i((function(e,t){return t=0})).desc(t)},i.optWhitespace=he,i.Parser=i,i.range=function(e,t){return ee((function(n){return e<=n&&n<=t})).desc(e+"-"+t)},i.regex=X,i.regexp=X,i.sepBy=W,i.sepBy1=K,i.seq=j,i.seqMap=V,i.seqObj=function(){for(var e,t={},n=0,r=(e=arguments,Array.prototype.slice.call(e)),s=r.length,o=0;o255)throw new Error("Value specified to byte constructor ("+e+"=0x"+e.toString(16)+") is larger in value than a single byte.");var t=(e>15?"0x":"0x0")+e.toString(16);return i((function(n,i){var r=A(n,i);return r===e?w(i+1,r):S(i,t)}))},buffer:function(e){return d("buffer",e).map((function(e){return Buffer.from(e)}))},encodedString:function(e,t){return d("string",t).map((function(t){return t.toString(e)}))},uintBE:m,uint8BE:m(1),uint16BE:m(2),uint32BE:m(4),uintLE:g,uint8LE:g(1),uint16LE:g(2),uint32LE:g(4),intBE:v,int8BE:v(1),int16BE:v(2),int32BE:v(4),intLE:b,int8LE:b(1),int16LE:b(2),int32LE:b(4),floatBE:d("floatBE",4).map((function(e){return e.readFloatBE(0)})),floatLE:d("floatLE",4).map((function(e){return e.readFloatLE(0)})),doubleBE:d("doubleBE",8).map((function(e){return e.readDoubleBE(0)})),doubleLE:d("doubleLE",8).map((function(e){return e.readDoubleLE(0)}))},e.exports=i}]));let Ae=xe;class Ne{static getGrammarForType(e,t,n=e.AttributeAnyValue){if(t instanceof ne){let i=Ne.getGrammarForType(e,t.type,n);return!t.serialized||t.type instanceof String||(i=i.wrap(Ae.string('"'),Ae.string('"'))),i}switch(ie.getType(t)){case Array:return Ae.seqMap(Ae.string("("),t.map((t=>Ne.getGrammarForType(e,ie.getType(t)))).reduce(((t,n)=>n&&t!==e.AttributeAnyValue?t.or(n):e.AttributeAnyValue)).trim(Ae.optWhitespace).sepBy(Ae.string(",")).skip(Ae.regex(/,?\s*/)),Ae.string(")"),((e,t,n)=>t));case Boolean:return e.Boolean;case oe:return e.FunctionReference;case ae:return e.Guid;case le:return e.Identifier;case ue:return e.Integer;case ce:return e.InvariantText;case pe:return e.LinearColor;case me:return e.LocalizedText;case Number:return e.Number;case se:return e.Reference;case we:return e.Pin;case ve:return e.PinReference;case de:return e.RealUnit;case be:return e.Rotator;case fe:return e.SimpleSerializationRotator;case Ee:return e.SimpleSerializationVector;case String:return e.String;case ye:return e.Vector;default:return n}}static createAttributeGrammar=(e,t,n=Ae.string("=").trim(Ae.optWhitespace))=>e.AttributeName.skip(n).chain((n=>{const i=n.split("."),r=ie.objectGet(t.attributes,i);return Ne.getGrammarForType(e,r,e.AttributeAnyValue).map((e=>t=>ie.objectSet(t,i,e,!0)))}));static createEntityGrammar=(e,t)=>Ae.seqMap(t.lookbehind?Ae.seq(Ae.string(t.lookbehind),Ae.optWhitespace,Ae.string("(")):Ae.string("("),Ne.createAttributeGrammar(e,t).trim(Ae.optWhitespace).sepBy(Ae.string(",")).skip(Ae.regex(/,?/).then(Ae.optWhitespace)),Ae.string(")"),((e,n,i)=>{let r={};return n.forEach((e=>e(r))),new t(r)}));InlineWhitespace=e=>Ae.regex(/[^\S\n]+/).desc("inline whitespace");InlineOptWhitespace=e=>Ae.regex(/[^\S\n]*/).desc("inline optional whitespace");MultilineWhitespace=e=>Ae.regex(/[^\S\n]*\n\s*/).desc("whitespace with at least a newline");Null=e=>Ae.seq(Ae.string("("),e.InlineOptWhitespace,Ae.string(")")).map((e=>null)).desc("null: ()");Boolean=e=>Ae.alt(Ae.string("True"),Ae.string("true"),Ae.string("False"),Ae.string("false")).map((e=>"true"===e.toLocaleLowerCase())).desc("either True or False");HexDigit=e=>Ae.regex(/[0-9a-fA-f]/).desc("hexadecimal digit");Number=e=>Ae.regex(/[-\+]?[0-9]+(?:\.[0-9]+)?/).map(Number).desc("a number");RealNumber=e=>Ae.regex(/[-\+]?[0-9]+\.[0-9]+/).map(Number).desc("a number written as real");RealUnit=e=>Ae.regex(/\+?[0-9]+(?:\.[0-9]+)?/).map(Number).assert((e=>e>=0&&e<=1)).desc("a number between 0 and 1");NaturalNumber=e=>Ae.regex(/0|[1-9]\d*/).map(Number).desc("a natural number");ColorNumber=e=>e.NaturalNumber.assert((e=>0<=e&&e<256),"the color must be between 0 and 256 excluded");Word=e=>Ae.regex(/[a-zA-Z]+/).desc("a word");String=e=>Ae.regex(/(?:[^"\\]|\\.)*/).wrap(Ae.string('"'),Ae.string('"')).map(ie.unescapeString).desc('string (with possibility to escape the quote using ")');ReferencePath=e=>Ae.seq(Ae.string("/"),e.PathSymbol.map((e=>e.toString())).sepBy1(Ae.string(".")).tieWith(".")).tie().atLeast(2).tie().desc('a path (words with possibly underscore, separated by ".", separated by "/")');AttributeName=e=>e.Word.sepBy1(Ae.string(".")).tieWith(".").desc('words separated by ""');None=e=>Ae.string("None").map((e=>new se({type:"None",path:""}))).desc("none");Integer=e=>Ae.regex(/[\-\+]?[0-9]+/).map((e=>new ue(e))).desc("an integer");Guid=e=>e.HexDigit.times(32).tie().map((e=>new ae({value:e}))).desc("32 digit hexadecimal value");Identifier=e=>Ae.regex(/\w+/).map((e=>new le(e)));PathSymbol=e=>Ae.regex(/[0-9\w]+/).map((e=>new ge({value:e})));Reference=e=>Ae.alt(e.None,...[e.ReferencePath.map((e=>new se({type:"",path:e})))].flatMap((e=>[e,e.trim(Ae.string('"'))])),Ae.seqMap(e.Word,Ae.optWhitespace,Ae.alt(...[e.ReferencePath].flatMap((e=>[e.wrap(Ae.string('"'),Ae.string('"')),e.wrap(Ae.string("'\""),Ae.string("\"'"))]))),((e,t,n)=>new se({type:e,path:n}))),e.Word.map((e=>new se({type:e,path:""}))));LocalizedText=e=>Ae.seqMap(Ae.string(me.lookbehind).skip(Ae.optWhitespace).skip(Ae.string("(")),e.String.trim(Ae.optWhitespace),Ae.string(","),e.String.trim(Ae.optWhitespace),Ae.string(","),e.String.trim(Ae.optWhitespace),Ae.string(")"),((e,t,n,i,r,s,o)=>new me({namespace:t,key:i,value:s})));InvariantText=e=>e.String.trim(Ae.optWhitespace).wrap(Ae.string(ce.lookbehind).skip(Ae.optWhitespace).skip(Ae.string("(")),Ae.string(")")).map((e=>new ce({value:e})));AttributeAnyValue=e=>Ae.alt(e.Null,e.None,e.Boolean,e.Number,e.Integer,e.String,e.Guid,e.LocalizedText,e.InvariantText,e.Reference,e.Vector,e.LinearColor);PinReference=e=>Ae.seqMap(e.PathSymbol,Ae.whitespace,e.Guid,((e,t,n)=>new ve({objectName:e,pinGuid:n})));Vector=e=>Ne.createEntityGrammar(e,ye);Rotator=e=>Ne.createEntityGrammar(e,be);SimpleSerializationRotator=e=>Ae.seqMap(e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,((e,t,n,i,r)=>new fe({R:r,P:e,Y:n})));SimpleSerializationVector=e=>Ae.seqMap(e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,((e,t,n,i,r)=>new Ee({X:e,Y:n,Z:r})));LinearColor=e=>Ne.createEntityGrammar(e,pe);FunctionReference=e=>Ne.createEntityGrammar(e,oe);KeyBinding=e=>Ae.alt(e.Identifier.map((e=>new he({Key:e}))),Ne.createEntityGrammar(e,he));Pin=e=>Ne.createEntityGrammar(e,we);CustomProperties=e=>Ae.string("CustomProperties").then(Ae.whitespace).then(e.Pin).map((e=>t=>{let n=ie.objectGet(t,["CustomProperties"],[]);n.push(e),ie.objectSet(t,["CustomProperties"],n,!0)}));Object=e=>Ae.seqMap(Ae.seq(Ae.string("Begin"),Ae.whitespace,Ae.string("Object"),Ae.whitespace),Ae.alt(e.CustomProperties,Ne.createAttributeGrammar(e,ke)).sepBy1(Ae.whitespace),Ae.seq(e.MultilineWhitespace,Ae.string("End"),Ae.whitespace,Ae.string("Object")),((e,t,n)=>{let i={};return t.forEach((e=>e(i))),new ke(i)}));MultipleObject=e=>e.Object.sepBy1(Ae.whitespace).trim(Ae.optWhitespace);LinearColorFromHex=e=>Ae.string("#").then(e.HexDigit.times(2).tie().times(3,4)).trim(Ae.optWhitespace).map((([e,t,n,i])=>new pe({R:parseInt(e,16)/255,G:parseInt(t,16)/255,B:parseInt(n,16)/255,A:i?parseInt(i,16)/255:1})));LinearColorFromRGBList=e=>Ae.seqMap(e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber.map(Number),((e,t,n,i,r)=>new pe({R:e/255,G:n/255,B:r/255,A:1})));LinearColorFromRGB=e=>Ae.string("rgb").then(e.LinearColorFromRGBList.wrap(Ae.regex(/\(\s*/),Ae.regex(/\s*\)/)));LinearColorFromRGBA=e=>Ae.string("rgba").then(Ae.seqMap(e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber.map(Number),Ae.string(",").skip(Ae.optWhitespace),Ae.regex(/0?\.\d+|[01]/).map(Number),((e,t,n,i,r,s,o)=>new pe({R:e/255,G:n/255,B:r/255,A:o}))).wrap(Ae.regex(/\(\s*/),Ae.regex(/\s*\)/)));LinearColorFromAnyColor=e=>Ae.alt(e.LinearColorFromRGBList,e.LinearColorFromHex,e.LinearColorFromRGB,e.LinearColorFromRGBA)}class $e{static grammar=xe.createLanguage(new Ne);constructor(e,t="",n=",",i=!1,r="=",s=(e=>e.join("."))){this.entityType=e,this.prefix=t,this.separator=n,this.trailingSeparator=i,this.attributeValueConjunctionSign=r,this.attributeKeyPrinter=s}deserialize(e){return this.read(e)}serialize(e,t=!1,n=e){return this.write(n,e,t)}read(e){throw new Error("Not implemented")}write(e,t,n){throw new Error("Not implemented")}writeValue(e,t,n,i){const r=te.getSerializer(ie.getType(t));if(!r)throw new Error("Unknown value type, a serializer must be registered in the SerializerFactory class");return r.write(e,t,i)}subWrite(e,t,n,i){let r="",s=t.concat("");const o=s.length-1;for(const t of Object.getOwnPropertyNames(n)){s[o]=t;const a=n[t];if(a?.constructor===Object)r+=(r.length?this.separator:"")+this.subWrite(e,s,a,i);else if(void 0!==a&&this.showProperty(e,n,s,a)){const t=ie.isSerialized(e,s);r+=(r.length?this.separator:"")+this.prefix+this.attributeKeyPrinter(s)+this.attributeValueConjunctionSign+(t?`"${this.writeValue(e,a,s,!0)}"`:this.writeValue(e,a,s,i))}}return this.trailingSeparator&&r.length&&1===s.length&&(r+=this.separator),r}showProperty(e,t,n,i){const r=this.entityType.attributes,s=ie.objectGet(r,n);return!(s instanceof ne)||!s.ignored&&(!ie.equals(s.value,i)||s.showDefault)}}class Le extends $e{constructor(){super(ke," ","\n",!1)}showProperty(e,t,n,i){switch(n.toString()){case"Class":case"Name":case"CustomProperties":return!1}return super.showProperty(e,t,n,i)}read(e){const t=$e.grammar.Object.parse(e);if(!t.status)throw new Error("Error when trying to parse the object.");return t.value}readMultiple(e){const t=$e.grammar.MultipleObject.parse(e);if(!t.status)throw new Error("Error when trying to parse the object.");return t.value}write(e,t,n){return`Begin Object Class=${t.Class.path} Name=${this.writeValue(e,t.Name,["Name"],n)}\n${this.subWrite(e,[],t,n)+t.CustomProperties.map((e=>this.separator+this.prefix+"CustomProperties "+te.getSerializer(we).serialize(e))).join("")}\nEnd Object\n`}}class Oe extends Q{static#p=new Le;#m;constructor(e,t,n={}){n.listenOnFocus??=!0,n.unlistenOnTextEdit??=!0,super(e,t,n);let i=this;this.#m=e=>i.copied()}listenEvents(){document.body.addEventListener("copy",this.#m)}unlistenEvents(){document.body.removeEventListener("copy",this.#m)}copied(){const e=this.blueprint.getNodes(!0).map((e=>Oe.#p.serialize(e.entity,!1))).join("\n\n");navigator.clipboard.writeText(e)}}class Me{static styles=r``;element;#g=[];get inputObjects(){return this.#g}constructed(e){this.element=e}createInputObjects(){return[]}connectedCallback(){}willUpdate(e){}update(e){}render(){return T}firstUpdated(e){}updated(e){}inputSetup(){this.#g=this.createInputObjects()}cleanup(){this.#g.forEach((e=>e.unlistenDOMElement()))}}class Te extends Q{#v;constructor(e,t,n={}){n.activateAnyKey??=!1,n.activationKeys??=[],n.listenOnFocus??=!0,n.unlistenOnTextEdit??=!0,n.activationKeys instanceof Array||(n.activationKeys=[n.activationKeys]),n.activationKeys=n.activationKeys.map((e=>{if(e instanceof he)return e;if(e.constructor===String){const t=$e.grammar.KeyBinding.parse(e);if(t.status)return t.value}throw new Error("Unexpected key value")})),super(e,t,n),this.#v=this.options.activationKeys??[];let i=this;this.keyDownHandler=e=>{(this.options.activateAnyKey||i.#v.some((t=>(e=>e.bShift||"LeftShift"==e.Key||"RightShift"==e.Key)(t)==e.shiftKey&&(e=>e.bCtrl||"LeftControl"==e.Key||"RightControl"==e.Key)(t)==e.ctrlKey&&(e=>e.bAlt||"LeftAlt"==e.Key||"RightAlt"==e.Key)(t)==e.altKey&&J.Keys[t.Key]==e.code)))&&(n.consumeEvent&&e.stopImmediatePropagation(),i.fire(),document.removeEventListener("keydown",i.keyDownHandler),document.addEventListener("keyup",i.keyUpHandler))},this.keyUpHandler=e=>{(this.options.activateAnyKey||i.#v.some((t=>t.bShift&&"Shift"==e.key||t.bCtrl&&"Control"==e.key||t.bAlt&&"Alt"==e.key||t.bCmd&&"Meta"==e.key||J.Keys[t.Key]==e.code)))&&(n.consumeEvent&&e.stopImmediatePropagation(),i.unfire(),document.removeEventListener("keyup",this.keyUpHandler),document.addEventListener("keydown",this.keyDownHandler))}}listenEvents(){document.addEventListener("keydown",this.keyDownHandler)}unlistenEvents(){document.removeEventListener("keydown",this.keyDownHandler)}fire(){}unfire(){}}class De extends Te{constructor(e,t,n={}){n.activationKeys=J.deleteNodesKeyboardKey,super(e,t,n)}fire(){this.blueprint.removeGraphElement(...this.blueprint.getNodes(!0))}}class He extends Q{constructor(e,t,n={}){n.ignoreTranslateCompensate??=!1,n.movementSpace??=t.getGridDOMElement()??document.documentElement,super(e,t,n),this.movementSpace=n.movementSpace}locationFromEvent(e){const t=ie.convertLocation([e.clientX,e.clientY],this.movementSpace);return this.options.ignoreTranslateCompensate?t:this.blueprint.compensateTranslation(t)}}class _e extends He{#b;#f;constructor(e,t,n={}){n.listenOnFocus=!0,n.strictTarget??=!1,super(e,t,n),this.strictTarget=n.strictTarget;const i=this;this.#b=e=>{e.preventDefault();const t=i.locationFromEvent(e);i.wheel(Math.sign(e.deltaY*J.mouseWheelFactor),t)},this.#f=e=>e.preventDefault(),this.blueprint.focused&&this.movementSpace.addEventListener("wheel",this.#b,!1)}listenEvents(){this.movementSpace.addEventListener("wheel",this.#b,!1),this.movementSpace.parentElement?.addEventListener("wheel",this.#f)}unlistenEvents(){this.movementSpace.removeEventListener("wheel",this.#b,!1),this.movementSpace.parentElement?.removeEventListener("wheel",this.#f)}wheel(e,t){}}class Ie extends _e{#y=!1;get enableZoonIn(){return this.#y}set enableZoonIn(e){(e=Boolean(e))!=this.#y&&(this.#y=e)}wheel(e,t){let n=this.blueprint.getZoom();e=-e,!this.enableZoonIn&&0==n&&e>0||(n+=e,this.blueprint.setZoom(n,t))}}class Be extends Te{#E;constructor(e,t,n={}){n.activationKeys=J.enableZoomIn,super(e,t,n)}fire(){this.#E=this.blueprint.getInputObject(Ie),this.#E.enableZoonIn=!0}unfire(){this.#E.enableZoonIn=!1}}class Re extends Te{constructor(e,t,n={}){n.activationKeys=J.selectAllKeyboardKey,super(e,t,n)}fire(){this.blueprint.selectAll()}}class Ge extends He{#w;#S;#k;#P;#C=!1;#x;#A;started=!1;stepSize=1;clickedPosition=[0,0];clickedOffset=[0,0];mouseLocation=[0,0];constructor(e,t,n={}){n.clickButton??=0,n.consumeEvent??=!0,n.draggableElement??=e,n.exitAnyButton??=!0,n.moveEverywhere??=!1,n.movementSpace??=t?.getGridDOMElement(),n.repositionOnClick??=!1,n.strictTarget??=!1,super(e,t,n),this.stepSize=parseInt(n?.stepSize??J.gridSize),this.#x=this.options.moveEverywhere?document.documentElement:this.movementSpace,this.#A=this.options.draggableElement;let i=this;this.#w=e=>{if(i.blueprint.setFocused(!0),e.button===i.options.clickButton)i.options.strictTarget&&e.target!=e.currentTarget||(i.options.consumeEvent&&e.stopImmediatePropagation(),i.#x.addEventListener("mousemove",i.#S),document.addEventListener("mouseup",i.#P),i.clickedPosition=i.locationFromEvent(e),i.clickedOffset=[i.clickedPosition[0]-i.target.locationX,i.clickedPosition[1]-i.target.locationY],i.clicked(i.clickedPosition));else i.options.exitAnyButton||i.#P(e)},this.#S=e=>{i.options.consumeEvent&&e.stopImmediatePropagation(),i.#x.removeEventListener("mousemove",i.#S),i.#x.addEventListener("mousemove",i.#k);const t=i.getEvent(J.trackingMouseEventName.begin);i.#C=0==i.target.dispatchEvent(t);const n=i.locationFromEvent(e);this.mouseLocation=ie.snapToGrid(this.clickedPosition,this.stepSize),i.startDrag(n),i.started=!0},this.#k=e=>{i.options.consumeEvent&&e.stopImmediatePropagation();const t=i.locationFromEvent(e),n=[e.movementX,e.movementY];i.dragTo(t,n),i.#C&&(i.blueprint.mousePosition=i.locationFromEvent(e))},this.#P=e=>{if(!i.options.exitAnyButton||e.button==i.options.clickButton){if(i.options.consumeEvent&&e.stopImmediatePropagation(),i.#x.removeEventListener("mousemove",i.#S),i.#x.removeEventListener("mousemove",i.#k),document.removeEventListener("mouseup",i.#P),i.started&&i.endDrag(),i.unclicked(),i.#C){const e=i.getEvent(J.trackingMouseEventName.end);i.target.dispatchEvent(e),i.#C=!1}i.started=!1}},this.listenEvents()}listenEvents(){this.#A.addEventListener("mousedown",this.#w),2==this.options.clickButton&&this.#A.addEventListener("contextmenu",(e=>e.preventDefault()))}unlistenEvents(){this.#A.removeEventListener("mousedown",this.#w)}getEvent(e){return new CustomEvent(e,{detail:{tracker:this},bubbles:!0,cancelable:!0})}clicked(e){}startDrag(e){}dragTo(e,t){}endDrag(){}unclicked(e){}}class Fe extends Ge{startDrag(){this.blueprint.scrolling=!0}dragTo(e,t){this.blueprint.scrollDelta([-t[0],-t[1]])}endDrag(){this.blueprint.scrolling=!1}}class ze extends He{#N=null;#$;#L;#O;constructor(e,t,n={}){n.listenOnFocus=!0,super(e,t,n);let i=this;this.#$=e=>{e.preventDefault(),i.blueprint.mousePosition=i.locationFromEvent(e)},this.#L=e=>{i.#N||(e.preventDefault(),this.#N=e.detail.tracker,i.unlistenMouseMove())},this.#O=e=>{i.#N==e.detail.tracker&&(e.preventDefault(),i.#N=null,i.listenMouseMove())}}listenMouseMove(){this.target.addEventListener("mousemove",this.#$)}unlistenMouseMove(){this.target.removeEventListener("mousemove",this.#$)}listenEvents(){this.listenMouseMove(),this.blueprint.addEventListener(J.trackingMouseEventName.begin,this.#L),this.blueprint.addEventListener(J.trackingMouseEventName.end,this.#O)}unlistenEvents(){this.unlistenMouseMove(),this.blueprint.removeEventListener(J.trackingMouseEventName.begin,this.#L),this.blueprint.removeEventListener(J.trackingMouseEventName.end,this.#O)}}class je extends Y{static properties={};#M=[];#t;get blueprint(){return this.#t}set blueprint(e){this.#t=e}#T;get entity(){return this.#T}set entity(e){this.#T=e}#D;get template(){return this.#D}inputObjects=[];constructor(e,t){super(),this.#T=e,this.#D=t,this.inputObjects=[],this.#D.constructed(this)}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.blueprint=this.closest("ueb-blueprint"),this.template.connectedCallback()}willUpdate(e){super.willUpdate(e),this.template.willUpdate(e)}update(e){super.update(e),this.template.update(e)}render(){return this.template.render()}firstUpdated(e){super.firstUpdated(e),this.template.firstUpdated(e),this.template.inputSetup()}updated(e){super.updated(e),this.template.updated(e),this.#M.forEach((t=>t(e))),this.#M=[]}disconnectedCallback(){super.disconnectedCallback(),this.template.cleanup()}addNextUpdatedCallbacks(e,t=!1){this.#M.push(e),t&&this.requestUpdate()}isSameGraph(e){return this.blueprint&&this.blueprint==e?.blueprint}getInputObject(e){return this.template.inputObjects.find((t=>t.constructor==e))}}class Ve extends je{static properties={...super.properties,locationX:{type:Number,attribute:!1},locationY:{type:Number,attribute:!1}};static dragEventName=J.dragEventName;static dragGeneralEventName=J.dragGeneralEventName;constructor(e,t){super(e,t),this.locationX=0,this.locationY=0}setLocation([e,t]){const n=[e-this.locationX,t-this.locationY];if(this.locationX=e,this.locationY=t,this.blueprint){const e=new CustomEvent(this.constructor.dragEventName,{detail:{value:n},bubbles:!1,cancelable:!0});this.dispatchEvent(e)}}addLocation([e,t]){this.setLocation([this.locationX+e,this.locationY+t])}dispatchDragEvent(e){const t=new CustomEvent(this.constructor.dragGeneralEventName,{detail:{value:e},bubbles:!0,cancelable:!0});this.dispatchEvent(t)}snapToGrid(){const e=ie.snapToGrid([this.locationX,this.locationY],J.gridSize);this.locationX==e[0]&&this.locationY==e[1]||this.setLocation(e)}}class Ue extends Ve{static properties={...super.properties,selected:{type:Boolean,attribute:"data-selected",reflect:!0,converter:ie.booleanConverter}};constructor(...e){super(...e),this.selected=!1,this.listeningDrag=!1;let t=this;this.dragHandler=e=>t.addLocation(e.detail.value)}connectedCallback(){super.connectedCallback(),this.setSelected(this.selected)}disconnectedCallback(){super.disconnectedCallback(),this.blueprint.removeEventListener(J.nodeDragGeneralEventName,this.dragHandler)}setSelected(e=!0){this.selected=e,this.blueprint&&(this.selected?(this.listeningDrag=!0,this.blueprint.addEventListener(J.nodeDragGeneralEventName,this.dragHandler)):(this.blueprint.removeEventListener(J.nodeDragGeneralEventName,this.dragHandler),this.listeningDrag=!1))}}class We extends Ge{clicked(e){this.options.repositionOnClick&&(this.target.setLocation(this.stepSize>1?ie.snapToGrid(e,this.stepSize):e),this.clickedOffset=[0,0])}dragTo(e,t){const n=[this.target.locationX,this.target.locationY],[i,r]=this.stepSize>1?[ie.snapToGrid(e,this.stepSize),ie.snapToGrid(n,this.stepSize)]:[e,n];0==(t=[i[0]-this.mouseLocation[0],i[1]-this.mouseLocation[1]])[0]&&0==t[1]||(t[0]+=r[0]-this.target.locationX,t[1]+=r[1]-this.target.locationY,this.dragAction(i,t),this.mouseLocation=i)}dragAction(e,t){this.target.setLocation([e[0]-this.clickedOffset[0],e[1]-this.clickedOffset[1]])}}class Ke extends Me{getDraggableElement(){return this.element}createDraggableObject(){return new We(this.element,this.element.blueprint,{draggableElement:this.getDraggableElement()})}createInputObjects(){return[...super.createInputObjects(),this.createDraggableObject()]}}class qe extends Ke{update(e){super.update(e),e.has("locationX")&&(this.element.style.left=`${this.element.locationX}px`),e.has("locationY")&&(this.element.style.top=`${this.element.locationY}px`)}}class Xe extends We{startDrag(){this.target.selected||(this.blueprint.unselectAll(),this.target.setSelected(!0))}dragAction(e,t){this.target.dispatchDragEvent(t)}unclicked(){this.started||(this.blueprint.unselectAll(),this.target.setSelected(!0))}}class Ye extends qe{getDraggableElement(){return this.element}createDraggableObject(){return new Xe(this.element,this.element.blueprint,{draggableElement:this.getDraggableElement()})}firstUpdated(e){super.firstUpdated(e),this.element.selected&&!this.element.listeningDrag&&this.element.setSelected(!0)}}class Ze extends Ge{constructor(e,t,n={}){n.consumeEvent=!0,super(e,t,n)}}class Je extends je{static properties={...super.properties,fromX:{type:Number,attribute:!1},fromY:{type:Number,attribute:!1},toX:{type:Number,attribute:!1},toY:{type:Number,attribute:!1}};constructor(...e){super(...e),this.fromX=0,this.fromY=0,this.toX=0,this.toY=0}setBothLocations([e,t]){this.fromX=e,this.fromY=t,this.toX=e,this.toY=t}addSourceLocation([e,t]){this.fromX+=e,this.fromY+=t}addDestinationLocation([e,t]){this.toX+=e,this.toY+=t}}class Qe extends Me{update(e){super.update(e);const[t,n,i,r]=[Math.round(this.element.fromX),Math.round(this.element.fromY),Math.round(this.element.toX),Math.round(this.element.toY)],[s,o,a,l]=[Math.min(t,i),Math.min(n,r),Math.abs(t-i),Math.abs(n-r)];(e.has("fromX")||e.has("toX"))&&(this.element.style.left=`${s}px`,this.element.style.width=`${a}px`),(e.has("fromY")||e.has("toY"))&&(this.element.style.top=`${o}px`,this.element.style.height=`${l}px`)}}class et extends Qe{static decreasingValue(e,t){const n=-e*t[0]**2,i=t[1]-n/t[0];return e=>n/e+i}static clampedLine(e,t){if(e[0]>t[0]){const n=e;e=t,t=n}const n=(t[1]-e[1])/(t[0]-e[0]),i=e[1]-n*e[0];return r=>rt[0]?t[1]:n*r+i}static c1DecreasingValue=et.decreasingValue(-.15,[100,15]);static c2DecreasingValue=et.decreasingValue(-.06,[500,130]);static c2Clamped=et.clampedLine([0,100],[200,30]);willUpdate(e){super.willUpdate(e);const t=Math.max(Math.abs(this.element.fromX-this.element.toX),1),n=Math.max(t,J.linkMinWidth),i=t/n,r=this.element.originatesFromInput?this.element.fromXthis.element.toY?1:0)),this.element.style.setProperty("--ueb-start-percentage",`${Math.round(this.element.startPercentage)}%`),this.element.style.setProperty("--ueb-link-start",`${Math.round(this.element.startPixels)}`)}render(){const e="ueb-id-"+Math.floor(1e12*Math.random());return O` ${""!=this.element.linkMessageIcon||""!=this.element.linkMessageText?O``:T}`}}class tt extends Je{static properties={...super.properties,source:{type:String,reflect:!0},destination:{type:String,reflect:!0},dragging:{type:Boolean,attribute:"data-dragging",converter:ie.booleanConverter,reflect:!0},originatesFromInput:{type:Boolean,attribute:!1},svgPathD:{type:String,attribute:!1},linkMessageIcon:{type:String,attribute:!1},linkMessageText:{type:String,attribute:!1}};#H;get sourcePin(){return this.#H}set sourcePin(e){this.#_(e,!1)}#I;get destinationPin(){return this.#I}set destinationPin(e){this.#_(e,!0)}#B;#R;#G;#F;#z;pathElement;constructor(e,t){super({},new et);const n=this;this.#B=()=>n.remove(),this.#R=e=>n.addSourceLocation(e.detail.value),this.#G=e=>n.addDestinationLocation(e.detail.value),this.#F=e=>n.setSourceLocation(),this.#z=e=>n.setDestinationLocation(),this.source=null,this.destination=null,this.dragging=!1,this.originatesFromInput=!1,this.startPercentage=0,this.svgPathD="",this.startPixels=0,this.linkMessageIcon="",this.linkMessageText="",e&&(this.sourcePin=e,t||(this.toX=this.fromX,this.toY=this.fromY)),t&&(this.destinationPin=t,e||(this.fromX=this.toX,this.fromY=this.toY)),this.#j()}#_(e,t){const n=()=>t?this.destinationPin:this.sourcePin;if(n()!=e){if(n()){const e=n().getNodeElement();e.removeEventListener(J.nodeDeleteEventName,this.#B),e.removeEventListener(J.nodeDragEventName,t?this.#G:this.#R),e.removeEventListener(J.nodeReflowEventName,t?this.#z:this.#F),this.#V()}if(t?this.#I=e:this.#H=e,n()){const e=n().getNodeElement();e.addEventListener(J.nodeDeleteEventName,this.#B),e.addEventListener(J.nodeDragEventName,t?this.#G:this.#R),e.addEventListener(J.nodeReflowEventName,t?this.#z:this.#F),t?this.setDestinationLocation():(this.setSourceLocation(),this.originatesFromInput=this.sourcePin.isInput()),this.#j()}}}#j(){this.sourcePin&&this.destinationPin&&(this.sourcePin.linkTo(this.destinationPin),this.destinationPin.linkTo(this.sourcePin))}#V(){this.sourcePin&&this.destinationPin&&(this.sourcePin.unlinkFrom(this.destinationPin),this.destinationPin.unlinkFrom(this.sourcePin))}disconnectedCallback(){super.disconnectedCallback(),this.#V(),this.sourcePin=null,this.destinationPin=null}setSourceLocation(e=null){if(null==e){const t=this;if(!this.hasUpdated||!this.sourcePin.hasUpdated)return void Promise.all([this.updateComplete,this.sourcePin.updateComplete]).then((()=>t.setSourceLocation()));e=this.sourcePin.template.getLinkLocation()}const[t,n]=e;this.fromX=t,this.fromY=n}setDestinationLocation(e=null){if(null==e){const t=this;if(!this.hasUpdated||!this.destinationPin.hasUpdated)return void Promise.all([this.updateComplete,this.destinationPin.updateComplete]).then((()=>t.setDestinationLocation()));e=this.destinationPin.template.getLinkLocation()}this.toX=e[0],this.toY=e[1]}startDragging(){this.dragging=!0}finishDragging(){this.dragging=!1}removeMessage(){this.linkMessageIcon="",this.linkMessageText=""}setMessageConvertType(){this.linkMessageIcon="ueb-icon-conver-type",this.linkMessageText=`Convert ${this.sourcePin.pinType} to ${this.destinationPin.pinType}.`}setMessageCorrect(){this.linkMessageIcon="ueb-icon-correct",this.linkMessageText=""}setMessageDirectionsIncompatible(){this.linkMessageIcon="ueb-icon-directions-incompatible",this.linkMessageText="Directions are not compatbile."}setMessagePlaceNode(){this.linkMessageIcon="ueb-icon-place-node",this.linkMessageText="Place a new node."}setMessageReplaceLink(){this.linkMessageIcon="ueb-icon-replace-link",this.linkMessageText="Replace existing input connections."}setMessageSameNode(){this.linkMessageIcon="ueb-icon-same-node",this.linkMessageText="Both are on the same node."}setMEssagetypesIncompatible(){this.linkMessageIcon="ueb-icon-types-incompatible",this.linkMessageText=`${this.sourcePin.pinType} is not compatible with ${this.destinationPin.pinType}.`}}class nt extends Ge{#U;#W;#K;link;enteredPin;linkValid=!1;constructor(e,t,n){super(e,t,n);let i=this;this.#W=e=>{if(!i.enteredPin){i.linkValid=!1,i.enteredPin=e.target;const t=i.enteredPin,n=i.target;t.getNodeElement()==n.getNodeElement()?i.link.setMessageSameNode():t.isOutput()==n.isOutput()||t.isOutput()==n.isOutput()?i.link.setMessageDirectionsIncompatible():i.blueprint.getLinks([t,n]).length?(i.link.setMessageReplaceLink(),i.linkValid=!0):(i.link.setMessageCorrect(),i.linkValid=!0)}},this.#K=e=>{i.enteredPin==e.target&&(i.enteredPin=null,i.linkValid=!1,i.link?.setMessagePlaceNode())}}startDrag(e){this.link=new tt(this.target,null),this.blueprint.linksContainerElement.prepend(this.link),this.link.setMessagePlaceNode(),this.#U=this.blueprint.querySelectorAll("ueb-pin"),this.#U.forEach((e=>{e!=this.target&&(e.getClickableElement().addEventListener("mouseenter",this.#W),e.getClickableElement().addEventListener("mouseleave",this.#K))})),this.link.startDragging(),this.link.setDestinationLocation(e)}dragTo(e,t){this.link.setDestinationLocation(e)}endDrag(){this.#U.forEach((e=>{e.removeEventListener("mouseenter",this.#W),e.removeEventListener("mouseleave",this.#K)})),this.enteredPin&&this.linkValid?(this.blueprint.addGraphElement(this.link),this.link.destinationPin=this.enteredPin,this.link.removeMessage(),this.link.finishDragging()):(this.link.finishDragging(),this.link.remove()),this.enteredPin=null,this.link=null,this.#U=null}}class it extends Me{connectedCallback(){super.connectedCallback(),this.element.nodeElement=this.element.closest("ueb-node")}createInputObjects(){return[new nt(this.element.clickableElement,this.element.blueprint,{moveEverywhere:!0})]}render(){const e=O`
${this.renderIcon()}
`,t=O`
${this.element.getPinDisplayName()} ${this.renderInput()}
`;return O`
${this.element.isInput()?O`${e}${t}`:O`${t}${e}`}
`}renderIcon(){return O``}renderInput(){return T}firstUpdated(e){super.firstUpdated(e),this.element.dataset.id=this.element.GetPinIdValue(),this.element.clickableElement=this.element}getLinkLocation(){const e=this.element.querySelector(".ueb-pin-icon").getBoundingClientRect(),t=ie.convertLocation([(e.left+e.right)/2,(e.top+e.bottom)/2],this.element.blueprint.gridElement);return this.element.blueprint.compensateTranslation(t)}}class rt extends it{#q;firstUpdated(e){super.firstUpdated(e),this.#q=this.element.querySelector(".ueb-pin-input");let t=this;this.onChangeHandler=e=>this.element.setDefaultValue(t.#q.checked),this.#q.addEventListener("change",this.onChangeHandler)}cleanup(){super.cleanup(),this.#q.removeEventListener("change",this.onChangeHandler)}createInputObjects(){return[...super.createInputObjects(),new Ze(this.#q,this.element.blueprint)]}renderInput(){return this.element.isInput()&&!this.element.isLinked?O``:super.renderInput()}}class st extends it{renderIcon(){return O``}} +var q,X;null==K||K(I,G),(null!==(m=globalThis.litHtmlVersions)&&void 0!==m?m:globalThis.litHtmlVersions=[]).push("2.2.7");class Y extends p{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){var e,t;const i=super.createRenderRoot();return null!==(e=(t=this.renderOptions).renderBefore)&&void 0!==e||(t.renderBefore=i.firstChild),i}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=((e,t,i)=>{var n,s;const r=null!==(n=null==i?void 0:i.renderBefore)&&void 0!==n?n:t;let o=r._$litPart$;if(void 0===o){const e=null!==(s=null==i?void 0:i.renderBefore)&&void 0!==s?s:null;r._$litPart$=o=new G(t.insertBefore(w(),e),e,void 0,null!=i?i:{})}return o._$AI(e),o})(t,this.renderRoot,this.renderOptions)}connectedCallback(){var e;super.connectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!0)}disconnectedCallback(){var e;super.disconnectedCallback(),null===(e=this._$Do)||void 0===e||e.setConnected(!1)}render(){return T}}Y.finalized=!0,Y._$litElement$=!0,null===(q=globalThis.litElementHydrateSupport)||void 0===q||q.call(globalThis,{LitElement:Y});const Z=globalThis.litElementPolyfillSupport;null==Z||Z({LitElement:Y}),(null!==(X=globalThis.litElementVersions)&&void 0!==X?X:globalThis.litElementVersions=[]).push("3.2.2");class J{static alphaPattern="repeating-conic-gradient(#7c8184 0% 25%, #c2c3c4 0% 50%) 50% / 10px 10px";static colorDragEventName="ueb-color-drag";static colorPickEventName="ueb-color-pick";static colorWindowEventName="ueb-color-window";static deleteNodesKeyboardKey="Delete";static dragGeneralEventName="ueb-drag-general";static dragEventName="ueb-drag";static editTextEventName={begin:"ueb-edit-text-begin",end:"ueb-edit-text-end"};static enableZoomIn=["LeftControl","RightControl"];static expandGridSize=400;static focusEventName={begin:"blueprint-focus",end:"blueprint-unfocus"};static fontSize=s``;static gridAxisLineColor=s``;static gridExpandThreshold=.25;static gridLineColor=s``;static gridLineWidth=1;static gridSet=8;static gridSetLineColor=s``;static gridShrinkThreshold=4;static gridSize=16;static hexColorRegex=/^\s*#(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})(?[0-9a-fA-F]{2})([0-9a-fA-F]{2})?|#(?[0-9a-fA-F])(?[0-9a-fA-F])(?[0-9a-fA-F])\s*$/;static keysSeparator="+";static linkCurveHeight=15;static linkCurveWidth=80;static linkMinWidth=100;static linkRightSVGPath=(e,t,i)=>{let n=100-e;return`M ${e} 0 C ${t} 0, ${i} 0, 50 50 S ${n-t+e} 100, ${n} 100`};static maxZoom=7;static minZoom=-12;static mouseWheelFactor=.2;static nodeDeleteEventName="ueb-node-delete";static nodeDragGeneralEventName="ueb-node-drag-general";static nodeDragEventName="ueb-node-drag";static nodeName=(e,t)=>`${e}_${t}`;static nodeRadius=8;static nodeReflowEventName="ueb-node-reflow";static pinColor={"/Script/CoreUObject.LinearColor":s``,"/Script/CoreUObject.Rotator":s``,"/Script/CoreUObject.Transform":s``,"/Script/CoreUObject.Vector":s``,"/Script/Engine.Actor":s``,bool:s``,default:s``,exec:s``,int:s``,name:s``,real:s``,string:s``};static selectAllKeyboardKey="(bCtrl=True,Key=A)";static trackingMouseEventName={begin:"ueb-tracking-mouse-begin",end:"ueb-tracking-mouse-end"};static windowApplyEventName="ueb-window-apply";static windowCancelEventName="ueb-window-cancel";static windowCloseEventName="ueb-window-close";static ModifierKeys=["Ctrl","Shift","Alt","Meta"];static Keys={Backspace:"Backspace",Tab:"Tab",LeftControl:"ControlLeft",RightControl:"ControlRight",LeftShift:"ShiftLeft",RightShift:"ShiftRight",LeftAlt:"AltLeft",RightAlt:"AltRight",Enter:"Enter",Pause:"Pause",CapsLock:"CapsLock",Escape:"Escape",Space:"Space",PageUp:"PageUp",PageDown:"PageDown",End:"End",Home:"Home",ArrowLeft:"Left",ArrowUp:"Up",ArrowRight:"Right",ArrowDown:"Down",PrintScreen:"PrintScreen",Insert:"Insert",Delete:"Delete",Zero:"Digit0",One:"Digit1",Two:"Digit2",Three:"Digit3",Four:"Digit4",Five:"Digit5",Six:"Digit6",Seven:"Digit7",Eight:"Digit8",Nine:"Digit9",A:"KeyA",B:"KeyB",C:"KeyC",D:"KeyD",E:"KeyE",F:"KeyF",G:"KeyG",H:"KeyH",I:"KeyI",K:"KeyK",L:"KeyL",M:"KeyM",N:"KeyN",O:"KeyO",P:"KeyP",Q:"KeyQ",R:"KeyR",S:"KeyS",T:"KeyT",U:"KeyU",V:"KeyV",W:"KeyW",X:"KeyX",Y:"KeyY",Z:"KeyZ",NumPadZero:"Numpad0",NumPadOne:"Numpad1",NumPadTwo:"Numpad2",NumPadThree:"Numpad3",NumPadFour:"Numpad4",NumPadFive:"Numpad5",NumPadSix:"Numpad6",NumPadSeven:"Numpad7",NumPadEight:"Numpad8",NumPadNine:"Numpad9",Multiply:"NumpadMultiply",Add:"NumpadAdd",Subtract:"NumpadSubtract",Decimal:"NumpadDecimal",Divide:"NumpadDivide",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",NumLock:"NumLock",ScrollLock:"ScrollLock"}}class Q{#e;get target(){return this.#e}#t;get blueprint(){return this.#t}options;constructor(e,t,i={}){i.consumeEvent??=!1,i.listenOnFocus??=!1,i.unlistenOnTextEdit??=!1,this.#e=e,this.#t=t,this.options=i;let n=this;this.listenHandler=e=>n.listenEvents(),this.unlistenHandler=e=>n.unlistenEvents(),this.options.listenOnFocus&&(this.blueprint.addEventListener(J.focusEventName.begin,this.listenHandler),this.blueprint.addEventListener(J.focusEventName.end,this.unlistenHandler)),this.options.unlistenOnTextEdit&&(this.blueprint.addEventListener(J.editTextEventName.begin,this.unlistenHandler),this.blueprint.addEventListener(J.editTextEventName.end,this.listenHandler))}unlistenDOMElement(){this.unlistenEvents(),this.blueprint.removeEventListener(J.focusEventName.begin,this.listenHandler),this.blueprint.removeEventListener(J.focusEventName.end,this.unlistenHandler),this.blueprint.removeEventListener(J.editTextEventName.begin,this.unlistenHandler),this.blueprint.removeEventListener(J.editTextEventName.end,this.listenHandler)}listenEvents(){}unlistenEvents(){}}class ee{#i;constructor(e){this.#i=e}calculate(e){return this.#i(e)}}class te{static#n=new Map;static registerSerializer(e,t){te.#n.set(e,t)}static getSerializer(e){return te.#n.get(e)}}class ie{#s;get type(){return this.#s}set type(e){this.#s=e}#r=!0;get showDefault(){return this.#r}set showDefault(e){this.#r=e}#o;get value(){return this.#o}set value(e){this.#o=e}#a;get serialized(){return this.#a}set serialized(e){this.#a=e}#l;get ignored(){return this.#l}set ignored(e){this.#l=e}static sanitize(e,t){return void 0===t&&(t=e?.constructor),t&&!(e?.constructor===t||e instanceof t)&&(e=new t(e)),(e instanceof Boolean||e instanceof Number||e instanceof String)&&(e=e.valueOf()),e}constructor(e,t=!0,i,n=!1,s=!1){void 0===i&&(i=e instanceof Array?[]:n?"":()=>ie.sanitize(new e)),this.#s=e,this.#r=t,this.#o=i,this.#a=n,this.#l=s}}class ne{static emptyObj={};static booleanConverter={fromAttribute:(e,t)=>{},toAttribute:(e,t)=>!0===e?"true":!1===e?"false":""};static sigmoid(e,t=1.7){return 1/(1+e/(1-e)**-t)}static clamp(e,t,i){return Math.min(Math.max(e,t),i)}static getScale(e){const t=getComputedStyle(e).getPropertyValue("--ueb-scale");return""!=t?parseFloat(t):1}static minDecimals(e,t=1){const i=e*10**t;return Math.abs(i%1)>Number.EPSILON?e.toString():e.toFixed(t)}static roundDecimals(e,t=1){const i=10**t;return Math.round(e*i)/i}static convertLocation(e,t){const i=1/ne.getScale(t),n=t.getBoundingClientRect();return[Math.round((e[0]-n.x)*i),Math.round((e[1]-n.y)*i)]}static isSerialized(e,t,i=ne.objectGet(e.constructor.attributes,t)){return i instanceof ee?ne.isSerialized(e,t,i.calculate(e)):i instanceof ie&&(!!i.serialized||ne.isSerialized(e,t,i.type))}static objectGet(e,t,i){if(void 0!==e){if(!(t instanceof Array))throw new TypeError("Expected keys to be an array.");return 0!=t.length&&t[0]in e&&void 0!==e[t[0]]?1==t.length?e[t[0]]:ne.objectGet(e[t[0]],t.slice(1),i):i}}static objectSet(e,t,i,n=!1,s=Object){if(!(t instanceof Array))throw new TypeError("Expected keys to be an array.");if(1==t.length){if(n||t[0]in e||void 0===e[t[0]])return e[t[0]]=i,!0}else if(t.length>0)return!n||e[t[0]]instanceof Object||(e[t[0]]=new s),ne.objectSet(e[t[0]],t.slice(1),i,n,s);return!1}static equals(e,t){return(e=ie.sanitize(e))===(t=ie.sanitize(t))||(e instanceof Array&&t instanceof Array?e.length==t.length&&!e.find(((e,i)=>!ne.equals(e,t[i]))):void 0)}static getType(e){return null===e?null:e instanceof ie?ne.getType(e.type):e instanceof Function?e:e?.constructor}static snapToGrid(e,t){return 1===t?e:[t*Math.round(e[0]/t),t*Math.round(e[1]/t)]}static mergeArrays(e=[],t=[]){let i=[];for(let n=0;n","\n").replaceAll(/(\)/g,"")}static formatStringName(e){return e.trim().replace(/^b/,"").replaceAll(/(?<=[a-z])(?=[A-Z])|_|\s+/g," ")}static getIdFromReference(e){return e.replace(/(?:.+\.)?([^\.]+)$/,"$1").replaceAll(/(?<=[a-z\d])(?=[A-Z])|(?<=[a-zA-Z])(?=\d)|(?<=[A-Z]{2})(?=[A-Z][a-z])/g,"-").toLocaleLowerCase()}static printLinearColor(e){return`${Math.round(255*e.R.valueOf())}, ${Math.round(255*e.G.valueOf())}, ${Math.round(255*e.B.valueOf())}`}static getPolarCoordinates([e,t],i=!1){let n=Math.atan2(t,e);return i&&n<0&&(n=2*Math.PI+n),[Math.sqrt(e*e+t*t),n]}static getCartesianCoordinates([e,t]){return[e*Math.cos(t),e*Math.sin(t)]}static range(e,t,i=1){return Array.from({length:Math.ceil((t-e)/i)},((t,n)=>e+n*i))}}class se extends class{#u=new Map;subscribe(e,t){let i=this.#u;if(i.has(e)){let n=i.get(e);if(n.includes(t))return!1;n.push(t)}else{let n=!1,s=Object.getOwnPropertyDescriptor(this,e);if(!s&&(n=!0,s=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this),e)??{},!s))return!1;i.set(e,[t]);const r="value"in s,o="set"in s;if(!r&&!o)throw new Error(`Property ${e} is not a value or a setter`);const a=Symbol.for(e+"Storage"),l=Symbol.for(e+"ValInfo");Object.defineProperties(n?Object.getPrototypeOf(this):this,{[a]:{configurable:!0,enumerable:!1,...r?{value:this[e],writable:!0}:{get:s.get,set:s.set}},[l]:{configurable:!0,enumerable:!1,value:[n,r]},[e]:{configurable:!0,...r&&{get(){return this[a]}},set(t){this[a]=t,i.get(e).forEach((t=>{t(this[e])}))}}})}return!0}unsubscribe(e,t){let i=this.#u.get(e);if(!i?.includes(t))return!1;if(i.splice(i.indexOf(t),1),0==i.length){const t=Symbol.for(e+"Storage"),i=Symbol.for(e+"ValInfo"),n=this[i][0];this[i][1],Object.defineProperty(n?Object.getPrototypeOf(this):this,e,Object.getOwnPropertyDescriptor(n?Object.getPrototypeOf(this):this,t)),delete this[i],delete this[t]}return!0}}{static attributes={};constructor(e){super();const t=(e,i,n={},s="")=>{const r=Object.getOwnPropertyNames(n);for(let o of ne.mergeArrays(Object.getOwnPropertyNames(i),r)){let a=ne.objectGet(n,[o]),l=i[o],u=ne.getType(l);if(l instanceof ee&&(l=l.calculate(this),u=ne.getType(l)),o in i?!(r.length>0)||o in n||void 0===l||l instanceof ie&&(!l.showDefault||l.ignored)||console.warn(`${this.constructor.name} will add attribute ${s}${o} not defined in the serialized data`):console.warn(`Attribute ${s}${o} in the serialized data is not defined in ${this.constructor.name}.attributes`),u!==Object)if(void 0===a){if(l instanceof ie){if(!l.showDefault){e[o]=void 0;continue}l.serialized?l="":(u=l.type,l=l.value,l instanceof Function&&(l=l()))}l instanceof Array&&(l=[]),e[o]=ie.sanitize(l,u)}else a?.constructor===String&&l instanceof ie&&l.serialized&&l.type!==String&&(a=te.getSerializer(l.type).deserialize(a)),e[o]=ie.sanitize(a,ne.getType(l));else e[o]={},t(e[o],i[o],n[o],o+".")}},i=this.constructor.attributes;e.constructor!==Object&&1==Object.getOwnPropertyNames(i).length&&(e={[Object.getOwnPropertyNames(i)[0]]:e}),t(this,i,e)}}class re extends se{static attributes={type:String,path:String};constructor(e={}){super(e),this.type,this.path}}class oe extends se{static attributes={MemberParent:re,MemberName:""};constructor(e={}){super(e),this.MemberParent,this.MemberName}}class ae extends se{static attributes={value:String};static generateGuid(e=!0){let t=new Uint32Array(4);!0===e&&crypto.getRandomValues(t);let i="";return t.forEach((e=>{i+=("0".repeat(8)+e.toString(16).toUpperCase()).slice(-8)})),new ae({value:i})}constructor(e={}){super(e),this.value}valueOf(){return this.value}toString(){return this.value}}class le extends se{static attributes={value:String};static attributeConverter={fromAttribute:(e,t)=>new le(e),toAttribute:(e,t)=>e.toString()};constructor(e={}){super(e),this.value}valueOf(){return this.value}toString(){return this.value}}class ue extends se{static attributes={value:Number};constructor(e=0){super(e),this.value=Math.round(this.value)}valueOf(){return this.value}toString(){return this.value.toString()}}class ce extends se{static lookbehind="INVTEXT";static attributes={value:String};constructor(e={}){super(e),this.value}}class he extends se{static attributes={ActionName:"",bShift:!1,bCtrl:!1,bAlt:!1,bCmd:!1,Key:le};constructor(e={}){e.ActionName=e.ActionName??"",e.bShift=e.bShift??!1,e.bCtrl=e.bCtrl??!1,e.bAlt=e.bAlt??!1,e.bCmd=e.bCmd??!1,super(e),this.ActionName,this.bShift,this.bCtrl,this.bAlt,this.bCmd,this.Key}}class de extends se{static attributes={value:0};constructor(e=0){super(e),this.value=ne.clamp(this.value,0,1)}valueOf(){return this.value}toString(){return this.value.toFixed(6)}}class pe extends se{static attributes={R:de,G:de,B:de,A:new ie(de,!0,(()=>new de(1)),!1,!0),H:new ie(de,!0,void 0,!1,!0),S:new ie(de,!0,void 0,!1,!0),V:new ie(de,!0,void 0,!1,!0)};static linearToSRGB(e){return e<=0?0:e>=1?1:e<.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055}static sRGBtoLinear(e){return e<=0?0:e>=1?1:e<.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}constructor(e={}){super(e),this.R,this.G,this.B,this.A,this.H,this.S,this.V,this.#c()}#c(){const e=this.R.value,t=this.G.value,i=this.B.value;if(!(Math.abs(e-t)>Number.EPSILON||Math.abs(e-i)>Number.EPSILON||Math.abs(t-i)>Number.EPSILON))return void(this.V.value=0);const n=Math.max(e,t,i),s=Math.min(e,t,i),r=n-s;let o;switch(n){case s:o=0;break;case e:o=(t-i)/r+(te.toString(16).toUpperCase().padStart(2,"0"))).join("")}toSRGBAString(){return this.toSRGBA().map((e=>e.toString(16).toUpperCase().padStart(2,"0"))).join("")}toHSVA(){const e=this.R.value,t=this.G.value,i=this.B.value,n=this.A.value,s=Math.max(e,t,i),r=Math.min(e,t,i),o=0==s?0:(s-r)/s,a=s;return[this.H.value,o,a,n]}toNumber(){return(this.R.value<<24)+(this.G.value<<16)+(this.B.value<<8)+this.A.value}setFromRGBANumber(e){this.A.value=(255&e)/255,this.B.value=(e>>8&255)/255,this.G.value=(e>>16&255)/255,this.R.value=(e>>24&255)/255,this.#c()}setFromSRGBANumber(e){this.A.value=(255&e)/255,this.B.value=pe.sRGBtoLinear((e>>8&255)/255),this.G.value=pe.sRGBtoLinear((e>>16&255)/255),this.R.value=pe.sRGBtoLinear((e>>24&255)/255),this.#c()}toString(){return ne.printLinearColor(this)}}class me extends se{static lookbehind="NSLOCTEXT";static attributes={namespace:String,key:String,value:String};constructor(e={}){super(e),this.namespace,this.key,this.value}}class ge extends se{static attributes={value:String};constructor(e={}){super(e),this.value}valueOf(){return this.value}toString(){return this.value}}class ve extends se{static attributes={objectName:ge,pinGuid:ae};constructor(e={}){super(e),this.objectName,this.pinGuid}}class be extends se{static attributes={R:Number,P:Number,Y:Number};constructor(e={}){super(e),this.R,this.P,this.Y}}class fe extends be{}class ye extends se{static attributes={X:Number,Y:Number,Z:Number};constructor(e={}){super(e),this.X,this.Y,this.Z}}class Ee extends ye{}class we extends se{static#h={"/Script/CoreUObject.LinearColor":pe,"/Script/CoreUObject.Rotator":be,"/Script/CoreUObject.Vector":ye,bool:Boolean,exec:String,int:ue,name:String,real:Number,string:String};static#d={"/Script/CoreUObject.Vector":Ee,"/Script/CoreUObject.Rotator":fe};static lookbehind="Pin";static attributes={PinId:ae,PinName:"",PinFriendlyName:new ie(me,!1,null),PinToolTip:"",Direction:new ie(String,!1,""),PinType:{PinCategory:"",PinSubCategory:"",PinSubCategoryObject:re,PinSubCategoryMemberReference:null,PinValueType:null,ContainerType:re,bIsReference:!1,bIsConst:!1,bIsWeakPointer:!1,bIsUObjectWrapper:!1,bSerializeAsSinglePrecisionFloat:!1},LinkedTo:new ie([ve],!1),DefaultValue:new ee((e=>new ie(we.getEntityType(e.getType(),!0)??String,!1,void 0,!0))),AutogeneratedDefaultValue:new ie(String,!1),DefaultObject:new ie(re,!1,null),PersistentGuid:ae,bHidden:!1,bNotConnectable:!1,bDefaultValueIsReadOnly:!1,bDefaultValueIsIgnored:!1,bAdvancedView:!1,bOrphanedPin:!1};static getEntityType(e,t=!1){const[i,n]=[this.#h[e],this.#d[e]];return t&&void 0!==n?n:i}constructor(e={}){super(e),this.PinId,this.PinName,this.PinFriendlyName,this.PinToolTip,this.Direction,this.PinType,this.LinkedTo,this.DefaultValue,this.AutogeneratedDefaultValue,this.DefaultObject,this.PersistentGuid,this.bHidden,this.bNotConnectable,this.bDefaultValueIsReadOnly,this.bDefaultValueIsIgnored,this.bAdvancedView,this.bOrphanedPin}getType(){return"struct"==this.PinType.PinCategory||"object"==this.PinType.PinCategory?this.PinType.PinSubCategoryObject.path:this.PinType.PinCategory}getDefaultValue(){return this.DefaultValue}isHidden(){return this.bHidden}isInput(){return!this.bHidden&&"EGPD_Output"!=this.Direction}isOutput(){return!this.bHidden&&"EGPD_Output"==this.Direction}isLinked(){return this.LinkedTo?.length>0??!1}linkTo(e,t){this.LinkedTo;const i=this.LinkedTo?.find((i=>i.objectName.toString()==e&&i.pinGuid.valueOf()==t.PinId.valueOf()));return!i&&((this.LinkedTo??(this.LinkedTo=[])).push(new ve({objectName:e,pinGuid:t.PinId})),!0)}unlinkFrom(e,t){const i=this.LinkedTo?.findIndex((i=>i.objectName.toString()==e&&i.pinGuid.valueOf()==t.PinId.valueOf()));return i>=0&&(1==this.LinkedTo.length?this.LinkedTo=void 0:this.LinkedTo.splice(i,1),!0)}getSubCategory(){return this.PinType.PinSubCategoryObject.path}}class Se extends se{static attributes={MemberName:String,MemberGuid:ae,bSelfContext:!1}}class ke extends se{static attributes={Class:re,Name:"",bIsPureFunc:new ie(Boolean,!1,!1),VariableReference:new ie(Se,!1,null),FunctionReference:new ie(oe,!1,null),EventReference:new ie(oe,!1,null),TargetType:new ie(re,!1,null),NodePosX:ue,NodePosY:ue,AdvancedPinDisplay:new ie(le,!1,null),EnabledState:new ie(le,!1,null),NodeGuid:ae,ErrorType:new ie(ue,!1),ErrorMsg:new ie(String,!1,""),CustomProperties:[we]};static nameRegex=/(\w+)_(\d+)/;constructor(e={}){super(e),this.Class,this.Name,this.bIsPureFunc,this.VariableReference,this.FunctionReference,this.EventReference,this.TargetType,this.NodePosX,this.NodePosY,this.AdvancedPinDisplay,this.EnabledState,this.NodeGuid,this.ErrorType,this.ErrorMsg,this.CustomProperties}getObjectName(e=!1){return e?this.getNameAndCounter()[0]:this.Name}getNameAndCounter(){const e=this.getObjectName(!1).match(ke.nameRegex);return e&&3==e.length?[e[1],parseInt(e[2])]:["",0]}getDisplayName(){let e=this.FunctionReference?.MemberName;return e?(e=ne.formatStringName(e),e):(e=ne.formatStringName(this.getNameAndCounter()[0]),e)}getCounter(){return this.getNameAndCounter()[1]}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Pe(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ce={exports:{}};"undefined"!=typeof self&&self;var xe=Pe(Ce.exports=function(e){var t={};function i(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,i),s.l=!0,s.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},i.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){function n(e){if(!(this instanceof n))return new n(e);this._=e}var s=n.prototype;function r(e,t){for(var i=0;i>7),buf:function(e){var t=o((function(e,t,i,n){return e.concat(i===n.length-1?Buffer.from([t,0]).readUInt16BE(0):n.readUInt16BE(i))}),[],e);return Buffer.from(a((function(e){return(e<<1&65535)>>8}),t))}(i.buf)}})),i}function u(){return"undefined"!=typeof Buffer}function c(){if(!u())throw new Error("Buffer global does not exist; please use webpack if you need to parse Buffers in the browser.")}function h(e){c();var t=o((function(e,t){return e+t}),0,e);if(t%8!=0)throw new Error("The bits ["+e.join(", ")+"] add up to "+t+" which is not an even number of bytes; the total should be divisible by 8");var i,s=t/8,r=(i=function(e){return e>48},o((function(e,t){return e||(i(t)?t:e)}),null,e));if(r)throw new Error(r+" bit range requested exceeds 48 bit (6 byte) Number max.");return new n((function(t,i){var n=s+i;return n>t.length?S(i,s.toString()+" bytes"):w(n,o((function(e,t){var i=l(t,e.buf);return{coll:e.coll.concat(i.v),buf:i.buf}}),{coll:[],buf:t.slice(i,n)},e).coll)}))}function d(e,t){return new n((function(i,n){return c(),n+t>i.length?S(n,t+" bytes for "+e):w(n+t,i.slice(n,n+t))}))}function p(e,t){if("number"!=typeof(i=t)||Math.floor(i)!==i||t<0||t>6)throw new Error(e+" requires integer length in range [0, 6].");var i}function m(e){return p("uintBE",e),d("uintBE("+e+")",e).map((function(t){return t.readUIntBE(0,e)}))}function g(e){return p("uintLE",e),d("uintLE("+e+")",e).map((function(t){return t.readUIntLE(0,e)}))}function v(e){return p("intBE",e),d("intBE("+e+")",e).map((function(t){return t.readIntBE(0,e)}))}function b(e){return p("intLE",e),d("intLE("+e+")",e).map((function(t){return t.readIntLE(0,e)}))}function f(e){return e instanceof n}function y(e){return"[object Array]"==={}.toString.call(e)}function E(e){return u()&&Buffer.isBuffer(e)}function w(e,t){return{status:!0,index:e,value:t,furthest:-1,expected:[]}}function S(e,t){return y(t)||(t=[t]),{status:!1,index:-1,value:null,furthest:e,expected:t}}function k(e,t){if(!t)return e;if(e.furthest>t.furthest)return e;var i=e.furthest===t.furthest?function(e,t){if(function(){if(void 0!==n._supportsSet)return n._supportsSet;var e="undefined"!=typeof Set;return n._supportsSet=e,e}()&&Array.from){for(var i=new Set(e),s=0;s=0;){if(o in i){n=i[o].line,0===r&&(r=i[o].lineStart);break}("\n"===e.charAt(o)||"\r"===e.charAt(o)&&"\n"!==e.charAt(o+1))&&(s++,0===r&&(r=o+1)),o--}var a=n+s,l=t-r;return i[t]={line:a,lineStart:r},{offset:t,line:a+1,column:l+1}}function x(e){if(!f(e))throw new Error("not a parser: "+e)}function A(e,t){return"string"==typeof e?e.charAt(t):e[t]}function N(e){if("number"!=typeof e)throw new Error("not a number: "+e)}function $(e){if("function"!=typeof e)throw new Error("not a function: "+e)}function L(e){if("string"!=typeof e)throw new Error("not a string: "+e)}var O=2,T=3,M=8,D=5*M,H=4*M,_=" ";function I(e,t){return new Array(t+1).join(e)}function B(e,t,i){var n=t-e.length;return n<=0?e:I(i,n)+e}function R(e,t,i,n){return{from:e-t>0?e-t:0,to:e+i>n?n:e+i}}function G(e,t){var i,n,s,r,l,u=t.index,c=u.offset,h=1;if(c===e.length)return"Got the end of the input";if(E(e)){var d=c-c%M,p=c-d,m=R(d,D,H+M,e.length),g=a((function(e){return a((function(e){return B(e.toString(16),2,"0")}),e)}),function(e,t){var i=e.length,n=[],s=0;if(i<=t)return[e.slice()];for(var r=0;r=4&&(i+=1),h=2,s=a((function(e){return e.length<=4?e.join(" "):e.slice(0,4).join(" ")+" "+e.slice(4).join(" ")}),g),(l=(8*(r.to>0?r.to-1:r.to)).toString(16).length)<2&&(l=2)}else{var v=e.split(/\r\n|[\n\r\u2028\u2029]/);i=u.column-1,n=u.line-1,r=R(n,O,T,v.length),s=v.slice(r.from,r.to),l=r.to.toString().length}var b=n-r.from;return E(e)&&(l=(8*(r.to>0?r.to-1:r.to)).toString(16).length)<2&&(l=2),o((function(t,n,s){var o,a=s===b,u=a?"> ":_;return o=E(e)?B((8*(r.from+s)).toString(16),l,"0"):B((r.from+s+1).toString(),l," "),[].concat(t,[u+o+" | "+n],a?[_+I(" ",l)+" | "+B("",i," ")+I("^",h)]:[])}),[],s).join("\n")}function F(e,t){return["\n","-- PARSING FAILED "+I("-",50),"\n\n",G(e,t),"\n\n",(i=t.expected,1===i.length?"Expected:\n\n"+i[0]:"Expected one of the following: \n\n"+i.join(", ")),"\n"].join("");var i}function z(e){return void 0!==e.flags?e.flags:[e.global?"g":"",e.ignoreCase?"i":"",e.multiline?"m":"",e.unicode?"u":"",e.sticky?"y":""].join("")}function j(){for(var e=[].slice.call(arguments),t=e.length,i=0;i=2?N(t):t=0;var i=function(e){return RegExp("^(?:"+e.source+")",z(e))}(e),s=""+e;return n((function(e,n){var r=i.exec(e.slice(n));if(r){if(0<=t&&t<=r.length){var o=r[0],a=r[t];return w(n+o.length,a)}return S(n,"valid match group (0 to "+r.length+") in "+s)}return S(n,s)}))}function Y(e){return n((function(t,i){return w(i,e)}))}function Z(e){return n((function(t,i){return S(i,e)}))}function J(e){if(f(e))return n((function(t,i){var n=e._(t,i);return n.index=i,n.value="",n}));if("string"==typeof e)return J(q(e));if(e instanceof RegExp)return J(X(e));throw new Error("not a string, regexp, or parser: "+e)}function Q(e){return x(e),n((function(t,i){var n=e._(t,i),s=t.slice(i,n.index);return n.status?S(i,'not "'+s+'"'):w(i,null)}))}function ee(e){return $(e),n((function(t,i){var n=A(t,i);return i=e.length?S(t,"any character/byte"):w(t+1,A(e,t))})),re=n((function(e,t){return w(e.length,e.slice(t))})),oe=n((function(e,t){return t=0})).desc(t)},n.optWhitespace=he,n.Parser=n,n.range=function(e,t){return ee((function(i){return e<=i&&i<=t})).desc(e+"-"+t)},n.regex=X,n.regexp=X,n.sepBy=W,n.sepBy1=K,n.seq=j,n.seqMap=V,n.seqObj=function(){for(var e,t={},i=0,s=(e=arguments,Array.prototype.slice.call(e)),r=s.length,o=0;o255)throw new Error("Value specified to byte constructor ("+e+"=0x"+e.toString(16)+") is larger in value than a single byte.");var t=(e>15?"0x":"0x0")+e.toString(16);return n((function(i,n){var s=A(i,n);return s===e?w(n+1,s):S(n,t)}))},buffer:function(e){return d("buffer",e).map((function(e){return Buffer.from(e)}))},encodedString:function(e,t){return d("string",t).map((function(t){return t.toString(e)}))},uintBE:m,uint8BE:m(1),uint16BE:m(2),uint32BE:m(4),uintLE:g,uint8LE:g(1),uint16LE:g(2),uint32LE:g(4),intBE:v,int8BE:v(1),int16BE:v(2),int32BE:v(4),intLE:b,int8LE:b(1),int16LE:b(2),int32LE:b(4),floatBE:d("floatBE",4).map((function(e){return e.readFloatBE(0)})),floatLE:d("floatLE",4).map((function(e){return e.readFloatLE(0)})),doubleBE:d("doubleBE",8).map((function(e){return e.readDoubleBE(0)})),doubleLE:d("doubleLE",8).map((function(e){return e.readDoubleLE(0)}))},e.exports=n}]));let Ae=xe;class Ne{static getGrammarForType(e,t,i=e.AttributeAnyValue){if(t instanceof ie){let n=Ne.getGrammarForType(e,t.type,i);return!t.serialized||t.type instanceof String||(n=n.wrap(Ae.string('"'),Ae.string('"'))),n}switch(ne.getType(t)){case Array:return Ae.seqMap(Ae.string("("),t.map((t=>Ne.getGrammarForType(e,ne.getType(t)))).reduce(((t,i)=>i&&t!==e.AttributeAnyValue?t.or(i):e.AttributeAnyValue)).trim(Ae.optWhitespace).sepBy(Ae.string(",")).skip(Ae.regex(/,?\s*/)),Ae.string(")"),((e,t,i)=>t));case Boolean:return e.Boolean;case oe:return e.FunctionReference;case ae:return e.Guid;case le:return e.Identifier;case ue:return e.Integer;case ce:return e.InvariantText;case pe:return e.LinearColor;case me:return e.LocalizedText;case Number:return e.Number;case re:return e.Reference;case we:return e.Pin;case ve:return e.PinReference;case de:return e.RealUnit;case be:return e.Rotator;case fe:return e.SimpleSerializationRotator;case Ee:return e.SimpleSerializationVector;case String:return e.String;case ye:return e.Vector;default:return i}}static createAttributeGrammar=(e,t,i=Ae.string("=").trim(Ae.optWhitespace))=>e.AttributeName.skip(i).chain((i=>{const n=i.split("."),s=ne.objectGet(t.attributes,n);return Ne.getGrammarForType(e,s,e.AttributeAnyValue).map((e=>t=>ne.objectSet(t,n,e,!0)))}));static createEntityGrammar=(e,t)=>Ae.seqMap(t.lookbehind?Ae.seq(Ae.string(t.lookbehind),Ae.optWhitespace,Ae.string("(")):Ae.string("("),Ne.createAttributeGrammar(e,t).trim(Ae.optWhitespace).sepBy(Ae.string(",")).skip(Ae.regex(/,?/).then(Ae.optWhitespace)),Ae.string(")"),((e,i,n)=>{let s={};return i.forEach((e=>e(s))),new t(s)}));InlineWhitespace=e=>Ae.regex(/[^\S\n]+/).desc("inline whitespace");InlineOptWhitespace=e=>Ae.regex(/[^\S\n]*/).desc("inline optional whitespace");MultilineWhitespace=e=>Ae.regex(/[^\S\n]*\n\s*/).desc("whitespace with at least a newline");Null=e=>Ae.seq(Ae.string("("),e.InlineOptWhitespace,Ae.string(")")).map((e=>null)).desc("null: ()");Boolean=e=>Ae.alt(Ae.string("True"),Ae.string("true"),Ae.string("False"),Ae.string("false")).map((e=>"true"===e.toLocaleLowerCase())).desc("either True or False");HexDigit=e=>Ae.regex(/[0-9a-fA-f]/).desc("hexadecimal digit");Number=e=>Ae.regex(/[-\+]?[0-9]+(?:\.[0-9]+)?/).map(Number).desc("a number");RealNumber=e=>Ae.regex(/[-\+]?[0-9]+\.[0-9]+/).map(Number).desc("a number written as real");RealUnit=e=>Ae.regex(/\+?[0-9]+(?:\.[0-9]+)?/).map(Number).assert((e=>e>=0&&e<=1)).desc("a number between 0 and 1");NaturalNumber=e=>Ae.regex(/0|[1-9]\d*/).map(Number).desc("a natural number");ColorNumber=e=>e.NaturalNumber.assert((e=>0<=e&&e<256),"the color must be between 0 and 256 excluded");Word=e=>Ae.regex(/[a-zA-Z]+/).desc("a word");String=e=>Ae.regex(/(?:[^"\\]|\\.)*/).wrap(Ae.string('"'),Ae.string('"')).map(ne.unescapeString).desc('string (with possibility to escape the quote using ")');ReferencePath=e=>Ae.seq(Ae.string("/"),e.PathSymbol.map((e=>e.toString())).sepBy1(Ae.string(".")).tieWith(".")).tie().atLeast(2).tie().desc('a path (words with possibly underscore, separated by ".", separated by "/")');AttributeName=e=>e.Word.sepBy1(Ae.string(".")).tieWith(".").desc('words separated by ""');None=e=>Ae.string("None").map((e=>new re({type:"None",path:""}))).desc("none");Integer=e=>Ae.regex(/[\-\+]?[0-9]+/).map((e=>new ue(e))).desc("an integer");Guid=e=>e.HexDigit.times(32).tie().map((e=>new ae({value:e}))).desc("32 digit hexadecimal value");Identifier=e=>Ae.regex(/\w+/).map((e=>new le(e)));PathSymbol=e=>Ae.regex(/[0-9\w]+/).map((e=>new ge({value:e})));Reference=e=>Ae.alt(e.None,...[e.ReferencePath.map((e=>new re({type:"",path:e})))].flatMap((e=>[e,e.trim(Ae.string('"'))])),Ae.seqMap(e.Word,Ae.optWhitespace,Ae.alt(...[e.ReferencePath].flatMap((e=>[e.wrap(Ae.string('"'),Ae.string('"')),e.wrap(Ae.string("'\""),Ae.string("\"'"))]))),((e,t,i)=>new re({type:e,path:i}))),e.Word.map((e=>new re({type:e,path:""}))));LocalizedText=e=>Ae.seqMap(Ae.string(me.lookbehind).skip(Ae.optWhitespace).skip(Ae.string("(")),e.String.trim(Ae.optWhitespace),Ae.string(","),e.String.trim(Ae.optWhitespace),Ae.string(","),e.String.trim(Ae.optWhitespace),Ae.string(")"),((e,t,i,n,s,r,o)=>new me({namespace:t,key:n,value:r})));InvariantText=e=>e.String.trim(Ae.optWhitespace).wrap(Ae.string(ce.lookbehind).skip(Ae.optWhitespace).skip(Ae.string("(")),Ae.string(")")).map((e=>new ce({value:e})));AttributeAnyValue=e=>Ae.alt(e.Null,e.None,e.Boolean,e.Number,e.Integer,e.String,e.Guid,e.LocalizedText,e.InvariantText,e.Reference,e.Vector,e.LinearColor);PinReference=e=>Ae.seqMap(e.PathSymbol,Ae.whitespace,e.Guid,((e,t,i)=>new ve({objectName:e,pinGuid:i})));Vector=e=>Ne.createEntityGrammar(e,ye);Rotator=e=>Ne.createEntityGrammar(e,be);SimpleSerializationRotator=e=>Ae.seqMap(e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,((e,t,i,n,s)=>new fe({R:s,P:e,Y:i})));SimpleSerializationVector=e=>Ae.seqMap(e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,Ae.string(",").trim(Ae.optWhitespace),e.Number,((e,t,i,n,s)=>new Ee({X:e,Y:i,Z:s})));LinearColor=e=>Ne.createEntityGrammar(e,pe);FunctionReference=e=>Ne.createEntityGrammar(e,oe);KeyBinding=e=>Ae.alt(e.Identifier.map((e=>new he({Key:e}))),Ne.createEntityGrammar(e,he));Pin=e=>Ne.createEntityGrammar(e,we);CustomProperties=e=>Ae.string("CustomProperties").then(Ae.whitespace).then(e.Pin).map((e=>t=>{let i=ne.objectGet(t,["CustomProperties"],[]);i.push(e),ne.objectSet(t,["CustomProperties"],i,!0)}));Object=e=>Ae.seqMap(Ae.seq(Ae.string("Begin"),Ae.whitespace,Ae.string("Object"),Ae.whitespace),Ae.alt(e.CustomProperties,Ne.createAttributeGrammar(e,ke)).sepBy1(Ae.whitespace),Ae.seq(e.MultilineWhitespace,Ae.string("End"),Ae.whitespace,Ae.string("Object")),((e,t,i)=>{let n={};return t.forEach((e=>e(n))),new ke(n)}));MultipleObject=e=>e.Object.sepBy1(Ae.whitespace).trim(Ae.optWhitespace);LinearColorFromHex=e=>Ae.string("#").then(e.HexDigit.times(2).tie().times(3,4)).trim(Ae.optWhitespace).map((([e,t,i,n])=>new pe({R:parseInt(e,16)/255,G:parseInt(t,16)/255,B:parseInt(i,16)/255,A:n?parseInt(n,16)/255:1})));LinearColorFromRGBList=e=>Ae.seqMap(e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber.map(Number),((e,t,i,n,s)=>new pe({R:e/255,G:i/255,B:s/255,A:1})));LinearColorFromRGB=e=>Ae.string("rgb").then(e.LinearColorFromRGBList.wrap(Ae.regex(/\(\s*/),Ae.regex(/\s*\)/)));LinearColorFromRGBA=e=>Ae.string("rgba").then(Ae.seqMap(e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber,Ae.string(",").skip(Ae.optWhitespace),e.ColorNumber.map(Number),Ae.string(",").skip(Ae.optWhitespace),Ae.regex(/0?\.\d+|[01]/).map(Number),((e,t,i,n,s,r,o)=>new pe({R:e/255,G:i/255,B:s/255,A:o}))).wrap(Ae.regex(/\(\s*/),Ae.regex(/\s*\)/)));LinearColorFromAnyColor=e=>Ae.alt(e.LinearColorFromRGBList,e.LinearColorFromHex,e.LinearColorFromRGB,e.LinearColorFromRGBA)}class $e{static grammar=xe.createLanguage(new Ne);constructor(e,t="",i=",",n=!1,s="=",r=(e=>e.join("."))){this.entityType=e,this.prefix=t,this.separator=i,this.trailingSeparator=n,this.attributeValueConjunctionSign=s,this.attributeKeyPrinter=r}deserialize(e){return this.read(e)}serialize(e,t=!1,i=e){return this.write(i,e,t)}read(e){throw new Error("Not implemented")}write(e,t,i){throw new Error("Not implemented")}writeValue(e,t,i,n){const s=te.getSerializer(ne.getType(t));if(!s)throw new Error("Unknown value type, a serializer must be registered in the SerializerFactory class");return s.write(e,t,n)}subWrite(e,t,i,n){let s="",r=t.concat("");const o=r.length-1;for(const t of Object.getOwnPropertyNames(i)){r[o]=t;const a=i[t];if(a?.constructor===Object)s+=(s.length?this.separator:"")+this.subWrite(e,r,a,n);else if(void 0!==a&&this.showProperty(e,i,r,a)){const t=ne.isSerialized(e,r);s+=(s.length?this.separator:"")+this.prefix+this.attributeKeyPrinter(r)+this.attributeValueConjunctionSign+(t?`"${this.writeValue(e,a,r,!0)}"`:this.writeValue(e,a,r,n))}}return this.trailingSeparator&&s.length&&1===r.length&&(s+=this.separator),s}showProperty(e,t,i,n){const s=this.entityType.attributes,r=ne.objectGet(s,i);return!(r instanceof ie)||!r.ignored&&(!ne.equals(r.value,n)||r.showDefault)}}class Le extends $e{constructor(){super(ke," ","\n",!1)}showProperty(e,t,i,n){switch(i.toString()){case"Class":case"Name":case"CustomProperties":return!1}return super.showProperty(e,t,i,n)}read(e){const t=$e.grammar.Object.parse(e);if(!t.status)throw new Error("Error when trying to parse the object.");return t.value}readMultiple(e){const t=$e.grammar.MultipleObject.parse(e);if(!t.status)throw new Error("Error when trying to parse the object.");return t.value}write(e,t,i){return`Begin Object Class=${t.Class.path} Name=${this.writeValue(e,t.Name,["Name"],i)}\n${this.subWrite(e,[],t,i)+t.CustomProperties.map((e=>this.separator+this.prefix+"CustomProperties "+te.getSerializer(we).serialize(e))).join("")}\nEnd Object\n`}}class Oe extends Q{static#p=new Le;#m;constructor(e,t,i={}){i.listenOnFocus??=!0,i.unlistenOnTextEdit??=!0,super(e,t,i);let n=this;this.#m=e=>n.copied()}listenEvents(){document.body.addEventListener("copy",this.#m)}unlistenEvents(){document.body.removeEventListener("copy",this.#m)}copied(){const e=this.blueprint.getNodes(!0).map((e=>Oe.#p.serialize(e.entity,!1))).join("\n\n");navigator.clipboard.writeText(e)}}class Te{static styles=s``;element;#g=[];get inputObjects(){return this.#g}constructed(e){this.element=e}createInputObjects(){return[]}connectedCallback(){}willUpdate(e){}update(e){}render(){return M}firstUpdated(e){}updated(e){}inputSetup(){this.#g=this.createInputObjects()}cleanup(){this.#g.forEach((e=>e.unlistenDOMElement()))}}class Me extends Q{#v;constructor(e,t,i={}){i.activateAnyKey??=!1,i.activationKeys??=[],i.listenOnFocus??=!0,i.unlistenOnTextEdit??=!0,i.activationKeys instanceof Array||(i.activationKeys=[i.activationKeys]),i.activationKeys=i.activationKeys.map((e=>{if(e instanceof he)return e;if(e.constructor===String){const t=$e.grammar.KeyBinding.parse(e);if(t.status)return t.value}throw new Error("Unexpected key value")})),super(e,t,i),this.#v=this.options.activationKeys??[];let n=this;this.keyDownHandler=e=>{(this.options.activateAnyKey||n.#v.some((t=>(e=>e.bShift||"LeftShift"==e.Key||"RightShift"==e.Key)(t)==e.shiftKey&&(e=>e.bCtrl||"LeftControl"==e.Key||"RightControl"==e.Key)(t)==e.ctrlKey&&(e=>e.bAlt||"LeftAlt"==e.Key||"RightAlt"==e.Key)(t)==e.altKey&&J.Keys[t.Key]==e.code)))&&(i.consumeEvent&&e.stopImmediatePropagation(),n.fire(),document.removeEventListener("keydown",n.keyDownHandler),document.addEventListener("keyup",n.keyUpHandler))},this.keyUpHandler=e=>{(this.options.activateAnyKey||n.#v.some((t=>t.bShift&&"Shift"==e.key||t.bCtrl&&"Control"==e.key||t.bAlt&&"Alt"==e.key||t.bCmd&&"Meta"==e.key||J.Keys[t.Key]==e.code)))&&(i.consumeEvent&&e.stopImmediatePropagation(),n.unfire(),document.removeEventListener("keyup",this.keyUpHandler),document.addEventListener("keydown",this.keyDownHandler))}}listenEvents(){document.addEventListener("keydown",this.keyDownHandler)}unlistenEvents(){document.removeEventListener("keydown",this.keyDownHandler)}fire(){}unfire(){}}class De extends Me{constructor(e,t,i={}){i.activationKeys=J.deleteNodesKeyboardKey,super(e,t,i)}fire(){this.blueprint.removeGraphElement(...this.blueprint.getNodes(!0))}}class He extends Q{constructor(e,t,i={}){i.ignoreTranslateCompensate??=!1,i.movementSpace??=t.getGridDOMElement()??document.documentElement,super(e,t,i),this.movementSpace=i.movementSpace}locationFromEvent(e){const t=ne.convertLocation([e.clientX,e.clientY],this.movementSpace);return this.options.ignoreTranslateCompensate?t:this.blueprint.compensateTranslation(t)}}class _e extends He{#b=e=>{e.preventDefault();const t=this.locationFromEvent(e);this.wheel(Math.sign(e.deltaY*J.mouseWheelFactor),t)};#f=e=>e.preventDefault();constructor(e,t,i={}){i.listenOnFocus=!0,i.strictTarget??=!1,super(e,t,i),this.strictTarget=i.strictTarget}listenEvents(){this.movementSpace.addEventListener("wheel",this.#b,!1),this.movementSpace.parentElement?.addEventListener("wheel",this.#f)}unlistenEvents(){this.movementSpace.removeEventListener("wheel",this.#b,!1),this.movementSpace.parentElement?.removeEventListener("wheel",this.#f)}wheel(e,t){}}class Ie extends _e{#y=!1;get enableZoonIn(){return this.#y}set enableZoonIn(e){(e=Boolean(e))!=this.#y&&(this.#y=e)}wheel(e,t){let i=this.blueprint.getZoom();e=-e,!this.enableZoonIn&&0==i&&e>0||(i+=e,this.blueprint.setZoom(i,t))}}class Be extends Me{#E;constructor(e,t,i={}){i.activationKeys=J.enableZoomIn,super(e,t,i)}fire(){this.#E=this.blueprint.getInputObject(Ie),this.#E.enableZoonIn=!0}unfire(){this.#E.enableZoonIn=!1}}class Re extends Me{constructor(e,t,i={}){i.activationKeys=J.selectAllKeyboardKey,super(e,t,i)}fire(){this.blueprint.selectAll()}}class Ge extends Y{static properties={};#w=[];#t;get blueprint(){return this.#t}set blueprint(e){this.#t=e}#S;get entity(){return this.#S}set entity(e){this.#S=e}#k;get template(){return this.#k}inputObjects=[];constructor(e,t){super(),this.#S=e,this.#k=t,this.inputObjects=[],this.#k.constructed(this)}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.blueprint=this.closest("ueb-blueprint"),this.template.connectedCallback()}willUpdate(e){super.willUpdate(e),this.template.willUpdate(e)}update(e){super.update(e),this.template.update(e)}render(){return this.template.render()}firstUpdated(e){super.firstUpdated(e),this.template.firstUpdated(e),this.template.inputSetup()}updated(e){super.updated(e),this.template.updated(e),this.#w.forEach((t=>t(e))),this.#w=[]}disconnectedCallback(){super.disconnectedCallback(),this.template.cleanup()}addNextUpdatedCallbacks(e,t=!1){this.#w.push(e),t&&this.requestUpdate()}isSameGraph(e){return this.blueprint&&this.blueprint==e?.blueprint}getInputObject(e){return this.template.inputObjects.find((t=>t.constructor==e))}}class Fe extends Ge{static properties={...super.properties,locationX:{type:Number,attribute:!1},locationY:{type:Number,attribute:!1}};static dragEventName=J.dragEventName;static dragGeneralEventName=J.dragGeneralEventName;constructor(e,t){super(e,t),this.locationX=0,this.locationY=0}setLocation([e,t]){const i=[e-this.locationX,t-this.locationY];if(this.locationX=e,this.locationY=t,this.blueprint){const e=new CustomEvent(this.constructor.dragEventName,{detail:{value:i},bubbles:!1,cancelable:!0});this.dispatchEvent(e)}}addLocation([e,t]){this.setLocation([this.locationX+e,this.locationY+t])}dispatchDragEvent(e){const t=new CustomEvent(this.constructor.dragGeneralEventName,{detail:{value:e},bubbles:!0,cancelable:!0});this.dispatchEvent(t)}snapToGrid(){const e=ne.snapToGrid([this.locationX,this.locationY],J.gridSize);this.locationX==e[0]&&this.locationY==e[1]||this.setLocation(e)}}class ze extends He{#P=e=>{if(this.blueprint.setFocused(!0),e.button===this.options.clickButton)this.options.strictTarget&&e.target!=e.currentTarget||(this.options.consumeEvent&&e.stopImmediatePropagation(),this.#C.addEventListener("mousemove",this.#x),document.addEventListener("mouseup",this.#A),this.clickedPosition=this.locationFromEvent(e),this.target instanceof Fe&&(this.clickedOffset=[this.clickedPosition[0]-this.target.locationX,this.clickedPosition[1]-this.target.locationY]),this.clicked(this.clickedPosition));else this.options.exitAnyButton||this.#A(e)};#x=e=>{this.options.consumeEvent&&e.stopImmediatePropagation(),this.#C.removeEventListener("mousemove",this.#x),this.#C.addEventListener("mousemove",this.#N);const t=this.getEvent(J.trackingMouseEventName.begin);this.#$=0==this.target.dispatchEvent(t);const i=this.locationFromEvent(e);this.mouseLocation=ne.snapToGrid(this.clickedPosition,this.stepSize),this.startDrag(i),this.started=!0};#N=e=>{this.options.consumeEvent&&e.stopImmediatePropagation();const t=this.locationFromEvent(e),i=[e.movementX,e.movementY];this.dragTo(t,i),this.#$&&(this.blueprint.mousePosition=this.locationFromEvent(e))};#A=e=>{if(!this.options.exitAnyButton||e.button==this.options.clickButton){if(this.options.consumeEvent&&e.stopImmediatePropagation(),this.#C.removeEventListener("mousemove",this.#x),this.#C.removeEventListener("mousemove",this.#N),document.removeEventListener("mouseup",this.#A),this.started&&this.endDrag(),this.unclicked(),this.#$){const e=this.getEvent(J.trackingMouseEventName.end);this.target.dispatchEvent(e),this.#$=!1}this.started=!1}};#$=!1;#C;#L;clickedOffset=[0,0];clickedPosition=[0,0];mouseLocation=[0,0];started=!1;stepSize=1;constructor(e,t,i={}){i.clickButton??=0,i.consumeEvent??=!0,i.draggableElement??=e,i.exitAnyButton??=!0,i.moveEverywhere??=!1,i.movementSpace??=t?.getGridDOMElement(),i.repositionOnClick??=!1,i.strictTarget??=!1,super(e,t,i),this.stepSize=parseInt(i?.stepSize??J.gridSize),this.#C=this.options.moveEverywhere?document.documentElement:this.movementSpace,this.#L=this.options.draggableElement,this.listenEvents()}listenEvents(){this.#L.addEventListener("mousedown",this.#P),2==this.options.clickButton&&this.#L.addEventListener("contextmenu",(e=>e.preventDefault()))}unlistenEvents(){this.#L.removeEventListener("mousedown",this.#P)}getEvent(e){return new CustomEvent(e,{detail:{tracker:this},bubbles:!0,cancelable:!0})}clicked(e){}startDrag(e){}dragTo(e,t){}endDrag(){}unclicked(e){}}class je extends ze{startDrag(){this.blueprint.scrolling=!0}dragTo(e,t){this.blueprint.scrollDelta([-t[0],-t[1]])}endDrag(){this.blueprint.scrolling=!1}}class Ve extends He{#O=null;#T;#M;#D;constructor(e,t,i={}){i.listenOnFocus=!0,super(e,t,i);let n=this;this.#T=e=>{e.preventDefault(),n.blueprint.mousePosition=n.locationFromEvent(e)},this.#M=e=>{n.#O||(e.preventDefault(),this.#O=e.detail.tracker,n.unlistenMouseMove())},this.#D=e=>{n.#O==e.detail.tracker&&(e.preventDefault(),n.#O=null,n.listenMouseMove())}}listenMouseMove(){this.target.addEventListener("mousemove",this.#T)}unlistenMouseMove(){this.target.removeEventListener("mousemove",this.#T)}listenEvents(){this.listenMouseMove(),this.blueprint.addEventListener(J.trackingMouseEventName.begin,this.#M),this.blueprint.addEventListener(J.trackingMouseEventName.end,this.#D)}unlistenEvents(){this.unlistenMouseMove(),this.blueprint.removeEventListener(J.trackingMouseEventName.begin,this.#M),this.blueprint.removeEventListener(J.trackingMouseEventName.end,this.#D)}}class Ue extends Fe{static properties={...super.properties,selected:{type:Boolean,attribute:"data-selected",reflect:!0,converter:ne.booleanConverter}};constructor(...e){super(...e),this.selected=!1,this.listeningDrag=!1;let t=this;this.dragHandler=e=>t.addLocation(e.detail.value)}connectedCallback(){super.connectedCallback(),this.setSelected(this.selected)}disconnectedCallback(){super.disconnectedCallback(),this.blueprint.removeEventListener(J.nodeDragGeneralEventName,this.dragHandler)}setSelected(e=!0){this.selected=e,this.blueprint&&(this.selected?(this.listeningDrag=!0,this.blueprint.addEventListener(J.nodeDragGeneralEventName,this.dragHandler)):(this.blueprint.removeEventListener(J.nodeDragGeneralEventName,this.dragHandler),this.listeningDrag=!1))}}class We extends ze{clicked(e){this.options.repositionOnClick&&(this.target.setLocation(this.stepSize>1?ne.snapToGrid(e,this.stepSize):e),this.clickedOffset=[0,0])}dragTo(e,t){const i=[this.target.locationX,this.target.locationY],[n,s]=this.stepSize>1?[ne.snapToGrid(e,this.stepSize),ne.snapToGrid(i,this.stepSize)]:[e,i];0==(t=[n[0]-this.mouseLocation[0],n[1]-this.mouseLocation[1]])[0]&&0==t[1]||(t[0]+=s[0]-this.target.locationX,t[1]+=s[1]-this.target.locationY,this.dragAction(n,t),this.mouseLocation=n)}dragAction(e,t){this.target.setLocation([e[0]-this.clickedOffset[0],e[1]-this.clickedOffset[1]])}}class Ke extends Te{getDraggableElement(){return this.element}createDraggableObject(){return new We(this.element,this.element.blueprint,{draggableElement:this.getDraggableElement()})}createInputObjects(){return[...super.createInputObjects(),this.createDraggableObject()]}}class qe extends Ke{update(e){super.update(e),e.has("locationX")&&(this.element.style.left=`${this.element.locationX}px`),e.has("locationY")&&(this.element.style.top=`${this.element.locationY}px`)}}class Xe extends We{startDrag(){this.target.selected||(this.blueprint.unselectAll(),this.target.setSelected(!0))}dragAction(e,t){this.target.dispatchDragEvent(t)}unclicked(){this.started||(this.blueprint.unselectAll(),this.target.setSelected(!0))}}class Ye extends qe{getDraggableElement(){return this.element}createDraggableObject(){return new Xe(this.element,this.element.blueprint,{draggableElement:this.getDraggableElement()})}firstUpdated(e){super.firstUpdated(e),this.element.selected&&!this.element.listeningDrag&&this.element.setSelected(!0)}}class Ze extends ze{constructor(e,t,i={}){i.consumeEvent=!0,super(e,t,i)}}class Je extends Ge{static properties={...super.properties,fromX:{type:Number,attribute:!1},fromY:{type:Number,attribute:!1},toX:{type:Number,attribute:!1},toY:{type:Number,attribute:!1}};constructor(...e){super(...e),this.fromX=0,this.fromY=0,this.toX=0,this.toY=0}setBothLocations([e,t]){this.fromX=e,this.fromY=t,this.toX=e,this.toY=t}addSourceLocation([e,t]){this.fromX+=e,this.fromY+=t}addDestinationLocation([e,t]){this.toX+=e,this.toY+=t}}class Qe extends Te{update(e){super.update(e);const[t,i,n,s]=[Math.round(this.element.fromX),Math.round(this.element.fromY),Math.round(this.element.toX),Math.round(this.element.toY)],[r,o,a,l]=[Math.min(t,n),Math.min(i,s),Math.abs(t-n),Math.abs(i-s)];(e.has("fromX")||e.has("toX"))&&(this.element.style.left=`${r}px`,this.element.style.width=`${a}px`),(e.has("fromY")||e.has("toY"))&&(this.element.style.top=`${o}px`,this.element.style.height=`${l}px`)}}class et extends Qe{static decreasingValue(e,t){const i=-e*t[0]**2,n=t[1]-i/t[0];return e=>i/e+n}static clampedLine(e,t){if(e[0]>t[0]){const i=e;e=t,t=i}const i=(t[1]-e[1])/(t[0]-e[0]),n=e[1]-i*e[0];return s=>st[0]?t[1]:i*s+n}static c1DecreasingValue=et.decreasingValue(-.15,[100,15]);static c2DecreasingValue=et.decreasingValue(-.06,[500,130]);static c2Clamped=et.clampedLine([0,100],[200,30]);willUpdate(e){super.willUpdate(e);const t=Math.max(Math.abs(this.element.fromX-this.element.toX),1),i=Math.max(t,J.linkMinWidth),n=t/i,s=this.element.originatesFromInput?this.element.fromXthis.element.toY?1:0)),this.element.style.setProperty("--ueb-start-percentage",`${Math.round(this.element.startPercentage)}%`),this.element.style.setProperty("--ueb-link-start",`${Math.round(this.element.startPixels)}`)}render(){const e="ueb-id-"+Math.floor(1e12*Math.random());return O` ${""!=this.element.linkMessageIcon||""!=this.element.linkMessageText?O``:M}`}}class tt extends Je{static properties={...super.properties,source:{type:String,reflect:!0},destination:{type:String,reflect:!0},dragging:{type:Boolean,attribute:"data-dragging",converter:ne.booleanConverter,reflect:!0},originatesFromInput:{type:Boolean,attribute:!1},svgPathD:{type:String,attribute:!1},linkMessageIcon:{type:String,attribute:!1},linkMessageText:{type:String,attribute:!1}};#H;get sourcePin(){return this.#H}set sourcePin(e){this.#_(e,!1)}#I;get destinationPin(){return this.#I}set destinationPin(e){this.#_(e,!0)}#B;#R;#G;#F;#z;pathElement;constructor(e,t){super({},new et);const i=this;this.#B=()=>i.remove(),this.#R=e=>i.addSourceLocation(e.detail.value),this.#G=e=>i.addDestinationLocation(e.detail.value),this.#F=e=>i.setSourceLocation(),this.#z=e=>i.setDestinationLocation(),this.source=null,this.destination=null,this.dragging=!1,this.originatesFromInput=!1,this.startPercentage=0,this.svgPathD="",this.startPixels=0,this.linkMessageIcon="",this.linkMessageText="",e&&(this.sourcePin=e,t||(this.toX=this.fromX,this.toY=this.fromY)),t&&(this.destinationPin=t,e||(this.fromX=this.toX,this.fromY=this.toY)),this.#j()}#_(e,t){const i=()=>t?this.destinationPin:this.sourcePin;if(i()!=e){if(i()){const e=i().getNodeElement();e.removeEventListener(J.nodeDeleteEventName,this.#B),e.removeEventListener(J.nodeDragEventName,t?this.#G:this.#R),e.removeEventListener(J.nodeReflowEventName,t?this.#z:this.#F),this.#V()}if(t?this.#I=e:this.#H=e,i()){const e=i().getNodeElement();e.addEventListener(J.nodeDeleteEventName,this.#B),e.addEventListener(J.nodeDragEventName,t?this.#G:this.#R),e.addEventListener(J.nodeReflowEventName,t?this.#z:this.#F),t?this.setDestinationLocation():(this.setSourceLocation(),this.originatesFromInput=this.sourcePin.isInput()),this.#j()}}}#j(){this.sourcePin&&this.destinationPin&&(this.sourcePin.linkTo(this.destinationPin),this.destinationPin.linkTo(this.sourcePin))}#V(){this.sourcePin&&this.destinationPin&&(this.sourcePin.unlinkFrom(this.destinationPin),this.destinationPin.unlinkFrom(this.sourcePin))}disconnectedCallback(){super.disconnectedCallback(),this.#V(),this.sourcePin=null,this.destinationPin=null}setSourceLocation(e=null){if(null==e){const t=this;if(!this.hasUpdated||!this.sourcePin.hasUpdated)return void Promise.all([this.updateComplete,this.sourcePin.updateComplete]).then((()=>t.setSourceLocation()));e=this.sourcePin.template.getLinkLocation()}const[t,i]=e;this.fromX=t,this.fromY=i}setDestinationLocation(e=null){if(null==e){const t=this;if(!this.hasUpdated||!this.destinationPin.hasUpdated)return void Promise.all([this.updateComplete,this.destinationPin.updateComplete]).then((()=>t.setDestinationLocation()));e=this.destinationPin.template.getLinkLocation()}this.toX=e[0],this.toY=e[1]}startDragging(){this.dragging=!0}finishDragging(){this.dragging=!1}removeMessage(){this.linkMessageIcon="",this.linkMessageText=""}setMessageConvertType(){this.linkMessageIcon="ueb-icon-conver-type",this.linkMessageText=`Convert ${this.sourcePin.pinType} to ${this.destinationPin.pinType}.`}setMessageCorrect(){this.linkMessageIcon="ueb-icon-correct",this.linkMessageText=""}setMessageDirectionsIncompatible(){this.linkMessageIcon="ueb-icon-directions-incompatible",this.linkMessageText="Directions are not compatbile."}setMessagePlaceNode(){this.linkMessageIcon="ueb-icon-place-node",this.linkMessageText="Place a new node."}setMessageReplaceLink(){this.linkMessageIcon="ueb-icon-replace-link",this.linkMessageText="Replace existing input connections."}setMessageSameNode(){this.linkMessageIcon="ueb-icon-same-node",this.linkMessageText="Both are on the same node."}setMEssagetypesIncompatible(){this.linkMessageIcon="ueb-icon-types-incompatible",this.linkMessageText=`${this.sourcePin.pinType} is not compatible with ${this.destinationPin.pinType}.`}}class it extends ze{#U;#W=e=>{if(!this.enteredPin){this.linkValid=!1,this.enteredPin=e.target;const t=this.enteredPin,i=this.target;t.getNodeElement()==i.getNodeElement()?this.link.setMessageSameNode():t.isOutput()==i.isOutput()||t.isOutput()==i.isOutput()?this.link.setMessageDirectionsIncompatible():this.blueprint.getLinks([t,i]).length?(this.link.setMessageReplaceLink(),this.linkValid=!0):(this.link.setMessageCorrect(),this.linkValid=!0)}};#K=e=>{this.enteredPin==e.target&&(this.enteredPin=null,this.linkValid=!1,this.link?.setMessagePlaceNode())};link;enteredPin;linkValid=!1;startDrag(e){this.link=new tt(this.target,null),this.blueprint.linksContainerElement.prepend(this.link),this.link.setMessagePlaceNode(),this.#U=this.blueprint.querySelectorAll("ueb-pin"),this.#U.forEach((e=>{if(e!=this.target){const t=e.template.getClickableElement();t.addEventListener("mouseenter",this.#W),t.addEventListener("mouseleave",this.#K)}})),this.link.startDragging(),this.link.setDestinationLocation(e)}dragTo(e,t){this.link.setDestinationLocation(e)}endDrag(){this.#U.forEach((e=>{e.removeEventListener("mouseenter",this.#W),e.removeEventListener("mouseleave",this.#K)})),this.enteredPin&&this.linkValid?(this.blueprint.addGraphElement(this.link),this.link.destinationPin=this.enteredPin,this.link.removeMessage(),this.link.finishDragging()):(this.link.finishDragging(),this.link.remove()),this.enteredPin=null,this.link=null,this.#U=null}}class nt extends Te{constructed(e){super.constructed(e),this.element.dataset.id=this.element.GetPinIdValue()}connectedCallback(){super.connectedCallback(),this.element.nodeElement=this.element.closest("ueb-node")}createInputObjects(){return[new it(this.getClickableElement(),this.element.blueprint,{moveEverywhere:!0})]}render(){const e=O`
${this.renderIcon()}
`,t=O`
${this.element.getPinDisplayName()} ${this.renderInput()}
`;return O`
${this.element.isInput()?O`${e}${t}`:O`${t}${e}`}
`}renderIcon(){return O``}renderInput(){return M}getLinkLocation(){const e=this.element.querySelector(".ueb-pin-icon").getBoundingClientRect(),t=ne.convertLocation([(e.left+e.right)/2,(e.top+e.bottom)/2],this.element.blueprint.gridElement);return this.element.blueprint.compensateTranslation(t)}getClickableElement(){return this.element}}class st extends nt{#q;#X=e=>this.element.setDefaultValue(this.#q.checked);firstUpdated(e){super.firstUpdated(e),this.#q=this.element.querySelector(".ueb-pin-input"),this.#q.addEventListener("change",this.#X)}cleanup(){super.cleanup(),this.#q.removeEventListener("change",this.#X)}createInputObjects(){return[...super.createInputObjects(),new Ze(this.#q,this.element.blueprint)]}renderInput(){return this.element.isInput()&&!this.element.isLinked?O``:super.renderInput()}}class rt extends nt{renderIcon(){return O``}}class ot extends nt{static singleLineInput=!1;static selectOnFocus=!0;#Y;get inputContentElements(){return this.#Y}static stringFromInputToUE(e){return e.replace(/(?=\n\s*)\n$/,"").replaceAll("\n","\\r\n")}static stringFromUEToInput(e){return e.replaceAll(/(?:\r|(?<=(?:^|[^\\])(?:\\\\)*)\\r)(?=\n)/g,"").replace(/(?<=\n\s*)$/,"\n")}#Z=()=>this.setInputs(this.getInputs(),!0);firstUpdated(e){super.firstUpdated(e),this.#Y=[...this.element.querySelectorAll("ueb-input")],this.#Y.length&&(this.setInputs(this.getInputs(),!1),this.#Y.forEach((e=>{e.addEventListener("focusout",this.#Z)})))}cleanup(){super.cleanup(),this.#Y.forEach((e=>{e.removeEventListener("focusout",this.#Z)}))}createInputObjects(){return[...super.createInputObjects(),...this.#Y.map((e=>new Ze(e,this.element.blueprint)))]}getInput(){return this.getInputs().reduce(((e,t)=>e+t),"")}getInputs(){return this.#Y.map((e=>ne.clearHTMLWhitespace(e.innerHTML)))}setInputs(e=[],t=!0){this.#Y.forEach(this.constructor.singleLineInput?(t,i)=>t.innerText=e[i]:(t,i)=>t.innerText=e[i].replaceAll("\n","")),t&&this.setDefaultValue(e.map((e=>ot.stringFromInputToUE(e))),e)}setDefaultValue(e=[],t=e){this.element.setDefaultValue(e.join(""))}renderInput(){if(this.element.isInput()&&!this.element.isLinked){const e=this.constructor.singleLineInput,t=this.constructor.selectOnFocus;return O`
`}return M}}class at extends ot{static singleLineInput=!0;setInputs(e=[],t=!1){e&&0!=e.length||(e=[this.getInput()]);let i=[];for(const t of e){let e=parseFloat(t);isNaN(e)&&(e=0,!1),i.push(e)}super.setInputs(e,!1),this.setDefaultValue(i,e)}setDefaultValue(e=[],t){this.element.setDefaultValue(e[0])}}class lt extends at{setDefaultValue(e=[],t=e){this.element.setDefaultValue(e[0])}renderInput(){return this.element.isInput()&&!this.element.isLinked?O`
`:M}} /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */const ot=1; + */const ut=1; /** * @license * Copyright 2018 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -const at=(e=>(...t)=>({_$litDirective$:e,values:t}))(class extends class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,n){this._$Ct=e,this._$AM=t,this._$Ci=n}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}}{constructor(e){var t;if(super(e),e.type!==ot||"style"!==e.name||(null===(t=e.strings)||void 0===t?void 0:t.length)>2)throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.")}render(e){return Object.keys(e).reduce(((t,n)=>{const i=e[n];return null==i?t:t+`${n=n.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,"-$&").toLowerCase()}:${i};`}),"")}update(e,[t]){const{style:n}=e.element;if(void 0===this.vt){this.vt=new Set;for(const e in t)this.vt.add(e);return this.render(t)}this.vt.forEach((e=>{null==t[e]&&(this.vt.delete(e),e.includes("-")?n.removeProperty(e):n[e]="")}));for(const e in t){const i=t[e];null!=i&&(this.vt.add(e),e.includes("-")?n.setProperty(e,i):n[e]=i)}return M}});class lt extends Ke{#X;get locationChangeCallback(){return this.#X}set locationChangeCallback(e){this.#X=e}movementSpace;movementSpaceSize=[0,0];connectedCallback(){super.connectedCallback(),this.movementSpace=this.element.parentElement;const e=this.movementSpace.getBoundingClientRect();this.movementSpaceSize=[e.width,e.height]}createDraggableObject(){return new We(this.element,this.element.blueprint,{draggableElement:this.movementSpace,ignoreTranslateCompensate:!0,moveEverywhere:!0,movementSpace:this.movementSpace,repositionOnClick:!0,stepSize:1})}adjustLocation([e,t]){return this.locationChangeCallback?.(e,t),[e,t]}}class ut extends lt{adjustLocation([e,t]){const n=Math.round(this.movementSpaceSize[0]/2);e-=n,t=-(t-n);let[i,r]=ie.getPolarCoordinates([e,t]);return i=Math.min(i,n),[e,t]=ie.getCartesianCoordinates([i,r]),this.locationChangeCallback?.(e/n,t/n),[e=Math.round(e+n),t=Math.round(-t+n)]}}class ct extends Ve{windowElement;constructor(e,t){super(e,t)}connectedCallback(){super.connectedCallback(),this.windowElement=this.closest("ueb-window")}setLocation([e,t]){super.setLocation(this.template.adjustLocation([e,t]))}}class ht extends ct{constructor(){super({},new ut)}}class dt extends lt{adjustLocation([e,t]){return e=ie.clamp(e,0,this.movementSpaceSize[0]),t=ie.clamp(t,0,this.movementSpaceSize[1]),this.locationChangeCallback?.(e/this.movementSpaceSize[0],1-t/this.movementSpaceSize[1]),[e,t]}}class pt extends ct{constructor(){super({},new dt)}}class mt extends qe{toggleAdvancedDisplayHandler;getDraggableElement(){return this.element.querySelector(".ueb-window-top")}createDraggableObject(){return new We(this.element,this.element.blueprint,{draggableElement:this.getDraggableElement(),ignoreTranslateCompensate:!0,movementSpace:this.element.blueprint,stepSize:1})}render(){return O`
${this.renderWindowName()}
${this.renderContent()}
`}renderWindowName(){return O`Window`}renderContent(){return T}apply(){this.element.dispatchEvent(new CustomEvent(J.windowApplyEventName)),this.element.remove()}cancel(){this.element.dispatchEvent(new CustomEvent(J.windowCancelEventName)),this.element.remove()}}class gt extends mt{#Y;#Z;#J;#Q;#ee;#te;#ne;#ie;#re;#se;#oe=e=>{const t=ie.clearHTMLWhitespace(e.target.innerHTML),n=parseInt(t,16);isNaN(n)||(this.color.setFromRGBANumber(n),this.element.requestUpdate())};#ae=e=>{const t=ie.clearHTMLWhitespace(e.target.innerHTML),n=parseInt(t,16);isNaN(n)||(this.color.setFromSRGBANumber(n),this.element.requestUpdate())};#le=e=>t=>{"Enter"==t.code&&(t.preventDefault(),e(t))};#ue=new pe;get color(){return this.#ue}set color(e){e.toNumber()!=this.color?.toNumber()&&(this.element.requestUpdate("color",this.#ue),this.#ue=e)}#ce=new pe;get fullColor(){return this.#ce}#he;get initialColor(){return this.#he}#de=new pe;#pe(e,t,n=!1){const i=this.color.toRGBAString(),r=`${i.substring(0,2*e)}${t}${i.substring(2+2*e)}`;return n?`${r.substring(0,6)}FF`:r}connectedCallback(){super.connectedCallback(),this.#he=this.element.windowOptions.getPinColor(),this.color.setFromHSVA(this.initialColor.H.value,this.initialColor.S.value,this.initialColor.V.value,this.initialColor.A.value),this.fullColor.setFromHSVA(this.color.H.value,1,1,1)}firstUpdated(e){this.#Y=this.element.querySelector(".ueb-color-picker-wheel ueb-color-handler"),this.#Z=this.element.querySelector(".ueb-color-picker-saturation ueb-ui-slider"),this.#J=this.element.querySelector(".ueb-color-picker-value ueb-ui-slider"),this.#Q=this.element.querySelector(".ueb-color-picker-r ueb-ui-slider"),this.#ee=this.element.querySelector(".ueb-color-picker-g ueb-ui-slider"),this.#te=this.element.querySelector(".ueb-color-picker-b ueb-ui-slider"),this.#ne=this.element.querySelector(".ueb-color-picker-a ueb-ui-slider"),this.#ie=this.element.querySelector(".ueb-color-picker-h ueb-ui-slider"),this.#re=this.element.querySelector(".ueb-color-picker-s ueb-ui-slider"),this.#se=this.element.querySelector(".ueb-color-picker-v ueb-ui-slider"),this.#Y.template.locationChangeCallback=(e,t)=>{this.color.setFromWheelLocation([e,t],this.color.V.value,this.color.A.value),this.fullColor.setFromHSVA(this.color.H.value,1,1,1),this.element.requestUpdate()},this.#Z.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,t,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#J.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,this.color.S.value,t,this.color.A.value),this.element.requestUpdate()},this.#Q.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([e,this.color.G.value,this.color.B.value,this.color.A.value]),this.element.requestUpdate()},this.#ee.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([this.color.R.value,e,this.color.B.value,this.color.A.value]),this.element.requestUpdate()},this.#te.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([this.color.R.value,this.color.G.value,e,this.color.A.value]),this.element.requestUpdate()},this.#ne.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([this.color.R.value,this.color.G.value,this.color.B.value,e]),this.element.requestUpdate()},this.#ie.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(e,this.color.S.value,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#re.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,e,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#se.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,this.color.S.value,e,this.color.A.value),this.element.requestUpdate()}}renderSlider(e){let t="",n=0,i="";const r=e=>`linear-gradient(to right, #${this.#pe(e,"00",!0)}, #${this.#pe(e,"ff",!0)})`;switch(e){case 0:t="r",n=this.color.R.value,i=r(e);break;case 1:t="g",n=this.color.G.value,i=r(e);break;case 2:t="b",n=this.color.B.value,i=r(e);break;case 3:t="a",n=this.color.A.value,i=`${J.alphaPattern}, ${r(e)}`;break;case 4:t="h",n=360*this.color.H.value,i="linear-gradient(to right, #f00 0%, #ff0 16.666%, #0f0 33.333%, #0ff 50%, #00f 66.666%, #f0f 83.333%, #f00 100%)";break;case 5:t="s",n=this.color.S.value,i=`linear-gradient(to right,#${this.#de.setFromHSVA(this.color.H.value,0,this.color.V.value,1),this.#de.toRGBAString()},#${this.#de.setFromHSVA(this.color.H.value,1,this.color.V.value,1),this.#de.toRGBAString()})`;break;case 6:t="v",n=this.color.V.value,i=`linear-gradient(to right, #000, #${this.fullColor.toRGBAString()})`}return i=`background: ${i};`,O`
${t.toUpperCase()}
`}renderContent(){const e=2*this.color.H.value*Math.PI,t={"--ueb-color-r":this.color.R.toString(),"--ueb-color-g":this.color.G.toString(),"--ueb-color-b":this.color.B.toString(),"--ueb-color-a":this.color.A.toString(),"--ueb-color-h":this.color.H.toString(),"--ueb-color-s":this.color.S.toString(),"--ueb-color-v":this.color.V.toString(),"--ueb-color-wheel-x":100*(this.color.S.value*Math.cos(e)*.5+.5)+"%","--ueb-color-wheel-y":100*(this.color.S.value*Math.sin(e)*.5+.5)+"%"},n=this.color.toRGBAString(),i=this.color.toSRGBAString(),r=this.fullColor.toRGBAString();return O`
Old
New
Advanced
${this.renderSlider(0)} ${this.renderSlider(1)} ${this.renderSlider(2)} ${this.renderSlider(3)}
${this.renderSlider(4)} ${this.renderSlider(5)} ${this.renderSlider(6)}
Hex Linear
Hex sRGB
OK
Cancel
`}renderWindowName(){return O`Color Picker`}}class vt extends it{static singleLineInput=!1;static selectOnFocus=!0;#me;get inputContentElements(){return this.#me}static stringFromInputToUE(e){return e.replace(/(?=\n\s*)\n$/,"").replaceAll("\n","\\r\n")}static stringFromUEToInput(e){return e.replaceAll(/(?:\r|(?<=(?:^|[^\\])(?:\\\\)*)\\r)(?=\n)/g,"").replace(/(?<=\n\s*)$/,"\n")}#ge=()=>this.setInputs(this.getInputs(),!0);firstUpdated(e){super.firstUpdated(e),this.#me=[...this.element.querySelectorAll("ueb-input")],this.#me.length&&(this.setInputs(this.getInputs(),!1),this.#me.forEach((e=>{e.addEventListener("focusout",this.#ge)})))}cleanup(){super.cleanup(),this.#me.forEach((e=>{e.removeEventListener("focusout",this.#ge)}))}createInputObjects(){return[...super.createInputObjects(),...this.#me.map((e=>new Ze(e,this.element.blueprint)))]}getInput(){return this.getInputs().reduce(((e,t)=>e+t),"")}getInputs(){return this.#me.map((e=>ie.clearHTMLWhitespace(e.innerHTML)))}setInputs(e=[],t=!0){this.#me.forEach(this.constructor.singleLineInput?(t,n)=>t.innerText=e[n]:(t,n)=>t.innerText=e[n].replaceAll("\n","")),t&&this.setDefaultValue(e.map((e=>vt.stringFromInputToUE(e))),e)}setDefaultValue(e=[],t=e){this.element.setDefaultValue(e.join(""))}renderInput(){if(this.element.isInput()&&!this.element.isLinked){const e=this.constructor.singleLineInput,t=this.constructor.selectOnFocus;return O`
`}return T}}class bt extends He{#w;#P;constructor(e,t,n={}){n.clickButton??=0,n.consumeEvent??=!0,n.exitAnyButton??=!0,n.strictTarget??=!1,super(e,t,n),this.clickedPosition=[0,0];let i=this;this.#w=e=>{if(i.blueprint.setFocused(!0),e.button===i.options.clickButton)i.options.strictTarget&&e.target!=e.currentTarget||(i.options.consumeEvent&&e.stopImmediatePropagation(),document.addEventListener("mouseup",i.#P),i.clickedPosition=i.locationFromEvent(e),i.clicked(i.clickedPosition));else i.options.exitAnyButton||i.#P(e)},this.#P=e=>{i.options.exitAnyButton&&e.button!=i.options.clickButton||(i.options.consumeEvent&&e.stopImmediatePropagation(),document.removeEventListener("mouseup",i.#P),i.unclicked())},this.listenEvents()}listenEvents(){this.target.addEventListener("mousedown",this.#w),2==this.options.clickButton&&this.target.addEventListener("contextmenu",(e=>e.preventDefault()))}unlistenEvents(){this.target.removeEventListener("mousedown",this.#w)}clicked(e){}unclicked(e){}}class ft extends bt{static#ve=e=>{};constructor(e,t,n,i=ft.#ve,r=ft.#ve){super(e,t,n),this.onMouseDown=i,this.onMouseUp=r}clicked(){this.onMouseDown(this)}unclicked(){this.onMouseUp(this)}}class yt extends Ve{static#be={window:mt,"color-picker":gt};static properties={...Ve.properties,type:{type:mt,attribute:"data-type",reflect:!0,converter:{fromAttribute:(e,t)=>yt.#be[e],toAttribute:(e,t)=>Object.entries(yt.#be).find((([t,n])=>e==n))[0]}}};constructor(e={}){e.type.constructor==String&&(e.type=yt.#be[e.type]),e.type??=mt,e.windowOptions??={},super({},new e.type),this.type=e.type,this.windowOptions=e.windowOptions}disconnectedCallback(){super.disconnectedCallback(),this.dispatchCloseEvent()}dispatchCloseEvent(){let e=new CustomEvent(J.windowCloseEventName);this.dispatchEvent(e)}}class Et extends vt{#q;#fe;firstUpdated(e){super.firstUpdated(e),this.#q=this.element.querySelector(".ueb-pin-input")}createInputObjects(){return[...super.createInputObjects(),new ft(this.#q,this.element.blueprint,void 0,(e=>{this.#fe=new yt({type:gt,windowOptions:{getPinColor:()=>this.element.defaultValue,setPinColor:e=>this.element.setDefaultValue(e)}}),this.element.blueprint.append(this.#fe);const t=()=>{this.element.setDefaultValue(this.#fe.template.color)},n=()=>{this.#fe.removeEventListener(J.windowApplyEventName,t),this.#fe.removeEventListener(J.windowCloseEventName,n),this.#fe=null};this.#fe.addEventListener(J.windowApplyEventName,t),this.#fe.addEventListener(J.windowCloseEventName,n)}))]}getInputs(){return[this.#q.dataset.linearColor]}setInputs(e=[]){}renderInput(){return this.element.isInput()&&!this.element.isLinked?O``:super.renderInput()}}class wt extends vt{static singleLineInput=!0}class St extends vt{static singleLineInput=!0;setInputs(e=[],t=!1){e&&0!=e.length||(e=[this.getInput()]);let n=[];for(const t of e){let e=parseFloat(t);isNaN(e)&&(e=0,!1),n.push(e)}super.setInputs(e,!1),this.setDefaultValue(n,e)}setDefaultValue(e=[],t){this.element.setDefaultValue(e[0])}}class kt extends St{setDefaultValue(e=[],t=e){this.element.setDefaultValue(e[0])}renderInput(){return this.element.isInput()&&!this.element.isLinked?O`
`:T}}class Pt extends it{renderIcon(){return O``}}class Ct extends St{setDefaultValue(e=[],t=e){if(!(this.element.entity.DefaultValue instanceof be))throw new TypeError("Expected DefaultValue to be a VectorEntity");let n=this.element.entity.DefaultValue;n.R=e[0],n.P=e[1],n.Y=e[2]}renderInput(){return this.element.isInput()?O`
X
Y
Z
`:O``}}class xt extends vt{}class At extends St{setDefaultValue(e,t){if(!(this.element.entity.DefaultValue instanceof ye))throw new TypeError("Expected DefaultValue to be a VectorEntity");let n=this.element.entity.DefaultValue;n.X=e[0],n.Y=e[1],n.Z=e[2]}renderInput(){return this.element.isInput()?O`
X
Y
Z
`:O``}}class Nt extends St{setDefaultValue(e=[],t=e){this.element.setDefaultValue(e[0])}renderInput(){return this.element.isInput()&&!this.element.isLinked?O`
`:T}}class $t extends je{static#be={"/Script/CoreUObject.LinearColor":Et,"/Script/CoreUObject.Rotator":Ct,"/Script/CoreUObject.Vector":At,bool:rt,exec:st,int:Nt,MUTABLE_REFERENCE:Pt,name:wt,real:kt,string:xt};static properties={advancedView:{type:String,attribute:"data-advanced-view",reflect:!0},color:{type:pe,converter:{fromAttribute:(e,t)=>e?$e.grammar.LinearColorFromAnyColor.parse(e).value:null,toAttribute:(e,t)=>e?ie.printLinearColor(e):null},attribute:"data-color",reflect:!0},defaultValue:{type:String,attribute:!1},isLinked:{type:Boolean,converter:ie.booleanConverter,attribute:"data-linked",reflect:!0},pinType:{type:String,attribute:"data-type",reflect:!0},pinDirection:{type:String,attribute:"data-direction",reflect:!0}};static getTypeTemplate(e){return $t.#be[e.PinType.bIsReference&&!e.PinType.bIsConst?"MUTABLE_REFERENCE":e.getType()]??it}nodeElement;clickableElement;connections=0;constructor(e){super(e,new($t.getTypeTemplate(e))),this.advancedView=e.bAdvancedView,this.defaultValue=e.getDefaultValue(),this.pinType=this.entity.getType(),this.color=$t.properties.color.converter.fromAttribute(J.pinColor[this.pinType]?.toString()),this.isLinked=!1,this.pinDirection=e.isInput()?"input":e.isOutput()?"output":"hidden",this.entity.subscribe("PinToolTip",(e=>{let t=e.match(/\s*(.+?(?=\n)|.+\S)\s*/);return t?ie.formatStringName(t[1]):ie.formatStringName(this.entity.PinName)}))}GetPinId(){return this.entity.PinId}GetPinIdValue(){return this.GetPinId().value}getPinName(){return this.entity.PinName}getPinDisplayName(){let e=null;return this.entity.PinToolTip&&(e=this.entity.PinToolTip.match(/\s*(.+?(?=\n)|.+\S)\s*/))?ie.formatStringName(e[1]):ie.formatStringName(this.entity.PinName)}isInput(){return this.entity.isInput()}isOutput(){return this.entity.isOutput()}getClickableElement(){return this.clickableElement}getLinkLocation(){return this.template.getLinkLocation()}getNodeElement(){return this.nodeElement}getLinks(){return this.entity.LinkedTo??[]}setDefaultValue(e){this.entity.DefaultValue=e,this.defaultValue=e}sanitizeLinks(e=[]){this.entity.LinkedTo=this.getLinks().filter((t=>{let n=this.blueprint.getPin(t);if(n){if(e.length&&!e.includes(n.nodeElement))return!1;this.blueprint.getLink(this,n,!0)||this.blueprint.addGraphElement(new tt(this,n))}return n}))}linkTo(e){this.entity.linkTo(e.getNodeElement().getNodeName(),e.entity),this.isLinked=this.entity.isLinked()}unlinkFrom(e){this.entity.unlinkFrom(e.getNodeElement().getNodeName(),e.entity),this.isLinked=this.entity.isLinked()}redirectLink(e,t){const n=this.entity.LinkedTo.findIndex((t=>t.objectName.toString()==e.getNodeElement().getNodeName()&&t.pinGuid.valueOf()==e.entity.PinId.valueOf()));return n>=0&&(this.entity.LinkedTo[n]=t,!0)}}class Lt extends Ye{toggleAdvancedDisplayHandler;render(){return O`
${this.element.nodeDisplayName}
${"DevelopmentOnly"==this.element.enabledState?.toString()?O`
Development Only
`:T} ${this.element.advancedPinDisplay?O`
`:T}
`}async firstUpdated(e){super.firstUpdated(e);const t=this.element.querySelector(".ueb-node-inputs"),n=this.element.querySelector(".ueb-node-outputs");Promise.all(this.element.getPinElements().map((e=>e.updateComplete))).then((()=>this.element.dispatchReflowEvent())),this.element.getPinElements().forEach((e=>{e.isInput()?t.appendChild(e):e.isOutput()&&n.appendChild(e)})),this.toggleAdvancedDisplayHandler=e=>{this.element.toggleShowAdvancedPinDisplay(),this.element.addNextUpdatedCallbacks((()=>this.element.dispatchReflowEvent()),!0)},this.element.nodeNameElement=this.element.querySelector(".ueb-node-name-text")}getPinElements(e){return e.querySelectorAll("ueb-pin")}}class Ot extends Ue{static properties={...Ue.properties,name:{type:String,attribute:"data-name",reflect:!0},advancedPinDisplay:{type:String,attribute:"data-advanced-display",converter:le.attributeConverter,reflect:!0},enabledState:{type:String,attribute:"data-enabled-state",reflect:!0},nodeDisplayName:{type:String,attribute:!1},pureFunction:{type:Boolean,converter:ie.booleanConverter,attribute:"data-pure-function",reflect:!0}};static dragEventName=J.nodeDragEventName;static dragGeneralEventName=J.nodeDragGeneralEventName;get blueprint(){return super.blueprint}set blueprint(e){super.blueprint=e,this.#ye.forEach((t=>t.blueprint=e))}#Ee;get nodeNameElement(){return this.#Ee}set nodeNameElement(e){this.#Ee=e}#ye;constructor(e){super(e,new Lt),this.#ye=this.getPinEntities().filter((e=>!e.isHidden())).map((e=>new $t(e))),this.#ye.forEach((e=>e.nodeElement=this)),this.name=e.getObjectName(),this.advancedPinDisplay=e.AdvancedPinDisplay?.toString(),this.enabledState=e.EnabledState,this.nodeDisplayName=e.getDisplayName(),this.pureFunction=e.bIsPureFunc,this.dragLinkObjects=[],super.setLocation([this.entity.NodePosX.value,this.entity.NodePosY.value]),this.entity.subscribe("AdvancedPinDisplay",(e=>this.advancedPinDisplay=e)),this.entity.subscribe("Name",(e=>this.name=e))}static fromSerializedObject(e){e=e.trim();let t=te.getSerializer(ke).deserialize(e);return new Ot(t)}connectedCallback(){this.getAttribute("type")?.trim(),super.connectedCallback()}disconnectedCallback(){super.disconnectedCallback(),this.dispatchDeleteEvent()}getNodeName(){return this.entity.getObjectName()}getNodeDisplayName(){return this.entity.getDisplayName()}sanitizeLinks(e=[]){this.getPinElements().forEach((t=>t.sanitizeLinks(e)))}rename(e){if(this.entity.Name==e)return!1;for(let t of this.getPinElements())for(let n of t.getLinks())this.blueprint.getPin(n).redirectLink(t,new ve({objectName:e,pinGuid:t.entity.PinId}));this.entity.Name=e}getPinElements(){return this.#ye}getPinEntities(){return this.entity.CustomProperties.filter((e=>e instanceof we))}setLocation(e=[0,0]){let t=this.entity.NodePosX.constructor;this.entity.NodePosX=new t(e[0]),this.entity.NodePosY=new t(e[1]),super.setLocation(e)}dispatchDeleteEvent(){let e=new CustomEvent(J.nodeDeleteEventName);this.dispatchEvent(e)}dispatchReflowEvent(){let e=new CustomEvent(J.nodeReflowEventName);this.dispatchEvent(e)}setShowAdvancedPinDisplay(e){this.entity.AdvancedPinDisplay=new le(e?"Shown":"Hidden")}toggleShowAdvancedPinDisplay(){this.setShowAdvancedPinDisplay("Shown"!=this.entity.AdvancedPinDisplay?.toString())}}class Mt extends Q{static#p=new Le;#we;constructor(e,t,n={}){n.listenOnFocus??=!0,n.unlistenOnTextEdit??=!0,super(e,t,n);let i=this;this.#we=e=>i.pasted(e.clipboardData.getData("Text"))}listenEvents(){document.body.addEventListener("paste",this.#we)}unlistenEvents(){document.body.removeEventListener("paste",this.#we)}pasted(e){let t=0,n=0,i=0,r=Mt.#p.readMultiple(e).map((e=>{let r=new Ot(e);return t+=r.locationY,n+=r.locationX,++i,r}));t/=i,n/=i,r.length>0&&this.blueprint.unselectAll();let s=this.blueprint.mousePosition;return r.forEach((e=>{const i=[s[0]-n,s[1]-t];e.addLocation(i),e.snapToGrid(),e.setSelected(!0)})),this.blueprint.addGraphElement(...r),!0}}class Tt extends Ge{constructor(e,t,n){super(e,t,n),this.selectorElement=this.blueprint.selectorElement}startDrag(){this.selectorElement.beginSelect(this.clickedPosition)}dragTo(e,t){this.selectorElement.selectTo(e)}endDrag(){this.started&&this.selectorElement.endSelect()}unclicked(){this.started||this.blueprint.unselectAll()}}class Dt{constructor(e=(e=>e),t=null){this.array=new Uint32Array(t),this.comparisonValueSupplier=e,this.length=0,this.currentPosition=0}get(e){return e>=0&&e=0&&this.currentPosition=0&&this.currentPosition0?this.get(this.currentPosition-1):null}getPrevValue(){return this.currentPosition>0?this.comparisonValueSupplier(this.get(this.currentPosition-1)):Number.MIN_SAFE_INTEGER}shiftLeft(e,t=1){this.array.set(this.array.subarray(e+t),e)}shiftRight(e,t=1){this.array.set(this.array.subarray(e,-t),e+t)}}class Ht{constructor(e,t,n,i){this.initialPosition=e,this.finalPosition=e,this.metadata=new Array(t.length),this.primaryOrder=new Dt((e=>this.metadata[e].primaryBoundary)),this.secondaryOrder=new Dt((e=>this.metadata[e].secondaryBoundary)),this.selectFunc=i,this.rectangles=t,this.primaryOrder.reserve(this.rectangles.length),this.secondaryOrder.reserve(this.rectangles.length),t.forEach(((e,t)=>{let r={primaryBoundary:this.initialPosition[0],secondaryBoundary:this.initialPosition[1],rectangle:t,onSecondaryAxis:!1};this.metadata[t]=r,i(e,!1);const s=n(e);this.initialPosition[1]{if(this.metadata[n].onSecondaryAxis)this.selectFunc(this.rectangles[n],i);else if(i){this.secondaryOrder.insert(n,e[1]);const i=this.metadata[n].secondaryBoundary;Math.sign(e[1]-i)==t[1]&&Math.sign(i-this.initialPosition[1])==t[1]&&this.selectFunc(this.rectangles[n],!0)}else this.selectFunc(this.rectangles[n],!1),this.secondaryOrder.remove(n);this.computeBoundaries(),this.selectTo(e)};e[0]this.boundaries.primaryN.v&&e[0]this.boundaries.primaryP.v&&(++this.primaryOrder.currentPosition,n(this.boundaries.primaryP.i,this.initialPosition[0]{this.selectFunc(this.rectangles[t],n),this.computeBoundaries(),this.selectTo(e)};e[1]this.boundaries.secondaryN.v&&e[1]this.boundaries.secondaryP.v&&(++this.secondaryOrder.currentPosition,i(this.boundaries.secondaryP.i,this.initialPosition[1]i.clickedSomewhere(e.target),this.blueprint.focus&&document.addEventListener("click",this.#Se)}clickedSomewhere(e){e.closest("ueb-blueprint")||this.blueprint.setFocused(!1)}listenEvents(){document.addEventListener("click",this.#Se)}unlistenEvents(){document.removeEventListener("click",this.#Se)}}class Rt extends Me{static styleVariables={"--ueb-font-size":`${J.fontSize}`,"--ueb-grid-axis-line-color":`${J.gridAxisLineColor}`,"--ueb-grid-expand":`${J.expandGridSize}px`,"--ueb-grid-line-color":`${J.gridLineColor}`,"--ueb-grid-line-width":`${J.gridLineWidth}px`,"--ueb-grid-set-line-color":`${J.gridSetLineColor}`,"--ueb-grid-set":`${J.gridSet}`,"--ueb-grid-size":`${J.gridSize}px`,"--ueb-link-min-width":`${J.linkMinWidth}`,"--ueb-node-radius":`${J.nodeRadius}px`,...Object.entries(J.pinColor).map((([e,t])=>({[`--ueb-pin-color-${ie.getIdFromReference(e)}`]:t.toString()}))).reduce(((e,t)=>({...e,...t})),{})};constructed(e){super.constructed(e),this.element.style.cssText=Object.entries(Rt.styleVariables).map((([e,t])=>`${e}:${t};`)).join("")}createInputObjects(){return[...super.createInputObjects(),new Oe(this.element.getGridDOMElement(),this.element),new Mt(this.element.getGridDOMElement(),this.element),new De(this.element.getGridDOMElement(),this.element),new Re(this.element.getGridDOMElement(),this.element),new Ie(this.element.getGridDOMElement(),this.element),new Tt(this.element.getGridDOMElement(),this.element,{clickButton:0,exitAnyButton:!0,moveEverywhere:!0}),new Fe(this.element.getGridDOMElement(),this.element,{clickButton:2,exitAnyButton:!1,moveEverywhere:!0}),new Bt(this.element.getGridDOMElement(),this.element),new ze(this.element.getGridDOMElement(),this.element),new Be(this.element.getGridDOMElement(),this.element)]}render(){return O`
${0==this.element.zoom?"1:1":this.element.zoom}
`}firstUpdated(e){super.firstUpdated(e),this.element.headerElement=this.element.querySelector(".ueb-viewport-header"),this.element.overlayElement=this.element.querySelector(".ueb-viewport-overlay"),this.element.viewportElement=this.element.querySelector(".ueb-viewport-body"),this.element.selectorElement=new It,this.element.querySelector(".ueb-grid-content")?.append(this.element.selectorElement),this.element.gridElement=this.element.viewportElement.querySelector(".ueb-grid"),this.element.linksContainerElement=this.element.querySelector("[data-links]"),this.element.linksContainerElement.append(...this.element.getLinks()),this.element.nodesContainerElement=this.element.querySelector("[data-nodes]"),this.element.nodesContainerElement.append(...this.element.getNodes()),this.element.viewportElement.scroll(J.expandGridSize,J.expandGridSize)}updated(e){if(super.updated(e),(e.has("scrollX")||e.has("scrollY"))&&this.element.viewportElement.scroll(this.element.scrollX,this.element.scrollY),e.has("zoom")){const t=e.get("zoom"),n=Math.min(t,this.element.zoom),i=Math.max(t,this.element.zoom),r=ie.range(n,i),s=e=>`ueb-zoom-${e}`;te<0)).map(s)),this.element.classList.add(...r.filter((e=>e>0)).map(s))):(this.element.classList.remove(...r.filter((e=>e>0)).map(s)),this.element.classList.add(...r.filter((e=>e<0)).map(s)))}}getPin(e){return this.element.querySelector(`ueb-node[data-name="${e.objectName}"] ueb-pin[data-id="${e.pinGuid}"]`)}}class Gt extends je{static properties={selecting:{type:Boolean,attribute:"data-selecting",reflect:!0,converter:ie.booleanConverter},scrolling:{type:Boolean,attribute:"data-scrolling",reflect:!0,converter:ie.booleanConverter},focused:{type:Boolean,attribute:"data-focused",reflect:!0,converter:ie.booleanConverter},zoom:{type:Number,attribute:"data-zoom",reflect:!0},scrollX:{type:Number,attribute:!1},scrollY:{type:Number,attribute:!1},additionalX:{type:Number,attribute:!1},additionalY:{type:Number,attribute:!1},translateX:{type:Number,attribute:!1},translateY:{type:Number,attribute:!1}};static styles=Rt.styles;#ke=new Map;nodes=[];links=[];mousePosition=[0,0];gridElement;viewportElement;overlayElement;selectorElement;linksContainerElement;nodesContainerElement;headerElement;focused=!1;nodeBoundariesSupplier=e=>{let t=e.getBoundingClientRect(),n=this.nodesContainerElement.getBoundingClientRect();const i=1/this.getScale();return{primaryInf:(t.left-n.left)*i,primarySup:(t.right-n.right)*i,secondaryInf:(t.top-n.top)*i,secondarySup:(t.bottom-n.bottom)*i}};nodeSelectToggleFunction=(e,t)=>{e.setSelected(t)};constructor(e=new J){super({},new Rt),this.selecting=!1,this.scrolling=!1,this.focused=!1,this.zoom=0,this.scrollX=J.expandGridSize,this.scrollY=J.expandGridSize,this.translateX=J.expandGridSize,this.translateY=J.expandGridSize}getGridDOMElement(){return this.gridElement}disconnectedCallback(){super.disconnectedCallback()}getScroll(){return[this.scrollX,this.scrollY]}setScroll([e,t],n=!1){this.scrollX=e,this.scrollY=t}scrollDelta(e,t=!1){const n=[2*J.expandGridSize,2*J.expandGridSize];let i=this.getScroll(),r=[i[0]+e[0],i[1]+e[1]],s=[0,0];for(let t=0;t<2;++t)e[t]<0&&r[t]0&&r[t]>n[t]-J.gridExpandThreshold*J.expandGridSize&&(s[t]=1);0==s[0]&&0==s[1]||this.seamlessExpand(s),i=this.getScroll(),r=[i[0]+e[0],i[1]+e[1]],this.setScroll(r,t)}scrollCenter(){const e=this.getScroll(),t=[this.translateX-e[0],this.translateY-e[1]],n=this.getViewportSize().map((e=>e/2)),i=[t[0]-n[0],t[1]-n[1]];this.scrollDelta(i,!0)}getViewportSize(){return[this.viewportElement.clientWidth,this.viewportElement.clientHeight]}getScrollMax(){return[this.viewportElement.scrollWidth-this.viewportElement.clientWidth,this.viewportElement.scrollHeight-this.viewportElement.clientHeight]}snapToGrid(e){return ie.snapToGrid(e,J.gridSize)}seamlessExpand([e,t]){e=Math.round(e),t=Math.round(t);let n=this.getScale();[e,t]=[-e*J.expandGridSize,-t*J.expandGridSize],0!=e&&(this.scrollX+=e,e/=n),0!=t&&(this.scrollY+=t,t/=n),this.translateX+=e,this.translateY+=t}progressiveSnapToGrid(e){return J.expandGridSize*Math.round(e/J.expandGridSize+.5*Math.sign(e))}getZoom(){return this.zoom}setZoom(e,t){if((e=ie.clamp(e,J.minZoom,J.maxZoom))==this.zoom)return;let n=this.getScale();this.zoom=e,t&&requestAnimationFrame((e=>{t[0]+=this.translateX,t[1]+=this.translateY;let i=this.getScale()/n,r=[i*t[0],i*t[1]];this.scrollDelta([(r[0]-t[0])*n,(r[1]-t[1])*n])}))}getScale(){return parseFloat(getComputedStyle(this.gridElement).getPropertyValue("--ueb-scale"))}compensateTranslation([e,t]){return[e-=this.translateX,t-=this.translateY]}getNodes(e=!1){return e?this.nodes.filter((e=>e.selected)):this.nodes}getPin(e){let t=this.template.getPin(e);return t&&t.nodeElement.getNodeName()==e.objectName.toString()?t:[...this.nodes.find((t=>e.objectName.toString()==t.getNodeName()))?.getPinElements()??[]].find((t=>e.pinGuid.toString()==t.GetPinIdValue()))}getLinks([e,t]=[]){if(null==e!=t==null){const n=e??t;return this.links.filter((e=>e.sourcePin==n||e.destinationPin==n))}return null!=e&&null!=t?this.links.filter((n=>n.sourcePin==e&&n.destinationPin==t||n.sourcePin==t&&n.destinationPin==e)):this.links}getLink(e,t,n=!1){return this.links.find((i=>i.sourcePin==e&&i.destinationPin==t||n&&i.sourcePin==t&&i.destinationPin==e))}selectAll(){this.getNodes().forEach((e=>this.nodeSelectToggleFunction(e,!0)))}unselectAll(){this.getNodes().forEach((e=>this.nodeSelectToggleFunction(e,!1)))}addGraphElement(...e){for(let t of e)if(t.blueprint=this,t instanceof Ot&&!this.nodes.includes(t)){const e=t.entity.getObjectName(),n=this.nodes.find((t=>t.entity.getObjectName()==e));if(n){let e=n.entity.getObjectName(!0);this.#ke[e]=this.#ke[e]??-1;do{++this.#ke[e]}while(this.nodes.find((t=>t.entity.getObjectName()==J.nodeName(e,this.#ke[e]))));n.rename(J.nodeName(e,this.#ke[e]))}this.nodes.push(t),this.nodesContainerElement?.appendChild(t)}else t instanceof tt&&!this.links.includes(t)&&(this.links.push(t),this.linksContainerElement&&!this.linksContainerElement.contains(t)&&this.linksContainerElement.appendChild(t));e.filter((e=>e instanceof Ot)).forEach((t=>t.sanitizeLinks(e)))}removeGraphElement(...e){for(let t of e)if(t.closest("ueb-blueprint")==this){t.remove();let e=t instanceof Ot?this.nodes:t instanceof tt?this.links:null;e?.splice(e.findIndex((e=>e===t)),1)}}setFocused(e=!0){if(this.focused==e)return;let t=new CustomEvent(e?"blueprint-focus":"blueprint-unfocus");this.focused=e,this.focused||this.unselectAll(),this.dispatchEvent(t)}dispatchEditTextEvent(e){const t=new CustomEvent(e?J.editTextEventName.begin:J.editTextEventName.end);this.dispatchEvent(t)}}customElements.define("ueb-blueprint",Gt);class Ft extends Me{#Pe=()=>{this.element.blueprint.dispatchEditTextEvent(!0),this.element.selectOnFocus&&getSelection().selectAllChildren(this.element)};#Ce=()=>{this.element.blueprint.dispatchEditTextEvent(!1),document.getSelection()?.removeAllRanges()};#xe=e=>e.target.querySelectorAll("br").forEach((e=>e.remove()));#Ae=e=>{"Enter"!=e.code||e.shiftKey||e.target.blur()};constructed(e){super.constructed(e),this.element.classList.add("ueb-pin-input-content"),this.element.setAttribute("role","textbox"),this.element.contentEditable="true"}connectedCallback(){this.element.addEventListener("focus",this.#Pe),this.element.addEventListener("focusout",this.#Ce),this.element.singleLine&&this.element.addEventListener("input",this.#xe),this.element.blurOnEnter&&this.element.addEventListener("keydown",this.#Ae)}cleanup(){this.element.removeEventListener("focus",this.#Pe),this.element.removeEventListener("focusout",this.#Ce),this.element.singleLine&&this.element.removeEventListener("input",this.#xe),this.element.blurOnEnter&&this.element.removeEventListener("keydown",this.#Ae)}}class zt extends je{static properties={...super.properties,singleLine:{type:Boolean,attribute:"data-single-line",converter:ie.booleanConverter,reflect:!0},selectOnFocus:{type:Boolean,attribute:"data-select-focus",converter:ie.booleanConverter,reflect:!0},blurOnEnter:{type:Boolean,attribute:"data-blur-enter",converter:ie.booleanConverter,reflect:!0}};constructor(){super({},new Ft),this.singleLine=!1,this.selectOnFocus=!0,this.blurOnEnter=!0}}class jt extends $e{constructor(e,t,n,i,r,s,o){e=e??(e=>`(${e})`),super(t,n,i,r,s,o),this.wrap=e}read(e){const t=Ne.getGrammarForType($e.grammar,this.entityType).parse(e);if(!t.status)throw new Error(`Error when trying to parse the entity ${this.entityType.prototype.constructor.name}.`);return t.value}write(e,t,n=!1){return this.wrap(this.subWrite(e,[],t,n))}}class Vt extends jt{#Ne;constructor(e,t){super(void 0,t),this.#Ne=e}write(e,t,n=!1){return this.#Ne(t,n)}}class Ut extends jt{constructor(e){super(void 0,e)}write(e,t,n){return n||t.constructor!==String?ie.escapeString(t.toString()):`"${ie.escapeString(t.toString())}"`}}!function(){const e=e=>`(${e})`;te.registerSerializer(null,new Vt(((e,t)=>"()"),null)),te.registerSerializer(Array,new Vt(((e,t)=>`(${e.map((e=>te.getSerializer(ie.getType(e)).serialize(e,t)+",")).join("")})`),Array)),te.registerSerializer(Boolean,new Vt(((e,t)=>e?t?"true":"True":t?"false":"False"),Boolean)),te.registerSerializer(oe,new jt(e,oe)),te.registerSerializer(ae,new Ut(ae)),te.registerSerializer(le,new Ut(le)),te.registerSerializer(ue,new Ut(ue)),te.registerSerializer(ce,new jt((e=>`${ce.lookbehind}(${e})`),ce,"",", ",!1,"",(e=>""))),te.registerSerializer(he,new jt(e,he)),te.registerSerializer(pe,new jt(e,pe)),te.registerSerializer(me,new jt((e=>`${me.lookbehind}(${e})`),me,"",", ",!1,"",(e=>""))),te.registerSerializer(Number,new Vt((e=>e.toString()),Number)),te.registerSerializer(ke,new Le),te.registerSerializer(se,new Vt((e=>(e.type??"")+(e.path?e.type?`'"${e.path}"'`:`"${e.path}"`:"")),se)),te.registerSerializer(ge,new Ut(ge)),te.registerSerializer(we,new jt((e=>`${we.lookbehind} (${e})`),we,"",",",!0)),te.registerSerializer(ve,new jt((e=>e),ve,""," ",!1,"",(e=>""))),te.registerSerializer(de,new Ut(de)),te.registerSerializer(be,new jt(e,be)),te.registerSerializer(String,new Vt(((e,t)=>t?ie.escapeString(e):`"${ie.escapeString(e)}"`),String)),te.registerSerializer(fe,new Vt(((e,t)=>`${e.P}, ${e.Y}, ${e.R}`),fe)),te.registerSerializer(Ee,new Vt(((e,t)=>`${e.X}, ${e.Y}, ${e.Z}`),Ee)),te.registerSerializer(ye,new jt(e,ye))}(),customElements.define("ueb-color-handler",ht),customElements.define("ueb-input",zt),customElements.define("ueb-link",tt),customElements.define("ueb-node",Ot),customElements.define("ueb-pin",$t),customElements.define("ueb-selector",It),customElements.define("ueb-ui-slider",pt),customElements.define("ueb-window",yt);export{Gt as Blueprint,J as Configuration,tt as LinkElement,Ot as NodeElement}; +const ct=(e=>(...t)=>({_$litDirective$:e,values:t}))(class extends class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,i){this._$Ct=e,this._$AM=t,this._$Ci=i}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}}{constructor(e){var t;if(super(e),e.type!==ut||"style"!==e.name||(null===(t=e.strings)||void 0===t?void 0:t.length)>2)throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.")}render(e){return Object.keys(e).reduce(((t,i)=>{const n=e[i];return null==n?t:t+`${i=i.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,"-$&").toLowerCase()}:${n};`}),"")}update(e,[t]){const{style:i}=e.element;if(void 0===this.vt){this.vt=new Set;for(const e in t)this.vt.add(e);return this.render(t)}this.vt.forEach((e=>{null==t[e]&&(this.vt.delete(e),e.includes("-")?i.removeProperty(e):i[e]="")}));for(const e in t){const n=t[e];null!=n&&(this.vt.add(e),e.includes("-")?i.setProperty(e,n):i[e]=n)}return T}});class ht extends Ke{#J;get locationChangeCallback(){return this.#J}set locationChangeCallback(e){this.#J=e}movementSpace;movementSpaceSize=[0,0];connectedCallback(){super.connectedCallback(),this.movementSpace=this.element.parentElement;const e=this.movementSpace.getBoundingClientRect();this.movementSpaceSize=[e.width,e.height]}createDraggableObject(){return new We(this.element,this.element.blueprint,{draggableElement:this.movementSpace,ignoreTranslateCompensate:!0,moveEverywhere:!0,movementSpace:this.movementSpace,repositionOnClick:!0,stepSize:1})}adjustLocation([e,t]){return this.locationChangeCallback?.(e,t),[e,t]}}class dt extends ht{adjustLocation([e,t]){const i=Math.round(this.movementSpaceSize[0]/2);e-=i,t=-(t-i);let[n,s]=ne.getPolarCoordinates([e,t]);return n=Math.min(n,i),[e,t]=ne.getCartesianCoordinates([n,s]),this.locationChangeCallback?.(e/i,t/i),[e=Math.round(e+i),t=Math.round(-t+i)]}}class pt extends Fe{windowElement;constructor(e,t){super(e,t)}connectedCallback(){super.connectedCallback(),this.windowElement=this.closest("ueb-window")}setLocation([e,t]){super.setLocation(this.template.adjustLocation([e,t]))}}class mt extends pt{constructor(){super({},new dt)}}class gt extends ht{adjustLocation([e,t]){return e=ne.clamp(e,0,this.movementSpaceSize[0]),t=ne.clamp(t,0,this.movementSpaceSize[1]),this.locationChangeCallback?.(e/this.movementSpaceSize[0],1-t/this.movementSpaceSize[1]),[e,t]}}class vt extends pt{constructor(){super({},new gt)}}class bt extends qe{toggleAdvancedDisplayHandler;getDraggableElement(){return this.element.querySelector(".ueb-window-top")}createDraggableObject(){return new We(this.element,this.element.blueprint,{draggableElement:this.getDraggableElement(),ignoreTranslateCompensate:!0,movementSpace:this.element.blueprint,stepSize:1})}render(){return O`
${this.renderWindowName()}
${this.renderContent()}
`}renderWindowName(){return O`Window`}renderContent(){return M}apply(){this.element.dispatchEvent(new CustomEvent(J.windowApplyEventName)),this.element.remove()}cancel(){this.element.dispatchEvent(new CustomEvent(J.windowCancelEventName)),this.element.remove()}}class ft extends bt{#Q;#ee;#te;#ie;#ne;#se;#re;#oe;#ae;#le;#ue=e=>{const t=ne.clearHTMLWhitespace(e.target.innerHTML),i=parseInt(t,16);isNaN(i)||(this.color.setFromRGBANumber(i),this.element.requestUpdate())};#ce=e=>{const t=ne.clearHTMLWhitespace(e.target.innerHTML),i=parseInt(t,16);isNaN(i)||(this.color.setFromSRGBANumber(i),this.element.requestUpdate())};#he=e=>t=>{"Enter"==t.code&&(t.preventDefault(),e(t))};#de=new pe;get color(){return this.#de}set color(e){e.toNumber()!=this.color?.toNumber()&&(this.element.requestUpdate("color",this.#de),this.#de=e)}#pe=new pe;get fullColor(){return this.#pe}#me;get initialColor(){return this.#me}#ge=new pe;#ve(e,t,i=!1){const n=this.color.toRGBAString(),s=`${n.substring(0,2*e)}${t}${n.substring(2+2*e)}`;return i?`${s.substring(0,6)}FF`:s}connectedCallback(){super.connectedCallback(),this.#me=this.element.windowOptions.getPinColor(),this.color.setFromHSVA(this.initialColor.H.value,this.initialColor.S.value,this.initialColor.V.value,this.initialColor.A.value),this.fullColor.setFromHSVA(this.color.H.value,1,1,1)}firstUpdated(e){this.#Q=this.element.querySelector(".ueb-color-picker-wheel ueb-color-handler"),this.#ee=this.element.querySelector(".ueb-color-picker-saturation ueb-ui-slider"),this.#te=this.element.querySelector(".ueb-color-picker-value ueb-ui-slider"),this.#ie=this.element.querySelector(".ueb-color-picker-r ueb-ui-slider"),this.#ne=this.element.querySelector(".ueb-color-picker-g ueb-ui-slider"),this.#se=this.element.querySelector(".ueb-color-picker-b ueb-ui-slider"),this.#re=this.element.querySelector(".ueb-color-picker-a ueb-ui-slider"),this.#oe=this.element.querySelector(".ueb-color-picker-h ueb-ui-slider"),this.#ae=this.element.querySelector(".ueb-color-picker-s ueb-ui-slider"),this.#le=this.element.querySelector(".ueb-color-picker-v ueb-ui-slider"),this.#Q.template.locationChangeCallback=(e,t)=>{this.color.setFromWheelLocation([e,t],this.color.V.value,this.color.A.value),this.fullColor.setFromHSVA(this.color.H.value,1,1,1),this.element.requestUpdate()},this.#ee.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,t,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#te.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,this.color.S.value,t,this.color.A.value),this.element.requestUpdate()},this.#ie.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([e,this.color.G.value,this.color.B.value,this.color.A.value]),this.element.requestUpdate()},this.#ne.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([this.color.R.value,e,this.color.B.value,this.color.A.value]),this.element.requestUpdate()},this.#se.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([this.color.R.value,this.color.G.value,e,this.color.A.value]),this.element.requestUpdate()},this.#re.template.locationChangeCallback=(e,t)=>{this.color.setFromRGBA([this.color.R.value,this.color.G.value,this.color.B.value,e]),this.element.requestUpdate()},this.#oe.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(e,this.color.S.value,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#ae.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,e,this.color.V.value,this.color.A.value),this.element.requestUpdate()},this.#le.template.locationChangeCallback=(e,t)=>{this.color.setFromHSVA(this.color.H.value,this.color.S.value,e,this.color.A.value),this.element.requestUpdate()}}renderSlider(e){let t="",i=0,n="";const s=e=>`linear-gradient(to right, #${this.#ve(e,"00",!0)}, #${this.#ve(e,"ff",!0)})`;switch(e){case 0:t="r",i=this.color.R.value,n=s(e);break;case 1:t="g",i=this.color.G.value,n=s(e);break;case 2:t="b",i=this.color.B.value,n=s(e);break;case 3:t="a",i=this.color.A.value,n=`${J.alphaPattern}, ${s(e)}`;break;case 4:t="h",i=360*this.color.H.value,n="linear-gradient(to right, #f00 0%, #ff0 16.666%, #0f0 33.333%, #0ff 50%, #00f 66.666%, #f0f 83.333%, #f00 100%)";break;case 5:t="s",i=this.color.S.value,n=`linear-gradient(to right,#${this.#ge.setFromHSVA(this.color.H.value,0,this.color.V.value,1),this.#ge.toRGBAString()},#${this.#ge.setFromHSVA(this.color.H.value,1,this.color.V.value,1),this.#ge.toRGBAString()})`;break;case 6:t="v",i=this.color.V.value,n=`linear-gradient(to right, #000, #${this.fullColor.toRGBAString()})`}return n=`background: ${n};`,O`
${t.toUpperCase()}
`}renderContent(){const e=2*this.color.H.value*Math.PI,t={"--ueb-color-r":this.color.R.toString(),"--ueb-color-g":this.color.G.toString(),"--ueb-color-b":this.color.B.toString(),"--ueb-color-a":this.color.A.toString(),"--ueb-color-h":this.color.H.toString(),"--ueb-color-s":this.color.S.toString(),"--ueb-color-v":this.color.V.toString(),"--ueb-color-wheel-x":100*(this.color.S.value*Math.cos(e)*.5+.5)+"%","--ueb-color-wheel-y":100*(this.color.S.value*Math.sin(e)*.5+.5)+"%"},i=this.color.toRGBAString(),n=this.color.toSRGBAString(),s=this.fullColor.toRGBAString();return O`
Old
New
Advanced
${this.renderSlider(0)} ${this.renderSlider(1)} ${this.renderSlider(2)} ${this.renderSlider(3)}
${this.renderSlider(4)} ${this.renderSlider(5)} ${this.renderSlider(6)}
Hex Linear
Hex sRGB
OK
Cancel
`}renderWindowName(){return O`Color Picker`}}class yt extends Fe{static#be={window:bt,"color-picker":ft};static properties={...Fe.properties,type:{type:bt,attribute:"data-type",reflect:!0,converter:{fromAttribute:(e,t)=>yt.#be[e],toAttribute:(e,t)=>Object.entries(yt.#be).find((([t,i])=>e==i))[0]}}};constructor(e={}){e.type.constructor==String&&(e.type=yt.#be[e.type]),e.type??=bt,e.windowOptions??={},super({},new e.type),this.type=e.type,this.windowOptions=e.windowOptions}disconnectedCallback(){super.disconnectedCallback(),this.dispatchCloseEvent()}dispatchCloseEvent(){let e=new CustomEvent(J.windowCloseEventName);this.dispatchEvent(e)}}class Et extends ot{#q;#fe;#ye=e=>{this.#fe=new yt({type:ft,windowOptions:{getPinColor:()=>this.element.defaultValue,setPinColor:e=>this.element.setDefaultValue(e)}}),this.element.blueprint.append(this.#fe);const t=()=>{this.element.setDefaultValue(this.#fe.template.color)},i=()=>{this.#fe.removeEventListener(J.windowApplyEventName,t),this.#fe.removeEventListener(J.windowCloseEventName,i),this.#fe=null};this.#fe.addEventListener(J.windowApplyEventName,t),this.#fe.addEventListener(J.windowCloseEventName,i)};firstUpdated(e){super.firstUpdated(e),this.#q=this.element.querySelector(".ueb-pin-input")}getInputs(){return[this.#q.dataset.linearColor]}setInputs(e=[]){}renderInput(){return this.element.isInput()&&!this.element.isLinked?O``:super.renderInput()}}class wt extends ot{static singleLineInput=!0}class St extends at{setDefaultValue(e=[],t=e){this.element.setDefaultValue(e[0])}renderInput(){return this.element.isInput()&&!this.element.isLinked?O`
`:M}}class kt extends nt{renderIcon(){return O``}}class Pt extends at{setDefaultValue(e=[],t=e){if(!(this.element.entity.DefaultValue instanceof be))throw new TypeError("Expected DefaultValue to be a VectorEntity");let i=this.element.entity.DefaultValue;i.R=e[0],i.P=e[1],i.Y=e[2]}renderInput(){return this.element.isInput()?O`
X
Y
Z
`:O``}}class Ct extends ot{}class xt extends at{setDefaultValue(e,t){if(!(this.element.entity.DefaultValue instanceof ye))throw new TypeError("Expected DefaultValue to be a VectorEntity");let i=this.element.entity.DefaultValue;i.X=e[0],i.Y=e[1],i.Z=e[2]}renderInput(){return this.element.isInput()?O`
X
Y
Z
`:O``}}class At extends Ge{static#be={"/Script/CoreUObject.LinearColor":Et,"/Script/CoreUObject.Rotator":Pt,"/Script/CoreUObject.Vector":xt,bool:st,exec:rt,int:lt,MUTABLE_REFERENCE:kt,name:wt,real:St,string:Ct};static properties={advancedView:{type:String,attribute:"data-advanced-view",reflect:!0},color:{type:pe,converter:{fromAttribute:(e,t)=>e?$e.grammar.LinearColorFromAnyColor.parse(e).value:null,toAttribute:(e,t)=>e?ne.printLinearColor(e):null},attribute:"data-color",reflect:!0},defaultValue:{type:String,attribute:!1},isLinked:{type:Boolean,converter:ne.booleanConverter,attribute:"data-linked",reflect:!0},pinType:{type:String,attribute:"data-type",reflect:!0},pinDirection:{type:String,attribute:"data-direction",reflect:!0}};static getTypeTemplate(e){return At.#be[e.PinType.bIsReference&&!e.PinType.bIsConst?"MUTABLE_REFERENCE":e.getType()]??nt}nodeElement;connections=0;constructor(e){super(e,new(At.getTypeTemplate(e))),this.advancedView=e.bAdvancedView,this.defaultValue=e.getDefaultValue(),this.pinType=this.entity.getType(),this.color=At.properties.color.converter.fromAttribute(J.pinColor[this.pinType]?.toString()),this.isLinked=!1,this.pinDirection=e.isInput()?"input":e.isOutput()?"output":"hidden",this.entity.subscribe("PinToolTip",(e=>{let t=e.match(/\s*(.+?(?=\n)|.+\S)\s*/);return t?ne.formatStringName(t[1]):ne.formatStringName(this.entity.PinName)}))}GetPinId(){return this.entity.PinId}GetPinIdValue(){return this.GetPinId().value}getPinName(){return this.entity.PinName}getPinDisplayName(){let e=null;return this.entity.PinToolTip&&(e=this.entity.PinToolTip.match(/\s*(.+?(?=\n)|.+\S)\s*/))?ne.formatStringName(e[1]):ne.formatStringName(this.entity.PinName)}isInput(){return this.entity.isInput()}isOutput(){return this.entity.isOutput()}getLinkLocation(){return this.template.getLinkLocation()}getNodeElement(){return this.nodeElement}getLinks(){return this.entity.LinkedTo??[]}setDefaultValue(e){this.entity.DefaultValue=e,this.defaultValue=e}sanitizeLinks(e=[]){this.entity.LinkedTo=this.getLinks().filter((t=>{let i=this.blueprint.getPin(t);if(i){if(e.length&&!e.includes(i.nodeElement))return!1;this.blueprint.getLink(this,i,!0)||this.blueprint.addGraphElement(new tt(this,i))}return i}))}linkTo(e){this.entity.linkTo(e.getNodeElement().getNodeName(),e.entity),this.isLinked=this.entity.isLinked()}unlinkFrom(e){this.entity.unlinkFrom(e.getNodeElement().getNodeName(),e.entity),this.isLinked=this.entity.isLinked()}redirectLink(e,t){const i=this.entity.LinkedTo.findIndex((t=>t.objectName.toString()==e.getNodeElement().getNodeName()&&t.pinGuid.valueOf()==e.entity.PinId.valueOf()));return i>=0&&(this.entity.LinkedTo[i]=t,!0)}}class Nt extends Ye{toggleAdvancedDisplayHandler=e=>{this.element.toggleShowAdvancedPinDisplay(),this.element.addNextUpdatedCallbacks((()=>this.element.dispatchReflowEvent()),!0)};render(){return O`
${this.element.nodeDisplayName}
${"DevelopmentOnly"==this.element.enabledState?.toString()?O`
Development Only
`:M} ${this.element.advancedPinDisplay?O`
`:M}
`}firstUpdated(e){super.firstUpdated(e);const t=this.element.querySelector(".ueb-node-inputs"),i=this.element.querySelector(".ueb-node-outputs");Promise.all(this.element.getPinElements().map((e=>e.updateComplete))).then((()=>this.element.dispatchReflowEvent())),this.element.getPinElements().forEach((e=>{e.isInput()?t.appendChild(e):e.isOutput()&&i.appendChild(e)})),this.element.nodeNameElement=this.element.querySelector(".ueb-node-name-text")}getPinElements(e){return e.querySelectorAll("ueb-pin")}}class $t extends Ue{static properties={...Ue.properties,name:{type:String,attribute:"data-name",reflect:!0},advancedPinDisplay:{type:String,attribute:"data-advanced-display",converter:le.attributeConverter,reflect:!0},enabledState:{type:String,attribute:"data-enabled-state",reflect:!0},nodeDisplayName:{type:String,attribute:!1},pureFunction:{type:Boolean,converter:ne.booleanConverter,attribute:"data-pure-function",reflect:!0}};static dragEventName=J.nodeDragEventName;static dragGeneralEventName=J.nodeDragGeneralEventName;get blueprint(){return super.blueprint}set blueprint(e){super.blueprint=e,this.#Ee.forEach((t=>t.blueprint=e))}#we;get nodeNameElement(){return this.#we}set nodeNameElement(e){this.#we=e}#Ee;constructor(e){super(e,new Nt),this.#Ee=this.getPinEntities().filter((e=>!e.isHidden())).map((e=>new At(e))),this.#Ee.forEach((e=>e.nodeElement=this)),this.name=e.getObjectName(),this.advancedPinDisplay=e.AdvancedPinDisplay?.toString(),this.enabledState=e.EnabledState,this.nodeDisplayName=e.getDisplayName(),this.pureFunction=e.bIsPureFunc,this.dragLinkObjects=[],super.setLocation([this.entity.NodePosX.value,this.entity.NodePosY.value]),this.entity.subscribe("AdvancedPinDisplay",(e=>this.advancedPinDisplay=e)),this.entity.subscribe("Name",(e=>this.name=e))}static fromSerializedObject(e){e=e.trim();let t=te.getSerializer(ke).deserialize(e);return new $t(t)}connectedCallback(){this.getAttribute("type")?.trim(),super.connectedCallback()}disconnectedCallback(){super.disconnectedCallback(),this.dispatchDeleteEvent()}getNodeName(){return this.entity.getObjectName()}getNodeDisplayName(){return this.entity.getDisplayName()}sanitizeLinks(e=[]){this.getPinElements().forEach((t=>t.sanitizeLinks(e)))}rename(e){if(this.entity.Name==e)return!1;for(let t of this.getPinElements())for(let i of t.getLinks())this.blueprint.getPin(i).redirectLink(t,new ve({objectName:e,pinGuid:t.entity.PinId}));this.entity.Name=e}getPinElements(){return this.#Ee}getPinEntities(){return this.entity.CustomProperties.filter((e=>e instanceof we))}setLocation(e=[0,0]){let t=this.entity.NodePosX.constructor;this.entity.NodePosX=new t(e[0]),this.entity.NodePosY=new t(e[1]),super.setLocation(e)}dispatchDeleteEvent(){let e=new CustomEvent(J.nodeDeleteEventName);this.dispatchEvent(e)}dispatchReflowEvent(){let e=new CustomEvent(J.nodeReflowEventName);this.dispatchEvent(e)}setShowAdvancedPinDisplay(e){this.entity.AdvancedPinDisplay=new le(e?"Shown":"Hidden")}toggleShowAdvancedPinDisplay(){this.setShowAdvancedPinDisplay("Shown"!=this.entity.AdvancedPinDisplay?.toString())}}class Lt extends Q{static#p=new Le;#Se;constructor(e,t,i={}){i.listenOnFocus??=!0,i.unlistenOnTextEdit??=!0,super(e,t,i);let n=this;this.#Se=e=>n.pasted(e.clipboardData.getData("Text"))}listenEvents(){document.body.addEventListener("paste",this.#Se)}unlistenEvents(){document.body.removeEventListener("paste",this.#Se)}pasted(e){let t=0,i=0,n=0,s=Lt.#p.readMultiple(e).map((e=>{let s=new $t(e);return t+=s.locationY,i+=s.locationX,++n,s}));t/=n,i/=n,s.length>0&&this.blueprint.unselectAll();let r=this.blueprint.mousePosition;return s.forEach((e=>{const n=[r[0]-i,r[1]-t];e.addLocation(n),e.snapToGrid(),e.setSelected(!0)})),this.blueprint.addGraphElement(...s),!0}}class Ot extends ze{constructor(e,t,i){super(e,t,i),this.selectorElement=this.blueprint.selectorElement}startDrag(){this.selectorElement.beginSelect(this.clickedPosition)}dragTo(e,t){this.selectorElement.selectTo(e)}endDrag(){this.started&&this.selectorElement.endSelect()}unclicked(){this.started||this.blueprint.unselectAll()}}class Tt{constructor(e=(e=>e),t=null){this.array=new Uint32Array(t),this.comparisonValueSupplier=e,this.length=0,this.currentPosition=0}get(e){return e>=0&&e=0&&this.currentPosition=0&&this.currentPosition0?this.get(this.currentPosition-1):null}getPrevValue(){return this.currentPosition>0?this.comparisonValueSupplier(this.get(this.currentPosition-1)):Number.MIN_SAFE_INTEGER}shiftLeft(e,t=1){this.array.set(this.array.subarray(e+t),e)}shiftRight(e,t=1){this.array.set(this.array.subarray(e,-t),e+t)}}class Mt{constructor(e,t,i,n){this.initialPosition=e,this.finalPosition=e,this.metadata=new Array(t.length),this.primaryOrder=new Tt((e=>this.metadata[e].primaryBoundary)),this.secondaryOrder=new Tt((e=>this.metadata[e].secondaryBoundary)),this.selectFunc=n,this.rectangles=t,this.primaryOrder.reserve(this.rectangles.length),this.secondaryOrder.reserve(this.rectangles.length),t.forEach(((e,t)=>{let s={primaryBoundary:this.initialPosition[0],secondaryBoundary:this.initialPosition[1],rectangle:t,onSecondaryAxis:!1};this.metadata[t]=s,n(e,!1);const r=i(e);this.initialPosition[1]{if(this.metadata[i].onSecondaryAxis)this.selectFunc(this.rectangles[i],n);else if(n){this.secondaryOrder.insert(i,e[1]);const n=this.metadata[i].secondaryBoundary;Math.sign(e[1]-n)==t[1]&&Math.sign(n-this.initialPosition[1])==t[1]&&this.selectFunc(this.rectangles[i],!0)}else this.selectFunc(this.rectangles[i],!1),this.secondaryOrder.remove(i);this.computeBoundaries(),this.selectTo(e)};e[0]this.boundaries.primaryN.v&&e[0]this.boundaries.primaryP.v&&(++this.primaryOrder.currentPosition,i(this.boundaries.primaryP.i,this.initialPosition[0]{this.selectFunc(this.rectangles[t],i),this.computeBoundaries(),this.selectTo(e)};e[1]this.boundaries.secondaryN.v&&e[1]this.boundaries.secondaryP.v&&(++this.secondaryOrder.currentPosition,n(this.boundaries.secondaryP.i,this.initialPosition[1]n.clickedSomewhere(e.target),this.blueprint.focus&&document.addEventListener("click",this.#ke)}clickedSomewhere(e){e.closest("ueb-blueprint")||this.blueprint.setFocused(!1)}listenEvents(){document.addEventListener("click",this.#ke)}unlistenEvents(){document.removeEventListener("click",this.#ke)}}class It extends Te{static styleVariables={"--ueb-font-size":`${J.fontSize}`,"--ueb-grid-axis-line-color":`${J.gridAxisLineColor}`,"--ueb-grid-expand":`${J.expandGridSize}px`,"--ueb-grid-line-color":`${J.gridLineColor}`,"--ueb-grid-line-width":`${J.gridLineWidth}px`,"--ueb-grid-set-line-color":`${J.gridSetLineColor}`,"--ueb-grid-set":`${J.gridSet}`,"--ueb-grid-size":`${J.gridSize}px`,"--ueb-link-min-width":`${J.linkMinWidth}`,"--ueb-node-radius":`${J.nodeRadius}px`,...Object.entries(J.pinColor).map((([e,t])=>({[`--ueb-pin-color-${ne.getIdFromReference(e)}`]:t.toString()}))).reduce(((e,t)=>({...e,...t})),{})};constructed(e){super.constructed(e),this.element.style.cssText=Object.entries(It.styleVariables).map((([e,t])=>`${e}:${t};`)).join("")}createInputObjects(){return[...super.createInputObjects(),new Oe(this.element.getGridDOMElement(),this.element),new Lt(this.element.getGridDOMElement(),this.element),new De(this.element.getGridDOMElement(),this.element),new Re(this.element.getGridDOMElement(),this.element),new Ie(this.element.getGridDOMElement(),this.element),new Ot(this.element.getGridDOMElement(),this.element,{clickButton:0,exitAnyButton:!0,moveEverywhere:!0}),new je(this.element.getGridDOMElement(),this.element,{clickButton:2,exitAnyButton:!1,moveEverywhere:!0}),new _t(this.element.getGridDOMElement(),this.element),new Ve(this.element.getGridDOMElement(),this.element),new Be(this.element.getGridDOMElement(),this.element)]}render(){return O`
${0==this.element.zoom?"1:1":this.element.zoom}
`}firstUpdated(e){super.firstUpdated(e),this.element.headerElement=this.element.querySelector(".ueb-viewport-header"),this.element.overlayElement=this.element.querySelector(".ueb-viewport-overlay"),this.element.viewportElement=this.element.querySelector(".ueb-viewport-body"),this.element.selectorElement=new Ht,this.element.querySelector(".ueb-grid-content")?.append(this.element.selectorElement),this.element.gridElement=this.element.viewportElement.querySelector(".ueb-grid"),this.element.linksContainerElement=this.element.querySelector("[data-links]"),this.element.linksContainerElement.append(...this.element.getLinks()),this.element.nodesContainerElement=this.element.querySelector("[data-nodes]"),this.element.nodesContainerElement.append(...this.element.getNodes()),this.element.viewportElement.scroll(J.expandGridSize,J.expandGridSize)}updated(e){if(super.updated(e),(e.has("scrollX")||e.has("scrollY"))&&this.element.viewportElement.scroll(this.element.scrollX,this.element.scrollY),e.has("zoom")){const t=e.get("zoom"),i=Math.min(t,this.element.zoom),n=Math.max(t,this.element.zoom),s=ne.range(i,n),r=e=>`ueb-zoom-${e}`;te<0)).map(r)),this.element.classList.add(...s.filter((e=>e>0)).map(r))):(this.element.classList.remove(...s.filter((e=>e>0)).map(r)),this.element.classList.add(...s.filter((e=>e<0)).map(r)))}}getPin(e){return this.element.querySelector(`ueb-node[data-name="${e.objectName}"] ueb-pin[data-id="${e.pinGuid}"]`)}}class Bt extends Ge{static properties={selecting:{type:Boolean,attribute:"data-selecting",reflect:!0,converter:ne.booleanConverter},scrolling:{type:Boolean,attribute:"data-scrolling",reflect:!0,converter:ne.booleanConverter},focused:{type:Boolean,attribute:"data-focused",reflect:!0,converter:ne.booleanConverter},zoom:{type:Number,attribute:"data-zoom",reflect:!0},scrollX:{type:Number,attribute:!1},scrollY:{type:Number,attribute:!1},additionalX:{type:Number,attribute:!1},additionalY:{type:Number,attribute:!1},translateX:{type:Number,attribute:!1},translateY:{type:Number,attribute:!1}};static styles=It.styles;#Pe=new Map;nodes=[];links=[];mousePosition=[0,0];gridElement;viewportElement;overlayElement;selectorElement;linksContainerElement;nodesContainerElement;headerElement;focused=!1;nodeBoundariesSupplier=e=>{let t=e.getBoundingClientRect(),i=this.nodesContainerElement.getBoundingClientRect();const n=1/this.getScale();return{primaryInf:(t.left-i.left)*n,primarySup:(t.right-i.right)*n,secondaryInf:(t.top-i.top)*n,secondarySup:(t.bottom-i.bottom)*n}};nodeSelectToggleFunction=(e,t)=>{e.setSelected(t)};constructor(e=new J){super({},new It),this.selecting=!1,this.scrolling=!1,this.focused=!1,this.zoom=0,this.scrollX=J.expandGridSize,this.scrollY=J.expandGridSize,this.translateX=J.expandGridSize,this.translateY=J.expandGridSize}getGridDOMElement(){return this.gridElement}disconnectedCallback(){super.disconnectedCallback()}getScroll(){return[this.scrollX,this.scrollY]}setScroll([e,t],i=!1){this.scrollX=e,this.scrollY=t}scrollDelta(e,t=!1){const i=[2*J.expandGridSize,2*J.expandGridSize];let n=this.getScroll(),s=[n[0]+e[0],n[1]+e[1]],r=[0,0];for(let t=0;t<2;++t)e[t]<0&&s[t]0&&s[t]>i[t]-J.gridExpandThreshold*J.expandGridSize&&(r[t]=1);0==r[0]&&0==r[1]||this.seamlessExpand(r),n=this.getScroll(),s=[n[0]+e[0],n[1]+e[1]],this.setScroll(s,t)}scrollCenter(){const e=this.getScroll(),t=[this.translateX-e[0],this.translateY-e[1]],i=this.getViewportSize().map((e=>e/2)),n=[t[0]-i[0],t[1]-i[1]];this.scrollDelta(n,!0)}getViewportSize(){return[this.viewportElement.clientWidth,this.viewportElement.clientHeight]}getScrollMax(){return[this.viewportElement.scrollWidth-this.viewportElement.clientWidth,this.viewportElement.scrollHeight-this.viewportElement.clientHeight]}snapToGrid(e){return ne.snapToGrid(e,J.gridSize)}seamlessExpand([e,t]){e=Math.round(e),t=Math.round(t);let i=this.getScale();[e,t]=[-e*J.expandGridSize,-t*J.expandGridSize],0!=e&&(this.scrollX+=e,e/=i),0!=t&&(this.scrollY+=t,t/=i),this.translateX+=e,this.translateY+=t}progressiveSnapToGrid(e){return J.expandGridSize*Math.round(e/J.expandGridSize+.5*Math.sign(e))}getZoom(){return this.zoom}setZoom(e,t){if((e=ne.clamp(e,J.minZoom,J.maxZoom))==this.zoom)return;let i=this.getScale();this.zoom=e,t&&requestAnimationFrame((e=>{t[0]+=this.translateX,t[1]+=this.translateY;let n=this.getScale()/i,s=[n*t[0],n*t[1]];this.scrollDelta([(s[0]-t[0])*i,(s[1]-t[1])*i])}))}getScale(){return parseFloat(getComputedStyle(this.gridElement).getPropertyValue("--ueb-scale"))}compensateTranslation([e,t]){return[e-=this.translateX,t-=this.translateY]}getNodes(e=!1){return e?this.nodes.filter((e=>e.selected)):this.nodes}getPin(e){let t=this.template.getPin(e);return t&&t.nodeElement.getNodeName()==e.objectName.toString()?t:[...this.nodes.find((t=>e.objectName.toString()==t.getNodeName()))?.getPinElements()??[]].find((t=>e.pinGuid.toString()==t.GetPinIdValue()))}getLinks([e,t]=[]){if(null==e!=t==null){const i=e??t;return this.links.filter((e=>e.sourcePin==i||e.destinationPin==i))}return null!=e&&null!=t?this.links.filter((i=>i.sourcePin==e&&i.destinationPin==t||i.sourcePin==t&&i.destinationPin==e)):this.links}getLink(e,t,i=!1){return this.links.find((n=>n.sourcePin==e&&n.destinationPin==t||i&&n.sourcePin==t&&n.destinationPin==e))}selectAll(){this.getNodes().forEach((e=>this.nodeSelectToggleFunction(e,!0)))}unselectAll(){this.getNodes().forEach((e=>this.nodeSelectToggleFunction(e,!1)))}addGraphElement(...e){for(let t of e)if(t.blueprint=this,t instanceof $t&&!this.nodes.includes(t)){const e=t.entity.getObjectName(),i=this.nodes.find((t=>t.entity.getObjectName()==e));if(i){let e=i.entity.getObjectName(!0);this.#Pe[e]=this.#Pe[e]??-1;do{++this.#Pe[e]}while(this.nodes.find((t=>t.entity.getObjectName()==J.nodeName(e,this.#Pe[e]))));i.rename(J.nodeName(e,this.#Pe[e]))}this.nodes.push(t),this.nodesContainerElement?.appendChild(t)}else t instanceof tt&&!this.links.includes(t)&&(this.links.push(t),this.linksContainerElement&&!this.linksContainerElement.contains(t)&&this.linksContainerElement.appendChild(t));e.filter((e=>e instanceof $t)).forEach((t=>t.sanitizeLinks(e)))}removeGraphElement(...e){for(let t of e)if(t.closest("ueb-blueprint")==this){t.remove();let e=t instanceof $t?this.nodes:t instanceof tt?this.links:null;e?.splice(e.findIndex((e=>e===t)),1)}}setFocused(e=!0){if(this.focused==e)return;let t=new CustomEvent(e?"blueprint-focus":"blueprint-unfocus");this.focused=e,this.focused||this.unselectAll(),this.dispatchEvent(t)}dispatchEditTextEvent(e){const t=new CustomEvent(e?J.editTextEventName.begin:J.editTextEventName.end);this.dispatchEvent(t)}}customElements.define("ueb-blueprint",Bt);class Rt extends Te{#Ce=()=>{this.element.blueprint.dispatchEditTextEvent(!0),this.element.selectOnFocus&&getSelection().selectAllChildren(this.element)};#xe=()=>{this.element.blueprint.dispatchEditTextEvent(!1),document.getSelection()?.removeAllRanges()};#Ae=e=>e.target.querySelectorAll("br").forEach((e=>e.remove()));#Ne=e=>{"Enter"!=e.code||e.shiftKey||e.target.blur()};constructed(e){super.constructed(e),this.element.classList.add("ueb-pin-input-content"),this.element.setAttribute("role","textbox"),this.element.contentEditable="true"}connectedCallback(){this.element.addEventListener("focus",this.#Ce),this.element.addEventListener("focusout",this.#xe),this.element.singleLine&&this.element.addEventListener("input",this.#Ae),this.element.blurOnEnter&&this.element.addEventListener("keydown",this.#Ne)}cleanup(){this.element.removeEventListener("focus",this.#Ce),this.element.removeEventListener("focusout",this.#xe),this.element.singleLine&&this.element.removeEventListener("input",this.#Ae),this.element.blurOnEnter&&this.element.removeEventListener("keydown",this.#Ne)}}class Gt extends Ge{static properties={...super.properties,singleLine:{type:Boolean,attribute:"data-single-line",converter:ne.booleanConverter,reflect:!0},selectOnFocus:{type:Boolean,attribute:"data-select-focus",converter:ne.booleanConverter,reflect:!0},blurOnEnter:{type:Boolean,attribute:"data-blur-enter",converter:ne.booleanConverter,reflect:!0}};constructor(){super({},new Rt),this.singleLine=!1,this.selectOnFocus=!0,this.blurOnEnter=!0}}class Ft extends $e{constructor(e,t,i,n,s,r,o){e=e??(e=>`(${e})`),super(t,i,n,s,r,o),this.wrap=e}read(e){const t=Ne.getGrammarForType($e.grammar,this.entityType).parse(e);if(!t.status)throw new Error(`Error when trying to parse the entity ${this.entityType.prototype.constructor.name}.`);return t.value}write(e,t,i=!1){return this.wrap(this.subWrite(e,[],t,i))}}class zt extends Ft{#$e;constructor(e,t){super(void 0,t),this.#$e=e}write(e,t,i=!1){return this.#$e(t,i)}}class jt extends Ft{constructor(e){super(void 0,e)}write(e,t,i){return i||t.constructor!==String?ne.escapeString(t.toString()):`"${ne.escapeString(t.toString())}"`}}!function(){const e=e=>`(${e})`;te.registerSerializer(null,new zt(((e,t)=>"()"),null)),te.registerSerializer(Array,new zt(((e,t)=>`(${e.map((e=>te.getSerializer(ne.getType(e)).serialize(e,t)+",")).join("")})`),Array)),te.registerSerializer(Boolean,new zt(((e,t)=>e?t?"true":"True":t?"false":"False"),Boolean)),te.registerSerializer(oe,new Ft(e,oe)),te.registerSerializer(ae,new jt(ae)),te.registerSerializer(le,new jt(le)),te.registerSerializer(ue,new jt(ue)),te.registerSerializer(ce,new Ft((e=>`${ce.lookbehind}(${e})`),ce,"",", ",!1,"",(e=>""))),te.registerSerializer(he,new Ft(e,he)),te.registerSerializer(pe,new Ft(e,pe)),te.registerSerializer(me,new Ft((e=>`${me.lookbehind}(${e})`),me,"",", ",!1,"",(e=>""))),te.registerSerializer(Number,new zt((e=>e.toString()),Number)),te.registerSerializer(ke,new Le),te.registerSerializer(re,new zt((e=>(e.type??"")+(e.path?e.type?`'"${e.path}"'`:`"${e.path}"`:"")),re)),te.registerSerializer(ge,new jt(ge)),te.registerSerializer(we,new Ft((e=>`${we.lookbehind} (${e})`),we,"",",",!0)),te.registerSerializer(ve,new Ft((e=>e),ve,""," ",!1,"",(e=>""))),te.registerSerializer(de,new jt(de)),te.registerSerializer(be,new Ft(e,be)),te.registerSerializer(String,new zt(((e,t)=>t?ne.escapeString(e):`"${ne.escapeString(e)}"`),String)),te.registerSerializer(fe,new zt(((e,t)=>`${e.P}, ${e.Y}, ${e.R}`),fe)),te.registerSerializer(Ee,new zt(((e,t)=>`${e.X}, ${e.Y}, ${e.Z}`),Ee)),te.registerSerializer(ye,new Ft(e,ye))}(),customElements.define("ueb-color-handler",mt),customElements.define("ueb-input",Gt),customElements.define("ueb-link",tt),customElements.define("ueb-node",$t),customElements.define("ueb-pin",At),customElements.define("ueb-selector",Ht),customElements.define("ueb-ui-slider",vt),customElements.define("ueb-window",yt);export{Bt as Blueprint,J as Configuration,tt as LinkElement,$t as NodeElement}; diff --git a/js/element/PinElement.js b/js/element/PinElement.js index 99df88e..a9d5dfb 100644 --- a/js/element/PinElement.js +++ b/js/element/PinElement.js @@ -103,8 +103,6 @@ export default class PinElement extends IElement { /** @type {NodeElement} */ nodeElement - /** @type {HTMLElement} */ - clickableElement connections = 0 @@ -166,10 +164,6 @@ export default class PinElement extends IElement { return this.entity.isOutput() } - getClickableElement() { - return this.clickableElement - } - getLinkLocation() { return this.template.getLinkLocation() } diff --git a/js/entity/IEntity.js b/js/entity/IEntity.js index 8bf9634..76dd2c2 100644 --- a/js/entity/IEntity.js +++ b/js/entity/IEntity.js @@ -21,11 +21,9 @@ export default class IEntity extends Observable { * @param {Object} values * @param {String} prefix */ - const defineAllAttributes = (target, attributes, values, prefix = "") => { - for (let attribute of Utility.mergeArrays( - Object.getOwnPropertyNames(attributes), - Object.getOwnPropertyNames(values ?? {}) - )) { + const defineAllAttributes = (target, attributes, values = {}, prefix = "") => { + const valuesPropertyNames = Object.getOwnPropertyNames(values) + for (let attribute of Utility.mergeArrays(Object.getOwnPropertyNames(attributes), valuesPropertyNames)) { let value = Utility.objectGet(values, [attribute]) let defaultValue = attributes[attribute] let defaultType = Utility.getType(defaultValue) @@ -39,7 +37,8 @@ export default class IEntity extends Observable { `Attribute ${prefix}${attribute} in the serialized data is not defined in ${this.constructor.name}.attributes` ) } else if ( - !(attribute in values) + valuesPropertyNames.length > 0 + && !(attribute in values) && defaultValue !== undefined && !(defaultValue instanceof TypeInitialization && (!defaultValue.showDefault || defaultValue.ignored)) ) { diff --git a/js/input/mouse/IMouseClick.js b/js/input/mouse/IMouseClick.js index fd1933d..5e23371 100644 --- a/js/input/mouse/IMouseClick.js +++ b/js/input/mouse/IMouseClick.js @@ -8,11 +8,45 @@ import IPointing from "./IPointing" */ export default class IMouseClick extends IPointing { - /** @type {(e: MouseEvent) => void} */ - #mouseDownHandler + #mouseDownHandler = + /** @param {MouseEvent} e */ + e => { + this.blueprint.setFocused(true) + switch (e.button) { + case this.options.clickButton: + // Either doesn't matter or consider the click only when clicking on the target, not descandants + if (!this.options.strictTarget || e.target == e.currentTarget) { + if (this.options.consumeEvent) { + e.stopImmediatePropagation() // Captured, don't call anyone else + } + // Attach the listeners + document.addEventListener("mouseup", this.#mouseUpHandler) + this.clickedPosition = this.locationFromEvent(e) + this.clicked(this.clickedPosition) + } + break + default: + if (!this.options.exitAnyButton) { + this.#mouseUpHandler(e) + } + break + } + } - /** @type {(e: MouseEvent) => void} */ - #mouseUpHandler + #mouseUpHandler = + /** @param {MouseEvent} e */ + e => { + if (!this.options.exitAnyButton || e.button == this.options.clickButton) { + if (this.options.consumeEvent) { + e.stopImmediatePropagation() // Captured, don't call anyone else + } + // Remove the handlers of "mousemove" and "mouseup" + document.removeEventListener("mouseup", this.#mouseUpHandler) + this.unclicked() + } + } + + clickedPosition = [0, 0] constructor(target, blueprint, options = {}) { options.clickButton ??= 0 @@ -20,43 +54,6 @@ export default class IMouseClick extends IPointing { options.exitAnyButton ??= true options.strictTarget ??= false super(target, blueprint, options) - this.clickedPosition = [0, 0] - let self = this - - this.#mouseDownHandler = e => { - self.blueprint.setFocused(true) - switch (e.button) { - case self.options.clickButton: - // Either doesn't matter or consider the click only when clicking on the target, not descandants - if (!self.options.strictTarget || e.target == e.currentTarget) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation() // Captured, don't call anyone else - } - // Attach the listeners - document.addEventListener("mouseup", self.#mouseUpHandler) - self.clickedPosition = self.locationFromEvent(e) - self.clicked(self.clickedPosition) - } - break - default: - if (!self.options.exitAnyButton) { - self.#mouseUpHandler(e) - } - break - } - } - - this.#mouseUpHandler = e => { - if (!self.options.exitAnyButton || e.button == self.options.clickButton) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation() // Captured, don't call anyone else - } - // Remove the handlers of "mousemove" and "mouseup" - document.removeEventListener("mouseup", self.#mouseUpHandler) - self.unclicked() - } - } - this.listenEvents() } diff --git a/js/input/mouse/IMouseClickDrag.js b/js/input/mouse/IMouseClickDrag.js index ff26aa6..5595be1 100644 --- a/js/input/mouse/IMouseClickDrag.js +++ b/js/input/mouse/IMouseClickDrag.js @@ -1,39 +1,117 @@ import Configuration from "../../Configuration" +import IDraggableElement from "../../element/IDraggableElement" import IPointing from "./IPointing" import Utility from "../../Utility" /** * @typedef {import("../../Blueprint").default} Blueprint - * @typedef {import("../../element/IDraggableElement").default} IDraggableElement + * @typedef {import("../../element/IElement").default} IElement */ /** - * @template {IDraggableElement} T + * @template {IElement} T * @extends {IPointing} */ export default class IMouseClickDrag extends IPointing { - /** @type {(e: MouseEvent) => void} */ - #mouseDownHandler + #mouseDownHandler = + /** @param {MouseEvent} e */ + e => { + this.blueprint.setFocused(true) + switch (e.button) { + case this.options.clickButton: + // Either doesn't matter or consider the click only when clicking on the parent, not descandants + if (!this.options.strictTarget || e.target == e.currentTarget) { + if (this.options.consumeEvent) { + e.stopImmediatePropagation() // Captured, don't call anyone else + } + // Attach the listeners + this.#movementListenedElement.addEventListener("mousemove", this.#mouseStartedMovingHandler) + document.addEventListener("mouseup", this.#mouseUpHandler) + this.clickedPosition = this.locationFromEvent(e) + if (this.target instanceof IDraggableElement) { + this.clickedOffset = [ + this.clickedPosition[0] - this.target.locationX, + this.clickedPosition[1] - this.target.locationY, + ] + } + this.clicked(this.clickedPosition) + } + break + default: + if (!this.options.exitAnyButton) { + this.#mouseUpHandler(e) + } + break + } + } - /** @type {(e: MouseEvent) => void} */ - #mouseStartedMovingHandler + #mouseStartedMovingHandler = + /** @param {MouseEvent} e */ + e => { + if (this.options.consumeEvent) { + e.stopImmediatePropagation() // Captured, don't call anyone else + } + // Delegate from now on to this.#mouseMoveHandler + this.#movementListenedElement.removeEventListener("mousemove", this.#mouseStartedMovingHandler) + this.#movementListenedElement.addEventListener("mousemove", this.#mouseMoveHandler) + // Handler calls e.preventDefault() when it receives the event, this means dispatchEvent returns false + const dragEvent = this.getEvent(Configuration.trackingMouseEventName.begin) + this.#trackingMouse = this.target.dispatchEvent(dragEvent) == false + const location = this.locationFromEvent(e) + // Do actual actions + this.mouseLocation = Utility.snapToGrid(this.clickedPosition, this.stepSize) + this.startDrag(location) + this.started = true + } - /** @type {(e: MouseEvent) => void} */ - #mouseMoveHandler + #mouseMoveHandler = + /** @param {MouseEvent} e */ + e => { + if (this.options.consumeEvent) { + e.stopImmediatePropagation() // Captured, don't call anyone else + } + const location = this.locationFromEvent(e) + const movement = [e.movementX, e.movementY] + this.dragTo(location, movement) + if (this.#trackingMouse) { + this.blueprint.mousePosition = this.locationFromEvent(e) + } + } - /** @type {(e: MouseEvent) => void} */ - #mouseUpHandler + #mouseUpHandler = + /** @param {MouseEvent} e */ + e => { + if (!this.options.exitAnyButton || e.button == this.options.clickButton) { + if (this.options.consumeEvent) { + e.stopImmediatePropagation() // Captured, don't call anyone else + } + // Remove the handlers of "mousemove" and "mouseup" + this.#movementListenedElement.removeEventListener("mousemove", this.#mouseStartedMovingHandler) + this.#movementListenedElement.removeEventListener("mousemove", this.#mouseMoveHandler) + document.removeEventListener("mouseup", this.#mouseUpHandler) + if (this.started) { + this.endDrag() + } + this.unclicked() + if (this.#trackingMouse) { + const dragEvent = this.getEvent(Configuration.trackingMouseEventName.end) + this.target.dispatchEvent(dragEvent) + this.#trackingMouse = false + } + this.started = false + } + } #trackingMouse = false #movementListenedElement #draggableElement + clickedOffset = [0, 0] + clickedPosition = [0, 0] + mouseLocation = [0, 0] started = false stepSize = 1 - clickedPosition = [0, 0] - clickedOffset = [0, 0] - mouseLocation = [0, 0] /** * @@ -52,89 +130,8 @@ export default class IMouseClickDrag extends IPointing { options.strictTarget ??= false super(target, blueprint, options) this.stepSize = parseInt(options?.stepSize ?? Configuration.gridSize) - this.#movementListenedElement = this.options.moveEverywhere ? document.documentElement : this.movementSpace this.#draggableElement = this.options.draggableElement - let self = this - - this.#mouseDownHandler = e => { - self.blueprint.setFocused(true) - switch (e.button) { - case self.options.clickButton: - // Either doesn't matter or consider the click only when clicking on the parent, not descandants - if (!self.options.strictTarget || e.target == e.currentTarget) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation() // Captured, don't call anyone else - } - // Attach the listeners - self.#movementListenedElement.addEventListener("mousemove", self.#mouseStartedMovingHandler) - document.addEventListener("mouseup", self.#mouseUpHandler) - self.clickedPosition = self.locationFromEvent(e) - self.clickedOffset = [ - self.clickedPosition[0] - self.target.locationX, - self.clickedPosition[1] - self.target.locationY, - ] - self.clicked(self.clickedPosition) - } - break - default: - if (!self.options.exitAnyButton) { - self.#mouseUpHandler(e) - } - break - } - } - - this.#mouseStartedMovingHandler = e => { - if (self.options.consumeEvent) { - e.stopImmediatePropagation() // Captured, don't call anyone else - } - // Delegate from now on to self.#mouseMoveHandler - self.#movementListenedElement.removeEventListener("mousemove", self.#mouseStartedMovingHandler) - self.#movementListenedElement.addEventListener("mousemove", self.#mouseMoveHandler) - // Handler calls e.preventDefault() when it receives the event, this means dispatchEvent returns false - const dragEvent = self.getEvent(Configuration.trackingMouseEventName.begin) - self.#trackingMouse = self.target.dispatchEvent(dragEvent) == false - const location = self.locationFromEvent(e) - // Do actual actions - this.mouseLocation = Utility.snapToGrid(this.clickedPosition, this.stepSize) - self.startDrag(location) - self.started = true - } - - this.#mouseMoveHandler = e => { - if (self.options.consumeEvent) { - e.stopImmediatePropagation() // Captured, don't call anyone else - } - const location = self.locationFromEvent(e) - const movement = [e.movementX, e.movementY] - self.dragTo(location, movement) - if (self.#trackingMouse) { - self.blueprint.mousePosition = self.locationFromEvent(e) - } - } - - this.#mouseUpHandler = e => { - if (!self.options.exitAnyButton || e.button == self.options.clickButton) { - if (self.options.consumeEvent) { - e.stopImmediatePropagation() // Captured, don't call anyone else - } - // Remove the handlers of "mousemove" and "mouseup" - self.#movementListenedElement.removeEventListener("mousemove", self.#mouseStartedMovingHandler) - self.#movementListenedElement.removeEventListener("mousemove", self.#mouseMoveHandler) - document.removeEventListener("mouseup", self.#mouseUpHandler) - if (self.started) { - self.endDrag() - } - self.unclicked() - if (self.#trackingMouse) { - const dragEvent = self.getEvent(Configuration.trackingMouseEventName.end) - self.target.dispatchEvent(dragEvent) - self.#trackingMouse = false - } - self.started = false - } - } this.listenEvents() } diff --git a/js/input/mouse/IMouseWheel.js b/js/input/mouse/IMouseWheel.js index 7a30e85..c112168 100644 --- a/js/input/mouse/IMouseWheel.js +++ b/js/input/mouse/IMouseWheel.js @@ -3,11 +3,17 @@ import IPointing from "./IPointing" export default class IMouseWheel extends IPointing { - /** @type {(e: WheelEvent) => void} */ - #mouseWheelHandler + #mouseWheelHandler = + /** @param {WheelEvent} e */ + e => { + e.preventDefault() + const location = this.locationFromEvent(e) + this.wheel(Math.sign(e.deltaY * Configuration.mouseWheelFactor), location) + } - /** @type {(e: WheelEvent) => void} */ - #mouseParentWheelHandler + #mouseParentWheelHandler = + /** @param {WheelEvent} e */ + e => e.preventDefault() /** * @param {HTMLElement} target @@ -19,18 +25,6 @@ export default class IMouseWheel extends IPointing { options.strictTarget ??= false super(target, blueprint, options) this.strictTarget = options.strictTarget - - const self = this - this.#mouseWheelHandler = e => { - e.preventDefault() - const location = self.locationFromEvent(e) - self.wheel(Math.sign(e.deltaY * Configuration.mouseWheelFactor), location) - } - this.#mouseParentWheelHandler = e => e.preventDefault() - - if (this.blueprint.focused) { - this.movementSpace.addEventListener("wheel", this.#mouseWheelHandler, false) - } } listenEvents() { diff --git a/js/input/mouse/MouseClickAction.js b/js/input/mouse/MouseClickAction.js deleted file mode 100644 index 27abbda..0000000 --- a/js/input/mouse/MouseClickAction.js +++ /dev/null @@ -1,28 +0,0 @@ -import IMouseClick from "./IMouseClick" - -export default class MouseClickAction extends IMouseClick { - - static #ignoreEvent = - /** @param {MouseClickAction} self */ - self => { } - - constructor( - target, - blueprint, - options, - onMouseDown = MouseClickAction.#ignoreEvent, - onMouseUp = MouseClickAction.#ignoreEvent - ) { - super(target, blueprint, options) - this.onMouseDown = onMouseDown - this.onMouseUp = onMouseUp - } - - clicked() { - this.onMouseDown(this) - } - - unclicked() { - this.onMouseUp(this) - } -} \ No newline at end of file diff --git a/js/input/mouse/MouseCreateLink.js b/js/input/mouse/MouseCreateLink.js index 69b981d..b44d62d 100755 --- a/js/input/mouse/MouseCreateLink.js +++ b/js/input/mouse/MouseCreateLink.js @@ -9,11 +9,39 @@ export default class MouseCreateLink extends IMouseClickDrag { /** @type {NodeListOf} */ #listenedPins - /** @type {(e: MouseEvent) => void} */ - #mouseenterHandler + #mouseenterHandler = + /** @param {MouseEvent} e */ + e => { + if (!this.enteredPin) { + this.linkValid = false + this.enteredPin = /** @type {PinElement} */ (e.target) + const a = this.enteredPin + const b = this.target + if (a.getNodeElement() == b.getNodeElement()) { + this.link.setMessageSameNode() + } else if (a.isOutput() == b.isOutput()) { + this.link.setMessageDirectionsIncompatible() + } else if (a.isOutput() == b.isOutput()) { + this.link.setMessageDirectionsIncompatible() + } else if (this.blueprint.getLinks([a, b]).length) { + this.link.setMessageReplaceLink() + this.linkValid = true + } else { + this.link.setMessageCorrect() + this.linkValid = true + } + } + } - /** @type {(e: MouseEvent) => void} */ - #mouseleaveHandler + #mouseleaveHandler = + /** @param {MouseEvent} e */ + e => { + if (this.enteredPin == e.target) { + this.enteredPin = null + this.linkValid = false + this.link?.setMessagePlaceNode() + } + } /** @type {LinkElement?} */ link @@ -23,39 +51,6 @@ export default class MouseCreateLink extends IMouseClickDrag { linkValid = false - constructor(target, blueprint, options) { - super(target, blueprint, options) - let self = this - this.#mouseenterHandler = e => { - if (!self.enteredPin) { - self.linkValid = false - self.enteredPin = /** @type {PinElement} */ (e.target) - const a = self.enteredPin - const b = self.target - if (a.getNodeElement() == b.getNodeElement()) { - self.link.setMessageSameNode() - } else if (a.isOutput() == b.isOutput()) { - self.link.setMessageDirectionsIncompatible() - } else if (a.isOutput() == b.isOutput()) { - self.link.setMessageDirectionsIncompatible() - } else if (self.blueprint.getLinks([a, b]).length) { - self.link.setMessageReplaceLink() - self.linkValid = true - } else { - self.link.setMessageCorrect() - self.linkValid = true - } - } - } - this.#mouseleaveHandler = e => { - if (self.enteredPin == e.target) { - self.enteredPin = null - self.linkValid = false - self.link?.setMessagePlaceNode() - } - } - } - startDrag(location) { this.link = new LinkElement(this.target, null) this.blueprint.linksContainerElement.prepend(this.link) @@ -63,8 +58,9 @@ export default class MouseCreateLink extends IMouseClickDrag { this.#listenedPins = this.blueprint.querySelectorAll("ueb-pin") this.#listenedPins.forEach(pin => { if (pin != this.target) { - pin.getClickableElement().addEventListener("mouseenter", this.#mouseenterHandler) - pin.getClickableElement().addEventListener("mouseleave", this.#mouseleaveHandler) + const clickableElement = pin.template.getClickableElement() + clickableElement.addEventListener("mouseenter", this.#mouseenterHandler) + clickableElement.addEventListener("mouseleave", this.#mouseleaveHandler) } }) this.link.startDragging() diff --git a/js/template/BoolPinTemplate.js b/js/template/BoolPinTemplate.js index 8ea808f..f1a4141 100644 --- a/js/template/BoolPinTemplate.js +++ b/js/template/BoolPinTemplate.js @@ -10,18 +10,18 @@ export default class BoolPinTemplate extends PinTemplate { /** @type {HTMLInputElement} */ #input + #onChangeHandler = _ => this.element.setDefaultValue(this.#input.checked) + /** @param {Map} changedProperties */ firstUpdated(changedProperties) { super.firstUpdated(changedProperties) this.#input = this.element.querySelector(".ueb-pin-input") - let self = this - this.onChangeHandler = _ => this.element.setDefaultValue(self.#input.checked) - this.#input.addEventListener("change", this.onChangeHandler) + this.#input.addEventListener("change", this.#onChangeHandler) } cleanup() { super.cleanup() - this.#input.removeEventListener("change", this.onChangeHandler) + this.#input.removeEventListener("change", this.#onChangeHandler) } createInputObjects() { diff --git a/js/template/LinearColorPinTemplate.js b/js/template/LinearColorPinTemplate.js index b5a0499..9f188e7 100644 --- a/js/template/LinearColorPinTemplate.js +++ b/js/template/LinearColorPinTemplate.js @@ -2,7 +2,6 @@ import { html } from "lit" import ColorPickerWindowTemplate from "./ColorPickerWindowTemplate" import Configuration from "../Configuration" import IInputPinTemplate from "./IInputPinTemplate" -import MouseClickAction from "../input/mouse/MouseClickAction" import WindowElement from "../element/WindowElement" /** @@ -19,44 +18,40 @@ export default class LinearColorPinTemplate extends IInputPinTemplate { /** @type {WindowElement} */ #window + #launchColorPickerWindow = + /** @param {MouseEvent} e */ + e => { + //e.preventDefault() + this.#window = new WindowElement({ + type: ColorPickerWindowTemplate, + windowOptions: { + // The created window will use the following functions to get and set the color + getPinColor: () => this.element.defaultValue, + /** @param {LinearColorEntity} color */ + setPinColor: color => this.element.setDefaultValue(color), + }, + }) + this.element.blueprint.append(this.#window) + const windowApplyHandler = () => { + this.element.setDefaultValue( + /** @type {ColorPickerWindowTemplate} */(this.#window.template).color + ) + } + const windowCloseHandler = () => { + this.#window.removeEventListener(Configuration.windowApplyEventName, windowApplyHandler) + this.#window.removeEventListener(Configuration.windowCloseEventName, windowCloseHandler) + this.#window = null + } + this.#window.addEventListener(Configuration.windowApplyEventName, windowApplyHandler) + this.#window.addEventListener(Configuration.windowCloseEventName, windowCloseHandler) + } + /** @param {Map} changedProperties */ firstUpdated(changedProperties) { super.firstUpdated(changedProperties) this.#input = this.element.querySelector(".ueb-pin-input") } - createInputObjects() { - return [ - ...super.createInputObjects(), - new MouseClickAction(this.#input, this.element.blueprint, undefined, - inputInstance => { - this.#window = new WindowElement({ - type: ColorPickerWindowTemplate, - windowOptions: { - // The created window will use the following functions to get and set the color - getPinColor: () => this.element.defaultValue, - /** @param {LinearColorEntity} color */ - setPinColor: color => this.element.setDefaultValue(color), - }, - }) - this.element.blueprint.append(this.#window) - const windowApplyHandler = () => { - this.element.setDefaultValue( - /** @type {ColorPickerWindowTemplate} */(this.#window.template).color - ) - } - const windowCloseHandler = () => { - this.#window.removeEventListener(Configuration.windowApplyEventName, windowApplyHandler) - this.#window.removeEventListener(Configuration.windowCloseEventName, windowCloseHandler) - this.#window = null - } - this.#window.addEventListener(Configuration.windowApplyEventName, windowApplyHandler) - this.#window.addEventListener(Configuration.windowCloseEventName, windowCloseHandler) - }, - ), - ] - } - getInputs() { return [this.#input.dataset.linearColor] } @@ -69,6 +64,7 @@ export default class LinearColorPinTemplate extends IInputPinTemplate { if (this.element.isInput() && !this.element.isLinked) { return html` ` diff --git a/js/template/NodeTemplate.js b/js/template/NodeTemplate.js index fa8dbb3..2e800af 100755 --- a/js/template/NodeTemplate.js +++ b/js/template/NodeTemplate.js @@ -7,7 +7,10 @@ import PinElement from "../element/PinElement" /** @extends {ISelectableDraggableTemplate} */ export default class NodeTemplate extends ISelectableDraggableTemplate { - toggleAdvancedDisplayHandler + toggleAdvancedDisplayHandler = _ => { + this.element.toggleShowAdvancedPinDisplay() + this.element.addNextUpdatedCallbacks(() => this.element.dispatchReflowEvent(), true) + } render() { return html` @@ -50,7 +53,7 @@ export default class NodeTemplate extends ISelectableDraggableTemplate { } /** @param {Map} changedProperties */ - async firstUpdated(changedProperties) { + firstUpdated(changedProperties) { super.firstUpdated(changedProperties) const inputContainer = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-inputs")) const outputContainer = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-outputs")) @@ -62,10 +65,6 @@ export default class NodeTemplate extends ISelectableDraggableTemplate { outputContainer.appendChild(p) } }) - this.toggleAdvancedDisplayHandler = _ => { - this.element.toggleShowAdvancedPinDisplay() - this.element.addNextUpdatedCallbacks(() => this.element.dispatchReflowEvent(), true) - } this.element.nodeNameElement = /** @type {HTMLElement} */(this.element.querySelector(".ueb-node-name-text")) } diff --git a/js/template/PinTemplate.js b/js/template/PinTemplate.js index fbdd891..7c695b8 100755 --- a/js/template/PinTemplate.js +++ b/js/template/PinTemplate.js @@ -18,6 +18,12 @@ import Utility from "../Utility" */ export default class PinTemplate extends ITemplate { + /** @param {PinElement} element */ + constructed(element) { + super.constructed(element) + this.element.dataset.id = this.element.GetPinIdValue() + } + connectedCallback() { super.connectedCallback() this.element.nodeElement = this.element.closest("ueb-node") @@ -26,7 +32,7 @@ export default class PinTemplate extends ITemplate { /** @returns {IInput[]} */ createInputObjects() { return [ - new MouseCreateLink(this.element.clickableElement, this.element.blueprint, { + new MouseCreateLink(this.getClickableElement(), this.element.blueprint, { moveEverywhere: true, }) ] @@ -66,13 +72,6 @@ export default class PinTemplate extends ITemplate { return nothing } - /** @param {Map} changedProperties */ - firstUpdated(changedProperties) { - super.firstUpdated(changedProperties) - this.element.dataset.id = this.element.GetPinIdValue() - this.element.clickableElement = this.element - } - getLinkLocation() { const rect = this.element.querySelector(".ueb-pin-icon").getBoundingClientRect() const location = Utility.convertLocation( @@ -81,4 +80,8 @@ export default class PinTemplate extends ITemplate { ) return this.element.blueprint.compensateTranslation(location) } + + getClickableElement() { + return this.element + } }