{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-leo/src/client/contextmenu.js"],"names":["html","pt","ViewNav","Layout","Windows","Grid","Info","_","Rasterize","Favorites","applicationFolder","createView","SearchRoots","Connection","ContextMenu","constructor","target","optItems","items","openIn","container","evt","worldContext","hide","menu","remove","lively","removeEventListener","document","documentElement","visible","parentElement","openComponentInWindow","name","extent","getPosition","then","comp","setExtent","focus","windowExtentOffeset","openInWindow","pos","w","create","setGlobalPosition","getGlobalPosition","appendChild","setPosition","getExtent","addPt","style","position","width","height","id","setAttribute","stripWindow","localName","Error","subPt","targetMenuItems","wasEditable","contentEditable","wasDisabled","disabled","targetInWindow","tagName","showElement","showHalo","allParents","map","ea","elementToCSSName","Array","from","childNodes","showSource","showClassSource","insertBefore","makeLocalSpace","Image","url","getAttribute","match","editor","setTarget","openBrowser","openInspector","element","src","notify","prompt","files","readBlobAsDataURL","fetch","r","blob","previewAttrName","textContent","slice","toLowerCase","lively4url","copyURLtoURL","elementToURL","partName","source","outerHTML","querySelector","tmp","createElement","innerHTML","x","y","outerText","saveFile","openCenteredAt","morph","clientX","clientY","scaleBy","preferenceEntry","preferenceKey","enabledIcon","enabled","preferences","shortDescription","item","stopPropagation","preventDefault","get","disable","enable","worldMenuItems","connections","allConnections","forEach","connection","push","existingConnectionsMenu","getFullLabel","setConnection","openWorkspace","last","querySelectorAll","followPath","getURL","classList","add","hand","startGrabbing","body","border","backgroundColor","components","openPart","explorer","livelyExample","diary","selectFirstEntry","undefined","jsxRay","lively4invalidateFileCaches","workspace","mode","parentNode","FilesCaches","System","import","list","invalidateTranspiledFiles","purgeTranspiledFiles","join","updateCachedFilesList","urls","replace","editFile","event","li","query","method","json","contents","filter","concat","statFile","JSON","parse","type","split","content","loadFile","n","allWindows","gotoWindow","confirm","resetView","webkitIsFullScreen","webkitRequestFullScreen","Element","ALLOW_KEYBOARD_INPUT","webkitCancelFullScreen","sortBy","getComputedStyle","zIndex","expandUntilNoIntersectionsExplosion","windowsByWidth","groupBy","clientWidth","Object","keys","Math","max","min","Number","snapAllTopLevelContent","window","open","showModuleInfo","updateAllSearchRoots","getSearchRoots","addSearchRoot","removeSearchRoot","listBooleans","onSaveAs","saveCurrentPageAs","onSave","saveCurrentPage","console","log","firstEvent","createComponent","focusWithoutScroll","openOn","setTimeout","addEventListener","self","contextmenu"],"mappings":"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","file":"contextmenu.js","sourcesContent":["/*MD # Lively4 ContextMenu \n\ncreates the \"world menu\" for Lively4\n\n- [worldMenuItems](#worldMenuItems)\n- [targetMenuItems](#targetMenuItems)\n\n\nMD*/\n\nimport html from './html.js';\nimport {pt} from './graphics.js';\nimport ViewNav from 'src/client/viewnav.js'\nimport Layout from \"src/client/layout.js\"\nimport Windows from \"src/components/widgets/lively-window.js\"\nimport {Grid} from \"src/client/morphic/snapping.js\"\nimport Info from \"src/client/info.js\"\nimport * as _ from 'src/external/lodash/lodash.js'\nimport Rasterize from 'src/client/rasterize.js'\nimport Favorites from \"src/client/favorites.js\"\nimport { applicationFolder } from 'src/client/vivide/utils.js';\nimport { createView } from 'src/client/vivide/scripts/loading.js';\nimport SearchRoots from \"src/client/search-roots.js\"\nimport Connection from \"src/components/halo/Connection.js\";\n\n// import lively from './lively.js'; #TODO resinsert after we support cycles again\n\nexport default class ContextMenu {\n  \n  constructor(target, optItems) {\n    this.target = target;\n    this.items = optItems;\n  }\n  \n  openIn(container, evt, target, worldContext) {\n     return ContextMenu.openIn(container, evt, target, worldContext,  this.items);\n  }\n  \n  static hide() {\n    if (this.menu) this.menu.remove();\n    lively.removeEventListener(\"contextMenu\",  document.documentElement);\n    delete this.menu\n  }\n  \n  static visible() {\n    return this.menu && this.menu.parentElement\n  }\n  \n  static openComponentInWindow (name, evt, worldContext, extent) {\n    this.hide();\n    return lively.openComponentInWindow(name, \n      lively.getPosition(evt), \n      extent, worldContext).then( comp => {\n      if(extent) {\n        lively.setExtent(comp.parentElement, extent)\n      }\n      comp.focus()\n      return comp\n    });\n  }\n  \n  \n  static get windowExtentOffeset() {\n    return pt(2,21)\n  }\n  \n  static async openInWindow(comp) {\n    // wrap an existing component in a window\n    var pos = lively.getPosition(comp);\n    var w = await lively.create(\"lively-window\")\n    lively.setGlobalPosition(w, lively.getGlobalPosition(comp))\n    w.appendChild(comp)\n    lively.setPosition(comp, pt(0,0))\n    lively.setExtent(w, lively.getExtent(comp).addPt(this.windowExtentOffeset))\n    comp.style.position = \"\"\n    comp.style.width = \"100%\"\n    comp.style.height = \"100%\"\n    if (comp.id) w.setAttribute(\"title\", comp.id)\n    return w\n  }\n  \n  static async stripWindow(comp, evt) {\n    var w = comp.parentElement\n    if (w.localName !== \"lively-window\") {\n      throw new Error(\"Could not strip window, because there is none\")\n    }\n    var extent = lively.getExtent(w).subPt(this.windowExtentOffeset)\n    w.parentElement.appendChild(comp) \n    lively.setGlobalPosition(comp, lively.getGlobalPosition(w))\n    lively.setExtent(comp, extent.addPt(this.windowExtentOffeset))\n    w.remove()\n    return comp\n  }\n\n  \n  // #important\n  static targetMenuItems(target) {\n    var wasEditable = (target.contentEditable == \"true\");\n    var wasDisabled = (target.disabled == \"true\");\n    var targetInWindow = target.parentElement && target.parentElement.tagName == 'LIVELY-WINDOW';\n    return [\n      [\"show\", () => {\n         this.hide();\n         lively.showElement(target);\n      },\"\", '<i class=\"fa fa-eye\" aria-hidden=\"true\"></i>'],\n      [\"open halo\",\n        [\n          [\"self\", () => {lively.showHalo(target)}],\n          [\"parents\", lively.allParents(target, [], true).map(\n            ea => [lively.elementToCSSName(ea), () => {lively.showHalo(ea)}])\n          ],\n          [\"children\",  Array.from(target.childNodes).map( \n            ea => [lively.elementToCSSName(ea), () => {lively.showHalo(ea)}])\n          ],\n        ],\n        \"\", '<i class=\"fa fa-search\" aria-hidden=\"true\"></i>'\n      ],\n      [\"browse template source\", (evt) => {\n         this.hide();\n         lively.showSource(target, evt);\n      },\n      \"\", '<i class=\"fa fa-file-image-o\" aria-hidden=\"true\"></i>'\n      ],\n      [\"browse class source\", (evt) => {\n         this.hide();\n         lively.showClassSource(target, evt);\n      },\n        \"\", '<i class=\"fa fa-file-code-o\" aria-hidden=\"true\"></i>'\n      ],\n      // [\"trace\", (evt) => {\n      //    System.import(\"src/client/tracer.js\").then(tracer => {\n      //      tracer.default.traceObject(target);\n      //    });\n      //    this.hide();\n      // }],\n      [\"remove\", () => {\n         target.remove()\n         this.hide();\n      },\n      \"\", '<i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>'\n      ],\n      [\"go back\", () => {\n        target.parentElement.insertBefore(target, target.parentElement.childNodes[0])\n         this.hide();\n      },\n      \"\", '<i class=\"fa fa-backward\" aria-hidden=\"true\"></i>'\n      ],\n      [\"come forward\", () => {\n        target.parentElement.appendChild(target)\n        this.hide();\n      },\n      \"\", '<i class=\"fa fa-forward\" aria-hidden=\"true\"></i>'\n      ],\n      [\n        \"make space\", () => {\n          Layout.makeLocalSpace(target)\n          this.hide()\n        },\n         \"\", '<i class=\"fa fa-file-code-o\" aria-hidden=\"true\"></i>'\n      ],\n      [wasEditable ? \"make uneditable\" : \"make editable\", () => {\n         this.hide();\n         target.contentEditable = !wasEditable;\n      },     \n        \"\", '<i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>'\n      ],\n      [wasDisabled ? \"enable\" : \"disable\", () => {\n         this.hide();\n         target.disabled = !wasDisabled;\n      },\n        \"\", '<i class=\"fa fa-bolt\" aria-hidden=\"true\"></i>'\n      ],\n      [targetInWindow ? \"strip window\" : \"open in window\", (evt) => {\n          this.hide();\n          targetInWindow ?\n            ContextMenu.stripWindow(target, evt) :\n            ContextMenu.openInWindow(target, evt);\n        },\n        \"\", '<i class=\"fa fa-window-restore\" aria-hidden=\"true\"></i>'\n      ],\n      [\"edit\", async () => {\n          if (target instanceof Image) {\n            var url = target.getAttribute(\"src\")\n            if (url.match(/^data\\:/)) {\n              var editor = await lively.openComponentInWindow(\"lively-image-editor\")\n              editor.setTarget(target)\n              \n            } else {\n              lively.openBrowser(url, true)\n            }\n            \n          } else {\n              lively.openInspector(target)\n          }\n        },\n        \"\", '<i class=\"fa fa-file-image-o\" aria-hidden=\"true\"></i>'\n      ],\n      target.localName == \"lively-file\" ?\n        [ \"become content\", async () => {\n            if (target.url && target.name.match(/\\.png$/)) {\n              var element = await (<img id={target.name}></img>)\n              element.src = target.url\n              target.parentElement.appendChild(element)\n              lively.setPosition(element, lively.getPosition(target))\n              target.remove()\n            } else {\n               lively.notify(\"not supported\")\n            }\n          },\n          \"\", '<i class=\"fa fa-file-image-o\" aria-hidden=\"true\"></i>'\n        ] :\n      [  \"become file\", async () => {\n            if (target.src) {\n              var name  = this.id || await lively.prompt(\"convert to file named: \", \"newfile.png\")\n              var element = await (<lively-file name={name}></lively-file>)\n              target.parentElement.appendChild(element)\n              \n              element.setAttribute(\"url\",await lively.files.readBlobAsDataURL(await fetch(target.src).then(r => r.blob())))\n              lively.setPosition(element, lively.getPosition(target))\n\n              target.remove()\n\n            } else {\n              lively.notify(\"not supported\")\n            }\n          },\n          \"\", '<i class=\"fa fa-file-image-o\" aria-hidden=\"true\"></i>'\n        ],\n      [\"save as png ...\", async () => {\n          var previewAttrName = \"data-lively-preview-src\"\n          var url = target.getAttribute(previewAttrName)\n          if (!url) {\n            var name = target.id || \n                target.textContent.slice(0,30) || \n                target.tagName.toLowerCase();\n            url = lively4url + \"/\" + name + \".png\"            \n          }        \n          url = await lively.prompt(\"save as png\", url);\n          if (url) {\n            target.setAttribute(previewAttrName, url)\n            if (target instanceof Image) {\n              await lively.files.copyURLtoURL(target.src, url) \n            } else {\n              await Rasterize.elementToURL(target, url)\n            }\n            lively.notify(\"saved image to \", url, 10, () => {\n              lively.openBrowser(url)\n            })\n          }\n        },\n        \"\", '<i class=\"fa fa-file-image-o\" aria-hidden=\"true\"></i>'\n      ],\n      [\"save as...\", async () => {\n        var partName = target.getAttribute(\"data-lively-part-name\") || target.id ||  \"element\"\n        var name = await lively.prompt(\"save element as: \", `src/parts/${partName}.html`)\n        if (!name) return;\n        // var name = \"foo.html\"\n        var url = name\n        \n        if (!url.match(/https?:\\/\\//)) {\n          if (url.match(/^[a-zA-Z0-9]+\\:/)) {\n            // url = lively.swxURL(url)\n          } else {\n            url = lively4url + \"/\" + url \n          }\n        }\n        var source = \"\"\n        if (name.match(/\\.html$/)) {\n          source = target.outerHTML  \n        } else if (name.match(/\\.svg/)) {\n          var element = target.querySelector(\"svg\")\n          if (!element) throw new Error(\"Could not find SVG elment in target\");\n          var extent = lively.getExtent(element)\n          var tmp = document.createElement(\"div\")\n          tmp.innerHTML = element.outerHTML\n          tmp.querySelector(\"svg\").setAttribute(\"width\", extent.x)\n          tmp.querySelector(\"svg\").setAttribute(\"height\", extent.y)\n          source = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\\n' + \n            tmp.innerHTML  \n        } else if (name.match(/\\.png/)) {\n          if (target.tagName == \"IMG\") \n            element = target\n          else\n            target.querySelector(\"img\")\n          if (!element) throw new Error(\"Could not find img elment in target\");\n          // var extent = lively.getExtent(element)\n          // var tmp = document.createElement(\"div\")\n          // tmp.innerHTML = element.outerHTML\n          source = await fetch(element.src).then(r => r.blob())\n        } else{\n          // fall back to text\n          source = target.outerText\n        }\n        await lively.files.saveFile (url, source)\n        lively.notify(\"saved \", name, 10, () => {\n          lively.openBrowser(url)\n        })\n      },\n      \"\", '<i class=\"fa fa-file-o\" aria-hidden=\"true\"></i>'\n      ]\n    ];\n  }\n  \n  static openCenteredAt(morph, worldContext, evt) {\n    worldContext.appendChild(morph);\n    lively.setGlobalPosition(morph, pt(evt.clientX, evt.clientY)\n      .subPt(lively.getExtent(morph).scaleBy(0.5)))\n  }\n  \n  static preferenceEntry(preferenceKey) {\n    let enabledIcon = function(enabled) {\n      return enabled ? \n        '<i class=\"fa fa-check-square-o\" aria-hidden=\"true\"></i>' :\n        '<i class=\"fa fa-square-o\" aria-hidden=\"true\"></i>'    \n    }\n    \n    return [\n      lively.preferences.shortDescription(preferenceKey), (evt, item) => {\n        evt.stopPropagation();\n        evt.preventDefault();\n        \n        if (lively.preferences.get(preferenceKey))  {\n          lively.preferences.disable(preferenceKey)\n        } else {\n          lively.preferences.enable(preferenceKey)    \n        }\n        item.querySelector(\".icon\").innerHTML = enabledIcon(lively.preferences.get(preferenceKey)); \n      },\"\", enabledIcon(lively.preferences.get(preferenceKey))\n    ]\n  }\n  \n  // #important\n  static worldMenuItems(worldContext) {\n    \n    let connections = []\n    Connection.allConnections.forEach(connection => {\n      connections.push(connection)\n    })\n    let existingConnectionsMenu = connections.map(connection => [connection.getFullLabel(), \n      async () => {\n        let editor = await lively.openComponentInWindow('lively-connection-editor')\n        lively.setExtent(editor.parentElement, lively.pt(800, 50))\n        editor.setConnection(connection)\n      }]);\n        \n\n    var items =  [\n      [\"Workspace\", evt => {\n        this.hide();\n        lively.openWorkspace(\"\", evt.clientX && lively.getPosition(evt), worldContext)\n      }, \"CMD+K\", '<i class=\"fa fa-window-maximize\" aria-hidden=\"true\"></i>'],\n      [\"Browse/Edit\", async(evt) => {\n          var container = _.last(document.querySelectorAll(\"lively-container\"));\n          this.openComponentInWindow(\"lively-container\", evt, worldContext, pt(1210, 700)).then(comp => {\n            if (container)\n              comp.followPath(\"\" + container.getURL());\n            else\n              comp.followPath(lively4url +\"/\");\n          });\n        }, \n        \"CMD+SHIFT+B\", '<i class=\"fa fa-cogs\" aria-hidden=\"true\"></i>'],\n      // [\"File Editor\", evt => this.openComponentInWindow(\"lively-editor\", evt)],\n      // [\"File Browser\", evt => this.openComponentInWindow(\"lively-file-browser\", evt)],\n      [\"Component Bin\", evt => \n        this.openComponentInWindow(\"lively-component-bin\", evt, worldContext,  pt(950, 660)),\n       \"CMD+O\", '<i class=\"fa fa-th\" aria-hidden=\"true\"></i>'],\n      [\"Insert\", [\n        [\"Text\", evt => {\n          var morph  = document.createElement(\"div\");\n          morph.classList.add(\"lively-text\")\n\n          morph.innerHTML = \"Hello\";\n          morph.contentEditable = true;\n          morph.style.width = \"100px\"\n          worldContext.appendChild(morph);\n          this.openCenteredAt(morph, worldContext, evt)          \n          lively.hand.startGrabbing(morph, evt)\n          if (worldContext === document.body) {\n            morph.classList.add(\"lively-content\")\n          }\n          this.hide();\n        }, \"\", '<i class=\"fa fa-font\" aria-hidden=\"true\"></i>'],\n        [\"Rectangle\", evt => {\n          var morph  = document.createElement(\"div\");\n          morph.style.width = \"200px\";\n          morph.style.height = \"100px\";\n          morph.style.border = \"1px solid black\"\n          \n          this.openCenteredAt(morph, worldContext, evt)          \n          // morph.style.backgroundColor = \"blue\";\n          if (worldContext === document.body) {\n            morph.classList.add(\"lively-content\")\n          }\n          morph.style.backgroundColor = 'rgba(40,40,80,0.5)';\n          lively.hand.startGrabbing(morph, evt)\n          \n\n          this.hide();\n        }, \"\", '<i class=\"fa fa-square-o\" aria-hidden=\"true\"></i>'],\n        [\"Slider\", async evt => {\n          var morph  = document.createElement(\"input\");\n          morph.setAttribute('type', 'range')\n\n          worldContext.appendChild(morph);\n          this.openCenteredAt(morph, worldContext, evt)          \n          lively.hand.startGrabbing(morph, evt)\n          if (worldContext === document.body) {\n            morph.classList.add(\"lively-content\")\n          }\n          this.hide();\n        }, \"\", '<i class=\"fa fa-sliders\" aria-hidden=\"true\"></i>'],\n         [\"Drawing\", async evt => {\n          var morph  = document.createElement(\"lively-drawboard\");\n          morph.setAttribute(\"width\", \"400px\");\n          morph.setAttribute(\"height\", \"400px\");\n          await lively.components.openIn(worldContext, morph);\n\n          this.openCenteredAt(morph, worldContext, evt)          \n          lively.hand.startGrabbing(morph, evt)\n          // morph.style.backgroundColor = \"blue\";\n          if (worldContext === document.body) {\n            morph.classList.add(\"lively-content\")\n          }\n          morph.style.backgroundColor = 'rgb(255,250,205)';\n          this.hide();\n        }, \"\", '<i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"></i>'], \n        [\"Button\", async evt => {\n          var morph  = await lively.openPart(\"button\")\n          this.openCenteredAt(morph, worldContext, evt)          \n          lively.hand.startGrabbing(morph, evt)\n          // morph.style.backgroundColor = \"blue\";\n          if (worldContext === document.body) {\n            morph.classList.add(\"lively-content\")\n          }\n          this.hide();\n        }],\n        [\"List\", async evt => {\n          var morph  = await (<lively-list>\n              <li>one</li>\n              <li>two</li>\n              <li>three</li>\n              <li>four</li>\n            </lively-list>)\n          this.openCenteredAt(morph, worldContext, evt)          \n          lively.hand.startGrabbing(morph, evt)\n          if (worldContext === document.body) {\n            morph.classList.add(\"lively-content\")\n          }\n          this.hide();\n        }],\n        [\"Path\", async evt => {\n          var morph  = await lively.openPart(\"path\")\n          this.openCenteredAt(morph, worldContext, evt)          \n          lively.hand.startGrabbing(morph, evt)\n          morph.classList.add(\"lively-content\")\n          this.hide();\n        }],\n        \n      ]],\n      [\"Tools\", [\n        // [\"Services\", evt => this.openComponentInWindow(\"lively-services\", evt)],\n        // [\"Terminal\", evt => this.openComponentInWindow(\"lively-terminal\", evt)],\n        [\"Inspector\", evt => lively.openInspector(document.body)],\n        \n        [\"Console\", evt => this.openComponentInWindow(\"lively-console\", evt, worldContext), \n          \"CMD+J\", '<i class=\"fa fa-terminal\" aria-hidden=\"true\"></i>'],\n        [\"Search\", evt => this.openComponentInWindow(\"lively-search\", evt, worldContext),\n          \"CMD+SHIFT+F\",'<i class=\"fa fa-search\" aria-hidden=\"true\"></i>'],\n        [\"Plugin explorer\", async evt => {\n            const explorer = await this.openComponentInWindow('lively-plugin-explorer', evt, worldContext);\n            explorer.livelyExample();\n        }],\n        // ['Debugger', evt => lively.openDebugger().then( cmp), \n        //   \"\", '<i class=\"fa fa-chrome\" aria-hidden=\"true\"></i>'],\n        [\"Test Runner\", evt => this.openComponentInWindow(\"lively-testrunner\", evt, worldContext),\n          \"\", '<i class=\"fa fa-check-square-o\" aria-hidden=\"true\"></i>'],\n        [\"Drawboard\", evt => this.openComponentInWindow(\"lively-drawboard\", evt, worldContext),\n          \"\", '<i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"></i>'],\n        [\"Storage Setup\", evt => this.openComponentInWindow(\"lively-filesystems\", evt, worldContext),\n          \"\", '<i class=\"fa fa-cloud\" aria-hidden=\"true\"></i>'],\n        [\"Graph Control\", evt => this.openComponentInWindow(\"graph-control\", evt, worldContext),\n          \"Ctrl+Alt+G\", '<i class=\"fa fa-globe\" aria-hidden=\"true\"></i>'],\n        [\"Diary\", async evt => {\n          const diary = await this.openComponentInWindow(\"research-diary\", evt, worldContext);\n          diary.selectFirstEntry();\n        },\n          \"Ctrl+Alt+D\", '<i class=\"fa fa-book\" aria-hidden=\"true\"></i>'],\n        [\"Quicklinks\", async evt => {\n          var morph  = await lively.openPart(\"quicklinks\")          \n          lively.setPosition(morph, lively.pt(0,0), \"fixed\")\n          this.hide();\n        }],\n        [\"X-Ray\", async evt => {\n          var morph  = await lively.openPart(\"WorldMirror\") \n          lively.setGlobalPosition(morph, lively.getPosition(evt))\n          this.hide();\n        }, undefined, '<i class=\"fa fa-tv\" aria-hidden=\"true\"></i>'], \n        [\"X-Ray Events\", async evt => {\n          var morph  = await lively.openPart(\"XRayEvents\") \n          lively.setGlobalPosition(morph, lively.getPosition(evt))\n          this.hide();\n        }, undefined, '<i class=\"fa fa-tv\" aria-hidden=\"true\"></i>'],\n        [\"JSX-Ray \", async evt => {\n          const jsxRay  = await lively.create(\"jsx-ray\", document.body) \n          lively.setGlobalPosition(jsxRay, lively.getPosition(evt))\n          this.hide();\n        }, undefined, '<i class=\"fa fa-tv\" aria-hidden=\"true\"></i>'],\n        [\"AST Explorer\", evt => this.openComponentInWindow(\"lively-ast-explorer\", evt, worldContext),\n          undefined, '<i class=\"fa fa-tree\" aria-hidden=\"true\"></i>'],\n        [\"Invalidate caches\", async evt => {\n          lively4invalidateFileCaches()\n        }],\n        [\"Terminal\", evt => this.openComponentInWindow(\"lively-xterm\", evt, worldContext),\n          \"\", '<i class=\"fa fa-terminal\" aria-hidden=\"true\"></i>'],\n        [\"Chrome Service-Workers\", async evt => {\n          // does not work... security?\n          // window.open(\"chrome://inspect/#service-workers\")\n          // fuck it... just display it... better that nothing\n          var workspace = await lively.openWorkspace(\"chrome://inspect/#service-workers\")\n          workspace.parentElement.setAttribute(\"title\",\"open this in a tab...\")\n          workspace.mode = \"text\"\n        }],\n        [\"Handwriting\", async evt => {\n          var morph  = await this.openComponentInWindow(\"lively-handwriting\", evt, worldContext)\n          \n          lively.setExtent(morph.parentElement, lively.getExtent(morph).addPt(pt(0,20)))\n          // lively.setPosition(morph, lively.pt(0,0), \"fixed\")\n          // morph.style.bottom = \"0px\"\n          // morph.style.right= \"0px\"\n          this.hide();\n        }],\n        [\"Change Graph\", async evt => {\n          lively.openBrowser(lively4url + \"/doc/files/changesgraph.md\")\n          this.hide();\n        }],\n        [\"BP2019 Workspace\", async evt => {\n          const workspace = await this.openComponentInWindow(\"bp2019-workspace\", evt, worldContext);\n        },\n          \"\", '<i class=\"fa fa-terminal\" aria-hidden=\"true\"></i>'],\n        [\"MLE IDE\", evt => {this.openComponentInWindow(\"lively-mle-ide\", evt, worldContext).then(w => {w.parentNode.style.height=\"100vh\";w.parentNode.style.width=\"100vw\";lively.setGlobalPosition(w.parentNode, [0,0])})}, \"\", '<i class=\"fa fa-database\" aria-hidden=\"true\"></i>']\n      ], undefined, '<i class=\"fa fa-wrench\" aria-hidden=\"true\"></i>'],\n      [\"Server\", [\n         [\"Invalidate Transpiled Files\", async evt => {\n           \n          const FilesCaches = await System.import(\"src/client/files-caches.js\")\n          var list = await FilesCaches.invalidateTranspiledFiles()\n          var workspace = await lively.openWorkspace(\"\" + list)\n          workspace.parentElement.setAttribute(\"title\",\"Purged Transpiled Files\")\n          workspace.mode = \"text\"\n          \n        }],\n         [\"Purged Transpiled Files WARNING! SLOW!\", async evt => {\n           \n          const FilesCaches = await System.import(\"src/client/files-caches.js\")\n          var list = await FilesCaches.purgeTranspiledFiles()\n          var workspace = await lively.openWorkspace(\"\" + list.join(\"\\n\"))\n          workspace.parentElement.setAttribute(\"title\",\"Purged Transpiled Files\")\n          workspace.mode = \"text\"\n          \n        }],\n         [\"Update Cached Bootfiles\", async evt => {\n           \n          const FilesCaches = await System.import(\"src/client/files-caches.js\")\n          var list = await FilesCaches.updateCachedFilesList()\n          lively.openBrowser(lively4url + \"/.lively4bootfilelist\", true)        \n        }],\n      ], undefined, '<i class=\"fa fa-wrench\" aria-hidden=\"true\"></i>'],\n      [\n        \"Favorites\",\n          Favorites.get().then(urls => {\n            return urls.map(url => [\n              url.replace(/\\/index.md$/i, '').replace(/.*\\//i, ''), // only files names\n              async evt => {\n                const comp = await this.openComponentInWindow(\"lively-container\", evt, worldContext, pt(1000,600));\n                return comp.editFile(url);\n              },\n              <span click={function (event) {\n                const li = lively.query(this, 'li');\n                if(li) { li.remove(); }\n                event.stopPropagation();\n                Favorites.remove(url);\n              }}><i class=\"fa fa-close\" aria-hidden=\"true\"></i></span>,\n              undefined\n            ]);\n          }), undefined, '<i class=\"fa fa-star\" aria-hidden=\"true\"></i>'\n      ],\n      [\n        \"Parts\",\n          fetch(lively4url + \"/src/parts\", {\n            method: \"OPTIONS\"\n          }).then(r => r.json()).then( json => json.contents.filter(ea => ea.name.match(/\\.html/)).map(ea => {\n            var partName = \"\" + ea.name.replace(/\\.html/,\"\");\n            return [\n              partName, \n              async (evt) =>  {\n                var morph  = await lively.openPart(partName)          \n                lively.setGlobalPosition(morph, lively.getPosition(evt))\n                lively.hand.startGrabbing(morph, evt)\n                morph.classList.add(\"lively-content\")\n                this.hide();\n              }]}).concat([[\n            \"Vivide Applications\",\n            lively.files.statFile(applicationFolder).then(r => (JSON.parse(r).contents || [])\n              .filter(({ type }) => type=== 'file')\n              .map(({ name }) => [name.split('.')[0], async () => {\n                const content = JSON.parse(await lively.files.loadFile(applicationFolder+name));\n                const n = name.split('.')[0];\n                await createView(content, false, true, n);}\n              ]))\n          ]])), undefined, '<i class=\"fa fa-th-large\" aria-hidden=\"true\"></i>'\n      ],\n      [\n        \"Windows\", \n        Windows.allWindows().map(ea => [\n          \"\" + ea.getAttribute(\"title\"),\n          () => lively.gotoWindow(ea),\n          (<span click={function (event) {\n            ea.remove();\n            const li = lively.query(this, 'li')\n            if(li) {\n             li.remove();\n            }\n            event.stopPropagation();\n          }}><i class=\"fa fa-close\" aria-hidden=\"true\"></i></span>),\n          ea.getAttribute(\"icon\")\n        ]).concat([[\"Close all\", async () => {\n          if(await lively.confirm('Close all windows?')) {\n            document.body.querySelectorAll('lively-window').forEach(w => w.remove())\n          } \n        }]]), undefined, '<i class=\"fa fa-window-restore\" aria-hidden=\"true\"></i>'\n      ],\n      [\n        \"Debug\", [\n          ['Connections', existingConnectionsMenu, '', '<i class=\"fa fa-arrow-right\" aria-hidden=\"true\"></i>']\n          \n        ], undefined, '<i class=\"fa fa-bug\" aria-hidden=\"true\"></i>'\n      ],\n      \n      [\"View\", [\n        [\"Reset View\", () => ViewNav.resetView(), \n          \"\",'<i class=\"fa fa-window-restore\" aria-hidden=\"true\"></i>'],\n        \n        !document.webkitIsFullScreen ?\n            [\"Enter Fullscreen\", () => {\n                document.documentElement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)\n              },\n              \"F11\", '<i class=\"fa fa-arrows-alt\" aria-hidden=\"true\"></i>'\n            ] :\n            [\"Leave Fullscreen\", () => document.webkitCancelFullScreen(),\n              \"F11\", '<i class=\"fa fa-times-circle-o\" aria-hidden=\"true\"></i>'\n          ],\n\n        [\"Gather Windows\", () => {\n            var pos = pt(0,0)\n            _.sortBy(worldContext.querySelectorAll(\":scope > lively-window\"), ea => {\n              return getComputedStyle(ea).zIndex\n            }).forEach(ea => {\n              lively.setPosition(ea, pos)\n              pos = pos.addPt(pt(20,20))\n            })\n          },\n          \"\", '<i class=\"fa fa-window-restore\" aria-hidden=\"true\"></i>'\n        ],\n        [\"Explode Windows\", () => {\n            Layout.expandUntilNoIntersectionsExplosion()\n          },\n          \"\", '<i class=\"fa fa-window-restore\" aria-hidden=\"true\"></i>'\n        ],\n        [\"Show Windows\", () => {\n            var pos = pt(0,0)\n            var windowsByWidth = _.groupBy(document.body.querySelectorAll(\"lively-window\"), ea => ea.clientWidth) \n            Object.keys(windowsByWidth).forEach( width => {\n              windowsByWidth[width].forEach( ea => {\n                lively.setPosition(ea, pos)\n                pos = pos.addPt(pt(0, Math.max(lively.getExtent(ea).y, 50) + 10))\n              })\n              pos = pt(pos.x + Math.min(1000, Number(width)), 0)\n            })\n          },\n          \"\", '<i class=\"fa fa-window-restore\" aria-hidden=\"true\"></i>',\n        ],\n        [\"Snap All to Grid Now\", () => {\n          Grid.snapAllTopLevelContent()\n        },\n        \"\", '<i class=\"fa fa-th\" aria-hidden=\"true\"></i>'\n        ]\n      ]],\n      [\"Documentation\", [\n        [\"Keyboard Shortcuts\", () => {\n          lively.openBrowser(lively4url + \"/doc/manual/shortcuts.md\")\n          }, \n          \"\", '<i class=\"fa fa-file-text-o\" aria-hidden=\"true\"></i>'],\n        [\"Devdocs.io\", (evt) => {\n            this.openComponentInWindow(\"lively-help\",  evt, worldContext);\n          }, \n          \"CMD+H\", '<i class=\"fa fa-book\" aria-hidden=\"true\"></i>'],\n        [\"Docs\", (evt) => {\n          this.openComponentInWindow(\"lively-container\", evt, worldContext).then(comp => {\n              comp.followPath(lively4url + \"/doc/index.md\");\n            });\n          },\n          \"\",'<i class=\"fa fa-file-text-o\" aria-hidden=\"true\"></i>'\n        ],\n        [\"Vivide CheatSheet\", evt => {\n          this.openComponentInWindow(\"lively-container\", evt, worldContext).then(comp => {\n            comp.followPath(lively4url + \"/src/client/vivide/cheatsheet.md\");\n          });\n        },undefined, '<i class=\"fa fa-inbox\" aria-hidden=\"true\"></i>'],\n        [\"Vivide Scripts\", evt => this.openComponentInWindow(\"lively-container\", evt, worldContext).then(comp => comp.followPath(lively4url+\"/src/client/vivide/scripts/index.md\")), /* shortcut info */undefined, \"<i class='fa fa-wrench' aria-hidden='true'></i>\"],\n        [\"Journal\", (evt) => {\n          this.openComponentInWindow(\"lively-container\", evt, worldContext, pt(1000,600)).then(comp => {\n            comp.followPath(lively4url + \"/doc/journal/index.md\");\n          });\n        },\n          \"\",'<i class=\"fa fa-file-text-o\" aria-hidden=\"true\"></i>'],\n        [\"Issues\", (evt) => { \n          window.open(\"https://github.com/LivelyKernel/lively4-core/issues\") ;\n        },undefined, '<i class=\"fa fa-bug\" aria-hidden=\"true\"></i>'],\n        [\"Project Board\", (evt) => {\n           window.open(\"https://github.com/LivelyKernel/lively4-core/projects/1\") ;\n        },undefined, '<i class=\"fa fa-bug\" aria-hidden=\"true\"></i>'],\n        [\"Module Info\", () => {\n          Info.showModuleInfo()\n          },undefined, '<i class=\"fa fa-info\" aria-hidden=\"true\"></i>']\n      ]],\n      [\"Preferences\",\n        [[\"Search Roots\", [[\"update all\", () => {\n          SearchRoots.updateAllSearchRoots()\n        }]].concat(\n          SearchRoots.getSearchRoots().map(ea => {\n            return [ea.replace(lively4url.replace(/\\/[^/]*$/,\"\"),\"\"), [\n              [\"browse\", () => lively.openBrowser(ea)],\n              [\"update\", () => SearchRoots.addSearchRoot(ea)],\n              [\"remove\", () => SearchRoots.removeSearchRoot(ea)],\n            ]]  \n          }))]].concat(\n          lively.preferences.listBooleans()\n            .map(ea => this.preferenceEntry(ea)))\n      ],\n      [\"Sync Github\", (evt) => this.openComponentInWindow(\"lively-sync\", evt, worldContext, pt(900, 500)), \n        \"CMD+SHIFT+G\",'<i class=\"fa fa-github\" aria-hidden=\"true\"></i>']\n    ];\n    \n    \n    if (worldContext !== document.body) {\n      items.push(...[[\"save as ..\", () => {\n          if (worldContext.onSaveAs)\n            worldContext.onSaveAs() \n          else html.saveCurrentPageAs();\n        }],\n\n        [\"Save\", () => {\n            if (worldContext.onSave)\n              worldContext.onSave()\n            else\n              html.saveCurrentPage();\n          },\n          \"CMD+S\", '<i class=\"fa fa-cloud-upload\" aria-hidden=\"true\"></i>']])      \n    }\n    \n    return items\n  }\n  \n  static items (target, worldContext = document.body) {\n    console.log(\"[context menu] \" + worldContext)\n    if (target) {\n      return this.targetMenuItems(target);\n    } else {\n      return this.worldMenuItems(worldContext);\n    }\n  }\n  \n  static openIn(container, evt, target, worldContext, optItems) {\n    this.hide();\n    this.firstEvent = evt\n\n    var menu = lively.components.createComponent(\"lively-menu\");\n    return lively.components.openIn(container, menu).then(() => {\n      if (this.menu) this.menu.remove();\n      this.menu = menu;\n      if (evt) {\n        lively.setGlobalPosition(menu, pt(evt.clientX, evt.clientY))\n      }\n      // menu.focus()\n      lively.focusWithoutScroll(menu)\n      menu.openOn(optItems || this.items(target, worldContext), evt)\n      \n      // defere event registration to prevent closing the menu as it was opened\n      setTimeout(() => {\n        lively.addEventListener(\"contextMenu\", document.documentElement, \"click\", () => {\n          this.hide();\n        });        \n      }, 0)\n      \n      return menu;\n    });\n  }\n}\n\nif (self.lively && lively.contextmenu) {\n  lively.contextmenu = ContextMenu // make it live...\n}\n"]}