{"tiddlers":{"$:/plugins/rmnvsl/krystal/buttons/maximize":{"title":"$:/plugins/rmnvsl/krystal/buttons/maximize","caption":"{{$:/plugins/rmnvsl/krystal/images/maximize-tiddler}} maximize tiddler","description":"Make tiddler full-width","tags":"$:/tags/ViewToolbar $:/tags/EditToolbar","type":"text/vnd.tiddlywiki","text":"<$button tooltip=\"Make tiddler full-width\" aria-label=\"maximize tiddler\" class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-maximize\" $param=<<currentTiddler>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/plugins/rmnvsl/krystal/images/maximize-tiddler}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">maximize tiddler</span>\n</$list>\n</$button>"},"$:/plugins/rmnvsl/krystal/changelog":{"title":"$:/plugins/rmnvsl/krystal/changelog","text":"All notable changes to this project will be documented here.\n\nThe format is based on [[Keep a Changelog|https://keepachangelog.com/en/1.0.0/]],\nand this project adheres to [[Semantic Versioning|https://semver.org/spec/v2.0.0.html]].\n\n!! [0.5.1] - 2022-08-28\n\n!!! Fixed\n\n* Header overlapping stacked tiddlers on the right side ([[#48|https://github.com/crazko/krystal/issues/48]]) thanks [[@ericworks|https://github.com/ericworks]]\n* Tiddlers frame effects during fast scrolling ([[#47|https://github.com/crazko/krystal/issues/47]]) thanks [[@hukacode|https://github.com/hukacode]]\n\n!!! Changed\n\n* Update TiddlyWiki to version `5.2.3`, see the official [[Changelog|https://tiddlywiki.com/#Release%205.2.3]]\n\n!! [0.5.0] - 2022-03-13\n\n!!! Added\n\n* Info about [[backlinking possibilities|https://crazko.github.io/krystal/#Bi-directional%20links]]\n* Changelog is part of the plugin\n* Tag {{$:/plugins/rmnvsl/krystal/header-small||$:/core/ui/TagTemplate}} to [[customize sections in header|https://crazko.github.io/krystal/#Customizable%20header]] for small viewport ([[#32|https://github.com/crazko/krystal/issues/32]])\n\n!!! Changed\n\n* Update TiddlyWiki to version `5.2.1`, see the official [[Changelog|https://tiddlywiki.com/#Release%205.2.1]]\n\n!!! Fixed\n\n* \"Sidebar\" tiddlers not rendered correctly in TW 5.2.1 ([[#39|https://github.com/crazko/krystal/issues/39]])\n* \"Sidebar\" tiddlers titles show caption instead of system name ([[#31|https://github.com/crazko/krystal/issues/31]])\n* Width & scrolling in Firefox ([[#35|https://github.com/crazko/krystal/issues/35]])\n* Searchfield width during searching ([[#30|https://github.com/crazko/krystal/issues/30]])\n\n!! [0.4.0] - 2021-04-21\n\n!!! Added\n\n* Option to show/hide tiddler's backlinks in [[settings|$:/plugins/rmnvsl/krystal/settings]] ([[#29|https://github.com/crazko/krystal/issues/29]])\n\n!! [0.3.4] - 2021-01-26\n\n!!! Fixed\n\n* Tiddler's title is not displayed correctly ([[#13|https://github.com/crazko/krystal/issues/13]]) thanks [[@ericworks|https://github.com/ericworks]]\n\n!! [0.3.3] - 2021-01-23\n\n!!! Fixed\n\n* Maximized tiddler above header dropdowns ([[#21|https://github.com/crazko/krystal/issues/21#issuecomment-759085177]])\n\n!! [0.3.2] - 2021-01-05\n\n!!! Changed\n\n* Update TiddlyWiki to version `5.1.23`, see the official [[Changelog|https://tiddlywiki.com/#Release%205.1.23]]\n\n!!! Fixed\n\n* Searchbox results not displayed in new version of TiddlyWiki ([[#22|https://github.com/crazko/krystal/issues/22]])\n\n!! [0.3.1] - 2020-10-01\n\n!!! Fixed\n\n* Scrolling to newly opened tiddlers when they do not fit into the view ([[#3|https://github.com/crazko/krystal/issues/3]])\n\n!! [0.3.0] - 2020-08-22\n\n!!! Added\n\n* Add option to maximize tiddler width ([[#6|https://github.com/crazko/krystal/issues/6]])\n\n!! [0.2.1] - 2020-08-03\n\n!!! Fixed\n\n* Tiddlers do not overflow when statically exported ([[#9|https://github.com/crazko/krystal/issues/9]])\n\n!! [0.2.0] - 2020-07-02\n\n!!! Changed\n\n* Hide \"Links to this note\" box when there are no backlinks to the current tiddler\n\n!! [0.1.7] - 2020-06-28\n\n!!! Changed\n\n* New possibilities of [[Customizable header|https://crazko.github.io/krystal/#Customizable%20header]] ([[#8|https://github.com/crazko/krystal/issues/8]])\n\n!! [0.1.6] - 2020-06-27\n\n!!! Added\n\n* Tiddlers styling options (width & padding), see [[$:/plugins/rmnvsl/krystal/settings]] ([[#7|https://github.com/crazko/krystal/issues/7]])\n\n... previous versions changelog not provided."},"$:/plugins/rmnvsl/krystal/config/close":{"title":"$:/plugins/rmnvsl/krystal/config/close","text":"enable"},"$:/plugins/rmnvsl/krystal/config/highlight":{"title":"$:/plugins/rmnvsl/krystal/config/highlight","text":"enable"},"$:/plugins/rmnvsl/krystal/config/tiddlerpadding":{"title":"$:/plugins/rmnvsl/krystal/config/tiddlerpadding","text":"42"},"$:/plugins/rmnvsl/krystal/config/tiddlerwidth":{"title":"$:/plugins/rmnvsl/krystal/config/tiddlerwidth","text":"600"},"$:/plugins/rmnvsl/krystal/header-small":{"title":"$:/plugins/rmnvsl/krystal/header-small","tags":"$:/tags/PageTemplate","list":"$:/core/ui/SideBarSegments/site-title $:/core/ui/SideBarSegments/site-subtitle $:/core/ui/SideBarSegments/page-controls $:/plugins/rmnvsl/krystal/headertools $:/core/ui/SideBarSegments/search","list-before":"$:/core/ui/PageTemplate/topleftbar","text":"<header class=\"krystal-header krystal-header--small\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/plugins/rmnvsl/krystal/header-small]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</header>"},"$:/plugins/rmnvsl/krystal/header.css":{"title":"$:/plugins/rmnvsl/krystal/header.css","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n.krystal-header--big {\n  display: none;\n}\n\n.krystal-header {\n  background: <<color tiddler-background>>;\n  border-bottom: 1px solid <<color page-background>>;\n  padding: 1em;\n  position: relative;\n  z-index: 10;\n  text-align: center;\n}\n\n.krystal-header > * {\n  margin: 0;\n}\n\n.krystal-header > * + * {\n  margin: 0.5em 0 0 0;\n}\n\n.krystal-header > h1 {\n  font-size: 1.5rem;\n}\n\n@media (min-width: 960px) {\n  .krystal-header--small {\n    display: none;\n  }\n\n  .krystal-header--big {\n    display: flex;\n  }\n\n  .krystal-header {\n    flex-wrap: wrap;\n    align-items: center;\n    text-align: inherit;\n  }\n\n  .krystal-header > * + * {\n    margin: 0 0 0 1em;\n  }\n}","tags":"$:/tags/Stylesheet"},"$:/plugins/rmnvsl/krystal/header":{"title":"$:/plugins/rmnvsl/krystal/header","tags":"$:/tags/PageTemplate","list":"$:/core/ui/SideBarSegments/site-title $:/core/ui/SideBarSegments/site-subtitle $:/core/ui/SideBarSegments/page-controls $:/plugins/rmnvsl/krystal/headertools $:/core/ui/SideBarSegments/search","list-before":"$:/core/ui/PageTemplate/topleftbar","text":"<header class=\"krystal-header krystal-header--big\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/plugins/rmnvsl/krystal/header]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</header>"},"$:/plugins/rmnvsl/krystal/headertools":{"title":"$:/plugins/rmnvsl/krystal/headertools","tags":"$:/plugins/rmnvsl/krystal/header","text":"<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<$button class=\"tc-btn-invisible tc-tiddlylink\" to=<<currentTiddler>>>\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTiddler>> field=\"caption\">\n<$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$button>\n</$list>"},"$:/plugins/rmnvsl/krystal/horizontal.js":{"title":"$:/plugins/rmnvsl/krystal/horizontal.js","text":"/*\\\ntitle: $:/plugins/rmnvsl/krystal/horizontal.js\ntype: application/javascript\nmodule-type: storyview\n\nHandles tiddlers position\n\n\\*/\n(function () {\n  var easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\n  var HorizontalStoryView = function (listWidget) {\n    this.listWidget = listWidget;\n  };\n\n  HorizontalStoryView.prototype.navigateTo = function (historyInfo) {\n    const listElementIndex = this.listWidget.findListItem(0, historyInfo.title);\n\n    if (listElementIndex === undefined) {\n      return;\n    }\n\n    const listItemWidget = this.listWidget.children[listElementIndex];\n    const targetElement = listItemWidget.findFirstDomNode();\n\n    // Abandon if the list entry isn't a DOM element (it might be a text node)\n    if (!(targetElement instanceof Element)) {\n      return;\n    }\n\n    // Scroll the node into view\n    this.listWidget.dispatchEvent({\n      type: \"tm-scroll\",\n      target: targetElement,\n    });\n  };\n\n  HorizontalStoryView.prototype.insert = function (widget) {\n    const duration = $tw.utils.getAnimationDuration();\n\n    if (duration) {\n      const targetElement = widget.findFirstDomNode();\n\n      // Abandon if the list entry isn't a DOM element (it might be a text node)\n      if (!(targetElement instanceof Element)) {\n        return;\n      }\n\n      const currWidth = targetElement.offsetWidth;\n\n      setTimeout(() => (targetElement.style.cssText = \"\"), duration);\n\n      // Set up the initial position of the element\n      $tw.utils.setStyle(targetElement, [\n        { transition: \"none\" },\n        { transform: \"scale(0.85)\" },\n        { opacity: \"0\" },\n        { marginLeft: `-${currWidth}px` },\n      ]);\n\n      $tw.utils.forceLayout(targetElement);\n\n      // Transition to the final position\n      $tw.utils.setStyle(targetElement, [\n        {\n          transition: `opacity ${duration}ms ${easing}, margin ${duration}ms ${easing}, transform ${duration}ms ${easing}`,\n        },\n        { transform: \"scale(1)\" },\n        { opacity: \"1\" },\n        { marginLeft: \"0\" },\n      ]);\n    }\n  };\n\n  HorizontalStoryView.prototype.remove = function (widget) {\n    const duration = $tw.utils.getAnimationDuration();\n\n    this.listWidget.dispatchEvent({\n      type: \"tm-remove\",\n    });\n\n    if (duration) {\n      const targetElement = widget.findFirstDomNode();\n      const removeElement = () => widget.removeChildDomNodes();\n\n      // Abandon if the list entry isn't a DOM element (it might be a text node)\n      if (!(targetElement instanceof Element)) {\n        removeElement();\n        return;\n      }\n\n      const currWidth = targetElement.offsetWidth;\n\n      // Remove the dom nodes of the widget at the end of the transition\n      setTimeout(removeElement, duration);\n\n      // Animate the closure\n      $tw.utils.setStyle(targetElement, [\n        { transition: \"none\" },\n        { transform: \"scale(1)\" },\n        { opacity: \"1\" },\n        { marginLeft: \"0\" },\n      ]);\n\n      $tw.utils.forceLayout(targetElement);\n\n      $tw.utils.setStyle(targetElement, [\n        {\n          transition: `opacity ${duration}ms ${easing}, margin ${duration}ms ${easing}, transform ${duration}ms ${easing}`,\n        },\n        { transform: \"scale(0.85)\" },\n        { marginLeft: `-${currWidth}px` },\n        { opacity: \"0\" },\n      ]);\n    } else {\n      widget.removeChildDomNodes();\n    }\n  };\n\n  exports.horizontal = HorizontalStoryView;\n})();\n","type":"application/javascript","module-type":"storyview"},"$:/plugins/rmnvsl/krystal/images/maximize-tiddler":{"title":"$:/plugins/rmnvsl/krystal/images/maximize-tiddler","tags":"$:/tags/Image","type":"text/vnd.tiddlywiki","text":"<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\" transform=\"rotate(90)\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"},"$:/plugins/rmnvsl/krystal/plugin.js":{"title":"$:/plugins/rmnvsl/krystal/plugin.js","text":"/*\\\ntitle: $:/plugins/rmnvsl/krystal/plugin.js\ntype: application/javascript\nmodule-type: startup\n\nSets plugin behavior\n\n\\*/\n(function () {\n  const STORY_TIDDLER_TITLE = \"$:/StoryList\";\n  const ACTIVE_LINK_CLASS = \"krystal-link--active\";\n  const MAXIMIZED_TIDDLER_CLASS = \"krystal-tiddler__frame--maximized\";\n\n  const KRYSTAL_CONFIG = {\n    highlight: \"$:/plugins/rmnvsl/krystal/config/highlight\",\n    tiddlerwidth: \"$:/plugins/rmnvsl/krystal/config/tiddlerwidth\",\n  };\n\n  exports.after = [\"render\"];\n\n  exports.startup = function () {\n    header();\n\n    window.addEventListener(\"resize\", header);\n\n    const throttledTiddlerFrameEffects = throttle(tiddlerFrameEffects, 10);\n    window.addEventListener(\"scroll\", throttledTiddlerFrameEffects, true);\n\n    $tw.rootWidget.addEventListener(\"tm-remove\", tiddlersCount);\n    $tw.rootWidget.addEventListener(\"tm-scroll\", function (event) {\n      if (event.type === \"tm-scroll\") {\n        tiddlersCount(event);\n        scroll(event);\n      }\n    });\n\n    $tw.rootWidget.addEventListener(\"tm-maximize\", function (event) {\n      if (event.type === \"tm-maximize\") {\n        tiddlerFullscreen(event.param);\n      }\n    });\n\n    $tw.hooks.addHook(\"th-navigating\", closeTiddlersToRight);\n\n    $tw.wiki.addEventListener(\"change\", highlightOpenTiddlerLinks);\n    $tw.wiki.addEventListener(\"change\", reinitiateTiddlerFrameEffects);\n  };\n\n  function highlightOpenTiddlerLinks(changes) {\n    if (!$tw.utils.hop(changes, STORY_TIDDLER_TITLE)) {\n      return;\n    }\n\n    const config = $tw.wiki.getTiddler(KRYSTAL_CONFIG.highlight);\n\n    if (config && config.fields && config.fields.text === \"disable\") {\n      return;\n    }\n\n    const tiddlers = $tw.wiki.getTiddlerList(STORY_TIDDLER_TITLE);\n\n    Array.from(document.querySelectorAll(`.${ACTIVE_LINK_CLASS}`)).forEach(\n      (link) => link.classList.remove(ACTIVE_LINK_CLASS)\n    );\n\n    tiddlers.forEach((tiddler) => {\n      Array.from(\n        document.querySelectorAll(\n          `.tc-tiddler-body a[href=\"#${encodeURIComponent(tiddler)}\"]`\n        )\n      ).forEach((link) => link.classList.add(ACTIVE_LINK_CLASS));\n    });\n  }\n\n  function header() {\n    const height = document.querySelector(\n      \".krystal-header.krystal-header--big\"\n    ).offsetHeight;\n    document.documentElement.style.setProperty(\n      \"--krystal-header-height\",\n      `${height}px`\n    );\n  }\n\n  function tiddlersCount(event) {\n    const { widget } = event;\n    var tiddlersCount = widget.list.length;\n    document.body.style.setProperty(\"--tiddler-count\", tiddlersCount);\n  }\n\n  function scroll(event) {\n    const { target: tiddlerElement } = event;\n    const mediaQueryList = window.matchMedia(\"(min-width: 960px)\");\n\n    if (mediaQueryList.matches) {\n      var storyRiver = tiddlerElement.parentElement;\n\n      var tiddlers = Array.from(\n        storyRiver.querySelectorAll(\"div[data-tiddler-title]\")\n      );\n      var tiddlerPosition = tiddlers.indexOf(tiddlerElement);\n      var tiddlerWidth = $tw.wiki.getTiddler(KRYSTAL_CONFIG.tiddlerwidth).fields\n        .text;\n      var windowWidth = window.innerWidth;\n\n      var position = windowWidth / 2 - tiddlerWidth / 2;\n      var newRiverPosition = Math.max(\n        tiddlerPosition * tiddlerWidth - position,\n        0\n      );\n\n      storyRiver.scroll({ left: newRiverPosition, behavior: \"smooth\" });\n    } else {\n      tiddlerElement.scrollIntoView({ behavior: \"smooth\" });\n    }\n  }\n\n  function tiddlerFrameEffects() {\n    var tiddlers = Array.from(document.querySelectorAll(\".tc-tiddler-frame\"));\n    var tiddlersCount = tiddlers.length;\n\n    if (tiddlersCount === 0) {\n      return;\n    }\n\n    var offset = 100;\n    var tiddlerPadding = Number(\n      window.getComputedStyle(tiddlers[0]).paddingRight.slice(0, -2)\n    );\n    var tiddlerWidth = tiddlers[0].offsetWidth;\n    var windowWidth = window.innerWidth;\n\n    tiddlers.forEach(function (tiddler, i) {\n      if (i === 0) {\n        return;\n      }\n\n      var tiddlerTitle = tiddler.querySelector(\".krystal-tiddler__title\");\n\n      // Edit Template\n      if (!tiddlerTitle) {\n        return;\n      }\n\n      var previousTiddler = tiddlers[i - 1];\n      var previousTiddlerTitle = previousTiddler.querySelector(\n        \".krystal-tiddler__title\"\n      );\n\n      var x = tiddler.getBoundingClientRect().left;\n\n      var start = x < offset + i * tiddlerPadding;\n      var end =\n        x > windowWidth - (offset + (tiddlersCount - i) * tiddlerPadding);\n\n      var startOverlay = x < tiddlerWidth + (i - 1) * tiddlerPadding;\n\n      tiddler.classList.toggle(\"krystal-tiddler__frame--overlay\", startOverlay);\n\n      if (previousTiddlerTitle) {\n        previousTiddlerTitle.classList.toggle(\n          \"krystal-tiddler__title--start-active\",\n          start\n        );\n\n        if (!end) {\n          previousTiddler.classList.toggle(\n            \"krystal-tiddler__frame--hide\",\n            start\n          );\n        }\n      }\n\n      if (start) {\n        tiddlerTitle.classList.remove(\"krystal-tiddler__title--end\");\n      }\n\n      if (end) {\n        tiddler.classList.add(\"krystal-tiddler__frame--overlay\");\n        tiddler.classList.add(\"krystal-tiddler__frame--hide\");\n        tiddlerTitle.classList.add(\n          \"krystal-tiddler__title--end\",\n          \"krystal-tiddler__title--end-active\"\n        );\n      } else {\n        if (!startOverlay) {\n          tiddler.classList.remove(\"krystal-tiddler__frame--overlay\");\n        }\n\n        tiddler.classList.remove(\"krystal-tiddler__frame--hide\");\n        tiddlerTitle.classList.remove(\"krystal-tiddler__title--end-active\");\n      }\n    });\n  }\n\n  function reinitiateTiddlerFrameEffects(changes) {\n    if (!$tw.utils.hop(changes, STORY_TIDDLER_TITLE)) {\n      return;\n    }\n    var duration = $tw.utils.getAnimationDuration() || 0;\n    setTimeout(tiddlerFrameEffects, duration);\n  }\n\n  function closeTiddlersToRight(event) {\n    const storyTiddler = $tw.wiki.getTiddler(STORY_TIDDLER_TITLE);\n    const tiddlers = $tw.wiki.getTiddlerList(STORY_TIDDLER_TITLE);\n\n    const navigateFrom = event.navigateFromTitle;\n    const navigateTo = event.navigateTo;\n\n    const config = $tw.wiki.getTiddler(\n      \"$:/plugins/rmnvsl/krystal/config/close\"\n    );\n\n    if (config && config.fields && config.fields.text === \"disable\") {\n      return event;\n    }\n\n    // Navigating from outside open tiddlers\n    if (!navigateFrom) {\n      return event;\n    }\n\n    // Destination tiddler already open\n    if (tiddlers.indexOf(navigateTo) === -1) {\n      const currentTiddlerIndex = tiddlers.indexOf(navigateFrom);\n      const tiddlersToClose = tiddlers.slice(currentTiddlerIndex + 1);\n\n      if (tiddlersToClose.length === 0) {\n        return event;\n      }\n\n      const newStoryList = tiddlers.filter(\n        (title) => !tiddlersToClose.includes(title)\n      );\n\n      $tw.wiki.addTiddler(\n        new $tw.Tiddler({ title: STORY_TIDDLER_TITLE }, storyTiddler, {\n          list: newStoryList,\n        })\n      );\n    }\n\n    return event;\n  }\n\n  function tiddlerFullscreen(tiddlerTitle) {\n    const tiddler = document.querySelector(\n      `div[data-tiddler-title=\"${tiddlerTitle}\"]`\n    );\n\n    tiddler.classList.toggle(MAXIMIZED_TIDDLER_CLASS);\n  }\n\n  // ---\n\n  function throttle(callback, limit) {\n    var wait = false; // Initially, we're not waiting\n\n    return function () {\n      // We return a throttled function\n      if (!wait) {\n        // If we're not waiting\n        callback.call(); // Execute users function\n        wait = true; // Prevent future invocations\n        setTimeout(function () {\n          // After a period of time\n          wait = false; // And allow future invocations\n        }, limit);\n      }\n    };\n  }\n})();\n","type":"application/javascript","module-type":"startup"},"$:/plugins/rmnvsl/krystal/readme":{"title":"$:/plugins/rmnvsl/krystal/readme","text":"Horizontal story view for tiddlers and bi-directional links.\n\nHomepage: https://github.com/crazko/krystal\n\nMade by [[Roman Veselý|https://romanvesely.com/]] - <span class=\"krystal-icon\">{{$:/core/images/github}}</span> [[@crazko|https://github.com/crazko]], <span class=\"krystal-icon\">{{$:/core/images/twitter}}</span> [[@rmnvsl|https://twitter.com/rmnvsl]]"},"$:/plugins/rmnvsl/krystal/references.css":{"title":"$:/plugins/rmnvsl/krystal/references.css","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n.krystal-references {\n  background: <<color page-background>>;\n  font-size: 0.75em;\n  padding: 0.5rem;\n  list-style: none;\n  margin-top: 3rem;\n  margin-bottom: 0;\n  \n  display: flex;\n  flex-wrap: wrap;\n}\n\n.krystal-references__title {\n  font-size: 1.25em;\n  width: 100%;\n  padding: 0.5rem;\n}\n\n.krystal-references__reference {\n  width: 50%;\n}\n\n.krystal-references__reference > a {\n  color: inherit;\n  background: inherit;\n  display: block;\n  text-decoration: none;\n  padding: 0.5rem;\n  height: 130px;\n  overflow: hidden;\n  position: relative;\n  transition: all 0.125s ease;\n}\n\n.krystal--static .krystal-references__reference > a {\n  height: initial;\n  overflow: initial;\n}\n\n.krystal-references__reference > a:hover {\n  color: <<color sidebar-tab-foreground>>;\n  background: <<color sidebar-tab-background>>;\n  text-decoration: none;\n}\n\n.krystal--static .krystal-references__content {\n  height: 130px;\n  overflow: hidden;\n}\n\n.krystal-references__content a {\n  color: inherit !important;\n  text-decoration: none !important;\n  pointer-events: none;\n}","tags":"$:/tags/Stylesheet"},"$:/plugins/rmnvsl/krystal/references":{"title":"$:/plugins/rmnvsl/krystal/references","tags":"$:/tags/ViewTemplate","text":"<$list filter=\"[!is[system]all[current]backlinks[]sort[title]] -[is[current]] +[limit[1]]\" variable=none>\n<ul class=\"krystal-references\">\n<li class=\"krystal-references__title\"><strong><$transclude tiddler=\"$:/plugins/rmnvsl/krystal/referenceshere\" field=\"text\" mode=\"inline\" /></strong></li>\n<$list filter=\"[!is[system]all[current]backlinks[]sort[title]] -[is[current]]\">\n<li class=\"krystal-references__reference\">\n<$link>\n<b><$view field=\"title\" /></b>\n<div class=\"krystal-references__content\"><$transclude field=\"text\" mode=\"inline\" /></div>\n</$link>\n</li>\n</$list>\n</ul>\n</$list>"},"$:/plugins/rmnvsl/krystal/referenceshere":{"title":"$:/plugins/rmnvsl/krystal/referenceshere","text":"Links to this note"},"$:/plugins/rmnvsl/krystal/river.css":{"title":"$:/plugins/rmnvsl/krystal/river.css","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n.tc-tiddler-frame {\n  border: none;\n  border-bottom: 1px solid <<color page-background>>;\n  border-radius: 0;\n  box-shadow: none;\n  margin: 0;\n  flex-shrink: 0;\n  overflow-y: auto;\n  display: flex;\n  flex-direction: column;\n  position: sticky;\n}\n\n.tc-alerts + p {\n  margin: 0;\n}\n\n@media (min-width: 960px) {\n  .tc-dropzone {\n    height: 100vh;\n    display: flex;\n    flex-direction: column;\n  }\n\n  .tc-story-river {\n    padding: 0;\n    display: flex;\n    overflow-y: hidden;\n    height: 100%;\n  }\n\n  /**\n   * Fix for Firefox and Safari where sticky elements (tiddlers) cause different scrollWidth of parent element (story river).\n   */\n  .tc-story-river::before {\n    content: \"\";\n    position: absolute;\n    top: 0;\n    left: 0;\n    height: 100%;\n    width: calc(var(--tiddler-width) * var(--tiddler-count));\n    z-index: -1;\n  }\n\n  .krystal--static .tc-story-river {\n    max-height: 100vh;\n  }\n\n  .tc-tiddler-frame {\n    border: none;\n    border-right: 1px solid <<color page-background>>;\n    padding: var(--tiddler-padding);\n    width: var(--tiddler-width);\n  }\n\n  .tc-tiddler-frame > * {\n    transition: opacity 0.25s ease;\n  }\n\n  .krystal-link--active {\n    background: <<color message-background>>;\n  }\n\n  .krystal-tiddler__frame--hide > *:not(.krystal-tiddler__title) {\n    opacity: 0;\n  }\n    \n  .krystal-tiddler__frame--overlay {\n    box-shadow: 0 0 1em rgba(0, 0, 0, 0.125);\n  }\n\n  .krystal-tiddler__frame--maximized {\n    left: 0 !important;\n    right: 0 !important;\n    bottom: 0;\n    width: 100%;\n    z-index: 5;\n  }\n  \n  .tc-tiddler-frame:nth-of-type(1) { left: calc(0 * var(--tiddler-padding)) }\n  .tc-tiddler-frame:nth-of-type(2) { left: calc(1 * var(--tiddler-padding)) }\n  .tc-tiddler-frame:nth-of-type(3) { left: calc(2 * var(--tiddler-padding)) }\n  .tc-tiddler-frame:nth-of-type(4) { left: calc(3 * var(--tiddler-padding)) }\n  .tc-tiddler-frame:nth-of-type(5) { left: calc(4 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(6) { left: calc(5 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(7) { left: calc(6 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(8) { left: calc(7 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(9) { left: calc(8 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(10) { left: calc(9 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(11) { left: calc(10 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(12) { left: calc(11 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(13) { left: calc(12 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(14) { left: calc(13 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(15) { left: calc(14 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(16) { left: calc(15 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(17) { left: calc(16 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(18) { left: calc(17 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(19) { left: calc(18 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-of-type(20) { left: calc(19 * var(--tiddler-padding)); }\n\n  .tc-tiddler-frame:nth-last-of-type(1) { right: calc(-1 * var(--tiddler-width) + 1 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(2) { right: calc(-1 * var(--tiddler-width) + 2 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(3) { right: calc(-1 * var(--tiddler-width) + 3 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(4) { right: calc(-1 * var(--tiddler-width) + 4 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(5) { right: calc(-1 * var(--tiddler-width) + 5 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(6) { right: calc(-1 * var(--tiddler-width) + 6 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(7) { right: calc(-1 * var(--tiddler-width) + 7 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(8) { right: calc(-1 * var(--tiddler-width) + 8 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(9) { right: calc(-1 * var(--tiddler-width) + 9 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(10) { right: calc(-1 * var(--tiddler-width) + 10 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(11) { right: calc(-1 * var(--tiddler-width) + 11 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(12) { right: calc(-1 * var(--tiddler-width) + 12 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(13) { right: calc(-1 * var(--tiddler-width) + 13 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(14) { right: calc(-1 * var(--tiddler-width) + 14 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(15) { right: calc(-1 * var(--tiddler-width) + 15 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(16) { right: calc(-1 * var(--tiddler-width) + 16 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(17) { right: calc(-1 * var(--tiddler-width) + 17 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(18) { right: calc(-1 * var(--tiddler-width) + 18 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(19) { right: calc(-1 * var(--tiddler-width) + 19 * var(--tiddler-padding)); }\n  .tc-tiddler-frame:nth-last-of-type(20) { right: calc(-1 * var(--tiddler-width) + 20 * var(--tiddler-padding)); }\n\n  .krystal--static .tc-tiddler-frame {\n    left: initial;\n    right: initial;\n  }\n}\n","tags":"$:/tags/Stylesheet"},"$:/plugins/rmnvsl/krystal/search.css":{"title":"$:/plugins/rmnvsl/krystal/search.css","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n \n.krystal-header .tc-sidebar-search {\n  display: inline-block;\n  margin-left: auto;\n}\n\n.krystal-header .tc-sidebar-search > p {\n  margin: 0;\n} \n\n/**\n * Very opinionated. Keep the same width of searchfield during searching.\n */\n.krystal-header .tc-sidebar-search .tc-search .tc-popup-handle {\n  padding-right: 1em;\n}\n\n/* Position of the clear button above input field */\n.krystal-header .tc-sidebar-search .tc-search span:nth-child(2) button:nth-child(2) {\n  margin-left: -3.125em;\n  margin-top: 0.125em;\n  position: absolute;\n} \n\n.krystal-header .tc-sidebar-search .tc-search span:nth-child(2) button:nth-child(2) svg {\n  width: 0.75em;\n  height: 0.75em;\n}\n\n/* Hides the number of results */\n.krystal-header .tc-sidebar-search .tc-search span:nth-child(2) button:nth-child(3) {\n  display: none;\n}\n\n@media (min-width: 960px) {\n  /* Removes dropdown overflow of the viewport */\n  .krystal-header .tc-block-dropdown.tc-search-drop-down {\n    right: 0;\n  }\n}","tags":"$:/tags/Stylesheet"},"$:/plugins/rmnvsl/krystal/search":{"title":"$:/plugins/rmnvsl/krystal/search","tags":"$:/plugins/rmnvsl/krystal/header $:/plugins/rmnvsl/krystal/header-small","type":"text/vnd.tiddlywiki","text":"{{$:/core/ui/SideBarSegments/search}}"},"$:/plugins/rmnvsl/krystal/settings":{"title":"$:/plugins/rmnvsl/krystal/settings","tags":"$:/tags/ControlPanel/Appearance","caption":"Krystal","text":"|<$link to=\"$:/plugins/rmnvsl/krystal/references\">Show tiddler's backlinks</$link>|<$checkbox tiddler=\"$:/plugins/rmnvsl/krystal/references\" tag=\"$:/tags/ViewTemplate\"></$checkbox>|\n|<$link to=\"$:/plugins/rmnvsl/krystal/config/close\">Close tiddlers to the right</$link>|<$checkbox tiddler=\"$:/plugins/rmnvsl/krystal/config/close\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"></$checkbox>|\n|<$link to=\"$:/plugins/rmnvsl/krystal/config/highlight\">Highlight open tiddlers links</$link><br>//Refresh if still highlighted//|<$checkbox tiddler=\"$:/plugins/rmnvsl/krystal/config/highlight\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"></$checkbox>|\n|<$link to=\"$:/plugins/rmnvsl/krystal/config/tiddlerwidth\">Tiddler width</$link>|<$edit-text tiddler=\"$:/plugins/rmnvsl/krystal/config/tiddlerwidth\" default=\"\" tag=\"input\" type=\"number\" class=\"text-right\" />px|\n|<$link to=\"$:/plugins/rmnvsl/krystal/config/tiddlerpadding\">Tiddler padding</$link>|<$edit-text tiddler=\"$:/plugins/rmnvsl/krystal/config/tiddlerpadding\" default=\"\" tag=\"input\" type=\"number\" class=\"text-right\" />px|"},"$:/config/EditToolbarButtons/Visibility/$:/plugins/rmnvsl/krystal/buttons/maximize":{"title":"$:/config/EditToolbarButtons/Visibility/$:/plugins/rmnvsl/krystal/buttons/maximize","type":"text/vnd.tiddlywiki","text":"hide"},"$:/config/ViewToolbarButtons/Visibility/$:/plugins/rmnvsl/krystal/buttons/maximize":{"title":"$:/config/ViewToolbarButtons/Visibility/$:/plugins/rmnvsl/krystal/buttons/maximize","type":"text/vnd.tiddlywiki","text":"hide"},"$:/core/templates/exporters/StaticRiver":{"title":"$:/core/templates/exporters/StaticRiver","description":"{{$:/language/Exporters/StaticRiver}}","extension":".html","tags":"$:/tags/Exporter","type":"text/vnd.tiddlywiki","text":"\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body krystal--static\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"},"$:/core/ui/PageTemplate/sidebar":{"title":"$:/core/ui/PageTemplate/sidebar","type":"text/vnd.tiddlywiki","text":"\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"  tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"},"$:/core/ui/SideBarSegments/page-controls":{"title":"$:/core/ui/SideBarSegments/page-controls","tags":"$:/tags/SideBarSegment $:/plugins/rmnvsl/krystal/header $:/plugins/rmnvsl/krystal/header-small","type":"text/vnd.tiddlywiki","text":"{{||$:/core/ui/PageTemplate/pagecontrols}}\n"},"$:/core/ui/SideBarSegments/site-subtitle":{"title":"$:/core/ui/SideBarSegments/site-subtitle","tags":"$:/tags/SideBarSegment $:/plugins/rmnvsl/krystal/header","type":"text/vnd.tiddlywiki","text":"<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"},"$:/core/ui/SideBarSegments/site-title":{"title":"$:/core/ui/SideBarSegments/site-title","tags":"$:/tags/SideBarSegment $:/plugins/rmnvsl/krystal/header $:/plugins/rmnvsl/krystal/header-small","type":"text/vnd.tiddlywiki","text":"<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"},"$:/core/ui/TopBar/menu":{"title":"$:/core/ui/TopBar/menu","type":"text/vnd.tiddlywiki","text":"<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"},"$:/state/sidebar":{"title":"$:/state/sidebar","text":"no"},"$:/view":{"title":"$:/view","type":"text/vnd.tiddlywiki","text":"horizontal"},"$:/plugins/rmnvsl/krystal/title.css":{"title":"$:/plugins/rmnvsl/krystal/title.css","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n.krystal-tiddler__title {\n  display: none;\n}\n\n@media (min-width: 960px) {\n  .krystal-tiddler__title {\n    display: block;\n    line-height: var(--tiddler-padding);\n    bottom: 0px;\n    left: 0px;\n    position: sticky;\n    width: 0;\n    height: 0;\n    transform: rotate(-90deg);\n    margin-top: auto;\n    opacity: 0;\n    transition: opacity 0.25s ease;  \n  }\n\n  .krystal-tiddler__title--start-active,\n  .krystal-tiddler__title--end-active {\n    opacity: 1;\n  }\n\n  .krystal-tiddler__title > a {\n    color: <<color tiddler-title-foreground>> !important;\n    font-size: 1.5em;\n    font-weight: 400 !important;\n    text-decoration: none !important;\n    width: calc(100vh - var(--krystal-header-height) - ( 2 * var(--tiddler-padding)));\n    display: block;\n    overflow: hidden;\n    pointer-events: none;\n    margin-top: calc(var(--tiddler-padding) * -1);\n    transform: translateY(-2px);\n  }\n\n  .krystal-tiddler__title--start-active > a,\n  .krystal-tiddler__title--end-active> a {\n    pointer-events: initial;\n  }\n\n  .krystal-tiddler__title--end > a {\n    transform: translateY(2px) rotate(180deg);\n  }\n}\n","tags":"$:/tags/Stylesheet"},"$:/plugins/rmnvsl/krystal/title":{"title":"$:/plugins/rmnvsl/krystal/title","tags":"$:/tags/ViewTemplate","text":"<div class=\"krystal-tiddler__title\">\n<$link>\n<$view field=title/>\n</$link>\n</div>\n"},"$:/plugins/rmnvsl/krystal/variables.css":{"title":"$:/plugins/rmnvsl/krystal/variables.css","text":"\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n.tc-body {\n  --tiddler-padding: {{$:/plugins/rmnvsl/krystal/config/tiddlerpadding}}px;\n  --tiddler-width: {{$:/plugins/rmnvsl/krystal/config/tiddlerwidth}}px;\n}\n\n/* Utils */\n\n.text-right {\n  text-align: right;\n}\n\n.krystal-icon svg {\n  width: 1em;\n  height: 1em;\n  vertical-align: middle;\n}","tags":"$:/tags/Stylesheet"},"$:/plugins/rmnvsl/krystal/viewtemplatebodyfilters/sidebar":{"title":"$:/plugins/rmnvsl/krystal/viewtemplatebodyfilters/sidebar","tags":"$:/tags/ViewTemplateBodyFilter","list-before":"$:/config/ViewTemplateBodyFilters/system","text":"[tag[$:/tags/SideBar]then[$:/core/ui/ViewTemplate/body/default]]"},"$:/plugins/rmnvsl/krystal/viewtemplatetitlefilters/sidebar":{"title":"$:/plugins/rmnvsl/krystal/viewtemplatetitlefilters/sidebar","tags":"$:/tags/ViewTemplateTitleFilter","list-before":"$:/config/ViewTemplateTitleFilters/system","text":"[tag[$:/tags/SideBar]then[$:/plugins/rmnvsl/krystal/viewtemplate/title/sidebar]]"},"$:/plugins/rmnvsl/krystal/viewtemplate/title/sidebar":{"title":"$:/plugins/rmnvsl/krystal/viewtemplate/title/sidebar","text":"\\whitespace trim\n<h2 class=\"tc-title\">\n<$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>\n</h2>"}}}