{"version":3,"file":"rpg-dialogue-main.min.js","mappings":"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","sources":["webpack://RPGDialogue/webpack/runtime/chunk loaded","webpack://RPGDialogue/./dist/cjs/DefaultDialogueRenderer.js","webpack://RPGDialogue/./dist/cjs/Editor.js","webpack://RPGDialogue/./dist/cjs/RPGDialogueLogic.js","webpack://RPGDialogue/./dist/cjs/RPGDialogueSequence.js","webpack://RPGDialogue/./dist/cjs/TouchHandler.js","webpack://RPGDialogue/./dist/cjs/detectDarkMode.js","webpack://RPGDialogue/./dist/cjs/detectMobileDevice.js","webpack://RPGDialogue/./dist/cjs/domHelpers.js","webpack://RPGDialogue/./dist/cjs/editorHelpers.js","webpack://RPGDialogue/./dist/cjs/editorRenderer.js","webpack://RPGDialogue/./dist/cjs/entry.js","webpack://RPGDialogue/./dist/cjs/gup.js","webpack://RPGDialogue/./dist/cjs/index.js","webpack://RPGDialogue/./dist/cjs/metaHelpers.js","webpack://RPGDialogue/./dist/cjs/modal.js","webpack://RPGDialogue/webpack/bootstrap","webpack://RPGDialogue/webpack/runtime/define property getters","webpack://RPGDialogue/webpack/runtime/global","webpack://RPGDialogue/webpack/runtime/hasOwnProperty shorthand","webpack://RPGDialogue/webpack/runtime/make namespace object","webpack://RPGDialogue/webpack/runtime/jsonp chunk loading","webpack://RPGDialogue/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DefaultDialogueRenderer = void 0;\nvar DefaultDialogueRenderer = /** @class */ (function () {\n    /**\n     * Creates a new default dialogue renderer for quickly integrating the dialogue logic into\n     * an existing HTML document with prepared two <div> elements for displaying\n     * the question and possible answers.\n     *\n     * @param {string|HTMLElement} questionNodeId - The output container (or ID) for questions.\n     * @param {string|HTMLElement} optionsNodeId - The output container (or ID) for answer options.\n     * @constructor\n     */\n    function DefaultDialogueRenderer(questionNodeId, optionsNodeId) {\n        // onConversationTerminated: (() => void) | null = null;\n        this.endOfConversationText = \"---END OF CONVERSATION---\";\n        // }, onConversationTerminated?: () => void) {\n        this.questionNode = this.getHTMLElement(questionNodeId);\n        this.optionsNode = this.getHTMLElement(optionsNodeId);\n        // this.onConversationTerminated = onConversationTerminated;\n        if (!this.questionNode) {\n            console.warn(\"[DefaultDialogueRenderer] Warning: the passed questionNode od element id does not exist.\");\n        }\n        if (!this.optionsNode) {\n            console.warn(\"[DefaultDialogueRenderer] Warning: the passed optionsNode od element id does not exist.\");\n        }\n    }\n    DefaultDialogueRenderer.prototype.getHTMLElement = function (nodeId) {\n        return typeof nodeId === \"string\" ? document.getElementById(nodeId) : nodeId;\n    };\n    //---BEGIN---IDialogueRenderer------------------------------\n    /**\n     * Indicate that the current conversation has ended.\n     * @returns\n     */\n    DefaultDialogueRenderer.prototype.renderConversationTerminated = function () {\n        this.setQuestionText(this.endOfConversationText, undefined);\n        // if (this.onConversationTerminated) {\n        //   this.onConversationTerminated();\n        // }\n    };\n    /**\n     * Set the text in the question node.\n     * @param {string} questionText - The question text to use.\n     * @param {string|null} npcName - The NPC name to use; if no name was defined this is `null`.\n     */\n    DefaultDialogueRenderer.prototype.setQuestionText = function (questionText, npcName) {\n        if (npcName) {\n            this.questionNode.innerHTML = \"<span class=\\\"rpg-npcname\\\">\".concat(npcName, \":</span> \").concat(questionText);\n        }\n        else {\n            this.questionNode.innerHTML = questionText;\n        }\n    };\n    /**\n     * Clear the options node. Just for upper level use here.\n     */\n    DefaultDialogueRenderer.prototype.clearAllOptions = function () {\n        this.optionsNode.innerHTML = \"\";\n    };\n    /**\n     * Add a new option node with the given answer text and option index. Use\n     * the option index to send the answer.\n     *\n     * @param {number} answerText - The answer text option.\n     * @param {number} optionIndex - The answer option index in the dialogue structure.\n     * @param {function} onOptionSelected - A callback you must trigger when the option is clicked.\n     */\n    DefaultDialogueRenderer.prototype.addAnswerOption = function (answerText, optionIndex, onOptionSelected) {\n        var answerNode = document.createElement(\"li\");\n        var answerLinkNode = document.createElement(\"a\");\n        answerLinkNode.innerHTML = answerText;\n        answerLinkNode.setAttribute(\"href\", \"#\");\n        answerLinkNode.addEventListener(\"click\", onOptionSelected);\n        answerNode.appendChild(answerLinkNode);\n        this.optionsNode.appendChild(answerNode);\n    };\n    return DefaultDialogueRenderer;\n}());\nexports.DefaultDialogueRenderer = DefaultDialogueRenderer;\n//# sourceMappingURL=DefaultDialogueRenderer.js.map","\"use strict\";\n/**\n * A script for demonstrating the line-point-distance.\n *\n * @require PlotBoilerplate, MouseHandler, gup, dat.gui\n *\n * @author   Ikaros Kappler\n * @date     2023-07-25\n * @version  1.0.0\n **/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Editor = void 0;\nvar gup_1 = require(\"./gup\");\nvar detectDarkMode_1 = require(\"./detectDarkMode\");\nvar plotboilerplate_1 = require(\"plotboilerplate\");\nvar RPGDialogueLogic_1 = require(\"./RPGDialogueLogic\");\nvar editorHelpers_1 = require(\"./editorHelpers\");\nvar editorRenderer_1 = require(\"./editorRenderer\");\nvar TouchHandler_1 = require(\"./TouchHandler\");\nvar FileDrop_1 = require(\"plotboilerplate/src/cjs/utils/io/FileDrop\");\nvar modal_1 = require(\"./modal\");\nvar detectMobileDevice_1 = require(\"./detectMobileDevice\");\nvar DefaultDialogueRenderer_1 = require(\"./DefaultDialogueRenderer\");\nvar Editor = /** @class */ (function () {\n    function Editor(dialogueConfigJSONPath, isRecoveryFromLocalStorageActive) {\n        var _this = this;\n        this.currentMouseHandler = null;\n        this.currentTouchHandler = null;\n        var _self = this;\n        console.log(\"Initializing plotboilerplate\");\n        // Fetch the GET params\n        var GUP = (0, gup_1.gup)();\n        var isDarkmode = (0, detectDarkMode_1.detectDarkMode)(GUP);\n        var isMobileDevice = (0, detectMobileDevice_1.detectMobileDevice)(GUP);\n        // All config params are optional.\n        this.pb = new plotboilerplate_1.PlotBoilerplate(plotboilerplate_1.PlotBoilerplate.utils.safeMergeByKeys({\n            canvas: document.getElementById(\"my-canvas\"),\n            fullSize: true,\n            fitToParent: true,\n            scaleX: 1.0,\n            scaleY: 1.0,\n            rasterGrid: true,\n            drawOrigin: false,\n            rasterAdjustFactor: 2.0,\n            redrawOnResize: true,\n            defaultCanvasWidth: 1024,\n            defaultCanvasHeight: 768,\n            canvasWidthFactor: 1.0,\n            canvasHeightFactor: 1.0,\n            cssScaleX: 1.0,\n            cssScaleY: 1.0,\n            cssUniformScale: true,\n            autoAdjustOffset: true,\n            offsetAdjustXPercent: 50,\n            offsetAdjustYPercent: 50,\n            backgroundColor: isDarkmode ? \"#000000\" : \"#ffffff\",\n            enableMouse: true,\n            enableKeys: true\n        }, GUP));\n        var boxSize = {\n            width: 120,\n            height: 20\n        };\n        this.editorHelpers = new editorHelpers_1.EditorHelper(this, this.pb, boxSize);\n        this.editorRenderer = new editorRenderer_1.EditorRenderer(this.pb, boxSize, this.editorHelpers, isDarkmode);\n        // +---------------------------------------------------------------------------------\n        // | On 'escape' key press un-select selected items.\n        // +-------------------------------\n        var keyHandler = new plotboilerplate_1.KeyHandler({ element: document.getElementsByTagName(\"body\")[0], trackAll: false }).down(\"escape\", function () {\n            // Esc?\n            console.log(\"Escape down\");\n            if (_this.editorHelpers.selectedOption) {\n                _this.editorHelpers.setSelectedOption(null);\n            }\n            else if (_this.editorHelpers.selectedNode) {\n                _this.editorHelpers.setSelectedNode(null, null);\n                _this.editorHelpers.setSelectedOption(null);\n            }\n        });\n        // +---------------------------------------------------------------------------------\n        // | Make HTML buttons a bit larger on mobile devices.\n        // +-------------------------------\n        console.debug(\"isMobileDevice\", isMobileDevice);\n        if (isMobileDevice) {\n            document.getElementsByTagName(\"body\")[0].classList.add(\"is-mobile-device\");\n        }\n        // +---------------------------------------------------------------------------------\n        // | The render method.\n        // +-------------------------------\n        this.pb.config.postDraw = function (_draw, _fill) {\n            if (!_self.dialogConfig) {\n                return;\n            }\n            _self.editorRenderer.renderBoxes(_self.dialogConfig);\n            _self.editorRenderer.renderConnections(_self.dialogConfig);\n        };\n        if (isRecoveryFromLocalStorageActive) {\n            console.debug(\"Trying to recover config from localstorage.\");\n            this.tryLoadFromLocalStorage()\n                .then(function (dc) {\n                _self.handleDialogConfigLoaded(dc);\n            })\n                .catch(function () {\n                console.debug(\"Loading from localstorage failed. Falling back loading from specified path.\");\n                _self.tryLoadFromJSON(dialogueConfigJSONPath);\n            });\n        }\n        else {\n            _self.tryLoadFromJSON(dialogueConfigJSONPath);\n        }\n        // Install DnD with FileDrop\n        var fileDrop = new FileDrop_1.FileDrop(this.pb.eventCatcher);\n        fileDrop.onFileJSONDropped(function (jsonObject) {\n            console.debug(\"[onFileJSONDropped] jsonObject\", jsonObject);\n            // TODO: properly convert to dialog-config\n            _self.handleDialogConfigLoaded(editorHelpers_1.EditorHelper.fromObject(jsonObject));\n        });\n        // Also accept uploads via button\n        var importJSON = function () {\n            document.getElementById(\"input-upload-file\").click();\n        };\n        document.getElementById(\"b-import-json\").addEventListener(\"click\", importJSON);\n        document.getElementById(\"input-upload-file\").addEventListener(\"change\", function (_evt) {\n            var fileInput = document.getElementById(\"input-upload-file\");\n            if (!fileInput.files || fileInput.files.length === 0) {\n                return;\n            }\n            console.log(\"inputFile\", fileInput.files[0]);\n            var reader = new FileReader();\n            reader.onload = function () {\n                var jsonText = reader.result;\n                console.log(reader.result);\n                _self.handleDialogConfigLoaded(editorHelpers_1.EditorHelper.fromObject(JSON.parse(jsonText)));\n            };\n            reader.readAsText(fileInput.files[0]);\n        });\n        document.getElementById(\"b-run-test\").addEventListener(\"click\", function () {\n            _self.testCurrentDialogueConfig();\n        });\n        document.getElementById(\"b-new\").addEventListener(\"click\", _self.requestCreateNewGraph());\n        document.getElementById(\"b-show-json\").addEventListener(\"click\", _self.showJSON());\n        document.getElementById(\"b-goto-github\").addEventListener(\"click\", function () {\n            window.open(\"https://github.com/IkarosKappler/rpg-dialogue\", \"_blank\");\n        });\n    }\n    // END constructor\n    Editor.prototype.tryStartAutosaveLoop = function () {\n        if (this.autosaveTimer) {\n            return;\n        }\n        var _self = this;\n        this.autosaveTimer = globalThis.setInterval(function () {\n            _self.tryAutoSave();\n        }, 10000);\n    };\n    Editor.prototype.tryAutoSave = function () {\n        if (this.editorHelpers.domHelper.isAutoSave()) {\n            // console.log(\"Putting to localstorage.\");\n            this.putToLocalStorage();\n        }\n    };\n    Editor.prototype.requestCreateNewGraph = function () {\n        var _self = this;\n        return function () {\n            _self.editorHelpers.domHelper.modal.setTitle(\"Drop current graph?\");\n            _self.editorHelpers.domHelper.modal.setBody(\"Do you really want to create a new graph and lose unsaved changes?\");\n            _self.editorHelpers.domHelper.modal.setFooter(\"\");\n            _self.editorHelpers.domHelper.modal.setActions([\n                modal_1.Modal.ACTION_CANCEL,\n                {\n                    label: \"Yes\",\n                    action: function () {\n                        _self.editorHelpers.domHelper.modal.close();\n                        _self.performNewGraph();\n                    }\n                }\n            ]);\n            _self.editorHelpers.domHelper.modal.open();\n        };\n    };\n    Editor.prototype.performNewGraph = function () {\n        var newConfig = {\n            meta: { name: \"dialogue_A\", npcs: [{ name: \"NPC #0\" }] },\n            graph: {\n                intro: { q: \"Hello world!\", o: [{ a: \"Hello, NPC!\", next: null }], editor: { position: { x: 0, y: 0 } } }\n            }\n        };\n        this.handleDialogConfigLoaded(newConfig);\n    };\n    Editor.prototype.showJSON = function () {\n        var _self = this;\n        return function () {\n            var removePositions = _self.editorHelpers.domHelper.isExportWithoutPositions();\n            var dConfig = removePositions\n                ? editorHelpers_1.EditorHelper.removePositions(_self.editorHelpers.dialogConfigWithPositions)\n                : _self.editorHelpers.dialogConfigWithPositions;\n            var jsonString = JSON.stringify(dConfig, null, 4);\n            var jsonArea = document.createElement(\"textarea\");\n            jsonArea.setAttribute(\"readonly\", \"true\");\n            jsonArea.innerHTML = jsonString;\n            jsonArea.classList.add(\"json-preview\");\n            _self.editorHelpers.domHelper.modal.setTitle(\"Current Graph as JSON\");\n            _self.editorHelpers.domHelper.modal.setBody(jsonArea);\n            _self.editorHelpers.domHelper.modal.setFooter(\"\");\n            _self.editorHelpers.domHelper.modal.setActions([modal_1.Modal.ACTION_CLOSE]);\n            _self.editorHelpers.domHelper.modal.open();\n        };\n    };\n    /**\n     * Open a modal and test the current dialogue config (runs a RPGDialogueLogic instant).\n     */\n    Editor.prototype.testCurrentDialogueConfig = function () {\n        var _self = this;\n        // Create this structure:\n        // <div class=\"rpg-output\">\n        //    <div class=\"rpg-output-question\"></div>\n        //    <ul class=\"rpg-output-options\"></ul>\n        // </div>\n        var outputContainer = document.createElement(\"div\");\n        var outputQuestion = document.createElement(\"div\");\n        var outputOptions = document.createElement(\"ul\");\n        outputContainer.classList.add(\"rpg-output\");\n        outputQuestion.classList.add(\"rpg-output-question\");\n        outputOptions.classList.add(\"rpg-output-options\");\n        outputContainer.appendChild(outputQuestion);\n        outputContainer.appendChild(outputOptions);\n        var dialogueListener = function (_dialogueConfig, nextNodeName, _oldNodeName, _selectedOptionIndex) {\n            // Highlight current node in the graph editor :)\n            _self.editorHelpers.setHighlightedNode(nextNodeName);\n        };\n        var rpgLogic = new RPGDialogueLogic_1.RPGDialogueLogic(this.dialogConfig, false);\n        rpgLogic.addDialogueChangeListener(dialogueListener);\n        var alternateStartNodeName = this.editorHelpers.selectedNodeName;\n        this.editorHelpers.setSelectedNode(null, null);\n        rpgLogic.beginConversation(new DefaultDialogueRenderer_1.DefaultDialogueRenderer(outputQuestion, outputOptions), alternateStartNodeName);\n        this.editorHelpers.domHelper.modal.setTitle(\"Test\"); // Will be changed later when invoked.\n        this.editorHelpers.domHelper.modal.setBody(outputContainer);\n        this.editorHelpers.domHelper.modal.setFooter(\"\");\n        this.editorHelpers.domHelper.modal.setActions([modal_1.Modal.ACTION_CLOSE]);\n        this.editorHelpers.domHelper.modal.open();\n    };\n    Editor.prototype.handleDialogConfigLoaded = function (config) {\n        // Check if all graph nodes have positions to render.\n        this.dialogConfig = this.editorHelpers.enrichPositions(config);\n        this.editorHelpers.enrichMetaData(this.dialogConfig);\n        console.log(\"Enriched meta data\", this.dialogConfig);\n        this.editorHelpers.setDialogConfig(this.dialogConfig);\n        // Ad DnD support for boxes.\n        if (this.currentMouseHandler) {\n            this.currentMouseHandler.destroy();\n            this.currentMouseHandler = null;\n        }\n        this.currentMouseHandler = this.editorHelpers.boxMovehandler();\n        // Ad DnD support for boxes.\n        if (this.currentTouchHandler) {\n            this.currentTouchHandler.destroy();\n            this.currentTouchHandler = null;\n        }\n        this.currentTouchHandler = new TouchHandler_1.TouchHandler(this.pb, this.dialogConfig, this.editorHelpers);\n        this.pb.redraw();\n        this.tryStartAutosaveLoop();\n    };\n    Editor.prototype.putToLocalStorage = function () {\n        var jsonString = JSON.stringify(this.dialogConfig);\n        globalThis.localStorage.setItem(\"__rpgeditor.dialogueconfig\", jsonString);\n    };\n    Editor.prototype.tryLoadFromJSON = function (dialogueConfigJSONPath) {\n        var _self = this;\n        RPGDialogueLogic_1.RPGDialogueLogic.loadConfigFromJSON(dialogueConfigJSONPath).then(function (config) {\n            console.log(\"structure\", config);\n            _self.handleDialogConfigLoaded(config);\n        });\n    };\n    Editor.prototype.tryLoadFromLocalStorage = function () {\n        return new Promise(function (accept, reject) {\n            var jsonString = globalThis.localStorage.getItem(\"__rpgeditor.dialogueconfig\");\n            if (!jsonString || jsonString === \"\") {\n                reject();\n            }\n            try {\n                var jsonObject = JSON.parse(jsonString);\n                if (!jsonObject) {\n                    reject();\n                    return;\n                }\n                var dialogueConfig = editorHelpers_1.EditorHelper.fromObject(jsonObject);\n                accept(dialogueConfig);\n            }\n            catch (exception) {\n                console.warn(exception);\n                reject();\n            }\n        });\n    };\n    return Editor;\n}());\nexports.Editor = Editor;\n//# sourceMappingURL=Editor.js.map","\"use strict\";\n/**\n * @author  Ikaros Kappler\n * @date    2023-07-25\n * @version 1.0.0\n */\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RPGDialogueLogic = void 0;\nvar axios_1 = __importDefault(require(\"axios\"));\nvar RPGDialogueLogic = /** @class */ (function () {\n    function RPGDialogueLogic(dialogueStruct, validateStructure) {\n        var _this = this;\n        this.createSendAnswerCallback = function (dialogueRenderer, optionIndex) {\n            var _self = _this;\n            var sendAnswerCallback = function () {\n                // optionIndex: number) => {\n                _self.sendAnswer(optionIndex);\n                if (_self.isEndReached()) {\n                    dialogueRenderer.renderConversationTerminated();\n                }\n                dialogueRenderer.clearAllOptions();\n                if (!_self.isEndReached()) {\n                    _self.loadCurrentQuestionaire(dialogueRenderer);\n                }\n            };\n            return sendAnswerCallback;\n        };\n        this.structure = dialogueStruct;\n        this.listeners = [];\n        this.resetToBeginning();\n        if (validateStructure) {\n            this.validate();\n        }\n    }\n    RPGDialogueLogic.prototype.addDialogueChangeListener = function (listener) {\n        for (var i = 0; i < this.listeners.length; i++) {\n            if (this.listeners[i] === listener) {\n                return false;\n            }\n        }\n        this.listeners.push(listener);\n        return true;\n    };\n    RPGDialogueLogic.prototype.removeDialogueChangeListener = function (listener) {\n        for (var i = 0; i < this.listeners.length; i++) {\n            if (this.listeners[i] === listener) {\n                this.listeners.splice(i, 1);\n                return true;\n            }\n        }\n        return false;\n    };\n    RPGDialogueLogic.prototype.fireStateChange = function (nextNodeName, oldNodeName, selectedOptionIndex) {\n        for (var i = 0; i < this.listeners.length; i++) {\n            this.listeners[i](this.structure, nextNodeName, oldNodeName, selectedOptionIndex);\n        }\n    };\n    RPGDialogueLogic.prototype.getCurrentNpcName = function () {\n        var _a, _b, _c;\n        var npcIndex = (_a = this.currentQuestionaire.npcIndex) !== null && _a !== void 0 ? _a : 0;\n        var npcName = ((_c = (_b = this.structure.meta) === null || _b === void 0 ? void 0 : _b.npcs) === null || _c === void 0 ? void 0 : _c.length) > 0 ? this.structure.meta.npcs[npcIndex].name : null;\n        return npcName;\n    };\n    RPGDialogueLogic.prototype.loadCurrentQuestionaire = function (dialogueRenderer) {\n        if (this.currentQuestionaire) {\n            var npcName = this.getCurrentNpcName();\n            dialogueRenderer.setQuestionText(this.currentQuestionaire.q, npcName);\n            for (var i = 0; i < this.currentQuestionaire.o.length; i++) {\n                var answerCallback = this.createSendAnswerCallback(dialogueRenderer, i);\n                dialogueRenderer.addAnswerOption(this.currentQuestionaire.o[i].a, i, answerCallback);\n            }\n            return true;\n        }\n        return false;\n    };\n    /**\n     * Get the current mini questionaire or null if no current or next questionaire is available.\n     * @returns\n     */\n    RPGDialogueLogic.prototype.getCurrentQuestionaire = function () {\n        return this.currentQuestionaire;\n    };\n    /**\n     * Check if the end was reached or if there are more questions available\n     * @returns {boolean} false if there is a current question active.\n     */\n    RPGDialogueLogic.prototype.isEndReached = function () {\n        return this.currentQuestionaire === null || this.currentQuestionaire === undefined;\n    };\n    /**\n     * Give an answer to the current questionaire. Only valid answer indices will be acceped.\n     * @param {number} index\n     * @returns {boolean} true if the the index is valid.\n     */\n    RPGDialogueLogic.prototype.sendAnswer = function (index) {\n        if (index < 0 || index >= this.currentQuestionaire.o.length) {\n            return false;\n        }\n        var oldQuestionaireName = this.currentQuestionaireName;\n        var selectedAnswer = this.currentQuestionaire.o[index];\n        if (!selectedAnswer) {\n            return false;\n        }\n        if (!selectedAnswer.next) {\n            this.currentQuestionaireName = null;\n            this.currentQuestionaire = null;\n        }\n        else {\n            this.currentQuestionaireName = selectedAnswer.next;\n            var nextQuestionaire = this.structure.graph[this.currentQuestionaireName];\n            // Can be the final one!\n            if (!nextQuestionaire.o || nextQuestionaire.o.length === 0) {\n                this.currentQuestionaireName = null;\n                this.currentQuestionaire = null;\n            }\n            else {\n                this.currentQuestionaire = nextQuestionaire;\n            }\n        }\n        this.fireStateChange(this.currentQuestionaireName, oldQuestionaireName, index);\n        // console.log(\"Next questionaire\", this.currentQuestionaire);\n        return true;\n    };\n    /**\n     * Find the initial mini questionaire.\n     */\n    RPGDialogueLogic.prototype.resetToBeginning = function (alternateStartNodeName) {\n        this.currentQuestionaireName = alternateStartNodeName !== null && alternateStartNodeName !== void 0 ? alternateStartNodeName : \"intro\";\n        console.log(\"Using node node: \", this.currentQuestionaireName, \"param\", alternateStartNodeName);\n        this.currentQuestionaire = this.structure.graph[this.currentQuestionaireName];\n        if (!this.currentQuestionaire) {\n            throw \"Cannot initialize RPGDialogueLogic: structure does not have an initial ('intro') entry\";\n        }\n    };\n    /**\n     * Check if the current dialogue is still valid or reached its end.\n     */\n    RPGDialogueLogic.prototype.validate = function () {\n        // ...\n    };\n    /**\n     * This is a convenient function for quickly integrating the dialogue logic into\n     * an existing HTML document with prepared two <div> elements for displaying\n     * the question and possible answers.\n     *\n     * @param {IDialogueRenderer} dialogueRenderer - The dialogue renderer to use.\n     * @param {string?} alternateStartNodeName - If you don't want to start at 'intro' specify your start node name here.\n     * @returns\n     */\n    RPGDialogueLogic.prototype.beginConversation = function (dialogueRenderer, alternateStartNodeName) {\n        console.log(\"beginConversation\", alternateStartNodeName);\n        var _self = this;\n        // Initialize the first question.\n        this.resetToBeginning(alternateStartNodeName);\n        this.loadCurrentQuestionaire(dialogueRenderer);\n        this.fireStateChange(this.currentQuestionaireName, null, -1);\n    };\n    /**\n     * Load the dialogue structure from the JSON document at the given path.\n     *\n     * @param {string} path\n     * @returns {Promise<RPGDialogueLogic>}\n     */\n    RPGDialogueLogic.loadConfigFromJSON = function (path) {\n        // console.log(\"axios\", axios);\n        return new Promise(function (accept, reject) {\n            axios_1.default\n                .get(path)\n                .then(function (response) {\n                // handle success\n                console.log(response);\n                // Validate response data?\n                accept(response.data);\n            })\n                .catch(function (error) {\n                // handle error\n                console.log(error);\n                reject();\n            })\n                .finally(function () {\n                // always executed\n            });\n        });\n    };\n    /**\n     * Load the dialogue structure from the JSON document at the given path.\n     *\n     * @param {string} path\n     * @returns {Promise<RPGDialogueLogic>}\n     */\n    RPGDialogueLogic.loadFromJSON = function (path) {\n        return new Promise(function (accept, reject) {\n            RPGDialogueLogic.loadConfigFromJSON(path).then(function (struct) {\n                accept(new RPGDialogueLogic(struct, true));\n            });\n        });\n    };\n    /**\n     * Pass an array of { npcName: string; path: string } objects and get an\n     * array of { npcName: string; dialogue: RPGDialogueLogic<T> }.\n     *\n     * @param paths\n     * @returns\n     */\n    RPGDialogueLogic.loadAllFromJSON = function (paths) {\n        var promises = [];\n        var npcNames = Object.keys(paths);\n        console.log(\"npcNames\", npcNames);\n        for (var i = 0; i < npcNames.length; i++) {\n            var npcName = npcNames[i];\n            var npcPath = paths[npcName];\n            promises.push(RPGDialogueLogic.loadFromJSON(npcPath));\n        }\n        return new Promise(function (accept, reject) {\n            Promise.all(promises)\n                .then(function (dialogues) {\n                // tre-map received dialogues back to their npc names\n                // const mapping = dialogues.map((dialogue, index) => ({ npcName: paths[index], dialogue: dialogue }));\n                var mapping = {};\n                for (var i = 0; i < npcNames.length; i++) {\n                    var name_1 = npcNames[i];\n                    mapping[name_1] = dialogues[i];\n                }\n                accept(mapping);\n            })\n                .catch(reject);\n        });\n    };\n    return RPGDialogueLogic;\n}());\nexports.RPGDialogueLogic = RPGDialogueLogic;\n//# sourceMappingURL=RPGDialogueLogic.js.map","\"use strict\";\n/**\n * A dialogue sequence will use multiple dialogues (RPGDialogueLogic) and\n * put them together to a 'scene experience' with multiple NPCs.\n *\n * E.g.: first talk to NPC A and when that is done talking to NPC B is\n * available.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RPGDialogueSequence = void 0;\nvar RPGDialogueSequence = /** @class */ (function () {\n    /**\n     * Create a sequence from a set of dialgues, each mapped to an NPC name.\n     * @param {Record<string, RPGDialogueLogic<T>>} dialogues\n     */\n    function RPGDialogueSequence(dialogues) {\n        // NOOP\n        this.dialogues = dialogues;\n        this.rules = [];\n        var keys = Object.keys(this.dialogues);\n        for (var i in keys) {\n            var npcName = keys[i];\n            var dlg = this.dialogues[npcName];\n            dlg.addDialogueChangeListener(this.handleDialogueStateChanged(npcName));\n        }\n    }\n    RPGDialogueSequence.prototype.handleDialogueStateChanged = function (npcName) {\n        var _this = this;\n        return function (_dialogueConfig, nextNodeName, oldNodeName, selectedOptionIndex) {\n            // Try to locate matching callback.\n            var matchingRule = _this.findRule(npcName, nextNodeName);\n            console.log(\"matchingRule found?\", matchingRule !== null);\n            if (matchingRule) {\n                matchingRule.callback();\n            }\n        };\n    };\n    RPGDialogueSequence.prototype.findRule = function (npcName, nodeName) {\n        for (var i in this.rules) {\n            var rule = this.rules[i];\n            if (rule.npcName === npcName && rule.nodeName === nodeName) {\n                return rule;\n            }\n        }\n        return null;\n    };\n    /**\n     * Add a rule for node changes to this sequence. Use nodeName=null for end-of-conversation.\n     * The passed callback will be triggered if any of the passed dialogues\n     * enters a state that matches the given rule.\n     *\n     * @param npcName\n     * @param nodeName\n     * @param callback\n     */\n    RPGDialogueSequence.prototype.addRule = function (npcName, nodeName, callback) {\n        this.rules.push({ npcName: npcName, nodeName: nodeName, callback: callback });\n    };\n    RPGDialogueSequence.prototype.beginConversation = function (dialogueRenderer, npcName, alternateStartNodeName) {\n        var dialogue = this.dialogues[npcName];\n        dialogue.beginConversation(dialogueRenderer, alternateStartNodeName);\n    };\n    return RPGDialogueSequence;\n}());\nexports.RPGDialogueSequence = RPGDialogueSequence;\n//# sourceMappingURL=RPGDialogueSequence.js.map","\"use strict\";\n/**\n * A wrapper class for AlloyFinger.\n *\n * @author  Ikaros Kappler\n * @date    2023-07-31\n * @version 1.0.0\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TouchEnterLeaveHandler = exports.TouchHandler = void 0;\nvar plotboilerplate_1 = require(\"plotboilerplate\");\nvar TouchHandler = /** @class */ (function () {\n    function TouchHandler(pb, dialogConfigWithPositions, editorHelper) {\n        this.wasTouchUsed = false;\n        var _self = this;\n        // Install a touch handler on the canvas.\n        var relPos = function (pos) {\n            var bounds = pb.canvas.getBoundingClientRect();\n            return { x: pos.x - bounds.left, y: pos.y - bounds.top };\n        };\n        var draggedNodeName = null;\n        var draggedNode = null;\n        var draggedOption;\n        var wasDragged = false;\n        var touchMovePos = null;\n        var touchDownPos = null;\n        var clearTouch = function () {\n            touchMovePos = null;\n            touchDownPos = null;\n            draggedNodeName = null;\n        };\n        var afProps = {\n            touchStart: function (evt) {\n                console.log(\"Touchstart\");\n                _self.wasTouchUsed = true;\n                if (evt.touches.length == 1) {\n                    touchMovePos = new plotboilerplate_1.Vertex(relPos({ x: evt.touches[0].clientX, y: evt.touches[0].clientY }));\n                    touchDownPos = new plotboilerplate_1.Vertex(relPos({ x: evt.touches[0].clientX, y: evt.touches[0].clientY }));\n                    draggedNodeName = editorHelper.locateNodeBoxNameAtPos(pb.transformMousePosition(touchMovePos.x, touchMovePos.y));\n                    if (draggedNodeName) {\n                        draggedNode = dialogConfigWithPositions.graph[draggedNodeName];\n                    }\n                    else {\n                        draggedOption = editorHelper.locateOptionBoxNameAtPos(pb.transformMousePosition(touchMovePos.x, touchMovePos.y));\n                    }\n                    wasDragged = false;\n                }\n            },\n            touchMove: function (evt) {\n                console.log(\"touchMove\");\n                _self.wasTouchUsed = true;\n                if (evt.touches.length == 1 && draggedNode) {\n                    evt.preventDefault();\n                    evt.stopPropagation();\n                    if (!touchDownPos || !touchMovePos) {\n                        return;\n                    }\n                    var rel = relPos({ x: evt.touches[0].clientX, y: evt.touches[0].clientY });\n                    var trans = pb.transformMousePosition(rel.x, rel.y);\n                    var diff = new plotboilerplate_1.Vertex(pb.transformMousePosition(touchMovePos.x, touchMovePos.y)).difference(trans);\n                    draggedNode.editor.position.x += diff.x;\n                    draggedNode.editor.position.y += diff.y;\n                    touchMovePos = new plotboilerplate_1.Vertex(relPos({ x: evt.touches[0].clientX, y: evt.touches[0].clientY }));\n                    wasDragged = true;\n                    pb.redraw();\n                }\n            },\n            touchEnd: function (evt) {\n                console.log(\"touchEnd\");\n                _self.wasTouchUsed = true;\n                // Note: e.touches.length is 0 here\n                if (draggedNode) {\n                    if (!touchDownPos) {\n                        return;\n                    }\n                    if (!wasDragged) {\n                        wasDragged = false;\n                        if (draggedNode) {\n                            if (editorHelper.selectedOption) {\n                                // reconnect\n                                editorHelper.handleOptionReconnect(draggedNodeName);\n                            }\n                            else {\n                                editorHelper.setSelectedOption(null, false);\n                                editorHelper.setSelectedNode(draggedNodeName, draggedNode);\n                            }\n                        }\n                        else {\n                            // Option can be null, too.\n                            editorHelper.setSelectedOption(draggedOption, true);\n                            editorHelper.setSelectedNode(null, null);\n                        }\n                    }\n                }\n                clearTouch();\n            },\n            touchCancel: function (evt) {\n                console.log(\"touchCancel\");\n                _self.wasTouchUsed = true;\n                clearTouch();\n            }\n        }; // END afProps\n        /* tslint:disable-next-line */\n        _self.alloyFinger = globalThis.createAlloyFinger(pb.eventCatcher ? pb.eventCatcher : pb.canvas, afProps);\n    }\n    TouchHandler.prototype.destroy = function () {\n        this.alloyFinger.destroy();\n    };\n    return TouchHandler;\n}());\nexports.TouchHandler = TouchHandler;\nvar TouchEnterLeaveHandler = /** @class */ (function () {\n    function TouchEnterLeaveHandler() {\n        this.onTouchLeaveEvents = [];\n        this.onTouchEnterEvents = [];\n        this._init();\n    }\n    TouchEnterLeaveHandler.prototype.onTouchEnter = function (selector, fn) {\n        var _this = this;\n        this.onTouchEnterEvents.push([selector, fn]);\n        return function () {\n            _this.onTouchEnterEvents.slice().map(function (e, i) {\n                if (e[0] === selector && e[1] === fn) {\n                    this.onTouchEnterEvents.splice(1, i);\n                }\n            });\n        };\n    };\n    TouchEnterLeaveHandler.prototype.onTouchLeave = function (selector, fn) {\n        this.onTouchLeaveEvents.push([selector, fn]);\n        return function () {\n            this.onTouchLeaveEvents.slice().map(function (e, i) {\n                if (e[0] === selector && e[1] === fn) {\n                    this.onTouchLeaveEvents.splice(1, i);\n                }\n            });\n        };\n    };\n    TouchEnterLeaveHandler.prototype._init = function () {\n        var lastTouchLeave;\n        var lastTouchEnter;\n        var _self = this;\n        document.addEventListener(\"touchmove\", function (e) {\n            var el = document.elementFromPoint(e.touches[0].clientX, e.touches[0].clientY);\n            if (!el) {\n                return;\n            }\n            _self.onTouchLeaveEvents.map(function (event) {\n                if (el != lastTouchEnter && lastTouchEnter && lastTouchEnter.matches(event[0])) {\n                    if (lastTouchEnter !== lastTouchLeave) {\n                        event[1](lastTouchEnter, e);\n                        lastTouchLeave = lastTouchEnter;\n                        lastTouchEnter = null;\n                    }\n                }\n            });\n            _self.onTouchEnterEvents.map(function (event) {\n                if (el.matches(event[0]) && el !== lastTouchEnter) {\n                    lastTouchEnter = el;\n                    lastTouchLeave = null;\n                    event[1](el, e);\n                }\n            });\n        });\n    };\n    return TouchEnterLeaveHandler;\n}());\nexports.TouchEnterLeaveHandler = TouchEnterLeaveHandler;\n// Test\n// onTouchEnter('.area',function(el,e){\n//   el.classList.add('hover')\n// })\n// onTouchLeave('.area',function(el,e){\n//   el.classList.remove('hover')\n// })\n//# sourceMappingURL=TouchHandler.js.map","\"use strict\";\n/**\n * @author  Ikaros Kappler\n * @date    2021-11-07\n * @version 1.0.0\n *\n * @param {Record<string,string>} GUP\n * @returns {boolean}\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.detectDarkMode = void 0;\nvar detectDarkMode = function (GUP) {\n    // Respect overrides\n    if (typeof GUP !== \"undefined\" && GUP.hasOwnProperty(\"darkmode\") && GUP[\"darkmode\"]) {\n        var overrideValue = GUP[\"darkmode\"];\n        if (overrideValue === \"0\" || overrideValue.toLowerCase() === \"false\") {\n            return false;\n        }\n        else if (overrideValue === \"1\" || overrideValue.toLowerCase() === \"true\") {\n            return true;\n        }\n    }\n    var hours = new Date().getHours();\n    var isDayTime = hours > 6 && hours < 18;\n    return !isDayTime;\n};\nexports.detectDarkMode = detectDarkMode;\n//# sourceMappingURL=detectDarkMode.js.map","\"use strict\";\n/**\n * @date 2023-08-23\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.detectMobileDevice = void 0;\nvar detectMobileDevice = function (GUP) {\n    // Source\n    //    http://detectmobilebrowsers.com/\n    if (typeof GUP !== \"undefined\" && GUP.hasOwnProperty(\"touchdevice\") && GUP[\"touchdevice\"]) {\n        var overrideValue = GUP[\"touchdevice\"];\n        if (overrideValue === \"0\" || overrideValue.toLowerCase() === \"false\") {\n            return false;\n        }\n        else if (overrideValue === \"1\" || overrideValue.toLowerCase() === \"true\") {\n            return true;\n        }\n    }\n    var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n    return (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent) ||\n        /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(userAgent.substr(0, 4)));\n};\nexports.detectMobileDevice = detectMobileDevice;\n//# sourceMappingURL=detectMobileDevice.js.map","\"use strict\";\n/**\n * A script for demonstrating the line-point-distance.\n *\n * @require PlotBoilerplate, MouseHandler, gup, dat.gui\n *\n * @author   Ikaros Kappler\n * @date     2023-08-01\n * @version  1.0.0\n **/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RPGDOMHelpers = void 0;\nvar TouchHandler_1 = require(\"./TouchHandler\");\nvar editorHelpers_1 = require(\"./editorHelpers\");\nvar modal_1 = require(\"./modal\");\nvar RPGDOMHelpers = /** @class */ (function () {\n    function RPGDOMHelpers(editorHelpers) {\n        this.currentDraggedAnswerIndex = -1;\n        this.currentDropAnswerIndex = -1;\n        this.editorHelpers = editorHelpers;\n        this.touchEnterLeaveHandler = new TouchHandler_1.TouchEnterLeaveHandler();\n        this.editorElement = document.getElementById(\"attribute-editor\");\n        this.optionsElement = document.getElementById(\"e-options-container\");\n        this.keyElement = this.editorElement.querySelector(\"input#e-key\");\n        this.npcElement = this.editorElement.querySelector(\"select#e-npc-index\");\n        this.qElement = this.editorElement.querySelector(\"textarea#e-q\");\n        this.qElement.addEventListener(\"change\", this.handleQChanged(this));\n        this.npcElement.addEventListener(\"change\", this.handleNPCIndexChanged(this));\n        this.keyElement.addEventListener(\"change\", this.handleKeyChanged(this));\n        this.modal = new modal_1.Modal();\n        document.getElementById(\"b-export-json\").addEventListener(\"click\", this.exportJSON(this));\n        document.getElementById(\"b-add-answer-option\").addEventListener(\"click\", this.addAnswerOption(this));\n        document.getElementById(\"b-add-dialogue-node\").addEventListener(\"click\", this.addDialogueNode(this));\n        document.getElementById(\"b-delete-dialogue-node\").addEventListener(\"click\", this.requestRemoveDialogueNode(this));\n    }\n    RPGDOMHelpers.prototype.isExportWithoutPositions = function () {\n        var checkbox = document.getElementById(\"cb-export-without-positions\");\n        return checkbox.checked;\n    };\n    RPGDOMHelpers.prototype.isAutoSave = function () {\n        var checkbox = document.getElementById(\"cb-use-localstorage\");\n        return checkbox.checked;\n    };\n    RPGDOMHelpers.prototype.exportJSON = function (_self) {\n        return function () {\n            var removePositions = _self.isExportWithoutPositions();\n            var dConfig = removePositions\n                ? editorHelpers_1.EditorHelper.removePositions(_self.editorHelpers.dialogConfigWithPositions)\n                : _self.editorHelpers.dialogConfigWithPositions;\n            var jsonString = JSON.stringify(dConfig);\n            var blob = new Blob([jsonString], { type: \"application/json\" });\n            var url = URL.createObjectURL(blob);\n            var a = document.createElement(\"a\");\n            a.href = url;\n            a.download = \"dialog-config.json\";\n            a.textContent = \"Download backup.json\";\n            a.click();\n        };\n    };\n    RPGDOMHelpers.prototype.addAnswerOption = function (_self) {\n        return function () {\n            var newOption = {\n                a: \"\",\n                next: null\n            };\n            _self.currentGraphNode.o.push(newOption);\n            _self.updateAnswerOptions();\n            _self.editorHelpers.pb.redraw();\n        };\n    };\n    RPGDOMHelpers.prototype.addDialogueNode = function (_self) {\n        return function () {\n            _self.editorHelpers.addNewDialogueNode();\n        };\n    };\n    RPGDOMHelpers.prototype.requestRemoveDialogueNode = function (_self) {\n        return function () {\n            _self.modal.setTitle(\"Delete option?\");\n            _self.modal.setBody(\"Do you really want to delete the current dialoge node '\".concat(_self.currentNodeName, \"'?\"));\n            _self.modal.setFooter(\"\");\n            _self.modal.setActions([\n                modal_1.Modal.ACTION_CANCEL,\n                {\n                    label: \"Yes\",\n                    action: function () {\n                        _self.modal.close();\n                        _self.removeDialogueNode();\n                    }\n                }\n            ]);\n            _self.modal.open();\n        };\n    };\n    RPGDOMHelpers.prototype.removeDialogueNode = function () {\n        this.editorHelpers.removeNewDialogueNode(this.currentNodeName);\n        this.toggleVisibility(false);\n    };\n    RPGDOMHelpers.prototype.toggleVisibility = function (isVisible) {\n        if (isVisible) {\n            this.editorElement.classList.remove(\"d-none\");\n        }\n        else {\n            this.editorElement.classList.add(\"d-none\");\n        }\n    };\n    RPGDOMHelpers.prototype.handleQChanged = function (_self) {\n        return function (changeEvent) {\n            _self.currentGraphNode.q = changeEvent.target.value;\n            _self.editorHelpers.pb.redraw();\n        };\n    };\n    RPGDOMHelpers.prototype.handleNPCIndexChanged = function (_self) {\n        var _this = this;\n        return function (_changeEvent) {\n            var newIndex = parseInt(_this.npcElement.value);\n            if (Number.isNaN(newIndex)) {\n                newIndex = -1;\n            }\n            _self.currentGraphNode.npcIndex = newIndex;\n        };\n    };\n    RPGDOMHelpers.prototype.handleKeyChanged = function (_self) {\n        var _this = this;\n        return function (_changeEvent) {\n            var newName = _this.keyElement.value;\n            if (!newName || (newName = newName.trim()).length === 0) {\n                return;\n            }\n            var renameSuccessful = _self.editorHelpers.renameGraphNode(_self.currentNodeName, newName);\n            if (renameSuccessful) {\n                _self.currentNodeName = newName;\n            }\n        };\n    };\n    RPGDOMHelpers.prototype.handleATextChanged = function (_self, answer) {\n        return function (changeEvent) {\n            answer.a = changeEvent.target.value;\n            _self.editorHelpers.pb.redraw();\n        };\n    };\n    RPGDOMHelpers.prototype.handleASuccessorChanged = function (_self, answer) {\n        return function (changeEvent) {\n            answer.next = changeEvent.target.value;\n            _self.editorHelpers.pb.redraw();\n        };\n    };\n    RPGDOMHelpers.prototype.updateAnswerOptions = function () {\n        this.showAnswerOptions(this.currentNodeName, this.currentGraphNode);\n    };\n    RPGDOMHelpers.prototype.getSelectedNpcIndex = function () {\n        return typeof this.currentGraphNode.npcIndex === \"undefined\" || Number.isNaN(this.currentGraphNode.npcIndex)\n            ? 0\n            : this.currentGraphNode.npcIndex;\n    };\n    RPGDOMHelpers.prototype.updateNpcSelector = function () {\n        if (!this.currentGraphNode) {\n            return;\n        }\n        this.npcElement.innerHTML = \"\";\n        var curNpcIndex = this.getSelectedNpcIndex();\n        // console.log(\"this.currentGraphNode.npcIndex\", this.currentGraphNode.npcIndex, \"curNpcIndex\", curNpcIndex);\n        for (var i = 0; i < this.editorHelpers.dialogConfigWithPositions.meta.npcs.length; i++) {\n            var npcOption = document.createElement(\"option\");\n            npcOption.setAttribute(\"value\", \"\".concat(i));\n            if (i === 0) {\n                npcOption.innerHTML = \"\".concat(this.editorHelpers.dialogConfigWithPositions.meta.npcs[i].name, \" (default)\");\n            }\n            else {\n                npcOption.innerHTML = this.editorHelpers.dialogConfigWithPositions.meta.npcs[i].name;\n            }\n            if (i === curNpcIndex) {\n                npcOption.setAttribute(\"selected\", \"true\");\n                npcOption.selected = true;\n            }\n            this.npcElement.appendChild(npcOption);\n        }\n        this.npcElement.value = \"\".concat(curNpcIndex);\n        this.npcElement.setAttribute(\"value\", \"\".concat(curNpcIndex));\n    };\n    RPGDOMHelpers.prototype.toggleDragEnterStyles = function (target) {\n        // console.log(\"toggleDragEnterStyles\");\n        var answerIndex = this.currentDraggedAnswerIndex;\n        var dropIndex = parseInt(target.getAttribute(\"data-dropindex\"));\n        if (target.classList.contains(\"droppable\") && answerIndex !== dropIndex && answerIndex + 1 !== dropIndex) {\n            target.classList.add(\"dragover\");\n        }\n    };\n    RPGDOMHelpers.prototype.toggleDragLeaveStyles = function (target) {\n        console.log(\"toggleDragLeaveStyles\");\n        if (target.classList.contains(\"droppable\")) {\n            target.classList.remove(\"dragover\");\n        }\n    };\n    RPGDOMHelpers.prototype.showAnswerOptions = function (nodeName, graphNode) {\n        var _self = this;\n        this.currentNodeName = nodeName;\n        this.currentGraphNode = graphNode;\n        this.keyElement.setAttribute(\"value\", nodeName ? nodeName : \"\");\n        this.keyElement.value = nodeName ? nodeName : \"\";\n        // console.log(\"showAnswerOptions\", this.currentGraphNode);\n        this.updateNpcSelector();\n        this.optionsElement.innerHTML = \"\";\n        this.npcElement.value = !graphNode || Number.isNaN(graphNode.npcIndex) ? \"0\" : \"\".concat(graphNode.npcIndex);\n        this.qElement.setAttribute(\"value\", graphNode ? graphNode.q : \"\");\n        this.qElement.value = graphNode ? graphNode.q : \"\";\n        if (!graphNode) {\n            return;\n        }\n        var onDragOver = function (ev) {\n            console.log(\"ondragover\", ev.target);\n            ev.preventDefault();\n            var target = ev.target;\n            _self.toggleDragEnterStyles(target);\n        };\n        var onDragLeave = function (ev) {\n            console.log(\"ondragleave\", ev.target);\n            ev.preventDefault();\n            var target = ev.target;\n            _self.toggleDragLeaveStyles(target);\n        };\n        /**\n         * Native browser DnD does not support touch events.\n         * So we need a workaround using our custom TouchEnterLeaverHandler here.\n         */\n        _self.touchEnterLeaveHandler.onTouchEnter(\".a-droparea\", function (element) {\n            console.log(\"onTouchEnter\", element);\n            if (!element.classList.contains(\"a-droparea\")) {\n                return;\n            }\n            _self.currentDropAnswerIndex = parseInt(element.getAttribute(\"data-dropIndex\"));\n            _self.toggleDragEnterStyles(element);\n        });\n        _self.touchEnterLeaveHandler.onTouchLeave(\".a-droparea\", function (element) {\n            console.log(\"onTouchLeave\", element);\n            _self.currentDropAnswerIndex = -1;\n            _self.toggleDragLeaveStyles(element);\n        });\n        var drop = function (ev) {\n            console.log(\"Drop\", ev);\n            ev.preventDefault();\n            var target = ev.target;\n            // const answerIndex = parseInt(ev.dataTransfer.getData(\"answerindex\"));\n            var answerIndex = _self.currentDraggedAnswerIndex;\n            var dropIndex = parseInt(target.getAttribute(\"data-dropindex\"));\n            console.log(\"Move\", answerIndex, \"to\", dropIndex);\n            // target.appendChild(document.getElementById(data));\n            if (!target.classList.contains(\"droppable\") || answerIndex === dropIndex || answerIndex + 1 === dropIndex) {\n                // No real change\n                return;\n            }\n            _self.performDrop(answerIndex, dropIndex);\n        };\n        var isTouchDevice = this.editorHelpers.editor.currentTouchHandler.wasTouchUsed;\n        var dropArea = this.makeADropArea(0, drop, onDragOver, onDragLeave);\n        this.optionsElement.appendChild(dropArea);\n        for (var i = 0; i < graphNode.o.length; i++) {\n            var option = graphNode.o[i];\n            var answerWrapperElement = document.createElement(\"div\");\n            var answerControlsElement = this.makeAnswerControlElement(i, isTouchDevice);\n            var answerElement = document.createElement(\"div\");\n            var labelElement = document.createElement(\"div\");\n            var textElement = document.createElement(\"textarea\");\n            var selectElement = this.createNodeSelectElement(nodeName, option.next);\n            labelElement.innerHTML = \"A#\".concat(i);\n            labelElement.classList.add(\"e-label\");\n            textElement.innerHTML = option.a;\n            answerElement.appendChild(labelElement);\n            answerElement.appendChild(textElement);\n            answerElement.appendChild(selectElement);\n            var handleDragStart = function (ev) {\n                // console.log(\"handleDragStart\");\n                _self.currentDraggedAnswerIndex = parseInt(ev.target.getAttribute(\"data-answerindex\"));\n                // console.log(\"handleDragStart\", _self.currentDraggedAnswerIndex);\n                ev.dataTransfer.setData(\"answerindex\", \"\".concat(_self.currentDraggedAnswerIndex));\n            };\n            var handleTouchDragStart = function (ev) {\n                ev.preventDefault(); // Is this required?\n                var dragStartElement = ev.target;\n                _self.currentDraggedAnswerIndex = parseInt(dragStartElement.getAttribute(\"data-answerindex\"));\n                if (Number.isNaN(_self.currentDraggedAnswerIndex)) {\n                    // touchStart on touch devices is a bit different than dragStart on Desktop devives.\n                    // Try to find enclosing draggable element\n                    if (dragStartElement.classList.contains(\"a-dnd-element\")) {\n                        dragStartElement = dragStartElement.parentElement.parentElement;\n                    }\n                    // This should not be a node of class 'answer-wrapper-element' and draggable=true\n                    if (!dragStartElement.classList.contains(\"answer-wrapper-element\") || !dragStartElement.getAttribute(\"draggable\")) {\n                        console.log(\"Cannot find draggable element.\");\n                        return;\n                    }\n                    _self.currentDraggedAnswerIndex = parseInt(dragStartElement.getAttribute(\"data-answerindex\"));\n                }\n                // console.log(\"handleTouchDragStart\", _self.currentDraggedAnswerIndex);\n            };\n            var handleTouchDragEnd = function (_ev) {\n                _self.performDrop(_self.currentDraggedAnswerIndex, _self.currentDropAnswerIndex);\n            };\n            answerWrapperElement.classList.add(\"answer-wrapper-element\");\n            // answerWrapperElement.setAttribute(\"data-answerindex\", `${i}`);\n            if (isTouchDevice) {\n                // Regular 'mouse' or Desktop device.\n                // No additional listeners to install.\n            }\n            else {\n                // The TouchHandler already received an only-touch event, so we are\n                // probably currently running on a touch device\n                if (answerControlsElement.dndHandleElement) {\n                    answerControlsElement.dndHandleElement.setAttribute(\"draggable\", \"true\");\n                    answerControlsElement.dndHandleElement.addEventListener(\"dragstart\", handleDragStart);\n                    answerControlsElement.dndHandleElement.addEventListener(\"touchstart\", handleTouchDragStart);\n                    answerControlsElement.dndHandleElement.addEventListener(\"touchend\", handleTouchDragEnd);\n                    answerControlsElement.dndHandleElement.setAttribute(\"data-answerindex\", \"\".concat(i));\n                }\n            }\n            answerWrapperElement.appendChild(answerElement);\n            answerWrapperElement.appendChild(answerControlsElement.container);\n            var dropArea_1 = this.makeADropArea(i + 1, drop, onDragOver, onDragLeave);\n            this.optionsElement.appendChild(answerWrapperElement);\n            this.optionsElement.appendChild(dropArea_1);\n            textElement.addEventListener(\"change\", this.handleATextChanged(this, option));\n            selectElement.addEventListener(\"change\", this.handleASuccessorChanged(this, option));\n        }\n    };\n    /**\n     * Create a new answer element (consisting of labels, input fields and buttons).\n     * If `isTouchDevice` is true, then a drag element will be added.\n     * Otherwise two up/down-buttons will be added.\n     *\n     * @param {number} index - The answer option index inside the config.\n     * @param {boolean} isTouchDevice - Set to `true` if drag-and-drop handles should be added instead of buttons.\n     * @returns {HTMLDivElement}\n     */\n    RPGDOMHelpers.prototype.makeAnswerControlElement = function (index, isTouchDevice) {\n        var _self = this;\n        var controlElement = document.createElement(\"div\");\n        controlElement.classList.add(\"answer-controls-element\");\n        var dndElement = null;\n        if (isTouchDevice) {\n            var upDownElement = document.createElement(\"div\");\n            upDownElement.classList.add(\"answer-up-down-element\");\n            var upBtn = document.createElement(\"button\");\n            upBtn.innerHTML = \"▴\";\n            if (index === 0) {\n                upBtn.setAttribute(\"disabled\", \"true\");\n            }\n            else {\n                upBtn.addEventListener(\"click\", function () {\n                    console.log(\"upBtn\", index, index - 1);\n                    _self.performDrop(index, index - 1);\n                });\n            }\n            var downBtn = document.createElement(\"button\");\n            downBtn.innerHTML = \"▾\";\n            if (index + 1 === this.currentGraphNode.o.length) {\n                downBtn.setAttribute(\"disabled\", \"true\");\n            }\n            else {\n                downBtn.addEventListener(\"click\", function () {\n                    console.log(\"downBtn\", index, index + 2); // Think of drop zone indices here\n                    _self.performDrop(index, index + 2); // Think of drop zone indices here\n                });\n            }\n            upDownElement.appendChild(upBtn);\n            upDownElement.appendChild(downBtn);\n            controlElement.appendChild(upDownElement);\n        }\n        else {\n            dndElement = document.createElement(\"div\");\n            dndElement.classList.add(\"a-dnd-element\");\n            dndElement.innerHTML = \"&vellip;\";\n            controlElement.appendChild(dndElement);\n        }\n        var deleteButton = document.createElement(\"button\");\n        deleteButton.classList.add(\"a-delete-button\");\n        deleteButton.addEventListener(\"click\", this.requestDeleteOption(index));\n        deleteButton.innerHTML = \"&#x1F5D1;\";\n        controlElement.appendChild(deleteButton);\n        return { container: controlElement, dndHandleElement: dndElement };\n    };\n    RPGDOMHelpers.prototype.performDrop = function (answerIndex, dropIndex) {\n        if (dropIndex > answerIndex) {\n            dropIndex--;\n        }\n        var old = this.currentGraphNode.o[answerIndex];\n        this.currentGraphNode.o[answerIndex] = this.currentGraphNode.o[dropIndex];\n        this.currentGraphNode.o[dropIndex] = old;\n        // Re-build the list : )\n        this.updateAnswerOptions();\n        this.editorHelpers.pb.redraw();\n    };\n    RPGDOMHelpers.prototype.requestDeleteOption = function (index) {\n        var _self = this;\n        return function () {\n            _self.modal.setTitle(\"Delete option?\");\n            _self.modal.setBody(\"Do you really want to delete option #\".concat(index, \"?\"));\n            _self.modal.setFooter(\"\");\n            _self.modal.setActions([\n                modal_1.Modal.ACTION_CANCEL,\n                {\n                    label: \"Yes\",\n                    action: function () {\n                        _self.modal.close();\n                        _self.handleDeleteOption(index);\n                    }\n                }\n            ]);\n            _self.modal.open();\n        };\n    };\n    RPGDOMHelpers.prototype.handleDeleteOption = function (index) {\n        this.currentGraphNode.o.splice(index, 1);\n        this.updateAnswerOptions();\n        this.editorHelpers.pb.redraw();\n    };\n    RPGDOMHelpers.prototype.makeADropArea = function (dropIndex, drop, onDragOver, onDragLeave) {\n        var dropArea = document.createElement(\"div\");\n        dropArea.setAttribute(\"data-dropindex\", \"\".concat(dropIndex));\n        dropArea.classList.add(\"a-droparea\", \"droppable\");\n        dropArea.addEventListener(\"drop\", drop);\n        dropArea.addEventListener(\"dragover\", onDragOver);\n        dropArea.addEventListener(\"dragleave\", onDragLeave);\n        return dropArea;\n    };\n    RPGDOMHelpers.prototype.createNodeSelectElement = function (currentKey, selectedKey) {\n        var selectElement = document.createElement(\"select\");\n        if (!this.editorHelpers.dialogConfigWithPositions) {\n            console.warn(\"Warning: cannout populate nodeSelectElement. No dialogConfig set.\");\n        }\n        else {\n            var optionElement = this.createNodeSelectOptionElement(\"\", false, null, false);\n            selectElement.appendChild(optionElement);\n            for (var key in this.editorHelpers.dialogConfigWithPositions.graph) {\n                if (!this.editorHelpers.dialogConfigWithPositions.graph.hasOwnProperty(key)) {\n                    return;\n                }\n                var questionaire = this.editorHelpers.dialogConfigWithPositions.graph[key];\n                var optionElement_1 = this.createNodeSelectOptionElement(questionaire.q, key === currentKey, key, key === selectedKey);\n                selectElement.appendChild(optionElement_1);\n            }\n        }\n        return selectElement;\n    };\n    RPGDOMHelpers.prototype.createNodeSelectOptionElement = function (questionaireText, isCurrent, key, isSelected) {\n        var optionElement = document.createElement(\"option\");\n        optionElement.setAttribute(\"value\", key);\n        optionElement.innerHTML = \"\".concat(key !== null && key !== void 0 ? key : \"\", \": \").concat(editorHelpers_1.EditorHelper.ellipsify(questionaireText, 20));\n        if (isCurrent) {\n            optionElement.setAttribute(\"disabled\", \"true\");\n        }\n        if (isSelected) {\n            optionElement.setAttribute(\"selected\", \"true\");\n        }\n        return optionElement;\n    };\n    return RPGDOMHelpers;\n}());\nexports.RPGDOMHelpers = RPGDOMHelpers;\n//# sourceMappingURL=domHelpers.js.map","\"use strict\";\n/**\n * Helpers for the graph editor.\n *\n * @require PlotBoilerplate\n *\n * @author   Ikaros Kappler\n * @date     2023-07-28\n * @version  1.0.0\n **/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EditorHelper = void 0;\nvar plotboilerplate_1 = require(\"plotboilerplate\");\nvar domHelpers_1 = require(\"./domHelpers\");\nvar editorRenderer_1 = require(\"./editorRenderer\");\nvar metaHelpers_1 = require(\"./metaHelpers\");\nvar EditorHelper = /** @class */ (function () {\n    function EditorHelper(editor, pb, boxSize) {\n        // TODO: convert into node identifyer\n        /**\n         * The highlighted node's name or null if none is highlighted.\n         * Used to highlight nodes when the mouse is over.\n         */\n        this.highlightedNodeName = null;\n        /**\n         * The highlighted node itself or null if none is highligted.\n         * Used to determine rendering colors.\n         */\n        this.highlightedNode = null;\n        /**\n         * The selected node's name or null if none is selected.\n         * Used to determine the node editor's contents.\n         */\n        this.selectedNodeName = null;\n        /**\n         * The selected node itself or null if none is selected.\n         * Used to determine the node editor's contents.\n         */\n        this.selectedNode = null;\n        /**\n         * The currently selected option or null if none is selected.\n         * Used to re-connect an option with a new successor node.\n         */\n        this.selectedOption = null;\n        /**\n         * The currently highlighted option.\n         * Used to draw on-mouse-over options with a different color.\n         */\n        this.hightlightedOption = null;\n        /**\n         * The current mouse position (or null if mouse is not on canvas).\n         * In local relative coordinate system.\n         */\n        this.relativeMousePosition = null;\n        this.editor = editor;\n        this.pb = pb;\n        this.boxSize = boxSize;\n        this.selectedNodeName = null;\n        this.domHelper = new domHelpers_1.RPGDOMHelpers(this);\n        this.metaHelpers = new metaHelpers_1.DialogueMetaHelpers(this);\n    }\n    EditorHelper.prototype.setDialogConfig = function (dialogConfigWithPositions) {\n        this.dialogConfigWithPositions = dialogConfigWithPositions;\n    };\n    EditorHelper.prototype.setSelectedOption = function (selectedOption, noRedraw) {\n        console.log(\"Set selected option\", selectedOption);\n        this.selectedOption = selectedOption;\n        if (!noRedraw) {\n            this.pb.redraw();\n        }\n    };\n    EditorHelper.prototype.setHighlightedOption = function (hightlightedOption) {\n        // const isRedrawRequired = this.hightlightedOption !== hightlightedOption;\n        var isRedrawRequired = !this.isEqualOptionIdentifyer(this.hightlightedOption, hightlightedOption);\n        this.hightlightedOption = hightlightedOption;\n        if (isRedrawRequired) {\n            this.pb.redraw();\n        }\n    };\n    EditorHelper.prototype.setHighlightedNode = function (nodeName, noRedraw) {\n        this.highlightedNodeName = nodeName;\n        this.highlightedNode = nodeName ? this.dialogConfigWithPositions.graph[nodeName] : null;\n        if (!noRedraw) {\n            this.pb.redraw();\n        }\n    };\n    /**\n     * A helper function to create random safe positions in the viewport area.\n     * @param {PlotBoilerplate} pb\n     * @param {XYDimension} boxSize\n     * @returns\n     */\n    EditorHelper.prototype.getRandomPosition = function () {\n        var viewport = this.pb.viewport();\n        return {\n            x: viewport.min.x + this.boxSize.width + (viewport.width - 2 * this.boxSize.width) * Math.random(),\n            y: viewport.min.y + this.boxSize.height + (viewport.height - 2 * this.boxSize.height) * Math.random()\n        };\n    };\n    EditorHelper.prototype.setSelectedNode = function (nodeName, node) {\n        this.selectedNodeName = nodeName;\n        this.selectedNode = node;\n        if (nodeName && node) {\n            // this.domHelper.editorElement.classList.remove(\"d-none\");\n            this.domHelper.toggleVisibility(true);\n            this.domHelper.showAnswerOptions(nodeName, this.selectedNode);\n        }\n        else {\n            // this.domHelper.editorElement.classList.add(\"d-none\");\n            this.domHelper.toggleVisibility(false);\n            this.domHelper.showAnswerOptions(null, null);\n        }\n        this.pb.redraw();\n    };\n    /**\n     * A helper function to make sure all graph nodes have valid positions. Those without\n     * valid positions (eg like those being loaded from an incomplete JSON file) will be\n     * assigned to a random position inside the viewport.\n     *\n     * @param {PlotBoilerplate} pb\n     * @param {XYDimension} boxSize\n     * @returns\n     */\n    EditorHelper.prototype.enrichPositions = function (baseConfig) {\n        // Clone?\n        var configWithPositions = baseConfig;\n        for (var nodeName in configWithPositions.graph) {\n            var graphNode = configWithPositions.graph[nodeName];\n            if (!graphNode) {\n                console.warn(\"Warning: graph node \".concat(nodeName, \" is null or undefined!\"));\n                continue;\n            }\n            // Anonymous member check\n            if (!graphNode.hasOwnProperty(\"editor\")) {\n                graphNode.editor = { position: this.getRandomPosition() };\n            }\n            else if (!graphNode.editor.hasOwnProperty(\"position\")) {\n                graphNode.editor.position = this.getRandomPosition();\n            }\n            else {\n                if (!graphNode.editor.position.hasOwnProperty(\"x\") || isNaN(graphNode.editor.position.x)) {\n                    graphNode.editor.position.x = this.getRandomPosition().x;\n                }\n                if (!graphNode.editor.position.hasOwnProperty(\"y\") || isNaN(graphNode.editor.position.y)) {\n                    graphNode.editor.position.y = this.getRandomPosition().y;\n                }\n            }\n        }\n        return configWithPositions;\n    };\n    /**\n     * Check if the meta data is valid and – if not – add missing default fields.\n     * @param dialogueConfig\n     */\n    EditorHelper.prototype.enrichMetaData = function (dialogueConfig) {\n        var result = dialogueConfig;\n        if (!dialogueConfig.hasOwnProperty(\"meta\")) {\n            result.meta = { name: \"noname\", npcs: [] };\n        }\n        if (!result.meta.npcs) {\n            result.meta.npcs = [];\n        }\n        if (result.meta.npcs.length === 0) {\n            result.meta.npcs.push({ name: \"NPC #0\" });\n        }\n    };\n    EditorHelper.prototype.isPosInGraphNodeBox = function (pos, graphNode) {\n        return (graphNode.editor.position.x <= pos.x &&\n            graphNode.editor.position.y <= pos.y &&\n            graphNode.editor.position.x + this.boxSize.width > pos.x &&\n            graphNode.editor.position.y + this.boxSize.height > pos.y);\n    };\n    EditorHelper.prototype.isPosInOptionNodeBox = function (pos, graphNode, optionIndex) {\n        editorRenderer_1.EditorRenderer.OPTION_OFFSET_X;\n        return (graphNode.editor.position.x + editorRenderer_1.EditorRenderer.OPTION_OFFSET_X <= pos.x &&\n            graphNode.editor.position.y + (optionIndex + 1) * this.boxSize.height <= pos.y &&\n            graphNode.editor.position.x + editorRenderer_1.EditorRenderer.OPTION_OFFSET_X + this.boxSize.width > pos.x &&\n            graphNode.editor.position.y + (optionIndex + 1) * this.boxSize.height + this.boxSize.height > pos.y);\n    };\n    EditorHelper.prototype.locateNodeBoxNameAtPos = function (pos) {\n        for (var nodeName in this.dialogConfigWithPositions.graph) {\n            var graphNode = this.dialogConfigWithPositions.graph[nodeName];\n            if (this.isPosInGraphNodeBox(pos, graphNode)) {\n                return nodeName;\n            }\n        }\n        return null;\n    };\n    EditorHelper.prototype.locateOptionBoxNameAtPos = function (pos) {\n        for (var nodeName in this.dialogConfigWithPositions.graph) {\n            var graphNode = this.dialogConfigWithPositions.graph[nodeName];\n            for (var i = 0; i < graphNode.o.length; i++) {\n                if (this.isPosInOptionNodeBox(pos, graphNode, i)) {\n                    return { nodeName: nodeName, node: graphNode, optionIndex: i };\n                }\n            }\n        }\n        return null;\n    };\n    EditorHelper.prototype.isNodeHighlighted = function (nodName) {\n        return this.highlightedNodeName === nodName;\n    };\n    EditorHelper.prototype.isOptionHighlighted = function (nodeName, optionIndex) {\n        return (this.hightlightedOption &&\n            this.hightlightedOption.nodeName === nodeName &&\n            this.hightlightedOption.optionIndex === optionIndex);\n    };\n    EditorHelper.prototype.isOptionSelected = function (nodeName, optionIndex) {\n        return this.selectedOption && this.selectedOption.nodeName === nodeName && this.selectedOption.optionIndex === optionIndex;\n    };\n    EditorHelper.prototype.addNewDialogueNode = function () {\n        // Place two box units to the right if currently there is a selected node.\n        // Otherwise random position.\n        var position = this.selectedNode\n            ? {\n                x: this.selectedNode.editor.position.x + 2 * this.boxSize.width,\n                y: this.selectedNode.editor.position.y + this.boxSize.height\n            }\n            : this.getRandomPosition();\n        var nodeName = this.randomNodeKey();\n        var newNode = {\n            q: \"\",\n            o: [{ a: \"\", next: null }],\n            editor: {\n                position: position\n            }\n        };\n        this.dialogConfigWithPositions.graph[nodeName] = newNode;\n        this.selectedNodeName = nodeName;\n        this.selectedNode = newNode;\n        this.domHelper.showAnswerOptions(nodeName, newNode);\n        this.pb.redraw();\n    };\n    EditorHelper.prototype.removeNewDialogueNode = function (nodeName) {\n        delete this.dialogConfigWithPositions.graph[nodeName];\n        this.selectedNodeName = null;\n        this.selectedNode = null;\n        this.domHelper.showAnswerOptions(null, null);\n        this.pb.redraw();\n    };\n    EditorHelper.prototype.boxMovehandler = function () {\n        var _this = this;\n        var _self = this;\n        // +---------------------------------------------------------------------------------\n        // | Add a mouse listener to track the mouse position.\n        // +-------------------------------\n        var mouseDownPos = null;\n        var lastMouseDownPos = null;\n        var draggingNode = null;\n        var draggingNodeName = null;\n        var handler = new plotboilerplate_1.MouseHandler(this.pb.eventCatcher)\n            .down(function (evt) {\n            mouseDownPos = _this.pb.transformMousePosition(evt.params.mouseDownPos.x, evt.params.mouseDownPos.y);\n            lastMouseDownPos = { x: evt.params.mouseDownPos.x, y: evt.params.mouseDownPos.y };\n            draggingNodeName = _this.locateNodeBoxNameAtPos(mouseDownPos);\n            if (draggingNodeName) {\n                draggingNode = _this.dialogConfigWithPositions.graph[draggingNodeName];\n            }\n        })\n            .up(function (_evt) {\n            mouseDownPos = null;\n            draggingNode = null;\n        })\n            .drag(function (evt) {\n            if (!mouseDownPos || !draggingNode) {\n                return;\n            }\n            // const diff = evt.params.dragAmount;\n            draggingNode.editor.position.x += evt.params.dragAmount.x / _this.pb.draw.scale.x;\n            draggingNode.editor.position.y += evt.params.dragAmount.y / _this.pb.draw.scale.y;\n        })\n            .move(function (evt) {\n            // console.log(\"move\", evt);\n            // Check if mouse pointer hovers over an option -> set highlighted\n            var mouseMovePos = _this.pb.transformMousePosition(evt.params.pos.x, evt.params.pos.y);\n            _self.relativeMousePosition = { x: mouseMovePos.x, y: mouseMovePos.y };\n            var hoveringOptionIdentifyer = _this.locateOptionBoxNameAtPos(mouseMovePos);\n            // Can be null\n            _self.setHighlightedOption(hoveringOptionIdentifyer);\n            if (!hoveringOptionIdentifyer) {\n                // Check if hover on graph node\n                var hoveringNodeName = _this.locateNodeBoxNameAtPos(mouseMovePos);\n                _this.setHighlightedNode(hoveringNodeName);\n            }\n            else {\n                _this.setHighlightedNode(null);\n            }\n        })\n            .click(function (evt) {\n            // Stop if mouse was moved\n            console.log(\"lastMouseDownPos\", lastMouseDownPos, \" evt.params.pos\", evt.params.pos);\n            if (lastMouseDownPos && (lastMouseDownPos.x !== evt.params.pos.x || lastMouseDownPos.y !== evt.params.pos.y)) {\n                return;\n            }\n            // Check if mouse pointer hovers over an option -> set selected AND select node\n            var mouseClickPos = _this.pb.transformMousePosition(evt.params.pos.x, evt.params.pos.y);\n            _self.handleClick(mouseClickPos);\n        });\n        return handler;\n    };\n    EditorHelper.prototype.handleClick = function (mouseClickPos) {\n        var clickedOptionIdentifyer = this.locateOptionBoxNameAtPos(mouseClickPos);\n        if (clickedOptionIdentifyer) {\n            this.setSelectedOption(clickedOptionIdentifyer);\n        }\n        else {\n            // Otherwise (no option was clicked) check if a node was clicked directly.\n            var clickedNodeName = this.locateNodeBoxNameAtPos(mouseClickPos);\n            console.log(\"Click\", clickedNodeName);\n            if (clickedNodeName) {\n                if (this.selectedOption) {\n                    this.handleOptionReconnect(clickedNodeName);\n                    this.pb.redraw();\n                }\n                else {\n                    this.setSelectedNode(clickedNodeName, this.dialogConfigWithPositions.graph[clickedNodeName]);\n                    // this.pb.redraw();\n                }\n            }\n            else {\n                this.setSelectedNode(null, null);\n                // this.selectedNode = null;\n                // this.pb.redraw();\n            }\n            this.setSelectedOption(null, false);\n        }\n    };\n    EditorHelper.prototype.handleOptionReconnect = function (clickedNodeName) {\n        if (!this.selectedOption) {\n            // Actually this fuction should not be called at all in that case.\n            console.warn(\"Warn: cannot reconnect option when no option is selected.\");\n        }\n        var graph = this.dialogConfigWithPositions.graph;\n        var clickedNode = graph[clickedNodeName];\n        var sourceNode = this.selectedOption.node;\n        console.log(\"Reconnect\");\n        sourceNode.o[this.selectedOption.optionIndex].next = clickedNodeName;\n        this.domHelper.showAnswerOptions(this.selectedNodeName, this.selectedNode);\n    };\n    EditorHelper.prototype.isEqualOptionIdentifyer = function (identA, identB) {\n        if ((!identA && identB) || (identA && !identB)) {\n            return false;\n        }\n        if ((typeof identA === \"undefined\" && typeof identB !== \"undefined\") ||\n            (typeof identA !== \"undefined\" && typeof identB === \"undefined\")) {\n            return false;\n        }\n        if (identA === identB || (typeof identA === \"undefined\" && typeof identB === \"undefined\")) {\n            return true;\n        }\n        return identA.nodeName === identB.nodeName && identA.optionIndex === identB.optionIndex;\n    };\n    EditorHelper.prototype.renameGraphNode = function (oldName, newName) {\n        if (!this.dialogConfigWithPositions.graph.hasOwnProperty(oldName)) {\n            console.warn(\"Warning: cannot rename node, because old name does not exist.\", oldName);\n            return false;\n        }\n        if (oldName === \"intro\") {\n            console.warn(\"Warning: cannot rename node, because 'intro' must not be renamed'.\");\n            return false;\n        }\n        if (this.dialogConfigWithPositions.graph.hasOwnProperty(newName)) {\n            console.warn(\"Warning: cannot rename node, because new name already exists.\", newName);\n            return false;\n        }\n        if (newName === oldName) {\n            console.warn(\"Warning: cannot rename node, because old name and new name are the same.\", oldName);\n            return false;\n        }\n        var graphNode = this.dialogConfigWithPositions.graph[oldName];\n        this.dialogConfigWithPositions.graph[newName] = graphNode;\n        delete this.dialogConfigWithPositions.graph[oldName];\n        // Update all references\n        for (var nodeName in this.dialogConfigWithPositions.graph) {\n            if (!this.dialogConfigWithPositions.graph.hasOwnProperty(nodeName)) {\n                continue;\n            }\n            var tmpNode = this.dialogConfigWithPositions.graph[nodeName];\n            for (var j = 0; j < tmpNode.o.length; j++) {\n                if (tmpNode.o[j].next === oldName) {\n                    tmpNode.o[j].next = newName;\n                }\n            }\n        }\n        // Update local selected fields\n        if (oldName === this.selectedNodeName) {\n            this.selectedNodeName = newName;\n            this.selectedNode = this.dialogConfigWithPositions.graph[newName];\n        }\n        this.pb.redraw();\n        return true;\n    };\n    EditorHelper.ellipsify = function (text, maxLength) {\n        if (!text || text.length <= maxLength) {\n            return text;\n        }\n        return \"\".concat(text.substring(0, maxLength), \"...\");\n    };\n    EditorHelper.fromObject = function (object) {\n        // Must be of type object\n        if (typeof object !== \"object\") {\n            throw \"Cannot convert non-objects to dialogue config: type is \".concat(typeof object, \".\");\n        }\n        // Must have a 'graph' member.\n        if (!object.hasOwnProperty(\"graph\")) {\n            throw \"Cannot convert object to dialogue config: object missing member `graph`.\";\n        }\n        var graph = object[\"graph\"];\n        // Check if 'intro' is present?\n        // All members must be of correct type\n        for (var key in object) {\n            if (!object.hasOwnProperty(key)) {\n                continue;\n            }\n            var questionaire = object[key];\n            if (typeof questionaire !== \"object\") {\n                throw \"Cannot converto bject to dialogue config: all graph members must be objects.\";\n            }\n            // Check if 'q' (string) and 'o' (array) attributes are present?\n        }\n        return object;\n    };\n    EditorHelper.removePositions = function (dialogueConfig) {\n        var clone = JSON.parse(JSON.stringify(dialogueConfig));\n        for (var nodeName in clone.graph) {\n            var node = clone.graph[nodeName];\n            if (node.hasOwnProperty(\"editor\")) {\n                delete node[\"editor\"];\n            }\n        }\n        return clone;\n    };\n    EditorHelper.prototype.randomNodeKey = function () {\n        var keys = Object.keys(this.dialogConfigWithPositions.graph);\n        var count = keys.length;\n        var key = \"dia_\" + count;\n        while (this.dialogConfigWithPositions.graph.hasOwnProperty(key)) {\n            key = \"dia_\" + count;\n            count++;\n        }\n        return key;\n    };\n    return EditorHelper;\n}());\nexports.EditorHelper = EditorHelper;\n//# sourceMappingURL=editorHelpers.js.map","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EditorRenderer = void 0;\n/**\n * A renderer for the graph editor.\n *\n * @require PlotBoilerplate\n *\n * @author   Ikaros Kappler\n * @date     2023-07-28\n * @version  1.0.0\n **/\nvar plotboilerplate_1 = require(\"plotboilerplate\");\nvar editorHelpers_1 = require(\"./editorHelpers\");\nvar getContrastColor_1 = require(\"plotboilerplate/src/cjs/utils/algorithms/getContrastColor\");\nvar Color_1 = require(\"plotboilerplate/src/cjs/utils/datastructures/Color\");\n// import { FileDrop } from \"plotboilerplate/src/cjs/utils/io/FileDrop\";\nvar EditorRenderer = /** @class */ (function () {\n    function EditorRenderer(pb, boxSize, editorHelpers, isDarkmode) {\n        this.TEXT_MAX_LENGTH = 20;\n        this.pb = pb;\n        this.boxSize = boxSize;\n        this.editorHelpers = editorHelpers;\n        this.fontOptions = {\n            color: \"black\",\n            fontFamily: \"Arial\",\n            fontSize: 12,\n            fontStyle: \"italic\",\n            fontWeight: \"normal\",\n            lineHeight: 26,\n            textAlign: \"left\",\n            rotation: 0\n        };\n        var backgroundColor = isDarkmode ? Color_1.Color.parse(\"#000000\") : Color_1.Color.parse(\"#ffffff\");\n        this.fontOptions.color = (0, getContrastColor_1.getContrastColor)(backgroundColor).setAlpha(0.8).cssRGBA();\n    }\n    EditorRenderer.prototype.renderBoxes = function (dialogConfig) {\n        var nodeNames = Object.keys(dialogConfig.graph);\n        var count = nodeNames.length;\n        for (var i = 0; i < count; i++) {\n            var nodeName = nodeNames[i];\n            var graphNode = dialogConfig.graph[nodeName];\n            this.renderGraphNode(nodeName, graphNode);\n            this.renderOptions(nodeName, graphNode);\n        }\n        // Render suggested new connection\n        this.renderSuggestedConnection();\n    };\n    EditorRenderer.prototype.renderSuggestedConnection = function () {\n        if (this.editorHelpers.selectedOption) {\n            var isMousePosInsideOption = this.editorHelpers.isPosInOptionNodeBox(this.editorHelpers.relativeMousePosition, this.editorHelpers.selectedOption.node, this.editorHelpers.selectedOption.optionIndex);\n            var bezierTargetPosition = this.editorHelpers.highlightedNode\n                ? this.editorHelpers.highlightedNode.editor.position\n                : isMousePosInsideOption\n                    ? null\n                    : this.editorHelpers.relativeMousePosition;\n            if (bezierTargetPosition) {\n                this.drawBezierConnection(this.editorHelpers.selectedOption.node, this.editorHelpers.selectedOption.optionIndex, bezierTargetPosition, true, true);\n            }\n        }\n    };\n    EditorRenderer.prototype.renderGraphNode = function (nodeName, graphNode) {\n        var isNodeSelected = this.editorHelpers.selectedNodeName === nodeName;\n        var isNodeHighlighted = this.editorHelpers.isNodeHighlighted(nodeName);\n        this.pb.fill.text(nodeName, graphNode.editor.position.x, graphNode.editor.position.y - this.boxSize.height, __assign(__assign({}, this.fontOptions), { color: \"grey\" }));\n        this.pb.draw.rect(graphNode.editor.position, this.boxSize.width, this.boxSize.height, isNodeSelected ? \"rgba(255,128,0,1.0)\" : \"rgba(0,255,0,1.0)\", 1.0);\n        // Show initial and terminal nodes with fill color\n        if (!graphNode.o || graphNode.o.length === 0 || nodeName === \"intro\" || isNodeHighlighted) {\n            this.pb.fill.rect({ x: graphNode.editor.position.x, y: graphNode.editor.position.y }, this.boxSize.width, this.boxSize.height, isNodeHighlighted ? \"rgba(255,128,0,0.5)\" : isNodeSelected ? \"rgba(255,128,0,0.3)\" : \"rgba(0,255,0,0.3)\", 1.0);\n        }\n        this.pb.fill.text(graphNode.q ? (isNodeSelected ? graphNode.q : editorHelpers_1.EditorHelper.ellipsify(graphNode.q, this.TEXT_MAX_LENGTH)) : \"-no text-\", graphNode.editor.position.x, graphNode.editor.position.y, this.fontOptions);\n    };\n    EditorRenderer.prototype.renderOptions = function (nodeName, graphNode) {\n        var isNodeSelected = this.editorHelpers.selectedNodeName === nodeName;\n        var offsetY = graphNode.editor.position.y + this.boxSize.height;\n        var offsetX = graphNode.editor.position.x + EditorRenderer.OPTION_OFFSET_X;\n        for (var j = 0; j < graphNode.o.length; j++) {\n            var option = graphNode.o[j];\n            // Render highlighted option?\n            var otherOptionIsSelected = this.editorHelpers.selectedOption !== null && !this.editorHelpers.isOptionSelected(nodeName, j);\n            var isHighlighted = !otherOptionIsSelected && this.editorHelpers.isOptionHighlighted(nodeName, j);\n            var isSelected = this.editorHelpers.isOptionSelected(nodeName, j);\n            if (isHighlighted || isSelected) {\n                this.pb.fill.rect({ x: offsetX, y: offsetY }, this.boxSize.width, this.boxSize.height, \"rgba(255,192,0,0.5)\", 1);\n            }\n            this.pb.draw.rect({ x: offsetX, y: offsetY }, this.boxSize.width, this.boxSize.height, \"grey\", 1);\n            this.pb.fill.text(option.a ? (isNodeSelected ? option.a : editorHelpers_1.EditorHelper.ellipsify(option.a, this.TEXT_MAX_LENGTH)) : \"-no text-\", offsetX, offsetY, __assign(__assign({}, this.fontOptions), { color: isHighlighted || isSelected ? \"black\" : \"grey\" }));\n            if (isHighlighted || isSelected) {\n                // Draw connect indicator when highlighted\n                var zA = new plotboilerplate_1.Vertex(graphNode.editor.position).addXY(this.boxSize.width + 16, this.boxSize.height / 2.0 + (j + 1) * (this.boxSize.height + 2) - 2);\n                this.pb.fill.circle(zA, 5, \"orange\");\n            }\n            offsetY += this.boxSize.height + 2;\n        }\n    };\n    EditorRenderer.prototype.renderConnections = function (dialogConfig) {\n        var nodeNames = Object.keys(dialogConfig.graph);\n        var count = nodeNames.length;\n        for (var i = 0; i < count; i++) {\n            var nodeName = nodeNames[i];\n            var graphNode = dialogConfig.graph[nodeName];\n            for (var j = 0; j < graphNode.o.length; j++) {\n                var successorName = graphNode.o[j].next;\n                if (!successorName) {\n                    continue;\n                }\n                var successorNode = dialogConfig.graph[successorName];\n                if (!successorNode) {\n                    continue;\n                }\n                var isHighlighted = this.editorHelpers.isOptionHighlighted(nodeName, j);\n                var otherOptionIsSelected = this.editorHelpers.selectedOption !== null && !this.editorHelpers.isOptionSelected(nodeName, j);\n                var isSelected = this.editorHelpers.isOptionSelected(nodeName, j);\n                // this.drawLinearConnection(graphNode, successorNode, j);\n                this.drawBezierConnection(graphNode, j, successorNode.editor.position, isHighlighted && !otherOptionIsSelected, isSelected);\n            }\n        }\n    };\n    EditorRenderer.prototype.drawBezierConnection = function (graphNode, j, successorNodePosition, isHighlighted, isSelected) {\n        // Construct Bézier handles.\n        var zA = new plotboilerplate_1.Vertex(graphNode.editor.position).addXY(this.boxSize.width + 16, this.boxSize.height / 2.0 + (j + 1) * (this.boxSize.height + 2) - 2);\n        var zB = new plotboilerplate_1.Vertex(successorNodePosition);\n        var cA = zA.clone().addXY(50, 0);\n        var cB = zB.clone().subXY(50, 50);\n        var isCanvas = this.pb.canvas instanceof HTMLCanvasElement;\n        if (isCanvas) {\n            // Maybe future versions of PlotBoilerplate support this for Canvas & SVG nodes\n            if (isHighlighted) {\n                this.pb.draw.ctx.setLineDash([10, 6]);\n            }\n            else {\n                this.pb.draw.ctx.setLineDash([0]);\n            }\n        }\n        this.cubicBezierArrow(zA, zB, cA, cB, isHighlighted || isSelected ? \"rgba(0,192,255,0.5)\" : \"rgba(255,192,0,0.5)\", 2);\n        if (isCanvas) {\n            this.pb.draw.ctx.setLineDash([0]);\n        }\n    };\n    /**\n     * Draw a line and an arrow at the end (zB) of the given line with the specified (CSS-) color.\n     *\n     * @method arrow\n     * @param {Vertex} zA - The start point of the arrow-line.\n     * @param {Vertex} zB - The end point of the arrow-line.\n     * @param {string} color - Any valid CSS color string.\n     * @param {number=} lineWidth - (optional) The line width to use; default is 1.\n     * @return {void}\n     * @instance\n     * @memberof drawutils\n     **/\n    EditorRenderer.prototype.cubicBezierArrow = function (zA, zB, cA, cB, color, lineWidth) {\n        var _this = this;\n        var headlen = 8; // length of head in pixels\n        var vertices = plotboilerplate_1.Vertex.utils\n            .buildArrowHead(cB, zB, headlen, 1.0, 1.0) // this.pb.draw.scale.x, this.pb.draw.scale.y);\n            .map(function (vertex) {\n            return vertex.scale(1.0 / _this.pb.draw.scale.x, zB);\n        });\n        this.pb.draw.cubicBezier(zA, zB, cA, cB, color, lineWidth);\n        this.pb.fill.polyline(vertices, false, color, lineWidth);\n        // Draw bezier control lines?\n        // this.pb.draw.line(zA, cA, \"grey\", 1);\n        // this.pb.draw.line(zB, cB, \"grey\", 1);\n    };\n    EditorRenderer.OPTION_OFFSET_X = 16;\n    return EditorRenderer;\n}());\nexports.EditorRenderer = EditorRenderer;\n//# sourceMappingURL=editorRenderer.js.map","globalThis.gup = globalThis.gup || require(\"./gup\").gup;\nconsole.log(\"gup\", gup);\nglobalThis.detectDarkMode = require(\"./detectDarkMode\").detectDarkMode;\nglobalThis.RPGDialogueLogic = require(\"./RPGDialogueLogic\").RPGDialogueLogic;\nglobalThis.RPGDOMHelpers = require(\"./domHelpers\").RPGDOMHelpers;\nglobalThis.DialogueMetaHelpers = require(\"./metaHelpers\").DialogueMetaHelpers;\nglobalThis.Modal = require(\"./modal\").Modal;\nglobalThis.EditorHelper = require(\"./editorHelpers\").EditorHelper;\nglobalThis.TouchHandler = require(\"./TouchHandler\").TouchHandler;\nglobalThis.Editor = require(\"./DefaultDialogueRenderer\").DefaultDialogueRenderer;\nglobalThis.Editor = require(\"./Editor\").Editor;\nglobalThis.RPGDialogue = require(\"./index\").default;\n\n// module.exports = require(\"./index\").RPGDialogue;\n\nconsole.log(\"RPGDialogue\", RPGDialogue);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.gup = void 0;\n// Get the URI GET params as an assoc.\n//\n// A nicer version with regex\n// Found at\n//    https://stackoverflow.com/questions/979975/how-to-get-the-value-from-the-get-parameters?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa\nvar gup = function () {\n    var vars = {};\n    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (_m, key, value) {\n        var args = [];\n        for (var _i = 3; _i < arguments.length; _i++) {\n            args[_i - 3] = arguments[_i];\n        }\n        vars[key] = value;\n        return value;\n    });\n    return vars;\n};\nexports.gup = gup;\n//# sourceMappingURL=gup.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RPGDialogue = void 0;\nvar gup_1 = require(\"./gup\");\nvar detectDarkMode_1 = require(\"./detectDarkMode\");\nvar RPGDialogueLogic_1 = require(\"./RPGDialogueLogic\");\nvar domHelpers_1 = require(\"./domHelpers\");\nvar metaHelpers_1 = require(\"./metaHelpers\");\nvar modal_1 = require(\"./modal\");\nvar editorHelpers_1 = require(\"./editorHelpers\");\nvar TouchHandler_1 = require(\"./TouchHandler\");\nvar editorRenderer_1 = require(\"./editorRenderer\");\nvar Editor_1 = require(\"./Editor\");\nvar RPGDialogueSequence_1 = require(\"./RPGDialogueSequence\");\n__exportStar(require(\"./gup\"), exports);\n__exportStar(require(\"./detectDarkMode\"), exports);\n__exportStar(require(\"./RPGDialogueLogic\"), exports);\n__exportStar(require(\"./domHelpers\"), exports);\n__exportStar(require(\"./metaHelpers\"), exports);\n__exportStar(require(\"./modal\"), exports);\n__exportStar(require(\"./editorHelpers\"), exports);\n__exportStar(require(\"./TouchHandler\"), exports);\n__exportStar(require(\"./editorRenderer\"), exports);\n__exportStar(require(\"./Editor\"), exports);\n__exportStar(require(\"./RPGDialogueSequence\"), exports);\nexports.RPGDialogue = {\n    gup: gup_1.gup,\n    detectDarkMode: detectDarkMode_1.detectDarkMode,\n    RPGDialogueLogic: RPGDialogueLogic_1.RPGDialogueLogic,\n    RPGDOMHelpers: domHelpers_1.RPGDOMHelpers,\n    DialogueMetaHelpers: metaHelpers_1.DialogueMetaHelpers,\n    Modal: modal_1.Modal,\n    EditorHelper: editorHelpers_1.EditorHelper,\n    TouchHandler: TouchHandler_1.TouchHandler,\n    EditorRenderer: editorRenderer_1.EditorRenderer,\n    Editor: Editor_1.Editor,\n    RPGDialogueSequence: RPGDialogueSequence_1.RPGDialogueSequence\n};\n//# sourceMappingURL=index.js.map","\"use strict\";\n/**\n * Helper to edit dialogue meta data.\n *\n * @author  Ikaros Kappler\n * @date    2023-08-09\n * @version 1.0.0\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DialogueMetaHelpers = void 0;\nvar modal_1 = require(\"./modal\");\nvar DialogueMetaHelpers = /** @class */ (function () {\n    function DialogueMetaHelpers(editorHelpers) {\n        this.editorHelpers = editorHelpers;\n        document.getElementById(\"b-configure-meta\").addEventListener(\"click\", this.handleModalOpen());\n    }\n    DialogueMetaHelpers.prototype.handleModalOpen = function () {\n        var _this = this;\n        var _self = this;\n        return function () {\n            _self.metaCopy = DialogueMetaHelpers.cloneMeta(_this.editorHelpers.dialogConfigWithPositions.meta);\n            _self.editorHelpers.domHelper.modal.setTitle(\"Dialogue Config Meta Data\");\n            _self.editorHelpers.domHelper.modal.setBody(_self.buildMetaBody());\n            _self.editorHelpers.domHelper.modal.setFooter(\"\");\n            _self.editorHelpers.domHelper.modal.setActions([{ label: \"Save\", action: _self.handleSave() }, modal_1.Modal.ACTION_CANCEL]);\n            _self.editorHelpers.domHelper.modal.open();\n        };\n    };\n    DialogueMetaHelpers.prototype.updateModalBody = function () {\n        var newBody = this.buildMetaBody();\n        this.editorHelpers.domHelper.modal.setBody(newBody);\n    };\n    DialogueMetaHelpers.prototype.buildMetaBody = function () {\n        var metaBody = document.createElement(\"div\");\n        this.inputName = document.createElement(\"input\");\n        this.inputName.value = this.metaCopy.name;\n        this.inputName.addEventListener(\"change\", this.handleUpdateMetaName());\n        var nameLabel = document.createElement(\"div\");\n        nameLabel.innerHTML = \"Dialogue name\";\n        var npcContainer = document.createElement(\"div\");\n        npcContainer.classList.add(\"e-meta-npccontainer\");\n        this.inputsNpcNames = [];\n        for (var i = 0; i < this.metaCopy.npcs.length; i++) {\n            var container = document.createElement(\"div\");\n            var label = document.createElement(\"div\");\n            label.innerHTML = \"NPC #\".concat(i);\n            var npcNameInput = document.createElement(\"input\");\n            npcNameInput.value = this.metaCopy.npcs[i].name;\n            npcNameInput.addEventListener(\"change\", this.handleNpcNameChange(i));\n            var btnRemove = document.createElement(\"button\");\n            btnRemove.innerHTML = \"&#x1F5D1;\";\n            btnRemove.addEventListener(\"click\", this.handleDeleteNpc(i));\n            container.appendChild(label);\n            container.appendChild(npcNameInput);\n            container.appendChild(btnRemove);\n            npcContainer.appendChild(container);\n            this.inputsNpcNames.push(npcNameInput);\n        }\n        var btnAddNpc = document.createElement(\"button\");\n        btnAddNpc.innerHTML = \"Add NPC\";\n        btnAddNpc.addEventListener(\"click\", this.handleAddNpc());\n        metaBody.appendChild(nameLabel);\n        metaBody.appendChild(this.inputName);\n        metaBody.appendChild(npcContainer);\n        metaBody.appendChild(btnAddNpc);\n        return metaBody;\n    };\n    DialogueMetaHelpers.prototype.handleUpdateMetaName = function () {\n        var _self = this;\n        return function (event) {\n            _self.metaCopy.name = event.target.value;\n        };\n    };\n    DialogueMetaHelpers.prototype.handleNpcNameChange = function (index) {\n        var _self = this;\n        return function (event) {\n            _self.metaCopy.npcs[index].name = event.target.value;\n        };\n    };\n    DialogueMetaHelpers.prototype.handleDeleteNpc = function (index) {\n        var _self = this;\n        return function () {\n            _self.metaCopy.npcs.splice(index, 1);\n            _self.updateModalBody();\n        };\n    };\n    DialogueMetaHelpers.prototype.handleAddNpc = function () {\n        var _self = this;\n        return function () {\n            _self.metaCopy.npcs.push({ name: \"New NPC\" });\n            _self.updateModalBody();\n        };\n    };\n    DialogueMetaHelpers.prototype.handleSave = function () {\n        var _self = this;\n        return function () {\n            _self.editorHelpers.dialogConfigWithPositions.meta = _self.metaCopy;\n            _self.editorHelpers.domHelper.modal.close();\n            _self.editorHelpers.domHelper.updateNpcSelector();\n        };\n    };\n    DialogueMetaHelpers.cloneMeta = function (meta) {\n        var copy = {};\n        copy.name = meta.name;\n        copy.npcs = [];\n        for (var i = 0; i < meta.npcs.length; i++) {\n            copy.npcs.push({ name: meta.npcs[i].name });\n        }\n        return copy;\n    };\n    return DialogueMetaHelpers;\n}());\nexports.DialogueMetaHelpers = DialogueMetaHelpers;\n//# sourceMappingURL=metaHelpers.js.map","\"use strict\";\n/**\n * Original source: https://www.w3schools.com/howto/howto_css_modals.asp\n *\n * @requires modal.css\n *\n * Converted to a class by\n * @author   Ikaros Kappler\n * @date     2020-09-14\n * @modified 2023-08-09 Ported to typescript.\n * @version  1.1.0\n **/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Modal = void 0;\nvar Modal = /** @class */ (function () {\n    function Modal() {\n        this.modalElements = this.buildDOMNode(\"myModal-\" + Modal.MODAL_COUNTER++);\n    }\n    Modal.prototype.setTitle = function (title) {\n        this.modalElements.modal.header.content.innerHTML = title;\n    };\n    Modal.prototype.setBody = function (bodyContent) {\n        if (Modal.isDOMNode(bodyContent)) {\n            Modal.removeChildNodes(this.modalElements.modal.body.content);\n            this.modalElements.modal.body.content.append(bodyContent);\n        }\n        else {\n            this.modalElements.modal.body.content.innerHTML = bodyContent;\n        }\n    };\n    Modal.prototype.setFooter = function (title) {\n        if (typeof title === \"string\") {\n            this.modalElements.modal.footer.content.innerHTML = title.length == 0 ? \"&nbsp;\" : title;\n        }\n        else {\n            console.log(\"Footer elements?\");\n        }\n    };\n    Modal.prototype.setActions = function (actions) {\n        var _self = this;\n        Modal.removeChildNodes(this.modalElements.modal.footer.actions);\n        if (Array.isArray(actions)) {\n            for (var i in actions) {\n                var a = actions[i];\n                var cmd = null;\n                var btn = document.createElement(\"button\");\n                btn.innerHTML = a.label;\n                if (typeof a.action === \"function\") {\n                    btn.addEventListener(\"click\", a.action);\n                }\n                else if ((typeof a === \"string\" && (cmd = a) != null) || (typeof a.action === \"string\" && (cmd = a.action) != null)) {\n                    if (cmd === \"cancel\" || cmd === \"ok\" || cmd === \"close\")\n                        btn.addEventListener(\"click\", function () {\n                            _self.close();\n                        });\n                }\n                this.modalElements.modal.footer.actions.appendChild(btn);\n            }\n        }\n    };\n    Modal.prototype.close = function () {\n        this.modalElements.modal.parent.classList.remove(\"modal-opened\");\n        this.modalElements.modal.parent.classList.add(\"modal-closed\");\n    };\n    Modal.prototype.open = function () {\n        this.modalElements.modal.parent.classList.remove(\"modal-closed\");\n        this.modalElements.modal.parent.classList.add(\"modal-opened\");\n    };\n    Modal.prototype.buildDOMNode = function (id) {\n        var _self = this;\n        var modal = document.createElement(\"div\");\n        modal.setAttribute(\"id\", id);\n        modal.classList.add(\"modal\");\n        modal.classList.add(\"modal-closed\");\n        var content = document.createElement(\"div\");\n        content.classList.add(\"modal-content\");\n        var header = document.createElement(\"div\");\n        header.classList.add(\"modal-header\");\n        var closeBtn = document.createElement(\"span\");\n        closeBtn.classList.add(\"modal-close\");\n        closeBtn.innerHTML = \"&times;\";\n        var h2 = document.createElement(\"h2\");\n        h2.innerHTML = \"Modal Header\";\n        var body = document.createElement(\"div\");\n        body.classList.add(\"modal-body\");\n        // Body contents?\n        var bodyContent = document.createElement(\"p\");\n        bodyContent.innerHTML = \"Some text in the Modal Body\";\n        var footer = document.createElement(\"div\");\n        footer.classList.add(\"modal-footer\");\n        var footerContent = document.createElement(\"h3\");\n        var footerActions = document.createElement(\"div\");\n        footerContent.innerHTML = \"Modal Footer\";\n        footerActions.classList.add(\"modal-actions\");\n        footer.appendChild(footerContent);\n        footer.appendChild(footerActions);\n        header.appendChild(closeBtn);\n        header.appendChild(h2);\n        content.appendChild(header);\n        body.appendChild(bodyContent);\n        content.appendChild(body);\n        content.appendChild(footer);\n        modal.appendChild(content);\n        // When the user clicks on <span> (x), close the modal\n        closeBtn.onclick = function () {\n            _self.close();\n        };\n        // Append new modal to body\n        document.getElementsByTagName(\"body\")[0].appendChild(modal);\n        return {\n            modal: {\n                id: id,\n                parent: modal,\n                header: {\n                    closeBtn: closeBtn,\n                    content: h2\n                },\n                body: { content: bodyContent },\n                footer: {\n                    content: footerContent,\n                    actions: footerActions\n                }\n            }\n        };\n    };\n    // https://stackoverflow.com/questions/384286/how-do-you-check-if-a-javascript-object-is-a-dom-object\n    Modal.isDOMNode = function (obj) {\n        try {\n            //Using W3 DOM2 (works for FF, Opera and Chrome)\n            return obj instanceof HTMLElement;\n        }\n        catch (e) {\n            //Browsers not supporting W3 DOM2 don't have HTMLElement and\n            //an exception is thrown and we end up here. Testing some\n            //properties that all elements have (works on IE7)\n            return (typeof obj === \"object\" && obj.nodeType === 1 && typeof obj.style === \"object\" && typeof obj.ownerDocument === \"object\");\n        }\n    };\n    Modal.ACTION_CLOSE = { label: \"Close\", action: \"close\" };\n    Modal.ACTION_CANCEL = { label: \"Cancel\", action: \"close\" };\n    Modal.ACTION_OK = { label: \"OK\", action: \"close\" };\n    Modal.MODAL_COUNTER = 0;\n    Modal.removeChildNodes = function (node) {\n        // Remove all current actions\n        while (node.firstChild) {\n            node.removeChild(node.lastChild);\n        }\n    };\n    return Modal;\n}());\nexports.Modal = Modal;\n//# sourceMappingURL=modal.js.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkRPGDialogue\"] = self[\"webpackChunkRPGDialogue\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], () => (__webpack_require__(706)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","Object","defineProperty","exports","value","DefaultDialogueRenderer","questionNodeId","optionsNodeId","this","endOfConversationText","questionNode","getHTMLElement","optionsNode","console","warn","prototype","nodeId","document","getElementById","renderConversationTerminated","setQuestionText","undefined","questionText","npcName","innerHTML","concat","clearAllOptions","addAnswerOption","answerText","optionIndex","onOptionSelected","answerNode","createElement","answerLinkNode","setAttribute","addEventListener","appendChild","Editor","gup_1","detectDarkMode_1","plotboilerplate_1","RPGDialogueLogic_1","editorHelpers_1","editorRenderer_1","TouchHandler_1","FileDrop_1","modal_1","detectMobileDevice_1","DefaultDialogueRenderer_1","dialogueConfigJSONPath","isRecoveryFromLocalStorageActive","_this","currentMouseHandler","currentTouchHandler","_self","log","GUP","gup","isDarkmode","detectDarkMode","isMobileDevice","detectMobileDevice","pb","PlotBoilerplate","utils","safeMergeByKeys","canvas","fullSize","fitToParent","scaleX","scaleY","rasterGrid","drawOrigin","rasterAdjustFactor","redrawOnResize","defaultCanvasWidth","defaultCanvasHeight","canvasWidthFactor","canvasHeightFactor","cssScaleX","cssScaleY","cssUniformScale","autoAdjustOffset","offsetAdjustXPercent","offsetAdjustYPercent","backgroundColor","enableMouse","enableKeys","boxSize","width","height","editorHelpers","EditorHelper","editorRenderer","EditorRenderer","KeyHandler","element","getElementsByTagName","trackAll","down","selectedOption","setSelectedOption","selectedNode","setSelectedNode","debug","classList","add","config","postDraw","_draw","_fill","dialogConfig","renderBoxes","renderConnections","tryLoadFromLocalStorage","then","dc","handleDialogConfigLoaded","catch","tryLoadFromJSON","FileDrop","eventCatcher","onFileJSONDropped","jsonObject","fromObject","click","_evt","fileInput","files","length","reader","FileReader","onload","jsonText","result","JSON","parse","readAsText","testCurrentDialogueConfig","requestCreateNewGraph","showJSON","window","open","tryStartAutosaveLoop","autosaveTimer","globalThis","setInterval","tryAutoSave","domHelper","isAutoSave","putToLocalStorage","modal","setTitle","setBody","setFooter","setActions","Modal","ACTION_CANCEL","label","action","close","performNewGraph","meta","name","npcs","graph","intro","q","o","a","next","editor","position","x","y","dConfig","isExportWithoutPositions","removePositions","dialogConfigWithPositions","jsonString","stringify","jsonArea","ACTION_CLOSE","outputContainer","outputQuestion","outputOptions","rpgLogic","RPGDialogueLogic","addDialogueChangeListener","_dialogueConfig","nextNodeName","_oldNodeName","_selectedOptionIndex","setHighlightedNode","alternateStartNodeName","selectedNodeName","beginConversation","enrichPositions","enrichMetaData","setDialogConfig","destroy","boxMovehandler","TouchHandler","redraw","localStorage","setItem","loadConfigFromJSON","Promise","accept","reject","getItem","exception","__importDefault","mod","__esModule","axios_1","dialogueStruct","validateStructure","createSendAnswerCallback","dialogueRenderer","sendAnswer","isEndReached","loadCurrentQuestionaire","structure","listeners","resetToBeginning","validate","listener","i","push","removeDialogueChangeListener","splice","fireStateChange","oldNodeName","selectedOptionIndex","getCurrentNpcName","_a","_b","_c","npcIndex","currentQuestionaire","answerCallback","getCurrentQuestionaire","index","oldQuestionaireName","currentQuestionaireName","selectedAnswer","nextQuestionaire","path","default","get","response","data","error","finally","loadFromJSON","struct","loadAllFromJSON","paths","promises","npcNames","keys","npcPath","all","dialogues","mapping","RPGDialogueSequence","rules","handleDialogueStateChanged","matchingRule","findRule","callback","nodeName","rule","addRule","TouchEnterLeaveHandler","editorHelper","wasTouchUsed","draggedOption","relPos","pos","bounds","getBoundingClientRect","left","top","draggedNodeName","draggedNode","wasDragged","touchMovePos","touchDownPos","clearTouch","afProps","touchStart","evt","touches","Vertex","clientX","clientY","locateNodeBoxNameAtPos","transformMousePosition","locateOptionBoxNameAtPos","touchMove","preventDefault","stopPropagation","rel","trans","diff","difference","touchEnd","handleOptionReconnect","touchCancel","alloyFinger","createAlloyFinger","onTouchLeaveEvents","onTouchEnterEvents","_init","onTouchEnter","selector","fn","slice","map","e","onTouchLeave","lastTouchLeave","lastTouchEnter","el","elementFromPoint","event","matches","hasOwnProperty","overrideValue","toLowerCase","hours","Date","getHours","userAgent","navigator","vendor","opera","test","substr","RPGDOMHelpers","currentDraggedAnswerIndex","currentDropAnswerIndex","touchEnterLeaveHandler","editorElement","optionsElement","keyElement","querySelector","npcElement","qElement","handleQChanged","handleNPCIndexChanged","handleKeyChanged","exportJSON","addDialogueNode","requestRemoveDialogueNode","checked","blob","Blob","type","url","URL","createObjectURL","href","download","textContent","currentGraphNode","updateAnswerOptions","addNewDialogueNode","currentNodeName","removeDialogueNode","removeNewDialogueNode","toggleVisibility","isVisible","remove","changeEvent","target","_changeEvent","newIndex","parseInt","Number","isNaN","newName","trim","renameGraphNode","handleATextChanged","answer","handleASuccessorChanged","showAnswerOptions","getSelectedNpcIndex","updateNpcSelector","curNpcIndex","npcOption","selected","toggleDragEnterStyles","answerIndex","dropIndex","getAttribute","contains","toggleDragLeaveStyles","graphNode","onDragOver","ev","onDragLeave","drop","performDrop","isTouchDevice","dropArea","makeADropArea","option","answerWrapperElement","answerControlsElement","makeAnswerControlElement","answerElement","labelElement","textElement","selectElement","createNodeSelectElement","dndHandleElement","dataTransfer","setData","dragStartElement","parentElement","_ev","container","dropArea_1","controlElement","dndElement","upDownElement","upBtn","downBtn","deleteButton","requestDeleteOption","old","handleDeleteOption","currentKey","selectedKey","optionElement","createNodeSelectOptionElement","key","questionaire","optionElement_1","questionaireText","isCurrent","isSelected","ellipsify","domHelpers_1","metaHelpers_1","highlightedNodeName","highlightedNode","hightlightedOption","relativeMousePosition","metaHelpers","DialogueMetaHelpers","noRedraw","setHighlightedOption","isRedrawRequired","isEqualOptionIdentifyer","getRandomPosition","viewport","min","Math","random","node","baseConfig","configWithPositions","dialogueConfig","isPosInGraphNodeBox","isPosInOptionNodeBox","OPTION_OFFSET_X","isNodeHighlighted","nodName","isOptionHighlighted","isOptionSelected","randomNodeKey","newNode","mouseDownPos","lastMouseDownPos","draggingNode","draggingNodeName","MouseHandler","params","up","drag","dragAmount","draw","scale","move","mouseMovePos","hoveringOptionIdentifyer","hoveringNodeName","mouseClickPos","handleClick","clickedOptionIdentifyer","clickedNodeName","sourceNode","identA","identB","oldName","tmpNode","j","text","maxLength","substring","object","clone","count","__assign","assign","t","s","n","arguments","p","call","apply","getContrastColor_1","Color_1","TEXT_MAX_LENGTH","fontOptions","color","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","textAlign","rotation","Color","getContrastColor","setAlpha","cssRGBA","nodeNames","renderGraphNode","renderOptions","renderSuggestedConnection","isMousePosInsideOption","bezierTargetPosition","drawBezierConnection","isNodeSelected","fill","rect","offsetY","offsetX","isHighlighted","zA","addXY","circle","successorName","successorNode","otherOptionIsSelected","successorNodePosition","zB","cA","cB","subXY","isCanvas","HTMLCanvasElement","ctx","setLineDash","cubicBezierArrow","lineWidth","vertices","buildArrowHead","vertex","cubicBezier","polyline","RPGDialogue","vars","location","replace","_m","args","_i","__createBinding","create","m","k","k2","desc","getOwnPropertyDescriptor","writable","configurable","enumerable","__exportStar","Editor_1","RPGDialogueSequence_1","handleModalOpen","metaCopy","cloneMeta","buildMetaBody","handleSave","updateModalBody","newBody","metaBody","inputName","handleUpdateMetaName","nameLabel","npcContainer","inputsNpcNames","npcNameInput","handleNpcNameChange","btnRemove","handleDeleteNpc","btnAddNpc","handleAddNpc","copy","modalElements","buildDOMNode","MODAL_COUNTER","title","header","content","bodyContent","isDOMNode","removeChildNodes","body","append","footer","actions","Array","isArray","cmd","btn","parent","id","closeBtn","h2","footerContent","footerActions","onclick","obj","HTMLElement","nodeType","style","ownerDocument","ACTION_OK","firstChild","removeChild","lastChild","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","every","r","d","definition","g","Function","prop","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","forEach","bind","__webpack_exports__"],"sourceRoot":""}