{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-constraints/src/components/tools/lively-container-navbar.js"],"names":["Morph","ContextMenu","applyDragCSSClass","DropElementHandler","fileName","copyTextToClipboard","components","Preferences","Mimetypes","JSZip","moment","FileCache","FileIndex","Strings","FILTER_KEY_BLACKLIST","debugId","LivelyContainerNavbar","initialize","lively","html","registerKeys","get","addEventListener","evt","onDrop","onDragOver","onMouseDown","lastSelection","shiftKey","onContextMenu","getRoot","stopPropagation","preventDefault","update","urls","targetItem","_","uniq","allParents","reverse","map","ea","url","filter","content","sourceContent","show","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","parent","root","stats","e","contents","text","div","document","createElement","i","getAttribute","push","fileType","filesFromStats","sort","b","title","unshift","names","lastTitle","createItem","appendChild","icon","test","prefix","longestCommonPrefix","RegExp","endsWith","otherUrl","includes","onclick","onItemClick","ondblclick","onItemDblClick","getLink","isDirectory","isSelected","selectedChild","contains","hasDetails","sublist","localName","code","toggle","container","query","editFile","followPath","focusFiles","onDetailsItemClick","cursorDetailsItem","selectDetailsItem","navigateToName","focus","isDir","menuElements","selection","deleteFile","renameFile","convertFileToBundle","openBrowser","saveAsPNG","addSearchRoot","isPicture","setURLAsBackground","basePath","newDirectory","newFile","menu","openIn","isFile","roots","preferences","concat","current","addDirectory","set","selectedURLs","path","lastPath","resp","headers","URL","createDetailsItem","onDetailsContextMenu","clearNameMD","lastDetailsURL","lastScrollTop","scrollTop","optionsWasHandles","clearDetails","parents","details","showDetailsHTML","showDetailsJS","showDetailsMD","showDetailsOptions","parseHTML","template","findHeaders","id","simpleParseMD","source","defRegEx","m","links","exec","Error","level","keys","classInfos","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","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 FileCache from \"src/client/fileindex.js\"\nimport Strings from \"src/client/strings.js\"\n\nimport FileIndex from \"src/client/fileindex.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  // #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    debugger;\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        this.showDetails()\n      } else if (lastURL !== this.url) {\n        this.showDetails()\n      } else if (lastContent != this.sourceContent) {\n        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    \n    var myStats = await fetch(targetURL, {\n      method: \"OPTIONS\",\n    }).then(r => r.status == 200 ? r.json() : {})\n    \n    if (myStats.parent) {\n      var root = myStats.parent\n      \n    } else {\n      root = this.getRoot(targetURL)\n    }\n    \n    \n    try {\n      var 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    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(\"^\" + 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        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    if (isDir) {\n      menuElements.push(...[\n        [`add search root`, () => this.addSearchRoot(otherUrl)],\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        [`text file`, () => this.newFile(basePath  + \"newdfile\", \"md\")],\n        [\"drawio figure\", () => this.newFile(basePath  + \"newdfile\", \"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  \n  /*\n   * #private add url to local file index rember to search there  \n   */\n  addSearchRoot(url) {\n    var roots = lively.preferences.get(\"ExtraSearchRoots\")\n    roots = _.uniq(roots.concat([url]))\n    FileCache.current().addDirectory(url)     \n    lively.preferences.set(\"ExtraSearchRoots\", roots)\n    lively.notify(\"Current Search Roots:\", roots)\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    \"I was here\"\n    \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 {\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  // #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\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"]}