{"version":3,"sources":["https://lively-kernel.org/lively4/swt1-debugging/src/components/tools/lively-container-navbar.js"],"names":["Morph","ContextMenu","applyDragCSSClass","DropElementHandler","fileName","copyTextToClipboard","components","Preferences","Mimetypes","JSZip","moment","Strings","FileIndex","SearchRoots","_","FILTER_KEY_BLACKLIST","debugId","LivelyContainerNavbar","initialize","lively","html","registerKeys","get","addEventListener","evt","onDrop","onDragOver","onMouseDown","lastSelection","shiftKey","onContextMenu","getRoot","stopPropagation","preventDefault","root","url","show","update","urls","targetItem","uniq","allParents","reverse","map","ea","filter","content","sourceContent","sleep","clear","parentElement","innerHTML","updateFilter","dragFilesAsZip","files","tempfile","name","mimetype","dataTransfer","setData","zip","file","loadFile","saveFile","generateAsync","type","resetCursor","setCursorDetailsItem","navigateColumn","setCursorItem","onItemDragStart","link","getSelection","length","href","extension","join","dropEffect","transferMode","console","log","dropTarget","Array","from","composedPath","find","toString","classList","remove","dir","directory","confirm","forEach","newURL","dataURL","readBlobAsDataURL","blob","fetch","then","r","handle","element","notify","data","getData","htmlData","match","copyFromURL","dropHTMLAsURL","onDirectoryDrop","target","a","querySelector","onDirectoryDragOver","targetDir","Date","format","newurl","method","body","split","fromurl","filename","isDataURI","replace","now","size","getFilename","getSelectedItems","shadowRoot","querySelectorAll","getRootElement","selectItem","item","add","findItem","textContent","targetURL","contextURL","force","contentType","lastURL","lastContent","lastDir","currentDir","urlWithoutIndex","parentURL","targetParentItem","showDetails","showDetailsContent","currentRoot","showDirectory","scrollToItem","fetchStats","myStats","status","json","endsWith","stats","parent","e","contents","text","div","document","createElement","i","getAttribute","push","fileType","filesFromStats","sort","b","title","unshift","names","lastTitle","createItem","appendChild","icon","test","prefix","longestCommonPrefix","RegExp","escapeRegExp","otherUrl","includes","onclick","onItemClick","ondblclick","onItemDblClick","getLink","isDirectory","isSelected","selectedChild","contains","hasDetails","sublist","localName","code","toggle","container","query","editFile","System","normalizeSync","followPath","focusFiles","onDetailsItemClick","cursorDetailsItem","selectDetailsItem","navigateToName","focus","isDir","menuElements","selection","deleteFile","renameFile","convertFileToBundle","openBrowser","saveAsPNG","serverURL","buildPath","openURL","isSearchRoot","addSearchRoot","removeSearchRoot","isPicture","setURLAsBackground","basePath","newDirectory","newFile","menu","openIn","isFile","selectedURLs","path","lastPath","resp","headers","URL","createDetailsItem","onDetailsContextMenu","clearNameMD","lastDetailsURL","lastScrollTop","scrollTop","optionsWasHandles","clearDetails","parents","details","showDetailsHTML","showDetailsJS","showDetailsMD","showDetailsGS","showDetailsOptions","roots","parseHTML","template","findHeaders","id","hideDetails","hidden","simpleParseMD","source","defRegEx","m","links","exec","Error","level","keys","classInfos","current","db","classes","where","equals","each","aClassInfo","sortBy","start","classInfo","classItem","methodList","methods","eaMethodInfo","class","methodItem","static","insertBefore","kind","comments","leadingComments","eaComment","value","markdownLinks","key","first","commentItem","tagItem","matchAllDo","hashTagMatch","category","callback","isUnit","skills","skillKey","isSkill","usedBy","unitKey","options","onRightDown","cursorItem","onLeftDown","onUpDown","altKey","navigateItem","onDownDown","onEnterDown","nextLink","onKeyDown","direction","items","matchingItems","startItem","getCursorItem","index","indexOf","nextItem","relativeOffset","anyParent","offsetTop","scroll","rootList","t","y","h","offsetHeight","focusDetails","_filter","setGlobalPosition","getGlobalPosition","nonMatchingItems","detailItems","fileItems","matchFilter","toLowerCase","livelyMigrate","other","sourceContentthis","livelyUpdate","hightlightElement","lastAnitmation","finish","style","color","getComputedStyle","animate","duration","openInspector","browseMethodVersions","methodData","fileIndex","versions","toArray","baseURL","getFileElementByURL","sortIntoAfter","sibling","nextElementSibling","onObserveURLChange","startsWith","backgroundColor","parentElementList","firstSibling","error","onDetailsContentCursorActivity","editor","end","activeElement","startIndex","indexFromPos","endIndex","selectedDetails","livelyExample","lively4url","undefined","self","lively4fetchHandlers","isNavbarHandler","request","finsihed","navbar"],"mappings":"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","file":"lively-container-navbar.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport ContextMenu from 'src/client/contextmenu.js';\nimport { applyDragCSSClass, DropElementHandler } from 'src/client/draganddrop.js';\nimport { fileName, copyTextToClipboard } from 'utils';\nimport components from 'src/client/morphic/component-loader.js';\nimport Preferences from 'src/client/preferences.js';\nimport Mimetypes from 'src/client/mimetypes.js';\nimport JSZip from 'src/external/jszip.js';\nimport moment from \"src/external/moment.js\"; \nimport Strings from \"src/client/strings.js\"\n\nimport FileIndex from \"src/client/fileindex.js\"\nimport SearchRoots from \"src/client/search-roots.js\"\nimport _ from 'src/external/lodash/lodash.js'\n\n/*MD # Navbar\n\n![](lively-container-navbar.png){width=300px}\n\nMD*/\n\n\nconst FILTER_KEY_BLACKLIST = [\n  'Control', 'Shift', 'Capslock', 'Alt',\n  ' ', 'Enter',\n  'ArrowUp', 'ArrowRight', 'ArrowDown', 'ArrowLeft', 'Tab'\n];\n\nvar debugId = 0\n\nexport default class LivelyContainerNavbar extends Morph {\n  \n  /* # Base Component */\n  \n  // #important\n  async initialize() {\n    lively.html.registerKeys(this)\n    lively.html.registerKeys(this.get(\"#navbar\"))\n    lively.html.registerKeys(this.get(\"#details\"))\n    this.addEventListener(\"drop\", evt => this.onDrop(evt))\n    this.addEventListener(\"dragover\", evt => this.onDragOver(evt))\n    this.addEventListener(\"mousedown\", evt => this.onMouseDown(evt))\n    \n    this::applyDragCSSClass();\n    \n    this.lastSelection = [];\n    this.addEventListener('contextmenu', (evt) => {\n        if (!evt.shiftKey) {\n          this.onContextMenu(evt, this.getRoot())\n          evt.stopPropagation();\n          evt.preventDefault();\n          return true;\n        }\n    }, false);\n  }\n  \n  get root() {\n    return this.url\n  }\n  \n  set root(url) {\n    this.show(url)\n  }\n  \n  \n  // #important \n  async update() {\n    \n    var urls = this.targetItem ? _.uniq(lively.allParents(this.targetItem)\n      .reverse()\n      .map(ea => ea.url)\n      .filter(ea => ea)) : []\n    var url = this.url\n    var content = this.sourceContent\n    \n    for(let ea of urls) {\n      // console.log(\"show \" + ea)\n      await this.show(ea, \"\", urls[0])  \n      \n      await lively.sleep(50)\n    }\n    // await lively.sleep(1000)\n\n    await this.show(url, content, urls[0])  \n\n  }\n  \n  \n  clear(parentElement=this.get(\"#navbar\")) {\n    parentElement.innerHTML = \"\"\n    this.updateFilter(\"\")\n  }\n  \n  /*MD # #DragAndDrop #Files  MD*/\n  \n  // #private\n  async dragFilesAsZip(urls, evt) {\n    // working around issue https://bugs.chromium.org/p/chromium/issues/detail?id=438479\n    // to achieve https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransferitemlist-add\n    let url = lively.files.tempfile() + \".zip\", \n    name = `${lively.files.name(urls[0])} and more.zip`,\n    mimetype = \"application/zip\";\n    evt.dataTransfer.setData(\"DownloadURL\", `${mimetype}:${name}:${url}`);\n\n    // and now... we download, zip, and upload the files during the user drags them... \n    // #Hack and will definitely not work well all the time!\n    // #Idea, #Solution, we could make it stable if the lively4-serv will wait on the first \"GET\" request\n    // if the upload is not finished yet, but if it knows about a new tempFile\n    \n    \n    // Oh, my god! Now we are getting crazy!\n    // first download the files, then zip them, then upload then again, so that they can be dropped...?\n    // Yeah! :-)\n    var zip = new JSZip();\n    for(var ea of urls) {\n      zip.file(lively.files.name(ea), await lively.files.loadFile(ea));\n    }\n    lively.files.saveFile(url, await zip.generateAsync({type:\"blob\"})) \n  }\n\n  resetCursor() {\n    this.setCursorDetailsItem(null)\n    this.navigateColumn = \"files\"\n    this.setCursorItem(null)\n  }\n  \n  onItemDragStart(link, evt) {\n    this.resetCursor()\n    let urls = this.getSelection();\n    if (urls.length > 1) {\n      this.dragFilesAsZip(urls, evt)\n    } else {\n      let url = link.href,\n        name = lively.files.name(url)\n      var mimetype = Mimetypes.mimetype(lively.files.extension(name)) || \"text/plain\";\n      evt.dataTransfer.setData(\"DownloadURL\", `${mimetype}:${name}:${url}`);  \n      \n      urls = [url] // don't use selection, because the user meant to drag the link\n    }\n    evt.dataTransfer.setData(\"text/plain\", urls.join(\"\\n\"));\n  }\n  \n  onDragOver(evt) {   \n    if (evt.shiftKey) {\n      evt.dataTransfer.dropEffect = \"move\";\n      this.transferMode = \"move\"\n    } else {\n      evt.dataTransfer.dropEffect = \"copy\";\n      this.transferMode = \"copy\"\n    }\n    evt.preventDefault()    \n  }\n\n  async onDrop(evt, url) {\n    \n    if (!url) {\n      console.log(\"NO URL\")\n      var dropTarget = Array.from(evt.composedPath()).find(ea => ea.url)\n      url = dropTarget.url.toString()\n    }\n    \n    evt.preventDefault();\n    evt.stopPropagation();\n    \n    this.classList.remove(\"drag\")\n        \n    const files = evt.dataTransfer.files;\n    let dir = lively.files.directory(url);\n    if(files.length > 0 &&\n      await lively.confirm(`Copy ${files.length} file(s) into directory ${dir}?`)\n    ) {\n      Array.from(files).forEach(async (file) => {\n        var newURL = dir + \"/\" + file.name;\n        var dataURL = await lively.files.readBlobAsDataURL(file)  \n        var blob = await fetch(dataURL).then(r => r.blob())\n        await lively.files.saveFile(newURL, blob)\n        this.show(newURL, \"\"); // #TODO blob -> text\n      });\n      return;\n    }\n    \n    if (DropElementHandler.handle(evt, this, \n        (element, evt) => {lively.notify(\"handle \" + element)})\n    ) {\n      return;\n    }\n       \n    var data = evt.dataTransfer.getData(\"text\");   \n    var htmlData = evt.dataTransfer.getData(\"text/html\");    \n    if (data.match(\"^https?://\") || data.match(/^data\\:image\\/png;/)) {\n      this.copyFromURL(data, url);        \n    } else if (htmlData) {\n      data = evt.dataTransfer.getData();\n      this.dropHTMLAsURL(htmlData, url)\n    } else {\n      console.log('ignore data ' + data);\n    }\n  }\n  \n  async onDirectoryDrop(evt) {\n    console.log(\"in: onDirectoryDrop: \")\n    if (evt.target && evt.target.href) {\n      return this.onDrop(evt, evt.target.href)\n    }\n    var a = evt.target.querySelector(\"a\")\n    if (a) {\n      return this.onDrop(evt, a.href)\n    }\n    \n  }\n  \n  async onDirectoryDragOver(evt) {\n    return this.onDragOver(evt)\n  }\n  \n  onMouseDown(evt) {\n    // evt.stopPropagation()\n    // evt.preventDefault()\n  }\n  \n  \n  /* \n   *  Upload the dragged contents into a file.. and make up a name. \n   *  #Idea, instead of using a timestamp should be able to store a name in the data?\n   */\n  async dropHTMLAsURL(data,url=this.url) {\n    var targetDir = lively.files.directory(url)\n    var name = \"dropped_\" + moment(new Date()).format(\"YYMMDD_hhmmss\")\n    var newurl = targetDir + \"/\" + name + \".html\"\n    await fetch(newurl, {\n      method: \"PUT\",\n      body: data\n    })\n    this.update()\n    // console.log(\"dropped \" + newurl)\n  }\n  \n  async copyFromURL(data, url=this.url) {\n    var urls = data.split(\"\\n\")\n    var targetDir = lively.files.directory(url)\n    if (await lively.confirm(`${this.transferMode} ${urls.length} files to ${targetDir}?`)) {\n      for(var fromurl of urls) {\n        var filename = fromurl::fileName();\n        var isDataURI;\n        if (fromurl.match(/^data\\:image\\/png;/)) {\n          isDataURI = true\n          if (fromurl.match(/^data\\:image\\/png;name=/)) {\n            filename = fromurl.replace(/.*?name=/,\"\").replace(/;.*/,\"\")    \n          } else {\n            filename = \"dropped_\" + Date.now() + \".png\";\n          }\n        } else {\n          isDataURI = false\n        }\n\n        var newurl = url.replace(/[^/]*$/, filename)\n        var content = await fetch(fromurl).then(r => r.blob());\n        await fetch(newurl, {\n          method: \"PUT\",\n          body: content\n        })\n        if (this.transferMode == \"move\") {\n          await fetch(fromurl, {\n            method: \"DELETE\"\n          });\n          // put again... to be not delete it by accident\n          await fetch(newurl, {\n            method: \"PUT\",\n            body: content\n          })\n        }\n        \n        lively.notify(`${this.transferMode}d to ` + newurl + \": \" + content.size) \n        \n        this.show(newurl, content)\n      }\n    }  \n  }\n  \n  /*MD # Getters/Setters MD*/\n  \n  getRoot(url) {\n    url = url || this.url;\n    return url.toString().replace(/\\/[^\\/]+$/,\"/\") \n    /// return url.toString().replace(/\\.l4d\\/(index\\.md)?$/,\"\").replace(/\\/[^\\/]+$/,\"/\") // .l4d directories are treated as files\n  }\n  \n  getFilename(url) {\n    url = url || this.url;\n    return url.replace(/.*\\//,\"\")\n    // return url.replace(/\\.l4d\\/(index\\.md)?$/,\".l4d\").replace(/.*\\//,\"\")\n  }\n\n  getSelectedItems() {\n    return this.shadowRoot.querySelectorAll(\".selected\")\n  }\n  \n  getSelection() {\n    return _.map(this.shadowRoot.querySelectorAll(\".selected a\"), ea => ea.href)\n  }\n  \n  getRootElement() {\n    return this.get(\"#navbar\")\n  }\n  \n  /*MD # API MD*/\n  \n  selectItem(item) {\n    this.get(\"#navbar\").querySelectorAll(\".selected\").forEach(ea => ea.classList.remove(\"selected\"))\n    item.classList.add(\"selected\");      \n  }\n  \n  \n  findItem(url) {\n    return _.find(this.getRootElement().querySelectorAll(\"li\"), ea => {\n      if (ea.textContent == \"../\") return false\n      var link = ea.querySelector(\"a\")\n      return link && (link.href == url )\n    });\n  }\n\n  // #important #public \n  async show(targetURL, sourceContent, contextURL, force=false, contentType) {\n        \n    console.log(\"[navbar] show \" + targetURL + (sourceContent ? \" source content: \" + sourceContent.length : \"\"))\n    var lastURL = this.url\n    this.url = (\"\" + targetURL).replace(/[?#].*/,\"\"); // strip options \n    var lastContent = this.sourceContent\n    this.sourceContent = sourceContent\n    this.contentType = contentType\n    \n    this.contextURL = contextURL\n    var lastDir = this.currentDir\n    this.currentDir = this.getRoot(targetURL)\n\n    let urlWithoutIndex = this.url.replace(/(README.md)|(index\\.((html)|(md)))$/,\"\")\n    if (this.url.match(/microsoft:\\/\\//)) {\n      urlWithoutIndex = urlWithoutIndex.replace(/\\/contents/,\"\")\n    }\n    \n    this.targetItem = this.findItem(this.url) || this.findItem(urlWithoutIndex)\n    var parentURL = this.url.replace(/[^/]*$/,\"\")   \n    this.targetParentItem = this.findItem(parentURL)\n\n    if (this.targetItem || this.targetParentItem ) {\n        \n      if (!this.targetItem) {\n        // newfile or deleted file?\n        // lively.notify(\"NEW ?RESET DIR\")\n        this.targetItem = this.targetParentItem\n      }\n      \n      this.selectItem(this.targetItem)\n      if (lastDir !== this.currentDir) {\n        await this.showDetails()\n      } else if (lastURL !== this.url) {\n        await this.showDetails()\n      } else if (lastContent != this.sourceContent) {\n        await this.showDetailsContent(true)\n      }        \n      \n      return         \n    } else {\n      this.resetCursor()\n      // lively.notify(\"RESET DIR\")\n      this.currentRoot = targetURL.toString().replace(/[^/]*$/,\"\")\n      await this.showDirectory(targetURL, this.get(\"#navbar\"))\n      await this.showDetails()    \n      this.scrollToItem(this.targetItem)\n    }  \n  }\n  \n\n  \n  \n  async fetchStats(targetURL) {\n    var myStats = await fetch(targetURL, {\n      method: \"OPTIONS\",\n    }).then(r => r.status == 200 ? r.json() : {})\n        \n    if (targetURL.toString().endsWith('/')) {\n      var stats = myStats\n    } else {\n      // get stats of parent\n      if (myStats.parent) {\n        var root = myStats.parent\n      } else {\n        root = this.getRoot(targetURL)\n      }\n      try {\n        stats = await fetch(root, {\n          method: \"OPTIONS\",\n        }).then(r => r.status == 200 ? r.json() : {})\n      } catch(e) {\n        // no options....\n      }      \n    }\n    \n    \n    \n    if (!stats || !stats.type) {\n      stats = {};// fake it\n      stats.contents = [{type: \"file\", name: \"index.html\"}];\n      \n      var html = await fetch(root.replace(/\\/?$/,\"/\")).then(r => r.text())\n      var div = document.createElement(\"div\");\n      div.innerHTML = html;\n      var i=0;\n      Array.from(div.querySelectorAll(\"a\"))\n        .filter( ea => ea.getAttribute(\"href\") && !ea.getAttribute(\"href\").match(/^javascript:/))\n        .forEach( ea => {\n        stats.contents.push({\n          type: 'link', \n          name: '' + ea.getAttribute(\"href\").replace(/\\/(index.html)?$/,\"\").replace(/.*\\//,\"\"), // ea.textContent,\n          href: \"\" + ea.getAttribute(\"href\") \n        });\n      });\n    }\n    return stats\n  }\n  \n  fileType(file) {\n    // l4d bundle should sort like files\n    if (file.name.match(/\\.((l4d)|(md))$/)) return \"file\"\n    return file.type\n  }\n  \n  filesFromStats(stats) {\n    var files = stats.contents\n      .sort((a, b) => {        \n        if (this.fileType(a) > this.fileType(b)) {\n          return 1;\n        }\n        if (this.fileType(a) < this.fileType(b)) {\n          return -1;\n        }\n        // #Hack, date based filenames are sorted so lastest are first\n        if (a.name.match(/\\d\\d\\d\\d-\\d\\d-\\d\\d/) && b.name.match(/\\d\\d\\d\\d-\\d\\d-\\d\\d/)) {\n          return (a.name >= b.name) ? -1 : 1;          \n        }\n        \n        return ((a.title || a.name) >= (b.title || b.name)) ? 1 : -1;\n      })\n      .filter(ea => ! ea.name.match(/^\\./));\n    files.unshift({name: \"..\", type: \"directory\", url: stats.parent});\n    return files\n  }\n  \n\n  async showDirectory(targetURL, parentElement) {\n    \n    var filename = this.getFilename();\n    \n    var stats = await this.fetchStats(targetURL)\n    this.clear(parentElement);\n     \n    \n    var names = {};\n    stats.contents.forEach(ea => names[ea.name] = ea);\n    \n    var files = this.filesFromStats(stats).filter(ea =>\n      !(ea.name == \"..\" && parentElement !== this.getRootElement()))\n    \n    parentElement.url = targetURL\n   \n    this.lastTitle = \"\"\n    files.forEach((ea) => {\n\n      var element = this.createItem(ea)\n      if (ea.name == filename) {\n        this.targetItem = element;\n      }\n      if (this.targetItem) this.targetItem.classList.add(\"selected\");\n\n      \n      parentElement.appendChild(element);\n    });\n    delete this.lastTitle\n    \n    // this.clearDetails()\n  }\n  \n  createItem(ea, parentURL=this.currentDir) {\n    var element = document.createElement(\"li\");\n    var link = document.createElement(\"a\");\n    var name = ea.name;\n    element.name = ea.name\n    var icon;\n    if (ea.name.match(/\\.md$/)) {\n      icon = '<i class=\"fa fa-file-text-o\"></i>';\n      // some directories in lively are considered bundles and should behave like documents\n      if (ea.type == \"directory\") {\n        element.classList.add(\"directory\")\n      } else {\n        element.classList.add(\"file\")\n      }\n    } else if (ea.type == \"directory\") {\n      name += \"/\";\n      icon = '<i class=\"fa fa-folder\"></i>';\n      element.classList.add(\"directory\")\n    } else if (ea.type == \"link\") {\n      icon = '<i class=\"fa fa-arrow-circle-o-right\"></i>';\n      element.classList.add(\"link\")\n    } else if (/\\.html$/i.test(name)) {\n      icon = '<i class=\"fa fa-html5\"></i>'\n      element.classList.add(\"test\")\n    } else if (/(\\.|-)(spec|test)\\.js$/i.test(name)) {\n      icon = '<i class=\"fa fa-check-square-o\"></i>'\n      element.classList.add(\"test\")\n    } else if (/\\.js$/i.test(name)) {\n      icon = '<i class=\"fa fa-file-code-o\"></i>';\n      element.classList.add(\"file\");\n    } else if (/\\.css$/i.test(name)) {\n      icon = '<i class=\"fa fa-css3\"></i>';\n      element.classList.add(\"file\");\n    } else if (/\\.(png|jpg)$/i.test(name)) {\n      icon = '<i class=\"fa fa-file-image-o\"></i>';\n      element.classList.add(\"file\");\n    } else if (/\\.(pdf)$/i.test(name)) {\n      icon = '<i class=\"fa fa-file-pdf-o\"></i>';\n      element.classList.add(\"file\");\n    } else {\n      icon = '<i class=\"fa fa-file-o\"></i>';\n      element.classList.add(\"file\");\n    }\n    var title = ea.title || name\n  \n\n    if (ea.type == \"directory\") {\n       \n        element.addEventListener(\"drop\", evt => this.onDirectoryDrop(evt))\n        element.addEventListener(\"dragover\",evt => this.onDirectoryDragOver(evt))\n        \n        element::applyDragCSSClass();\n    }\n    \n    \n    // name.replace(/\\.(lively)?md/,\"\").replace(/\\.(x)?html/,\"\")\n\n    var prefix = this.lastTitle ? Strings.longestCommonPrefix([title, this.lastTitle]) : \"\"\n    prefix = prefix.replace(/-([a-zA-Z0-9])*$/,\"-\")\n    if (prefix.length < 4) {\n      prefix = \"\"\n    }      \n    link.innerHTML =  icon + title.replace(new RegExp(\"^\" + _.escapeRegExp(prefix)), \"<span class='prefix'>\" +prefix +\"</span>\")\n    this.lastTitle = title\n\n    var href = ea.href || ea.name;\n    if (ea.type == \"directory\" && !href.endsWith(\"/\")) {\n      href += \"/\"\n    }\n    var otherUrl = href.match(/^[a-z]+:\\/\\//) ? href : parentURL + \"\" + href;\n    link.href = ea.url || otherUrl;\n    element.url = link.href\n\n   \n    \n    if (this.lastSelection && this.lastSelection.includes(otherUrl)) {\n      element.classList.add(\"selected\")\n    }\n\n    link.onclick = (evt) => { \n      this.onItemClick(link, evt); \n      return false\n    };\n    link.ondblclick = (evt) => { \n      this.onItemDblClick(link, evt); \n      return false\n    };\n\n    link.addEventListener('dragstart', evt => this.onItemDragStart(link, evt))\n    link.addEventListener('contextmenu', (evt) => {\n        if (!evt.shiftKey) {\n          this.onContextMenu(evt, otherUrl)\n          evt.stopPropagation();\n          evt.preventDefault();\n          return true;\n        }\n    }, false);\n    element.appendChild(link);\n    return element\n  }\n  \n  \n  getLink(item) {\n    return item.querySelector(\":scope > a\")\n  }\n  \n  /*MD # Testing MD*/\n  \n  isDirectory(item) {\n    if (!item) return false\n    var link = this.getLink(item)\n    return link && link.href.match(/\\/$/) && true\n  }\n  \n  isSelected(item)  {\n    var selectedChild = item.querySelector(\".selected\")\n    \n    return item.classList.contains(\"selected\") || selectedChild\n  }\n  \n  hasDetails(item) {\n    var sublist = item.querySelector(\"ul\")\n    return sublist && sublist.querySelector(\"li\")\n  }\n  \n  /*MD # Selection Events MD*/\n  // #important\n  async onItemClick(link, evt) {\n    if (link.localName == \"li\") {\n      link = link.querySelector(\"a\") // if someone passed the item and not the link\n    }\n    \n    if (evt.type == \"click\") {\n      this.updateFilter(\"\")\n    }\n    \n    if (evt.shiftKey && evt.code != \"Enter\") {\n      link.parentElement.classList.toggle(\"selected\")\n      this.lastSelection = this.getSelection()     \n    } else {\n      this.lastSelection = []\n      // collapse previousely expanded tree\n      var item = link.parentElement\n      \n      if (this.isSelected(item) || this.hasDetails(item) && item== \"Enter\") { \n        this.currentDir = null\n        item.classList.remove(\"selected\")\n        var sublist = item.querySelector(\"ul\")\n        if (sublist) sublist.remove()\n      } else {\n        if (evt.shiftKey) {\n          var container = lively.query(this, \"lively-container\")\n          if (container) await container.editFile();\n        } \n        // non-http(s) paths are not normalized by default\n        const href = System.normalizeSync(link.href);\n        await this.followPath(link.href);\n      }\n      \n      \n    }\n    this.updateFilter(\"\")\n    this.focusFiles()\n    this.setCursorItem(null)\n  }\n  \n  async onItemDblClick(link, evt) {\n    this.clear()\n    await this.followPath(link.href);\n    this.focusFiles()\n  }\n  \n  // #important\n  async onDetailsItemClick(item, evt) {\n    evt.stopPropagation()\n    evt.preventDefault()\n    \n    if (evt.type == \"click\") {\n      this.updateFilter(\"\")\n    }\n    this.cursorDetailsItem = item\n    this.navigateColumn = \"details\"\n    var sublist = this.get(\"#details\").querySelector(\"ul\")\n    this.selectDetailsItem(item, sublist)\n    await this.navigateToName(item.name, item.data);\n    this.get(\"#details\").focus()\n  }\n\n  // #important\n  onContextMenu(evt, otherUrl=this.getRoot()) {\n    \n    var isDir = otherUrl.match(/\\/$/,\"\")\n    var file = otherUrl.replace(/\\/$/,\"\").replace(/.*\\//,\"\");\n    \n    const menuElements = []\n    \n    var selection =  this.getSelection()\n    if (selection.length < 2) {\n      selection = [otherUrl] // user means probably the thing pointed to\n    }\n    \n    if (selection.length > 0) {\n      menuElements.push(...[\n        ['<b>' + (selection.map(ea => ea.replace(/.*\\//, \"\")).join(\", \") + \"</b>\"), \n         () => {}, \"\", '>'],\n        [`delete `, () => this.deleteFile(otherUrl, selection)],\n      ])\n    } else {\n      menuElements.push(...[\n        ['<b>' + file + \"</b>\", \n         () => {}, \"\", '>'],\n      ])\n    }\n    if (selection.length == 1) {\n      menuElements.push(...[\n        [`rename`, () => this.renameFile(otherUrl)],\n        [`become bundle`, () => this.convertFileToBundle(otherUrl)],\n        \n        [\"edit \", () => lively.openBrowser(otherUrl, true)],\n        [\"browse\", () => lively.openBrowser(otherUrl)],\n        [\"save as png\", () => lively.html.saveAsPNG(otherUrl)],\n        [\"copy path to clipboard\", () => copyTextToClipboard(otherUrl), \"\", '<i class=\"fa fa-clipboard\" aria-hidden=\"true\"></i>'],\n        [\"copy file name to clipboard\", () => copyTextToClipboard(otherUrl::fileName()), \"\", '<i class=\"fa fa-clipboard\" aria-hidden=\"true\"></i>'],\n      ])\n      \n      let serverURL = lively.files.serverURL(otherUrl)\n      if (serverURL && serverURL.match(\"localhost\")) {\n        // does only make sense when accessing a localhost server, \n        // otherwise a pdf viewer would be opened on a remote machine?\n        menuElements.push([\"open externally\", async () => {\n          let buildPath = otherUrl.replace(serverURL,\"\").replace(/^\\//,\"\")\n          var openURL = serverURL + \"/_open/\" + buildPath \n          fetch(openURL)\n         }])\n      }\n      \n    }\n    \n    if (isDir) {\n      \n      if(SearchRoots.isSearchRoot(otherUrl)) {\n        menuElements.push(...[\n          [`update search root`, () => SearchRoots.addSearchRoot(otherUrl)],\n          [`remove search root`, () => SearchRoots.removeSearchRoot(otherUrl)],\n        ])        \n      } else {\n        menuElements.push(...[\n          [`add search root`, () => SearchRoots.addSearchRoot(otherUrl)],\n        ])\n      }\n    }\n\n    if (lively.files.isPicture(otherUrl)) {\n      menuElements.push(...[\n        [`set as background`, () => lively.files.setURLAsBackground(otherUrl)],\n      ])\n    }\n\n    \n    var basePath = otherUrl.replace(/[^/]*$/,\"\")\n    menuElements.push(...[\n      [\"new\", [\n        [`directory`, () => this.newDirectory( basePath+ \"newdirectory/\")],\n        [`markdown file`, () => this.newFile(basePath  + \"newfile\", \"md\")],\n        [`source file`, () => this.newFile(basePath  + \"newfile\", \"js\")],\n        [\"drawio figure\", () => this.newFile(basePath  + \"newfile\", \"drawio\")],\n      ], \"\", ''],  \n    ])\n    const menu = new ContextMenu(this, menuElements)\n    menu.openIn(document.body, evt, this)\n  }\n  \n  // #private\n  async convertFileToBundle(url) {\n    // var url = \"https://lively-kernel.org/lively4/lively4-jens/doc/journal/2018-08-17.md\"\n    if (!await lively.files.isFile(url)) {\n      lively.notify(\"Converion failed: \" + url + \" is no file!\")\n      return\n    }\n    var contents = await fetch(url).then(r => r.text());\n    await fetch(url, {method: 'DELETE'})\n    \n    await fetch(url + \"/\", {method: 'MKCOL'});\n    var newURL = url + \"/\" + \"index.md\"\n    await fetch(newURL, {method: 'PUT', body: contents});\n    this.followPath(newURL);\n  }\n    \n  /*MD \n  # Abstract Public Interface \n  \n  Please override/implement the following methods ... in `lively-container`\n  \n  MD*/\n  \n  deleteFile(url, selectedURLs) {\n    lively.notify(\"please implement deleteFile()\")\n  }\n\n  renameFile(url) {\n    lively.notify(\"please implement renameFile()\")\n  }\n\n  newFile(path, type) {\n    lively.notify(\"please implement newFile()\")\n  }\n  \n  newDirectory(path, type) {\n    lively.notify(\"please implement newDirectory()\")\n  }\n  \n  navigateToName(url, data) {\n    lively.notify(`please implement navigateToName(${url})`)\n  }\n\n  async followPath(url, lastPath) {\n    var resp = await fetch(url)\n    var content = \"\"\n    var contentType = resp.headers.get(\"content-type\")\n    if (contentType.match(/text\\//)) {\n      content = await resp.text()\n    } else {\n      // lively.notify(\"content type not suppored: \" + contentType)\n    }\n    this.show(new URL(url), content, this.contextURL)\n  }\n\n  \n\n  \n  /*MD # Details \n  \n  - #TODO refactor \"sublist\" -> \"details\"\n  - maybe extract / separate `Files` and `Details`\n  \n  MD*/\n  \n  createDetailsItem(name) {\n    var item = <li class=\"link\" click={evt => this.onDetailsItemClick(item, evt)}><a>{name}</a></li>\n    item.name = name\n    item.addEventListener('contextmenu', (evt) => {\n        if (!evt.shiftKey) {\n          this.onDetailsContextMenu(evt, item)\n          evt.stopPropagation();\n          evt.preventDefault();\n          return true;\n        }\n    }, false);\n    \n    return item\n  }\n   \n  // #private\n  selectDetailsItem(element, sublist) {\n    for(var ea of sublist.querySelectorAll(\".selected\")) {\n      ea.classList.remove(\"selected\")\n    }\n    element.classList.add(\"selected\")\n  }\n  \n  // #private\n  clearNameMD(name) {\n    return name\n      .replace(/<.*?>/g, \"\")\n      .replace(/\\{.*/g, \"\")\n      .replace(/\\(.*?\\)/g, \"\")\n      .replace(/[\\[\\]]/g, \"\")\n      .replace(/\\n/g, \"\")\n      .replace(/([ ,])#/g, \"$1\")\n  }\n  async showDetails(force) {\n    // console.log(\"show sublist \" + this.url)\n     \n    \n    if (this.url == this.lastDetailsURL) {\n      this.lastScrollTop = this.get(\"#details\").scrollTop  // preserve scroll, when just refreshing...\n    } else {\n      this.lastScrollTop = 0 \n    }\n    this.lastDetailsURL = this.url\n    \n    if (this.targetItem) {\n      var sublist = this.targetItem.querySelector(\"ul\")\n      if (!sublist) {\n        sublist = document.createElement(\"ul\");\n        this.targetItem.appendChild(sublist);\n      } else {\n        sublist.innerHTML = \"\"\n      }\n      if (this.url !== this.contextURL && this.targetItem.classList.contains(\"directory\")) {\n        var optionsWasHandles = true\n        await this.showDirectory(this.url, sublist)\n      }      \n    }\n    this.showDetailsContent(optionsWasHandles)\n  } \n  \n  clearDetails() {\n    // console.log(\"clear sublists\")\n    var parents = this.targetItem ? lively.allParents(this.targetItem) : [];\n    // remove all sublists... but my own tree\n    Array.from(this.get(\"#navbar\").querySelectorAll(\"ul\"))\n      .filter(ea => !parents.includes(ea) && !lively.allParents(ea).includes(this.targetItem))\n      .forEach(ea => ea.remove())    \n\n    Array.from(this.get(\"#navbar\").querySelectorAll(\".subitem\"))\n      .forEach(ea => ea.remove())    \n\n  }\n  \n  async showDetailsContent(optionsWasHandles) {\n    \n    if (this.url.match(\"wikipedia\")) {debugger}\n    \n    var details = this.get(\"#details\")\n    details.innerHTML = \"\"\n    var sublist = <ul></ul>\n    details.appendChild(sublist)\n    \n    \n    \n    \n    // keep expanded trees open... or not\n    // this.clearDetails()\n    \n    \n    if (this.url.match(/.*html$/) || this.contentType == \"text/html\") {\n      this.showDetailsHTML(sublist)\n    } else if (this.url.match(/\\.js$/)) {\n      await this.showDetailsJS(sublist)\n    } else if (this.url.match(/\\.md$/)) {\n      // console.log(\"show sublist md\" + this.url)\n\n      this.showDetailsMD(sublist)\n    } else if (this.url.match(/^gs:/)) {\n      this.showDetailsGS(sublist)\n    } else {\n      if (!optionsWasHandles) {\n        this.showDetailsOptions(sublist)\n      }\n    }\n    \n     details.scrollTop  = this.lastScrollTop\n    \n  }\n  \n  // #HTML\n  showDetailsHTML(sublist) {\n    \n\n    if (!this.sourceContent) return;\n    var roots = lively.html.parseHTML(this.sourceContent)\n    var template =  roots.find(ea => ea.localName == \"template\");\n      if (!template) {\n        \n        lively.html.findHeaders(roots).forEach(ea => {\n          \n          \n          var element = this.createDetailsItem(ea.textContent);\n          element.classList.add(\"subitem\");\n\n          var id = ea.getAttribute('id')\n          if (id) {\n            element.name = id\n          } else {\n            element.name = ea.textContent\n          }\n          \n          element.onclick = (evt) => {\n            this.onDetailsItemClick(element, evt)\n          }\n          sublist.appendChild(element) ;\n        });\n        \n      } else {\n        // fill navbar with list of script\n        Array.from(template.content.querySelectorAll(\"script\")).forEach(ea => {\n          var element = this.createDetailsItem(ea.getAttribute('data-name'));\n          element.classList.add(\"subitem\");\n\n          \n          element.name = ea.getAttribute('data-name')\n          \n          \n          element.onclick = (evt) => {\n            this.onDetailsItemClick(element, evt)\n          }\n          sublist.appendChild(element) ;\n        });        \n      }\n  }\n  \n  hideDetails() {\n    this.get(\"#details\").hidden = true\n  }\n  \n  // #Markdown #private #Refactor \n  simpleParseMD(source) {\n    if (!source) return {};\n    let defRegEx = /(?:^|\\n)( *(#+) ?(.*))/g;\n    let m;\n    let links = {};\n    let i=0;\n    while (m = defRegEx.exec(source)) {\n      if (i++ > 1000) throw new Error(\"Error while showingNavbar \" + this.url);\n      links[m[3]] = {name: m[0], level: m[2].length};\n    }\n    return links\n  }\n  \n  // #important\n  showDetailsMD(sublist) {\n    // console.log(\"sublist md \" + this.sourceContent.length)\n    var links = this.simpleParseMD(this.sourceContent)\n    _.keys(links).forEach( name => {\n      var item = links[name];\n      var element = this.createDetailsItem(this.clearNameMD(name));;\n      element.classList.add(\"link\");\n      element.classList.add(\"subitem\");\n      element.classList.add(\"level\" + item.level);\n      element.name = this.clearNameMD(item.name)\n      element.onclick = (evt) => {\n          this.onDetailsItemClick(element, evt)\n      }\n      sublist.appendChild(element);\n    });\n  }\n  \n  // #JavaScript #important\n  async showDetailsJS(sublist) {\n    var classInfos = [];\n    \n    await FileIndex.current().db.classes.where(\"url\").equals(this.url).each(aClassInfo => {\n        classInfos.push(aClassInfo)\n    })\n    \n    classInfos = classInfos.sortBy(ea => ea.start) \n    \n       \n    classInfos.forEach((classInfo) => {\n      let name = classInfo.name;\n      var classItem = this.createDetailsItem(name)\n      classItem.classList.add(\"class\")\n      \n      classItem.classList.add(\"subitem\");\n      classItem.classList.add(\"level1\");\n      var methodList = <ul></ul>\n      classItem.appendChild(methodList)\n      classItem.data = classInfo\n      classInfo.methods.forEach(eaMethodInfo => {\n        eaMethodInfo.url = this.url\n        eaMethodInfo.class = classInfo.name // for later use\n        var name = eaMethodInfo.name\n        var methodItem = this.createDetailsItem(name)\n        if (eaMethodInfo.static) {\n          methodItem.insertBefore(<span class=\"mod\">static</span>, methodItem.querySelector(\"a\"))\n        }\n        \n        if (eaMethodInfo.kind != \"method\") {\n          methodItem.insertBefore(<span class=\"mod\">{eaMethodInfo.kind}</span>, methodItem.querySelector(\"a\"))\n        }\n        var comments = eaMethodInfo.leadingComments || []\n        comments.forEach(eaComment => {\n          // special markdown tag\n          var m = eaComment.value.match(/^MD((.|\\n)*)MD$/m)\n          if (m) {\n            var markdownLinks = this.simpleParseMD(m[1])\n            var key = _.keys(markdownLinks).first\n            var item =  markdownLinks[key]\n            if (item) {\n              var commentItem = this.createDetailsItem(this.clearNameMD(key))  \n              commentItem.data = eaComment\n              commentItem.classList.add(\"comment\")\n              commentItem.classList.add(\"subitem\")\n              commentItem.classList.add(\"level\" + item.level);\n              methodList.appendChild(commentItem)\n            }\n          } else {\n            var tagItem = <span class=\"tag\">{eaComment.value}</span>\n                \n            Strings.matchAllDo(/#([A-Za-z0-9]+)/g, eaComment.value, (hashTagMatch) => {\n              methodItem.classList.add(hashTagMatch) // #TODO, #Refactor, etc.. just for CSS \n            })\n            methodItem.appendChild(tagItem)\n          }\n           \n        })\n        methodItem.classList.add(\"subitem\");\n        methodItem.classList.add(\"method\")\n        methodItem.classList.add(\"level2\");\n        methodItem.data = eaMethodInfo\n        methodList.appendChild(methodItem)\n      }) \n      sublist.appendChild(classItem)\n    })\n  }\n\n  async showDetailsGS(sublist) {\n    const category = name => {\n      const element = this.createDetailsItem(name);\n      element.classList.add(\"subitem\", \"level1\");\n      sublist.appendChild(element);\n    }\n\n    const item = (name, callback) => {\n      const element = this.createDetailsItem(name);\n      element.classList.add(\"link\", \"subitem\", \"level2\");\n      element.onclick = callback;\n      sublist.appendChild(element);\n    }\n\n    const isUnit = this.url.match(/^gs:docs\\/units\\/([-\\w]+)$/);\n    if (isUnit) {\n      category('Skills');\n      const details = await this.url.fetchStats({ details: true });\n      details.skills.sortBy().forEach(skillKey => {\n        item(skillKey, () => this.followPath('gs:docs/skills/' + skillKey));\n      })\n      return;\n    }\n\n    const isSkill = this.url.match(/^gs:docs\\/skills\\/([-\\w]+)$/);\n    if (isSkill) {\n      category('Used By');\n      const details = await this.url.fetchStats({ details: true });\n      details.usedBy.sortBy().forEach(unitKey => {\n        item(unitKey, () => this.followPath('gs:docs/units/' + unitKey));\n      })\n      return;\n    }\n\n    // fallback: just render something...\n    var links = {\n      1: 'one',\n      2: 'two',\n      3: 'three',\n    }\n    _.keys(links).forEach( name => {\n      var item = links[name];\n      var element = this.createDetailsItem(name);\n      element.classList.add(\"link\");\n      element.classList.add(\"subitem\");\n      element.classList.add(\"level\" + (name));\n      // element.name = this.clearNameMD(item.name)\n      element.onclick = (evt) => {\n          this.onDetailsItemClick(element, evt)\n      }\n      sublist.appendChild(element);\n    });\n  }\n\n\n  async showDetailsOptions(sublist, url) {\n    url = url || this.url\n    try {\n      var options = await fetch(url, {method: \"OPTIONS\"})\n        .then(r => r.status == 200 ? r.json() : {})\n    } catch(e) {\n      // no options...\n      return \n    }\n    if (!options.contents) return;\n    for(let ea of options.contents) { // #Bug for(var ea) vs for(let)\n      let element = <li \n          class=\"link subitem\" title={ea.name}>{ea.name}</li>\n      sublist.appendChild(element);\n      element.onclick = () => {\n        this.selectDetailsItem(element, sublist)\n        if (ea.href) {\n          this.followPath(ea.href);\n        } else {\n          this.followPath(url + \"/\" + ea.name)\n        }\n      }\n    }\n  }\n  \n  \n  /*MD ## Keyboard Navigation MD*/\n  async onRightDown(evt) {\n    evt.stopPropagation()\n    evt.preventDefault()\n    \n    this.updateFilter(\"\")\n    if (!this.navigateColumn || this.navigateColumn == \"files\") {\n      \n      if(this.cursorItem && this.targetItem !== this.cursorItem) {\n        await this.onItemClick(this.cursorItem,  evt)\n      }\n      \n      this.navigateColumn = \"details\"\n      var details = this.get(\"#details\")\n      details.focus()\n      this.setCursorItem(details.querySelector(\"li\"))\n    } else if (this.navigateColumn == \"details\") {\n    \n      var container = lively.query(this, \"lively-container\")\n      if (container) container.focus()\n    \n      \n    }   \n  }\n  \n  onLeftDown(evt) {\n    evt.stopPropagation()\n    evt.preventDefault()\n    this.updateFilter(\"\")\n    \n    if (!this.navigateColumn || this.navigateColumn == \"details\") {\n      this.navigateColumn = \"files\"\n      this.get(\"#navbar\").focus()    \n    }    \n  }\n\n  async onUpDown(evt) {\n    if (evt.altKey) {\n      evt.stopPropagation()\n      evt.preventDefault()\n      var container = lively.query(this, \"lively-container\")\n      if (container) {\n        container.get(\"#container-path\").focus()\n      }\n      return\n    }\n    this.navigateItem(\"up\", evt)\n  }\n\n  onDownDown(evt) {\n    this.navigateItem(\"down\", evt)\n  }\n  \n  \n  async onEnterDown(evt) {\n    evt.stopPropagation()\n    evt.preventDefault()\n    \n    var item = this.cursorItem || this.targetItem\n    if (this.navigateColumn == \"details\") {\n      if (this.cursorDetailsItem) {\n        if (evt.shiftKey) {\n          var container = lively.query(this, \"lively-container\")\n          if (container) {\n            await container.editFile()\n          }\n        } \n        await this.onDetailsItemClick(this.cursorDetailsItem, evt)\n        this.onRightDown(evt)\n      }\n    } else if (item) {\n      var nextLink = item.querySelector(\"a\")\n      await this.onItemClick(nextLink, evt) \n      \n      this.setCursorItem(item)      \n    }\n  }\n  \n  onKeyDown(evt) {\n    if(FILTER_KEY_BLACKLIST.includes(evt.key)) { return; }\n\n    if(evt.key == \"PageUp\" || evt.key == \"PageDown\") {\n      evt.stopPropagation()\n      evt.preventDefault()\n    }\n    \n    if (evt.altKey && evt.key == \"Backspace\") {\n      return this.onLeftDown(evt)\n    }\n     \n    \n    if(['Backspace', 'Delete', 'Escape'].includes(evt.key)) {\n      this.filter = '';\n    } else {\n      if (evt.key.length == 1) {\n        this.filter += evt.key;\n      }\n    }\n    \n    this.updateFilter()\n  }\n  \n  /*MD # Focus and Scrolling MD*/\n  \n  navigateItem(direction, evt) {\n    evt.stopPropagation()\n    evt.preventDefault()    \n    var items = this.matchingItems\n    var startItem = this.getCursorItem()\n    if (!startItem) return\n    var index = items.indexOf(startItem)\n    \n    var nextItem = items[index + (direction == \"down\" ? 1 : -1) ] \n   \n    if(nextItem) {\n      this.setCursorItem(nextItem)\n      if (nextItem.classList.contains(\"directory\")) {\n        // just navigate\n      } else {\n        if (this.navigateColumn == \"details\") {\n          // preview details while navigating\n          this.onDetailsItemClick(nextItem, evt)\n        } else {\n          // don't preview while browsing files, because it is to slow\n        }\n      } \n      this.scrollToItem(nextItem)\n    }\n  }\n\n  // #private\n  relativeOffset(item, anyParent) {\n    return item.offsetTop - anyParent.offsetTop\n    // var nextParent = item.parentElement\n    // if (anyParent === nextParent) {\n    //   return item.offsetTop\n    // } else {\n    //   return item.offsetTop + this.relativeOffset(nextParent, anyParent) \n    // }\n    \n  }\n  \n  scrollToItem(item, scroll = this.rootList()) {\n    if (!item) return\n    \n    var t = scroll.scrollTop \n    var y = this.relativeOffset(item, scroll)\n    var h = item.offsetHeight\n    var b = scroll.scrollTop + scroll.offsetHeight\n    \n    // #Id #Visualization\n    // lively.showPoint(lively.getGlobalPosition(scroll).addPt(pt(0, t - scroll.scrollTop))).style.backgroundColor = \"blue\" \n    // lively.showPoint(lively.getGlobalPosition(scroll).addPt(pt(0, y - scroll.scrollTop))) \n    // lively.showPoint(lively.getGlobalPosition(scroll).addPt(pt(0, b - scroll.scrollTop))).style.backgroundColor = \"green\"\n    // console.log(`t: ${t} y: ${y} b: ${b}`)\n    \n    if (h > scroll.offsetHeight) {\n      return // don't scroll to items that are to big... #DoesItWork?\n    }\n    \n    if (t < y && y < b) {\n      return // no need to scroll\n    }\n    \n    if (y + h > (scroll.scrollTop + scroll.offsetHeight)) {\n      // scroll down\n      scroll.scrollTop = y - scroll.offsetHeight + h\n    } else if ( (y ) < (scroll.scrollTop)) {\n      // scroll up\n      scroll.scrollTop = y\n    }    \n  }\n  \n  \n  getCursorItem() {\n    if (this.cursorItem && !this.cursorItem.parentElement) {\n      this.cursorItem = null\n    }\n    var startItem\n    if (this.navigateColumn == \"details\") {\n      startItem = this.cursorDetailsItem || this.get(\"#details\").querySelector(\"li\")\n    } else {\n      startItem = this.cursorItem || this.targetItem || this.get(\"#navbar\").querySelector(\"li\")\n    }\n    return startItem\n  }\n  \n  setCursorItem(nextItem) {\n    var startItem = this.getCursorItem()\n    if (startItem) {\n      startItem.classList.remove(\"cursor\")\n    }\n    if (nextItem) {\n      nextItem.classList.add(\"cursor\")\n    }\n    if (this.navigateColumn == \"details\") {\n      this.cursorDetailsItem = nextItem  \n    } else {\n      this.cursorItem = nextItem  \n    }\n  }\n  \n  setCursorDetailsItem(item) {\n    if (this.cursorDetailsItem) {\n      this.cursorDetailsItem.classList.remove(\"cursor\")\n    }\n    this.cursorDetailsItem = null\n  }\n  \n  focusDetails() {\n    this.navigateColumn = \"details\"\n    this.get(\"#details\").focus()\n  }\n\n  focusFiles() {\n    this.navigateColumn = \"files\"\n    this.get(\"#navbar\").focus()\n  }\n  \n  rootList() {\n    if (this.navigateColumn == \"details\") {\n      return this.get(\"#details\")\n    } else {\n      return this.get(\"#navbar\")\n    }\n  }\n\n  /*MD # Filter \n  Copied from lively-menu \n  MD*/\n  // lazy filter property\n  get filter() { return this._filter = this._filter || ''; }\n  set filter(value) { return this._filter = value; }\n  \n  updateFilter(filter=this.filter) {\n    this.filter = filter\n    \n    this.get('#filter-hint').innerHTML = this.filter;\n    lively.setGlobalPosition(this.get('#filter-hint'), lively.getGlobalPosition(this.rootList()))\n    \n    \n    // lively.warn(evt.key, this.filter)\n    \n    this.items.forEach(item => item.classList.remove('filtered-out'));\n    this.nonMatchingItems.forEach(item => item.classList.add('filtered-out'));\n    \n    if (this.filter.length > 0) {\n      this.setCursorItem(this.matchingItems.first)\n    }\n  }\n\n  \n  get detailItems() {\n    return Array.from(this.get(\"#details\").querySelectorAll(\"li\"));\n  }\n  \n  get fileItems() {\n    return Array.from(this.get(\"#navbar\").querySelectorAll(\"li\"));\n  }\n  \n  get items() {\n    if(this.navigateColumn == \"details\") {\n      return this.detailItems\n    } else {\n      return this.fileItems\n    }\n    \n  }\n  \n  matchFilter(item) {\n    if (this.filter.length == 0) return true;\n    if(!item || !item.name ) { return false; }\n    return (item.name + \"\").toLowerCase().includes(this.filter.toLowerCase());\n  }\n  \n  get matchingItems() {\n    return this.items.filter(item => this.matchFilter(item));\n  }\n  \n  get nonMatchingItems() {\n    return this.items.filter(item => !this.matchFilter(item));\n  }\n  \n  async livelyMigrate(other) {\n    await this.show(other.url, other.sourceContentthis, other.contextURL, true)\n  }\n\n  livelyUpdate() {\n    this.clear()\n    this.show(this.url,this.sourceContent, this.contextURL, true, this.contentType)\n  }\n  \n  hightlightElement(element) {\n    var text = element.querySelector(\"a\") || element\n    if (this.lastAnitmation) this.lastAnitmation.finish()\n    text.style.color = getComputedStyle(text).color || \"black\"\n    \n    this.lastAnitmation = text.animate([\n      { color: text.style.color }, \n      { color: 'green' }, \n      { color:  text.style.color }, \n    ], { \n      duration: 2000,\n    });\n  }\n\n  /*MD ## Context Menu MD*/\n  \n  // #TODO do something useful here\n  onDetailsContextMenu(evt, item) {    \n    const menuElements = []\n    menuElements.push(...[\n      [`do nothing`, () => {lively.notify(\"I said nothing! really!\")}],\n    ])\n    \n    if (item.data) {\n      menuElements.push([`inspect`, () => {lively.openInspector(item.data)}])\n      menuElements.push([`versions`, () => {this.browseMethodVersions(item.data)}])\n    }\n    \n    const menu = new ContextMenu(this, menuElements)\n    menu.openIn(document.body, evt, this)\n  }\n  \n  /*MD ## Helper MD*/\n  \n  // #Refactor move away\n  async browseMethodVersions(methodData) {\n    var fileIndex = FileIndex.current()\n    var versions = await fileIndex.db.versions.where({\n      url: methodData.url,\n      class: methodData.class,                               \n      method: methodData.name }).toArray()\n    \n    // #Vivide #UseCase\n    lively.openInspector(versions)\n  }\n  /*MD\n  # Change Observer\n  \n  MD*/\n  \n  // #private\n  baseURL(url) {\n    if (url) {\n      return url.replace(/[#?].*/,\"\")\n    }\n  }\n  \n  // #private\n  getFileElementByURL(url) {\n    url = this.baseURL(url)\n    return this.fileItems.find(ea =>  this.baseURL(ea.url) == url && ea.textContent !== \"../\")\n  }\n  \n  // #private\n  sortIntoAfter(sibling, element) {\n    \n    if (!sibling) return\n    if (sibling.classList.contains(\"file\") && element.textContent < sibling.textContent) {\n      sibling.parentElement.insertBefore(element, sibling) \n      return true\n    } else {\n      if (sibling.nextElementSibling) {\n        return this.sortIntoAfter(sibling.nextElementSibling, element)\n      } \n    }\n    \n  }\n  \n  // #important\n  async onObserveURLChange(url, method) {\n\n    try {\n      url = this.baseURL(url)\n      if (url.startsWith(this.currentRoot)) {\n        // console.log(\"[navbar] \" + (this.debugId || \"\" )+\" onObserveURLChange \" + method + \" \" +  url)\n        // lively.showLog(this, method + \" \" + url)\n        let element = this.getFileElementByURL(url)\n        if (element) {          \n          // File Element does Exists\n          if (method == \"PUT\") {\n            this.hightlightElement(element)\n            if (this.baseURL(this.url) == url) {\n              await this.showDetails(true) \n            }\n          } else if(method == \"DELETE\") {\n            element.style.backgroundColor = \"red\"            \n            element.remove()\n          }\n        } else {\n          // File Element does not Exists\n          if (method == \"PUT\") {\n            \n          \n            \n            let parentURL = url.replace(/\\/+[^/]+$/,\"/\")\n            let parentElement = this.getFileElementByURL(parentURL)\n            if (this.currentRoot == parentURL) parentElement = this.get(\"#row\")\n            if (parentElement) {\n              var stats = await fetch(url, {method: \"OPTIONS\"}).then(r => r.json())\n              stats.name = stats.name.replace(/.*\\//,\"\")\n              element = this.createItem(stats, parentURL)\n                          \n              var parentElementList = parentElement.querySelector(\":scope > ul\") \n\n              if (parentElementList) {\n                var firstSibling = parentElementList.querySelector(\":scope > li\")\n                \n                if (!this.getFileElementByURL(url)) { // check again if this was not insereted yet...\n                  if (!this.sortIntoAfter(firstSibling, element)) {\n                    parentElementList.appendChild(element) \n                  }\n                  this.hightlightElement(element)                              \n                }\n              } \n            } \n          } else {\n            console.log(\"[navbar] WARN could not delete \" + url)\n          }\n        }\n      }      \n    } catch(e) {\n      console.error(e)\n    }\n  }\n  \n  onDetailsContentCursorActivity(editor, start, end) {\n\n    if (lively.activeElement() == this.get(\"#details\")) return\n    \n    var startIndex = editor.indexFromPos(start)\n    var endIndex = editor.indexFromPos(end)\n    \n    this.setCursorDetailsItem(null)\n    \n    this.detailItems.forEach(ea => ea.classList.remove(\"selected\"))\n    \n    var selectedDetails = []\n  \n    this.detailItems.forEach(ea => {\n      if( !ea.data ) return;\n      if (ea.data.start <= startIndex && startIndex < ea.data.end ) {\n        this.cursorDetailsItem  = ea\n        selectedDetails.push(ea)\n      }\n      \n      if (ea.data.end < startIndex) return;\n      if (ea.data.start > endIndex) return;\n        selectedDetails.push(ea)\n      \n    })\n    \n    \n    selectedDetails.forEach(ea => ea.classList.add(\"selected\"))\n    this.scrollToItem(this.cursorDetailsItem, this.get(\"#details\")) // scroll only to the last selected cursor... \n    \n    // lively.notify(\"start\" + startIndex)\n    \n  }\n  \n  \n  async livelyMigrate(other) {\n    this.url = other.url\n    this.contentType = other.contentType\n    this.sourceContent = other.sourceContent\n  }\n  \n  async livelyExample() {\n    var url = lively4url + \"/README.md\"\n    // var url = \"innerhtml://\"\n    // var url = \"https://lively-kernel.org/lively4/testdir/\"\n    // var url = \"wikipedia://en/Bourne_shell\"\n    var content = await fetch(url).then(r => r.text())\n    await this.show(url, content, undefined, undefined, \"text/html\" )\n  }\n}\n\n/*MD # Fetch Hook MD*/\n\nif (self.lively4fetchHandlers) {  \n  // remove old instances of me\n  self.lively4fetchHandlers = self.lively4fetchHandlers.filter(ea => !ea.isNavbarHandler);\n  self.lively4fetchHandlers.push({\n    isNavbarHandler: true,\n    handle(request, options) {\n      // do nothing\n    }, \n    async finsihed(request, options) {\n      let url = (request.url || request).toString()\n      let method = \"GET\"\n      if (options && options.method) method = options.method;\n      if (method == \"PUT\" || method == \"DELETE\") {\n        try {\n          for(var container of document.querySelectorAll(\"lively-container\")) {\n            let navbar = container.get(\"lively-container-navbar\")\n            if (navbar && navbar.onObserveURLChange) {\n\n              await navbar.onObserveURLChange(url, method)\n            }\n          }        \n        } catch(e) {\n          console.error(e)\n        }\n      }\n    }\n  })\n  \n}\n"]}