{"version":3,"file":"rpg-dialogue.js","mappings":"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","sources":["webpack://RPGDialogue/webpack/universalModuleDefinition","webpack://RPGDialogue/./src/ts/DefaultDialogueRenderer.ts","webpack://RPGDialogue/./src/ts/Editor.ts","webpack://RPGDialogue/./src/ts/RPGDialogue.ts","webpack://RPGDialogue/./src/ts/RPGDialogueLogic.ts","webpack://RPGDialogue/./src/ts/RPGDialogueSequence.ts","webpack://RPGDialogue/./src/ts/TouchHandler.ts","webpack://RPGDialogue/./src/ts/detectDarkMode.ts","webpack://RPGDialogue/./src/ts/detectMobileDevice.ts","webpack://RPGDialogue/./src/ts/domHelpers.ts","webpack://RPGDialogue/./src/ts/editorHelpers.ts","webpack://RPGDialogue/./src/ts/editorRenderer.ts","webpack://RPGDialogue/./src/ts/gup.ts","webpack://RPGDialogue/./src/ts/index.ts","webpack://RPGDialogue/./src/ts/metaHelpers.ts","webpack://RPGDialogue/./src/ts/modal.ts","webpack://RPGDialogue/webpack/bootstrap","webpack://RPGDialogue/webpack/runtime/chunk loaded","webpack://RPGDialogue/webpack/runtime/define property getters","webpack://RPGDialogue/webpack/runtime/hasOwnProperty shorthand","webpack://RPGDialogue/webpack/runtime/make namespace object","webpack://RPGDialogue/webpack/runtime/jsonp chunk loading","webpack://RPGDialogue/webpack/before-startup","webpack://RPGDialogue/webpack/startup","webpack://RPGDialogue/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"RPGDialogue\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"RPGDialogue\"] = factory();\n\telse\n\t\troot[\"RPGDialogue\"] = factory();\n})(self, () => {\nreturn ","import { IDialogueRenderer } from \"./interfaces\";\n\nexport class DefaultDialogueRenderer implements IDialogueRenderer {\n  private questionNode: HTMLElement;\n  private optionsNode: HTMLElement;\n  // onConversationTerminated: (() => void) | null = null;\n\n  endOfConversationText: string = \"---END OF CONVERSATION---\";\n\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  constructor(questionNodeId: string | HTMLElement, optionsNodeId: string | HTMLElement) {\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 or element id does not exist.\");\n    }\n    if (!this.optionsNode) {\n      console.warn(\"[DefaultDialogueRenderer] Warning: the passed optionsNode or element id does not exist.\");\n    }\n  }\n\n  private getHTMLElement(nodeId: string | HTMLElement): HTMLElement {\n    return typeof nodeId === \"string\" ? (document.getElementById(nodeId) as HTMLElement) : nodeId;\n  }\n\n  //---BEGIN---IDialogueRenderer------------------------------\n  /**\n   * Indicate that the current conversation has ended.\n   * @returns\n   */\n  renderConversationTerminated(): void {\n    this.setQuestionText(this.endOfConversationText, undefined);\n    // if (this.onConversationTerminated) {\n    //   this.onConversationTerminated();\n    // }\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  setQuestionText(questionText: string, npcName: string | null | undefined): void {\n    if (npcName) {\n      this.questionNode.innerHTML = `<span class=\"rpg-npcname\">${npcName}:</span> ${questionText}`;\n    } else {\n      this.questionNode.innerHTML = questionText;\n    }\n  }\n\n  /**\n   * Clear the options node. Just for upper level use here.\n   */\n  clearAllOptions(): void {\n    this.optionsNode.innerHTML = \"\";\n  }\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  addAnswerOption(answerText: string, optionIndex: number, onOptionSelected: () => void): void {\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  //---END---IDialogueRenderer------------------------------\n}\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 **/\n\nimport { gup } from \"./gup\";\nimport { detectDarkMode } from \"./detectDarkMode\";\nimport { KeyHandler, MouseHandler, PBParams, PlotBoilerplate, XYDimension } from \"plotboilerplate\";\nimport { RPGDialogueLogic } from \"./RPGDialogueLogic\";\nimport { IDialogueConfig, IDialogueListener, IGlobalLibs, IMiniQuestionaire, IMiniQuestionaireWithPosition } from \"./interfaces\";\nimport { EditorHelper } from \"./editorHelpers\";\nimport { EditorRenderer } from \"./editorRenderer\";\nimport { TouchHandler } from \"./TouchHandler\";\nimport { FileDrop } from \"plotboilerplate/src/cjs/utils/io/FileDrop\";\nimport { Modal } from \"./modal\";\nimport { detectMobileDevice } from \"./detectMobileDevice\";\nimport { DefaultDialogueRenderer } from \"./DefaultDialogueRenderer\";\n\nexport class Editor {\n  currentMouseHandler: MouseHandler | null = null;\n  currentTouchHandler: TouchHandler | null = null;\n  editorHelpers: EditorHelper;\n  editorRenderer: EditorRenderer;\n  dialogConfig: IDialogueConfig<IMiniQuestionaireWithPosition> | null;\n  pb: PlotBoilerplate;\n  private autosaveTimer: NodeJS.Timer;\n  constructor(dialogueConfigJSONPath: string, isRecoveryFromLocalStorageActive: boolean, globalLibs: IGlobalLibs) {\n    const _self = this;\n    console.log(\"Initializing plotboilerplate\");\n    // Fetch the GET params\n    const GUP = gup();\n    const isDarkmode: boolean = detectDarkMode(GUP);\n    const isMobileDevice: boolean = detectMobileDevice(GUP);\n\n    // All config params are optional.\n    this.pb = new PlotBoilerplate(\n      PlotBoilerplate.utils.safeMergeByKeys(\n        {\n          canvas: document.getElementById(\"my-canvas\") as HTMLCanvasElement,\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        },\n        GUP\n      ) as PBParams\n    );\n\n    const boxSize: XYDimension = {\n      width: 120,\n      height: 20\n    };\n    this.editorHelpers = new EditorHelper(this, this.pb, boxSize);\n    this.editorRenderer = new EditorRenderer(this.pb, boxSize, this.editorHelpers, isDarkmode);\n\n    // +---------------------------------------------------------------------------------\n    // | On 'escape' key press un-select selected items.\n    // +-------------------------------\n    const keyHandler = new KeyHandler({ element: document.getElementsByTagName(\"body\")[0], trackAll: false }).down(\n      \"escape\",\n      () => {\n        // Esc?\n        console.log(\"Escape down\");\n        if (this.editorHelpers.selectedOption) {\n          this.editorHelpers.setSelectedOption(null);\n        } else if (this.editorHelpers.selectedNode) {\n          this.editorHelpers.setSelectedNode(null, null);\n          this.editorHelpers.setSelectedOption(null);\n        }\n      }\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    // +---------------------------------------------------------------------------------\n    // | The render method.\n    // +-------------------------------\n    this.pb.config.postDraw = (_draw, _fill) => {\n      if (!_self.dialogConfig) {\n        return;\n      }\n      _self.editorRenderer.renderBoxes(_self.dialogConfig);\n      _self.editorRenderer.renderConnections(_self.dialogConfig);\n    };\n\n    if (isRecoveryFromLocalStorageActive) {\n      console.debug(\"Trying to recover config from localstorage.\");\n      this.tryLoadFromLocalStorage()\n        .then(dc => {\n          _self.handleDialogConfigLoaded(dc);\n        })\n        .catch(() => {\n          console.debug(\"Loading from localstorage failed. Falling back loading from specified path.\");\n          _self.tryLoadFromJSON(dialogueConfigJSONPath, globalLibs);\n        });\n    } else {\n      _self.tryLoadFromJSON(dialogueConfigJSONPath, globalLibs);\n    }\n\n    // Install DnD with FileDrop\n    const fileDrop = new FileDrop(this.pb.eventCatcher);\n    fileDrop.onFileJSONDropped((jsonObject: object) => {\n      console.debug(\"[onFileJSONDropped] jsonObject\", jsonObject);\n      // TODO: properly convert to dialog-config\n      _self.handleDialogConfigLoaded(EditorHelper.fromObject(jsonObject));\n    });\n\n    // Also accept uploads via button\n    const importJSON = () => {\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\", (_evt: Event) => {\n      var fileInput = document.getElementById(\"input-upload-file\") as HTMLInputElement;\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 = () => {\n        const jsonText = reader.result as string;\n        console.log(reader.result);\n        _self.handleDialogConfigLoaded(EditorHelper.fromObject(JSON.parse(jsonText)));\n      };\n      reader.readAsText(fileInput.files[0]);\n    });\n\n    document.getElementById(\"b-run-test\")?.addEventListener(\"click\", () => {\n      _self.testCurrentDialogueConfig();\n    });\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\", () => {\n      window.open(\"https://github.com/IkarosKappler/rpg-dialogue\", \"_blank\");\n    });\n  }\n  // END constructor\n\n  private tryStartAutosaveLoop() {\n    if (this.autosaveTimer) {\n      return;\n    }\n    const _self = this;\n    this.autosaveTimer = globalThis.setInterval(() => {\n      _self.tryAutoSave();\n    }, 10000);\n  }\n\n  private tryAutoSave() {\n    if (this.editorHelpers.domHelper.isAutoSave()) {\n      // console.log(\"Putting to localstorage.\");\n      this.putToLocalStorage();\n    }\n  }\n\n  requestCreateNewGraph(): () => void {\n    const _self = this;\n    return () => {\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.ACTION_CANCEL,\n        {\n          label: \"Yes\",\n          action: () => {\n            _self.editorHelpers.domHelper.modal.close();\n            _self.performNewGraph();\n          }\n        }\n      ]);\n      _self.editorHelpers.domHelper.modal.open();\n    };\n  }\n\n  private performNewGraph() {\n    const newConfig: IDialogueConfig<IMiniQuestionaireWithPosition> = {\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\n  private showJSON() {\n    const _self = this;\n    return () => {\n      const removePositions = _self.editorHelpers.domHelper.isExportWithoutPositions();\n      const dConfig: IDialogueConfig<IMiniQuestionaire> | IDialogueConfig<IMiniQuestionaireWithPosition> = removePositions\n        ? EditorHelper.removePositions(_self.editorHelpers.dialogConfigWithPositions)\n        : _self.editorHelpers.dialogConfigWithPositions;\n      const jsonString = JSON.stringify(dConfig, null, 4);\n      const 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.ACTION_CLOSE]);\n      _self.editorHelpers.domHelper.modal.open();\n    };\n  }\n\n  /**\n   * Open a modal and test the current dialogue config (runs a RPGDialogueLogic instant).\n   */\n  testCurrentDialogueConfig() {\n    if (!this.dialogConfig) {\n      console.warn(\"Warning: cannot test null dialogue.\");\n      return;\n    }\n    const _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\n    const outputContainer = document.createElement(\"div\");\n    const outputQuestion = document.createElement(\"div\");\n    const 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\n    const dialogueListener: IDialogueListener<IMiniQuestionaireWithPosition> = (\n      _dialogueConfig: IDialogueConfig<IMiniQuestionaireWithPosition>,\n      nextNodeName: string | null,\n      _oldNodeName: string | null,\n      _selectedOptionIndex: number\n    ) => {\n      // Highlight current node in the graph editor :)\n      _self.editorHelpers.setHighlightedNode(nextNodeName);\n    };\n\n    const rpgLogic = new RPGDialogueLogic(this.dialogConfig, false);\n    rpgLogic.addDialogueChangeListener(dialogueListener);\n    const alternateStartNodeName: string | null = this.editorHelpers.selectedNodeName;\n    this.editorHelpers.setSelectedNode(null, null);\n    rpgLogic.beginConversation(new DefaultDialogueRenderer(outputQuestion, outputOptions), alternateStartNodeName);\n\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.ACTION_CLOSE]);\n    this.editorHelpers.domHelper.modal.open();\n  }\n\n  private handleDialogConfigLoaded(config: IDialogueConfig<IMiniQuestionaire>) {\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.debug(\"Enriched meta data\", this.dialogConfig);\n    this.editorHelpers.setDialogConfig(this.dialogConfig);\n\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\n    // Ad DnD support for boxes.\n    if (this.currentTouchHandler) {\n      this.currentTouchHandler.destroy();\n      this.currentTouchHandler = null;\n    }\n    this.currentTouchHandler = new TouchHandler(this.pb, this.dialogConfig, this.editorHelpers);\n\n    this.pb.redraw();\n    this.tryStartAutosaveLoop();\n  }\n\n  private putToLocalStorage() {\n    const jsonString = JSON.stringify(this.dialogConfig);\n    globalThis.localStorage.setItem(\"__rpgeditor.dialogueconfig\", jsonString);\n  }\n\n  private tryLoadFromJSON(dialogueConfigJSONPath: string, globalLibs: IGlobalLibs) {\n    const _self = this;\n    RPGDialogueLogic.loadConfigFromJSON(dialogueConfigJSONPath, globalLibs).then((config: IDialogueConfig<IMiniQuestionaire>) => {\n      console.debug(\"structure\", config);\n      _self.handleDialogConfigLoaded(config);\n    });\n  }\n\n  private tryLoadFromLocalStorage(): Promise<IDialogueConfig<IMiniQuestionaireWithPosition>> {\n    return new Promise<IDialogueConfig<IMiniQuestionaireWithPosition>>((accept, reject) => {\n      const jsonString = globalThis.localStorage.getItem(\"__rpgeditor.dialogueconfig\");\n      if (!jsonString || jsonString === \"\") {\n        reject();\n      } else {\n        try {\n          const jsonObject = JSON.parse(jsonString);\n          if (!jsonObject) {\n            reject();\n            return;\n          }\n          const dialogueConfig = EditorHelper.fromObject(jsonObject);\n          accept(dialogueConfig);\n        } catch (exception) {\n          console.warn(exception);\n          reject();\n        }\n      }\n    });\n  }\n\n  // +---------------------------------------------------------------------------------\n  // | END Editor\n  // +-------------------------------\n}\n","/**\n * This is the main exported library that shozld be exposed to the browser.\n *\n * @author  Ikaros Kappler\n * @date    2023-09-07\n * @version 1.0.0\n */\n\nimport { gup } from \"./gup\";\nimport { detectDarkMode } from \"./detectDarkMode\";\nimport { RPGDialogueLogic } from \"./RPGDialogueLogic\";\nimport { RPGDOMHelpers } from \"./domHelpers\";\nimport { DialogueMetaHelpers } from \"./metaHelpers\";\nimport { Modal } from \"./modal\";\nimport { EditorHelper } from \"./editorHelpers\";\nimport { TouchHandler } from \"./TouchHandler\";\nimport { EditorRenderer } from \"./editorRenderer\";\nimport { Editor } from \"./Editor\";\nimport { RPGDialogueSequence } from \"./RPGDialogueSequence\";\nimport { DefaultDialogueRenderer } from \"./DefaultDialogueRenderer\";\n\nexport const RPGDialogue = () => ({\n  gup: gup,\n  detectDarkMode: detectDarkMode,\n  RPGDialogueLogic: RPGDialogueLogic,\n  RPGDOMHelpers: RPGDOMHelpers,\n  DialogueMetaHelpers: DialogueMetaHelpers,\n  Modal: Modal,\n  EditorHelper: EditorHelper,\n  TouchHandler: TouchHandler,\n  EditorRenderer: EditorRenderer,\n  Editor: Editor,\n  RPGDialogueSequence: RPGDialogueSequence,\n  DefaultDialogueRenderer: DefaultDialogueRenderer\n});\n","/**\n * @author  Ikaros Kappler\n * @date    2023-07-25\n * @version 1.0.0\n */\n\nimport {\n  IAnswer,\n  IDialogueConfig,\n  IDialogueListener,\n  IDialogueNodeType,\n  IDialogueRenderer,\n  IGlobalLibs,\n  IMiniQuestionaire,\n  INpcDialogueMapping,\n  INpcPathMapping\n} from \"./interfaces\";\n\nexport class RPGDialogueLogic<T extends IDialogueNodeType> {\n  name: string;\n  structure: IDialogueConfig<T>;\n  private currentQuestionaireName: string | null;\n  private currentQuestionaire: IMiniQuestionaire | null;\n  private listeners: Array<IDialogueListener<T>>;\n\n  constructor(dialogueStruct: IDialogueConfig<T>, validateStructure: boolean) {\n    this.structure = dialogueStruct;\n    this.listeners = [];\n\n    this.resetToBeginning();\n    if (validateStructure) {\n      this.validate();\n    }\n  }\n\n  addDialogueChangeListener(listener: IDialogueListener<T>) {\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\n  removeDialogueChangeListener(listener: IDialogueListener<T>) {\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\n  private fireStateChange(nextNodeName: string | null, oldNodeName: string | null, selectedOptionIndex: number) {\n    for (var i = 0; i < this.listeners.length; i++) {\n      this.listeners[i](this.structure, nextNodeName, oldNodeName, selectedOptionIndex);\n    }\n  }\n\n  private getCurrentNpcName(): string | null {\n    const npcIndex = this.currentQuestionaire?.npcIndex ?? 0;\n    const npcName = this.structure.meta?.npcs?.length > 0 ? this.structure.meta.npcs[npcIndex].name : null;\n    return npcName;\n  }\n\n  private createSendAnswerCallback = (dialogueRenderer: IDialogueRenderer, optionIndex: number) => {\n    const _self = this;\n    var sendAnswerCallback = () => {\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\n  loadCurrentQuestionaire(dialogueRenderer: IDialogueRenderer): boolean {\n    if (this.currentQuestionaire) {\n      const npcName = this.getCurrentNpcName();\n      dialogueRenderer.setQuestionText(this.currentQuestionaire.q, npcName);\n      for (var i = 0; i < this.currentQuestionaire.o.length; i++) {\n        const 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  /**\n   * Get the current mini questionaire or null if no current or next questionaire is available.\n   * @returns\n   */\n  getCurrentQuestionaire(): IMiniQuestionaire | null {\n    return this.currentQuestionaire;\n  }\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  isEndReached(): boolean {\n    return this.currentQuestionaire === null || this.currentQuestionaire === undefined;\n  }\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  sendAnswer(index: number): boolean {\n    if (!this.currentQuestionaire || index < 0 || index >= this.currentQuestionaire.o.length) {\n      return false;\n    }\n    const oldQuestionaireName = this.currentQuestionaireName;\n    const selectedAnswer: IAnswer = this.currentQuestionaire.o[index];\n    if (!selectedAnswer) {\n      return false;\n    }\n    if (!selectedAnswer.next) {\n      this.currentQuestionaireName = null;\n      this.currentQuestionaire = null;\n    } else {\n      this.currentQuestionaireName = selectedAnswer.next;\n      const nextQuestionaire: T = 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      } 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  /**\n   * Find the initial mini questionaire.\n   */\n  resetToBeginning(alternateStartNodeName?: string | null) {\n    this.currentQuestionaireName = 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  /**\n   * Check if the current dialogue is still valid or reached its end.\n   */\n  private validate() {\n    // ...\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  beginConversation(dialogueRenderer: IDialogueRenderer, alternateStartNodeName?: string | null): void {\n    console.log(\"beginConversation\", alternateStartNodeName);\n    const _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  /**\n   * Load the dialogue structure from the JSON document at the given path.\n   *\n   * @param {string} path\n   * @returns {Promise<RPGDialogueLogic>}\n   */\n  static loadConfigFromJSON<T extends IDialogueNodeType>(path: string, globalLibs: IGlobalLibs): Promise<IDialogueConfig<T>> {\n    // console.log(\"axios\", axios);\n    return new Promise<IDialogueConfig<T>>((accept: (dialogueStruct: IDialogueConfig<T>) => void, reject: () => void) => {\n      globalLibs.axios\n        .get(path)\n        .then(response => {\n          // handle success\n          console.log(response);\n          // Validate response data?\n          accept(response.data);\n        })\n        .catch(error => {\n          // handle error\n          console.log(error);\n          reject();\n        })\n        .finally(() => {\n          // always executed\n        });\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  static loadFromJSON<T extends IDialogueNodeType>(path: string, globalLibs: IGlobalLibs): Promise<RPGDialogueLogic<T>> {\n    return new Promise<RPGDialogueLogic<T>>((accept: (dialogueStruct: RPGDialogueLogic<T>) => void, reject: () => void) => {\n      RPGDialogueLogic.loadConfigFromJSON<T>(path, globalLibs).then((struct: IDialogueConfig<T>) => {\n        accept(new RPGDialogueLogic<T>(struct, true));\n      });\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  static loadAllFromJSON<T extends IDialogueNodeType>(\n    paths: INpcPathMapping,\n    globalLibs: IGlobalLibs\n  ): Promise<INpcDialogueMapping<T>> {\n    const promises: Array<Promise<RPGDialogueLogic<T>>> = [];\n    const npcNames = Object.keys(paths);\n    console.log(\"npcNames\", npcNames);\n    for (var i = 0; i < npcNames.length; i++) {\n      const npcName = npcNames[i];\n      const npcPath = paths[npcName];\n      promises.push(RPGDialogueLogic.loadFromJSON(npcPath, globalLibs));\n    }\n    return new Promise((accept, reject) => {\n      Promise.all(promises)\n        .then((dialogues: RPGDialogueLogic<T>[]) => {\n          // tre-map received dialogues back to their npc names\n          // const mapping = dialogues.map((dialogue, index) => ({ npcName: paths[index], dialogue: dialogue }));\n          const mapping: INpcDialogueMapping<T> = {};\n          for (var i = 0; i < npcNames.length; i++) {\n            const name: string = npcNames[i];\n            mapping[name] = dialogues[i];\n          }\n          accept(mapping);\n        })\n        .catch(reject);\n    });\n  }\n}\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 */\n\nimport { RPGDialogueLogic } from \"./RPGDialogueLogic\";\nimport { IDialogueConfig, IDialogueListener, IDialogueNodeType, IDialogueRenderer, SequenceMatchingRule } from \"./interfaces\";\n\nexport class RPGDialogueSequence<T extends IDialogueNodeType> {\n  private dialogues: Record<string, RPGDialogueLogic<T>>;\n  private rules: Array<SequenceMatchingRule>;\n\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  constructor(dialogues: Record<string, RPGDialogueLogic<T>>) {\n    // NOOP\n    this.dialogues = dialogues;\n    this.rules = [];\n    const keys = Object.keys(this.dialogues);\n    for (var i in keys) {\n      const npcName = keys[i];\n      const dlg = this.dialogues[npcName];\n      dlg.addDialogueChangeListener(this.handleDialogueStateChanged(npcName));\n    }\n  }\n\n  private handleDialogueStateChanged(npcName: string): IDialogueListener<T> {\n    return (\n      _dialogueConfig: IDialogueConfig<T>,\n      nextNodeName: string | null,\n      oldNodeName: string | null,\n      selectedOptionIndex: number\n    ) => {\n      // Try to locate matching callback.\n      const matchingRule = this.findRule(npcName, nextNodeName);\n      console.log(\"matchingRule found?\", matchingRule !== null);\n      if (matchingRule) {\n        matchingRule.callback();\n      }\n    };\n  }\n\n  private findRule(npcName: string, nodeName: string): SequenceMatchingRule | null {\n    for (var i in this.rules) {\n      const rule = this.rules[i];\n      if (rule.npcName === npcName && rule.nodeName === nodeName) {\n        return rule;\n      }\n    }\n    return null;\n  }\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  addRule(npcName: string, nodeName: string | null, callback: (npcName?: string, nodeName?: string) => void) {\n    this.rules.push({ npcName, nodeName, callback });\n  }\n\n  beginConversation(dialogueRenderer: IDialogueRenderer, npcName: string, alternateStartNodeName?: string) {\n    const dialogue = this.dialogues[npcName];\n    dialogue.beginConversation(dialogueRenderer, alternateStartNodeName);\n  }\n}\n","/**\n * A wrapper class for AlloyFinger.\n *\n * @author  Ikaros Kappler\n * @date    2023-07-31\n * @version 1.0.0\n */\n\nimport { AlloyFingerOptions } from \"alloyfinger-typescript/src/cjs/alloy_finger\";\nimport AlloyFinger from \"alloyfinger-typescript\";\nimport { PlotBoilerplate, Vertex, XYCoords } from \"plotboilerplate\";\nimport { EditorHelper } from \"./editorHelpers\";\nimport { IDialogueConfig, IMiniQuestionaireWithPosition, IOptionIdentifyer } from \"./interfaces\";\n\nexport class TouchHandler {\n  private alloyFinger: AlloyFinger;\n  wasTouchUsed: boolean = false;\n\n  constructor(\n    pb: PlotBoilerplate,\n    dialogConfigWithPositions: IDialogueConfig<IMiniQuestionaireWithPosition>,\n    editorHelper: EditorHelper\n  ) {\n    const _self = this;\n\n    // Install a touch handler on the canvas.\n    const relPos = (pos: XYCoords): XYCoords => {\n      const bounds = pb.canvas.getBoundingClientRect();\n      return { x: pos.x - bounds.left, y: pos.y - bounds.top };\n    };\n\n    var draggedNodeName: string | null = null;\n    var draggedNode: IMiniQuestionaireWithPosition | null = null;\n    var draggedOption: IOptionIdentifyer | null;\n    var wasDragged: boolean = false;\n\n    var touchMovePos: Vertex | undefined | null = null;\n    var touchDownPos: Vertex | undefined | null = null;\n    const clearTouch = () => {\n      touchMovePos = null;\n      touchDownPos = null;\n      draggedNodeName = null;\n    };\n    const afProps: AlloyFingerOptions = {\n      touchStart: (evt: TouchEvent) => {\n        console.log(\"Touchstart\");\n        _self.wasTouchUsed = true;\n        if (evt.touches.length == 1) {\n          touchMovePos = new Vertex(relPos({ x: evt.touches[0].clientX, y: evt.touches[0].clientY }));\n          touchDownPos = new 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          } else {\n            draggedOption = editorHelper.locateOptionBoxNameAtPos(pb.transformMousePosition(touchMovePos.x, touchMovePos.y));\n          }\n          wasDragged = false;\n        }\n      },\n      touchMove: (evt: TouchEvent) => {\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: XYCoords = relPos({ x: evt.touches[0].clientX, y: evt.touches[0].clientY });\n          var trans: XYCoords = pb.transformMousePosition(rel.x, rel.y);\n          var diff: Vertex = new Vertex(pb.transformMousePosition(touchMovePos.x, touchMovePos.y)).difference(trans);\n          if (draggedNode.editor?.position) {\n            draggedNode.editor.position.x += diff.x;\n            draggedNode.editor.position.y += diff.y;\n          }\n          touchMovePos = new Vertex(relPos({ x: evt.touches[0].clientX, y: evt.touches[0].clientY }));\n          wasDragged = true;\n          pb.redraw();\n        }\n      },\n      touchEnd: (evt: TouchEvent) => {\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                if (draggedNodeName) {\n                  editorHelper.handleOptionReconnect(draggedNodeName);\n                }\n              } else {\n                editorHelper.setSelectedOption(null, false);\n                editorHelper.setSelectedNode(draggedNodeName, draggedNode);\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: (evt: TouchEvent) => {\n        console.log(\"touchCancel\");\n        _self.wasTouchUsed = true;\n        clearTouch();\n      }\n    } as unknown as AlloyFingerOptions; // END afProps\n\n    /* tslint:disable-next-line */\n    _self.alloyFinger = globalThis.createAlloyFinger(pb.eventCatcher ? pb.eventCatcher : pb.canvas, afProps);\n  }\n\n  destroy() {\n    this.alloyFinger.destroy();\n  }\n}\n\n/**\n * A class simulating non existing touchenter and touchleave events.\n * Inspired by\n *    https://stackoverflow.com/questions/23111671/touchenter-and-touchleave-events-support\n */\ntype TouchEnterLeaveListener = (element: HTMLElement, event: TouchEvent) => void;\nexport class TouchEnterLeaveHandler {\n  private onTouchLeaveEvents: Array<[string, TouchEnterLeaveListener]> = [];\n  private onTouchEnterEvents: Array<[string, TouchEnterLeaveListener]> = [];\n\n  constructor() {\n    this._init();\n  }\n\n  onTouchEnter(selector: string, fn: TouchEnterLeaveListener) {\n    this.onTouchEnterEvents.push([selector, fn]);\n    return () => {\n      this.onTouchEnterEvents.slice().map((e, i) => {\n        if (e[0] === selector && e[1] === fn) {\n          this.onTouchEnterEvents.splice(1, i);\n        }\n      });\n    };\n  }\n\n  onTouchLeave(selector: string, fn: TouchEnterLeaveListener) {\n    this.onTouchLeaveEvents.push([selector, fn]);\n    return function () {\n      this.onTouchLeaveEvents.slice().map((e, i) => {\n        if (e[0] === selector && e[1] === fn) {\n          this.onTouchLeaveEvents.splice(1, i);\n        }\n      });\n    };\n  }\n\n  private _init() {\n    let lastTouchLeave: Element | null;\n    let lastTouchEnter: Element | null;\n    const _self = this;\n    document.addEventListener(\"touchmove\", e => {\n      const el: Element | null = document.elementFromPoint(e.touches[0].clientX, e.touches[0].clientY);\n      if (!el) {\n        return;\n      }\n\n      _self.onTouchLeaveEvents.map(event => {\n        if (el != lastTouchEnter && lastTouchEnter && lastTouchEnter.matches(event[0])) {\n          if (lastTouchEnter !== lastTouchLeave) {\n            event[1](lastTouchEnter as HTMLElement, e);\n            lastTouchLeave = lastTouchEnter;\n            lastTouchEnter = null;\n          }\n        }\n      });\n\n      _self.onTouchEnterEvents.map(event => {\n        if (el.matches(event[0]) && el !== lastTouchEnter) {\n          lastTouchEnter = el;\n          lastTouchLeave = null;\n          event[1](el as HTMLElement, e);\n        }\n      });\n    });\n  }\n}\n\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","/**\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 */\n\nexport const detectDarkMode = (GUP: Record<string, string>): boolean => {\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    } 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};\n","/**\n * @date 2023-08-23\n */\n\nexport const detectMobileDevice = (GUP: object): boolean => {\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    } else if (overrideValue === \"1\" || overrideValue.toLowerCase() === \"true\") {\n      return true;\n    }\n  }\n  const userAgent = navigator.userAgent || (navigator as any).vendor || (window as any).opera;\n  return (\n    /(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(\n      userAgent\n    ) ||\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(\n      userAgent.substr(0, 4)\n    )\n  );\n};\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 **/\n\nimport { TouchEnterLeaveHandler } from \"./TouchHandler\";\nimport { EditorHelper } from \"./editorHelpers\";\nimport { IAnswer, IDialogueConfig, IMiniQuestionaire, IMiniQuestionaireWithPosition } from \"./interfaces\";\nimport { Modal } from \"./modal\";\n\nexport class RPGDOMHelpers {\n  editorHelpers: EditorHelper;\n\n  editorElement: HTMLDivElement;\n  keyElement: HTMLInputElement;\n  npcElement: HTMLSelectElement;\n  qElement: HTMLInputElement;\n\n  optionsElement: HTMLDivElement;\n\n  modal: Modal;\n\n  currentNodeName: string | null;\n  currentGraphNode: IMiniQuestionaire | null;\n\n  currentDraggedAnswerIndex: number = -1;\n  currentDropAnswerIndex: number = -1;\n\n  touchEnterLeaveHandler: TouchEnterLeaveHandler;\n\n  constructor(editorHelpers: EditorHelper) {\n    this.editorHelpers = editorHelpers;\n    this.touchEnterLeaveHandler = new TouchEnterLeaveHandler();\n\n    this.editorElement = document.getElementById(\"attribute-editor\") as HTMLDivElement;\n    this.optionsElement = document.getElementById(\"e-options-container\") as HTMLDivElement;\n\n    this.keyElement = this.editorElement.querySelector(\"input#e-key\") as HTMLInputElement;\n    this.npcElement = this.editorElement.querySelector(\"select#e-npc-index\") as HTMLSelectElement;\n    this.qElement = this.editorElement.querySelector(\"textarea#e-q\") as HTMLInputElement;\n\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\n    this.modal = new Modal();\n\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\n  isExportWithoutPositions(): boolean {\n    const checkbox = document.getElementById(\"cb-export-without-positions\") as HTMLInputElement;\n    return checkbox.checked;\n  }\n\n  isAutoSave(): boolean {\n    const checkbox = document.getElementById(\"cb-use-localstorage\") as HTMLInputElement;\n    return checkbox.checked;\n  }\n\n  exportJSON(_self: RPGDOMHelpers): () => void {\n    return () => {\n      const removePositions = _self.isExportWithoutPositions();\n      const dConfig: IDialogueConfig<IMiniQuestionaire> | IDialogueConfig<IMiniQuestionaireWithPosition> = removePositions\n        ? EditorHelper.removePositions(_self.editorHelpers.dialogConfigWithPositions)\n        : _self.editorHelpers.dialogConfigWithPositions;\n      const 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\n  addAnswerOption(_self: RPGDOMHelpers): () => void {\n    return () => {\n      if (!_self.currentGraphNode) {\n        console.warn(\"Warnign: cannot add answer options to null.\");\n        return;\n      }\n      const newOption: IAnswer = {\n        a: \"\",\n        next: null\n      };\n      _self.currentGraphNode.o.push(newOption);\n      _self.updateAnswerOptions();\n      _self.editorHelpers.pb.redraw();\n    };\n  }\n\n  private addDialogueNode(_self: RPGDOMHelpers): () => void {\n    return () => {\n      _self.editorHelpers.addNewDialogueNode();\n    };\n  }\n\n  private requestRemoveDialogueNode(_self: RPGDOMHelpers): () => void {\n    return () => {\n      _self.modal.setTitle(\"Delete option?\");\n      _self.modal.setBody(`Do you really want to delete the current dialoge node '${_self.currentNodeName}'?`);\n      _self.modal.setFooter(\"\");\n      _self.modal.setActions([\n        Modal.ACTION_CANCEL,\n        {\n          label: \"Yes\",\n          action: () => {\n            _self.modal.close();\n            _self.removeDialogueNode();\n          }\n        }\n      ]);\n      _self.modal.open();\n    };\n  }\n\n  private removeDialogueNode() {\n    if (!this.currentNodeName) {\n      return;\n    }\n    this.editorHelpers.removeNewDialogueNode(this.currentNodeName);\n    this.toggleVisibility(false);\n  }\n\n  toggleVisibility(isVisible: boolean) {\n    if (isVisible) {\n      this.editorElement.classList.remove(\"d-none\");\n    } else {\n      this.editorElement.classList.add(\"d-none\");\n    }\n  }\n\n  private handleQChanged(_self: RPGDOMHelpers): (changeEvent: Event) => void {\n    return (changeEvent: Event) => {\n      if (!_self.currentGraphNode) {\n        return;\n      }\n      _self.currentGraphNode.q = (changeEvent.target as HTMLInputElement).value;\n      _self.editorHelpers.pb.redraw();\n    };\n  }\n\n  private handleNPCIndexChanged(_self: RPGDOMHelpers): (changeEvent: Event) => void {\n    return (_changeEvent: Event) => {\n      if (!_self.currentGraphNode) {\n        return;\n      }\n      let newIndex: number = parseInt(this.npcElement.value);\n      if (Number.isNaN(newIndex)) {\n        newIndex = -1;\n      }\n      _self.currentGraphNode.npcIndex = newIndex;\n    };\n  }\n\n  private handleKeyChanged(_self: RPGDOMHelpers): (changeEvent: Event) => void {\n    return (_changeEvent: Event) => {\n      if (!_self.currentNodeName) {\n        return;\n      }\n      let newName: string = this.keyElement.value;\n      if (!newName || (newName = newName.trim()).length === 0) {\n        return;\n      }\n      const renameSuccessful = _self.editorHelpers.renameGraphNode(_self.currentNodeName, newName);\n      if (renameSuccessful) {\n        _self.currentNodeName = newName;\n      }\n    };\n  }\n\n  private handleATextChanged(_self: RPGDOMHelpers, answer: IAnswer): (changeEvent: Event) => void {\n    return (changeEvent: Event) => {\n      answer.a = (changeEvent.target as HTMLInputElement).value;\n      _self.editorHelpers.pb.redraw();\n    };\n  }\n\n  private handleASuccessorChanged(_self: RPGDOMHelpers, answer: IAnswer): (changeEvent: Event) => void {\n    return (changeEvent: Event) => {\n      answer.next = (changeEvent.target as HTMLInputElement).value;\n      _self.editorHelpers.pb.redraw();\n    };\n  }\n\n  updateAnswerOptions() {\n    this.showAnswerOptions(this.currentNodeName, this.currentGraphNode);\n  }\n\n  getSelectedNpcIndex() {\n    return typeof this.currentGraphNode?.npcIndex === \"undefined\" || Number.isNaN(this.currentGraphNode.npcIndex)\n      ? 0\n      : this.currentGraphNode.npcIndex;\n  }\n\n  updateNpcSelector() {\n    if (!this.currentGraphNode) {\n      return;\n    }\n    this.npcElement.innerHTML = \"\";\n    const curNpcIndex: number = 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      const npcOption = document.createElement(\"option\");\n      npcOption.setAttribute(\"value\", `${i}`);\n      if (i === 0) {\n        npcOption.innerHTML = `${this.editorHelpers.dialogConfigWithPositions.meta.npcs[i].name} (default)`;\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 = `${curNpcIndex}`;\n    this.npcElement.setAttribute(\"value\", `${curNpcIndex}`);\n  }\n\n  toggleDragEnterStyles(target: HTMLElement) {\n    // console.log(\"toggleDragEnterStyles\");\n    const answerIndex = this.currentDraggedAnswerIndex;\n    const 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\n  toggleDragLeaveStyles(target: HTMLElement) {\n    console.log(\"toggleDragLeaveStyles\");\n    if (target.classList.contains(\"droppable\")) {\n      target.classList.remove(\"dragover\");\n    }\n  }\n\n  showAnswerOptions(nodeName: string | null, graphNode: IMiniQuestionaireWithPosition | null) {\n    const _self = this;\n    if (!nodeName) {\n      // console.warn(\"Warning: cannot show answer options for null node.\");\n      return;\n    }\n    this.currentNodeName = nodeName;\n    this.currentGraphNode = graphNode;\n\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\" : `${graphNode.npcIndex}`;\n    this.qElement.setAttribute(\"value\", graphNode ? graphNode.q : \"\");\n    this.qElement.value = graphNode ? graphNode.q : \"\";\n    if (!graphNode) {\n      return;\n    }\n\n    const onDragOver = (ev: DragEvent) => {\n      console.log(\"ondragover\", ev.target);\n      ev.preventDefault();\n      const target = ev.target as HTMLDivElement;\n      _self.toggleDragEnterStyles(target);\n    };\n    const onDragLeave = (ev: DragEvent) => {\n      console.log(\"ondragleave\", ev.target);\n      ev.preventDefault();\n      const target = ev.target as HTMLDivElement;\n      _self.toggleDragLeaveStyles(target);\n    };\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\", (element: HTMLElement) => {\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\", (element: HTMLElement) => {\n      console.log(\"onTouchLeave\", element);\n      _self.currentDropAnswerIndex = -1;\n      _self.toggleDragLeaveStyles(element);\n    });\n\n    const drop = (ev: DragEvent) => {\n      console.log(\"Drop\", ev);\n      ev.preventDefault();\n      const target = ev.target as HTMLDivElement;\n      // const answerIndex = parseInt(ev.dataTransfer.getData(\"answerindex\"));\n      const 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\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\n    const isTouchDevice: boolean = Boolean(this.editorHelpers.editor.currentTouchHandler?.wasTouchUsed);\n    const dropArea: HTMLDivElement = this.makeADropArea(0, drop, onDragOver, onDragLeave);\n    this.optionsElement.appendChild(dropArea);\n\n    for (var i = 0; i < graphNode.o.length; i++) {\n      const option: IAnswer = graphNode.o[i];\n\n      const answerWrapperElement = document.createElement(\"div\") as HTMLDivElement;\n      const answerControlsElement = this.makeAnswerControlElement(i, isTouchDevice);\n\n      const answerElement = document.createElement(\"div\") as HTMLDivElement;\n      const labelElement = document.createElement(\"div\") as HTMLDivElement;\n      const textElement = document.createElement(\"textarea\") as HTMLTextAreaElement;\n      const selectElement = this.createNodeSelectElement(nodeName, option.next);\n      labelElement.innerHTML = `A#${i}`;\n      labelElement.classList.add(\"e-label\");\n      textElement.innerHTML = option.a;\n\n      answerElement.appendChild(labelElement);\n      answerElement.appendChild(textElement);\n      answerElement.appendChild(selectElement);\n\n      const handleDragStart = (ev: DragEvent) => {\n        // console.log(\"handleDragStart\");\n        _self.currentDraggedAnswerIndex = parseInt((ev.target as HTMLDivElement).getAttribute(\"data-answerindex\") ?? \"\");\n        // console.log(\"handleDragStart\", _self.currentDraggedAnswerIndex);\n        ev.dataTransfer && ev.dataTransfer.setData(\"answerindex\", `${_self.currentDraggedAnswerIndex}`);\n      };\n\n      const handleTouchDragStart = (ev: TouchEvent) => {\n        ev.preventDefault(); // Is this required?\n        var dragStartElement = ev.target as HTMLElement;\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 as HTMLElement).parentElement as HTMLElement;\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\n      const handleTouchDragEnd = (_ev: TouchEvent) => {\n        _self.performDrop(_self.currentDraggedAnswerIndex, _self.currentDropAnswerIndex);\n      };\n      answerWrapperElement.classList.add(\"answer-wrapper-element\");\n      // answerWrapperElement.setAttribute(\"data-answerindex\", `${i}`);\n\n      if (isTouchDevice) {\n        // Regular 'mouse' or Desktop device.\n        // No additional listeners to install.\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\", `${i}`);\n        }\n      }\n      answerWrapperElement.appendChild(answerElement);\n      answerWrapperElement.appendChild(answerControlsElement.container);\n\n      const dropArea = this.makeADropArea(i + 1, drop, onDragOver, onDragLeave);\n\n      this.optionsElement.appendChild(answerWrapperElement);\n      this.optionsElement.appendChild(dropArea);\n\n      textElement.addEventListener(\"change\", this.handleATextChanged(this, option));\n      selectElement.addEventListener(\"change\", this.handleASuccessorChanged(this, option));\n    }\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  private makeAnswerControlElement(\n    index: number,\n    isTouchDevice: boolean\n  ): { container: HTMLDivElement; dndHandleElement: HTMLDivElement | null } {\n    const _self = this;\n    const controlElement = document.createElement(\"div\") as HTMLDivElement;\n    controlElement.classList.add(\"answer-controls-element\");\n\n    var dndElement: HTMLDivElement | null = null;\n    if (isTouchDevice) {\n      const upDownElement = document.createElement(\"div\") as HTMLDivElement;\n      upDownElement.classList.add(\"answer-up-down-element\");\n      const upBtn = document.createElement(\"button\") as HTMLButtonElement;\n      upBtn.innerHTML = \"▴\";\n      if (index === 0) {\n        upBtn.setAttribute(\"disabled\", \"true\");\n      } else {\n        upBtn.addEventListener(\"click\", () => {\n          console.log(\"upBtn\", index, index - 1);\n          _self.performDrop(index, index - 1);\n        });\n      }\n      const downBtn = document.createElement(\"button\") as HTMLButtonElement;\n      downBtn.innerHTML = \"▾\";\n      if (index + 1 === this.currentGraphNode?.o.length) {\n        downBtn.setAttribute(\"disabled\", \"true\");\n      } else {\n        downBtn.addEventListener(\"click\", () => {\n          console.log(\"downBtn\", index, index + 2); // Think of drop zone indices here\n\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    } else {\n      dndElement = document.createElement(\"div\") as HTMLDivElement;\n      dndElement.classList.add(\"a-dnd-element\");\n      dndElement.innerHTML = \"&vellip;\";\n      controlElement.appendChild(dndElement);\n    }\n\n    const deleteButton = document.createElement(\"button\") as HTMLButtonElement;\n    deleteButton.classList.add(\"a-delete-button\");\n    deleteButton.addEventListener(\"click\", this.requestDeleteOption(index));\n    deleteButton.innerHTML = \"&#x1F5D1;\";\n\n    controlElement.appendChild(deleteButton);\n    return { container: controlElement, dndHandleElement: dndElement };\n  }\n\n  private performDrop(answerIndex: number, dropIndex: number) {\n    if (dropIndex > answerIndex) {\n      dropIndex--;\n    }\n\n    if (this.currentGraphNode) {\n      const old = this.currentGraphNode.o[answerIndex];\n      this.currentGraphNode.o[answerIndex] = this.currentGraphNode.o[dropIndex];\n      this.currentGraphNode.o[dropIndex] = old;\n    }\n\n    // Re-build the list : )\n    this.updateAnswerOptions();\n    this.editorHelpers.pb.redraw();\n  }\n\n  private requestDeleteOption(index: number): () => void {\n    const _self = this;\n    return () => {\n      _self.modal.setTitle(\"Delete option?\");\n      _self.modal.setBody(`Do you really want to delete option #${index}?`);\n      _self.modal.setFooter(\"\");\n      _self.modal.setActions([\n        Modal.ACTION_CANCEL,\n        {\n          label: \"Yes\",\n          action: () => {\n            _self.modal.close();\n            _self.handleDeleteOption(index);\n          }\n        }\n      ]);\n      _self.modal.open();\n    };\n  }\n\n  private handleDeleteOption(index: number) {\n    this.currentGraphNode?.o.splice(index, 1);\n    this.updateAnswerOptions();\n    this.editorHelpers.pb.redraw();\n  }\n\n  private makeADropArea(\n    dropIndex: number,\n    drop: (evt: DragEvent) => void,\n    onDragOver: (evt: DragEvent) => void,\n    onDragLeave: (evt: DragEvent) => void\n  ) {\n    const dropArea: HTMLDivElement = document.createElement(\"div\");\n    dropArea.setAttribute(\"data-dropindex\", `${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\n  private createNodeSelectElement(currentKey: string, selectedKey): HTMLSelectElement {\n    const selectElement = document.createElement(\"select\") as HTMLSelectElement;\n    if (!this.editorHelpers.dialogConfigWithPositions) {\n      console.warn(\"Warning: cannout populate nodeSelectElement. No dialogConfig set.\");\n    } else {\n      const optionElement = this.createNodeSelectOptionElement(\"\", false, null, false);\n      selectElement.appendChild(optionElement);\n\n      for (var key in this.editorHelpers.dialogConfigWithPositions.graph) {\n        if (!this.editorHelpers.dialogConfigWithPositions.graph.hasOwnProperty(key)) {\n          // return;\n          continue; // !!! is this correct?\n        }\n        const questionaire: IMiniQuestionaire = this.editorHelpers.dialogConfigWithPositions.graph[key];\n        const optionElement = this.createNodeSelectOptionElement(questionaire.q, key === currentKey, key, key === selectedKey);\n\n        selectElement.appendChild(optionElement);\n      }\n    }\n    return selectElement;\n  }\n\n  private createNodeSelectOptionElement(questionaireText: string, isCurrent: boolean, key: string | null, isSelected: boolean) {\n    const optionElement = document.createElement(\"option\") as HTMLOptionElement;\n    optionElement.setAttribute(\"value\", key as string);\n    optionElement.innerHTML = `${key ?? \"\"}: ${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}\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 **/\n\nimport { MouseHandler, PlotBoilerplate, XMouseEvent, XYCoords, XYDimension } from \"plotboilerplate\";\nimport { IDialogueConfig, IMiniQuestionaire, IMiniQuestionaireWithPosition, IOptionIdentifyer } from \"./interfaces\";\nimport { RPGDOMHelpers } from \"./domHelpers\";\nimport { EditorRenderer } from \"./editorRenderer\";\nimport { Editor } from \"./Editor\";\nimport { DialogueMetaHelpers } from \"./metaHelpers\";\n\nexport class EditorHelper {\n  editor: Editor;\n  pb: PlotBoilerplate;\n  boxSize: XYDimension;\n\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  highlightedNodeName: string | null = null;\n\n  /**\n   * The highlighted node itself or null if none is highligted.\n   * Used to determine rendering colors.\n   */\n  highlightedNode: IMiniQuestionaireWithPosition | null = null;\n\n  /**\n   * The selected node's name or null if none is selected.\n   * Used to determine the node editor's contents.\n   */\n  selectedNodeName: string | null = null;\n\n  /**\n   * The selected node itself or null if none is selected.\n   * Used to determine the node editor's contents.\n   */\n  selectedNode: IMiniQuestionaireWithPosition | null = null;\n\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  selectedOption: IOptionIdentifyer | null = null;\n\n  /**\n   * The currently highlighted option.\n   * Used to draw on-mouse-over options with a different color.\n   */\n  hightlightedOption: IOptionIdentifyer | null = null;\n\n  /**\n   * The current mouse position (or null if mouse is not on canvas).\n   * In local relative coordinate system.\n   */\n  relativeMousePosition: XYCoords | null = null;\n\n  domHelper: RPGDOMHelpers;\n\n  dialogConfigWithPositions: IDialogueConfig<IMiniQuestionaireWithPosition>;\n\n  metaHelpers: DialogueMetaHelpers;\n\n  constructor(editor: Editor, pb: PlotBoilerplate, boxSize: XYDimension) {\n    this.editor = editor;\n    this.pb = pb;\n    this.boxSize = boxSize;\n    this.selectedNodeName = null;\n    this.domHelper = new RPGDOMHelpers(this);\n    this.metaHelpers = new DialogueMetaHelpers(this);\n  }\n\n  setDialogConfig(dialogConfigWithPositions: IDialogueConfig<IMiniQuestionaireWithPosition>) {\n    this.dialogConfigWithPositions = dialogConfigWithPositions;\n  }\n\n  setSelectedOption(selectedOption: IOptionIdentifyer | null, noRedraw?: boolean) {\n    console.log(\"Set selected option\", selectedOption);\n    this.selectedOption = selectedOption;\n    if (!noRedraw) {\n      this.pb.redraw();\n    }\n  }\n\n  setHighlightedOption(hightlightedOption: IOptionIdentifyer | null) {\n    // const isRedrawRequired = this.hightlightedOption !== hightlightedOption;\n    const isRedrawRequired = !this.isEqualOptionIdentifyer(this.hightlightedOption, hightlightedOption);\n\n    this.hightlightedOption = hightlightedOption;\n    if (isRedrawRequired) {\n      this.pb.redraw();\n    }\n  }\n\n  setHighlightedNode(nodeName: string | null, noRedraw?: boolean) {\n    this.highlightedNodeName = nodeName;\n    this.highlightedNode = nodeName ? this.dialogConfigWithPositions.graph[nodeName] : null;\n    if (!noRedraw) {\n      this.pb.redraw();\n    }\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  getRandomPosition(): XYCoords {\n    const 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\n  setSelectedNode(nodeName: string | null, node: IMiniQuestionaireWithPosition | null) {\n    this.selectedNodeName = nodeName;\n    this.selectedNode = node;\n\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    } 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  /**\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  enrichPositions(baseConfig: IDialogueConfig<IMiniQuestionaire>): IDialogueConfig<IMiniQuestionaireWithPosition> {\n    // Clone?\n    const configWithPositions: IDialogueConfig<IMiniQuestionaireWithPosition> =\n      baseConfig as IDialogueConfig<IMiniQuestionaireWithPosition>;\n\n    for (var nodeName in configWithPositions.graph) {\n      const graphNode: IMiniQuestionaireWithPosition = configWithPositions.graph[nodeName];\n      if (!graphNode) {\n        console.warn(`Warning: graph node ${nodeName} is null or undefined!`);\n        continue;\n      }\n      // Anonymous member check\n      if (!graphNode.hasOwnProperty(\"editor\")) {\n        graphNode.editor = { position: this.getRandomPosition() };\n      } else if (!(graphNode.editor as IMiniQuestionaireWithPosition).hasOwnProperty(\"position\")) {\n        (graphNode.editor as any).position = this.getRandomPosition();\n      } else {\n        if (!(graphNode.editor as any).position.hasOwnProperty(\"x\") || isNaN(graphNode.editor?.position?.x ?? NaN)) {\n          if (graphNode.editor?.position) {\n            graphNode.editor.position.x = this.getRandomPosition().x;\n          }\n        }\n        if (!(graphNode.editor as any).position.hasOwnProperty(\"y\") || isNaN(graphNode.editor?.position?.y ?? NaN)) {\n          if (graphNode.editor?.position) {\n            graphNode.editor.position.y = this.getRandomPosition().y;\n          }\n        }\n      }\n    }\n    return configWithPositions;\n  }\n\n  /**\n   * Check if the meta data is valid and – if not – add missing default fields.\n   * @param dialogueConfig\n   */\n  enrichMetaData(dialogueConfig: Object) {\n    const result = dialogueConfig as IDialogueConfig<IMiniQuestionaireWithPosition>;\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\n  isPosInGraphNodeBox(pos: XYCoords, graphNode: IMiniQuestionaireWithPosition): boolean {\n    return Boolean(\n      graphNode.editor &&\n        graphNode.editor.position &&\n        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  }\n\n  isPosInOptionNodeBox(pos: XYCoords, graphNode: IMiniQuestionaireWithPosition, optionIndex: number): boolean {\n    // EditorRenderer.OPTION_OFFSET_X;\n    return Boolean(\n      graphNode.editor &&\n        graphNode.editor.position &&\n        graphNode.editor.position.x + EditorRenderer.OPTION_OFFSET_X <= pos.x &&\n        graphNode.editor.position.y + (optionIndex + 1) * this.boxSize.height <= pos.y &&\n        graphNode.editor.position.x + 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  }\n\n  locateNodeBoxNameAtPos(pos: XYCoords): string | null {\n    for (var nodeName in this.dialogConfigWithPositions.graph) {\n      const graphNode: IMiniQuestionaireWithPosition = this.dialogConfigWithPositions.graph[nodeName];\n      if (this.isPosInGraphNodeBox(pos, graphNode)) {\n        return nodeName;\n      }\n    }\n    return null;\n  }\n\n  locateOptionBoxNameAtPos(pos: XYCoords): IOptionIdentifyer | null {\n    for (var nodeName in this.dialogConfigWithPositions.graph) {\n      const graphNode: IMiniQuestionaireWithPosition = 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\n  isNodeHighlighted(nodName: string) {\n    return this.highlightedNodeName === nodName;\n  }\n\n  isOptionHighlighted(nodeName: string, optionIndex: number): boolean {\n    return Boolean(\n      this.hightlightedOption &&\n        this.hightlightedOption.nodeName === nodeName &&\n        this.hightlightedOption.optionIndex === optionIndex\n    );\n  }\n\n  isOptionSelected(nodeName: string, optionIndex: number): boolean {\n    return Boolean(\n      this.selectedOption && this.selectedOption.nodeName === nodeName && this.selectedOption.optionIndex === optionIndex\n    );\n  }\n\n  addNewDialogueNode() {\n    // Place two box units to the right if currently there is a selected node.\n    // Otherwise random position.\n    const position: XYCoords =\n      this.selectedNode && this.selectedNode.editor && this.selectedNode.editor.position\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    const nodeName = this.randomNodeKey();\n    const newNode: IMiniQuestionaireWithPosition = {\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\n  removeNewDialogueNode(nodeName: string) {\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\n  boxMovehandler() {\n    const _self = this;\n    // +---------------------------------------------------------------------------------\n    // | Add a mouse listener to track the mouse position.\n    // +-------------------------------\n    var mouseDownPos: XYCoords | null = null;\n    var lastMouseDownPos: XYCoords | null = null;\n    var draggingNode: IMiniQuestionaireWithPosition | null = null;\n    var draggingNodeName: string | null = null;\n    const handler = new MouseHandler(this.pb.eventCatcher)\n      .down((evt: XMouseEvent) => {\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((_evt: XMouseEvent) => {\n        mouseDownPos = null;\n        draggingNode = null;\n      })\n      .drag((evt: XMouseEvent) => {\n        if (!mouseDownPos || !draggingNode || !draggingNode.editor || !draggingNode.editor.position) {\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((evt: XMouseEvent) => {\n        // console.log(\"move\", evt);\n        // Check if mouse pointer hovers over an option -> set highlighted\n        const mouseMovePos = this.pb.transformMousePosition(evt.params.pos.x, evt.params.pos.y);\n        _self.relativeMousePosition = { x: mouseMovePos.x, y: mouseMovePos.y };\n        const hoveringOptionIdentifyer: IOptionIdentifyer | null = this.locateOptionBoxNameAtPos(mouseMovePos);\n        // Can be null\n        _self.setHighlightedOption(hoveringOptionIdentifyer);\n        if (!hoveringOptionIdentifyer) {\n          // Check if hover on graph node\n          const hoveringNodeName = this.locateNodeBoxNameAtPos(mouseMovePos);\n          this.setHighlightedNode(hoveringNodeName);\n        } else {\n          this.setHighlightedNode(null);\n        }\n      })\n      .click((evt: XMouseEvent) => {\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        const mouseClickPos = this.pb.transformMousePosition(evt.params.pos.x, evt.params.pos.y);\n        _self.handleClick(mouseClickPos);\n      });\n\n    return handler;\n  }\n\n  handleClick(mouseClickPos: XYCoords) {\n    const clickedOptionIdentifyer: IOptionIdentifyer | null = this.locateOptionBoxNameAtPos(mouseClickPos);\n    if (clickedOptionIdentifyer) {\n      this.setSelectedOption(clickedOptionIdentifyer);\n    } else {\n      // Otherwise (no option was clicked) check if a node was clicked directly.\n      const 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        } else {\n          this.setSelectedNode(clickedNodeName, this.dialogConfigWithPositions.graph[clickedNodeName]);\n          // this.pb.redraw();\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\n  handleOptionReconnect(clickedNodeName: string) {\n    if (!this.selectedOption) {\n      // && !this.selectedNodeName) {\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      return;\n    }\n    const graph = this.dialogConfigWithPositions.graph;\n    const clickedNode: IMiniQuestionaireWithPosition = graph[clickedNodeName];\n    const sourceNode = this.selectedOption.node;\n    // console.log(\"Reconnect\");\n    sourceNode.o[this.selectedOption.optionIndex].next = clickedNodeName;\n\n    this.domHelper.showAnswerOptions(this.selectedNodeName, this.selectedNode);\n  }\n\n  isEqualOptionIdentifyer(identA: IOptionIdentifyer | null, identB: IOptionIdentifyer | null): boolean {\n    if ((!identA && identB) || (identA && !identB)) {\n      return false;\n    }\n    if (\n      (typeof identA === \"undefined\" && typeof identB !== \"undefined\") ||\n      (typeof identA !== \"undefined\" && typeof identB === \"undefined\")\n    ) {\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\n  renameGraphNode(oldName: string, newName: string): boolean {\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    const graphNode = this.dialogConfigWithPositions.graph[oldName];\n    this.dialogConfigWithPositions.graph[newName] = graphNode;\n    delete this.dialogConfigWithPositions.graph[oldName];\n\n    // Update all references\n    for (var nodeName in this.dialogConfigWithPositions.graph) {\n      if (!this.dialogConfigWithPositions.graph.hasOwnProperty(nodeName)) {\n        continue;\n      }\n      const 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\n    // Update local selected fields\n    if (oldName === this.selectedNodeName) {\n      this.selectedNodeName = newName;\n      this.selectedNode = this.dialogConfigWithPositions.graph[newName];\n    }\n\n    this.pb.redraw();\n    return true;\n  }\n\n  static ellipsify(text: string, maxLength: number): string {\n    if (!text || text.length <= maxLength) {\n      return text;\n    }\n    return `${text.substring(0, maxLength)}...`;\n  }\n\n  static fromObject(object: object): IDialogueConfig<IMiniQuestionaire> {\n    // Must be of type object\n    if (typeof object !== \"object\") {\n      throw `Cannot convert non-objects to dialogue config: type is ${typeof object}.`;\n    }\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\n    const graph = object[\"graph\"];\n    // Check if 'intro' is present?\n\n    // All members must be of correct type\n    for (var key in object) {\n      if (!object.hasOwnProperty(key)) {\n        continue;\n      }\n      const questionaire = object[key];\n      if (typeof questionaire !== \"object\") {\n        throw \"Cannot converto bject to dialogue config: all graph members must be objects.\";\n      }\n\n      // Check if 'q' (string) and 'o' (array) attributes are present?\n    }\n\n    return object as IDialogueConfig<IMiniQuestionaire>;\n  }\n\n  static removePositions(dialogueConfig: IDialogueConfig<IMiniQuestionaireWithPosition>): IDialogueConfig<IMiniQuestionaire> {\n    const clone: IDialogueConfig<IMiniQuestionaire> = JSON.parse(JSON.stringify(dialogueConfig));\n    for (var nodeName in clone.graph) {\n      const node = clone.graph[nodeName];\n      if (node.hasOwnProperty(\"editor\")) {\n        delete node[\"editor\"];\n      }\n    }\n    return clone;\n  }\n\n  private randomNodeKey(): string {\n    const keys = Object.keys(this.dialogConfigWithPositions.graph);\n    var count = keys.length;\n    let key = \"dia_\" + count;\n    while (this.dialogConfigWithPositions.graph.hasOwnProperty(key)) {\n      key = \"dia_\" + count;\n      count++;\n    }\n    return key;\n  }\n}\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 **/\nimport { FontOptions, PlotBoilerplate, Vertex, XYCoords, XYDimension, drawutils } from \"plotboilerplate\";\nimport { IAnswer, IDialogueConfig, IMiniQuestionaireWithPosition } from \"./interfaces\";\nimport { EditorHelper } from \"./editorHelpers\";\nimport { getContrastColor } from \"plotboilerplate/src/cjs/utils/algorithms/getContrastColor\";\nimport { Color } from \"plotboilerplate/src/cjs/utils/datastructures/Color\";\n// import { FileDrop } from \"plotboilerplate/src/cjs/utils/io/FileDrop\";\n\nexport class EditorRenderer {\n  pb: PlotBoilerplate;\n  boxSize: XYDimension;\n  editorHelpers: EditorHelper;\n  fontOptions: FontOptions;\n\n  TEXT_MAX_LENGTH = 20;\n  static OPTION_OFFSET_X = 16;\n\n  constructor(pb: PlotBoilerplate, boxSize: XYDimension, editorHelpers: EditorHelper, isDarkmode: boolean) {\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\n    const backgroundColor = isDarkmode ? Color.parse(\"#000000\") : Color.parse(\"#ffffff\");\n    this.fontOptions.color = getContrastColor(backgroundColor).setAlpha(0.8).cssRGBA();\n  }\n\n  renderBoxes(dialogConfig: IDialogueConfig<IMiniQuestionaireWithPosition>) {\n    const nodeNames: string[] = Object.keys(dialogConfig.graph);\n    const count: number = nodeNames.length;\n    for (var i = 0; i < count; i++) {\n      const nodeName = nodeNames[i];\n      const graphNode: IMiniQuestionaireWithPosition = dialogConfig.graph[nodeName];\n      this.renderGraphNode(nodeName, graphNode);\n      this.renderOptions(nodeName, graphNode);\n    }\n    // Render suggested new connection\n    this.renderSuggestedConnection();\n  }\n\n  private renderSuggestedConnection() {\n    if (this.editorHelpers.selectedOption) {\n      const isMousePosInsideOption: boolean = this.editorHelpers.isPosInOptionNodeBox(\n        this.editorHelpers.relativeMousePosition,\n        this.editorHelpers.selectedOption.node,\n        this.editorHelpers.selectedOption.optionIndex\n      );\n      const bezierTargetPosition = this.editorHelpers.highlightedNode\n        ? this.editorHelpers.highlightedNode.editor.position\n        : isMousePosInsideOption\n        ? null\n        : this.editorHelpers.relativeMousePosition;\n      if (bezierTargetPosition) {\n        this.drawBezierConnection(\n          this.editorHelpers.selectedOption.node,\n          this.editorHelpers.selectedOption.optionIndex,\n          bezierTargetPosition,\n          true,\n          true\n        );\n      }\n    }\n  }\n\n  private renderGraphNode(nodeName: string, graphNode: IMiniQuestionaireWithPosition) {\n    const isNodeSelected: boolean = this.editorHelpers.selectedNodeName === nodeName;\n    const isNodeHighlighted: boolean = this.editorHelpers.isNodeHighlighted(nodeName);\n    this.pb.fill.text(nodeName, graphNode.editor.position.x, graphNode.editor.position.y - this.boxSize.height, {\n      ...this.fontOptions,\n      color: \"grey\"\n    });\n    this.pb.draw.rect(\n      graphNode.editor.position,\n      this.boxSize.width,\n      this.boxSize.height,\n      isNodeSelected ? \"rgba(255,128,0,1.0)\" : \"rgba(0,255,0,1.0)\",\n      1.0\n    );\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(\n        { x: graphNode.editor.position.x, y: graphNode.editor.position.y },\n        this.boxSize.width,\n        this.boxSize.height,\n        isNodeHighlighted ? \"rgba(255,128,0,0.5)\" : isNodeSelected ? \"rgba(255,128,0,0.3)\" : \"rgba(0,255,0,0.3)\",\n        1.0\n      );\n    }\n    this.pb.fill.text(\n      graphNode.q ? (isNodeSelected ? graphNode.q : EditorHelper.ellipsify(graphNode.q, this.TEXT_MAX_LENGTH)) : \"-no text-\",\n      graphNode.editor.position.x,\n      graphNode.editor.position.y,\n      this.fontOptions\n    );\n  }\n\n  private renderOptions(nodeName: string, graphNode: IMiniQuestionaireWithPosition) {\n    const isNodeSelected: boolean = this.editorHelpers.selectedNodeName === nodeName;\n\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      const option: IAnswer = graphNode.o[j];\n\n      // Render highlighted option?\n      const otherOptionIsSelected: boolean =\n        this.editorHelpers.selectedOption !== null && !this.editorHelpers.isOptionSelected(nodeName, j);\n      const isHighlighted = !otherOptionIsSelected && this.editorHelpers.isOptionHighlighted(nodeName, j);\n      const 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(\n        option.a ? (isNodeSelected ? option.a : EditorHelper.ellipsify(option.a, this.TEXT_MAX_LENGTH)) : \"-no text-\",\n        offsetX,\n        offsetY,\n        { ...this.fontOptions, color: isHighlighted || isSelected ? \"black\" : \"grey\" }\n      );\n      if (isHighlighted || isSelected) {\n        // Draw connect indicator when highlighted\n        const zA = new Vertex(graphNode.editor.position).addXY(\n          this.boxSize.width + 16,\n          this.boxSize.height / 2.0 + (j + 1) * (this.boxSize.height + 2) - 2\n        );\n        this.pb.fill.circle(zA, 5, \"orange\");\n      }\n\n      offsetY += this.boxSize.height + 2;\n    }\n  }\n\n  renderConnections(dialogConfig: IDialogueConfig<IMiniQuestionaireWithPosition>) {\n    const nodeNames: string[] = Object.keys(dialogConfig.graph);\n    const count: number = nodeNames.length;\n    for (var i = 0; i < count; i++) {\n      const nodeName = nodeNames[i];\n      const graphNode: IMiniQuestionaireWithPosition = dialogConfig.graph[nodeName];\n      for (var j = 0; j < graphNode.o.length; j++) {\n        const successorName: string = graphNode.o[j].next;\n        if (!successorName) {\n          continue;\n        }\n        const successorNode: IMiniQuestionaireWithPosition = dialogConfig.graph[successorName];\n        if (!successorNode) {\n          continue;\n        }\n        const isHighlighted = this.editorHelpers.isOptionHighlighted(nodeName, j);\n        const otherOptionIsSelected: boolean =\n          this.editorHelpers.selectedOption !== null && !this.editorHelpers.isOptionSelected(nodeName, j);\n\n        const isSelected = this.editorHelpers.isOptionSelected(nodeName, j);\n\n        // this.drawLinearConnection(graphNode, successorNode, j);\n        this.drawBezierConnection(\n          graphNode,\n          j,\n          successorNode.editor.position,\n          isHighlighted && !otherOptionIsSelected,\n          isSelected\n        );\n      }\n    }\n  }\n\n  drawBezierConnection(\n    graphNode: IMiniQuestionaireWithPosition,\n    j: number,\n    successorNodePosition: XYCoords,\n    isHighlighted: boolean,\n    isSelected: boolean\n  ) {\n    // Construct Bézier handles.\n    const zA = new Vertex(graphNode.editor.position).addXY(\n      this.boxSize.width + 16,\n      this.boxSize.height / 2.0 + (j + 1) * (this.boxSize.height + 2) - 2\n    );\n    const zB = new Vertex(successorNodePosition);\n    const cA = zA.clone().addXY(50, 0);\n    const cB = zB.clone().subXY(50, 50);\n\n    const 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 as drawutils).ctx.setLineDash([10, 6]);\n      } else {\n        (this.pb.draw as drawutils).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\n    if (isCanvas) {\n      (this.pb.draw as drawutils).ctx.setLineDash([0]);\n    }\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  cubicBezierArrow(zA: Vertex, zB: Vertex, cA: Vertex, cB: Vertex, color: string, lineWidth?: number) {\n    var headlen: number = 8; // length of head in pixels\n    var vertices: Array<Vertex> = Vertex.utils\n      .buildArrowHead(cB, zB, headlen, 1.0, 1.0) // this.pb.draw.scale.x, this.pb.draw.scale.y);\n      .map((vertex: 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\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}\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\nexport const gup = () => {\n  var vars = {};\n  var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, (_m, key: string, value: string, ...args) => {\n    vars[key] = value;\n    return value;\n  });\n  return vars;\n};\n","// export * from \"axios\";\n// export * from \"alloyfinger-typescript\";\n// export * from \"plotboilerplate\";\n\nexport * from \"./gup\";\nexport * from \"./detectDarkMode\";\nexport * from \"./RPGDialogueLogic\";\nexport * from \"./modal\";\nexport * from \"./editorHelpers\";\nexport * from \"./TouchHandler\";\nexport * from \"./domHelpers\";\nexport * from \"./metaHelpers\";\nexport * from \"./editorRenderer\";\nexport * from \"./Editor\";\nexport * from \"./RPGDialogueSequence\";\nexport * from \"./RPGDialogue\";\n","/**\n * Helper to edit dialogue meta data.\n *\n * @author  Ikaros Kappler\n * @date    2023-08-09\n * @version 1.0.0\n */\n\nimport { EditorHelper } from \"./editorHelpers\";\nimport { IDialogueMeta } from \"./interfaces\";\nimport { Modal } from \"./modal\";\n\nexport class DialogueMetaHelpers {\n  private editorHelpers: EditorHelper;\n  private inputName: HTMLInputElement;\n  private inputsNpcNames: HTMLInputElement[];\n  private metaCopy: IDialogueMeta;\n\n  constructor(editorHelpers: EditorHelper) {\n    this.editorHelpers = editorHelpers;\n\n    document.getElementById(\"b-configure-meta\").addEventListener(\"click\", this.handleModalOpen());\n  }\n\n  private handleModalOpen() {\n    const _self = this;\n    return () => {\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.ACTION_CANCEL]);\n      _self.editorHelpers.domHelper.modal.open();\n    };\n  }\n\n  private updateModalBody() {\n    const newBody = this.buildMetaBody();\n    this.editorHelpers.domHelper.modal.setBody(newBody);\n  }\n\n  private buildMetaBody(): HTMLDivElement {\n    const metaBody = document.createElement(\"div\");\n\n    this.inputName = document.createElement(\"input\");\n    this.inputName.value = this.metaCopy.name;\n    this.inputName.addEventListener(\"change\", this.handleUpdateMetaName());\n    const nameLabel = document.createElement(\"div\");\n    nameLabel.innerHTML = \"Dialogue name\";\n\n    const 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      const container = document.createElement(\"div\");\n      const label = document.createElement(\"div\");\n      label.innerHTML = `NPC #${i}`;\n      const npcNameInput = document.createElement(\"input\");\n      npcNameInput.value = this.metaCopy.npcs[i].name;\n      npcNameInput.addEventListener(\"change\", this.handleNpcNameChange(i));\n\n      const btnRemove = document.createElement(\"button\");\n      btnRemove.innerHTML = \"&#x1F5D1;\";\n      btnRemove.addEventListener(\"click\", this.handleDeleteNpc(i));\n\n      container.appendChild(label);\n      container.appendChild(npcNameInput);\n      container.appendChild(btnRemove);\n      npcContainer.appendChild(container);\n\n      this.inputsNpcNames.push(npcNameInput);\n    }\n\n    const btnAddNpc = document.createElement(\"button\");\n    btnAddNpc.innerHTML = \"Add NPC\";\n    btnAddNpc.addEventListener(\"click\", this.handleAddNpc());\n\n    metaBody.appendChild(nameLabel);\n    metaBody.appendChild(this.inputName);\n    metaBody.appendChild(npcContainer);\n    metaBody.appendChild(btnAddNpc);\n    return metaBody;\n  }\n\n  private handleUpdateMetaName(): (event: InputEvent) => void {\n    const _self = this;\n    return (event: InputEvent) => {\n      _self.metaCopy.name = (event.target as HTMLInputElement).value;\n    };\n  }\n\n  private handleNpcNameChange(index: number): (event: InputEvent) => void {\n    const _self = this;\n    return (event: InputEvent) => {\n      _self.metaCopy.npcs[index].name = (event.target as HTMLInputElement).value;\n    };\n  }\n\n  private handleDeleteNpc(index: number): () => void {\n    const _self = this;\n    return () => {\n      _self.metaCopy.npcs.splice(index, 1);\n      _self.updateModalBody();\n    };\n  }\n\n  private handleAddNpc(): () => void {\n    const _self = this;\n    return () => {\n      _self.metaCopy.npcs.push({ name: \"New NPC\" });\n      _self.updateModalBody();\n    };\n  }\n\n  private handleSave(): () => void {\n    const _self = this;\n    return () => {\n      _self.editorHelpers.dialogConfigWithPositions.meta = _self.metaCopy;\n      _self.editorHelpers.domHelper.modal.close();\n      _self.editorHelpers.domHelper.updateNpcSelector();\n    };\n  }\n\n  static cloneMeta(meta: IDialogueMeta): IDialogueMeta {\n    const copy = {} as IDialogueMeta;\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}\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 **/\n\n/*\n      <!-- The Modal -->\n      <div id=\"myModal\" class=\"modal\">\n\n      <!-- Modal content -->\n      <div class=\"modal-content\">\n      <div class=\"modal-header\">\n      <span class=\"close\">&times;</span>\n      <h2>Modal Header</h2>\n      </div>\n      <div class=\"modal-body\">\n      <p>Some text in the Modal Body</p>\n      <p>Some other text...</p>\n      </div>\n      <div class=\"modal-footer\">\n      <h3>Modal Footer</h3>\n      </div>\n      </div>\n\n      </div>\n    */\n\nexport interface IModalAction {\n  label: string;\n  action: string | (() => void);\n}\n\ninterface IModalStruct {\n  modal: {\n    id: string;\n    parent: HTMLDivElement;\n    header: {\n      closeBtn: HTMLSpanElement;\n      content: HTMLHeadingElement;\n    };\n    body: { content: HTMLDivElement };\n    footer: {\n      content: HTMLHeadingElement;\n      actions: HTMLDivElement;\n    };\n  };\n}\n\nexport class Modal {\n  static ACTION_CLOSE: IModalAction = { label: \"Close\", action: \"close\" };\n  static ACTION_CANCEL: IModalAction = { label: \"Cancel\", action: \"close\" };\n  static ACTION_OK: IModalAction = { label: \"OK\", action: \"close\" };\n\n  private static MODAL_COUNTER: number = 0;\n  private modalElements;\n\n  constructor() {\n    this.modalElements = this.buildDOMNode(\"myModal-\" + Modal.MODAL_COUNTER++);\n  }\n\n  setTitle(title: string) {\n    this.modalElements.modal.header.content.innerHTML = title;\n  }\n\n  setBody(bodyContent: HTMLElement | string) {\n    if (Modal.isDOMNode(bodyContent)) {\n      Modal.removeChildNodes(this.modalElements.modal.body.content);\n      this.modalElements.modal.body.content.append(bodyContent);\n    } else {\n      this.modalElements.modal.body.content.innerHTML = bodyContent;\n    }\n  }\n\n  setFooter(title: string) {\n    if (typeof title === \"string\") {\n      this.modalElements.modal.footer.content.innerHTML = title.length == 0 ? \"&nbsp;\" : title;\n    } else {\n      console.log(\"Footer elements?\");\n    }\n  }\n\n  setActions(actions: Array<IModalAction>) {\n    const _self = this;\n    Modal.removeChildNodes(this.modalElements.modal.footer.actions);\n    if (Array.isArray(actions)) {\n      for (var i in actions) {\n        const a: IModalAction = actions[i];\n        var cmd: string | null = null;\n        const btn = document.createElement(\"button\");\n        btn.innerHTML = a.label;\n        if (typeof a.action === \"function\") {\n          btn.addEventListener(\"click\", a.action);\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\", () => {\n              _self.close();\n            });\n        }\n        this.modalElements.modal.footer.actions.appendChild(btn);\n      }\n    }\n  }\n\n  close() {\n    this.modalElements.modal.parent.classList.remove(\"modal-opened\");\n    this.modalElements.modal.parent.classList.add(\"modal-closed\");\n  }\n\n  open() {\n    this.modalElements.modal.parent.classList.remove(\"modal-closed\");\n    this.modalElements.modal.parent.classList.add(\"modal-opened\");\n  }\n\n  private buildDOMNode(id: string): IModalStruct {\n    var _self = this;\n\n    var modal = document.createElement(\"div\");\n    modal.setAttribute(\"id\", id);\n    modal.classList.add(\"modal\");\n    modal.classList.add(\"modal-closed\");\n\n    var content = document.createElement(\"div\");\n    content.classList.add(\"modal-content\");\n\n    var header = document.createElement(\"div\");\n    header.classList.add(\"modal-header\");\n\n    var closeBtn = document.createElement(\"span\");\n    closeBtn.classList.add(\"modal-close\");\n    closeBtn.innerHTML = \"&times;\";\n\n    var h2 = document.createElement(\"h2\");\n    h2.innerHTML = \"Modal Header\";\n\n    var body = document.createElement(\"div\");\n    body.classList.add(\"modal-body\");\n\n    // Body contents?\n    var bodyContent = document.createElement(\"p\");\n    bodyContent.innerHTML = \"Some text in the Modal Body\";\n\n    var footer = document.createElement(\"div\");\n    footer.classList.add(\"modal-footer\");\n\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\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\n    // When the user clicks on <span> (x), close the modal\n    closeBtn.onclick = () => {\n      _self.close();\n    };\n\n    // Append new modal to body\n    document.getElementsByTagName(\"body\")[0].appendChild(modal);\n\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\n  // https://stackoverflow.com/questions/384286/how-do-you-check-if-a-javascript-object-is-a-dom-object\n  static isDOMNode(obj) {\n    try {\n      //Using W3 DOM2 (works for FF, Opera and Chrome)\n      return obj instanceof HTMLElement;\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 (\n        typeof obj === \"object\" && obj.nodeType === 1 && typeof obj.style === \"object\" && typeof obj.ownerDocument === \"object\"\n      );\n    }\n  }\n\n  static removeChildNodes = node => {\n    // Remove all current actions\n    while (node.firstChild) {\n      node.removeChild(node.lastChild);\n    }\n  };\n}\n","// 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","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};","// 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__.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\t\"rpg-dialogue\": 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, [\"vendor\"], () => (__webpack_require__(\"./src/ts/index.ts\")))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":[],"sourceRoot":""}