diff --git a/coverage/base.css b/coverage/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js new file mode 100644 index 00000000..530d1ed2 --- /dev/null +++ b/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 00000000..6d781d58 --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,45 @@ +{"/Users/luca/Workspace/laputa-app/src/App.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/App.tsx","statementMap":{"0":{"start":{"line":27,"column":44},"end":{"line":27,"column":null}},"1":{"start":{"line":31,"column":6},"end":{"line":38,"column":null}},"2":{"start":{"line":40,"column":28},"end":{"line":44,"column":null}},"3":{"start":{"line":47,"column":32},"end":{"line":47,"column":null}},"4":{"start":{"line":48,"column":38},"end":{"line":48,"column":null}},"5":{"start":{"line":49,"column":40},"end":{"line":49,"column":null}},"6":{"start":{"line":50,"column":42},"end":{"line":50,"column":null}},"7":{"start":{"line":51,"column":50},"end":{"line":51,"column":null}},"8":{"start":{"line":52,"column":34},"end":{"line":52,"column":null}},"9":{"start":{"line":53,"column":46},"end":{"line":53,"column":null}},"10":{"start":{"line":54,"column":56},"end":{"line":54,"column":null}},"11":{"start":{"line":55,"column":54},"end":{"line":55,"column":null}},"12":{"start":{"line":56,"column":40},"end":{"line":56,"column":null}},"13":{"start":{"line":57,"column":46},"end":{"line":57,"column":null}},"14":{"start":{"line":58,"column":38},"end":{"line":58,"column":null}},"15":{"start":{"line":59,"column":32},"end":{"line":59,"column":null}},"16":{"start":{"line":60,"column":34},"end":{"line":60,"column":null}},"17":{"start":{"line":62,"column":8},"end":{"line":62,"column":null}},"18":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"19":{"start":{"line":66,"column":8},"end":{"line":72,"column":null}},"20":{"start":{"line":67,"column":10},"end":{"line":70,"column":null}},"21":{"start":{"line":68,"column":21},"end":{"line":68,"column":74}},"22":{"start":{"line":69,"column":18},"end":{"line":69,"column":25}},"23":{"start":{"line":75,"column":8},"end":{"line":80,"column":null}},"24":{"start":{"line":76,"column":4},"end":{"line":76,"column":null}},"25":{"start":{"line":77,"column":4},"end":{"line":77,"column":null}},"26":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"27":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"28":{"start":{"line":83,"column":2},"end":{"line":89,"column":null}},"29":{"start":{"line":84,"column":4},"end":{"line":87,"column":null}},"30":{"start":{"line":85,"column":6},"end":{"line":85,"column":null}},"31":{"start":{"line":86,"column":6},"end":{"line":86,"column":null}},"32":{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},"33":{"start":{"line":91,"column":8},"end":{"line":94,"column":null}},"34":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"35":{"start":{"line":93,"column":4},"end":{"line":93,"column":null}},"36":{"start":{"line":96,"column":8},"end":{"line":98,"column":null}},"37":{"start":{"line":97,"column":4},"end":{"line":97,"column":null}},"38":{"start":{"line":100,"column":8},"end":{"line":103,"column":null}},"39":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}},"40":{"start":{"line":102,"column":4},"end":{"line":102,"column":null}},"41":{"start":{"line":105,"column":8},"end":{"line":113,"column":null}},"42":{"start":{"line":106,"column":22},"end":{"line":106,"column":null}},"43":{"start":{"line":106,"column":48},"end":{"line":106,"column":88}},"44":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"45":{"start":{"line":107,"column":20},"end":{"line":107,"column":null}},"46":{"start":{"line":109,"column":4},"end":{"line":109,"column":null}},"47":{"start":{"line":110,"column":4},"end":{"line":110,"column":null}},"48":{"start":{"line":112,"column":4},"end":{"line":112,"column":null}},"49":{"start":{"line":115,"column":8},"end":{"line":121,"column":null}},"50":{"start":{"line":116,"column":10},"end":{"line":116,"column":null}},"51":{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},"52":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"53":{"start":{"line":119,"column":4},"end":{"line":119,"column":null}},"54":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"55":{"start":{"line":123,"column":8},"end":{"line":128,"column":null}},"56":{"start":{"line":124,"column":4},"end":{"line":124,"column":null}},"57":{"start":{"line":125,"column":4},"end":{"line":125,"column":null}},"58":{"start":{"line":126,"column":4},"end":{"line":126,"column":null}},"59":{"start":{"line":127,"column":4},"end":{"line":127,"column":null}},"60":{"start":{"line":130,"column":8},"end":{"line":134,"column":null}},"61":{"start":{"line":131,"column":4},"end":{"line":131,"column":null}},"62":{"start":{"line":132,"column":4},"end":{"line":132,"column":null}},"63":{"start":{"line":133,"column":4},"end":{"line":133,"column":null}},"64":{"start":{"line":136,"column":8},"end":{"line":140,"column":null}},"65":{"start":{"line":137,"column":4},"end":{"line":137,"column":null}},"66":{"start":{"line":138,"column":4},"end":{"line":138,"column":null}},"67":{"start":{"line":139,"column":4},"end":{"line":139,"column":null}},"68":{"start":{"line":142,"column":8},"end":{"line":149,"column":null}},"69":{"start":{"line":143,"column":4},"end":{"line":148,"column":null}},"70":{"start":{"line":144,"column":24},"end":{"line":144,"column":null}},"71":{"start":{"line":144,"column":50},"end":{"line":144,"column":90}},"72":{"start":{"line":145,"column":6},"end":{"line":145,"column":null}},"73":{"start":{"line":145,"column":22},"end":{"line":145,"column":null}},"74":{"start":{"line":146,"column":6},"end":{"line":146,"column":null}},"75":{"start":{"line":147,"column":6},"end":{"line":147,"column":null}},"76":{"start":{"line":151,"column":2},"end":{"line":159,"column":null}},"77":{"start":{"line":152,"column":23},"end":{"line":152,"column":null}},"78":{"start":{"line":154,"column":18},"end":{"line":154,"column":null}},"79":{"start":{"line":161,"column":2},"end":{"line":170,"column":null}},"80":{"start":{"line":172,"column":8},"end":{"line":174,"column":null}},"81":{"start":{"line":173,"column":4},"end":{"line":173,"column":null}},"82":{"start":{"line":173,"column":27},"end":{"line":173,"column":66}},"83":{"start":{"line":176,"column":8},"end":{"line":178,"column":null}},"84":{"start":{"line":177,"column":4},"end":{"line":177,"column":null}},"85":{"start":{"line":177,"column":28},"end":{"line":177,"column":67}},"86":{"start":{"line":180,"column":8},"end":{"line":182,"column":null}},"87":{"start":{"line":181,"column":4},"end":{"line":181,"column":null}},"88":{"start":{"line":181,"column":29},"end":{"line":181,"column":68}},"89":{"start":{"line":184,"column":8},"end":{"line":194,"column":null}},"90":{"start":{"line":185,"column":4},"end":{"line":185,"column":null}},"91":{"start":{"line":186,"column":4},"end":{"line":193,"column":null}},"92":{"start":{"line":187,"column":21},"end":{"line":187,"column":null}},"93":{"start":{"line":188,"column":6},"end":{"line":188,"column":null}},"94":{"start":{"line":189,"column":6},"end":{"line":189,"column":null}},"95":{"start":{"line":191,"column":6},"end":{"line":191,"column":null}},"96":{"start":{"line":192,"column":6},"end":{"line":192,"column":null}},"97":{"start":{"line":196,"column":20},"end":{"line":196,"column":null}},"98":{"start":{"line":196,"column":43},"end":{"line":196,"column":79}},"99":{"start":{"line":198,"column":2},"end":{"line":269,"column":null}},"100":{"start":{"line":202,"column":341},"end":{"line":202,"column":368}},"101":{"start":{"line":223,"column":37},"end":{"line":223,"column":null}},"102":{"start":{"line":223,"column":66},"end":{"line":223,"column":68}},"103":{"start":{"line":234,"column":34},"end":{"line":234,"column":null}},"104":{"start":{"line":234,"column":53},"end":{"line":234,"column":55}},"105":{"start":{"line":244,"column":53},"end":{"line":244,"column":76}},"106":{"start":{"line":249,"column":23},"end":{"line":249,"column":null}},"107":{"start":{"line":253,"column":23},"end":{"line":253,"column":null}},"108":{"start":{"line":260,"column":23},"end":{"line":260,"column":null}},"109":{"start":{"line":267,"column":23},"end":{"line":267,"column":null}}},"fnMap":{"0":{"name":"App","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":15}},"loc":{"start":{"line":46,"column":15},"end":{"line":271,"column":null}},"line":46},"1":{"name":"(anonymous_1)","decl":{"start":{"line":67,"column":4},"end":{"line":67,"column":10}},"loc":{"start":{"line":67,"column":10},"end":{"line":70,"column":null}},"line":67},"2":{"name":"(anonymous_2)","decl":{"start":{"line":68,"column":14},"end":{"line":68,"column":15}},"loc":{"start":{"line":68,"column":21},"end":{"line":68,"column":74}},"line":68},"3":{"name":"(anonymous_3)","decl":{"start":{"line":69,"column":11},"end":{"line":69,"column":12}},"loc":{"start":{"line":69,"column":18},"end":{"line":69,"column":25}},"line":69},"4":{"name":"(anonymous_4)","decl":{"start":{"line":75,"column":40},"end":{"line":75,"column":41}},"loc":{"start":{"line":75,"column":58},"end":{"line":80,"column":5}},"line":75},"5":{"name":"(anonymous_5)","decl":{"start":{"line":83,"column":12},"end":{"line":83,"column":18}},"loc":{"start":{"line":83,"column":18},"end":{"line":89,"column":5}},"line":83},"6":{"name":"(anonymous_6)","decl":{"start":{"line":91,"column":39},"end":{"line":91,"column":40}},"loc":{"start":{"line":91,"column":58},"end":{"line":94,"column":5}},"line":91},"7":{"name":"(anonymous_7)","decl":{"start":{"line":96,"column":43},"end":{"line":96,"column":49}},"loc":{"start":{"line":96,"column":49},"end":{"line":98,"column":5}},"line":96},"8":{"name":"(anonymous_8)","decl":{"start":{"line":100,"column":39},"end":{"line":100,"column":40}},"loc":{"start":{"line":100,"column":57},"end":{"line":103,"column":5}},"line":100},"9":{"name":"(anonymous_9)","decl":{"start":{"line":105,"column":42},"end":{"line":105,"column":43}},"loc":{"start":{"line":105,"column":93},"end":{"line":113,"column":5}},"line":105},"10":{"name":"(anonymous_10)","decl":{"start":{"line":106,"column":41},"end":{"line":106,"column":42}},"loc":{"start":{"line":106,"column":48},"end":{"line":106,"column":88}},"line":106},"11":{"name":"(anonymous_11)","decl":{"start":{"line":115,"column":38},"end":{"line":115,"column":45}},"loc":{"start":{"line":115,"column":62},"end":{"line":121,"column":5}},"line":115},"12":{"name":"(anonymous_12)","decl":{"start":{"line":123,"column":40},"end":{"line":123,"column":47}},"loc":{"start":{"line":123,"column":64},"end":{"line":128,"column":5}},"line":123},"13":{"name":"(anonymous_13)","decl":{"start":{"line":130,"column":40},"end":{"line":130,"column":47}},"loc":{"start":{"line":130,"column":64},"end":{"line":134,"column":5}},"line":130},"14":{"name":"(anonymous_14)","decl":{"start":{"line":136,"column":42},"end":{"line":136,"column":49}},"loc":{"start":{"line":136,"column":66},"end":{"line":140,"column":5}},"line":136},"15":{"name":"(anonymous_15)","decl":{"start":{"line":142,"column":44},"end":{"line":142,"column":45}},"loc":{"start":{"line":142,"column":101},"end":{"line":149,"column":5}},"line":142},"16":{"name":"(anonymous_16)","decl":{"start":{"line":144,"column":43},"end":{"line":144,"column":44}},"loc":{"start":{"line":144,"column":50},"end":{"line":144,"column":90}},"line":144},"17":{"name":"(anonymous_17)","decl":{"start":{"line":152,"column":17},"end":{"line":152,"column":23}},"loc":{"start":{"line":152,"column":23},"end":{"line":152,"column":null}},"line":152},"18":{"name":"(anonymous_18)","decl":{"start":{"line":154,"column":12},"end":{"line":154,"column":18}},"loc":{"start":{"line":154,"column":18},"end":{"line":154,"column":null}},"line":154},"19":{"name":"(anonymous_19)","decl":{"start":{"line":172,"column":42},"end":{"line":172,"column":43}},"loc":{"start":{"line":172,"column":61},"end":{"line":174,"column":5}},"line":172},"20":{"name":"(anonymous_20)","decl":{"start":{"line":173,"column":20},"end":{"line":173,"column":21}},"loc":{"start":{"line":173,"column":27},"end":{"line":173,"column":66}},"line":173},"21":{"name":"(anonymous_21)","decl":{"start":{"line":176,"column":43},"end":{"line":176,"column":44}},"loc":{"start":{"line":176,"column":62},"end":{"line":178,"column":5}},"line":176},"22":{"name":"(anonymous_22)","decl":{"start":{"line":177,"column":21},"end":{"line":177,"column":22}},"loc":{"start":{"line":177,"column":28},"end":{"line":177,"column":67}},"line":177},"23":{"name":"(anonymous_23)","decl":{"start":{"line":180,"column":44},"end":{"line":180,"column":45}},"loc":{"start":{"line":180,"column":63},"end":{"line":182,"column":5}},"line":180},"24":{"name":"(anonymous_24)","decl":{"start":{"line":181,"column":22},"end":{"line":181,"column":23}},"loc":{"start":{"line":181,"column":29},"end":{"line":181,"column":68}},"line":181},"25":{"name":"(anonymous_25)","decl":{"start":{"line":184,"column":39},"end":{"line":184,"column":46}},"loc":{"start":{"line":184,"column":66},"end":{"line":194,"column":5}},"line":184},"26":{"name":"(anonymous_26)","decl":{"start":{"line":196,"column":36},"end":{"line":196,"column":37}},"loc":{"start":{"line":196,"column":43},"end":{"line":196,"column":79}},"line":196},"27":{"name":"(anonymous_27)","decl":{"start":{"line":202,"column":335},"end":{"line":202,"column":341}},"loc":{"start":{"line":202,"column":341},"end":{"line":202,"column":368}},"line":202},"28":{"name":"(anonymous_28)","decl":{"start":{"line":223,"column":31},"end":{"line":223,"column":37}},"loc":{"start":{"line":223,"column":37},"end":{"line":223,"column":null}},"line":223},"29":{"name":"(anonymous_29)","decl":{"start":{"line":223,"column":59},"end":{"line":223,"column":60}},"loc":{"start":{"line":223,"column":66},"end":{"line":223,"column":68}},"line":223},"30":{"name":"(anonymous_30)","decl":{"start":{"line":234,"column":28},"end":{"line":234,"column":34}},"loc":{"start":{"line":234,"column":34},"end":{"line":234,"column":null}},"line":234},"31":{"name":"(anonymous_31)","decl":{"start":{"line":234,"column":48},"end":{"line":234,"column":53}},"loc":{"start":{"line":234,"column":53},"end":{"line":234,"column":55}},"line":234},"32":{"name":"(anonymous_32)","decl":{"start":{"line":244,"column":47},"end":{"line":244,"column":53}},"loc":{"start":{"line":244,"column":53},"end":{"line":244,"column":76}},"line":244},"33":{"name":"(anonymous_33)","decl":{"start":{"line":249,"column":17},"end":{"line":249,"column":23}},"loc":{"start":{"line":249,"column":23},"end":{"line":249,"column":null}},"line":249},"34":{"name":"(anonymous_34)","decl":{"start":{"line":253,"column":17},"end":{"line":253,"column":23}},"loc":{"start":{"line":253,"column":23},"end":{"line":253,"column":null}},"line":253},"35":{"name":"(anonymous_35)","decl":{"start":{"line":260,"column":17},"end":{"line":260,"column":23}},"loc":{"start":{"line":260,"column":23},"end":{"line":260,"column":null}},"line":260},"36":{"name":"(anonymous_36)","decl":{"start":{"line":267,"column":17},"end":{"line":267,"column":23}},"loc":{"start":{"line":267,"column":23},"end":{"line":267,"column":null}},"line":267}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":6},"end":{"line":38,"column":null}},"type":"cond-expr","locations":[{"start":{"line":32,"column":4},"end":{"line":35,"column":null}},{"start":{"line":36,"column":4},"end":{"line":38,"column":null}}],"line":31},"1":{"loc":{"start":{"line":68,"column":21},"end":{"line":68,"column":74}},"type":"binary-expr","locations":[{"start":{"line":68,"column":21},"end":{"line":68,"column":41}},{"start":{"line":68,"column":41},"end":{"line":68,"column":74}}],"line":68},"2":{"loc":{"start":{"line":84,"column":4},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":84,"column":4},"end":{"line":87,"column":null}},{"start":{},"end":{}}],"line":84},"3":{"loc":{"start":{"line":106,"column":48},"end":{"line":106,"column":88}},"type":"binary-expr","locations":[{"start":{"line":106,"column":48},"end":{"line":106,"column":68}},{"start":{"line":106,"column":68},"end":{"line":106,"column":88}}],"line":106},"4":{"loc":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},{"start":{},"end":{}}],"line":107},"5":{"loc":{"start":{"line":144,"column":50},"end":{"line":144,"column":90}},"type":"binary-expr","locations":[{"start":{"line":144,"column":50},"end":{"line":144,"column":70}},{"start":{"line":144,"column":70},"end":{"line":144,"column":90}}],"line":144},"6":{"loc":{"start":{"line":145,"column":6},"end":{"line":145,"column":null}},"type":"if","locations":[{"start":{"line":145,"column":6},"end":{"line":145,"column":null}},{"start":{},"end":{}}],"line":145},"7":{"loc":{"start":{"line":196,"column":20},"end":{"line":196,"column":null}},"type":"binary-expr","locations":[{"start":{"line":196,"column":20},"end":{"line":196,"column":84}},{"start":{"line":196,"column":84},"end":{"line":196,"column":null}}],"line":196},"8":{"loc":{"start":{"line":206,"column":80},"end":{"line":206,"column":106}},"type":"binary-expr","locations":[{"start":{"line":206,"column":80},"end":{"line":206,"column":100}},{"start":{"line":206,"column":100},"end":{"line":206,"column":106}}],"line":206},"9":{"loc":{"start":{"line":226,"column":28},"end":{"line":226,"column":null}},"type":"binary-expr","locations":[{"start":{"line":226,"column":28},"end":{"line":226,"column":48}},{"start":{"line":226,"column":48},"end":{"line":226,"column":null}}],"line":226},"10":{"loc":{"start":{"line":227,"column":30},"end":{"line":227,"column":null}},"type":"binary-expr","locations":[{"start":{"line":227,"column":30},"end":{"line":227,"column":52}},{"start":{"line":227,"column":52},"end":{"line":227,"column":null}}],"line":227}},"s":{"0":1,"1":1,"2":1,"3":22,"4":22,"5":22,"6":22,"7":22,"8":22,"9":22,"10":22,"11":22,"12":22,"13":22,"14":22,"15":22,"16":22,"17":22,"18":22,"19":22,"20":21,"21":14,"22":0,"23":22,"24":0,"25":0,"26":0,"27":0,"28":22,"29":7,"30":7,"31":7,"32":0,"33":22,"34":0,"35":0,"36":22,"37":0,"38":22,"39":0,"40":0,"41":22,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":22,"50":0,"51":0,"52":0,"53":0,"54":0,"55":22,"56":0,"57":0,"58":0,"59":0,"60":22,"61":0,"62":0,"63":0,"64":22,"65":0,"66":0,"67":0,"68":22,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":22,"77":0,"78":1,"79":22,"80":22,"81":0,"82":0,"83":22,"84":0,"85":0,"86":22,"87":0,"88":0,"89":22,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":22,"98":0,"99":22,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0},"f":{"0":22,"1":21,"2":14,"3":0,"4":0,"5":7,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":1,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"b":{"0":[0,1],"1":[14,0],"2":[7,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[22,22],"8":[22,22],"9":[22,22],"10":[22,22]},"meta":{"lastBranch":11,"lastFunction":37,"lastStatement":110,"seen":{"s:27:44:27:Infinity":0,"s:31:6:38:Infinity":1,"b:32:4:35:Infinity:36:4:38:Infinity":0,"s:40:28:44:Infinity":2,"f:46:9:46:15":0,"s:47:32:47:Infinity":3,"s:48:38:48:Infinity":4,"s:49:40:49:Infinity":5,"s:50:42:50:Infinity":6,"s:51:50:51:Infinity":7,"s:52:34:52:Infinity":8,"s:53:46:53:Infinity":9,"s:54:56:54:Infinity":10,"s:55:54:55:Infinity":11,"s:56:40:56:Infinity":12,"s:57:46:57:Infinity":13,"s:58:38:58:Infinity":14,"s:59:32:59:Infinity":15,"s:60:34:60:Infinity":16,"s:62:8:62:Infinity":17,"s:63:8:63:Infinity":18,"s:66:8:72:Infinity":19,"f:67:4:67:10":1,"s:67:10:70:Infinity":20,"f:68:14:68:15":2,"s:68:21:68:74":21,"b:68:21:68:41:68:41:68:74":1,"f:69:11:69:12":3,"s:69:18:69:25":22,"s:75:8:80:Infinity":23,"f:75:40:75:41":4,"s:76:4:76:Infinity":24,"s:77:4:77:Infinity":25,"s:78:4:78:Infinity":26,"s:79:4:79:Infinity":27,"s:83:2:89:Infinity":28,"f:83:12:83:18":5,"b:84:4:87:Infinity:undefined:undefined:undefined:undefined":2,"s:84:4:87:Infinity":29,"s:85:6:85:Infinity":30,"s:86:6:86:Infinity":31,"s:88:4:88:Infinity":32,"s:91:8:94:Infinity":33,"f:91:39:91:40":6,"s:92:4:92:Infinity":34,"s:93:4:93:Infinity":35,"s:96:8:98:Infinity":36,"f:96:43:96:49":7,"s:97:4:97:Infinity":37,"s:100:8:103:Infinity":38,"f:100:39:100:40":8,"s:101:4:101:Infinity":39,"s:102:4:102:Infinity":40,"s:105:8:113:Infinity":41,"f:105:42:105:43":9,"s:106:22:106:Infinity":42,"f:106:41:106:42":10,"s:106:48:106:88":43,"b:106:48:106:68:106:68:106:88":3,"b:107:4:107:Infinity:undefined:undefined:undefined:undefined":4,"s:107:4:107:Infinity":44,"s:107:20:107:Infinity":45,"s:109:4:109:Infinity":46,"s:110:4:110:Infinity":47,"s:112:4:112:Infinity":48,"s:115:8:121:Infinity":49,"f:115:38:115:45":11,"s:116:10:116:Infinity":50,"s:117:4:117:Infinity":51,"s:118:4:118:Infinity":52,"s:119:4:119:Infinity":53,"s:120:4:120:Infinity":54,"s:123:8:128:Infinity":55,"f:123:40:123:47":12,"s:124:4:124:Infinity":56,"s:125:4:125:Infinity":57,"s:126:4:126:Infinity":58,"s:127:4:127:Infinity":59,"s:130:8:134:Infinity":60,"f:130:40:130:47":13,"s:131:4:131:Infinity":61,"s:132:4:132:Infinity":62,"s:133:4:133:Infinity":63,"s:136:8:140:Infinity":64,"f:136:42:136:49":14,"s:137:4:137:Infinity":65,"s:138:4:138:Infinity":66,"s:139:4:139:Infinity":67,"s:142:8:149:Infinity":68,"f:142:44:142:45":15,"s:143:4:148:Infinity":69,"s:144:24:144:Infinity":70,"f:144:43:144:44":16,"s:144:50:144:90":71,"b:144:50:144:70:144:70:144:90":5,"b:145:6:145:Infinity:undefined:undefined:undefined:undefined":6,"s:145:6:145:Infinity":72,"s:145:22:145:Infinity":73,"s:146:6:146:Infinity":74,"s:147:6:147:Infinity":75,"s:151:2:159:Infinity":76,"f:152:17:152:23":17,"s:152:23:152:Infinity":77,"f:154:12:154:18":18,"s:154:18:154:Infinity":78,"s:161:2:170:Infinity":79,"s:172:8:174:Infinity":80,"f:172:42:172:43":19,"s:173:4:173:Infinity":81,"f:173:20:173:21":20,"s:173:27:173:66":82,"s:176:8:178:Infinity":83,"f:176:43:176:44":21,"s:177:4:177:Infinity":84,"f:177:21:177:22":22,"s:177:28:177:67":85,"s:180:8:182:Infinity":86,"f:180:44:180:45":23,"s:181:4:181:Infinity":87,"f:181:22:181:23":24,"s:181:29:181:68":88,"s:184:8:194:Infinity":89,"f:184:39:184:46":25,"s:185:4:185:Infinity":90,"s:186:4:193:Infinity":91,"s:187:21:187:Infinity":92,"s:188:6:188:Infinity":93,"s:189:6:189:Infinity":94,"s:191:6:191:Infinity":95,"s:192:6:192:Infinity":96,"s:196:20:196:Infinity":97,"b:196:20:196:84:196:84:196:Infinity":7,"f:196:36:196:37":26,"s:196:43:196:79":98,"s:198:2:269:Infinity":99,"f:202:335:202:341":27,"s:202:341:202:368":100,"b:206:80:206:100:206:100:206:106":8,"f:223:31:223:37":28,"s:223:37:223:Infinity":101,"f:223:59:223:60":29,"s:223:66:223:68":102,"b:226:28:226:48:226:48:226:Infinity":9,"b:227:30:227:52:227:52:227:Infinity":10,"f:234:28:234:34":30,"s:234:34:234:Infinity":103,"f:234:48:234:53":31,"s:234:53:234:55":104,"f:244:47:244:53":32,"s:244:53:244:76":105,"f:249:17:249:23":33,"s:249:23:249:Infinity":106,"f:253:17:253:23":34,"s:253:23:253:Infinity":107,"f:260:17:260:23":35,"s:260:23:260:Infinity":108,"f:267:17:267:23":36,"s:267:23:267:Infinity":109}}} +,"/Users/luca/Workspace/laputa-app/src/types.ts": {"path":"/Users/luca/Workspace/laputa-app/src/types.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} +,"/Users/luca/Workspace/laputa-app/src/components/AIChatPanel.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/AIChatPanel.tsx","statementMap":{"0":{"start":{"line":23,"column":2},"end":{"line":30,"column":null}},"1":{"start":{"line":35,"column":2},"end":{"line":51,"column":null}},"2":{"start":{"line":61,"column":24},"end":{"line":61,"column":null}},"3":{"start":{"line":62,"column":8},"end":{"line":62,"column":null}},"4":{"start":{"line":63,"column":2},"end":{"line":63,"column":null}},"5":{"start":{"line":63,"column":20},"end":{"line":63,"column":46}},"6":{"start":{"line":65,"column":8},"end":{"line":71,"column":null}},"7":{"start":{"line":66,"column":14},"end":{"line":66,"column":null}},"8":{"start":{"line":67,"column":4},"end":{"line":70,"column":null}},"9":{"start":{"line":68,"column":19},"end":{"line":68,"column":44}},"10":{"start":{"line":69,"column":19},"end":{"line":69,"column":101}},"11":{"start":{"line":73,"column":2},"end":{"line":97,"column":null}},"12":{"start":{"line":78,"column":59},"end":{"line":78,"column":null}},"13":{"start":{"line":79,"column":26},"end":{"line":79,"column":59}},"14":{"start":{"line":85,"column":10},"end":{"line":91,"column":null}},"15":{"start":{"line":88,"column":29},"end":{"line":88,"column":43}},"16":{"start":{"line":88,"column":43},"end":{"line":88,"column":53}},"17":{"start":{"line":102,"column":20},"end":{"line":102,"column":null}},"18":{"start":{"line":103,"column":2},"end":{"line":121,"column":null}},"19":{"start":{"line":110,"column":58},"end":{"line":110,"column":82}},"20":{"start":{"line":118,"column":29},"end":{"line":118,"column":45}},"21":{"start":{"line":118,"column":45},"end":{"line":118,"column":55}},"22":{"start":{"line":126,"column":2},"end":{"line":146,"column":null}},"23":{"start":{"line":134,"column":50},"end":{"line":134,"column":null}},"24":{"start":{"line":151,"column":2},"end":{"line":157,"column":null}},"25":{"start":{"line":162,"column":2},"end":{"line":169,"column":null}},"26":{"start":{"line":174,"column":2},"end":{"line":174,"column":null}},"27":{"start":{"line":177,"column":22},"end":{"line":181,"column":null}},"28":{"start":{"line":186,"column":38},"end":{"line":186,"column":null}},"29":{"start":{"line":188,"column":2},"end":{"line":192,"column":null}},"30":{"start":{"line":189,"column":4},"end":{"line":191,"column":null}},"31":{"start":{"line":190,"column":6},"end":{"line":190,"column":null}},"32":{"start":{"line":190,"column":30},"end":{"line":190,"column":93}},"33":{"start":{"line":190,"column":45},"end":{"line":190,"column":66}},"34":{"start":{"line":194,"column":18},"end":{"line":196,"column":null}},"35":{"start":{"line":195,"column":4},"end":{"line":195,"column":null}},"36":{"start":{"line":195,"column":28},"end":{"line":195,"column":89}},"37":{"start":{"line":195,"column":43},"end":{"line":195,"column":63}},"38":{"start":{"line":197,"column":21},"end":{"line":199,"column":null}},"39":{"start":{"line":198,"column":4},"end":{"line":198,"column":null}},"40":{"start":{"line":198,"column":28},"end":{"line":198,"column":61}},"41":{"start":{"line":198,"column":45},"end":{"line":198,"column":60}},"42":{"start":{"line":200,"column":8},"end":{"line":200,"column":null}},"43":{"start":{"line":200,"column":30},"end":{"line":200,"column":70}},"44":{"start":{"line":200,"column":60},"end":{"line":200,"column":66}},"45":{"start":{"line":202,"column":2},"end":{"line":202,"column":null}},"46":{"start":{"line":208,"column":24},"end":{"line":208,"column":null}},"47":{"start":{"line":209,"column":24},"end":{"line":209,"column":null}},"48":{"start":{"line":210,"column":34},"end":{"line":210,"column":null}},"49":{"start":{"line":211,"column":46},"end":{"line":211,"column":null}},"50":{"start":{"line":212,"column":8},"end":{"line":212,"column":null}},"51":{"start":{"line":214,"column":14},"end":{"line":214,"column":null}},"52":{"start":{"line":215,"column":8},"end":{"line":215,"column":null}},"53":{"start":{"line":217,"column":8},"end":{"line":220,"column":null}},"54":{"start":{"line":218,"column":4},"end":{"line":218,"column":null}},"55":{"start":{"line":222,"column":2},"end":{"line":224,"column":null}},"56":{"start":{"line":223,"column":4},"end":{"line":223,"column":null}},"57":{"start":{"line":226,"column":21},"end":{"line":226,"column":null}},"58":{"start":{"line":226,"column":29},"end":{"line":226,"column":54}},"59":{"start":{"line":226,"column":54},"end":{"line":226,"column":67}},"60":{"start":{"line":228,"column":24},"end":{"line":230,"column":null}},"61":{"start":{"line":229,"column":4},"end":{"line":229,"column":null}},"62":{"start":{"line":229,"column":44},"end":{"line":229,"column":64}},"63":{"start":{"line":229,"column":64},"end":{"line":229,"column":77}},"64":{"start":{"line":232,"column":2},"end":{"line":268,"column":null}},"65":{"start":{"line":234,"column":35},"end":{"line":234,"column":62}},"66":{"start":{"line":239,"column":54},"end":{"line":239,"column":null}},"67":{"start":{"line":240,"column":75},"end":{"line":240,"column":null}},"68":{"start":{"line":250,"column":27},"end":{"line":250,"column":50}},"69":{"start":{"line":250,"column":50},"end":{"line":250,"column":63}},"70":{"start":{"line":255,"column":56},"end":{"line":255,"column":84}},"71":{"start":{"line":275,"column":2},"end":{"line":287,"column":null}},"72":{"start":{"line":300,"column":2},"end":{"line":318,"column":null}},"73":{"start":{"line":303,"column":8},"end":{"line":303,"column":null}},"74":{"start":{"line":303,"column":65},"end":{"line":303,"column":86}},"75":{"start":{"line":328,"column":2},"end":{"line":349,"column":null}},"76":{"start":{"line":340,"column":8},"end":{"line":344,"column":null}},"77":{"start":{"line":343,"column":57},"end":{"line":343,"column":71}},"78":{"start":{"line":358,"column":2},"end":{"line":368,"column":null}},"79":{"start":{"line":361,"column":8},"end":{"line":366,"column":null}},"80":{"start":{"line":364,"column":25},"end":{"line":364,"column":46}},"81":{"start":{"line":379,"column":2},"end":{"line":399,"column":null}},"82":{"start":{"line":382,"column":45},"end":{"line":382,"column":null}},"83":{"start":{"line":385,"column":36},"end":{"line":385,"column":98}},"84":{"start":{"line":389,"column":47},"end":{"line":389,"column":78}}},"fnMap":{"0":{"name":"TypingIndicator","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":27}},"loc":{"start":{"line":22,"column":27},"end":{"line":32,"column":null}},"line":22},"1":{"name":"ContextPill","decl":{"start":{"line":34,"column":9},"end":{"line":34,"column":21}},"loc":{"start":{"line":34,"column":85},"end":{"line":53,"column":null}},"line":34},"2":{"name":"ContextSearchDropdown","decl":{"start":{"line":55,"column":9},"end":{"line":55,"column":31}},"loc":{"start":{"line":60,"column":3},"end":{"line":99,"column":null}},"line":60},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":12},"end":{"line":63,"column":18}},"loc":{"start":{"line":63,"column":18},"end":{"line":63,"column":49}},"line":63},"4":{"name":"(anonymous_4)","decl":{"start":{"line":65,"column":27},"end":{"line":65,"column":33}},"loc":{"start":{"line":65,"column":33},"end":{"line":71,"column":5}},"line":65},"5":{"name":"(anonymous_5)","decl":{"start":{"line":68,"column":14},"end":{"line":68,"column":19}},"loc":{"start":{"line":68,"column":19},"end":{"line":68,"column":44}},"line":68},"6":{"name":"(anonymous_6)","decl":{"start":{"line":69,"column":14},"end":{"line":69,"column":19}},"loc":{"start":{"line":69,"column":19},"end":{"line":69,"column":101}},"line":69},"7":{"name":"(anonymous_7)","decl":{"start":{"line":78,"column":54},"end":{"line":78,"column":59}},"loc":{"start":{"line":78,"column":59},"end":{"line":78,"column":null}},"line":78},"8":{"name":"(anonymous_8)","decl":{"start":{"line":79,"column":21},"end":{"line":79,"column":26}},"loc":{"start":{"line":79,"column":26},"end":{"line":79,"column":59}},"line":79},"9":{"name":"(anonymous_9)","decl":{"start":{"line":84,"column":22},"end":{"line":84,"column":null}},"loc":{"start":{"line":85,"column":10},"end":{"line":91,"column":null}},"line":85},"10":{"name":"(anonymous_10)","decl":{"start":{"line":88,"column":21},"end":{"line":88,"column":27}},"loc":{"start":{"line":88,"column":27},"end":{"line":88,"column":null}},"line":88},"11":{"name":"ApiKeyDialog","decl":{"start":{"line":101,"column":9},"end":{"line":101,"column":22}},"loc":{"start":{"line":101,"column":60},"end":{"line":123,"column":null}},"line":101},"12":{"name":"(anonymous_12)","decl":{"start":{"line":110,"column":53},"end":{"line":110,"column":58}},"loc":{"start":{"line":110,"column":58},"end":{"line":110,"column":82}},"line":110},"13":{"name":"(anonymous_13)","decl":{"start":{"line":118,"column":21},"end":{"line":118,"column":27}},"loc":{"start":{"line":118,"column":27},"end":{"line":118,"column":58}},"line":118},"14":{"name":"AssistantMessage","decl":{"start":{"line":125,"column":9},"end":{"line":125,"column":26}},"loc":{"start":{"line":125,"column":87},"end":{"line":148,"column":null}},"line":125},"15":{"name":"(anonymous_15)","decl":{"start":{"line":134,"column":44},"end":{"line":134,"column":50}},"loc":{"start":{"line":134,"column":50},"end":{"line":134,"column":null}},"line":134},"16":{"name":"StreamingContent","decl":{"start":{"line":150,"column":9},"end":{"line":150,"column":26}},"loc":{"start":{"line":150,"column":60},"end":{"line":159,"column":null}},"line":150},"17":{"name":"UserBubble","decl":{"start":{"line":161,"column":9},"end":{"line":161,"column":20}},"loc":{"start":{"line":161,"column":54},"end":{"line":171,"column":null}},"line":161},"18":{"name":"formatTokens","decl":{"start":{"line":173,"column":9},"end":{"line":173,"column":22}},"loc":{"start":{"line":173,"column":41},"end":{"line":175,"column":null}},"line":173},"19":{"name":"useContextNotes","decl":{"start":{"line":185,"column":9},"end":{"line":185,"column":25}},"loc":{"start":{"line":185,"column":51},"end":{"line":203,"column":null}},"line":185},"20":{"name":"(anonymous_20)","decl":{"start":{"line":188,"column":12},"end":{"line":188,"column":18}},"loc":{"start":{"line":188,"column":18},"end":{"line":192,"column":5}},"line":188},"21":{"name":"(anonymous_21)","decl":{"start":{"line":190,"column":22},"end":{"line":190,"column":30}},"loc":{"start":{"line":190,"column":30},"end":{"line":190,"column":93}},"line":190},"22":{"name":"(anonymous_22)","decl":{"start":{"line":190,"column":40},"end":{"line":190,"column":45}},"loc":{"start":{"line":190,"column":45},"end":{"line":190,"column":66}},"line":190},"23":{"name":"(anonymous_23)","decl":{"start":{"line":194,"column":18},"end":{"line":194,"column":19}},"loc":{"start":{"line":194,"column":40},"end":{"line":196,"column":null}},"line":194},"24":{"name":"(anonymous_24)","decl":{"start":{"line":195,"column":20},"end":{"line":195,"column":28}},"loc":{"start":{"line":195,"column":28},"end":{"line":195,"column":89}},"line":195},"25":{"name":"(anonymous_25)","decl":{"start":{"line":195,"column":38},"end":{"line":195,"column":43}},"loc":{"start":{"line":195,"column":43},"end":{"line":195,"column":63}},"line":195},"26":{"name":"(anonymous_26)","decl":{"start":{"line":197,"column":21},"end":{"line":197,"column":22}},"loc":{"start":{"line":197,"column":39},"end":{"line":199,"column":null}},"line":197},"27":{"name":"(anonymous_27)","decl":{"start":{"line":198,"column":20},"end":{"line":198,"column":28}},"loc":{"start":{"line":198,"column":28},"end":{"line":198,"column":61}},"line":198},"28":{"name":"(anonymous_28)","decl":{"start":{"line":198,"column":40},"end":{"line":198,"column":45}},"loc":{"start":{"line":198,"column":45},"end":{"line":198,"column":60}},"line":198},"29":{"name":"(anonymous_29)","decl":{"start":{"line":200,"column":24},"end":{"line":200,"column":30}},"loc":{"start":{"line":200,"column":30},"end":{"line":200,"column":70}},"line":200},"30":{"name":"(anonymous_30)","decl":{"start":{"line":200,"column":55},"end":{"line":200,"column":60}},"loc":{"start":{"line":200,"column":60},"end":{"line":200,"column":66}},"line":200},"31":{"name":"AIChatPanel","decl":{"start":{"line":207,"column":16},"end":{"line":207,"column":28}},"loc":{"start":{"line":207,"column":92},"end":{"line":270,"column":null}},"line":207},"32":{"name":"(anonymous_32)","decl":{"start":{"line":218,"column":4},"end":{"line":218,"column":10}},"loc":{"start":{"line":218,"column":4},"end":{"line":218,"column":null}},"line":218},"33":{"name":"(anonymous_33)","decl":{"start":{"line":222,"column":12},"end":{"line":222,"column":18}},"loc":{"start":{"line":222,"column":18},"end":{"line":224,"column":5}},"line":222},"34":{"name":"(anonymous_34)","decl":{"start":{"line":226,"column":21},"end":{"line":226,"column":27}},"loc":{"start":{"line":226,"column":27},"end":{"line":226,"column":null}},"line":226},"35":{"name":"(anonymous_35)","decl":{"start":{"line":228,"column":24},"end":{"line":228,"column":25}},"loc":{"start":{"line":228,"column":52},"end":{"line":230,"column":null}},"line":228},"36":{"name":"(anonymous_36)","decl":{"start":{"line":234,"column":29},"end":{"line":234,"column":35}},"loc":{"start":{"line":234,"column":35},"end":{"line":234,"column":62}},"line":234},"37":{"name":"(anonymous_37)","decl":{"start":{"line":239,"column":48},"end":{"line":239,"column":54}},"loc":{"start":{"line":239,"column":54},"end":{"line":239,"column":null}},"line":239},"38":{"name":"(anonymous_38)","decl":{"start":{"line":240,"column":69},"end":{"line":240,"column":75}},"loc":{"start":{"line":240,"column":75},"end":{"line":240,"column":null}},"line":240},"39":{"name":"(anonymous_39)","decl":{"start":{"line":250,"column":18},"end":{"line":250,"column":25}},"loc":{"start":{"line":250,"column":25},"end":{"line":250,"column":66}},"line":250},"40":{"name":"(anonymous_40)","decl":{"start":{"line":255,"column":50},"end":{"line":255,"column":56}},"loc":{"start":{"line":255,"column":56},"end":{"line":255,"column":84}},"line":255},"41":{"name":"PanelHeader","decl":{"start":{"line":274,"column":9},"end":{"line":274,"column":21}},"loc":{"start":{"line":274,"column":121},"end":{"line":289,"column":null}},"line":274},"42":{"name":"ContextBar","decl":{"start":{"line":291,"column":9},"end":{"line":291,"column":20}},"loc":{"start":{"line":299,"column":3},"end":{"line":320,"column":null}},"line":299},"43":{"name":"(anonymous_43)","decl":{"start":{"line":302,"column":17},"end":{"line":302,"column":null}},"loc":{"start":{"line":303,"column":8},"end":{"line":303,"column":null}},"line":303},"44":{"name":"(anonymous_44)","decl":{"start":{"line":303,"column":59},"end":{"line":303,"column":65}},"loc":{"start":{"line":303,"column":65},"end":{"line":303,"column":86}},"line":303},"45":{"name":"MessageList","decl":{"start":{"line":322,"column":9},"end":{"line":322,"column":21}},"loc":{"start":{"line":327,"column":3},"end":{"line":351,"column":null}},"line":327},"46":{"name":"(anonymous_46)","decl":{"start":{"line":339,"column":20},"end":{"line":339,"column":21}},"loc":{"start":{"line":340,"column":8},"end":{"line":344,"column":null}},"line":340},"47":{"name":"(anonymous_47)","decl":{"start":{"line":343,"column":51},"end":{"line":343,"column":57}},"loc":{"start":{"line":343,"column":57},"end":{"line":343,"column":71}},"line":343},"48":{"name":"QuickActionsBar","decl":{"start":{"line":353,"column":9},"end":{"line":353,"column":25}},"loc":{"start":{"line":357,"column":3},"end":{"line":370,"column":null}},"line":357},"49":{"name":"(anonymous_49)","decl":{"start":{"line":360,"column":19},"end":{"line":360,"column":null}},"loc":{"start":{"line":361,"column":8},"end":{"line":366,"column":null}},"line":361},"50":{"name":"(anonymous_50)","decl":{"start":{"line":364,"column":19},"end":{"line":364,"column":25}},"loc":{"start":{"line":364,"column":25},"end":{"line":364,"column":46}},"line":364},"51":{"name":"InputArea","decl":{"start":{"line":372,"column":9},"end":{"line":372,"column":19}},"loc":{"start":{"line":378,"column":3},"end":{"line":401,"column":null}},"line":378},"52":{"name":"(anonymous_52)","decl":{"start":{"line":382,"column":40},"end":{"line":382,"column":45}},"loc":{"start":{"line":382,"column":45},"end":{"line":382,"column":null}},"line":382},"53":{"name":"(anonymous_53)","decl":{"start":{"line":385,"column":29},"end":{"line":385,"column":36}},"loc":{"start":{"line":385,"column":36},"end":{"line":385,"column":98}},"line":385},"54":{"name":"(anonymous_54)","decl":{"start":{"line":389,"column":42},"end":{"line":389,"column":47}},"loc":{"start":{"line":389,"column":47},"end":{"line":389,"column":78}},"line":389}},"branchMap":{"0":{"loc":{"start":{"line":69,"column":19},"end":{"line":69,"column":101}},"type":"binary-expr","locations":[{"start":{"line":69,"column":19},"end":{"line":69,"column":25}},{"start":{"line":69,"column":25},"end":{"line":69,"column":63}},{"start":{"line":69,"column":57},"end":{"line":69,"column":101}}],"line":69},"1":{"loc":{"start":{"line":69,"column":63},"end":{"line":69,"column":76}},"type":"binary-expr","locations":[{"start":{"line":69,"column":63},"end":{"line":69,"column":72}},{"start":{"line":69,"column":72},"end":{"line":69,"column":76}}],"line":69},"2":{"loc":{"start":{"line":79,"column":26},"end":{"line":79,"column":59}},"type":"binary-expr","locations":[{"start":{"line":79,"column":26},"end":{"line":79,"column":48}},{"start":{"line":79,"column":48},"end":{"line":79,"column":59}}],"line":79},"3":{"loc":{"start":{"line":89,"column":92},"end":{"line":89,"column":112}},"type":"binary-expr","locations":[{"start":{"line":89,"column":92},"end":{"line":89,"column":105}},{"start":{"line":89,"column":105},"end":{"line":89,"column":112}}],"line":89},"4":{"loc":{"start":{"line":93,"column":9},"end":{"line":94,"column":null}},"type":"binary-expr","locations":[{"start":{"line":93,"column":9},"end":{"line":93,"column":null}},{"start":{"line":94,"column":10},"end":{"line":94,"column":null}}],"line":93},"5":{"loc":{"start":{"line":174,"column":9},"end":{"line":174,"column":null}},"type":"cond-expr","locations":[{"start":{"line":174,"column":20},"end":{"line":174,"column":32}},{"start":{"line":174,"column":32},"end":{"line":174,"column":null}}],"line":174},"6":{"loc":{"start":{"line":189,"column":4},"end":{"line":191,"column":null}},"type":"if","locations":[{"start":{"line":189,"column":4},"end":{"line":191,"column":null}},{"start":{},"end":{}}],"line":189},"7":{"loc":{"start":{"line":190,"column":30},"end":{"line":190,"column":93}},"type":"cond-expr","locations":[{"start":{"line":190,"column":70},"end":{"line":190,"column":77}},{"start":{"line":190,"column":77},"end":{"line":190,"column":93}}],"line":190},"8":{"loc":{"start":{"line":195,"column":28},"end":{"line":195,"column":89}},"type":"cond-expr","locations":[{"start":{"line":195,"column":67},"end":{"line":195,"column":74}},{"start":{"line":195,"column":74},"end":{"line":195,"column":89}}],"line":195},"9":{"loc":{"start":{"line":207,"column":49},"end":{"line":207,"column":63}},"type":"default-arg","locations":[{"start":{"line":207,"column":59},"end":{"line":207,"column":63}}],"line":207},"10":{"loc":{"start":{"line":229,"column":4},"end":{"line":229,"column":null}},"type":"if","locations":[{"start":{"line":229,"column":4},"end":{"line":229,"column":null}},{"start":{},"end":{}}],"line":229},"11":{"loc":{"start":{"line":229,"column":8},"end":{"line":229,"column":42}},"type":"binary-expr","locations":[{"start":{"line":229,"column":8},"end":{"line":229,"column":29}},{"start":{"line":229,"column":29},"end":{"line":229,"column":42}}],"line":229},"12":{"loc":{"start":{"line":253,"column":64},"end":{"line":253,"column":99}},"type":"binary-expr","locations":[{"start":{"line":253,"column":64},"end":{"line":253,"column":84}},{"start":{"line":253,"column":84},"end":{"line":253,"column":99}}],"line":253},"13":{"loc":{"start":{"line":255,"column":7},"end":{"line":255,"column":null}},"type":"binary-expr","locations":[{"start":{"line":255,"column":7},"end":{"line":255,"column":27}},{"start":{"line":255,"column":27},"end":{"line":255,"column":null}}],"line":255},"14":{"loc":{"start":{"line":281,"column":23},"end":{"line":281,"column":65}},"type":"cond-expr","locations":[{"start":{"line":281,"column":45},"end":{"line":281,"column":54}},{"start":{"line":281,"column":54},"end":{"line":281,"column":65}}],"line":281},"15":{"loc":{"start":{"line":310,"column":7},"end":{"line":313,"column":null}},"type":"binary-expr","locations":[{"start":{"line":310,"column":7},"end":{"line":310,"column":null}},{"start":{"line":311,"column":8},"end":{"line":313,"column":null}}],"line":310},"16":{"loc":{"start":{"line":312,"column":45},"end":{"line":312,"column":null}},"type":"binary-expr","locations":[{"start":{"line":312,"column":45},"end":{"line":312,"column":58}},{"start":{"line":312,"column":58},"end":{"line":312,"column":null}}],"line":312},"17":{"loc":{"start":{"line":315,"column":7},"end":{"line":316,"column":null}},"type":"binary-expr","locations":[{"start":{"line":315,"column":7},"end":{"line":315,"column":null}},{"start":{"line":316,"column":8},"end":{"line":316,"column":null}}],"line":315},"18":{"loc":{"start":{"line":330,"column":7},"end":{"line":337,"column":null}},"type":"binary-expr","locations":[{"start":{"line":330,"column":7},"end":{"line":330,"column":32}},{"start":{"line":330,"column":32},"end":{"line":330,"column":null}},{"start":{"line":331,"column":8},"end":{"line":337,"column":null}}],"line":330},"19":{"loc":{"start":{"line":335,"column":13},"end":{"line":335,"column":null}},"type":"cond-expr","locations":[{"start":{"line":335,"column":27},"end":{"line":335,"column":58}},{"start":{"line":335,"column":58},"end":{"line":335,"column":null}}],"line":335},"20":{"loc":{"start":{"line":341,"column":11},"end":{"line":343,"column":null}},"type":"cond-expr","locations":[{"start":{"line":342,"column":14},"end":{"line":342,"column":null}},{"start":{"line":343,"column":14},"end":{"line":343,"column":null}}],"line":341},"21":{"loc":{"start":{"line":346,"column":7},"end":{"line":346,"column":null}},"type":"binary-expr","locations":[{"start":{"line":346,"column":7},"end":{"line":346,"column":22}},{"start":{"line":346,"column":22},"end":{"line":346,"column":42}},{"start":{"line":346,"column":42},"end":{"line":346,"column":null}}],"line":346},"22":{"loc":{"start":{"line":347,"column":7},"end":{"line":347,"column":null}},"type":"binary-expr","locations":[{"start":{"line":347,"column":7},"end":{"line":347,"column":22}},{"start":{"line":347,"column":22},"end":{"line":347,"column":43}},{"start":{"line":347,"column":43},"end":{"line":347,"column":null}}],"line":347}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":2,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0},"b":{"0":[0,0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0,0],"19":[0,0],"20":[0,0],"21":[0,0,0],"22":[0,0,0]},"meta":{"lastBranch":23,"lastFunction":55,"lastStatement":85,"seen":{"f:22:9:22:27":0,"s:23:2:30:Infinity":0,"f:34:9:34:21":1,"s:35:2:51:Infinity":1,"f:55:9:55:31":2,"s:61:24:61:Infinity":2,"s:62:8:62:Infinity":3,"s:63:2:63:Infinity":4,"f:63:12:63:18":3,"s:63:20:63:46":5,"s:65:8:71:Infinity":6,"f:65:27:65:33":4,"s:66:14:66:Infinity":7,"s:67:4:70:Infinity":8,"f:68:14:68:19":5,"s:68:19:68:44":9,"f:69:14:69:19":6,"s:69:19:69:101":10,"b:69:19:69:25:69:25:69:63:69:57:69:101":0,"b:69:63:69:72:69:72:69:76":1,"s:73:2:97:Infinity":11,"f:78:54:78:59":7,"s:78:59:78:Infinity":12,"f:79:21:79:26":8,"s:79:26:79:59":13,"b:79:26:79:48:79:48:79:59":2,"f:84:22:84:Infinity":9,"s:85:10:91:Infinity":14,"f:88:21:88:27":10,"s:88:29:88:43":15,"s:88:43:88:53":16,"b:89:92:89:105:89:105:89:112":3,"b:93:9:93:Infinity:94:10:94:Infinity":4,"f:101:9:101:22":11,"s:102:20:102:Infinity":17,"s:103:2:121:Infinity":18,"f:110:53:110:58":12,"s:110:58:110:82":19,"f:118:21:118:27":13,"s:118:29:118:45":20,"s:118:45:118:55":21,"f:125:9:125:26":14,"s:126:2:146:Infinity":22,"f:134:44:134:50":15,"s:134:50:134:Infinity":23,"f:150:9:150:26":16,"s:151:2:157:Infinity":24,"f:161:9:161:20":17,"s:162:2:169:Infinity":25,"f:173:9:173:22":18,"s:174:2:174:Infinity":26,"b:174:20:174:32:174:32:174:Infinity":5,"s:177:22:181:Infinity":27,"f:185:9:185:25":19,"s:186:38:186:Infinity":28,"s:188:2:192:Infinity":29,"f:188:12:188:18":20,"b:189:4:191:Infinity:undefined:undefined:undefined:undefined":6,"s:189:4:191:Infinity":30,"s:190:6:190:Infinity":31,"f:190:22:190:30":21,"s:190:30:190:93":32,"b:190:70:190:77:190:77:190:93":7,"f:190:40:190:45":22,"s:190:45:190:66":33,"s:194:18:196:Infinity":34,"f:194:18:194:19":23,"s:195:4:195:Infinity":35,"f:195:20:195:28":24,"s:195:28:195:89":36,"b:195:67:195:74:195:74:195:89":8,"f:195:38:195:43":25,"s:195:43:195:63":37,"s:197:21:199:Infinity":38,"f:197:21:197:22":26,"s:198:4:198:Infinity":39,"f:198:20:198:28":27,"s:198:28:198:61":40,"f:198:40:198:45":28,"s:198:45:198:60":41,"s:200:8:200:Infinity":42,"f:200:24:200:30":29,"s:200:30:200:70":43,"f:200:55:200:60":30,"s:200:60:200:66":44,"s:202:2:202:Infinity":45,"f:207:16:207:28":31,"b:207:59:207:63":9,"s:208:24:208:Infinity":46,"s:209:24:209:Infinity":47,"s:210:34:210:Infinity":48,"s:211:46:211:Infinity":49,"s:212:8:212:Infinity":50,"s:214:14:214:Infinity":51,"s:215:8:215:Infinity":52,"s:217:8:220:Infinity":53,"f:218:4:218:10":32,"s:218:4:218:Infinity":54,"s:222:2:224:Infinity":55,"f:222:12:222:18":33,"s:223:4:223:Infinity":56,"s:226:21:226:Infinity":57,"f:226:21:226:27":34,"s:226:29:226:54":58,"s:226:54:226:67":59,"s:228:24:230:Infinity":60,"f:228:24:228:25":35,"b:229:4:229:Infinity:undefined:undefined:undefined:undefined":10,"s:229:4:229:Infinity":61,"b:229:8:229:29:229:29:229:42":11,"s:229:44:229:64":62,"s:229:64:229:77":63,"s:232:2:268:Infinity":64,"f:234:29:234:35":36,"s:234:35:234:62":65,"f:239:48:239:54":37,"s:239:54:239:Infinity":66,"f:240:69:240:75":38,"s:240:75:240:Infinity":67,"f:250:18:250:25":39,"s:250:27:250:50":68,"s:250:50:250:63":69,"b:253:64:253:84:253:84:253:99":12,"b:255:7:255:27:255:27:255:Infinity":13,"f:255:50:255:56":40,"s:255:56:255:84":70,"f:274:9:274:21":41,"s:275:2:287:Infinity":71,"b:281:45:281:54:281:54:281:65":14,"f:291:9:291:20":42,"s:300:2:318:Infinity":72,"f:302:17:302:Infinity":43,"s:303:8:303:Infinity":73,"f:303:59:303:65":44,"s:303:65:303:86":74,"b:310:7:310:Infinity:311:8:313:Infinity":15,"b:312:45:312:58:312:58:312:Infinity":16,"b:315:7:315:Infinity:316:8:316:Infinity":17,"f:322:9:322:21":45,"s:328:2:349:Infinity":75,"b:330:7:330:32:330:32:330:Infinity:331:8:337:Infinity":18,"b:335:27:335:58:335:58:335:Infinity":19,"f:339:20:339:21":46,"s:340:8:344:Infinity":76,"b:342:14:342:Infinity:343:14:343:Infinity":20,"f:343:51:343:57":47,"s:343:57:343:71":77,"b:346:7:346:22:346:22:346:42:346:42:346:Infinity":21,"b:347:7:347:22:347:22:347:43:347:43:347:Infinity":22,"f:353:9:353:25":48,"s:358:2:368:Infinity":78,"f:360:19:360:Infinity":49,"s:361:8:366:Infinity":79,"f:364:19:364:25":50,"s:364:25:364:46":80,"f:372:9:372:19":51,"s:379:2:399:Infinity":81,"f:382:40:382:45":52,"s:382:45:382:Infinity":82,"f:385:29:385:36":53,"s:385:36:385:98":83,"f:389:42:389:47":54,"s:389:47:389:78":84}}} +,"/Users/luca/Workspace/laputa-app/src/components/BreadcrumbBar.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/BreadcrumbBar.tsx","statementMap":{"0":{"start":{"line":35,"column":28},"end":{"line":35,"column":null}},"1":{"start":{"line":41,"column":2},"end":{"line":141,"column":null}},"2":{"start":{"line":145,"column":13},"end":{"line":177,"column":null}},"3":{"start":{"line":148,"column":2},"end":{"line":175,"column":null}}},"fnMap":{"0":{"name":"BreadcrumbActions","decl":{"start":{"line":37,"column":9},"end":{"line":37,"column":27}},"loc":{"start":{"line":40,"column":57},"end":{"line":143,"column":null}},"line":40},"1":{"name":"BreadcrumbBar2","decl":{"start":{"line":145,"column":43},"end":{"line":145,"column":57}},"loc":{"start":{"line":147,"column":23},"end":{"line":177,"column":1}},"line":147}},"branchMap":{"0":{"loc":{"start":{"line":49,"column":7},"end":{"line":69,"column":null}},"type":"cond-expr","locations":[{"start":{"line":50,"column":8},"end":{"line":60,"column":null}},{"start":{"line":62,"column":8},"end":{"line":69,"column":null}}],"line":49},"1":{"loc":{"start":{"line":53,"column":12},"end":{"line":53,"column":null}},"type":"cond-expr","locations":[{"start":{"line":53,"column":23},"end":{"line":53,"column":43}},{"start":{"line":53,"column":43},"end":{"line":53,"column":null}}],"line":53},"2":{"loc":{"start":{"line":57,"column":17},"end":{"line":57,"column":null}},"type":"cond-expr","locations":[{"start":{"line":57,"column":31},"end":{"line":57,"column":51}},{"start":{"line":57,"column":51},"end":{"line":57,"column":null}}],"line":57},"3":{"loc":{"start":{"line":57,"column":51},"end":{"line":57,"column":null}},"type":"cond-expr","locations":[{"start":{"line":57,"column":62},"end":{"line":57,"column":81}},{"start":{"line":57,"column":81},"end":{"line":57,"column":null}}],"line":57},"4":{"loc":{"start":{"line":82,"column":10},"end":{"line":82,"column":null}},"type":"cond-expr","locations":[{"start":{"line":82,"column":23},"end":{"line":82,"column":28}},{"start":{"line":82,"column":28},"end":{"line":82,"column":null}}],"line":82},"5":{"loc":{"start":{"line":84,"column":15},"end":{"line":84,"column":null}},"type":"cond-expr","locations":[{"start":{"line":84,"column":28},"end":{"line":84,"column":58}},{"start":{"line":84,"column":58},"end":{"line":84,"column":null}}],"line":84},"6":{"loc":{"start":{"line":86,"column":15},"end":{"line":86,"column":null}},"type":"cond-expr","locations":[{"start":{"line":86,"column":28},"end":{"line":86,"column":46}},{"start":{"line":86,"column":46},"end":{"line":86,"column":null}}],"line":86},"7":{"loc":{"start":{"line":88,"column":35},"end":{"line":88,"column":68}},"type":"cond-expr","locations":[{"start":{"line":88,"column":48},"end":{"line":88,"column":57}},{"start":{"line":88,"column":57},"end":{"line":88,"column":68}}],"line":88},"8":{"loc":{"start":{"line":90,"column":7},"end":{"line":105,"column":null}},"type":"cond-expr","locations":[{"start":{"line":91,"column":8},"end":{"line":97,"column":null}},{"start":{"line":99,"column":8},"end":{"line":105,"column":null}}],"line":90},"9":{"loc":{"start":{"line":107,"column":7},"end":{"line":122,"column":null}},"type":"cond-expr","locations":[{"start":{"line":108,"column":8},"end":{"line":114,"column":null}},{"start":{"line":116,"column":8},"end":{"line":122,"column":null}}],"line":107},"10":{"loc":{"start":{"line":124,"column":7},"end":{"line":131,"column":null}},"type":"binary-expr","locations":[{"start":{"line":124,"column":7},"end":{"line":124,"column":null}},{"start":{"line":125,"column":8},"end":{"line":131,"column":null}}],"line":124},"11":{"loc":{"start":{"line":160,"column":49},"end":{"line":160,"column":69}},"type":"binary-expr","locations":[{"start":{"line":160,"column":49},"end":{"line":160,"column":62}},{"start":{"line":160,"column":62},"end":{"line":160,"column":69}}],"line":160},"12":{"loc":{"start":{"line":165,"column":9},"end":{"line":169,"column":null}},"type":"binary-expr","locations":[{"start":{"line":165,"column":9},"end":{"line":165,"column":null}},{"start":{"line":166,"column":10},"end":{"line":169,"column":null}}],"line":165}},"s":{"0":3,"1":16,"2":3,"3":16},"f":{"0":16,"1":16},"b":{"0":[2,14],"1":[0,2],"2":[0,2],"3":[0,2],"4":[0,16],"5":[0,16],"6":[0,16],"7":[0,16],"8":[2,14],"9":[2,14],"10":[16,8],"11":[16,0],"12":[16,2]},"meta":{"lastBranch":13,"lastFunction":2,"lastStatement":4,"seen":{"s:35:28:35:Infinity":0,"f:37:9:37:27":0,"s:41:2:141:Infinity":1,"b:50:8:60:Infinity:62:8:69:Infinity":0,"b:53:23:53:43:53:43:53:Infinity":1,"b:57:31:57:51:57:51:57:Infinity":2,"b:57:62:57:81:57:81:57:Infinity":3,"b:82:23:82:28:82:28:82:Infinity":4,"b:84:28:84:58:84:58:84:Infinity":5,"b:86:28:86:46:86:46:86:Infinity":6,"b:88:48:88:57:88:57:88:68":7,"b:91:8:97:Infinity:99:8:105:Infinity":8,"b:108:8:114:Infinity:116:8:122:Infinity":9,"b:124:7:124:Infinity:125:8:131:Infinity":10,"s:145:13:177:Infinity":2,"f:145:43:145:57":1,"s:148:2:175:Infinity":3,"b:160:49:160:62:160:62:160:69":11,"b:165:9:165:Infinity:166:10:169:Infinity":12}}} +,"/Users/luca/Workspace/laputa-app/src/components/CommitDialog.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/CommitDialog.tsx","statementMap":{"0":{"start":{"line":14,"column":28},"end":{"line":14,"column":null}},"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"2":{"start":{"line":17,"column":2},"end":{"line":22,"column":null}},"3":{"start":{"line":18,"column":4},"end":{"line":21,"column":null}},"4":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"5":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"6":{"start":{"line":20,"column":23},"end":{"line":20,"column":50}},"7":{"start":{"line":24,"column":23},"end":{"line":28,"column":null}},"8":{"start":{"line":25,"column":20},"end":{"line":25,"column":null}},"9":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"10":{"start":{"line":26,"column":18},"end":{"line":26,"column":null}},"11":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"12":{"start":{"line":30,"column":24},"end":{"line":37,"column":null}},"13":{"start":{"line":31,"column":4},"end":{"line":36,"column":null}},"14":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"15":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"16":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"17":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"18":{"start":{"line":39,"column":2},"end":{"line":71,"column":null}},"19":{"start":{"line":40,"column":52},"end":{"line":40,"column":75}},"20":{"start":{"line":40,"column":65},"end":{"line":40,"column":75}},"21":{"start":{"line":55,"column":27},"end":{"line":55,"column":null}}},"fnMap":{"0":{"name":"CommitDialog","decl":{"start":{"line":13,"column":16},"end":{"line":13,"column":29}},"loc":{"start":{"line":13,"column":92},"end":{"line":73,"column":null}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":12},"end":{"line":17,"column":18}},"loc":{"start":{"line":17,"column":18},"end":{"line":22,"column":5}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":17},"end":{"line":20,"column":23}},"loc":{"start":{"line":20,"column":23},"end":{"line":20,"column":50}},"line":20},"3":{"name":"(anonymous_3)","decl":{"start":{"line":24,"column":23},"end":{"line":24,"column":29}},"loc":{"start":{"line":24,"column":29},"end":{"line":28,"column":null}},"line":24},"4":{"name":"(anonymous_4)","decl":{"start":{"line":30,"column":24},"end":{"line":30,"column":25}},"loc":{"start":{"line":30,"column":52},"end":{"line":37,"column":null}},"line":30},"5":{"name":"(anonymous_5)","decl":{"start":{"line":40,"column":38},"end":{"line":40,"column":39}},"loc":{"start":{"line":40,"column":50},"end":{"line":40,"column":null}},"line":40},"6":{"name":"(anonymous_6)","decl":{"start":{"line":55,"column":20},"end":{"line":55,"column":21}},"loc":{"start":{"line":55,"column":27},"end":{"line":55,"column":null}},"line":55}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":4},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":4},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":18},"1":{"loc":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":26},"2":{"loc":{"start":{"line":31,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":36,"column":null}},{"start":{"line":34,"column":4},"end":{"line":36,"column":null}}],"line":31},"3":{"loc":{"start":{"line":31,"column":8},"end":{"line":31,"column":55}},"type":"binary-expr","locations":[{"start":{"line":31,"column":8},"end":{"line":31,"column":30}},{"start":{"line":31,"column":30},"end":{"line":31,"column":43}},{"start":{"line":31,"column":43},"end":{"line":31,"column":55}}],"line":31},"4":{"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":34},"5":{"loc":{"start":{"line":40,"column":52},"end":{"line":40,"column":75}},"type":"if","locations":[{"start":{"line":40,"column":52},"end":{"line":40,"column":75}},{"start":{},"end":{}}],"line":40},"6":{"loc":{"start":{"line":46,"column":35},"end":{"line":46,"column":66}},"type":"cond-expr","locations":[{"start":{"line":46,"column":57},"end":{"line":46,"column":63}},{"start":{"line":46,"column":63},"end":{"line":46,"column":66}}],"line":46}},"s":{"0":22,"1":22,"2":22,"3":7,"4":0,"5":0,"6":0,"7":22,"8":0,"9":0,"10":0,"11":0,"12":22,"13":0,"14":0,"15":0,"16":0,"17":0,"18":22,"19":0,"20":0,"21":0},"f":{"0":22,"1":7,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,7],"1":[0,0],"2":[0,0],"3":[0,0,0],"4":[0,0],"5":[0,0],"6":[22,0]},"meta":{"lastBranch":7,"lastFunction":7,"lastStatement":22,"seen":{"f:13:16:13:29":0,"s:14:28:14:Infinity":0,"s:15:8:15:Infinity":1,"s:17:2:22:Infinity":2,"f:17:12:17:18":1,"b:18:4:21:Infinity:undefined:undefined:undefined:undefined":0,"s:18:4:21:Infinity":3,"s:19:6:19:Infinity":4,"s:20:6:20:Infinity":5,"f:20:17:20:23":2,"s:20:23:20:50":6,"s:24:23:28:Infinity":7,"f:24:23:24:29":3,"s:25:20:25:Infinity":8,"b:26:4:26:Infinity:undefined:undefined:undefined:undefined":1,"s:26:4:26:Infinity":9,"s:26:18:26:Infinity":10,"s:27:4:27:Infinity":11,"s:30:24:37:Infinity":12,"f:30:24:30:25":4,"b:31:4:36:Infinity:34:4:36:Infinity":2,"s:31:4:36:Infinity":13,"b:31:8:31:30:31:30:31:43:31:43:31:55":3,"s:32:6:32:Infinity":14,"s:33:6:33:Infinity":15,"b:34:4:36:Infinity:undefined:undefined:undefined:undefined":4,"s:34:4:36:Infinity":16,"s:35:6:35:Infinity":17,"s:39:2:71:Infinity":18,"f:40:38:40:39":5,"b:40:52:40:75:undefined:undefined:undefined:undefined":5,"s:40:52:40:75":19,"s:40:65:40:75":20,"b:46:57:46:63:46:63:46:66":6,"f:55:20:55:21":6,"s:55:27:55:Infinity":21}}} +,"/Users/luca/Workspace/laputa-app/src/components/CreateNoteDialog.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/CreateNoteDialog.tsx","statementMap":{"0":{"start":{"line":7,"column":23},"end":{"line":16,"column":null}},"1":{"start":{"line":30,"column":24},"end":{"line":30,"column":null}},"2":{"start":{"line":31,"column":22},"end":{"line":31,"column":null}},"3":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"4":{"start":{"line":34,"column":2},"end":{"line":40,"column":null}},"5":{"start":{"line":35,"column":4},"end":{"line":39,"column":null}},"6":{"start":{"line":36,"column":6},"end":{"line":36,"column":null}},"7":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"8":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"9":{"start":{"line":38,"column":23},"end":{"line":38,"column":50}},"10":{"start":{"line":42,"column":23},"end":{"line":48,"column":null}},"11":{"start":{"line":43,"column":4},"end":{"line":43,"column":null}},"12":{"start":{"line":44,"column":20},"end":{"line":44,"column":null}},"13":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"14":{"start":{"line":45,"column":18},"end":{"line":45,"column":null}},"15":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"16":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"17":{"start":{"line":50,"column":2},"end":{"line":117,"column":null}},"18":{"start":{"line":51,"column":52},"end":{"line":51,"column":75}},"19":{"start":{"line":51,"column":65},"end":{"line":51,"column":75}},"20":{"start":{"line":65,"column":31},"end":{"line":65,"column":null}},"21":{"start":{"line":74,"column":16},"end":{"line":86,"column":null}},"22":{"start":{"line":83,"column":33},"end":{"line":83,"column":null}},"23":{"start":{"line":89,"column":16},"end":{"line":103,"column":null}},"24":{"start":{"line":100,"column":33},"end":{"line":100,"column":null}}},"fnMap":{"0":{"name":"CreateNoteDialog","decl":{"start":{"line":29,"column":16},"end":{"line":29,"column":33}},"loc":{"start":{"line":29,"column":116},"end":{"line":119,"column":null}},"line":29},"1":{"name":"(anonymous_1)","decl":{"start":{"line":34,"column":12},"end":{"line":34,"column":18}},"loc":{"start":{"line":34,"column":18},"end":{"line":40,"column":5}},"line":34},"2":{"name":"(anonymous_2)","decl":{"start":{"line":38,"column":17},"end":{"line":38,"column":23}},"loc":{"start":{"line":38,"column":23},"end":{"line":38,"column":50}},"line":38},"3":{"name":"(anonymous_3)","decl":{"start":{"line":42,"column":23},"end":{"line":42,"column":24}},"loc":{"start":{"line":42,"column":47},"end":{"line":48,"column":null}},"line":42},"4":{"name":"(anonymous_4)","decl":{"start":{"line":51,"column":38},"end":{"line":51,"column":39}},"loc":{"start":{"line":51,"column":50},"end":{"line":51,"column":null}},"line":51},"5":{"name":"(anonymous_5)","decl":{"start":{"line":65,"column":24},"end":{"line":65,"column":25}},"loc":{"start":{"line":65,"column":31},"end":{"line":65,"column":null}},"line":65},"6":{"name":"(anonymous_6)","decl":{"start":{"line":73,"column":34},"end":{"line":73,"column":35}},"loc":{"start":{"line":74,"column":16},"end":{"line":86,"column":null}},"line":74},"7":{"name":"(anonymous_7)","decl":{"start":{"line":83,"column":27},"end":{"line":83,"column":33}},"loc":{"start":{"line":83,"column":33},"end":{"line":83,"column":null}},"line":83},"8":{"name":"(anonymous_8)","decl":{"start":{"line":88,"column":31},"end":{"line":88,"column":32}},"loc":{"start":{"line":89,"column":16},"end":{"line":103,"column":null}},"line":89},"9":{"name":"(anonymous_9)","decl":{"start":{"line":100,"column":27},"end":{"line":100,"column":33}},"loc":{"start":{"line":100,"column":33},"end":{"line":100,"column":null}},"line":100}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":73},"end":{"line":29,"column":90}},"type":"default-arg","locations":[{"start":{"line":29,"column":87},"end":{"line":29,"column":90}}],"line":29},"1":{"loc":{"start":{"line":35,"column":4},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":4},"end":{"line":39,"column":null}},{"start":{},"end":{}}],"line":35},"2":{"loc":{"start":{"line":37,"column":14},"end":{"line":37,"column":35}},"type":"binary-expr","locations":[{"start":{"line":37,"column":14},"end":{"line":37,"column":29}},{"start":{"line":37,"column":29},"end":{"line":37,"column":35}}],"line":37},"3":{"loc":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},{"start":{},"end":{}}],"line":45},"4":{"loc":{"start":{"line":51,"column":52},"end":{"line":51,"column":75}},"type":"if","locations":[{"start":{"line":51,"column":52},"end":{"line":51,"column":75}},{"start":{},"end":{}}],"line":51},"5":{"loc":{"start":{"line":77,"column":27},"end":{"line":77,"column":null}},"type":"cond-expr","locations":[{"start":{"line":77,"column":40},"end":{"line":77,"column":52}},{"start":{"line":77,"column":52},"end":{"line":77,"column":null}}],"line":77},"6":{"loc":{"start":{"line":81,"column":20},"end":{"line":81,"column":null}},"type":"binary-expr","locations":[{"start":{"line":81,"column":20},"end":{"line":81,"column":34}},{"start":{"line":81,"column":34},"end":{"line":81,"column":null}}],"line":81},"7":{"loc":{"start":{"line":92,"column":27},"end":{"line":92,"column":null}},"type":"cond-expr","locations":[{"start":{"line":92,"column":40},"end":{"line":92,"column":52}},{"start":{"line":92,"column":52},"end":{"line":92,"column":null}}],"line":92},"8":{"loc":{"start":{"line":96,"column":20},"end":{"line":98,"column":null}},"type":"cond-expr","locations":[{"start":{"line":97,"column":24},"end":{"line":97,"column":null}},{"start":{"line":98,"column":24},"end":{"line":98,"column":null}}],"line":96}},"s":{"0":1,"1":22,"2":22,"3":22,"4":22,"5":7,"6":0,"7":0,"8":0,"9":0,"10":22,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":22,"18":0,"19":0,"20":0,"21":176,"22":0,"23":0,"24":0},"f":{"0":22,"1":7,"2":0,"3":0,"4":0,"5":0,"6":176,"7":0,"8":0,"9":0},"b":{"0":[22],"1":[0,7],"2":[0,0],"3":[0,0],"4":[0,0],"5":[22,154],"6":[176,22],"7":[0,0],"8":[0,0]},"meta":{"lastBranch":9,"lastFunction":10,"lastStatement":25,"seen":{"s:7:23:16:Infinity":0,"f:29:16:29:33":0,"b:29:87:29:90":0,"s:30:24:30:Infinity":1,"s:31:22:31:Infinity":2,"s:32:8:32:Infinity":3,"s:34:2:40:Infinity":4,"f:34:12:34:18":1,"b:35:4:39:Infinity:undefined:undefined:undefined:undefined":1,"s:35:4:39:Infinity":5,"s:36:6:36:Infinity":6,"s:37:6:37:Infinity":7,"b:37:14:37:29:37:29:37:35":2,"s:38:6:38:Infinity":8,"f:38:17:38:23":2,"s:38:23:38:50":9,"s:42:23:48:Infinity":10,"f:42:23:42:24":3,"s:43:4:43:Infinity":11,"s:44:20:44:Infinity":12,"b:45:4:45:Infinity:undefined:undefined:undefined:undefined":3,"s:45:4:45:Infinity":13,"s:45:18:45:Infinity":14,"s:46:4:46:Infinity":15,"s:47:4:47:Infinity":16,"s:50:2:117:Infinity":17,"f:51:38:51:39":4,"b:51:52:51:75:undefined:undefined:undefined:undefined":4,"s:51:52:51:75":18,"s:51:65:51:75":19,"f:65:24:65:25":5,"s:65:31:65:Infinity":20,"f:73:34:73:35":6,"s:74:16:86:Infinity":21,"b:77:40:77:52:77:52:77:Infinity":5,"b:81:20:81:34:81:34:81:Infinity":6,"f:83:27:83:33":7,"s:83:33:83:Infinity":22,"f:88:31:88:32":8,"s:89:16:103:Infinity":23,"b:92:40:92:52:92:52:92:Infinity":7,"b:97:24:97:Infinity:98:24:98:Infinity":8,"f:100:27:100:33":9,"s:100:33:100:Infinity":24}}} +,"/Users/luca/Workspace/laputa-app/src/components/CreateTypeDialog.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/CreateTypeDialog.tsx","statementMap":{"0":{"start":{"line":13,"column":22},"end":{"line":13,"column":null}},"1":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"2":{"start":{"line":16,"column":2},"end":{"line":21,"column":null}},"3":{"start":{"line":17,"column":4},"end":{"line":20,"column":null}},"4":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"5":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"6":{"start":{"line":19,"column":23},"end":{"line":19,"column":50}},"7":{"start":{"line":23,"column":23},"end":{"line":29,"column":null}},"8":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"9":{"start":{"line":25,"column":20},"end":{"line":25,"column":null}},"10":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"11":{"start":{"line":26,"column":18},"end":{"line":26,"column":null}},"12":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"13":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"14":{"start":{"line":31,"column":2},"end":{"line":62,"column":null}},"15":{"start":{"line":32,"column":52},"end":{"line":32,"column":75}},"16":{"start":{"line":32,"column":65},"end":{"line":32,"column":75}},"17":{"start":{"line":46,"column":31},"end":{"line":46,"column":null}}},"fnMap":{"0":{"name":"CreateTypeDialog","decl":{"start":{"line":12,"column":16},"end":{"line":12,"column":33}},"loc":{"start":{"line":12,"column":85},"end":{"line":64,"column":null}},"line":12},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":12},"end":{"line":16,"column":18}},"loc":{"start":{"line":16,"column":18},"end":{"line":21,"column":5}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":17},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":23},"end":{"line":19,"column":50}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":23},"end":{"line":23,"column":24}},"loc":{"start":{"line":23,"column":47},"end":{"line":29,"column":null}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":38},"end":{"line":32,"column":39}},"loc":{"start":{"line":32,"column":50},"end":{"line":32,"column":null}},"line":32},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":24},"end":{"line":46,"column":25}},"loc":{"start":{"line":46,"column":31},"end":{"line":46,"column":null}},"line":46}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":4},"end":{"line":20,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":20,"column":null}},{"start":{},"end":{}}],"line":17},"1":{"loc":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":26},"2":{"loc":{"start":{"line":32,"column":52},"end":{"line":32,"column":75}},"type":"if","locations":[{"start":{"line":32,"column":52},"end":{"line":32,"column":75}},{"start":{},"end":{}}],"line":32}},"s":{"0":38,"1":38,"2":38,"3":15,"4":7,"5":7,"6":7,"7":38,"8":3,"9":3,"10":3,"11":1,"12":2,"13":2,"14":38,"15":0,"16":0,"17":4},"f":{"0":38,"1":15,"2":7,"3":3,"4":0,"5":4},"b":{"0":[7,8],"1":[1,2],"2":[0,0]},"meta":{"lastBranch":3,"lastFunction":6,"lastStatement":18,"seen":{"f:12:16:12:33":0,"s:13:22:13:Infinity":0,"s:14:8:14:Infinity":1,"s:16:2:21:Infinity":2,"f:16:12:16:18":1,"b:17:4:20:Infinity:undefined:undefined:undefined:undefined":0,"s:17:4:20:Infinity":3,"s:18:6:18:Infinity":4,"s:19:6:19:Infinity":5,"f:19:17:19:23":2,"s:19:23:19:50":6,"s:23:23:29:Infinity":7,"f:23:23:23:24":3,"s:24:4:24:Infinity":8,"s:25:20:25:Infinity":9,"b:26:4:26:Infinity:undefined:undefined:undefined:undefined":1,"s:26:4:26:Infinity":10,"s:26:18:26:Infinity":11,"s:27:4:27:Infinity":12,"s:28:4:28:Infinity":13,"s:31:2:62:Infinity":14,"f:32:38:32:39":4,"b:32:52:32:75:undefined:undefined:undefined:undefined":2,"s:32:52:32:75":15,"s:32:65:32:75":16,"f:46:24:46:25":5,"s:46:31:46:Infinity":17}}} +,"/Users/luca/Workspace/laputa-app/src/components/DiffView.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/DiffView.tsx","statementMap":{"0":{"start":{"line":8,"column":2},"end":{"line":14,"column":null}},"1":{"start":{"line":9,"column":4},"end":{"line":12,"column":null}},"2":{"start":{"line":16,"column":16},"end":{"line":16,"column":null}},"3":{"start":{"line":18,"column":2},"end":{"line":43,"column":null}},"4":{"start":{"line":21,"column":24},"end":{"line":21,"column":null}},"5":{"start":{"line":22,"column":8},"end":{"line":30,"column":null}},"6":{"start":{"line":23,"column":10},"end":{"line":23,"column":null}},"7":{"start":{"line":24,"column":8},"end":{"line":30,"column":null}},"8":{"start":{"line":25,"column":10},"end":{"line":25,"column":null}},"9":{"start":{"line":26,"column":8},"end":{"line":30,"column":null}},"10":{"start":{"line":27,"column":10},"end":{"line":27,"column":null}},"11":{"start":{"line":28,"column":8},"end":{"line":30,"column":null}},"12":{"start":{"line":29,"column":10},"end":{"line":29,"column":null}},"13":{"start":{"line":32,"column":8},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"DiffView","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":25}},"loc":{"start":{"line":7,"column":50},"end":{"line":45,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":17},"end":{"line":20,"column":18}},"loc":{"start":{"line":20,"column":30},"end":{"line":42,"column":7}},"line":20}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":14,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":14,"column":null}},{"start":{},"end":{}}],"line":8},"1":{"loc":{"start":{"line":22,"column":8},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":8},"end":{"line":30,"column":null}},{"start":{"line":24,"column":8},"end":{"line":30,"column":null}}],"line":22},"2":{"loc":{"start":{"line":22,"column":12},"end":{"line":22,"column":61}},"type":"binary-expr","locations":[{"start":{"line":22,"column":12},"end":{"line":22,"column":36}},{"start":{"line":22,"column":36},"end":{"line":22,"column":61}}],"line":22},"3":{"loc":{"start":{"line":24,"column":8},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":8},"end":{"line":30,"column":null}},{"start":{"line":26,"column":8},"end":{"line":30,"column":null}}],"line":24},"4":{"loc":{"start":{"line":24,"column":19},"end":{"line":24,"column":68}},"type":"binary-expr","locations":[{"start":{"line":24,"column":19},"end":{"line":24,"column":43}},{"start":{"line":24,"column":43},"end":{"line":24,"column":68}}],"line":24},"5":{"loc":{"start":{"line":26,"column":8},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":8},"end":{"line":30,"column":null}},{"start":{"line":28,"column":8},"end":{"line":30,"column":null}}],"line":26},"6":{"loc":{"start":{"line":28,"column":8},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":8},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":28},"7":{"loc":{"start":{"line":28,"column":19},"end":{"line":28,"column":155}},"type":"binary-expr","locations":[{"start":{"line":28,"column":19},"end":{"line":28,"column":46}},{"start":{"line":28,"column":46},"end":{"line":28,"column":74}},{"start":{"line":28,"column":74},"end":{"line":28,"column":100}},{"start":{"line":28,"column":100},"end":{"line":28,"column":126}},{"start":{"line":28,"column":126},"end":{"line":28,"column":155}}],"line":28},"8":{"loc":{"start":{"line":38,"column":15},"end":{"line":38,"column":null}},"type":"binary-expr","locations":[{"start":{"line":38,"column":15},"end":{"line":38,"column":23}},{"start":{"line":38,"column":23},"end":{"line":38,"column":null}}],"line":38}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0,0,0,0],"8":[0,0]},"meta":{"lastBranch":9,"lastFunction":2,"lastStatement":14,"seen":{"f:7:16:7:25":0,"b:8:2:14:Infinity:undefined:undefined:undefined:undefined":0,"s:8:2:14:Infinity":0,"s:9:4:12:Infinity":1,"s:16:16:16:Infinity":2,"s:18:2:43:Infinity":3,"f:20:17:20:18":1,"s:21:24:21:Infinity":4,"b:22:8:30:Infinity:24:8:30:Infinity":1,"s:22:8:30:Infinity":5,"b:22:12:22:36:22:36:22:61":2,"s:23:10:23:Infinity":6,"b:24:8:30:Infinity:26:8:30:Infinity":3,"s:24:8:30:Infinity":7,"b:24:19:24:43:24:43:24:68":4,"s:25:10:25:Infinity":8,"b:26:8:30:Infinity:28:8:30:Infinity":5,"s:26:8:30:Infinity":9,"s:27:10:27:Infinity":10,"b:28:8:30:Infinity:undefined:undefined:undefined:undefined":6,"s:28:8:30:Infinity":11,"b:28:19:28:46:28:46:28:74:28:74:28:100:28:100:28:126:28:126:28:155":7,"s:29:10:29:Infinity":12,"s:32:8:40:Infinity":13,"b:38:15:38:23:38:23:38:Infinity":8}}} +,"/Users/luca/Workspace/laputa-app/src/components/DynamicPropertiesPanel.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/DynamicPropertiesPanel.tsx","statementMap":{"0":{"start":{"line":9,"column":69},"end":{"line":20,"column":null}},"1":{"start":{"line":22,"column":29},"end":{"line":22,"column":null}},"2":{"start":{"line":25,"column":33},"end":{"line":28,"column":null}},"3":{"start":{"line":31,"column":18},"end":{"line":31,"column":null}},"4":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"5":{"start":{"line":34,"column":33},"end":{"line":34,"column":null}},"6":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"7":{"start":{"line":35,"column":28},"end":{"line":35,"column":null}},"8":{"start":{"line":35,"column":51},"end":{"line":35,"column":98}},"9":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"10":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"11":{"start":{"line":40,"column":16},"end":{"line":40,"column":null}},"12":{"start":{"line":41,"column":19},"end":{"line":41,"column":null}},"13":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"14":{"start":{"line":42,"column":59},"end":{"line":42,"column":71}},"15":{"start":{"line":43,"column":2},"end":{"line":43,"column":null}},"16":{"start":{"line":47,"column":2},"end":{"line":47,"column":null}},"17":{"start":{"line":47,"column":18},"end":{"line":47,"column":null}},"18":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"19":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"20":{"start":{"line":69,"column":34},"end":{"line":69,"column":null}},"21":{"start":{"line":70,"column":40},"end":{"line":70,"column":null}},"22":{"start":{"line":71,"column":26},"end":{"line":71,"column":null}},"23":{"start":{"line":72,"column":30},"end":{"line":72,"column":null}},"24":{"start":{"line":74,"column":20},"end":{"line":74,"column":null}},"25":{"start":{"line":76,"column":8},"end":{"line":84,"column":null}},"26":{"start":{"line":77,"column":4},"end":{"line":83,"column":null}},"27":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"28":{"start":{"line":79,"column":32},"end":{"line":79,"column":null}},"29":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"30":{"start":{"line":80,"column":40},"end":{"line":80,"column":null}},"31":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"32":{"start":{"line":81,"column":38},"end":{"line":81,"column":null}},"33":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"34":{"start":{"line":86,"column":8},"end":{"line":94,"column":null}},"35":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"36":{"start":{"line":88,"column":4},"end":{"line":93,"column":null}},"37":{"start":{"line":89,"column":6},"end":{"line":92,"column":null}},"38":{"start":{"line":89,"column":45},"end":{"line":89,"column":null}},"39":{"start":{"line":89,"column":71},"end":{"line":92,"column":null}},"40":{"start":{"line":90,"column":51},"end":{"line":90,"column":null}},"41":{"start":{"line":90,"column":78},"end":{"line":92,"column":null}},"42":{"start":{"line":91,"column":67},"end":{"line":91,"column":null}},"43":{"start":{"line":92,"column":11},"end":{"line":92,"column":null}},"44":{"start":{"line":96,"column":8},"end":{"line":102,"column":null}},"45":{"start":{"line":97,"column":4},"end":{"line":101,"column":null}},"46":{"start":{"line":98,"column":6},"end":{"line":100,"column":null}},"47":{"start":{"line":98,"column":33},"end":{"line":98,"column":null}},"48":{"start":{"line":98,"column":55},"end":{"line":100,"column":null}},"49":{"start":{"line":99,"column":38},"end":{"line":99,"column":null}},"50":{"start":{"line":100,"column":11},"end":{"line":100,"column":null}},"51":{"start":{"line":104,"column":8},"end":{"line":116,"column":null}},"52":{"start":{"line":105,"column":4},"end":{"line":115,"column":null}},"53":{"start":{"line":106,"column":6},"end":{"line":111,"column":null}},"54":{"start":{"line":107,"column":22},"end":{"line":107,"column":null}},"55":{"start":{"line":107,"column":51},"end":{"line":107,"column":59}},"56":{"start":{"line":107,"column":73},"end":{"line":107,"column":74}},"57":{"start":{"line":108,"column":8},"end":{"line":108,"column":null}},"58":{"start":{"line":110,"column":8},"end":{"line":110,"column":null}},"59":{"start":{"line":112,"column":6},"end":{"line":112,"column":null}},"60":{"start":{"line":113,"column":6},"end":{"line":113,"column":null}},"61":{"start":{"line":114,"column":6},"end":{"line":114,"column":null}},"62":{"start":{"line":118,"column":27},"end":{"line":125,"column":null}},"63":{"start":{"line":119,"column":4},"end":{"line":124,"column":null}},"64":{"start":{"line":119,"column":27},"end":{"line":119,"column":null}},"65":{"start":{"line":119,"column":45},"end":{"line":124,"column":null}},"66":{"start":{"line":121,"column":6},"end":{"line":121,"column":null}},"67":{"start":{"line":122,"column":6},"end":{"line":122,"column":null}},"68":{"start":{"line":123,"column":6},"end":{"line":123,"column":null}},"69":{"start":{"line":127,"column":30},"end":{"line":201,"column":null}},"70":{"start":{"line":128,"column":4},"end":{"line":137,"column":null}},"71":{"start":{"line":129,"column":6},"end":{"line":135,"column":null}},"72":{"start":{"line":132,"column":29},"end":{"line":132,"column":null}},"73":{"start":{"line":133,"column":25},"end":{"line":133,"column":null}},"74":{"start":{"line":134,"column":26},"end":{"line":134,"column":null}},"75":{"start":{"line":139,"column":4},"end":{"line":165,"column":null}},"76":{"start":{"line":140,"column":24},"end":{"line":140,"column":null}},"77":{"start":{"line":141,"column":20},"end":{"line":141,"column":null}},"78":{"start":{"line":142,"column":6},"end":{"line":155,"column":null}},"79":{"start":{"line":143,"column":8},"end":{"line":153,"column":null}},"80":{"start":{"line":148,"column":14},"end":{"line":148,"column":null}},"81":{"start":{"line":148,"column":37},"end":{"line":148,"column":null}},"82":{"start":{"line":149,"column":14},"end":{"line":149,"column":null}},"83":{"start":{"line":149,"column":38},"end":{"line":149,"column":null}},"84":{"start":{"line":151,"column":27},"end":{"line":151,"column":null}},"85":{"start":{"line":156,"column":6},"end":{"line":163,"column":null}},"86":{"start":{"line":160,"column":25},"end":{"line":160,"column":45}},"87":{"start":{"line":167,"column":4},"end":{"line":169,"column":null}},"88":{"start":{"line":168,"column":6},"end":{"line":168,"column":null}},"89":{"start":{"line":168,"column":71},"end":{"line":168,"column":99}},"90":{"start":{"line":171,"column":4},"end":{"line":180,"column":null}},"91":{"start":{"line":172,"column":6},"end":{"line":178,"column":null}},"92":{"start":{"line":175,"column":29},"end":{"line":175,"column":null}},"93":{"start":{"line":176,"column":25},"end":{"line":176,"column":null}},"94":{"start":{"line":177,"column":26},"end":{"line":177,"column":null}},"95":{"start":{"line":182,"column":4},"end":{"line":191,"column":null}},"96":{"start":{"line":183,"column":6},"end":{"line":189,"column":null}},"97":{"start":{"line":186,"column":25},"end":{"line":186,"column":null}},"98":{"start":{"line":193,"column":4},"end":{"line":199,"column":null}},"99":{"start":{"line":196,"column":27},"end":{"line":196,"column":null}},"100":{"start":{"line":197,"column":23},"end":{"line":197,"column":null}},"101":{"start":{"line":198,"column":24},"end":{"line":198,"column":null}},"102":{"start":{"line":203,"column":2},"end":{"line":284,"column":null}},"103":{"start":{"line":220,"column":31},"end":{"line":220,"column":null}},"104":{"start":{"line":232,"column":10},"end":{"line":245,"column":null}},"105":{"start":{"line":238,"column":33},"end":{"line":238,"column":56}},"106":{"start":{"line":263,"column":29},"end":{"line":263,"column":56}},"107":{"start":{"line":268,"column":29},"end":{"line":268,"column":58}},"108":{"start":{"line":272,"column":65},"end":{"line":272,"column":90}},"109":{"start":{"line":272,"column":90},"end":{"line":272,"column":105}},"110":{"start":{"line":272,"column":105},"end":{"line":272,"column":121}},"111":{"start":{"line":279,"column":25},"end":{"line":279,"column":49}}},"fnMap":{"0":{"name":"containsWikilinks","decl":{"start":{"line":33,"column":16},"end":{"line":33,"column":34}},"loc":{"start":{"line":33,"column":68},"end":{"line":37,"column":null}},"line":33},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":46},"end":{"line":35,"column":51}},"loc":{"start":{"line":35,"column":51},"end":{"line":35,"column":98}},"line":35},"2":{"name":"countWords","decl":{"start":{"line":39,"column":9},"end":{"line":39,"column":20}},"loc":{"start":{"line":39,"column":52},"end":{"line":44,"column":null}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":42,"column":52},"end":{"line":42,"column":53}},"loc":{"start":{"line":42,"column":59},"end":{"line":42,"column":71}},"line":42},"4":{"name":"formatDate","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":20}},"loc":{"start":{"line":46,"column":54},"end":{"line":50,"column":null}},"line":46},"5":{"name":"DynamicPropertiesPanel","decl":{"start":{"line":52,"column":16},"end":{"line":52,"column":39}},"loc":{"start":{"line":68,"column":3},"end":{"line":286,"column":null}},"line":68},"6":{"name":"(anonymous_6)","decl":{"start":{"line":76,"column":34},"end":{"line":76,"column":40}},"loc":{"start":{"line":76,"column":40},"end":{"line":84,"column":5}},"line":76},"7":{"name":"(anonymous_7)","decl":{"start":{"line":78,"column":14},"end":{"line":78,"column":15}},"loc":{"start":{"line":78,"column":32},"end":{"line":83,"column":7}},"line":78},"8":{"name":"(anonymous_8)","decl":{"start":{"line":86,"column":38},"end":{"line":86,"column":39}},"loc":{"start":{"line":86,"column":73},"end":{"line":94,"column":5}},"line":86},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":37},"end":{"line":96,"column":38}},"loc":{"start":{"line":96,"column":74},"end":{"line":102,"column":5}},"line":96},"10":{"name":"(anonymous_10)","decl":{"start":{"line":104,"column":40},"end":{"line":104,"column":46}},"loc":{"start":{"line":104,"column":46},"end":{"line":116,"column":5}},"line":104},"11":{"name":"(anonymous_11)","decl":{"start":{"line":107,"column":46},"end":{"line":107,"column":51}},"loc":{"start":{"line":107,"column":51},"end":{"line":107,"column":59}},"line":107},"12":{"name":"(anonymous_12)","decl":{"start":{"line":107,"column":68},"end":{"line":107,"column":73}},"loc":{"start":{"line":107,"column":73},"end":{"line":107,"column":74}},"line":107},"13":{"name":"(anonymous_13)","decl":{"start":{"line":118,"column":27},"end":{"line":118,"column":28}},"loc":{"start":{"line":118,"column":55},"end":{"line":125,"column":null}},"line":118},"14":{"name":"(anonymous_14)","decl":{"start":{"line":127,"column":30},"end":{"line":127,"column":31}},"loc":{"start":{"line":127,"column":72},"end":{"line":201,"column":null}},"line":127},"15":{"name":"(anonymous_15)","decl":{"start":{"line":132,"column":23},"end":{"line":132,"column":29}},"loc":{"start":{"line":132,"column":29},"end":{"line":132,"column":null}},"line":132},"16":{"name":"(anonymous_16)","decl":{"start":{"line":133,"column":18},"end":{"line":133,"column":19}},"loc":{"start":{"line":133,"column":25},"end":{"line":133,"column":null}},"line":133},"17":{"name":"(anonymous_17)","decl":{"start":{"line":134,"column":20},"end":{"line":134,"column":26}},"loc":{"start":{"line":134,"column":26},"end":{"line":134,"column":null}},"line":134},"18":{"name":"(anonymous_18)","decl":{"start":{"line":147,"column":23},"end":{"line":147,"column":24}},"loc":{"start":{"line":147,"column":30},"end":{"line":150,"column":null}},"line":147},"19":{"name":"(anonymous_19)","decl":{"start":{"line":151,"column":20},"end":{"line":151,"column":21}},"loc":{"start":{"line":151,"column":27},"end":{"line":151,"column":null}},"line":151},"20":{"name":"(anonymous_20)","decl":{"start":{"line":160,"column":19},"end":{"line":160,"column":25}},"loc":{"start":{"line":160,"column":25},"end":{"line":160,"column":45}},"line":160},"21":{"name":"(anonymous_21)","decl":{"start":{"line":168,"column":60},"end":{"line":168,"column":61}},"loc":{"start":{"line":168,"column":71},"end":{"line":168,"column":99}},"line":168},"22":{"name":"(anonymous_22)","decl":{"start":{"line":175,"column":23},"end":{"line":175,"column":29}},"loc":{"start":{"line":175,"column":29},"end":{"line":175,"column":null}},"line":175},"23":{"name":"(anonymous_23)","decl":{"start":{"line":176,"column":18},"end":{"line":176,"column":19}},"loc":{"start":{"line":176,"column":25},"end":{"line":176,"column":null}},"line":176},"24":{"name":"(anonymous_24)","decl":{"start":{"line":177,"column":20},"end":{"line":177,"column":26}},"loc":{"start":{"line":177,"column":26},"end":{"line":177,"column":null}},"line":177},"25":{"name":"(anonymous_25)","decl":{"start":{"line":186,"column":19},"end":{"line":186,"column":25}},"loc":{"start":{"line":186,"column":25},"end":{"line":186,"column":null}},"line":186},"26":{"name":"(anonymous_26)","decl":{"start":{"line":196,"column":21},"end":{"line":196,"column":27}},"loc":{"start":{"line":196,"column":27},"end":{"line":196,"column":null}},"line":196},"27":{"name":"(anonymous_27)","decl":{"start":{"line":197,"column":16},"end":{"line":197,"column":17}},"loc":{"start":{"line":197,"column":23},"end":{"line":197,"column":null}},"line":197},"28":{"name":"(anonymous_28)","decl":{"start":{"line":198,"column":18},"end":{"line":198,"column":24}},"loc":{"start":{"line":198,"column":24},"end":{"line":198,"column":null}},"line":198},"29":{"name":"(anonymous_29)","decl":{"start":{"line":220,"column":25},"end":{"line":220,"column":31}},"loc":{"start":{"line":220,"column":31},"end":{"line":220,"column":null}},"line":220},"30":{"name":"(anonymous_30)","decl":{"start":{"line":231,"column":29},"end":{"line":231,"column":30}},"loc":{"start":{"line":232,"column":10},"end":{"line":245,"column":null}},"line":232},"31":{"name":"(anonymous_31)","decl":{"start":{"line":238,"column":27},"end":{"line":238,"column":33}},"loc":{"start":{"line":238,"column":33},"end":{"line":238,"column":56}},"line":238},"32":{"name":"(anonymous_32)","decl":{"start":{"line":263,"column":22},"end":{"line":263,"column":23}},"loc":{"start":{"line":263,"column":29},"end":{"line":263,"column":56}},"line":263},"33":{"name":"(anonymous_33)","decl":{"start":{"line":268,"column":22},"end":{"line":268,"column":23}},"loc":{"start":{"line":268,"column":29},"end":{"line":268,"column":58}},"line":268},"34":{"name":"(anonymous_34)","decl":{"start":{"line":272,"column":57},"end":{"line":272,"column":63}},"loc":{"start":{"line":272,"column":63},"end":{"line":272,"column":124}},"line":272},"35":{"name":"(anonymous_35)","decl":{"start":{"line":279,"column":19},"end":{"line":279,"column":25}},"loc":{"start":{"line":279,"column":25},"end":{"line":279,"column":49}},"line":279}},"branchMap":{"0":{"loc":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},{"start":{},"end":{}}],"line":34},"1":{"loc":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},{"start":{},"end":{}}],"line":35},"2":{"loc":{"start":{"line":35,"column":51},"end":{"line":35,"column":98}},"type":"binary-expr","locations":[{"start":{"line":35,"column":51},"end":{"line":35,"column":76}},{"start":{"line":35,"column":76},"end":{"line":35,"column":98}}],"line":35},"3":{"loc":{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":40,"column":null}},{"start":{},"end":{}}],"line":40},"4":{"loc":{"start":{"line":47,"column":2},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":47,"column":null}},{"start":{},"end":{}}],"line":47},"5":{"loc":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},{"start":{},"end":{}}],"line":79},"6":{"loc":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},{"start":{},"end":{}}],"line":80},"7":{"loc":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},{"start":{},"end":{}}],"line":81},"8":{"loc":{"start":{"line":88,"column":4},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":93,"column":null}},{"start":{},"end":{}}],"line":88},"9":{"loc":{"start":{"line":89,"column":6},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":6},"end":{"line":92,"column":null}},{"start":{"line":89,"column":71},"end":{"line":92,"column":null}}],"line":89},"10":{"loc":{"start":{"line":89,"column":71},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":89,"column":71},"end":{"line":92,"column":null}},{"start":{"line":90,"column":78},"end":{"line":92,"column":null}}],"line":89},"11":{"loc":{"start":{"line":90,"column":78},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":78},"end":{"line":92,"column":null}},{"start":{"line":92,"column":11},"end":{"line":92,"column":null}}],"line":90},"12":{"loc":{"start":{"line":91,"column":15},"end":{"line":91,"column":67}},"type":"binary-expr","locations":[{"start":{"line":91,"column":15},"end":{"line":91,"column":43}},{"start":{"line":91,"column":43},"end":{"line":91,"column":67}}],"line":91},"13":{"loc":{"start":{"line":97,"column":4},"end":{"line":101,"column":null}},"type":"if","locations":[{"start":{"line":97,"column":4},"end":{"line":101,"column":null}},{"start":{},"end":{}}],"line":97},"14":{"loc":{"start":{"line":98,"column":6},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":98,"column":6},"end":{"line":100,"column":null}},{"start":{"line":98,"column":55},"end":{"line":100,"column":null}}],"line":98},"15":{"loc":{"start":{"line":98,"column":55},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":98,"column":55},"end":{"line":100,"column":null}},{"start":{"line":100,"column":11},"end":{"line":100,"column":null}}],"line":98},"16":{"loc":{"start":{"line":105,"column":4},"end":{"line":115,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":4},"end":{"line":115,"column":null}},{"start":{},"end":{}}],"line":105},"17":{"loc":{"start":{"line":105,"column":8},"end":{"line":105,"column":40}},"type":"binary-expr","locations":[{"start":{"line":105,"column":8},"end":{"line":105,"column":25}},{"start":{"line":105,"column":25},"end":{"line":105,"column":40}}],"line":105},"18":{"loc":{"start":{"line":106,"column":6},"end":{"line":111,"column":null}},"type":"if","locations":[{"start":{"line":106,"column":6},"end":{"line":111,"column":null}},{"start":{"line":109,"column":13},"end":{"line":111,"column":null}}],"line":106},"19":{"loc":{"start":{"line":108,"column":37},"end":{"line":108,"column":74}},"type":"cond-expr","locations":[{"start":{"line":108,"column":58},"end":{"line":108,"column":69}},{"start":{"line":108,"column":69},"end":{"line":108,"column":74}}],"line":108},"20":{"loc":{"start":{"line":110,"column":37},"end":{"line":110,"column":58}},"type":"binary-expr","locations":[{"start":{"line":110,"column":37},"end":{"line":110,"column":56}},{"start":{"line":110,"column":56},"end":{"line":110,"column":58}}],"line":110},"21":{"loc":{"start":{"line":119,"column":4},"end":{"line":124,"column":null}},"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":124,"column":null}},{"start":{"line":119,"column":45},"end":{"line":124,"column":null}}],"line":119},"22":{"loc":{"start":{"line":119,"column":45},"end":{"line":124,"column":null}},"type":"if","locations":[{"start":{"line":119,"column":45},"end":{"line":124,"column":null}},{"start":{},"end":{}}],"line":119},"23":{"loc":{"start":{"line":128,"column":4},"end":{"line":137,"column":null}},"type":"if","locations":[{"start":{"line":128,"column":4},"end":{"line":137,"column":null}},{"start":{},"end":{}}],"line":128},"24":{"loc":{"start":{"line":128,"column":8},"end":{"line":128,"column":47}},"type":"binary-expr","locations":[{"start":{"line":128,"column":8},"end":{"line":128,"column":26}},{"start":{"line":128,"column":26},"end":{"line":128,"column":47}}],"line":128},"25":{"loc":{"start":{"line":139,"column":4},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":4},"end":{"line":165,"column":null}},{"start":{},"end":{}}],"line":139},"26":{"loc":{"start":{"line":139,"column":8},"end":{"line":139,"column":52}},"type":"binary-expr","locations":[{"start":{"line":139,"column":8},"end":{"line":139,"column":28}},{"start":{"line":139,"column":28},"end":{"line":139,"column":52}}],"line":139},"27":{"loc":{"start":{"line":141,"column":20},"end":{"line":141,"column":null}},"type":"binary-expr","locations":[{"start":{"line":141,"column":20},"end":{"line":141,"column":48}},{"start":{"line":141,"column":48},"end":{"line":141,"column":null}}],"line":141},"28":{"loc":{"start":{"line":142,"column":6},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":142,"column":6},"end":{"line":155,"column":null}},{"start":{},"end":{}}],"line":142},"29":{"loc":{"start":{"line":148,"column":14},"end":{"line":148,"column":null}},"type":"if","locations":[{"start":{"line":148,"column":14},"end":{"line":148,"column":null}},{"start":{},"end":{}}],"line":148},"30":{"loc":{"start":{"line":149,"column":14},"end":{"line":149,"column":null}},"type":"if","locations":[{"start":{"line":149,"column":14},"end":{"line":149,"column":null}},{"start":{},"end":{}}],"line":149},"31":{"loc":{"start":{"line":167,"column":4},"end":{"line":169,"column":null}},"type":"if","locations":[{"start":{"line":167,"column":4},"end":{"line":169,"column":null}},{"start":{},"end":{}}],"line":167},"32":{"loc":{"start":{"line":171,"column":4},"end":{"line":180,"column":null}},"type":"if","locations":[{"start":{"line":171,"column":4},"end":{"line":180,"column":null}},{"start":{},"end":{}}],"line":171},"33":{"loc":{"start":{"line":171,"column":8},"end":{"line":171,"column":109}},"type":"binary-expr","locations":[{"start":{"line":171,"column":8},"end":{"line":171,"column":35}},{"start":{"line":171,"column":35},"end":{"line":171,"column":63}},{"start":{"line":171,"column":63},"end":{"line":171,"column":87}},{"start":{"line":171,"column":87},"end":{"line":171,"column":109}}],"line":171},"34":{"loc":{"start":{"line":182,"column":4},"end":{"line":191,"column":null}},"type":"if","locations":[{"start":{"line":182,"column":4},"end":{"line":191,"column":null}},{"start":{},"end":{}}],"line":182},"35":{"loc":{"start":{"line":188,"column":11},"end":{"line":188,"column":null}},"type":"cond-expr","locations":[{"start":{"line":188,"column":19},"end":{"line":188,"column":34}},{"start":{"line":188,"column":34},"end":{"line":188,"column":null}}],"line":188},"36":{"loc":{"start":{"line":206,"column":9},"end":{"line":228,"column":null}},"type":"binary-expr","locations":[{"start":{"line":206,"column":9},"end":{"line":206,"column":null}},{"start":{"line":207,"column":10},"end":{"line":228,"column":null}}],"line":206},"37":{"loc":{"start":{"line":209,"column":13},"end":{"line":226,"column":null}},"type":"cond-expr","locations":[{"start":{"line":210,"column":14},"end":{"line":224,"column":null}},{"start":{"line":226,"column":14},"end":{"line":226,"column":null}}],"line":209},"38":{"loc":{"start":{"line":235,"column":15},"end":{"line":241,"column":null}},"type":"binary-expr","locations":[{"start":{"line":235,"column":15},"end":{"line":235,"column":null}},{"start":{"line":236,"column":16},"end":{"line":241,"column":null}}],"line":235},"39":{"loc":{"start":{"line":258,"column":7},"end":{"line":282,"column":null}},"type":"cond-expr","locations":[{"start":{"line":259,"column":8},"end":{"line":274,"column":null}},{"start":{"line":276,"column":8},"end":{"line":282,"column":null}}],"line":258}},"s":{"0":3,"1":3,"2":3,"3":3,"4":152,"5":124,"6":28,"7":28,"8":84,"9":0,"10":16,"11":0,"12":16,"13":16,"14":208,"15":16,"16":16,"17":0,"18":16,"19":16,"20":16,"21":16,"22":16,"23":16,"24":16,"25":16,"26":16,"27":118,"28":0,"29":118,"30":42,"31":76,"32":0,"33":76,"34":16,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":16,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":16,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":16,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":16,"70":76,"71":0,"72":0,"73":0,"74":0,"75":76,"76":16,"77":16,"78":16,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":16,"86":0,"87":60,"88":14,"89":0,"90":46,"91":0,"92":0,"93":0,"94":0,"95":46,"96":0,"97":0,"98":46,"99":0,"100":0,"101":0,"102":16,"103":0,"104":76,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0},"f":{"0":152,"1":84,"2":16,"3":208,"4":16,"5":16,"6":16,"7":118,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":76,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":76,"31":0,"32":0,"33":0,"34":0,"35":0},"b":{"0":[124,28],"1":[28,0],"2":[84,84],"3":[0,16],"4":[0,16],"5":[0,118],"6":[42,76],"7":[0,76],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,76],"24":[76,76],"25":[16,60],"26":[76,60],"27":[16,0],"28":[0,16],"29":[0,0],"30":[0,0],"31":[14,46],"32":[0,46],"33":[46,46,46,46],"34":[0,46],"35":[0,0],"36":[16,16],"37":[16,0],"38":[76,0],"39":[0,16]},"meta":{"lastBranch":40,"lastFunction":36,"lastStatement":112,"seen":{"s:9:69:20:Infinity":0,"s:22:29:22:Infinity":1,"s:25:33:28:Infinity":2,"s:31:18:31:Infinity":3,"f:33:16:33:34":0,"b:34:2:34:Infinity:undefined:undefined:undefined:undefined":0,"s:34:2:34:Infinity":4,"s:34:33:34:Infinity":5,"b:35:2:35:Infinity:undefined:undefined:undefined:undefined":1,"s:35:2:35:Infinity":6,"s:35:28:35:Infinity":7,"f:35:46:35:51":1,"s:35:51:35:98":8,"b:35:51:35:76:35:76:35:98":2,"s:36:2:36:Infinity":9,"f:39:9:39:20":2,"b:40:2:40:Infinity:undefined:undefined:undefined:undefined":3,"s:40:2:40:Infinity":10,"s:40:16:40:Infinity":11,"s:41:19:41:Infinity":12,"s:42:16:42:Infinity":13,"f:42:52:42:53":3,"s:42:59:42:71":14,"s:43:2:43:Infinity":15,"f:46:9:46:20":4,"b:47:2:47:Infinity:undefined:undefined:undefined:undefined":4,"s:47:2:47:Infinity":16,"s:47:18:47:Infinity":17,"s:48:12:48:Infinity":18,"s:49:2:49:Infinity":19,"f:52:16:52:39":5,"s:69:34:69:Infinity":20,"s:70:40:70:Infinity":21,"s:71:26:71:Infinity":22,"s:72:30:72:Infinity":23,"s:74:20:74:Infinity":24,"s:76:8:84:Infinity":25,"f:76:34:76:40":6,"s:77:4:83:Infinity":26,"f:78:14:78:15":7,"b:79:8:79:Infinity:undefined:undefined:undefined:undefined":5,"s:79:8:79:Infinity":27,"s:79:32:79:Infinity":28,"b:80:8:80:Infinity:undefined:undefined:undefined:undefined":6,"s:80:8:80:Infinity":29,"s:80:40:80:Infinity":30,"b:81:8:81:Infinity:undefined:undefined:undefined:undefined":7,"s:81:8:81:Infinity":31,"s:81:38:81:Infinity":32,"s:82:8:82:Infinity":33,"s:86:8:94:Infinity":34,"f:86:38:86:39":8,"s:87:4:87:Infinity":35,"b:88:4:93:Infinity:undefined:undefined:undefined:undefined":8,"s:88:4:93:Infinity":36,"b:89:6:92:Infinity:89:71:92:Infinity":9,"s:89:6:92:Infinity":37,"s:89:45:89:Infinity":38,"b:89:71:92:Infinity:90:78:92:Infinity":10,"s:89:71:92:Infinity":39,"s:90:51:90:Infinity":40,"b:90:78:92:Infinity:92:11:92:Infinity":11,"s:90:78:92:Infinity":41,"b:91:15:91:43:91:43:91:67":12,"s:91:67:91:Infinity":42,"s:92:11:92:Infinity":43,"s:96:8:102:Infinity":44,"f:96:37:96:38":9,"b:97:4:101:Infinity:undefined:undefined:undefined:undefined":13,"s:97:4:101:Infinity":45,"b:98:6:100:Infinity:98:55:100:Infinity":14,"s:98:6:100:Infinity":46,"s:98:33:98:Infinity":47,"b:98:55:100:Infinity:100:11:100:Infinity":15,"s:98:55:100:Infinity":48,"s:99:38:99:Infinity":49,"s:100:11:100:Infinity":50,"s:104:8:116:Infinity":51,"f:104:40:104:46":10,"b:105:4:115:Infinity:undefined:undefined:undefined:undefined":16,"s:105:4:115:Infinity":52,"b:105:8:105:25:105:25:105:40":17,"b:106:6:111:Infinity:109:13:111:Infinity":18,"s:106:6:111:Infinity":53,"s:107:22:107:Infinity":54,"f:107:46:107:51":11,"s:107:51:107:59":55,"f:107:68:107:73":12,"s:107:73:107:74":56,"s:108:8:108:Infinity":57,"b:108:58:108:69:108:69:108:74":19,"s:110:8:110:Infinity":58,"b:110:37:110:56:110:56:110:58":20,"s:112:6:112:Infinity":59,"s:113:6:113:Infinity":60,"s:114:6:114:Infinity":61,"s:118:27:125:Infinity":62,"f:118:27:118:28":13,"b:119:4:124:Infinity:119:45:124:Infinity":21,"s:119:4:124:Infinity":63,"s:119:27:119:Infinity":64,"b:119:45:124:Infinity:undefined:undefined:undefined:undefined":22,"s:119:45:124:Infinity":65,"s:121:6:121:Infinity":66,"s:122:6:122:Infinity":67,"s:123:6:123:Infinity":68,"s:127:30:201:Infinity":69,"f:127:30:127:31":14,"b:128:4:137:Infinity:undefined:undefined:undefined:undefined":23,"s:128:4:137:Infinity":70,"b:128:8:128:26:128:26:128:47":24,"s:129:6:135:Infinity":71,"f:132:23:132:29":15,"s:132:29:132:Infinity":72,"f:133:18:133:19":16,"s:133:25:133:Infinity":73,"f:134:20:134:26":17,"s:134:26:134:Infinity":74,"b:139:4:165:Infinity:undefined:undefined:undefined:undefined":25,"s:139:4:165:Infinity":75,"b:139:8:139:28:139:28:139:52":26,"s:140:24:140:Infinity":76,"s:141:20:141:Infinity":77,"b:141:20:141:48:141:48:141:Infinity":27,"b:142:6:155:Infinity:undefined:undefined:undefined:undefined":28,"s:142:6:155:Infinity":78,"s:143:8:153:Infinity":79,"f:147:23:147:24":18,"b:148:14:148:Infinity:undefined:undefined:undefined:undefined":29,"s:148:14:148:Infinity":80,"s:148:37:148:Infinity":81,"b:149:14:149:Infinity:undefined:undefined:undefined:undefined":30,"s:149:14:149:Infinity":82,"s:149:38:149:Infinity":83,"f:151:20:151:21":19,"s:151:27:151:Infinity":84,"s:156:6:163:Infinity":85,"f:160:19:160:25":20,"s:160:25:160:45":86,"b:167:4:169:Infinity:undefined:undefined:undefined:undefined":31,"s:167:4:169:Infinity":87,"s:168:6:168:Infinity":88,"f:168:60:168:61":21,"s:168:71:168:99":89,"b:171:4:180:Infinity:undefined:undefined:undefined:undefined":32,"s:171:4:180:Infinity":90,"b:171:8:171:35:171:35:171:63:171:63:171:87:171:87:171:109":33,"s:172:6:178:Infinity":91,"f:175:23:175:29":22,"s:175:29:175:Infinity":92,"f:176:18:176:19":23,"s:176:25:176:Infinity":93,"f:177:20:177:26":24,"s:177:26:177:Infinity":94,"b:182:4:191:Infinity:undefined:undefined:undefined:undefined":34,"s:182:4:191:Infinity":95,"s:183:6:189:Infinity":96,"f:186:19:186:25":25,"s:186:25:186:Infinity":97,"b:188:19:188:34:188:34:188:Infinity":35,"s:193:4:199:Infinity":98,"f:196:21:196:27":26,"s:196:27:196:Infinity":99,"f:197:16:197:17":27,"s:197:23:197:Infinity":100,"f:198:18:198:24":28,"s:198:24:198:Infinity":101,"s:203:2:284:Infinity":102,"b:206:9:206:Infinity:207:10:228:Infinity":36,"b:210:14:224:Infinity:226:14:226:Infinity":37,"f:220:25:220:31":29,"s:220:31:220:Infinity":103,"f:231:29:231:30":30,"s:232:10:245:Infinity":104,"b:235:15:235:Infinity:236:16:241:Infinity":38,"f:238:27:238:33":31,"s:238:33:238:56":105,"b:259:8:274:Infinity:276:8:282:Infinity":39,"f:263:22:263:23":32,"s:263:29:263:56":106,"f:268:22:268:23":33,"s:268:29:268:58":107,"f:272:57:272:63":34,"s:272:65:272:90":108,"s:272:90:272:105":109,"s:272:105:272:121":110,"f:279:19:279:25":35,"s:279:25:279:49":111}}} +,"/Users/luca/Workspace/laputa-app/src/components/EditableValue.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/EditableValue.tsx","statementMap":{"0":{"start":{"line":16,"column":32},"end":{"line":16,"column":null}},"1":{"start":{"line":18,"column":24},"end":{"line":25,"column":null}},"2":{"start":{"line":19,"column":4},"end":{"line":24,"column":null}},"3":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"4":{"start":{"line":21,"column":4},"end":{"line":24,"column":null}},"5":{"start":{"line":22,"column":6},"end":{"line":22,"column":null}},"6":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"7":{"start":{"line":27,"column":2},"end":{"line":39,"column":null}},"8":{"start":{"line":28,"column":4},"end":{"line":37,"column":null}},"9":{"start":{"line":33,"column":25},"end":{"line":33,"column":null}},"10":{"start":{"line":35,"column":22},"end":{"line":35,"column":null}},"11":{"start":{"line":41,"column":2},"end":{"line":48,"column":null}},"12":{"start":{"line":61,"column":38},"end":{"line":61,"column":null}},"13":{"start":{"line":62,"column":32},"end":{"line":62,"column":null}},"14":{"start":{"line":63,"column":36},"end":{"line":63,"column":null}},"15":{"start":{"line":64,"column":30},"end":{"line":64,"column":null}},"16":{"start":{"line":66,"column":26},"end":{"line":69,"column":null}},"17":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"18":{"start":{"line":68,"column":4},"end":{"line":68,"column":null}},"19":{"start":{"line":71,"column":25},"end":{"line":82,"column":null}},"20":{"start":{"line":72,"column":4},"end":{"line":81,"column":null}},"21":{"start":{"line":73,"column":23},"end":{"line":73,"column":null}},"22":{"start":{"line":74,"column":6},"end":{"line":78,"column":null}},"23":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"24":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"25":{"start":{"line":79,"column":6},"end":{"line":79,"column":null}},"26":{"start":{"line":80,"column":6},"end":{"line":80,"column":null}},"27":{"start":{"line":84,"column":27},"end":{"line":87,"column":null}},"28":{"start":{"line":85,"column":21},"end":{"line":85,"column":null}},"29":{"start":{"line":85,"column":44},"end":{"line":85,"column":55}},"30":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"31":{"start":{"line":89,"column":23},"end":{"line":95,"column":null}},"32":{"start":{"line":90,"column":4},"end":{"line":94,"column":null}},"33":{"start":{"line":91,"column":6},"end":{"line":91,"column":null}},"34":{"start":{"line":92,"column":6},"end":{"line":92,"column":null}},"35":{"start":{"line":93,"column":6},"end":{"line":93,"column":null}},"36":{"start":{"line":97,"column":24},"end":{"line":110,"column":null}},"37":{"start":{"line":98,"column":4},"end":{"line":109,"column":null}},"38":{"start":{"line":99,"column":6},"end":{"line":100,"column":null}},"39":{"start":{"line":99,"column":29},"end":{"line":99,"column":null}},"40":{"start":{"line":100,"column":11},"end":{"line":100,"column":null}},"41":{"start":{"line":101,"column":4},"end":{"line":109,"column":null}},"42":{"start":{"line":102,"column":6},"end":{"line":108,"column":null}},"43":{"start":{"line":103,"column":8},"end":{"line":103,"column":null}},"44":{"start":{"line":104,"column":8},"end":{"line":104,"column":null}},"45":{"start":{"line":106,"column":8},"end":{"line":106,"column":null}},"46":{"start":{"line":107,"column":8},"end":{"line":107,"column":null}},"47":{"start":{"line":112,"column":2},"end":{"line":179,"column":null}},"48":{"start":{"line":115,"column":8},"end":{"line":152,"column":null}},"49":{"start":{"line":122,"column":29},"end":{"line":122,"column":null}},"50":{"start":{"line":123,"column":30},"end":{"line":123,"column":null}},"51":{"start":{"line":137,"column":27},"end":{"line":137,"column":null}},"52":{"start":{"line":145,"column":16},"end":{"line":145,"column":null}},"53":{"start":{"line":146,"column":16},"end":{"line":146,"column":null}},"54":{"start":{"line":161,"column":27},"end":{"line":161,"column":null}},"55":{"start":{"line":162,"column":28},"end":{"line":162,"column":null}},"56":{"start":{"line":164,"column":12},"end":{"line":165,"column":null}},"57":{"start":{"line":164,"column":33},"end":{"line":164,"column":null}},"58":{"start":{"line":165,"column":19},"end":{"line":165,"column":42}},"59":{"start":{"line":165,"column":42},"end":{"line":165,"column":58}},"60":{"start":{"line":173,"column":25},"end":{"line":173,"column":null}}},"fnMap":{"0":{"name":"EditableValue","decl":{"start":{"line":3,"column":16},"end":{"line":3,"column":30}},"loc":{"start":{"line":15,"column":3},"end":{"line":50,"column":null}},"line":15},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":24},"end":{"line":18,"column":25}},"loc":{"start":{"line":18,"column":52},"end":{"line":25,"column":null}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":33,"column":18},"end":{"line":33,"column":19}},"loc":{"start":{"line":33,"column":25},"end":{"line":33,"column":null}},"line":33},"3":{"name":"(anonymous_3)","decl":{"start":{"line":35,"column":16},"end":{"line":35,"column":22}},"loc":{"start":{"line":35,"column":22},"end":{"line":35,"column":null}},"line":35},"4":{"name":"TagPillList","decl":{"start":{"line":52,"column":16},"end":{"line":52,"column":28}},"loc":{"start":{"line":60,"column":3},"end":{"line":181,"column":null}},"line":60},"5":{"name":"(anonymous_5)","decl":{"start":{"line":66,"column":26},"end":{"line":66,"column":27}},"loc":{"start":{"line":66,"column":45},"end":{"line":69,"column":null}},"line":66},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":25},"end":{"line":71,"column":31}},"loc":{"start":{"line":71,"column":31},"end":{"line":82,"column":null}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":84,"column":27},"end":{"line":84,"column":28}},"loc":{"start":{"line":84,"column":46},"end":{"line":87,"column":null}},"line":84},"8":{"name":"(anonymous_8)","decl":{"start":{"line":85,"column":34},"end":{"line":85,"column":35}},"loc":{"start":{"line":85,"column":44},"end":{"line":85,"column":55}},"line":85},"9":{"name":"(anonymous_9)","decl":{"start":{"line":89,"column":23},"end":{"line":89,"column":29}},"loc":{"start":{"line":89,"column":29},"end":{"line":95,"column":null}},"line":89},"10":{"name":"(anonymous_10)","decl":{"start":{"line":97,"column":24},"end":{"line":97,"column":25}},"loc":{"start":{"line":97,"column":76},"end":{"line":110,"column":null}},"line":97},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":17},"end":{"line":114,"column":18}},"loc":{"start":{"line":115,"column":8},"end":{"line":152,"column":null}},"line":115},"12":{"name":"(anonymous_12)","decl":{"start":{"line":122,"column":22},"end":{"line":122,"column":23}},"loc":{"start":{"line":122,"column":29},"end":{"line":122,"column":null}},"line":122},"13":{"name":"(anonymous_13)","decl":{"start":{"line":123,"column":23},"end":{"line":123,"column":24}},"loc":{"start":{"line":123,"column":30},"end":{"line":123,"column":null}},"line":123},"14":{"name":"(anonymous_14)","decl":{"start":{"line":137,"column":21},"end":{"line":137,"column":27}},"loc":{"start":{"line":137,"column":27},"end":{"line":137,"column":null}},"line":137},"15":{"name":"(anonymous_15)","decl":{"start":{"line":144,"column":23},"end":{"line":144,"column":24}},"loc":{"start":{"line":144,"column":30},"end":{"line":147,"column":null}},"line":144},"16":{"name":"(anonymous_16)","decl":{"start":{"line":161,"column":20},"end":{"line":161,"column":21}},"loc":{"start":{"line":161,"column":27},"end":{"line":161,"column":null}},"line":161},"17":{"name":"(anonymous_17)","decl":{"start":{"line":162,"column":21},"end":{"line":162,"column":22}},"loc":{"start":{"line":162,"column":28},"end":{"line":162,"column":null}},"line":162},"18":{"name":"(anonymous_18)","decl":{"start":{"line":163,"column":18},"end":{"line":163,"column":24}},"loc":{"start":{"line":163,"column":24},"end":{"line":166,"column":null}},"line":163},"19":{"name":"(anonymous_19)","decl":{"start":{"line":173,"column":19},"end":{"line":173,"column":25}},"loc":{"start":{"line":173,"column":25},"end":{"line":173,"column":null}},"line":173}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":4},"end":{"line":24,"column":null}},{"start":{"line":21,"column":4},"end":{"line":24,"column":null}}],"line":19},"1":{"loc":{"start":{"line":21,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":24,"column":null}},{"start":{},"end":{}}],"line":21},"2":{"loc":{"start":{"line":27,"column":2},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":39,"column":null}},{"start":{},"end":{}}],"line":27},"3":{"loc":{"start":{"line":45,"column":13},"end":{"line":45,"column":null}},"type":"binary-expr","locations":[{"start":{"line":45,"column":13},"end":{"line":45,"column":22}},{"start":{"line":45,"column":22},"end":{"line":45,"column":null}}],"line":45},"4":{"loc":{"start":{"line":47,"column":7},"end":{"line":47,"column":null}},"type":"binary-expr","locations":[{"start":{"line":47,"column":7},"end":{"line":47,"column":16}},{"start":{"line":47,"column":16},"end":{"line":47,"column":null}}],"line":47},"5":{"loc":{"start":{"line":72,"column":4},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":81,"column":null}},{"start":{},"end":{}}],"line":72},"6":{"loc":{"start":{"line":74,"column":6},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":74,"column":6},"end":{"line":78,"column":null}},{"start":{"line":76,"column":13},"end":{"line":78,"column":null}}],"line":74},"7":{"loc":{"start":{"line":90,"column":4},"end":{"line":94,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":94,"column":null}},{"start":{},"end":{}}],"line":90},"8":{"loc":{"start":{"line":98,"column":4},"end":{"line":109,"column":null}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":109,"column":null}},{"start":{"line":101,"column":4},"end":{"line":109,"column":null}}],"line":98},"9":{"loc":{"start":{"line":99,"column":6},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":6},"end":{"line":100,"column":null}},{"start":{"line":100,"column":11},"end":{"line":100,"column":null}}],"line":99},"10":{"loc":{"start":{"line":101,"column":4},"end":{"line":109,"column":null}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":109,"column":null}},{"start":{},"end":{}}],"line":101},"11":{"loc":{"start":{"line":102,"column":6},"end":{"line":108,"column":null}},"type":"if","locations":[{"start":{"line":102,"column":6},"end":{"line":108,"column":null}},{"start":{"line":105,"column":13},"end":{"line":108,"column":null}}],"line":102},"12":{"loc":{"start":{"line":115,"column":8},"end":{"line":152,"column":null}},"type":"cond-expr","locations":[{"start":{"line":116,"column":10},"end":{"line":126,"column":null}},{"start":{"line":128,"column":10},"end":{"line":152,"column":null}}],"line":115},"13":{"loc":{"start":{"line":155,"column":7},"end":{"line":177,"column":null}},"type":"cond-expr","locations":[{"start":{"line":156,"column":8},"end":{"line":169,"column":null}},{"start":{"line":171,"column":8},"end":{"line":177,"column":null}}],"line":155},"14":{"loc":{"start":{"line":164,"column":12},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":164,"column":12},"end":{"line":165,"column":null}},{"start":{"line":165,"column":17},"end":{"line":165,"column":null}}],"line":164}},"s":{"0":46,"1":46,"2":0,"3":0,"4":0,"5":0,"6":0,"7":46,"8":0,"9":0,"10":0,"11":46,"12":14,"13":14,"14":14,"15":14,"16":14,"17":0,"18":0,"19":14,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":14,"28":0,"29":0,"30":0,"31":14,"32":0,"33":0,"34":0,"35":0,"36":14,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":14,"48":42,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0},"f":{"0":46,"1":0,"2":0,"3":0,"4":14,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":42,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},"b":{"0":[0,0],"1":[0,0],"2":[0,46],"3":[46,0],"4":[46,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,42],"13":[0,14],"14":[0,0]},"meta":{"lastBranch":15,"lastFunction":20,"lastStatement":61,"seen":{"f:3:16:3:30":0,"s:16:32:16:Infinity":0,"s:18:24:25:Infinity":1,"f:18:24:18:25":1,"b:19:4:24:Infinity:21:4:24:Infinity":0,"s:19:4:24:Infinity":2,"s:20:6:20:Infinity":3,"b:21:4:24:Infinity:undefined:undefined:undefined:undefined":1,"s:21:4:24:Infinity":4,"s:22:6:22:Infinity":5,"s:23:6:23:Infinity":6,"b:27:2:39:Infinity:undefined:undefined:undefined:undefined":2,"s:27:2:39:Infinity":7,"s:28:4:37:Infinity":8,"f:33:18:33:19":2,"s:33:25:33:Infinity":9,"f:35:16:35:22":3,"s:35:22:35:Infinity":10,"s:41:2:48:Infinity":11,"b:45:13:45:22:45:22:45:Infinity":3,"b:47:7:47:16:47:16:47:Infinity":4,"f:52:16:52:28":4,"s:61:38:61:Infinity":12,"s:62:32:62:Infinity":13,"s:63:36:63:Infinity":14,"s:64:30:64:Infinity":15,"s:66:26:69:Infinity":16,"f:66:26:66:27":5,"s:67:4:67:Infinity":17,"s:68:4:68:Infinity":18,"s:71:25:82:Infinity":19,"f:71:25:71:31":6,"b:72:4:81:Infinity:undefined:undefined:undefined:undefined":5,"s:72:4:81:Infinity":20,"s:73:23:73:Infinity":21,"b:74:6:78:Infinity:76:13:78:Infinity":6,"s:74:6:78:Infinity":22,"s:75:8:75:Infinity":23,"s:77:8:77:Infinity":24,"s:79:6:79:Infinity":25,"s:80:6:80:Infinity":26,"s:84:27:87:Infinity":27,"f:84:27:84:28":7,"s:85:21:85:Infinity":28,"f:85:34:85:35":8,"s:85:44:85:55":29,"s:86:4:86:Infinity":30,"s:89:23:95:Infinity":31,"f:89:23:89:29":9,"b:90:4:94:Infinity:undefined:undefined:undefined:undefined":7,"s:90:4:94:Infinity":32,"s:91:6:91:Infinity":33,"s:92:6:92:Infinity":34,"s:93:6:93:Infinity":35,"s:97:24:110:Infinity":36,"f:97:24:97:25":10,"b:98:4:109:Infinity:101:4:109:Infinity":8,"s:98:4:109:Infinity":37,"b:99:6:100:Infinity:100:11:100:Infinity":9,"s:99:6:100:Infinity":38,"s:99:29:99:Infinity":39,"s:100:11:100:Infinity":40,"b:101:4:109:Infinity:undefined:undefined:undefined:undefined":10,"s:101:4:109:Infinity":41,"b:102:6:108:Infinity:105:13:108:Infinity":11,"s:102:6:108:Infinity":42,"s:103:8:103:Infinity":43,"s:104:8:104:Infinity":44,"s:106:8:106:Infinity":45,"s:107:8:107:Infinity":46,"s:112:2:179:Infinity":47,"f:114:17:114:18":11,"s:115:8:152:Infinity":48,"b:116:10:126:Infinity:128:10:152:Infinity":12,"f:122:22:122:23":12,"s:122:29:122:Infinity":49,"f:123:23:123:24":13,"s:123:30:123:Infinity":50,"f:137:21:137:27":14,"s:137:27:137:Infinity":51,"f:144:23:144:24":15,"s:145:16:145:Infinity":52,"s:146:16:146:Infinity":53,"b:156:8:169:Infinity:171:8:177:Infinity":13,"f:161:20:161:21":16,"s:161:27:161:Infinity":54,"f:162:21:162:22":17,"s:162:28:162:Infinity":55,"f:163:18:163:24":18,"b:164:12:165:Infinity:165:17:165:Infinity":14,"s:164:12:165:Infinity":56,"s:164:33:164:Infinity":57,"s:165:19:165:42":58,"s:165:42:165:58":59,"f:173:19:173:25":19,"s:173:25:173:Infinity":60}}} +,"/Users/luca/Workspace/laputa-app/src/components/Editor.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/Editor.tsx","statementMap":{"0":{"start":{"line":62,"column":55},"end":{"line":62,"column":null}},"1":{"start":{"line":64,"column":47},"end":{"line":71,"column":null}},"2":{"start":{"line":74,"column":18},"end":{"line":74,"column":null}},"3":{"start":{"line":75,"column":2},"end":{"line":75,"column":null}},"4":{"start":{"line":75,"column":23},"end":{"line":75,"column":null}},"5":{"start":{"line":77,"column":16},"end":{"line":79,"column":null}},"6":{"start":{"line":78,"column":9},"end":{"line":78,"column":null}},"7":{"start":{"line":80,"column":2},"end":{"line":80,"column":null}},"8":{"start":{"line":80,"column":14},"end":{"line":80,"column":null}},"9":{"start":{"line":82,"column":2},"end":{"line":82,"column":null}},"10":{"start":{"line":82,"column":43},"end":{"line":82,"column":null}},"11":{"start":{"line":84,"column":2},"end":{"line":87,"column":null}},"12":{"start":{"line":85,"column":22},"end":{"line":85,"column":null}},"13":{"start":{"line":85,"column":40},"end":{"line":85,"column":81}},"14":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"15":{"start":{"line":86,"column":26},"end":{"line":86,"column":null}},"16":{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},"17":{"start":{"line":91,"column":6},"end":{"line":114,"column":null}},"18":{"start":{"line":101,"column":21},"end":{"line":101,"column":null}},"19":{"start":{"line":102,"column":20},"end":{"line":102,"column":null}},"20":{"start":{"line":103,"column":6},"end":{"line":110,"column":null}},"21":{"start":{"line":118,"column":15},"end":{"line":123,"column":null}},"22":{"start":{"line":127,"column":8},"end":{"line":127,"column":null}},"23":{"start":{"line":128,"column":2},"end":{"line":128,"column":null}},"24":{"start":{"line":129,"column":18},"end":{"line":129,"column":null}},"25":{"start":{"line":132,"column":2},"end":{"line":134,"column":null}},"26":{"start":{"line":133,"column":4},"end":{"line":133,"column":null}},"27":{"start":{"line":136,"column":2},"end":{"line":150,"column":null}},"28":{"start":{"line":137,"column":22},"end":{"line":137,"column":null}},"29":{"start":{"line":138,"column":4},"end":{"line":138,"column":null}},"30":{"start":{"line":138,"column":20},"end":{"line":138,"column":null}},"31":{"start":{"line":139,"column":20},"end":{"line":147,"column":null}},"32":{"start":{"line":140,"column":24},"end":{"line":140,"column":null}},"33":{"start":{"line":141,"column":6},"end":{"line":146,"column":null}},"34":{"start":{"line":142,"column":8},"end":{"line":142,"column":null}},"35":{"start":{"line":143,"column":8},"end":{"line":143,"column":null}},"36":{"start":{"line":144,"column":24},"end":{"line":144,"column":null}},"37":{"start":{"line":145,"column":8},"end":{"line":145,"column":null}},"38":{"start":{"line":145,"column":20},"end":{"line":145,"column":null}},"39":{"start":{"line":148,"column":4},"end":{"line":148,"column":null}},"40":{"start":{"line":149,"column":4},"end":{"line":149,"column":null}},"41":{"start":{"line":149,"column":17},"end":{"line":149,"column":null}},"42":{"start":{"line":152,"column":8},"end":{"line":160,"column":null}},"43":{"start":{"line":153,"column":10},"end":{"line":158,"column":null}},"44":{"start":{"line":153,"column":32},"end":{"line":158,"column":6}},"45":{"start":{"line":162,"column":8},"end":{"line":176,"column":null}},"46":{"start":{"line":163,"column":18},"end":{"line":174,"column":null}},"47":{"start":{"line":163,"column":41},"end":{"line":174,"column":6}},"48":{"start":{"line":166,"column":8},"end":{"line":172,"column":null}},"49":{"start":{"line":175,"column":4},"end":{"line":175,"column":null}},"50":{"start":{"line":178,"column":2},"end":{"line":189,"column":null}},"51":{"start":{"line":193,"column":13},"end":{"line":536,"column":null}},"52":{"start":{"line":203,"column":30},"end":{"line":203,"column":null}},"53":{"start":{"line":204,"column":36},"end":{"line":204,"column":null}},"54":{"start":{"line":205,"column":36},"end":{"line":205,"column":null}},"55":{"start":{"line":208,"column":8},"end":{"line":208,"column":null}},"56":{"start":{"line":209,"column":2},"end":{"line":209,"column":null}},"57":{"start":{"line":212,"column":8},"end":{"line":237,"column":null}},"58":{"start":{"line":215,"column":6},"end":{"line":228,"column":null}},"59":{"start":{"line":217,"column":20},"end":{"line":217,"column":null}},"60":{"start":{"line":218,"column":22},"end":{"line":218,"column":null}},"61":{"start":{"line":219,"column":21},"end":{"line":219,"column":null}},"62":{"start":{"line":220,"column":8},"end":{"line":220,"column":null}},"63":{"start":{"line":220,"column":21},"end":{"line":220,"column":24}},"64":{"start":{"line":220,"column":47},"end":{"line":220,"column":null}},"65":{"start":{"line":221,"column":23},"end":{"line":221,"column":null}},"66":{"start":{"line":222,"column":26},"end":{"line":226,"column":null}},"67":{"start":{"line":227,"column":8},"end":{"line":227,"column":null}},"68":{"start":{"line":230,"column":6},"end":{"line":235,"column":null}},"69":{"start":{"line":231,"column":23},"end":{"line":231,"column":null}},"70":{"start":{"line":232,"column":8},"end":{"line":232,"column":null}},"71":{"start":{"line":232,"column":30},"end":{"line":232,"column":null}},"72":{"start":{"line":233,"column":8},"end":{"line":233,"column":null}},"73":{"start":{"line":233,"column":31},"end":{"line":233,"column":null}},"74":{"start":{"line":234,"column":8},"end":{"line":234,"column":null}},"75":{"start":{"line":239,"column":8},"end":{"line":239,"column":null}},"76":{"start":{"line":240,"column":8},"end":{"line":240,"column":null}},"77":{"start":{"line":241,"column":8},"end":{"line":241,"column":null}},"78":{"start":{"line":242,"column":8},"end":{"line":242,"column":null}},"79":{"start":{"line":245,"column":2},"end":{"line":262,"column":null}},"80":{"start":{"line":247,"column":4},"end":{"line":249,"column":null}},"81":{"start":{"line":248,"column":6},"end":{"line":248,"column":null}},"82":{"start":{"line":250,"column":20},"end":{"line":260,"column":null}},"83":{"start":{"line":251,"column":6},"end":{"line":251,"column":null}},"84":{"start":{"line":255,"column":6},"end":{"line":259,"column":null}},"85":{"start":{"line":256,"column":21},"end":{"line":256,"column":null}},"86":{"start":{"line":257,"column":8},"end":{"line":257,"column":null}},"87":{"start":{"line":258,"column":8},"end":{"line":258,"column":null}},"88":{"start":{"line":261,"column":4},"end":{"line":261,"column":null}},"89":{"start":{"line":267,"column":2},"end":{"line":346,"column":null}},"90":{"start":{"line":268,"column":18},"end":{"line":268,"column":null}},"91":{"start":{"line":269,"column":21},"end":{"line":269,"column":null}},"92":{"start":{"line":272,"column":4},"end":{"line":274,"column":null}},"93":{"start":{"line":273,"column":6},"end":{"line":273,"column":null}},"94":{"start":{"line":275,"column":4},"end":{"line":275,"column":null}},"95":{"start":{"line":277,"column":4},"end":{"line":277,"column":null}},"96":{"start":{"line":277,"column":24},"end":{"line":277,"column":null}},"97":{"start":{"line":279,"column":16},"end":{"line":279,"column":null}},"98":{"start":{"line":279,"column":31},"end":{"line":279,"column":61}},"99":{"start":{"line":280,"column":4},"end":{"line":280,"column":null}},"100":{"start":{"line":280,"column":14},"end":{"line":280,"column":null}},"101":{"start":{"line":282,"column":24},"end":{"line":299,"column":null}},"102":{"start":{"line":283,"column":6},"end":{"line":298,"column":null}},"103":{"start":{"line":284,"column":24},"end":{"line":284,"column":null}},"104":{"start":{"line":285,"column":8},"end":{"line":289,"column":null}},"105":{"start":{"line":286,"column":10},"end":{"line":286,"column":null}},"106":{"start":{"line":287,"column":8},"end":{"line":289,"column":null}},"107":{"start":{"line":288,"column":10},"end":{"line":288,"column":null}},"108":{"start":{"line":291,"column":8},"end":{"line":291,"column":null}},"109":{"start":{"line":292,"column":8},"end":{"line":297,"column":null}},"110":{"start":{"line":293,"column":23},"end":{"line":293,"column":null}},"111":{"start":{"line":294,"column":10},"end":{"line":294,"column":null}},"112":{"start":{"line":296,"column":10},"end":{"line":296,"column":null}},"113":{"start":{"line":301,"column":23},"end":{"line":301,"column":null}},"114":{"start":{"line":303,"column":19},"end":{"line":337,"column":null}},"115":{"start":{"line":305,"column":6},"end":{"line":305,"column":null}},"116":{"start":{"line":305,"column":52},"end":{"line":305,"column":null}},"117":{"start":{"line":307,"column":6},"end":{"line":310,"column":null}},"118":{"start":{"line":308,"column":8},"end":{"line":308,"column":null}},"119":{"start":{"line":309,"column":8},"end":{"line":309,"column":null}},"120":{"start":{"line":312,"column":22},"end":{"line":312,"column":null}},"121":{"start":{"line":313,"column":19},"end":{"line":313,"column":null}},"122":{"start":{"line":314,"column":12},"end":{"line":314,"column":null}},"123":{"start":{"line":316,"column":6},"end":{"line":336,"column":null}},"124":{"start":{"line":317,"column":23},"end":{"line":317,"column":null}},"125":{"start":{"line":318,"column":29},"end":{"line":326,"column":null}},"126":{"start":{"line":319,"column":10},"end":{"line":319,"column":null}},"127":{"start":{"line":319,"column":56},"end":{"line":319,"column":null}},"128":{"start":{"line":320,"column":16},"end":{"line":320,"column":null}},"129":{"start":{"line":322,"column":10},"end":{"line":324,"column":null}},"130":{"start":{"line":323,"column":12},"end":{"line":323,"column":null}},"131":{"start":{"line":325,"column":10},"end":{"line":325,"column":null}},"132":{"start":{"line":327,"column":8},"end":{"line":333,"column":null}},"133":{"start":{"line":328,"column":11},"end":{"line":330,"column":null}},"134":{"start":{"line":329,"column":12},"end":{"line":329,"column":null}},"135":{"start":{"line":332,"column":10},"end":{"line":332,"column":null}},"136":{"start":{"line":335,"column":8},"end":{"line":335,"column":null}},"137":{"start":{"line":339,"column":4},"end":{"line":345,"column":null}},"138":{"start":{"line":342,"column":6},"end":{"line":342,"column":null}},"139":{"start":{"line":344,"column":6},"end":{"line":344,"column":null}},"140":{"start":{"line":349,"column":8},"end":{"line":349,"column":null}},"141":{"start":{"line":350,"column":2},"end":{"line":358,"column":null}},"142":{"start":{"line":351,"column":25},"end":{"line":351,"column":null}},"143":{"start":{"line":351,"column":47},"end":{"line":351,"column":59}},"144":{"start":{"line":352,"column":4},"end":{"line":356,"column":null}},"145":{"start":{"line":353,"column":6},"end":{"line":355,"column":null}},"146":{"start":{"line":354,"column":8},"end":{"line":354,"column":null}},"147":{"start":{"line":357,"column":4},"end":{"line":357,"column":null}},"148":{"start":{"line":360,"column":20},"end":{"line":360,"column":null}},"149":{"start":{"line":360,"column":37},"end":{"line":360,"column":67}},"150":{"start":{"line":361,"column":26},"end":{"line":361,"column":null}},"151":{"start":{"line":362,"column":25},"end":{"line":362,"column":null}},"152":{"start":{"line":364,"column":2},"end":{"line":367,"column":null}},"153":{"start":{"line":365,"column":4},"end":{"line":365,"column":null}},"154":{"start":{"line":366,"column":4},"end":{"line":366,"column":null}},"155":{"start":{"line":369,"column":8},"end":{"line":386,"column":null}},"156":{"start":{"line":370,"column":4},"end":{"line":374,"column":null}},"157":{"start":{"line":371,"column":6},"end":{"line":371,"column":null}},"158":{"start":{"line":372,"column":6},"end":{"line":372,"column":null}},"159":{"start":{"line":373,"column":6},"end":{"line":373,"column":null}},"160":{"start":{"line":375,"column":4},"end":{"line":375,"column":null}},"161":{"start":{"line":375,"column":39},"end":{"line":375,"column":null}},"162":{"start":{"line":376,"column":4},"end":{"line":376,"column":null}},"163":{"start":{"line":377,"column":4},"end":{"line":385,"column":null}},"164":{"start":{"line":378,"column":19},"end":{"line":378,"column":null}},"165":{"start":{"line":379,"column":6},"end":{"line":379,"column":null}},"166":{"start":{"line":380,"column":6},"end":{"line":380,"column":null}},"167":{"start":{"line":382,"column":6},"end":{"line":382,"column":null}},"168":{"start":{"line":384,"column":6},"end":{"line":384,"column":null}},"169":{"start":{"line":388,"column":8},"end":{"line":400,"column":null}},"170":{"start":{"line":389,"column":4},"end":{"line":389,"column":null}},"171":{"start":{"line":389,"column":47},"end":{"line":389,"column":null}},"172":{"start":{"line":390,"column":4},"end":{"line":390,"column":null}},"173":{"start":{"line":391,"column":4},"end":{"line":399,"column":null}},"174":{"start":{"line":392,"column":19},"end":{"line":392,"column":null}},"175":{"start":{"line":393,"column":6},"end":{"line":393,"column":null}},"176":{"start":{"line":394,"column":6},"end":{"line":394,"column":null}},"177":{"start":{"line":396,"column":6},"end":{"line":396,"column":null}},"178":{"start":{"line":398,"column":6},"end":{"line":398,"column":null}},"179":{"start":{"line":402,"column":25},"end":{"line":402,"column":null}},"180":{"start":{"line":403,"column":20},"end":{"line":403,"column":null}},"181":{"start":{"line":406,"column":4},"end":{"line":413,"column":null}},"182":{"start":{"line":416,"column":24},"end":{"line":434,"column":null}},"183":{"start":{"line":429,"column":35},"end":{"line":429,"column":71}},"184":{"start":{"line":430,"column":39},"end":{"line":430,"column":77}},"185":{"start":{"line":431,"column":39},"end":{"line":431,"column":77}},"186":{"start":{"line":432,"column":43},"end":{"line":432,"column":83}},"187":{"start":{"line":436,"column":21},"end":{"line":467,"column":null}},"188":{"start":{"line":445,"column":23},"end":{"line":445,"column":null}},"189":{"start":{"line":470,"column":2},"end":{"line":484,"column":null}},"190":{"start":{"line":471,"column":4},"end":{"line":482,"column":null}},"191":{"start":{"line":486,"column":2},"end":{"line":534,"column":null}}},"fnMap":{"0":{"name":"resolveWikilinkColor","decl":{"start":{"line":73,"column":9},"end":{"line":73,"column":30}},"loc":{"start":{"line":73,"column":66},"end":{"line":89,"column":null}},"line":73},"1":{"name":"(anonymous_1)","decl":{"start":{"line":78,"column":4},"end":{"line":78,"column":9}},"loc":{"start":{"line":78,"column":9},"end":{"line":78,"column":null}},"line":78},"2":{"name":"(anonymous_2)","decl":{"start":{"line":85,"column":35},"end":{"line":85,"column":40}},"loc":{"start":{"line":85,"column":40},"end":{"line":85,"column":81}},"line":85},"3":{"name":"(anonymous_3)","decl":{"start":{"line":100,"column":12},"end":{"line":100,"column":13}},"loc":{"start":{"line":100,"column":23},"end":{"line":112,"column":null}},"line":100},"4":{"name":"SingleEditorView","decl":{"start":{"line":126,"column":9},"end":{"line":126,"column":26}},"loc":{"start":{"line":126,"column":187},"end":{"line":191,"column":null}},"line":126},"5":{"name":"(anonymous_5)","decl":{"start":{"line":132,"column":12},"end":{"line":132,"column":18}},"loc":{"start":{"line":132,"column":18},"end":{"line":134,"column":5}},"line":132},"6":{"name":"(anonymous_6)","decl":{"start":{"line":136,"column":12},"end":{"line":136,"column":18}},"loc":{"start":{"line":136,"column":18},"end":{"line":150,"column":5}},"line":136},"7":{"name":"(anonymous_7)","decl":{"start":{"line":139,"column":20},"end":{"line":139,"column":21}},"loc":{"start":{"line":139,"column":39},"end":{"line":147,"column":null}},"line":139},"8":{"name":"(anonymous_8)","decl":{"start":{"line":149,"column":11},"end":{"line":149,"column":17}},"loc":{"start":{"line":149,"column":17},"end":{"line":149,"column":null}},"line":149},"9":{"name":"(anonymous_9)","decl":{"start":{"line":153,"column":4},"end":{"line":153,"column":10}},"loc":{"start":{"line":153,"column":10},"end":{"line":158,"column":null}},"line":153},"10":{"name":"(anonymous_10)","decl":{"start":{"line":153,"column":22},"end":{"line":153,"column":32}},"loc":{"start":{"line":153,"column":32},"end":{"line":158,"column":6}},"line":153},"11":{"name":"(anonymous_11)","decl":{"start":{"line":162,"column":39},"end":{"line":162,"column":46}},"loc":{"start":{"line":162,"column":64},"end":{"line":176,"column":5}},"line":162},"12":{"name":"(anonymous_12)","decl":{"start":{"line":163,"column":32},"end":{"line":163,"column":41}},"loc":{"start":{"line":163,"column":41},"end":{"line":174,"column":6}},"line":163},"13":{"name":"(anonymous_13)","decl":{"start":{"line":165,"column":19},"end":{"line":165,"column":25}},"loc":{"start":{"line":165,"column":25},"end":{"line":173,"column":null}},"line":165},"14":{"name":"Editor2","decl":{"start":{"line":193,"column":36},"end":{"line":193,"column":43}},"loc":{"start":{"line":202,"column":16},"end":{"line":536,"column":1}},"line":202},"15":{"name":"(anonymous_15)","decl":{"start":{"line":214,"column":16},"end":{"line":214,"column":23}},"loc":{"start":{"line":214,"column":38},"end":{"line":236,"column":null}},"line":214},"16":{"name":"(anonymous_16)","decl":{"start":{"line":230,"column":33},"end":{"line":230,"column":34}},"loc":{"start":{"line":230,"column":54},"end":{"line":235,"column":7}},"line":230},"17":{"name":"(anonymous_17)","decl":{"start":{"line":232,"column":24},"end":{"line":232,"column":30}},"loc":{"start":{"line":232,"column":30},"end":{"line":232,"column":null}},"line":232},"18":{"name":"(anonymous_18)","decl":{"start":{"line":233,"column":25},"end":{"line":233,"column":31}},"loc":{"start":{"line":233,"column":31},"end":{"line":233,"column":null}},"line":233},"19":{"name":"(anonymous_19)","decl":{"start":{"line":245,"column":12},"end":{"line":245,"column":18}},"loc":{"start":{"line":245,"column":18},"end":{"line":262,"column":5}},"line":245},"20":{"name":"(anonymous_20)","decl":{"start":{"line":250,"column":35},"end":{"line":250,"column":41}},"loc":{"start":{"line":250,"column":41},"end":{"line":260,"column":5}},"line":250},"21":{"name":"(anonymous_21)","decl":{"start":{"line":267,"column":12},"end":{"line":267,"column":18}},"loc":{"start":{"line":267,"column":18},"end":{"line":346,"column":5}},"line":267},"22":{"name":"(anonymous_22)","decl":{"start":{"line":279,"column":26},"end":{"line":279,"column":31}},"loc":{"start":{"line":279,"column":31},"end":{"line":279,"column":61}},"line":279},"23":{"name":"(anonymous_23)","decl":{"start":{"line":282,"column":24},"end":{"line":282,"column":25}},"loc":{"start":{"line":282,"column":43},"end":{"line":299,"column":null}},"line":282},"24":{"name":"(anonymous_24)","decl":{"start":{"line":303,"column":19},"end":{"line":303,"column":25}},"loc":{"start":{"line":303,"column":25},"end":{"line":337,"column":null}},"line":303},"25":{"name":"(anonymous_25)","decl":{"start":{"line":318,"column":29},"end":{"line":318,"column":30}},"loc":{"start":{"line":318,"column":48},"end":{"line":326,"column":null}},"line":318},"26":{"name":"(anonymous_26)","decl":{"start":{"line":328,"column":73},"end":{"line":328,"column":74}},"loc":{"start":{"line":328,"column":82},"end":{"line":330,"column":11}},"line":328},"27":{"name":"(anonymous_27)","decl":{"start":{"line":350,"column":12},"end":{"line":350,"column":18}},"loc":{"start":{"line":350,"column":18},"end":{"line":358,"column":5}},"line":350},"28":{"name":"(anonymous_28)","decl":{"start":{"line":351,"column":42},"end":{"line":351,"column":47}},"loc":{"start":{"line":351,"column":47},"end":{"line":351,"column":59}},"line":351},"29":{"name":"(anonymous_29)","decl":{"start":{"line":360,"column":30},"end":{"line":360,"column":31}},"loc":{"start":{"line":360,"column":37},"end":{"line":360,"column":67}},"line":360},"30":{"name":"(anonymous_30)","decl":{"start":{"line":364,"column":12},"end":{"line":364,"column":18}},"loc":{"start":{"line":364,"column":18},"end":{"line":367,"column":5}},"line":364},"31":{"name":"(anonymous_31)","decl":{"start":{"line":369,"column":39},"end":{"line":369,"column":51}},"loc":{"start":{"line":369,"column":51},"end":{"line":386,"column":5}},"line":369},"32":{"name":"(anonymous_32)","decl":{"start":{"line":388,"column":43},"end":{"line":388,"column":50}},"loc":{"start":{"line":388,"column":73},"end":{"line":400,"column":5}},"line":388},"33":{"name":"(anonymous_33)","decl":{"start":{"line":429,"column":29},"end":{"line":429,"column":35}},"loc":{"start":{"line":429,"column":35},"end":{"line":429,"column":71}},"line":429},"34":{"name":"(anonymous_34)","decl":{"start":{"line":430,"column":33},"end":{"line":430,"column":39}},"loc":{"start":{"line":430,"column":39},"end":{"line":430,"column":77}},"line":430},"35":{"name":"(anonymous_35)","decl":{"start":{"line":431,"column":33},"end":{"line":431,"column":39}},"loc":{"start":{"line":431,"column":39},"end":{"line":431,"column":77}},"line":431},"36":{"name":"(anonymous_36)","decl":{"start":{"line":432,"column":37},"end":{"line":432,"column":43}},"loc":{"start":{"line":432,"column":43},"end":{"line":432,"column":83}},"line":432},"37":{"name":"(anonymous_37)","decl":{"start":{"line":445,"column":17},"end":{"line":445,"column":23}},"loc":{"start":{"line":445,"column":23},"end":{"line":445,"column":null}},"line":445}},"branchMap":{"0":{"loc":{"start":{"line":75,"column":2},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":75,"column":2},"end":{"line":75,"column":null}},{"start":{},"end":{}}],"line":75},"1":{"loc":{"start":{"line":78,"column":9},"end":{"line":78,"column":null}},"type":"binary-expr","locations":[{"start":{"line":78,"column":9},"end":{"line":78,"column":31}},{"start":{"line":78,"column":31},"end":{"line":78,"column":null}}],"line":78},"2":{"loc":{"start":{"line":80,"column":2},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":80,"column":2},"end":{"line":80,"column":null}},{"start":{},"end":{}}],"line":80},"3":{"loc":{"start":{"line":82,"column":2},"end":{"line":82,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":2},"end":{"line":82,"column":null}},{"start":{},"end":{}}],"line":82},"4":{"loc":{"start":{"line":82,"column":6},"end":{"line":82,"column":43}},"type":"binary-expr","locations":[{"start":{"line":82,"column":6},"end":{"line":82,"column":30}},{"start":{"line":82,"column":30},"end":{"line":82,"column":43}}],"line":82},"5":{"loc":{"start":{"line":84,"column":2},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":84,"column":2},"end":{"line":87,"column":null}},{"start":{},"end":{}}],"line":84},"6":{"loc":{"start":{"line":85,"column":40},"end":{"line":85,"column":81}},"type":"binary-expr","locations":[{"start":{"line":85,"column":40},"end":{"line":85,"column":60}},{"start":{"line":85,"column":60},"end":{"line":85,"column":81}}],"line":85},"7":{"loc":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"type":"if","locations":[{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},{"start":{},"end":{}}],"line":86},"8":{"loc":{"start":{"line":107,"column":17},"end":{"line":107,"column":null}},"type":"cond-expr","locations":[{"start":{"line":107,"column":25},"end":{"line":107,"column":65}},{"start":{"line":107,"column":65},"end":{"line":107,"column":null}}],"line":107},"9":{"loc":{"start":{"line":138,"column":4},"end":{"line":138,"column":null}},"type":"if","locations":[{"start":{"line":138,"column":4},"end":{"line":138,"column":null}},{"start":{},"end":{}}],"line":138},"10":{"loc":{"start":{"line":141,"column":6},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":6},"end":{"line":146,"column":null}},{"start":{},"end":{}}],"line":141},"11":{"loc":{"start":{"line":145,"column":8},"end":{"line":145,"column":null}},"type":"if","locations":[{"start":{"line":145,"column":8},"end":{"line":145,"column":null}},{"start":{},"end":{}}],"line":145},"12":{"loc":{"start":{"line":156,"column":13},"end":{"line":156,"column":null}},"type":"binary-expr","locations":[{"start":{"line":156,"column":13},"end":{"line":156,"column":26}},{"start":{"line":156,"column":26},"end":{"line":156,"column":null}}],"line":156},"13":{"loc":{"start":{"line":215,"column":6},"end":{"line":228,"column":null}},"type":"if","locations":[{"start":{"line":215,"column":6},"end":{"line":228,"column":null}},{"start":{},"end":{}}],"line":215},"14":{"loc":{"start":{"line":215,"column":6},"end":{"line":215,"column":45}},"type":"binary-expr","locations":[{"start":{"line":215,"column":6},"end":{"line":215,"column":23}},{"start":{"line":215,"column":23},"end":{"line":215,"column":45}}],"line":215},"15":{"loc":{"start":{"line":247,"column":4},"end":{"line":249,"column":null}},"type":"if","locations":[{"start":{"line":247,"column":4},"end":{"line":249,"column":null}},{"start":{},"end":{}}],"line":247},"16":{"loc":{"start":{"line":255,"column":6},"end":{"line":259,"column":null}},"type":"if","locations":[{"start":{"line":255,"column":6},"end":{"line":259,"column":null}},{"start":{},"end":{}}],"line":255},"17":{"loc":{"start":{"line":272,"column":4},"end":{"line":274,"column":null}},"type":"if","locations":[{"start":{"line":272,"column":4},"end":{"line":274,"column":null}},{"start":{},"end":{}}],"line":272},"18":{"loc":{"start":{"line":272,"column":8},"end":{"line":272,"column":76}},"type":"binary-expr","locations":[{"start":{"line":272,"column":8},"end":{"line":272,"column":20}},{"start":{"line":272,"column":20},"end":{"line":272,"column":50}},{"start":{"line":272,"column":50},"end":{"line":272,"column":76}}],"line":272},"19":{"loc":{"start":{"line":277,"column":4},"end":{"line":277,"column":null}},"type":"if","locations":[{"start":{"line":277,"column":4},"end":{"line":277,"column":null}},{"start":{},"end":{}}],"line":277},"20":{"loc":{"start":{"line":280,"column":4},"end":{"line":280,"column":null}},"type":"if","locations":[{"start":{"line":280,"column":4},"end":{"line":280,"column":null}},{"start":{},"end":{}}],"line":280},"21":{"loc":{"start":{"line":285,"column":8},"end":{"line":289,"column":null}},"type":"if","locations":[{"start":{"line":285,"column":8},"end":{"line":289,"column":null}},{"start":{"line":287,"column":8},"end":{"line":289,"column":null}}],"line":285},"22":{"loc":{"start":{"line":285,"column":12},"end":{"line":285,"column":53}},"type":"binary-expr","locations":[{"start":{"line":285,"column":12},"end":{"line":285,"column":34}},{"start":{"line":285,"column":34},"end":{"line":285,"column":53}}],"line":285},"23":{"loc":{"start":{"line":287,"column":8},"end":{"line":289,"column":null}},"type":"if","locations":[{"start":{"line":287,"column":8},"end":{"line":289,"column":null}},{"start":{},"end":{}}],"line":287},"24":{"loc":{"start":{"line":305,"column":6},"end":{"line":305,"column":null}},"type":"if","locations":[{"start":{"line":305,"column":6},"end":{"line":305,"column":null}},{"start":{},"end":{}}],"line":305},"25":{"loc":{"start":{"line":307,"column":6},"end":{"line":310,"column":null}},"type":"if","locations":[{"start":{"line":307,"column":6},"end":{"line":310,"column":null}},{"start":{},"end":{}}],"line":307},"26":{"loc":{"start":{"line":319,"column":10},"end":{"line":319,"column":null}},"type":"if","locations":[{"start":{"line":319,"column":10},"end":{"line":319,"column":null}},{"start":{},"end":{}}],"line":319},"27":{"loc":{"start":{"line":322,"column":10},"end":{"line":324,"column":null}},"type":"if","locations":[{"start":{"line":322,"column":10},"end":{"line":324,"column":null}},{"start":{},"end":{}}],"line":322},"28":{"loc":{"start":{"line":327,"column":8},"end":{"line":333,"column":null}},"type":"if","locations":[{"start":{"line":327,"column":8},"end":{"line":333,"column":null}},{"start":{"line":331,"column":15},"end":{"line":333,"column":null}}],"line":327},"29":{"loc":{"start":{"line":327,"column":12},"end":{"line":327,"column":66}},"type":"binary-expr","locations":[{"start":{"line":327,"column":12},"end":{"line":327,"column":22}},{"start":{"line":327,"column":22},"end":{"line":327,"column":66}}],"line":327},"30":{"loc":{"start":{"line":339,"column":4},"end":{"line":345,"column":null}},"type":"if","locations":[{"start":{"line":339,"column":4},"end":{"line":345,"column":null}},{"start":{"line":343,"column":11},"end":{"line":345,"column":null}}],"line":339},"31":{"loc":{"start":{"line":353,"column":6},"end":{"line":355,"column":null}},"type":"if","locations":[{"start":{"line":353,"column":6},"end":{"line":355,"column":null}},{"start":{},"end":{}}],"line":353},"32":{"loc":{"start":{"line":360,"column":20},"end":{"line":360,"column":null}},"type":"binary-expr","locations":[{"start":{"line":360,"column":20},"end":{"line":360,"column":72}},{"start":{"line":360,"column":72},"end":{"line":360,"column":null}}],"line":360},"33":{"loc":{"start":{"line":361,"column":26},"end":{"line":361,"column":null}},"type":"binary-expr","locations":[{"start":{"line":361,"column":26},"end":{"line":361,"column":52}},{"start":{"line":361,"column":52},"end":{"line":361,"column":null}}],"line":361},"34":{"loc":{"start":{"line":362,"column":25},"end":{"line":362,"column":null}},"type":"binary-expr","locations":[{"start":{"line":362,"column":25},"end":{"line":362,"column":39}},{"start":{"line":362,"column":39},"end":{"line":362,"column":51}},{"start":{"line":362,"column":51},"end":{"line":362,"column":null}}],"line":362},"35":{"loc":{"start":{"line":370,"column":4},"end":{"line":374,"column":null}},"type":"if","locations":[{"start":{"line":370,"column":4},"end":{"line":374,"column":null}},{"start":{},"end":{}}],"line":370},"36":{"loc":{"start":{"line":375,"column":4},"end":{"line":375,"column":null}},"type":"if","locations":[{"start":{"line":375,"column":4},"end":{"line":375,"column":null}},{"start":{},"end":{}}],"line":375},"37":{"loc":{"start":{"line":375,"column":8},"end":{"line":375,"column":39}},"type":"binary-expr","locations":[{"start":{"line":375,"column":8},"end":{"line":375,"column":26}},{"start":{"line":375,"column":26},"end":{"line":375,"column":39}}],"line":375},"38":{"loc":{"start":{"line":389,"column":4},"end":{"line":389,"column":null}},"type":"if","locations":[{"start":{"line":389,"column":4},"end":{"line":389,"column":null}},{"start":{},"end":{}}],"line":389},"39":{"loc":{"start":{"line":389,"column":8},"end":{"line":389,"column":47}},"type":"binary-expr","locations":[{"start":{"line":389,"column":8},"end":{"line":389,"column":26}},{"start":{"line":389,"column":26},"end":{"line":389,"column":47}}],"line":389},"40":{"loc":{"start":{"line":402,"column":25},"end":{"line":402,"column":null}},"type":"cond-expr","locations":[{"start":{"line":402,"column":37},"end":{"line":402,"column":83}},{"start":{"line":402,"column":83},"end":{"line":402,"column":null}}],"line":402},"41":{"loc":{"start":{"line":402,"column":37},"end":{"line":402,"column":83}},"type":"binary-expr","locations":[{"start":{"line":402,"column":37},"end":{"line":402,"column":75}},{"start":{"line":402,"column":75},"end":{"line":402,"column":83}}],"line":402},"42":{"loc":{"start":{"line":403,"column":20},"end":{"line":403,"column":null}},"type":"cond-expr","locations":[{"start":{"line":403,"column":20},"end":{"line":403,"column":64}},{"start":{"line":403,"column":64},"end":{"line":403,"column":null}}],"line":403},"43":{"loc":{"start":{"line":416,"column":24},"end":{"line":434,"column":null}},"type":"cond-expr","locations":[{"start":{"line":417,"column":4},"end":{"line":433,"column":null}},{"start":{"line":434,"column":6},"end":{"line":434,"column":null}}],"line":416},"44":{"loc":{"start":{"line":429,"column":15},"end":{"line":429,"column":null}},"type":"cond-expr","locations":[{"start":{"line":429,"column":29},"end":{"line":429,"column":71}},{"start":{"line":429,"column":71},"end":{"line":429,"column":null}}],"line":429},"45":{"loc":{"start":{"line":430,"column":17},"end":{"line":430,"column":null}},"type":"cond-expr","locations":[{"start":{"line":430,"column":33},"end":{"line":430,"column":77}},{"start":{"line":430,"column":77},"end":{"line":430,"column":null}}],"line":430},"46":{"loc":{"start":{"line":431,"column":17},"end":{"line":431,"column":null}},"type":"cond-expr","locations":[{"start":{"line":431,"column":33},"end":{"line":431,"column":77}},{"start":{"line":431,"column":77},"end":{"line":431,"column":null}}],"line":431},"47":{"loc":{"start":{"line":432,"column":19},"end":{"line":432,"column":null}},"type":"cond-expr","locations":[{"start":{"line":432,"column":37},"end":{"line":432,"column":83}},{"start":{"line":432,"column":83},"end":{"line":432,"column":null}}],"line":432},"48":{"loc":{"start":{"line":436,"column":21},"end":{"line":467,"column":null}},"type":"cond-expr","locations":[{"start":{"line":437,"column":4},"end":{"line":447,"column":null}},{"start":{"line":448,"column":6},"end":{"line":467,"column":null}}],"line":436},"49":{"loc":{"start":{"line":448,"column":6},"end":{"line":467,"column":null}},"type":"cond-expr","locations":[{"start":{"line":448,"column":27},"end":{"line":448,"column":null}},{"start":{"line":449,"column":4},"end":{"line":467,"column":null}}],"line":448},"50":{"loc":{"start":{"line":470,"column":2},"end":{"line":484,"column":null}},"type":"if","locations":[{"start":{"line":470,"column":2},"end":{"line":484,"column":null}},{"start":{},"end":{}}],"line":470},"51":{"loc":{"start":{"line":478,"column":10},"end":{"line":479,"column":null}},"type":"binary-expr","locations":[{"start":{"line":479,"column":12},"end":{"line":479,"column":26}},{"start":{"line":479,"column":26},"end":{"line":479,"column":50}},{"start":{"line":479,"column":50},"end":{"line":479,"column":null}}],"line":478},"52":{"loc":{"start":{"line":492,"column":11},"end":{"line":503,"column":null}},"type":"binary-expr","locations":[{"start":{"line":492,"column":11},"end":{"line":492,"column":null}},{"start":{"line":493,"column":12},"end":{"line":503,"column":null}}],"line":492},"53":{"loc":{"start":{"line":502,"column":30},"end":{"line":502,"column":49}},"type":"binary-expr","locations":[{"start":{"line":502,"column":30},"end":{"line":502,"column":45}},{"start":{"line":502,"column":45},"end":{"line":502,"column":49}}],"line":502},"54":{"loc":{"start":{"line":505,"column":11},"end":{"line":519,"column":null}},"type":"binary-expr","locations":[{"start":{"line":505,"column":11},"end":{"line":505,"column":24}},{"start":{"line":505,"column":24},"end":{"line":505,"column":null}},{"start":{"line":506,"column":12},"end":{"line":519,"column":null}}],"line":505},"55":{"loc":{"start":{"line":521,"column":11},"end":{"line":528,"column":null}},"type":"binary-expr","locations":[{"start":{"line":521,"column":11},"end":{"line":521,"column":30}},{"start":{"line":521,"column":30},"end":{"line":521,"column":null}},{"start":{"line":522,"column":12},"end":{"line":528,"column":null}}],"line":521},"56":{"loc":{"start":{"line":530,"column":8},"end":{"line":531,"column":null}},"type":"binary-expr","locations":[{"start":{"line":531,"column":10},"end":{"line":531,"column":24}},{"start":{"line":531,"column":24},"end":{"line":531,"column":48}},{"start":{"line":531,"column":48},"end":{"line":531,"column":null}}],"line":530}},"s":{"0":2,"1":2,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":2,"18":0,"19":0,"20":0,"21":2,"22":8,"23":8,"24":8,"25":8,"26":8,"27":8,"28":8,"29":8,"30":0,"31":8,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":8,"40":8,"41":8,"42":8,"43":8,"44":8,"45":8,"46":0,"47":0,"48":0,"49":0,"50":8,"51":2,"52":33,"53":33,"54":33,"55":33,"56":33,"57":33,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":33,"76":33,"77":33,"78":33,"79":33,"80":33,"81":11,"82":33,"83":33,"84":33,"85":0,"86":0,"87":0,"88":33,"89":33,"90":33,"91":33,"92":33,"93":0,"94":33,"95":33,"96":25,"97":8,"98":8,"99":8,"100":0,"101":8,"102":8,"103":8,"104":8,"105":1,"106":7,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":8,"114":8,"115":8,"116":0,"117":8,"118":0,"119":0,"120":8,"121":8,"122":8,"123":8,"124":8,"125":8,"126":8,"127":0,"128":8,"129":8,"130":1,"131":8,"132":8,"133":8,"134":0,"135":0,"136":0,"137":8,"138":8,"139":0,"140":33,"141":33,"142":18,"143":9,"144":18,"145":0,"146":0,"147":18,"148":33,"149":8,"150":33,"151":33,"152":33,"153":18,"154":18,"155":33,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":33,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":33,"180":33,"181":33,"182":33,"183":0,"184":0,"185":0,"186":0,"187":33,"188":0,"189":33,"190":25,"191":8},"f":{"0":0,"1":0,"2":0,"3":0,"4":8,"5":8,"6":8,"7":0,"8":8,"9":8,"10":8,"11":0,"12":0,"13":0,"14":33,"15":0,"16":0,"17":0,"18":0,"19":33,"20":33,"21":33,"22":8,"23":8,"24":8,"25":8,"26":0,"27":18,"28":9,"29":8,"30":18,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,8],"10":[0,0],"11":[0,0],"12":[8,0],"13":[0,0],"14":[0,0],"15":[11,22],"16":[0,33],"17":[0,33],"18":[33,0,0],"19":[25,8],"20":[0,8],"21":[1,7],"22":[8,8],"23":[0,7],"24":[0,8],"25":[0,8],"26":[0,8],"27":[1,7],"28":[8,0],"29":[8,8],"30":[8,0],"31":[0,0],"32":[33,25],"33":[33,8],"34":[33,8,8],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[8,25],"41":[8,6],"42":[8,25],"43":[8,25],"44":[0,8],"45":[0,8],"46":[0,8],"47":[0,8],"48":[0,33],"49":[10,23],"50":[25,8],"51":[25,25,23],"52":[8,0],"53":[0,0],"54":[33,8,8],"55":[33,0,0],"56":[33,8,0]},"meta":{"lastBranch":57,"lastFunction":38,"lastStatement":192,"seen":{"s:62:55:62:Infinity":0,"s:64:47:71:Infinity":1,"f:73:9:73:30":0,"s:74:18:74:Infinity":2,"b:75:2:75:Infinity:undefined:undefined:undefined:undefined":0,"s:75:2:75:Infinity":3,"s:75:23:75:Infinity":4,"s:77:16:79:Infinity":5,"f:78:4:78:9":1,"s:78:9:78:Infinity":6,"b:78:9:78:31:78:31:78:Infinity":1,"b:80:2:80:Infinity:undefined:undefined:undefined:undefined":2,"s:80:2:80:Infinity":7,"s:80:14:80:Infinity":8,"b:82:2:82:Infinity:undefined:undefined:undefined:undefined":3,"s:82:2:82:Infinity":9,"b:82:6:82:30:82:30:82:43":4,"s:82:43:82:Infinity":10,"b:84:2:87:Infinity:undefined:undefined:undefined:undefined":5,"s:84:2:87:Infinity":11,"s:85:22:85:Infinity":12,"f:85:35:85:40":2,"s:85:40:85:81":13,"b:85:40:85:60:85:60:85:81":6,"b:86:4:86:Infinity:undefined:undefined:undefined:undefined":7,"s:86:4:86:Infinity":14,"s:86:26:86:Infinity":15,"s:88:2:88:Infinity":16,"s:91:6:114:Infinity":17,"f:100:12:100:13":3,"s:101:21:101:Infinity":18,"s:102:20:102:Infinity":19,"s:103:6:110:Infinity":20,"b:107:25:107:65:107:65:107:Infinity":8,"s:118:15:123:Infinity":21,"f:126:9:126:26":4,"s:127:8:127:Infinity":22,"s:128:2:128:Infinity":23,"s:129:18:129:Infinity":24,"s:132:2:134:Infinity":25,"f:132:12:132:18":5,"s:133:4:133:Infinity":26,"s:136:2:150:Infinity":27,"f:136:12:136:18":6,"s:137:22:137:Infinity":28,"b:138:4:138:Infinity:undefined:undefined:undefined:undefined":9,"s:138:4:138:Infinity":29,"s:138:20:138:Infinity":30,"s:139:20:147:Infinity":31,"f:139:20:139:21":7,"s:140:24:140:Infinity":32,"b:141:6:146:Infinity:undefined:undefined:undefined:undefined":10,"s:141:6:146:Infinity":33,"s:142:8:142:Infinity":34,"s:143:8:143:Infinity":35,"s:144:24:144:Infinity":36,"b:145:8:145:Infinity:undefined:undefined:undefined:undefined":11,"s:145:8:145:Infinity":37,"s:145:20:145:Infinity":38,"s:148:4:148:Infinity":39,"s:149:4:149:Infinity":40,"f:149:11:149:17":8,"s:149:17:149:Infinity":41,"s:152:8:160:Infinity":42,"f:153:4:153:10":9,"s:153:10:158:Infinity":43,"f:153:22:153:32":10,"s:153:32:158:6":44,"b:156:13:156:26:156:26:156:Infinity":12,"s:162:8:176:Infinity":45,"f:162:39:162:46":11,"s:163:18:174:Infinity":46,"f:163:32:163:41":12,"s:163:41:174:6":47,"f:165:19:165:25":13,"s:166:8:172:Infinity":48,"s:175:4:175:Infinity":49,"s:178:2:189:Infinity":50,"s:193:13:536:Infinity":51,"f:193:36:193:43":14,"s:203:30:203:Infinity":52,"s:204:36:204:Infinity":53,"s:205:36:205:Infinity":54,"s:208:8:208:Infinity":55,"s:209:2:209:Infinity":56,"s:212:8:237:Infinity":57,"f:214:16:214:23":15,"b:215:6:228:Infinity:undefined:undefined:undefined:undefined":13,"s:215:6:228:Infinity":58,"b:215:6:215:23:215:23:215:45":14,"s:217:20:217:Infinity":59,"s:218:22:218:Infinity":60,"s:219:21:219:Infinity":61,"s:220:8:220:Infinity":62,"s:220:21:220:24":63,"s:220:47:220:Infinity":64,"s:221:23:221:Infinity":65,"s:222:26:226:Infinity":66,"s:227:8:227:Infinity":67,"s:230:6:235:Infinity":68,"f:230:33:230:34":16,"s:231:23:231:Infinity":69,"s:232:8:232:Infinity":70,"f:232:24:232:30":17,"s:232:30:232:Infinity":71,"s:233:8:233:Infinity":72,"f:233:25:233:31":18,"s:233:31:233:Infinity":73,"s:234:8:234:Infinity":74,"s:239:8:239:Infinity":75,"s:240:8:240:Infinity":76,"s:241:8:241:Infinity":77,"s:242:8:242:Infinity":78,"s:245:2:262:Infinity":79,"f:245:12:245:18":19,"b:247:4:249:Infinity:undefined:undefined:undefined:undefined":15,"s:247:4:249:Infinity":80,"s:248:6:248:Infinity":81,"s:250:20:260:Infinity":82,"f:250:35:250:41":20,"s:251:6:251:Infinity":83,"b:255:6:259:Infinity:undefined:undefined:undefined:undefined":16,"s:255:6:259:Infinity":84,"s:256:21:256:Infinity":85,"s:257:8:257:Infinity":86,"s:258:8:258:Infinity":87,"s:261:4:261:Infinity":88,"s:267:2:346:Infinity":89,"f:267:12:267:18":21,"s:268:18:268:Infinity":90,"s:269:21:269:Infinity":91,"b:272:4:274:Infinity:undefined:undefined:undefined:undefined":17,"s:272:4:274:Infinity":92,"b:272:8:272:20:272:20:272:50:272:50:272:76":18,"s:273:6:273:Infinity":93,"s:275:4:275:Infinity":94,"b:277:4:277:Infinity:undefined:undefined:undefined:undefined":19,"s:277:4:277:Infinity":95,"s:277:24:277:Infinity":96,"s:279:16:279:Infinity":97,"f:279:26:279:31":22,"s:279:31:279:61":98,"b:280:4:280:Infinity:undefined:undefined:undefined:undefined":20,"s:280:4:280:Infinity":99,"s:280:14:280:Infinity":100,"s:282:24:299:Infinity":101,"f:282:24:282:25":23,"s:283:6:298:Infinity":102,"s:284:24:284:Infinity":103,"b:285:8:289:Infinity:287:8:289:Infinity":21,"s:285:8:289:Infinity":104,"b:285:12:285:34:285:34:285:53":22,"s:286:10:286:Infinity":105,"b:287:8:289:Infinity:undefined:undefined:undefined:undefined":23,"s:287:8:289:Infinity":106,"s:288:10:288:Infinity":107,"s:291:8:291:Infinity":108,"s:292:8:297:Infinity":109,"s:293:23:293:Infinity":110,"s:294:10:294:Infinity":111,"s:296:10:296:Infinity":112,"s:301:23:301:Infinity":113,"s:303:19:337:Infinity":114,"f:303:19:303:25":24,"b:305:6:305:Infinity:undefined:undefined:undefined:undefined":24,"s:305:6:305:Infinity":115,"s:305:52:305:Infinity":116,"b:307:6:310:Infinity:undefined:undefined:undefined:undefined":25,"s:307:6:310:Infinity":117,"s:308:8:308:Infinity":118,"s:309:8:309:Infinity":119,"s:312:22:312:Infinity":120,"s:313:19:313:Infinity":121,"s:314:12:314:Infinity":122,"s:316:6:336:Infinity":123,"s:317:23:317:Infinity":124,"s:318:29:326:Infinity":125,"f:318:29:318:30":25,"b:319:10:319:Infinity:undefined:undefined:undefined:undefined":26,"s:319:10:319:Infinity":126,"s:319:56:319:Infinity":127,"s:320:16:320:Infinity":128,"b:322:10:324:Infinity:undefined:undefined:undefined:undefined":27,"s:322:10:324:Infinity":129,"s:323:12:323:Infinity":130,"s:325:10:325:Infinity":131,"b:327:8:333:Infinity:331:15:333:Infinity":28,"s:327:8:333:Infinity":132,"b:327:12:327:22:327:22:327:66":29,"s:328:11:330:Infinity":133,"f:328:73:328:74":26,"s:329:12:329:Infinity":134,"s:332:10:332:Infinity":135,"s:335:8:335:Infinity":136,"b:339:4:345:Infinity:343:11:345:Infinity":30,"s:339:4:345:Infinity":137,"s:342:6:342:Infinity":138,"s:344:6:344:Infinity":139,"s:349:8:349:Infinity":140,"s:350:2:358:Infinity":141,"f:350:12:350:18":27,"s:351:25:351:Infinity":142,"f:351:42:351:47":28,"s:351:47:351:59":143,"s:352:4:356:Infinity":144,"b:353:6:355:Infinity:undefined:undefined:undefined:undefined":31,"s:353:6:355:Infinity":145,"s:354:8:354:Infinity":146,"s:357:4:357:Infinity":147,"s:360:20:360:Infinity":148,"b:360:20:360:72:360:72:360:Infinity":32,"f:360:30:360:31":29,"s:360:37:360:67":149,"s:361:26:361:Infinity":150,"b:361:26:361:52:361:52:361:Infinity":33,"s:362:25:362:Infinity":151,"b:362:25:362:39:362:39:362:51:362:51:362:Infinity":34,"s:364:2:367:Infinity":152,"f:364:12:364:18":30,"s:365:4:365:Infinity":153,"s:366:4:366:Infinity":154,"s:369:8:386:Infinity":155,"f:369:39:369:51":31,"b:370:4:374:Infinity:undefined:undefined:undefined:undefined":35,"s:370:4:374:Infinity":156,"s:371:6:371:Infinity":157,"s:372:6:372:Infinity":158,"s:373:6:373:Infinity":159,"b:375:4:375:Infinity:undefined:undefined:undefined:undefined":36,"s:375:4:375:Infinity":160,"b:375:8:375:26:375:26:375:39":37,"s:375:39:375:Infinity":161,"s:376:4:376:Infinity":162,"s:377:4:385:Infinity":163,"s:378:19:378:Infinity":164,"s:379:6:379:Infinity":165,"s:380:6:380:Infinity":166,"s:382:6:382:Infinity":167,"s:384:6:384:Infinity":168,"s:388:8:400:Infinity":169,"f:388:43:388:50":32,"b:389:4:389:Infinity:undefined:undefined:undefined:undefined":38,"s:389:4:389:Infinity":170,"b:389:8:389:26:389:26:389:47":39,"s:389:47:389:Infinity":171,"s:390:4:390:Infinity":172,"s:391:4:399:Infinity":173,"s:392:19:392:Infinity":174,"s:393:6:393:Infinity":175,"s:394:6:394:Infinity":176,"s:396:6:396:Infinity":177,"s:398:6:398:Infinity":178,"s:402:25:402:Infinity":179,"b:402:37:402:83:402:83:402:Infinity":40,"b:402:37:402:75:402:75:402:83":41,"s:403:20:403:Infinity":180,"b:403:20:403:64:403:64:403:Infinity":42,"s:406:4:413:Infinity":181,"s:416:24:434:Infinity":182,"b:417:4:433:Infinity:434:6:434:Infinity":43,"b:429:29:429:71:429:71:429:Infinity":44,"f:429:29:429:35":33,"s:429:35:429:71":183,"b:430:33:430:77:430:77:430:Infinity":45,"f:430:33:430:39":34,"s:430:39:430:77":184,"b:431:33:431:77:431:77:431:Infinity":46,"f:431:33:431:39":35,"s:431:39:431:77":185,"b:432:37:432:83:432:83:432:Infinity":47,"f:432:37:432:43":36,"s:432:43:432:83":186,"s:436:21:467:Infinity":187,"b:437:4:447:Infinity:448:6:467:Infinity":48,"f:445:17:445:23":37,"s:445:23:445:Infinity":188,"b:448:27:448:Infinity:449:4:467:Infinity":49,"b:470:2:484:Infinity:undefined:undefined:undefined:undefined":50,"s:470:2:484:Infinity":189,"s:471:4:482:Infinity":190,"b:479:12:479:26:479:26:479:50:479:50:479:Infinity":51,"s:486:2:534:Infinity":191,"b:492:11:492:Infinity:493:12:503:Infinity":52,"b:502:30:502:45:502:45:502:49":53,"b:505:11:505:24:505:24:505:Infinity:506:12:519:Infinity":54,"b:521:11:521:30:521:30:521:Infinity:522:12:528:Infinity":55,"b:531:10:531:24:531:24:531:48:531:48:531:Infinity":56}}} +,"/Users/luca/Workspace/laputa-app/src/components/Inspector.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/Inspector.tsx","statementMap":{"0":{"start":{"line":13,"column":83},"end":{"line":22,"column":null}},"1":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"2":{"start":{"line":47,"column":2},"end":{"line":47,"column":null}},"3":{"start":{"line":52,"column":16},"end":{"line":52,"column":null}},"4":{"start":{"line":53,"column":18},"end":{"line":53,"column":null}},"5":{"start":{"line":54,"column":2},"end":{"line":54,"column":null}},"6":{"start":{"line":54,"column":22},"end":{"line":54,"column":null}},"7":{"start":{"line":55,"column":15},"end":{"line":55,"column":null}},"8":{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},"9":{"start":{"line":56,"column":57},"end":{"line":56,"column":72}},"10":{"start":{"line":61,"column":16},"end":{"line":61,"column":null}},"11":{"start":{"line":62,"column":18},"end":{"line":62,"column":null}},"12":{"start":{"line":63,"column":2},"end":{"line":63,"column":null}},"13":{"start":{"line":67,"column":17},"end":{"line":67,"column":null}},"14":{"start":{"line":68,"column":2},"end":{"line":74,"column":null}},"15":{"start":{"line":69,"column":17},"end":{"line":69,"column":null}},"16":{"start":{"line":70,"column":4},"end":{"line":70,"column":null}},"17":{"start":{"line":70,"column":25},"end":{"line":70,"column":null}},"18":{"start":{"line":71,"column":21},"end":{"line":71,"column":null}},"19":{"start":{"line":72,"column":4},"end":{"line":72,"column":null}},"20":{"start":{"line":72,"column":46},"end":{"line":72,"column":null}},"21":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"22":{"start":{"line":79,"column":2},"end":{"line":79,"column":null}},"23":{"start":{"line":79,"column":25},"end":{"line":79,"column":null}},"24":{"start":{"line":80,"column":2},"end":{"line":117,"column":null}},"25":{"start":{"line":85,"column":27},"end":{"line":85,"column":null}},"26":{"start":{"line":86,"column":26},"end":{"line":86,"column":null}},"27":{"start":{"line":87,"column":29},"end":{"line":87,"column":null}},"28":{"start":{"line":88,"column":28},"end":{"line":88,"column":null}},"29":{"start":{"line":89,"column":27},"end":{"line":89,"column":null}},"30":{"start":{"line":90,"column":24},"end":{"line":90,"column":null}},"31":{"start":{"line":91,"column":26},"end":{"line":91,"column":null}},"32":{"start":{"line":92,"column":27},"end":{"line":92,"column":null}},"33":{"start":{"line":93,"column":10},"end":{"line":113,"column":null}},"34":{"start":{"line":103,"column":29},"end":{"line":103,"column":null}},"35":{"start":{"line":129,"column":30},"end":{"line":129,"column":null}},"36":{"start":{"line":130,"column":26},"end":{"line":130,"column":null}},"37":{"start":{"line":131,"column":32},"end":{"line":131,"column":null}},"38":{"start":{"line":132,"column":8},"end":{"line":132,"column":null}},"39":{"start":{"line":134,"column":8},"end":{"line":144,"column":null}},"40":{"start":{"line":135,"column":4},"end":{"line":143,"column":null}},"41":{"start":{"line":136,"column":32},"end":{"line":136,"column":106}},"42":{"start":{"line":138,"column":31},"end":{"line":138,"column":null}},"43":{"start":{"line":139,"column":8},"end":{"line":140,"column":null}},"44":{"start":{"line":139,"column":60},"end":{"line":139,"column":null}},"45":{"start":{"line":139,"column":75},"end":{"line":140,"column":null}},"46":{"start":{"line":140,"column":39},"end":{"line":140,"column":null}},"47":{"start":{"line":140,"column":60},"end":{"line":140,"column":117}},"48":{"start":{"line":140,"column":104},"end":{"line":140,"column":117}},"49":{"start":{"line":141,"column":8},"end":{"line":141,"column":null}},"50":{"start":{"line":143,"column":28},"end":{"line":143,"column":43}},"51":{"start":{"line":147,"column":8},"end":{"line":147,"column":null}},"52":{"start":{"line":147,"column":35},"end":{"line":147,"column":62}},"53":{"start":{"line":147,"column":52},"end":{"line":147,"column":59}},"54":{"start":{"line":149,"column":8},"end":{"line":157,"column":null}},"55":{"start":{"line":150,"column":16},"end":{"line":150,"column":null}},"56":{"start":{"line":151,"column":19},"end":{"line":151,"column":null}},"57":{"start":{"line":152,"column":4},"end":{"line":152,"column":null}},"58":{"start":{"line":152,"column":43},"end":{"line":152,"column":null}},"59":{"start":{"line":153,"column":4},"end":{"line":153,"column":null}},"60":{"start":{"line":154,"column":4},"end":{"line":154,"column":null}},"61":{"start":{"line":155,"column":4},"end":{"line":155,"column":null}},"62":{"start":{"line":156,"column":4},"end":{"line":156,"column":null}},"63":{"start":{"line":159,"column":24},"end":{"line":162,"column":null}},"64":{"start":{"line":160,"column":4},"end":{"line":161,"column":null}},"65":{"start":{"line":160,"column":27},"end":{"line":160,"column":null}},"66":{"start":{"line":160,"column":37},"end":{"line":161,"column":null}},"67":{"start":{"line":161,"column":35},"end":{"line":161,"column":55}},"68":{"start":{"line":161,"column":55},"end":{"line":161,"column":70}},"69":{"start":{"line":161,"column":70},"end":{"line":161,"column":87}},"70":{"start":{"line":164,"column":2},"end":{"line":224,"column":null}},"71":{"start":{"line":170,"column":10},"end":{"line":170,"column":null}},"72":{"start":{"line":177,"column":33},"end":{"line":177,"column":61}},"73":{"start":{"line":186,"column":27},"end":{"line":186,"column":null}},"74":{"start":{"line":194,"column":27},"end":{"line":194,"column":null}},"75":{"start":{"line":208,"column":31},"end":{"line":208,"column":51}},"76":{"start":{"line":208,"column":51},"end":{"line":208,"column":66}},"77":{"start":{"line":208,"column":66},"end":{"line":208,"column":83}},"78":{"start":{"line":219,"column":27},"end":{"line":219,"column":46}},"79":{"start":{"line":219,"column":46},"end":{"line":219,"column":96}},"80":{"start":{"line":219,"column":63},"end":{"line":219,"column":93}},"81":{"start":{"line":229,"column":2},"end":{"line":248,"column":null}},"82":{"start":{"line":230,"column":4},"end":{"line":230,"column":null}},"83":{"start":{"line":230,"column":16},"end":{"line":230,"column":null}},"84":{"start":{"line":231,"column":18},"end":{"line":231,"column":null}},"85":{"start":{"line":232,"column":17},"end":{"line":232,"column":null}},"86":{"start":{"line":233,"column":20},"end":{"line":233,"column":null}},"87":{"start":{"line":234,"column":21},"end":{"line":234,"column":null}},"88":{"start":{"line":236,"column":4},"end":{"line":247,"column":null}},"89":{"start":{"line":237,"column":6},"end":{"line":237,"column":null}},"90":{"start":{"line":237,"column":33},"end":{"line":237,"column":null}},"91":{"start":{"line":238,"column":22},"end":{"line":238,"column":null}},"92":{"start":{"line":239,"column":6},"end":{"line":239,"column":null}},"93":{"start":{"line":239,"column":20},"end":{"line":239,"column":null}},"94":{"start":{"line":240,"column":6},"end":{"line":242,"column":null}},"95":{"start":{"line":241,"column":8},"end":{"line":241,"column":null}},"96":{"start":{"line":241,"column":42},"end":{"line":241,"column":null}},"97":{"start":{"line":243,"column":6},"end":{"line":243,"column":null}},"98":{"start":{"line":243,"column":43},"end":{"line":243,"column":null}},"99":{"start":{"line":244,"column":6},"end":{"line":244,"column":null}},"100":{"start":{"line":244,"column":47},"end":{"line":244,"column":null}},"101":{"start":{"line":245,"column":6},"end":{"line":245,"column":null}},"102":{"start":{"line":245,"column":46},"end":{"line":245,"column":null}},"103":{"start":{"line":246,"column":6},"end":{"line":246,"column":null}},"104":{"start":{"line":252,"column":2},"end":{"line":285,"column":null}},"105":{"start":{"line":262,"column":26},"end":{"line":262,"column":null}},"106":{"start":{"line":263,"column":29},"end":{"line":263,"column":null}},"107":{"start":{"line":264,"column":29},"end":{"line":264,"column":null}},"108":{"start":{"line":265,"column":12},"end":{"line":280,"column":null}},"109":{"start":{"line":270,"column":31},"end":{"line":270,"column":null}},"110":{"start":{"line":290,"column":14},"end":{"line":290,"column":null}},"111":{"start":{"line":291,"column":15},"end":{"line":291,"column":null}},"112":{"start":{"line":292,"column":2},"end":{"line":292,"column":null}},"113":{"start":{"line":292,"column":20},"end":{"line":292,"column":null}},"114":{"start":{"line":293,"column":15},"end":{"line":293,"column":null}},"115":{"start":{"line":294,"column":2},"end":{"line":294,"column":null}},"116":{"start":{"line":294,"column":18},"end":{"line":294,"column":null}},"117":{"start":{"line":295,"column":2},"end":{"line":295,"column":null}},"118":{"start":{"line":295,"column":17},"end":{"line":295,"column":null}},"119":{"start":{"line":296,"column":17},"end":{"line":296,"column":null}},"120":{"start":{"line":297,"column":2},"end":{"line":297,"column":null}},"121":{"start":{"line":297,"column":20},"end":{"line":297,"column":null}},"122":{"start":{"line":298,"column":2},"end":{"line":298,"column":null}},"123":{"start":{"line":302,"column":2},"end":{"line":330,"column":null}},"124":{"start":{"line":310,"column":12},"end":{"line":326,"column":null}},"125":{"start":{"line":315,"column":33},"end":{"line":315,"column":null}},"126":{"start":{"line":335,"column":2},"end":{"line":351,"column":null}},"127":{"start":{"line":359,"column":20},"end":{"line":359,"column":null}},"128":{"start":{"line":360,"column":8},"end":{"line":360,"column":null}},"129":{"start":{"line":360,"column":30},"end":{"line":360,"column":63}},"130":{"start":{"line":362,"column":8},"end":{"line":364,"column":null}},"131":{"start":{"line":363,"column":4},"end":{"line":363,"column":null}},"132":{"start":{"line":363,"column":38},"end":{"line":363,"column":null}},"133":{"start":{"line":366,"column":8},"end":{"line":368,"column":null}},"134":{"start":{"line":367,"column":4},"end":{"line":367,"column":null}},"135":{"start":{"line":367,"column":35},"end":{"line":367,"column":null}},"136":{"start":{"line":370,"column":8},"end":{"line":372,"column":null}},"137":{"start":{"line":371,"column":4},"end":{"line":371,"column":null}},"138":{"start":{"line":371,"column":32},"end":{"line":371,"column":null}},"139":{"start":{"line":374,"column":2},"end":{"line":414,"column":null}}},"fnMap":{"0":{"name":"getTypeIcon","decl":{"start":{"line":24,"column":9},"end":{"line":24,"column":21}},"loc":{"start":{"line":24,"column":91},"end":{"line":26,"column":null}},"line":24},"1":{"name":"isWikilink","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":20}},"loc":{"start":{"line":46,"column":44},"end":{"line":48,"column":null}},"line":46},"2":{"name":"wikilinkDisplay","decl":{"start":{"line":51,"column":9},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":46},"end":{"line":57,"column":null}},"line":51},"3":{"name":"(anonymous_3)","decl":{"start":{"line":56,"column":50},"end":{"line":56,"column":51}},"loc":{"start":{"line":56,"column":57},"end":{"line":56,"column":72}},"line":56},"4":{"name":"wikilinkTarget","decl":{"start":{"line":60,"column":9},"end":{"line":60,"column":24}},"loc":{"start":{"line":60,"column":45},"end":{"line":64,"column":null}},"line":60},"5":{"name":"resolveRef","decl":{"start":{"line":66,"column":9},"end":{"line":66,"column":20}},"loc":{"start":{"line":66,"column":80},"end":{"line":75,"column":null}},"line":66},"6":{"name":"(anonymous_6)","decl":{"start":{"line":68,"column":22},"end":{"line":68,"column":23}},"loc":{"start":{"line":68,"column":29},"end":{"line":74,"column":3}},"line":68},"7":{"name":"RelationshipGroup","decl":{"start":{"line":78,"column":9},"end":{"line":78,"column":27}},"loc":{"start":{"line":78,"column":161},"end":{"line":119,"column":null}},"line":78},"8":{"name":"(anonymous_8)","decl":{"start":{"line":84,"column":18},"end":{"line":84,"column":19}},"loc":{"start":{"line":84,"column":32},"end":{"line":115,"column":9}},"line":84},"9":{"name":"(anonymous_9)","decl":{"start":{"line":103,"column":23},"end":{"line":103,"column":29}},"loc":{"start":{"line":103,"column":29},"end":{"line":103,"column":null}},"line":103},"10":{"name":"DynamicRelationshipsPanel","decl":{"start":{"line":121,"column":9},"end":{"line":121,"column":35}},"loc":{"start":{"line":128,"column":3},"end":{"line":226,"column":null}},"line":128},"11":{"name":"(anonymous_11)","decl":{"start":{"line":134,"column":38},"end":{"line":134,"column":44}},"loc":{"start":{"line":134,"column":44},"end":{"line":144,"column":5}},"line":134},"12":{"name":"(anonymous_12)","decl":{"start":{"line":136,"column":14},"end":{"line":136,"column":15}},"loc":{"start":{"line":136,"column":32},"end":{"line":136,"column":106}},"line":136},"13":{"name":"(anonymous_13)","decl":{"start":{"line":137,"column":11},"end":{"line":137,"column":12}},"loc":{"start":{"line":137,"column":29},"end":{"line":142,"column":7}},"line":137},"14":{"name":"(anonymous_14)","decl":{"start":{"line":140,"column":53},"end":{"line":140,"column":58}},"loc":{"start":{"line":140,"column":58},"end":{"line":140,"column":118}},"line":140},"15":{"name":"(anonymous_15)","decl":{"start":{"line":143,"column":14},"end":{"line":143,"column":15}},"loc":{"start":{"line":143,"column":28},"end":{"line":143,"column":43}},"line":143},"16":{"name":"(anonymous_16)","decl":{"start":{"line":147,"column":29},"end":{"line":147,"column":35}},"loc":{"start":{"line":147,"column":35},"end":{"line":147,"column":62}},"line":147},"17":{"name":"(anonymous_17)","decl":{"start":{"line":147,"column":47},"end":{"line":147,"column":52}},"loc":{"start":{"line":147,"column":52},"end":{"line":147,"column":59}},"line":147},"18":{"name":"(anonymous_18)","decl":{"start":{"line":149,"column":32},"end":{"line":149,"column":38}},"loc":{"start":{"line":149,"column":38},"end":{"line":157,"column":5}},"line":149},"19":{"name":"(anonymous_19)","decl":{"start":{"line":159,"column":24},"end":{"line":159,"column":25}},"loc":{"start":{"line":159,"column":52},"end":{"line":162,"column":null}},"line":159},"20":{"name":"(anonymous_20)","decl":{"start":{"line":169,"column":32},"end":{"line":169,"column":33}},"loc":{"start":{"line":170,"column":10},"end":{"line":170,"column":null}},"line":170},"21":{"name":"(anonymous_21)","decl":{"start":{"line":177,"column":28},"end":{"line":177,"column":33}},"loc":{"start":{"line":177,"column":33},"end":{"line":177,"column":61}},"line":177},"22":{"name":"(anonymous_22)","decl":{"start":{"line":186,"column":22},"end":{"line":186,"column":27}},"loc":{"start":{"line":186,"column":27},"end":{"line":186,"column":null}},"line":186},"23":{"name":"(anonymous_23)","decl":{"start":{"line":194,"column":22},"end":{"line":194,"column":27}},"loc":{"start":{"line":194,"column":27},"end":{"line":194,"column":null}},"line":194},"24":{"name":"(anonymous_24)","decl":{"start":{"line":208,"column":23},"end":{"line":208,"column":29}},"loc":{"start":{"line":208,"column":29},"end":{"line":208,"column":null}},"line":208},"25":{"name":"(anonymous_25)","decl":{"start":{"line":219,"column":19},"end":{"line":219,"column":25}},"loc":{"start":{"line":219,"column":25},"end":{"line":219,"column":null}},"line":219},"26":{"name":"(anonymous_26)","decl":{"start":{"line":219,"column":57},"end":{"line":219,"column":63}},"loc":{"start":{"line":219,"column":63},"end":{"line":219,"column":93}},"line":219},"27":{"name":"useBacklinks","decl":{"start":{"line":228,"column":9},"end":{"line":228,"column":22}},"loc":{"start":{"line":228,"column":121},"end":{"line":249,"column":null}},"line":228},"28":{"name":"(anonymous_28)","decl":{"start":{"line":229,"column":17},"end":{"line":229,"column":23}},"loc":{"start":{"line":229,"column":23},"end":{"line":248,"column":5}},"line":229},"29":{"name":"(anonymous_29)","decl":{"start":{"line":236,"column":26},"end":{"line":236,"column":27}},"loc":{"start":{"line":236,"column":33},"end":{"line":247,"column":5}},"line":236},"30":{"name":"BacklinksPanel","decl":{"start":{"line":251,"column":9},"end":{"line":251,"column":24}},"loc":{"start":{"line":251,"column":118},"end":{"line":287,"column":null}},"line":251},"31":{"name":"(anonymous_31)","decl":{"start":{"line":261,"column":25},"end":{"line":261,"column":26}},"loc":{"start":{"line":261,"column":32},"end":{"line":282,"column":11}},"line":261},"32":{"name":"(anonymous_32)","decl":{"start":{"line":270,"column":25},"end":{"line":270,"column":31}},"loc":{"start":{"line":270,"column":31},"end":{"line":270,"column":null}},"line":270},"33":{"name":"formatRelativeDate","decl":{"start":{"line":289,"column":9},"end":{"line":289,"column":28}},"loc":{"start":{"line":289,"column":55},"end":{"line":299,"column":null}},"line":289},"34":{"name":"GitHistoryPanel","decl":{"start":{"line":301,"column":9},"end":{"line":301,"column":25}},"loc":{"start":{"line":301,"column":131},"end":{"line":332,"column":null}},"line":301},"35":{"name":"(anonymous_35)","decl":{"start":{"line":309,"column":23},"end":{"line":309,"column":24}},"loc":{"start":{"line":310,"column":12},"end":{"line":326,"column":null}},"line":310},"36":{"name":"(anonymous_36)","decl":{"start":{"line":315,"column":27},"end":{"line":315,"column":33}},"loc":{"start":{"line":315,"column":33},"end":{"line":315,"column":null}},"line":315},"37":{"name":"EmptyInspector","decl":{"start":{"line":334,"column":9},"end":{"line":334,"column":26}},"loc":{"start":{"line":334,"column":26},"end":{"line":353,"column":null}},"line":334},"38":{"name":"Inspector","decl":{"start":{"line":355,"column":16},"end":{"line":355,"column":26}},"loc":{"start":{"line":358,"column":19},"end":{"line":416,"column":null}},"line":358},"39":{"name":"(anonymous_39)","decl":{"start":{"line":360,"column":30},"end":{"line":360,"column":36}},"loc":{"start":{"line":360,"column":30},"end":{"line":360,"column":63}},"line":360},"40":{"name":"(anonymous_40)","decl":{"start":{"line":362,"column":43},"end":{"line":362,"column":44}},"loc":{"start":{"line":362,"column":85},"end":{"line":364,"column":5}},"line":362},"41":{"name":"(anonymous_41)","decl":{"start":{"line":366,"column":43},"end":{"line":366,"column":44}},"loc":{"start":{"line":366,"column":60},"end":{"line":368,"column":5}},"line":366},"42":{"name":"(anonymous_42)","decl":{"start":{"line":370,"column":40},"end":{"line":370,"column":41}},"loc":{"start":{"line":370,"column":82},"end":{"line":372,"column":5}},"line":370}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":10},"end":{"line":25,"column":null}},"type":"binary-expr","locations":[{"start":{"line":25,"column":10},"end":{"line":25,"column":17}},{"start":{"line":25,"column":17},"end":{"line":25,"column":40}},{"start":{"line":25,"column":40},"end":{"line":25,"column":null}}],"line":25},"1":{"loc":{"start":{"line":54,"column":2},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":54},"2":{"loc":{"start":{"line":55,"column":15},"end":{"line":55,"column":null}},"type":"binary-expr","locations":[{"start":{"line":55,"column":15},"end":{"line":55,"column":41}},{"start":{"line":55,"column":41},"end":{"line":55,"column":null}}],"line":55},"3":{"loc":{"start":{"line":63,"column":9},"end":{"line":63,"column":null}},"type":"cond-expr","locations":[{"start":{"line":63,"column":26},"end":{"line":63,"column":52}},{"start":{"line":63,"column":52},"end":{"line":63,"column":null}}],"line":63},"4":{"loc":{"start":{"line":70,"column":4},"end":{"line":70,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":4},"end":{"line":70,"column":null}},{"start":{},"end":{}}],"line":70},"5":{"loc":{"start":{"line":72,"column":4},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":72,"column":null}},{"start":{},"end":{}}],"line":72},"6":{"loc":{"start":{"line":79,"column":2},"end":{"line":79,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":79,"column":null}},{"start":{},"end":{}}],"line":79},"7":{"loc":{"start":{"line":86,"column":26},"end":{"line":86,"column":null}},"type":"binary-expr","locations":[{"start":{"line":86,"column":26},"end":{"line":86,"column":43}},{"start":{"line":86,"column":43},"end":{"line":86,"column":null}}],"line":86},"8":{"loc":{"start":{"line":87,"column":29},"end":{"line":87,"column":null}},"type":"binary-expr","locations":[{"start":{"line":87,"column":29},"end":{"line":87,"column":51}},{"start":{"line":87,"column":51},"end":{"line":87,"column":null}}],"line":87},"9":{"loc":{"start":{"line":88,"column":28},"end":{"line":88,"column":null}},"type":"binary-expr","locations":[{"start":{"line":88,"column":28},"end":{"line":88,"column":49}},{"start":{"line":88,"column":49},"end":{"line":88,"column":null}}],"line":88},"10":{"loc":{"start":{"line":89,"column":27},"end":{"line":89,"column":null}},"type":"binary-expr","locations":[{"start":{"line":89,"column":27},"end":{"line":89,"column":41}},{"start":{"line":89,"column":41},"end":{"line":89,"column":null}}],"line":89},"11":{"loc":{"start":{"line":90,"column":24},"end":{"line":90,"column":null}},"type":"cond-expr","locations":[{"start":{"line":90,"column":24},"end":{"line":90,"column":58}},{"start":{"line":90,"column":58},"end":{"line":90,"column":null}}],"line":90},"12":{"loc":{"start":{"line":91,"column":26},"end":{"line":91,"column":null}},"type":"cond-expr","locations":[{"start":{"line":91,"column":26},"end":{"line":91,"column":65}},{"start":{"line":91,"column":65},"end":{"line":91,"column":null}}],"line":91},"13":{"loc":{"start":{"line":98,"column":28},"end":{"line":98,"column":null}},"type":"cond-expr","locations":[{"start":{"line":98,"column":39},"end":{"line":98,"column":56}},{"start":{"line":98,"column":56},"end":{"line":98,"column":null}}],"line":98},"14":{"loc":{"start":{"line":99,"column":23},"end":{"line":99,"column":null}},"type":"cond-expr","locations":[{"start":{"line":99,"column":34},"end":{"line":99,"column":62}},{"start":{"line":99,"column":62},"end":{"line":99,"column":null}}],"line":99},"15":{"loc":{"start":{"line":101,"column":25},"end":{"line":101,"column":null}},"type":"cond-expr","locations":[{"start":{"line":101,"column":36},"end":{"line":101,"column":42}},{"start":{"line":101,"column":42},"end":{"line":101,"column":null}}],"line":101},"16":{"loc":{"start":{"line":104,"column":21},"end":{"line":104,"column":null}},"type":"cond-expr","locations":[{"start":{"line":104,"column":33},"end":{"line":104,"column":45}},{"start":{"line":104,"column":45},"end":{"line":104,"column":null}}],"line":104},"17":{"loc":{"start":{"line":104,"column":45},"end":{"line":104,"column":null}},"type":"cond-expr","locations":[{"start":{"line":104,"column":58},"end":{"line":104,"column":71}},{"start":{"line":104,"column":71},"end":{"line":104,"column":null}}],"line":104},"18":{"loc":{"start":{"line":107,"column":17},"end":{"line":107,"column":null}},"type":"binary-expr","locations":[{"start":{"line":107,"column":17},"end":{"line":107,"column":30}},{"start":{"line":107,"column":30},"end":{"line":107,"column":null}}],"line":107},"19":{"loc":{"start":{"line":109,"column":17},"end":{"line":109,"column":null}},"type":"binary-expr","locations":[{"start":{"line":109,"column":17},"end":{"line":109,"column":30}},{"start":{"line":109,"column":30},"end":{"line":109,"column":null}}],"line":109},"20":{"loc":{"start":{"line":110,"column":17},"end":{"line":110,"column":null}},"type":"binary-expr","locations":[{"start":{"line":110,"column":17},"end":{"line":110,"column":31}},{"start":{"line":110,"column":31},"end":{"line":110,"column":45}},{"start":{"line":110,"column":45},"end":{"line":110,"column":null}}],"line":110},"21":{"loc":{"start":{"line":112,"column":84},"end":{"line":112,"column":129}},"type":"cond-expr","locations":[{"start":{"line":112,"column":95},"end":{"line":112,"column":123}},{"start":{"line":112,"column":123},"end":{"line":112,"column":129}}],"line":112},"22":{"loc":{"start":{"line":136,"column":32},"end":{"line":136,"column":106}},"type":"binary-expr","locations":[{"start":{"line":136,"column":32},"end":{"line":136,"column":51}},{"start":{"line":136,"column":51},"end":{"line":136,"column":81}},{"start":{"line":136,"column":76},"end":{"line":136,"column":106}}],"line":136},"23":{"loc":{"start":{"line":139,"column":8},"end":{"line":140,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":8},"end":{"line":140,"column":null}},{"start":{"line":139,"column":75},"end":{"line":140,"column":null}}],"line":139},"24":{"loc":{"start":{"line":139,"column":12},"end":{"line":139,"column":60}},"type":"binary-expr","locations":[{"start":{"line":139,"column":12},"end":{"line":139,"column":41}},{"start":{"line":139,"column":41},"end":{"line":139,"column":60}}],"line":139},"25":{"loc":{"start":{"line":139,"column":75},"end":{"line":140,"column":null}},"type":"if","locations":[{"start":{"line":139,"column":75},"end":{"line":140,"column":null}},{"start":{},"end":{}}],"line":139},"26":{"loc":{"start":{"line":140,"column":60},"end":{"line":140,"column":117}},"type":"if","locations":[{"start":{"line":140,"column":60},"end":{"line":140,"column":117}},{"start":{},"end":{}}],"line":140},"27":{"loc":{"start":{"line":140,"column":64},"end":{"line":140,"column":104}},"type":"binary-expr","locations":[{"start":{"line":140,"column":64},"end":{"line":140,"column":89}},{"start":{"line":140,"column":89},"end":{"line":140,"column":104}}],"line":140},"28":{"loc":{"start":{"line":152,"column":4},"end":{"line":152,"column":null}},"type":"if","locations":[{"start":{"line":152,"column":4},"end":{"line":152,"column":null}},{"start":{},"end":{}}],"line":152},"29":{"loc":{"start":{"line":152,"column":8},"end":{"line":152,"column":43}},"type":"binary-expr","locations":[{"start":{"line":152,"column":8},"end":{"line":152,"column":16}},{"start":{"line":152,"column":16},"end":{"line":152,"column":27}},{"start":{"line":152,"column":27},"end":{"line":152,"column":43}}],"line":152},"30":{"loc":{"start":{"line":160,"column":4},"end":{"line":161,"column":null}},"type":"if","locations":[{"start":{"line":160,"column":4},"end":{"line":161,"column":null}},{"start":{"line":160,"column":37},"end":{"line":161,"column":null}}],"line":160},"31":{"loc":{"start":{"line":160,"column":37},"end":{"line":161,"column":null}},"type":"if","locations":[{"start":{"line":160,"column":37},"end":{"line":161,"column":null}},{"start":{},"end":{}}],"line":160},"32":{"loc":{"start":{"line":166,"column":7},"end":{"line":171,"column":null}},"type":"cond-expr","locations":[{"start":{"line":167,"column":8},"end":{"line":167,"column":null}},{"start":{"line":169,"column":8},"end":{"line":171,"column":null}}],"line":166},"33":{"loc":{"start":{"line":174,"column":7},"end":{"line":222,"column":null}},"type":"cond-expr","locations":[{"start":{"line":175,"column":8},"end":{"line":213,"column":null}},{"start":{"line":215,"column":8},"end":{"line":222,"column":null}}],"line":174},"34":{"loc":{"start":{"line":201,"column":24},"end":{"line":201,"column":null}},"type":"binary-expr","locations":[{"start":{"line":201,"column":24},"end":{"line":201,"column":42}},{"start":{"line":201,"column":42},"end":{"line":201,"column":null}}],"line":201},"35":{"loc":{"start":{"line":217,"column":80},"end":{"line":217,"column":105}},"type":"cond-expr","locations":[{"start":{"line":217,"column":96},"end":{"line":217,"column":100}},{"start":{"line":217,"column":100},"end":{"line":217,"column":105}}],"line":217},"36":{"loc":{"start":{"line":217,"column":113},"end":{"line":217,"column":155}},"type":"cond-expr","locations":[{"start":{"line":217,"column":129},"end":{"line":217,"column":141}},{"start":{"line":217,"column":141},"end":{"line":217,"column":155}}],"line":217},"37":{"loc":{"start":{"line":230,"column":4},"end":{"line":230,"column":null}},"type":"if","locations":[{"start":{"line":230,"column":4},"end":{"line":230,"column":null}},{"start":{},"end":{}}],"line":230},"38":{"loc":{"start":{"line":237,"column":6},"end":{"line":237,"column":null}},"type":"if","locations":[{"start":{"line":237,"column":6},"end":{"line":237,"column":null}},{"start":{},"end":{}}],"line":237},"39":{"loc":{"start":{"line":239,"column":6},"end":{"line":239,"column":null}},"type":"if","locations":[{"start":{"line":239,"column":6},"end":{"line":239,"column":null}},{"start":{},"end":{}}],"line":239},"40":{"loc":{"start":{"line":241,"column":8},"end":{"line":241,"column":null}},"type":"if","locations":[{"start":{"line":241,"column":8},"end":{"line":241,"column":null}},{"start":{},"end":{}}],"line":241},"41":{"loc":{"start":{"line":243,"column":6},"end":{"line":243,"column":null}},"type":"if","locations":[{"start":{"line":243,"column":6},"end":{"line":243,"column":null}},{"start":{},"end":{}}],"line":243},"42":{"loc":{"start":{"line":244,"column":6},"end":{"line":244,"column":null}},"type":"if","locations":[{"start":{"line":244,"column":6},"end":{"line":244,"column":null}},{"start":{},"end":{}}],"line":244},"43":{"loc":{"start":{"line":245,"column":6},"end":{"line":245,"column":null}},"type":"if","locations":[{"start":{"line":245,"column":6},"end":{"line":245,"column":null}},{"start":{},"end":{}}],"line":245},"44":{"loc":{"start":{"line":255,"column":19},"end":{"line":255,"column":null}},"type":"binary-expr","locations":[{"start":{"line":255,"column":19},"end":{"line":255,"column":43}},{"start":{"line":255,"column":43},"end":{"line":255,"column":null}}],"line":255},"45":{"loc":{"start":{"line":257,"column":7},"end":{"line":283,"column":null}},"type":"cond-expr","locations":[{"start":{"line":258,"column":8},"end":{"line":258,"column":null}},{"start":{"line":260,"column":8},"end":{"line":283,"column":null}}],"line":257},"46":{"loc":{"start":{"line":262,"column":26},"end":{"line":262,"column":null}},"type":"cond-expr","locations":[{"start":{"line":262,"column":28},"end":{"line":262,"column":56}},{"start":{"line":262,"column":56},"end":{"line":262,"column":null}}],"line":262},"47":{"loc":{"start":{"line":263,"column":41},"end":{"line":263,"column":59}},"type":"binary-expr","locations":[{"start":{"line":263,"column":41},"end":{"line":263,"column":50}},{"start":{"line":263,"column":50},"end":{"line":263,"column":59}}],"line":263},"48":{"loc":{"start":{"line":264,"column":29},"end":{"line":264,"column":null}},"type":"binary-expr","locations":[{"start":{"line":264,"column":29},"end":{"line":264,"column":43}},{"start":{"line":264,"column":43},"end":{"line":264,"column":null}}],"line":264},"49":{"loc":{"start":{"line":269,"column":32},"end":{"line":269,"column":78}},"type":"cond-expr","locations":[{"start":{"line":269,"column":43},"end":{"line":269,"column":71}},{"start":{"line":269,"column":71},"end":{"line":269,"column":78}}],"line":269},"50":{"loc":{"start":{"line":269,"column":87},"end":{"line":269,"column":106}},"type":"cond-expr","locations":[{"start":{"line":269,"column":98},"end":{"line":269,"column":104}},{"start":{"line":269,"column":104},"end":{"line":269,"column":106}}],"line":269},"51":{"loc":{"start":{"line":271,"column":23},"end":{"line":271,"column":null}},"type":"cond-expr","locations":[{"start":{"line":271,"column":35},"end":{"line":271,"column":47}},{"start":{"line":271,"column":47},"end":{"line":271,"column":null}}],"line":271},"52":{"loc":{"start":{"line":271,"column":47},"end":{"line":271,"column":null}},"type":"cond-expr","locations":[{"start":{"line":271,"column":60},"end":{"line":271,"column":73}},{"start":{"line":271,"column":73},"end":{"line":271,"column":null}}],"line":271},"53":{"loc":{"start":{"line":274,"column":19},"end":{"line":274,"column":null}},"type":"binary-expr","locations":[{"start":{"line":274,"column":19},"end":{"line":274,"column":32}},{"start":{"line":274,"column":32},"end":{"line":274,"column":null}}],"line":274},"54":{"loc":{"start":{"line":276,"column":19},"end":{"line":276,"column":null}},"type":"binary-expr","locations":[{"start":{"line":276,"column":19},"end":{"line":276,"column":32}},{"start":{"line":276,"column":32},"end":{"line":276,"column":null}}],"line":276},"55":{"loc":{"start":{"line":277,"column":19},"end":{"line":277,"column":null}},"type":"binary-expr","locations":[{"start":{"line":277,"column":19},"end":{"line":277,"column":33}},{"start":{"line":277,"column":33},"end":{"line":277,"column":47}},{"start":{"line":277,"column":47},"end":{"line":277,"column":null}}],"line":277},"56":{"loc":{"start":{"line":279,"column":17},"end":{"line":279,"column":null}},"type":"binary-expr","locations":[{"start":{"line":279,"column":17},"end":{"line":279,"column":26}},{"start":{"line":279,"column":26},"end":{"line":279,"column":null}}],"line":279},"57":{"loc":{"start":{"line":279,"column":96},"end":{"line":279,"column":141}},"type":"cond-expr","locations":[{"start":{"line":279,"column":107},"end":{"line":279,"column":135}},{"start":{"line":279,"column":135},"end":{"line":279,"column":141}}],"line":279},"58":{"loc":{"start":{"line":292,"column":2},"end":{"line":292,"column":null}},"type":"if","locations":[{"start":{"line":292,"column":2},"end":{"line":292,"column":null}},{"start":{},"end":{}}],"line":292},"59":{"loc":{"start":{"line":294,"column":2},"end":{"line":294,"column":null}},"type":"if","locations":[{"start":{"line":294,"column":2},"end":{"line":294,"column":null}},{"start":{},"end":{}}],"line":294},"60":{"loc":{"start":{"line":295,"column":2},"end":{"line":295,"column":null}},"type":"if","locations":[{"start":{"line":295,"column":2},"end":{"line":295,"column":null}},{"start":{},"end":{}}],"line":295},"61":{"loc":{"start":{"line":297,"column":2},"end":{"line":297,"column":null}},"type":"if","locations":[{"start":{"line":297,"column":2},"end":{"line":297,"column":null}},{"start":{},"end":{}}],"line":297},"62":{"loc":{"start":{"line":305,"column":7},"end":{"line":328,"column":null}},"type":"cond-expr","locations":[{"start":{"line":306,"column":8},"end":{"line":306,"column":null}},{"start":{"line":308,"column":8},"end":{"line":328,"column":null}}],"line":305},"63":{"loc":{"start":{"line":323,"column":15},"end":{"line":324,"column":null}},"type":"binary-expr","locations":[{"start":{"line":323,"column":15},"end":{"line":323,"column":null}},{"start":{"line":324,"column":16},"end":{"line":324,"column":null}}],"line":323},"64":{"loc":{"start":{"line":363,"column":4},"end":{"line":363,"column":null}},"type":"if","locations":[{"start":{"line":363,"column":4},"end":{"line":363,"column":null}},{"start":{},"end":{}}],"line":363},"65":{"loc":{"start":{"line":363,"column":8},"end":{"line":363,"column":38}},"type":"binary-expr","locations":[{"start":{"line":363,"column":8},"end":{"line":363,"column":17}},{"start":{"line":363,"column":17},"end":{"line":363,"column":38}}],"line":363},"66":{"loc":{"start":{"line":367,"column":4},"end":{"line":367,"column":null}},"type":"if","locations":[{"start":{"line":367,"column":4},"end":{"line":367,"column":null}},{"start":{},"end":{}}],"line":367},"67":{"loc":{"start":{"line":367,"column":8},"end":{"line":367,"column":35}},"type":"binary-expr","locations":[{"start":{"line":367,"column":8},"end":{"line":367,"column":17}},{"start":{"line":367,"column":17},"end":{"line":367,"column":35}}],"line":367},"68":{"loc":{"start":{"line":371,"column":4},"end":{"line":371,"column":null}},"type":"if","locations":[{"start":{"line":371,"column":4},"end":{"line":371,"column":null}},{"start":{},"end":{}}],"line":371},"69":{"loc":{"start":{"line":371,"column":8},"end":{"line":371,"column":32}},"type":"binary-expr","locations":[{"start":{"line":371,"column":8},"end":{"line":371,"column":17}},{"start":{"line":371,"column":17},"end":{"line":371,"column":32}}],"line":371},"70":{"loc":{"start":{"line":377,"column":6},"end":{"line":377,"column":null}},"type":"binary-expr","locations":[{"start":{"line":377,"column":6},"end":{"line":377,"column":19}},{"start":{"line":377,"column":19},"end":{"line":377,"column":null}}],"line":377},"71":{"loc":{"start":{"line":380,"column":9},"end":{"line":391,"column":null}},"type":"cond-expr","locations":[{"start":{"line":381,"column":10},"end":{"line":383,"column":null}},{"start":{"line":385,"column":10},"end":{"line":391,"column":null}}],"line":380},"72":{"loc":{"start":{"line":394,"column":7},"end":{"line":412,"column":null}},"type":"binary-expr","locations":[{"start":{"line":394,"column":7},"end":{"line":394,"column":null}},{"start":{"line":395,"column":8},"end":{"line":412,"column":null}}],"line":394},"73":{"loc":{"start":{"line":396,"column":11},"end":{"line":410,"column":null}},"type":"cond-expr","locations":[{"start":{"line":397,"column":12},"end":{"line":408,"column":null}},{"start":{"line":410,"column":12},"end":{"line":410,"column":null}}],"line":396},"74":{"loc":{"start":{"line":400,"column":34},"end":{"line":400,"column":null}},"type":"cond-expr","locations":[{"start":{"line":400,"column":56},"end":{"line":400,"column":79}},{"start":{"line":400,"column":79},"end":{"line":400,"column":null}}],"line":400},"75":{"loc":{"start":{"line":401,"column":34},"end":{"line":401,"column":null}},"type":"cond-expr","locations":[{"start":{"line":401,"column":53},"end":{"line":401,"column":76}},{"start":{"line":401,"column":76},"end":{"line":401,"column":null}}],"line":401},"76":{"loc":{"start":{"line":402,"column":31},"end":{"line":402,"column":null}},"type":"cond-expr","locations":[{"start":{"line":402,"column":47},"end":{"line":402,"column":67}},{"start":{"line":402,"column":67},"end":{"line":402,"column":null}}],"line":402},"77":{"loc":{"start":{"line":405,"column":124},"end":{"line":405,"column":171}},"type":"cond-expr","locations":[{"start":{"line":405,"column":140},"end":{"line":405,"column":160}},{"start":{"line":405,"column":160},"end":{"line":405,"column":171}}],"line":405}},"s":{"0":3,"1":30,"2":42,"3":28,"4":28,"5":28,"6":0,"7":28,"8":28,"9":56,"10":29,"11":29,"12":29,"13":28,"14":28,"15":10,"16":10,"17":0,"18":10,"19":10,"20":0,"21":10,"22":28,"23":0,"24":28,"25":28,"26":28,"27":28,"28":28,"29":28,"30":28,"31":28,"32":28,"33":28,"34":1,"35":16,"36":16,"37":16,"38":16,"39":16,"40":16,"41":118,"42":42,"43":42,"44":28,"45":14,"46":0,"47":0,"48":0,"49":42,"50":42,"51":16,"52":16,"53":6,"54":16,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":16,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":16,"71":28,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":41,"82":40,"83":24,"84":16,"85":16,"86":16,"87":16,"88":16,"89":6,"90":4,"91":2,"92":2,"93":0,"94":2,"95":2,"96":2,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":16,"105":2,"106":2,"107":2,"108":2,"109":1,"110":9,"111":9,"112":9,"113":0,"114":9,"115":9,"116":0,"117":9,"118":9,"119":0,"120":0,"121":0,"122":0,"123":16,"124":9,"125":1,"126":24,"127":41,"128":41,"129":26,"130":41,"131":0,"132":0,"133":41,"134":0,"135":0,"136":41,"137":0,"138":0,"139":41},"f":{"0":30,"1":42,"2":28,"3":56,"4":29,"5":28,"6":10,"7":28,"8":28,"9":1,"10":16,"11":16,"12":118,"13":42,"14":0,"15":42,"16":16,"17":6,"18":0,"19":0,"20":28,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":41,"28":40,"29":6,"30":16,"31":2,"32":1,"33":9,"34":16,"35":9,"36":1,"37":24,"38":41,"39":26,"40":0,"41":0,"42":0},"b":{"0":[30,2,30],"1":[0,28],"2":[28,0],"3":[0,29],"4":[0,10],"5":[0,10],"6":[0,28],"7":[28,28],"8":[28,28],"9":[28,28],"10":[28,28],"11":[0,28],"12":[0,28],"13":[0,28],"14":[0,28],"15":[0,28],"16":[0,28],"17":[0,28],"18":[28,0],"19":[28,0],"20":[28,0,0],"21":[0,28],"22":[118,118,76],"23":[28,14],"24":[42,42],"25":[0,14],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0,0],"30":[0,0],"31":[0,0],"32":[2,14],"33":[0,16],"34":[0,0],"35":[0,16],"36":[0,16],"37":[24,16],"38":[4,2],"39":[0,2],"40":[2,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[16,2],"45":[14,2],"46":[2,0],"47":[2,0],"48":[2,2],"49":[0,2],"50":[0,2],"51":[0,2],"52":[0,2],"53":[2,0],"54":[2,0],"55":[2,0,0],"56":[2,2],"57":[0,2],"58":[0,9],"59":[0,9],"60":[9,0],"61":[0,0],"62":[13,3],"63":[9,9],"64":[0,0],"65":[0,0],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[41,1],"71":[1,40],"72":[41,40],"73":[16,24],"74":[0,16],"75":[0,16],"76":[0,16],"77":[0,16]},"meta":{"lastBranch":78,"lastFunction":43,"lastStatement":140,"seen":{"s:13:83:22:Infinity":0,"f:24:9:24:21":0,"s:25:2:25:Infinity":1,"b:25:10:25:17:25:17:25:40:25:40:25:Infinity":0,"f:46:9:46:20":1,"s:47:2:47:Infinity":2,"f:51:9:51:25":2,"s:52:16:52:Infinity":3,"s:53:18:53:Infinity":4,"b:54:2:54:Infinity:undefined:undefined:undefined:undefined":1,"s:54:2:54:Infinity":5,"s:54:22:54:Infinity":6,"s:55:15:55:Infinity":7,"b:55:15:55:41:55:41:55:Infinity":2,"s:56:2:56:Infinity":8,"f:56:50:56:51":3,"s:56:57:56:72":9,"f:60:9:60:24":4,"s:61:16:61:Infinity":10,"s:62:18:62:Infinity":11,"s:63:2:63:Infinity":12,"b:63:26:63:52:63:52:63:Infinity":3,"f:66:9:66:20":5,"s:67:17:67:Infinity":13,"s:68:2:74:Infinity":14,"f:68:22:68:23":6,"s:69:17:69:Infinity":15,"b:70:4:70:Infinity:undefined:undefined:undefined:undefined":4,"s:70:4:70:Infinity":16,"s:70:25:70:Infinity":17,"s:71:21:71:Infinity":18,"b:72:4:72:Infinity:undefined:undefined:undefined:undefined":5,"s:72:4:72:Infinity":19,"s:72:46:72:Infinity":20,"s:73:4:73:Infinity":21,"f:78:9:78:27":7,"b:79:2:79:Infinity:undefined:undefined:undefined:undefined":6,"s:79:2:79:Infinity":22,"s:79:25:79:Infinity":23,"s:80:2:117:Infinity":24,"f:84:18:84:19":8,"s:85:27:85:Infinity":25,"s:86:26:86:Infinity":26,"b:86:26:86:43:86:43:86:Infinity":7,"s:87:29:87:Infinity":27,"b:87:29:87:51:87:51:87:Infinity":8,"s:88:28:88:Infinity":28,"b:88:28:88:49:88:49:88:Infinity":9,"s:89:27:89:Infinity":29,"b:89:27:89:41:89:41:89:Infinity":10,"s:90:24:90:Infinity":30,"b:90:24:90:58:90:58:90:Infinity":11,"s:91:26:91:Infinity":31,"b:91:26:91:65:91:65:91:Infinity":12,"s:92:27:92:Infinity":32,"s:93:10:113:Infinity":33,"b:98:39:98:56:98:56:98:Infinity":13,"b:99:34:99:62:99:62:99:Infinity":14,"b:101:36:101:42:101:42:101:Infinity":15,"f:103:23:103:29":9,"s:103:29:103:Infinity":34,"b:104:33:104:45:104:45:104:Infinity":16,"b:104:58:104:71:104:71:104:Infinity":17,"b:107:17:107:30:107:30:107:Infinity":18,"b:109:17:109:30:109:30:109:Infinity":19,"b:110:17:110:31:110:31:110:45:110:45:110:Infinity":20,"b:112:95:112:123:112:123:112:129":21,"f:121:9:121:35":10,"s:129:30:129:Infinity":35,"s:130:26:130:Infinity":36,"s:131:32:131:Infinity":37,"s:132:8:132:Infinity":38,"s:134:8:144:Infinity":39,"f:134:38:134:44":11,"s:135:4:143:Infinity":40,"f:136:14:136:15":12,"s:136:32:136:106":41,"b:136:32:136:51:136:51:136:81:136:76:136:106":22,"f:137:11:137:12":13,"s:138:31:138:Infinity":42,"b:139:8:140:Infinity:139:75:140:Infinity":23,"s:139:8:140:Infinity":43,"b:139:12:139:41:139:41:139:60":24,"s:139:60:139:Infinity":44,"b:139:75:140:Infinity:undefined:undefined:undefined:undefined":25,"s:139:75:140:Infinity":45,"s:140:39:140:Infinity":46,"f:140:53:140:58":14,"b:140:60:140:117:undefined:undefined:undefined:undefined":26,"s:140:60:140:117":47,"b:140:64:140:89:140:89:140:104":27,"s:140:104:140:117":48,"s:141:8:141:Infinity":49,"f:143:14:143:15":15,"s:143:28:143:43":50,"s:147:8:147:Infinity":51,"f:147:29:147:35":16,"s:147:35:147:62":52,"f:147:47:147:52":17,"s:147:52:147:59":53,"s:149:8:157:Infinity":54,"f:149:32:149:38":18,"s:150:16:150:Infinity":55,"s:151:19:151:Infinity":56,"b:152:4:152:Infinity:undefined:undefined:undefined:undefined":28,"s:152:4:152:Infinity":57,"b:152:8:152:16:152:16:152:27:152:27:152:43":29,"s:152:43:152:Infinity":58,"s:153:4:153:Infinity":59,"s:154:4:154:Infinity":60,"s:155:4:155:Infinity":61,"s:156:4:156:Infinity":62,"s:159:24:162:Infinity":63,"f:159:24:159:25":19,"b:160:4:161:Infinity:160:37:161:Infinity":30,"s:160:4:161:Infinity":64,"s:160:27:160:Infinity":65,"b:160:37:161:Infinity:undefined:undefined:undefined:undefined":31,"s:160:37:161:Infinity":66,"s:161:35:161:55":67,"s:161:55:161:70":68,"s:161:70:161:87":69,"s:164:2:224:Infinity":70,"b:167:8:167:Infinity:169:8:171:Infinity":32,"f:169:32:169:33":20,"s:170:10:170:Infinity":71,"b:175:8:213:Infinity:215:8:222:Infinity":33,"f:177:28:177:33":21,"s:177:33:177:61":72,"f:186:22:186:27":22,"s:186:27:186:Infinity":73,"f:194:22:194:27":23,"s:194:27:194:Infinity":74,"b:201:24:201:42:201:42:201:Infinity":34,"f:208:23:208:29":24,"s:208:31:208:51":75,"s:208:51:208:66":76,"s:208:66:208:83":77,"b:217:96:217:100:217:100:217:105":35,"b:217:129:217:141:217:141:217:155":36,"f:219:19:219:25":25,"s:219:27:219:46":78,"s:219:46:219:96":79,"f:219:57:219:63":26,"s:219:63:219:93":80,"f:228:9:228:22":27,"s:229:2:248:Infinity":81,"f:229:17:229:23":28,"b:230:4:230:Infinity:undefined:undefined:undefined:undefined":37,"s:230:4:230:Infinity":82,"s:230:16:230:Infinity":83,"s:231:18:231:Infinity":84,"s:232:17:232:Infinity":85,"s:233:20:233:Infinity":86,"s:234:21:234:Infinity":87,"s:236:4:247:Infinity":88,"f:236:26:236:27":29,"b:237:6:237:Infinity:undefined:undefined:undefined:undefined":38,"s:237:6:237:Infinity":89,"s:237:33:237:Infinity":90,"s:238:22:238:Infinity":91,"b:239:6:239:Infinity:undefined:undefined:undefined:undefined":39,"s:239:6:239:Infinity":92,"s:239:20:239:Infinity":93,"s:240:6:242:Infinity":94,"b:241:8:241:Infinity:undefined:undefined:undefined:undefined":40,"s:241:8:241:Infinity":95,"s:241:42:241:Infinity":96,"b:243:6:243:Infinity:undefined:undefined:undefined:undefined":41,"s:243:6:243:Infinity":97,"s:243:43:243:Infinity":98,"b:244:6:244:Infinity:undefined:undefined:undefined:undefined":42,"s:244:6:244:Infinity":99,"s:244:47:244:Infinity":100,"b:245:6:245:Infinity:undefined:undefined:undefined:undefined":43,"s:245:6:245:Infinity":101,"s:245:46:245:Infinity":102,"s:246:6:246:Infinity":103,"f:251:9:251:24":30,"s:252:2:285:Infinity":104,"b:255:19:255:43:255:43:255:Infinity":44,"b:258:8:258:Infinity:260:8:283:Infinity":45,"f:261:25:261:26":31,"s:262:26:262:Infinity":105,"b:262:28:262:56:262:56:262:Infinity":46,"s:263:29:263:Infinity":106,"b:263:41:263:50:263:50:263:59":47,"s:264:29:264:Infinity":107,"b:264:29:264:43:264:43:264:Infinity":48,"s:265:12:280:Infinity":108,"b:269:43:269:71:269:71:269:78":49,"b:269:98:269:104:269:104:269:106":50,"f:270:25:270:31":32,"s:270:31:270:Infinity":109,"b:271:35:271:47:271:47:271:Infinity":51,"b:271:60:271:73:271:73:271:Infinity":52,"b:274:19:274:32:274:32:274:Infinity":53,"b:276:19:276:32:276:32:276:Infinity":54,"b:277:19:277:33:277:33:277:47:277:47:277:Infinity":55,"b:279:17:279:26:279:26:279:Infinity":56,"b:279:107:279:135:279:135:279:141":57,"f:289:9:289:28":33,"s:290:14:290:Infinity":110,"s:291:15:291:Infinity":111,"b:292:2:292:Infinity:undefined:undefined:undefined:undefined":58,"s:292:2:292:Infinity":112,"s:292:20:292:Infinity":113,"s:293:15:293:Infinity":114,"b:294:2:294:Infinity:undefined:undefined:undefined:undefined":59,"s:294:2:294:Infinity":115,"s:294:18:294:Infinity":116,"b:295:2:295:Infinity:undefined:undefined:undefined:undefined":60,"s:295:2:295:Infinity":117,"s:295:17:295:Infinity":118,"s:296:17:296:Infinity":119,"b:297:2:297:Infinity:undefined:undefined:undefined:undefined":61,"s:297:2:297:Infinity":120,"s:297:20:297:Infinity":121,"s:298:2:298:Infinity":122,"f:301:9:301:25":34,"s:302:2:330:Infinity":123,"b:306:8:306:Infinity:308:8:328:Infinity":62,"f:309:23:309:24":35,"s:310:12:326:Infinity":124,"f:315:27:315:33":36,"s:315:33:315:Infinity":125,"b:323:15:323:Infinity:324:16:324:Infinity":63,"f:334:9:334:26":37,"s:335:2:351:Infinity":126,"f:355:16:355:26":38,"s:359:20:359:Infinity":127,"s:360:8:360:Infinity":128,"f:360:30:360:36":39,"s:360:30:360:63":129,"s:362:8:364:Infinity":130,"f:362:43:362:44":40,"b:363:4:363:Infinity:undefined:undefined:undefined:undefined":64,"s:363:4:363:Infinity":131,"b:363:8:363:17:363:17:363:38":65,"s:363:38:363:Infinity":132,"s:366:8:368:Infinity":133,"f:366:43:366:44":41,"b:367:4:367:Infinity:undefined:undefined:undefined:undefined":66,"s:367:4:367:Infinity":134,"b:367:8:367:17:367:17:367:35":67,"s:367:35:367:Infinity":135,"s:370:8:372:Infinity":136,"f:370:40:370:41":42,"b:371:4:371:Infinity:undefined:undefined:undefined:undefined":68,"s:371:4:371:Infinity":137,"b:371:8:371:17:371:17:371:32":69,"s:371:32:371:Infinity":138,"s:374:2:414:Infinity":139,"b:377:6:377:19:377:19:377:Infinity":70,"b:381:10:383:Infinity:385:10:391:Infinity":71,"b:394:7:394:Infinity:395:8:412:Infinity":72,"b:397:12:408:Infinity:410:12:410:Infinity":73,"b:400:56:400:79:400:79:400:Infinity":74,"b:401:53:401:76:401:76:401:Infinity":75,"b:402:47:402:67:402:67:402:Infinity":76,"b:405:140:405:160:405:160:405:171":77}}} +,"/Users/luca/Workspace/laputa-app/src/components/NoteList.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/NoteList.tsx","statementMap":{"0":{"start":{"line":15,"column":83},"end":{"line":24,"column":null}},"1":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},"2":{"start":{"line":27,"column":18},"end":{"line":27,"column":null}},"3":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"4":{"start":{"line":47,"column":2},"end":{"line":47,"column":null}},"5":{"start":{"line":47,"column":11},"end":{"line":47,"column":null}},"6":{"start":{"line":48,"column":14},"end":{"line":48,"column":null}},"7":{"start":{"line":49,"column":15},"end":{"line":49,"column":null}},"8":{"start":{"line":50,"column":2},"end":{"line":53,"column":null}},"9":{"start":{"line":51,"column":17},"end":{"line":51,"column":null}},"10":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"11":{"start":{"line":54,"column":2},"end":{"line":54,"column":null}},"12":{"start":{"line":54,"column":17},"end":{"line":54,"column":null}},"13":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"14":{"start":{"line":55,"column":19},"end":{"line":55,"column":null}},"15":{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},"16":{"start":{"line":56,"column":20},"end":{"line":56,"column":null}},"17":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"18":{"start":{"line":57,"column":21},"end":{"line":57,"column":null}},"19":{"start":{"line":58,"column":15},"end":{"line":58,"column":null}},"20":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"21":{"start":{"line":63,"column":2},"end":{"line":63,"column":null}},"22":{"start":{"line":67,"column":15},"end":{"line":67,"column":null}},"23":{"start":{"line":68,"column":19},"end":{"line":68,"column":null}},"24":{"start":{"line":69,"column":2},"end":{"line":73,"column":null}},"25":{"start":{"line":70,"column":16},"end":{"line":70,"column":null}},"26":{"start":{"line":71,"column":18},"end":{"line":71,"column":null}},"27":{"start":{"line":72,"column":4},"end":{"line":72,"column":null}},"28":{"start":{"line":77,"column":2},"end":{"line":90,"column":null}},"29":{"start":{"line":80,"column":18},"end":{"line":80,"column":null}},"30":{"start":{"line":81,"column":20},"end":{"line":81,"column":null}},"31":{"start":{"line":82,"column":6},"end":{"line":88,"column":null}},"32":{"start":{"line":83,"column":21},"end":{"line":83,"column":null}},"33":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"34":{"start":{"line":84,"column":28},"end":{"line":84,"column":null}},"35":{"start":{"line":85,"column":25},"end":{"line":85,"column":null}},"36":{"start":{"line":86,"column":8},"end":{"line":86,"column":null}},"37":{"start":{"line":86,"column":49},"end":{"line":86,"column":null}},"38":{"start":{"line":87,"column":8},"end":{"line":87,"column":null}},"39":{"start":{"line":90,"column":36},"end":{"line":90,"column":51}},"40":{"start":{"line":94,"column":2},"end":{"line":94,"column":null}},"41":{"start":{"line":99,"column":68},"end":{"line":104,"column":null}},"42":{"start":{"line":106,"column":45},"end":{"line":111,"column":null}},"43":{"start":{"line":114,"column":2},"end":{"line":128,"column":null}},"44":{"start":{"line":116,"column":6},"end":{"line":116,"column":null}},"45":{"start":{"line":118,"column":6},"end":{"line":118,"column":null}},"46":{"start":{"line":118,"column":17},"end":{"line":118,"column":null}},"47":{"start":{"line":120,"column":6},"end":{"line":120,"column":null}},"48":{"start":{"line":120,"column":23},"end":{"line":120,"column":null}},"49":{"start":{"line":122,"column":6},"end":{"line":127,"column":null}},"50":{"start":{"line":123,"column":19},"end":{"line":123,"column":null}},"51":{"start":{"line":124,"column":19},"end":{"line":124,"column":null}},"52":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"53":{"start":{"line":125,"column":23},"end":{"line":125,"column":null}},"54":{"start":{"line":126,"column":8},"end":{"line":126,"column":null}},"55":{"start":{"line":131,"column":25},"end":{"line":131,"column":null}},"56":{"start":{"line":134,"column":2},"end":{"line":139,"column":null}},"57":{"start":{"line":135,"column":16},"end":{"line":135,"column":null}},"58":{"start":{"line":136,"column":4},"end":{"line":136,"column":null}},"59":{"start":{"line":138,"column":4},"end":{"line":138,"column":null}},"60":{"start":{"line":143,"column":2},"end":{"line":145,"column":null}},"61":{"start":{"line":144,"column":4},"end":{"line":144,"column":null}},"62":{"start":{"line":149,"column":15},"end":{"line":149,"column":null}},"63":{"start":{"line":150,"column":19},"end":{"line":150,"column":null}},"64":{"start":{"line":151,"column":18},"end":{"line":151,"column":null}},"65":{"start":{"line":153,"column":2},"end":{"line":164,"column":null}},"66":{"start":{"line":154,"column":4},"end":{"line":154,"column":null}},"67":{"start":{"line":154,"column":32},"end":{"line":154,"column":null}},"68":{"start":{"line":155,"column":20},"end":{"line":155,"column":null}},"69":{"start":{"line":156,"column":4},"end":{"line":156,"column":null}},"70":{"start":{"line":156,"column":18},"end":{"line":156,"column":null}},"71":{"start":{"line":157,"column":4},"end":{"line":159,"column":null}},"72":{"start":{"line":158,"column":6},"end":{"line":158,"column":null}},"73":{"start":{"line":158,"column":40},"end":{"line":158,"column":null}},"74":{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},"75":{"start":{"line":160,"column":41},"end":{"line":160,"column":null}},"76":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"77":{"start":{"line":161,"column":45},"end":{"line":161,"column":null}},"78":{"start":{"line":162,"column":4},"end":{"line":162,"column":null}},"79":{"start":{"line":162,"column":44},"end":{"line":162,"column":null}},"80":{"start":{"line":163,"column":4},"end":{"line":163,"column":null}},"81":{"start":{"line":173,"column":17},"end":{"line":173,"column":null}},"82":{"start":{"line":173,"column":39},"end":{"line":173,"column":56}},"83":{"start":{"line":174,"column":2},"end":{"line":177,"column":null}},"84":{"start":{"line":175,"column":4},"end":{"line":175,"column":null}},"85":{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},"86":{"start":{"line":176,"column":26},"end":{"line":176,"column":42}},"87":{"start":{"line":185,"column":38},"end":{"line":185,"column":null}},"88":{"start":{"line":186,"column":15},"end":{"line":186,"column":null}},"89":{"start":{"line":187,"column":15},"end":{"line":187,"column":null}},"90":{"start":{"line":190,"column":2},"end":{"line":195,"column":null}},"91":{"start":{"line":191,"column":22},"end":{"line":193,"column":null}},"92":{"start":{"line":192,"column":21},"end":{"line":192,"column":64}},"93":{"start":{"line":194,"column":4},"end":{"line":194,"column":null}},"94":{"start":{"line":198,"column":18},"end":{"line":198,"column":null}},"95":{"start":{"line":199,"column":2},"end":{"line":201,"column":null}},"96":{"start":{"line":200,"column":4},"end":{"line":200,"column":null}},"97":{"start":{"line":204,"column":19},"end":{"line":206,"column":null}},"98":{"start":{"line":205,"column":19},"end":{"line":205,"column":91}},"99":{"start":{"line":207,"column":2},"end":{"line":207,"column":null}},"100":{"start":{"line":210,"column":17},"end":{"line":217,"column":null}},"101":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"102":{"start":{"line":218,"column":2},"end":{"line":218,"column":null}},"103":{"start":{"line":221,"column":20},"end":{"line":221,"column":null}},"104":{"start":{"line":222,"column":2},"end":{"line":224,"column":null}},"105":{"start":{"line":223,"column":4},"end":{"line":223,"column":null}},"106":{"start":{"line":227,"column":22},"end":{"line":227,"column":null}},"107":{"start":{"line":228,"column":20},"end":{"line":230,"column":null}},"108":{"start":{"line":229,"column":19},"end":{"line":229,"column":68}},"109":{"start":{"line":230,"column":20},"end":{"line":230,"column":38}},"110":{"start":{"line":231,"column":2},"end":{"line":236,"column":null}},"111":{"start":{"line":232,"column":17},"end":{"line":232,"column":null}},"112":{"start":{"line":233,"column":4},"end":{"line":235,"column":null}},"113":{"start":{"line":234,"column":6},"end":{"line":234,"column":null}},"114":{"start":{"line":239,"column":23},"end":{"line":241,"column":null}},"115":{"start":{"line":240,"column":19},"end":{"line":240,"column":91}},"116":{"start":{"line":242,"column":2},"end":{"line":242,"column":null}},"117":{"start":{"line":245,"column":20},"end":{"line":247,"column":null}},"118":{"start":{"line":246,"column":19},"end":{"line":246,"column":36}},"119":{"start":{"line":248,"column":2},"end":{"line":248,"column":null}},"120":{"start":{"line":250,"column":2},"end":{"line":250,"column":null}},"121":{"start":{"line":254,"column":2},"end":{"line":275,"column":null}},"122":{"start":{"line":256,"column":6},"end":{"line":265,"column":null}},"123":{"start":{"line":258,"column":10},"end":{"line":258,"column":null}},"124":{"start":{"line":258,"column":39},"end":{"line":258,"column":64}},"125":{"start":{"line":260,"column":10},"end":{"line":260,"column":null}},"126":{"start":{"line":262,"column":10},"end":{"line":262,"column":null}},"127":{"start":{"line":262,"column":39},"end":{"line":262,"column":63}},"128":{"start":{"line":264,"column":10},"end":{"line":264,"column":null}},"129":{"start":{"line":264,"column":39},"end":{"line":264,"column":48}},"130":{"start":{"line":266,"column":6},"end":{"line":266,"column":null}},"131":{"start":{"line":268,"column":6},"end":{"line":268,"column":null}},"132":{"start":{"line":268,"column":35},"end":{"line":268,"column":88}},"133":{"start":{"line":270,"column":6},"end":{"line":270,"column":null}},"134":{"start":{"line":272,"column":20},"end":{"line":272,"column":null}},"135":{"start":{"line":273,"column":6},"end":{"line":273,"column":null}},"136":{"start":{"line":273,"column":35},"end":{"line":273,"column":93}},"137":{"start":{"line":287,"column":22},"end":{"line":287,"column":null}},"138":{"start":{"line":288,"column":8},"end":{"line":288,"column":null}},"139":{"start":{"line":290,"column":2},"end":{"line":297,"column":null}},"140":{"start":{"line":291,"column":4},"end":{"line":291,"column":null}},"141":{"start":{"line":291,"column":15},"end":{"line":291,"column":null}},"142":{"start":{"line":293,"column":6},"end":{"line":293,"column":null}},"143":{"start":{"line":293,"column":66},"end":{"line":293,"column":null}},"144":{"start":{"line":295,"column":4},"end":{"line":295,"column":null}},"145":{"start":{"line":296,"column":4},"end":{"line":296,"column":null}},"146":{"start":{"line":296,"column":17},"end":{"line":296,"column":null}},"147":{"start":{"line":299,"column":2},"end":{"line":343,"column":null}},"148":{"start":{"line":306,"column":26},"end":{"line":306,"column":47}},"149":{"start":{"line":306,"column":47},"end":{"line":306,"column":62}},"150":{"start":{"line":311,"column":76},"end":{"line":311,"column":95}},"151":{"start":{"line":320,"column":12},"end":{"line":339,"column":null}},"152":{"start":{"line":328,"column":16},"end":{"line":328,"column":null}},"153":{"start":{"line":329,"column":16},"end":{"line":329,"column":null}},"154":{"start":{"line":330,"column":16},"end":{"line":330,"column":null}},"155":{"start":{"line":348,"column":26},"end":{"line":348,"column":null}},"156":{"start":{"line":349,"column":40},"end":{"line":349,"column":null}},"157":{"start":{"line":350,"column":44},"end":{"line":350,"column":null}},"158":{"start":{"line":351,"column":32},"end":{"line":351,"column":null}},"159":{"start":{"line":353,"column":23},"end":{"line":353,"column":null}},"160":{"start":{"line":354,"column":25},"end":{"line":354,"column":null}},"161":{"start":{"line":355,"column":22},"end":{"line":355,"column":null}},"162":{"start":{"line":357,"column":8},"end":{"line":363,"column":null}},"163":{"start":{"line":358,"column":4},"end":{"line":362,"column":null}},"164":{"start":{"line":359,"column":19},"end":{"line":359,"column":null}},"165":{"start":{"line":360,"column":6},"end":{"line":360,"column":null}},"166":{"start":{"line":361,"column":6},"end":{"line":361,"column":null}},"167":{"start":{"line":365,"column":8},"end":{"line":372,"column":null}},"168":{"start":{"line":366,"column":4},"end":{"line":371,"column":null}},"169":{"start":{"line":367,"column":19},"end":{"line":367,"column":null}},"170":{"start":{"line":368,"column":6},"end":{"line":369,"column":null}},"171":{"start":{"line":368,"column":27},"end":{"line":368,"column":null}},"172":{"start":{"line":369,"column":11},"end":{"line":369,"column":null}},"173":{"start":{"line":370,"column":6},"end":{"line":370,"column":null}},"174":{"start":{"line":375,"column":8},"end":{"line":381,"column":null}},"175":{"start":{"line":376,"column":44},"end":{"line":376,"column":null}},"176":{"start":{"line":377,"column":4},"end":{"line":379,"column":null}},"177":{"start":{"line":378,"column":6},"end":{"line":378,"column":null}},"178":{"start":{"line":378,"column":28},"end":{"line":378,"column":null}},"179":{"start":{"line":380,"column":4},"end":{"line":380,"column":null}},"180":{"start":{"line":384,"column":8},"end":{"line":388,"column":null}},"181":{"start":{"line":385,"column":4},"end":{"line":385,"column":null}},"182":{"start":{"line":385,"column":25},"end":{"line":385,"column":null}},"183":{"start":{"line":386,"column":22},"end":{"line":386,"column":null}},"184":{"start":{"line":387,"column":4},"end":{"line":387,"column":null}},"185":{"start":{"line":387,"column":31},"end":{"line":387,"column":71}},"186":{"start":{"line":390,"column":8},"end":{"line":393,"column":null}},"187":{"start":{"line":391,"column":10},"end":{"line":391,"column":null}},"188":{"start":{"line":395,"column":8},"end":{"line":398,"column":null}},"189":{"start":{"line":396,"column":10},"end":{"line":396,"column":null}},"190":{"start":{"line":400,"column":19},"end":{"line":400,"column":null}},"191":{"start":{"line":402,"column":8},"end":{"line":405,"column":null}},"192":{"start":{"line":403,"column":10},"end":{"line":403,"column":null}},"193":{"start":{"line":407,"column":16},"end":{"line":407,"column":null}},"194":{"start":{"line":409,"column":8},"end":{"line":412,"column":null}},"195":{"start":{"line":410,"column":10},"end":{"line":410,"column":null}},"196":{"start":{"line":410,"column":39},"end":{"line":410,"column":76}},"197":{"start":{"line":414,"column":8},"end":{"line":424,"column":null}},"198":{"start":{"line":415,"column":10},"end":{"line":422,"column":null}},"199":{"start":{"line":417,"column":23},"end":{"line":420,"column":12}},"200":{"start":{"line":419,"column":45},"end":{"line":419,"column":82}},"201":{"start":{"line":421,"column":25},"end":{"line":421,"column":45}},"202":{"start":{"line":427,"column":8},"end":{"line":431,"column":null}},"203":{"start":{"line":428,"column":4},"end":{"line":428,"column":null}},"204":{"start":{"line":428,"column":22},"end":{"line":428,"column":null}},"205":{"start":{"line":429,"column":16},"end":{"line":429,"column":null}},"206":{"start":{"line":430,"column":4},"end":{"line":430,"column":null}},"207":{"start":{"line":430,"column":34},"end":{"line":430,"column":82}},"208":{"start":{"line":433,"column":8},"end":{"line":498,"column":null}},"209":{"start":{"line":434,"column":23},"end":{"line":434,"column":null}},"210":{"start":{"line":435,"column":15},"end":{"line":435,"column":null}},"211":{"start":{"line":436,"column":10},"end":{"line":436,"column":null}},"212":{"start":{"line":437,"column":10},"end":{"line":437,"column":null}},"213":{"start":{"line":438,"column":21},"end":{"line":438,"column":null}},"214":{"start":{"line":439,"column":4},"end":{"line":496,"column":null}},"215":{"start":{"line":455,"column":23},"end":{"line":455,"column":null}},"216":{"start":{"line":500,"column":8},"end":{"line":580,"column":null}},"217":{"start":{"line":501,"column":16},"end":{"line":501,"column":null}},"218":{"start":{"line":502,"column":10},"end":{"line":502,"column":null}},"219":{"start":{"line":503,"column":10},"end":{"line":503,"column":null}},"220":{"start":{"line":504,"column":23},"end":{"line":504,"column":null}},"221":{"start":{"line":505,"column":4},"end":{"line":578,"column":null}},"222":{"start":{"line":511,"column":25},"end":{"line":511,"column":null}},"223":{"start":{"line":538,"column":37},"end":{"line":538,"column":null}},"224":{"start":{"line":539,"column":30},"end":{"line":539,"column":null}},"225":{"start":{"line":540,"column":34},"end":{"line":540,"column":null}},"226":{"start":{"line":541,"column":12},"end":{"line":574,"column":null}},"227":{"start":{"line":549,"column":35},"end":{"line":549,"column":null}},"228":{"start":{"line":564,"column":37},"end":{"line":564,"column":null}},"229":{"start":{"line":573,"column":72},"end":{"line":573,"column":94}},"230":{"start":{"line":582,"column":2},"end":{"line":697,"column":null}},"231":{"start":{"line":607,"column":29},"end":{"line":607,"column":63}},"232":{"start":{"line":607,"column":63},"end":{"line":607,"column":96}},"233":{"start":{"line":607,"column":82},"end":{"line":607,"column":96}},"234":{"start":{"line":628,"column":29},"end":{"line":628,"column":null}},"235":{"start":{"line":638,"column":25},"end":{"line":638,"column":null}},"236":{"start":{"line":639,"column":10},"end":{"line":639,"column":null}},"237":{"start":{"line":644,"column":26},"end":{"line":644,"column":null}},"238":{"start":{"line":645,"column":20},"end":{"line":645,"column":null}},"239":{"start":{"line":646,"column":20},"end":{"line":646,"column":null}},"240":{"start":{"line":647,"column":29},"end":{"line":647,"column":null}},"241":{"start":{"line":648,"column":14},"end":{"line":667,"column":null}},"242":{"start":{"line":652,"column":33},"end":{"line":652,"column":null}},"243":{"start":{"line":692,"column":38},"end":{"line":692,"column":55}},"244":{"start":{"line":701,"column":13},"end":{"line":701,"column":null}}},"fnMap":{"0":{"name":"getTypeIcon","decl":{"start":{"line":26,"column":9},"end":{"line":26,"column":21}},"loc":{"start":{"line":26,"column":114},"end":{"line":29,"column":null}},"line":26},"1":{"name":"relativeDate","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":22}},"loc":{"start":{"line":46,"column":49},"end":{"line":60,"column":null}},"line":46},"2":{"name":"getDisplayDate","decl":{"start":{"line":62,"column":9},"end":{"line":62,"column":24}},"loc":{"start":{"line":62,"column":58},"end":{"line":64,"column":null}},"line":62},"3":{"name":"refsMatch","decl":{"start":{"line":66,"column":9},"end":{"line":66,"column":19}},"loc":{"start":{"line":66,"column":63},"end":{"line":74,"column":null}},"line":66},"4":{"name":"(anonymous_4)","decl":{"start":{"line":69,"column":19},"end":{"line":69,"column":20}},"loc":{"start":{"line":69,"column":28},"end":{"line":73,"column":3}},"line":69},"5":{"name":"resolveRefs","decl":{"start":{"line":76,"column":9},"end":{"line":76,"column":21}},"loc":{"start":{"line":76,"column":74},"end":{"line":91,"column":null}},"line":76},"6":{"name":"(anonymous_6)","decl":{"start":{"line":78,"column":9},"end":{"line":78,"column":10}},"loc":{"start":{"line":78,"column":18},"end":{"line":89,"column":5}},"line":78},"7":{"name":"(anonymous_7)","decl":{"start":{"line":82,"column":26},"end":{"line":82,"column":27}},"loc":{"start":{"line":82,"column":33},"end":{"line":88,"column":7}},"line":82},"8":{"name":"(anonymous_8)","decl":{"start":{"line":90,"column":12},"end":{"line":90,"column":13}},"loc":{"start":{"line":90,"column":36},"end":{"line":90,"column":51}},"line":90},"9":{"name":"sortByModified","decl":{"start":{"line":93,"column":16},"end":{"line":93,"column":31}},"loc":{"start":{"line":93,"column":69},"end":{"line":95,"column":null}},"line":93},"10":{"name":"getSortComparator","decl":{"start":{"line":113,"column":16},"end":{"line":113,"column":34}},"loc":{"start":{"line":113,"column":96},"end":{"line":129,"column":null}},"line":113},"11":{"name":"(anonymous_11)","decl":{"start":{"line":118,"column":13},"end":{"line":118,"column":14}},"loc":{"start":{"line":118,"column":17},"end":{"line":118,"column":null}},"line":118},"12":{"name":"(anonymous_12)","decl":{"start":{"line":120,"column":13},"end":{"line":120,"column":14}},"loc":{"start":{"line":120,"column":23},"end":{"line":120,"column":null}},"line":120},"13":{"name":"(anonymous_13)","decl":{"start":{"line":122,"column":13},"end":{"line":122,"column":14}},"loc":{"start":{"line":122,"column":23},"end":{"line":127,"column":null}},"line":122},"14":{"name":"loadSortPreferences","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":59}},"loc":{"start":{"line":133,"column":59},"end":{"line":140,"column":null}},"line":133},"15":{"name":"saveSortPreferences","decl":{"start":{"line":142,"column":9},"end":{"line":142,"column":29}},"loc":{"start":{"line":142,"column":64},"end":{"line":146,"column":null}},"line":142},"16":{"name":"findBacklinks","decl":{"start":{"line":148,"column":9},"end":{"line":148,"column":23}},"loc":{"start":{"line":148,"column":119},"end":{"line":165,"column":null}},"line":148},"17":{"name":"(anonymous_17)","decl":{"start":{"line":153,"column":27},"end":{"line":153,"column":28}},"loc":{"start":{"line":153,"column":34},"end":{"line":164,"column":3}},"line":153},"18":{"name":"addGroup","decl":{"start":{"line":167,"column":9},"end":{"line":167,"column":null}},"loc":{"start":{"line":172,"column":2},"end":{"line":178,"column":null}},"line":172},"19":{"name":"(anonymous_19)","decl":{"start":{"line":173,"column":32},"end":{"line":173,"column":33}},"loc":{"start":{"line":173,"column":39},"end":{"line":173,"column":56}},"line":173},"20":{"name":"(anonymous_20)","decl":{"start":{"line":176,"column":19},"end":{"line":176,"column":20}},"loc":{"start":{"line":176,"column":26},"end":{"line":176,"column":42}},"line":176},"21":{"name":"buildRelationshipGroups","decl":{"start":{"line":180,"column":16},"end":{"line":180,"column":null}},"loc":{"start":{"line":184,"column":23},"end":{"line":251,"column":null}},"line":184},"22":{"name":"(anonymous_22)","decl":{"start":{"line":192,"column":14},"end":{"line":192,"column":15}},"loc":{"start":{"line":192,"column":21},"end":{"line":192,"column":64}},"line":192},"23":{"name":"(anonymous_23)","decl":{"start":{"line":205,"column":12},"end":{"line":205,"column":13}},"loc":{"start":{"line":205,"column":19},"end":{"line":205,"column":91}},"line":205},"24":{"name":"(anonymous_24)","decl":{"start":{"line":212,"column":6},"end":{"line":212,"column":7}},"loc":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"line":213},"25":{"name":"(anonymous_25)","decl":{"start":{"line":229,"column":12},"end":{"line":229,"column":13}},"loc":{"start":{"line":229,"column":19},"end":{"line":229,"column":68}},"line":229},"26":{"name":"(anonymous_26)","decl":{"start":{"line":230,"column":10},"end":{"line":230,"column":11}},"loc":{"start":{"line":230,"column":20},"end":{"line":230,"column":38}},"line":230},"27":{"name":"(anonymous_27)","decl":{"start":{"line":240,"column":12},"end":{"line":240,"column":13}},"loc":{"start":{"line":240,"column":19},"end":{"line":240,"column":91}},"line":240},"28":{"name":"(anonymous_28)","decl":{"start":{"line":246,"column":12},"end":{"line":246,"column":13}},"loc":{"start":{"line":246,"column":19},"end":{"line":246,"column":36}},"line":246},"29":{"name":"filterEntries","decl":{"start":{"line":253,"column":16},"end":{"line":253,"column":30}},"loc":{"start":{"line":253,"column":129},"end":{"line":276,"column":null}},"line":253},"30":{"name":"(anonymous_30)","decl":{"start":{"line":258,"column":32},"end":{"line":258,"column":33}},"loc":{"start":{"line":258,"column":39},"end":{"line":258,"column":64}},"line":258},"31":{"name":"(anonymous_31)","decl":{"start":{"line":262,"column":32},"end":{"line":262,"column":33}},"loc":{"start":{"line":262,"column":39},"end":{"line":262,"column":63}},"line":262},"32":{"name":"(anonymous_32)","decl":{"start":{"line":264,"column":32},"end":{"line":264,"column":33}},"loc":{"start":{"line":264,"column":39},"end":{"line":264,"column":48}},"line":264},"33":{"name":"(anonymous_33)","decl":{"start":{"line":268,"column":28},"end":{"line":268,"column":29}},"loc":{"start":{"line":268,"column":35},"end":{"line":268,"column":88}},"line":268},"34":{"name":"(anonymous_34)","decl":{"start":{"line":273,"column":28},"end":{"line":273,"column":29}},"loc":{"start":{"line":273,"column":35},"end":{"line":273,"column":93}},"line":273},"35":{"name":"SortDropdown","decl":{"start":{"line":278,"column":9},"end":{"line":278,"column":22}},"loc":{"start":{"line":286,"column":3},"end":{"line":345,"column":null}},"line":286},"36":{"name":"(anonymous_36)","decl":{"start":{"line":290,"column":12},"end":{"line":290,"column":18}},"loc":{"start":{"line":290,"column":18},"end":{"line":297,"column":5}},"line":290},"37":{"name":"handleClick","decl":{"start":{"line":292,"column":13},"end":{"line":292,"column":25}},"loc":{"start":{"line":292,"column":40},"end":{"line":294,"column":null}},"line":292},"38":{"name":"(anonymous_38)","decl":{"start":{"line":296,"column":11},"end":{"line":296,"column":17}},"loc":{"start":{"line":296,"column":17},"end":{"line":296,"column":null}},"line":296},"39":{"name":"(anonymous_39)","decl":{"start":{"line":306,"column":17},"end":{"line":306,"column":18}},"loc":{"start":{"line":306,"column":24},"end":{"line":306,"column":null}},"line":306},"40":{"name":"(anonymous_40)","decl":{"start":{"line":311,"column":69},"end":{"line":311,"column":70}},"loc":{"start":{"line":311,"column":76},"end":{"line":311,"column":95}},"line":311},"41":{"name":"(anonymous_41)","decl":{"start":{"line":319,"column":28},"end":{"line":319,"column":29}},"loc":{"start":{"line":320,"column":12},"end":{"line":339,"column":null}},"line":320},"42":{"name":"(anonymous_42)","decl":{"start":{"line":327,"column":23},"end":{"line":327,"column":24}},"loc":{"start":{"line":327,"column":30},"end":{"line":331,"column":null}},"line":327},"43":{"name":"NoteListInner","decl":{"start":{"line":347,"column":9},"end":{"line":347,"column":23}},"loc":{"start":{"line":347,"column":131},"end":{"line":699,"column":null}},"line":347},"44":{"name":"(anonymous_44)","decl":{"start":{"line":357,"column":39},"end":{"line":357,"column":40}},"loc":{"start":{"line":357,"column":83},"end":{"line":363,"column":5}},"line":357},"45":{"name":"(anonymous_45)","decl":{"start":{"line":358,"column":17},"end":{"line":358,"column":18}},"loc":{"start":{"line":358,"column":27},"end":{"line":362,"column":5}},"line":358},"46":{"name":"(anonymous_46)","decl":{"start":{"line":365,"column":34},"end":{"line":365,"column":35}},"loc":{"start":{"line":365,"column":53},"end":{"line":372,"column":5}},"line":365},"47":{"name":"(anonymous_47)","decl":{"start":{"line":366,"column":23},"end":{"line":366,"column":24}},"loc":{"start":{"line":366,"column":33},"end":{"line":371,"column":5}},"line":366},"48":{"name":"(anonymous_48)","decl":{"start":{"line":375,"column":31},"end":{"line":375,"column":37}},"loc":{"start":{"line":375,"column":37},"end":{"line":381,"column":5}},"line":375},"49":{"name":"(anonymous_49)","decl":{"start":{"line":384,"column":31},"end":{"line":384,"column":37}},"loc":{"start":{"line":384,"column":37},"end":{"line":388,"column":5}},"line":384},"50":{"name":"(anonymous_50)","decl":{"start":{"line":387,"column":24},"end":{"line":387,"column":25}},"loc":{"start":{"line":387,"column":31},"end":{"line":387,"column":71}},"line":387},"51":{"name":"(anonymous_51)","decl":{"start":{"line":391,"column":4},"end":{"line":391,"column":10}},"loc":{"start":{"line":391,"column":10},"end":{"line":391,"column":null}},"line":391},"52":{"name":"(anonymous_52)","decl":{"start":{"line":396,"column":4},"end":{"line":396,"column":10}},"loc":{"start":{"line":396,"column":10},"end":{"line":396,"column":null}},"line":396},"53":{"name":"(anonymous_53)","decl":{"start":{"line":403,"column":4},"end":{"line":403,"column":10}},"loc":{"start":{"line":403,"column":10},"end":{"line":403,"column":null}},"line":403},"54":{"name":"(anonymous_54)","decl":{"start":{"line":410,"column":4},"end":{"line":410,"column":10}},"loc":{"start":{"line":410,"column":10},"end":{"line":410,"column":null}},"line":410},"55":{"name":"(anonymous_55)","decl":{"start":{"line":410,"column":32},"end":{"line":410,"column":33}},"loc":{"start":{"line":410,"column":39},"end":{"line":410,"column":76}},"line":410},"56":{"name":"(anonymous_56)","decl":{"start":{"line":415,"column":4},"end":{"line":415,"column":10}},"loc":{"start":{"line":415,"column":10},"end":{"line":422,"column":null}},"line":415},"57":{"name":"(anonymous_57)","decl":{"start":{"line":417,"column":15},"end":{"line":417,"column":16}},"loc":{"start":{"line":417,"column":23},"end":{"line":420,"column":12}},"line":417},"58":{"name":"(anonymous_58)","decl":{"start":{"line":419,"column":38},"end":{"line":419,"column":39}},"loc":{"start":{"line":419,"column":45},"end":{"line":419,"column":82}},"line":419},"59":{"name":"(anonymous_59)","decl":{"start":{"line":421,"column":18},"end":{"line":421,"column":19}},"loc":{"start":{"line":421,"column":25},"end":{"line":421,"column":45}},"line":421},"60":{"name":"(anonymous_60)","decl":{"start":{"line":427,"column":36},"end":{"line":427,"column":42}},"loc":{"start":{"line":427,"column":42},"end":{"line":431,"column":5}},"line":427},"61":{"name":"(anonymous_61)","decl":{"start":{"line":430,"column":27},"end":{"line":430,"column":28}},"loc":{"start":{"line":430,"column":34},"end":{"line":430,"column":82}},"line":430},"62":{"name":"(anonymous_62)","decl":{"start":{"line":433,"column":33},"end":{"line":433,"column":34}},"loc":{"start":{"line":433,"column":74},"end":{"line":498,"column":5}},"line":433},"63":{"name":"(anonymous_63)","decl":{"start":{"line":455,"column":17},"end":{"line":455,"column":23}},"loc":{"start":{"line":455,"column":23},"end":{"line":455,"column":null}},"line":455},"64":{"name":"(anonymous_64)","decl":{"start":{"line":500,"column":39},"end":{"line":500,"column":40}},"loc":{"start":{"line":500,"column":92},"end":{"line":580,"column":5}},"line":500},"65":{"name":"(anonymous_65)","decl":{"start":{"line":511,"column":19},"end":{"line":511,"column":25}},"loc":{"start":{"line":511,"column":25},"end":{"line":511,"column":null}},"line":511},"66":{"name":"(anonymous_66)","decl":{"start":{"line":537,"column":21},"end":{"line":537,"column":22}},"loc":{"start":{"line":537,"column":32},"end":{"line":576,"column":11}},"line":537},"67":{"name":"(anonymous_67)","decl":{"start":{"line":549,"column":29},"end":{"line":549,"column":35}},"loc":{"start":{"line":549,"column":35},"end":{"line":549,"column":null}},"line":549},"68":{"name":"(anonymous_68)","decl":{"start":{"line":564,"column":31},"end":{"line":564,"column":37}},"loc":{"start":{"line":564,"column":37},"end":{"line":564,"column":null}},"line":564},"69":{"name":"(anonymous_69)","decl":{"start":{"line":573,"column":56},"end":{"line":573,"column":57}},"loc":{"start":{"line":573,"column":72},"end":{"line":573,"column":94}},"line":573},"70":{"name":"(anonymous_70)","decl":{"start":{"line":607,"column":21},"end":{"line":607,"column":27}},"loc":{"start":{"line":607,"column":27},"end":{"line":607,"column":null}},"line":607},"71":{"name":"(anonymous_71)","decl":{"start":{"line":628,"column":22},"end":{"line":628,"column":23}},"loc":{"start":{"line":628,"column":29},"end":{"line":628,"column":null}},"line":628},"72":{"name":"(anonymous_72)","decl":{"start":{"line":637,"column":25},"end":{"line":637,"column":31}},"loc":{"start":{"line":637,"column":31},"end":{"line":640,"column":11}},"line":637},"73":{"name":"(anonymous_73)","decl":{"start":{"line":643,"column":30},"end":{"line":643,"column":36}},"loc":{"start":{"line":643,"column":36},"end":{"line":669,"column":15}},"line":643},"74":{"name":"(anonymous_74)","decl":{"start":{"line":652,"column":27},"end":{"line":652,"column":33}},"loc":{"start":{"line":652,"column":33},"end":{"line":652,"column":null}},"line":652},"75":{"name":"(anonymous_75)","decl":{"start":{"line":692,"column":27},"end":{"line":692,"column":28}},"loc":{"start":{"line":692,"column":38},"end":{"line":692,"column":55}},"line":692}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},{"start":{},"end":{}}],"line":27},"1":{"loc":{"start":{"line":28,"column":10},"end":{"line":28,"column":null}},"type":"binary-expr","locations":[{"start":{"line":28,"column":10},"end":{"line":28,"column":17}},{"start":{"line":28,"column":17},"end":{"line":28,"column":40}},{"start":{"line":28,"column":40},"end":{"line":28,"column":null}}],"line":28},"2":{"loc":{"start":{"line":47,"column":2},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":47,"column":null}},{"start":{},"end":{}}],"line":47},"3":{"loc":{"start":{"line":50,"column":2},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":53,"column":null}},{"start":{},"end":{}}],"line":50},"4":{"loc":{"start":{"line":54,"column":2},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":54},"5":{"loc":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":55},"6":{"loc":{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":56},"7":{"loc":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":57},"8":{"loc":{"start":{"line":63,"column":9},"end":{"line":63,"column":null}},"type":"binary-expr","locations":[{"start":{"line":63,"column":9},"end":{"line":63,"column":29}},{"start":{"line":63,"column":29},"end":{"line":63,"column":null}}],"line":63},"9":{"loc":{"start":{"line":72,"column":11},"end":{"line":72,"column":null}},"type":"binary-expr","locations":[{"start":{"line":72,"column":11},"end":{"line":72,"column":29}},{"start":{"line":72,"column":29},"end":{"line":72,"column":null}}],"line":72},"10":{"loc":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},{"start":{},"end":{}}],"line":84},"11":{"loc":{"start":{"line":86,"column":8},"end":{"line":86,"column":null}},"type":"if","locations":[{"start":{"line":86,"column":8},"end":{"line":86,"column":null}},{"start":{},"end":{}}],"line":86},"12":{"loc":{"start":{"line":94,"column":10},"end":{"line":94,"column":37}},"type":"binary-expr","locations":[{"start":{"line":94,"column":10},"end":{"line":94,"column":31}},{"start":{"line":94,"column":31},"end":{"line":94,"column":37}}],"line":94},"13":{"loc":{"start":{"line":94,"column":37},"end":{"line":94,"column":null}},"type":"binary-expr","locations":[{"start":{"line":94,"column":37},"end":{"line":94,"column":58}},{"start":{"line":94,"column":58},"end":{"line":94,"column":null}}],"line":94},"14":{"loc":{"start":{"line":114,"column":2},"end":{"line":128,"column":null}},"type":"switch","locations":[{"start":{"line":115,"column":4},"end":{"line":116,"column":null}},{"start":{"line":117,"column":4},"end":{"line":118,"column":null}},{"start":{"line":119,"column":4},"end":{"line":120,"column":null}},{"start":{"line":121,"column":4},"end":{"line":127,"column":null}}],"line":114},"15":{"loc":{"start":{"line":118,"column":24},"end":{"line":118,"column":61}},"type":"binary-expr","locations":[{"start":{"line":118,"column":24},"end":{"line":118,"column":39}},{"start":{"line":118,"column":39},"end":{"line":118,"column":55}},{"start":{"line":118,"column":55},"end":{"line":118,"column":61}}],"line":118},"16":{"loc":{"start":{"line":118,"column":61},"end":{"line":118,"column":null}},"type":"binary-expr","locations":[{"start":{"line":118,"column":61},"end":{"line":118,"column":76}},{"start":{"line":118,"column":76},"end":{"line":118,"column":92}},{"start":{"line":118,"column":92},"end":{"line":118,"column":null}}],"line":118},"17":{"loc":{"start":{"line":123,"column":19},"end":{"line":123,"column":null}},"type":"binary-expr","locations":[{"start":{"line":123,"column":19},"end":{"line":123,"column":51}},{"start":{"line":123,"column":51},"end":{"line":123,"column":null}}],"line":123},"18":{"loc":{"start":{"line":123,"column":32},"end":{"line":123,"column":46}},"type":"binary-expr","locations":[{"start":{"line":123,"column":32},"end":{"line":123,"column":44}},{"start":{"line":123,"column":44},"end":{"line":123,"column":46}}],"line":123},"19":{"loc":{"start":{"line":124,"column":19},"end":{"line":124,"column":null}},"type":"binary-expr","locations":[{"start":{"line":124,"column":19},"end":{"line":124,"column":51}},{"start":{"line":124,"column":51},"end":{"line":124,"column":null}}],"line":124},"20":{"loc":{"start":{"line":124,"column":32},"end":{"line":124,"column":46}},"type":"binary-expr","locations":[{"start":{"line":124,"column":32},"end":{"line":124,"column":44}},{"start":{"line":124,"column":44},"end":{"line":124,"column":46}}],"line":124},"21":{"loc":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},{"start":{},"end":{}}],"line":125},"22":{"loc":{"start":{"line":136,"column":11},"end":{"line":136,"column":null}},"type":"cond-expr","locations":[{"start":{"line":136,"column":17},"end":{"line":136,"column":35}},{"start":{"line":136,"column":35},"end":{"line":136,"column":null}}],"line":136},"23":{"loc":{"start":{"line":154,"column":4},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":154,"column":4},"end":{"line":154,"column":null}},{"start":{},"end":{}}],"line":154},"24":{"loc":{"start":{"line":156,"column":4},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":156,"column":4},"end":{"line":156,"column":null}},{"start":{},"end":{}}],"line":156},"25":{"loc":{"start":{"line":158,"column":6},"end":{"line":158,"column":null}},"type":"if","locations":[{"start":{"line":158,"column":6},"end":{"line":158,"column":null}},{"start":{},"end":{}}],"line":158},"26":{"loc":{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},"type":"if","locations":[{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},{"start":{},"end":{}}],"line":160},"27":{"loc":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"type":"if","locations":[{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},{"start":{},"end":{}}],"line":161},"28":{"loc":{"start":{"line":162,"column":4},"end":{"line":162,"column":null}},"type":"if","locations":[{"start":{"line":162,"column":4},"end":{"line":162,"column":null}},{"start":{},"end":{}}],"line":162},"29":{"loc":{"start":{"line":174,"column":2},"end":{"line":177,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":2},"end":{"line":177,"column":null}},{"start":{},"end":{}}],"line":174},"30":{"loc":{"start":{"line":187,"column":15},"end":{"line":187,"column":null}},"type":"binary-expr","locations":[{"start":{"line":187,"column":15},"end":{"line":187,"column":39}},{"start":{"line":187,"column":39},"end":{"line":187,"column":null}}],"line":187},"31":{"loc":{"start":{"line":190,"column":2},"end":{"line":195,"column":null}},"type":"if","locations":[{"start":{"line":190,"column":2},"end":{"line":195,"column":null}},{"start":{},"end":{}}],"line":190},"32":{"loc":{"start":{"line":192,"column":21},"end":{"line":192,"column":64}},"type":"binary-expr","locations":[{"start":{"line":192,"column":21},"end":{"line":192,"column":47}},{"start":{"line":192,"column":47},"end":{"line":192,"column":64}}],"line":192},"33":{"loc":{"start":{"line":198,"column":18},"end":{"line":198,"column":null}},"type":"binary-expr","locations":[{"start":{"line":198,"column":18},"end":{"line":198,"column":33}},{"start":{"line":198,"column":33},"end":{"line":198,"column":null}}],"line":198},"34":{"loc":{"start":{"line":199,"column":2},"end":{"line":201,"column":null}},"type":"if","locations":[{"start":{"line":199,"column":2},"end":{"line":201,"column":null}},{"start":{},"end":{}}],"line":199},"35":{"loc":{"start":{"line":205,"column":19},"end":{"line":205,"column":91}},"type":"binary-expr","locations":[{"start":{"line":205,"column":19},"end":{"line":205,"column":40}},{"start":{"line":205,"column":40},"end":{"line":205,"column":61}},{"start":{"line":205,"column":61},"end":{"line":205,"column":91}}],"line":205},"36":{"loc":{"start":{"line":213,"column":8},"end":{"line":215,"column":null}},"type":"binary-expr","locations":[{"start":{"line":213,"column":8},"end":{"line":213,"column":null}},{"start":{"line":214,"column":8},"end":{"line":214,"column":null}},{"start":{"line":215,"column":9},"end":{"line":215,"column":43}},{"start":{"line":215,"column":43},"end":{"line":215,"column":null}}],"line":213},"37":{"loc":{"start":{"line":221,"column":20},"end":{"line":221,"column":null}},"type":"binary-expr","locations":[{"start":{"line":221,"column":20},"end":{"line":221,"column":38}},{"start":{"line":221,"column":38},"end":{"line":221,"column":null}}],"line":221},"38":{"loc":{"start":{"line":222,"column":2},"end":{"line":224,"column":null}},"type":"if","locations":[{"start":{"line":222,"column":2},"end":{"line":224,"column":null}},{"start":{},"end":{}}],"line":222},"39":{"loc":{"start":{"line":229,"column":19},"end":{"line":229,"column":68}},"type":"binary-expr","locations":[{"start":{"line":229,"column":19},"end":{"line":229,"column":42}},{"start":{"line":229,"column":42},"end":{"line":229,"column":68}}],"line":229},"40":{"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":null}},"type":"if","locations":[{"start":{"line":233,"column":4},"end":{"line":235,"column":null}},{"start":{},"end":{}}],"line":233},"41":{"loc":{"start":{"line":233,"column":8},"end":{"line":233,"column":33}},"type":"binary-expr","locations":[{"start":{"line":233,"column":8},"end":{"line":233,"column":16}},{"start":{"line":233,"column":16},"end":{"line":233,"column":33}}],"line":233},"42":{"loc":{"start":{"line":240,"column":19},"end":{"line":240,"column":91}},"type":"binary-expr","locations":[{"start":{"line":240,"column":19},"end":{"line":240,"column":40}},{"start":{"line":240,"column":40},"end":{"line":240,"column":61}},{"start":{"line":240,"column":61},"end":{"line":240,"column":91}}],"line":240},"43":{"loc":{"start":{"line":254,"column":2},"end":{"line":275,"column":null}},"type":"switch","locations":[{"start":{"line":255,"column":4},"end":{"line":266,"column":null}},{"start":{"line":267,"column":4},"end":{"line":268,"column":null}},{"start":{"line":269,"column":4},"end":{"line":270,"column":null}},{"start":{"line":271,"column":4},"end":{"line":274,"column":null}}],"line":254},"44":{"loc":{"start":{"line":256,"column":6},"end":{"line":265,"column":null}},"type":"switch","locations":[{"start":{"line":257,"column":8},"end":{"line":258,"column":null}},{"start":{"line":259,"column":8},"end":{"line":260,"column":null}},{"start":{"line":261,"column":8},"end":{"line":262,"column":null}},{"start":{"line":263,"column":8},"end":{"line":264,"column":null}}],"line":256},"45":{"loc":{"start":{"line":258,"column":39},"end":{"line":258,"column":64}},"type":"binary-expr","locations":[{"start":{"line":258,"column":39},"end":{"line":258,"column":54}},{"start":{"line":258,"column":54},"end":{"line":258,"column":64}}],"line":258},"46":{"loc":{"start":{"line":262,"column":39},"end":{"line":262,"column":63}},"type":"binary-expr","locations":[{"start":{"line":262,"column":39},"end":{"line":262,"column":53}},{"start":{"line":262,"column":53},"end":{"line":262,"column":63}}],"line":262},"47":{"loc":{"start":{"line":268,"column":35},"end":{"line":268,"column":88}},"type":"binary-expr","locations":[{"start":{"line":268,"column":35},"end":{"line":268,"column":63}},{"start":{"line":268,"column":63},"end":{"line":268,"column":78}},{"start":{"line":268,"column":78},"end":{"line":268,"column":88}}],"line":268},"48":{"loc":{"start":{"line":273,"column":35},"end":{"line":273,"column":93}},"type":"binary-expr","locations":[{"start":{"line":273,"column":35},"end":{"line":273,"column":68}},{"start":{"line":273,"column":68},"end":{"line":273,"column":83}},{"start":{"line":273,"column":83},"end":{"line":273,"column":93}}],"line":273},"49":{"loc":{"start":{"line":291,"column":4},"end":{"line":291,"column":null}},"type":"if","locations":[{"start":{"line":291,"column":4},"end":{"line":291,"column":null}},{"start":{},"end":{}}],"line":291},"50":{"loc":{"start":{"line":293,"column":6},"end":{"line":293,"column":null}},"type":"if","locations":[{"start":{"line":293,"column":6},"end":{"line":293,"column":null}},{"start":{},"end":{}}],"line":293},"51":{"loc":{"start":{"line":293,"column":10},"end":{"line":293,"column":66}},"type":"binary-expr","locations":[{"start":{"line":293,"column":10},"end":{"line":293,"column":25}},{"start":{"line":293,"column":25},"end":{"line":293,"column":66}}],"line":293},"52":{"loc":{"start":{"line":300,"column":57},"end":{"line":300,"column":71}},"type":"cond-expr","locations":[{"start":{"line":300,"column":64},"end":{"line":300,"column":69}},{"start":{"line":300,"column":69},"end":{"line":300,"column":71}}],"line":300},"53":{"loc":{"start":{"line":304,"column":10},"end":{"line":304,"column":null}},"type":"binary-expr","locations":[{"start":{"line":304,"column":10},"end":{"line":304,"column":18}},{"start":{"line":304,"column":18},"end":{"line":304,"column":null}}],"line":304},"54":{"loc":{"start":{"line":313,"column":7},"end":{"line":341,"column":null}},"type":"binary-expr","locations":[{"start":{"line":313,"column":7},"end":{"line":313,"column":null}},{"start":{"line":314,"column":8},"end":{"line":341,"column":null}}],"line":313},"55":{"loc":{"start":{"line":324,"column":16},"end":{"line":324,"column":null}},"type":"binary-expr","locations":[{"start":{"line":324,"column":16},"end":{"line":324,"column":41}},{"start":{"line":324,"column":41},"end":{"line":324,"column":null}}],"line":324},"56":{"loc":{"start":{"line":326,"column":82},"end":{"line":326,"column":138}},"type":"cond-expr","locations":[{"start":{"line":326,"column":106},"end":{"line":326,"column":124}},{"start":{"line":326,"column":124},"end":{"line":326,"column":138}}],"line":326},"57":{"loc":{"start":{"line":334,"column":15},"end":{"line":336,"column":null}},"type":"cond-expr","locations":[{"start":{"line":335,"column":18},"end":{"line":335,"column":null}},{"start":{"line":336,"column":18},"end":{"line":336,"column":null}}],"line":334},"58":{"loc":{"start":{"line":355,"column":22},"end":{"line":355,"column":null}},"type":"binary-expr","locations":[{"start":{"line":355,"column":22},"end":{"line":355,"column":53}},{"start":{"line":355,"column":53},"end":{"line":355,"column":null}}],"line":355},"59":{"loc":{"start":{"line":368,"column":6},"end":{"line":369,"column":null}},"type":"if","locations":[{"start":{"line":368,"column":6},"end":{"line":369,"column":null}},{"start":{"line":369,"column":11},"end":{"line":369,"column":null}}],"line":368},"60":{"loc":{"start":{"line":378,"column":6},"end":{"line":378,"column":null}},"type":"if","locations":[{"start":{"line":378,"column":6},"end":{"line":378,"column":null}},{"start":{},"end":{}}],"line":378},"61":{"loc":{"start":{"line":385,"column":4},"end":{"line":385,"column":null}},"type":"if","locations":[{"start":{"line":385,"column":4},"end":{"line":385,"column":null}},{"start":{},"end":{}}],"line":385},"62":{"loc":{"start":{"line":387,"column":11},"end":{"line":387,"column":null}},"type":"binary-expr","locations":[{"start":{"line":387,"column":11},"end":{"line":387,"column":76}},{"start":{"line":387,"column":76},"end":{"line":387,"column":null}}],"line":387},"63":{"loc":{"start":{"line":387,"column":31},"end":{"line":387,"column":71}},"type":"binary-expr","locations":[{"start":{"line":387,"column":31},"end":{"line":387,"column":51}},{"start":{"line":387,"column":51},"end":{"line":387,"column":71}}],"line":387},"64":{"loc":{"start":{"line":391,"column":10},"end":{"line":391,"column":null}},"type":"cond-expr","locations":[{"start":{"line":391,"column":25},"end":{"line":391,"column":89}},{"start":{"line":391,"column":89},"end":{"line":391,"column":null}}],"line":391},"65":{"loc":{"start":{"line":396,"column":10},"end":{"line":396,"column":null}},"type":"cond-expr","locations":[{"start":{"line":396,"column":25},"end":{"line":396,"column":30}},{"start":{"line":396,"column":30},"end":{"line":396,"column":null}}],"line":396},"66":{"loc":{"start":{"line":400,"column":19},"end":{"line":400,"column":null}},"type":"binary-expr","locations":[{"start":{"line":400,"column":19},"end":{"line":400,"column":44}},{"start":{"line":400,"column":44},"end":{"line":400,"column":null}}],"line":400},"67":{"loc":{"start":{"line":403,"column":10},"end":{"line":403,"column":null}},"type":"cond-expr","locations":[{"start":{"line":403,"column":25},"end":{"line":403,"column":30}},{"start":{"line":403,"column":30},"end":{"line":403,"column":null}}],"line":403},"68":{"loc":{"start":{"line":410,"column":10},"end":{"line":410,"column":null}},"type":"cond-expr","locations":[{"start":{"line":410,"column":18},"end":{"line":410,"column":80}},{"start":{"line":410,"column":80},"end":{"line":410,"column":null}}],"line":410},"69":{"loc":{"start":{"line":415,"column":10},"end":{"line":422,"column":null}},"type":"cond-expr","locations":[{"start":{"line":416,"column":8},"end":{"line":421,"column":null}},{"start":{"line":422,"column":8},"end":{"line":422,"column":null}}],"line":415},"70":{"loc":{"start":{"line":428,"column":4},"end":{"line":428,"column":null}},"type":"if","locations":[{"start":{"line":428,"column":4},"end":{"line":428,"column":null}},{"start":{},"end":{}}],"line":428},"71":{"loc":{"start":{"line":430,"column":34},"end":{"line":430,"column":82}},"type":"binary-expr","locations":[{"start":{"line":430,"column":34},"end":{"line":430,"column":50}},{"start":{"line":430,"column":50},"end":{"line":430,"column":82}}],"line":430},"72":{"loc":{"start":{"line":433,"column":53},"end":{"line":433,"column":74}},"type":"default-arg","locations":[{"start":{"line":433,"column":64},"end":{"line":433,"column":74}}],"line":433},"73":{"loc":{"start":{"line":434,"column":23},"end":{"line":434,"column":null}},"type":"binary-expr","locations":[{"start":{"line":434,"column":23},"end":{"line":434,"column":60}},{"start":{"line":434,"column":60},"end":{"line":434,"column":null}}],"line":434},"74":{"loc":{"start":{"line":435,"column":28},"end":{"line":435,"column":43}},"type":"binary-expr","locations":[{"start":{"line":435,"column":28},"end":{"line":435,"column":41}},{"start":{"line":435,"column":41},"end":{"line":435,"column":43}}],"line":435},"75":{"loc":{"start":{"line":436,"column":35},"end":{"line":436,"column":56}},"type":"binary-expr","locations":[{"start":{"line":436,"column":35},"end":{"line":436,"column":48}},{"start":{"line":436,"column":48},"end":{"line":436,"column":56}}],"line":436},"76":{"loc":{"start":{"line":437,"column":45},"end":{"line":437,"column":66}},"type":"binary-expr","locations":[{"start":{"line":437,"column":45},"end":{"line":437,"column":58}},{"start":{"line":437,"column":58},"end":{"line":437,"column":66}}],"line":437},"77":{"loc":{"start":{"line":444,"column":10},"end":{"line":444,"column":null}},"type":"binary-expr","locations":[{"start":{"line":444,"column":10},"end":{"line":444,"column":22}},{"start":{"line":444,"column":22},"end":{"line":444,"column":null}}],"line":444},"78":{"loc":{"start":{"line":445,"column":10},"end":{"line":445,"column":null}},"type":"binary-expr","locations":[{"start":{"line":445,"column":10},"end":{"line":445,"column":24}},{"start":{"line":445,"column":24},"end":{"line":445,"column":null}}],"line":445},"79":{"loc":{"start":{"line":446,"column":10},"end":{"line":446,"column":null}},"type":"binary-expr","locations":[{"start":{"line":446,"column":10},"end":{"line":446,"column":23}},{"start":{"line":446,"column":23},"end":{"line":446,"column":38}},{"start":{"line":446,"column":38},"end":{"line":446,"column":null}}],"line":446},"80":{"loc":{"start":{"line":449,"column":19},"end":{"line":449,"column":null}},"type":"cond-expr","locations":[{"start":{"line":449,"column":44},"end":{"line":449,"column":68}},{"start":{"line":449,"column":68},"end":{"line":449,"column":null}}],"line":449},"81":{"loc":{"start":{"line":449,"column":19},"end":{"line":449,"column":44}},"type":"binary-expr","locations":[{"start":{"line":449,"column":19},"end":{"line":449,"column":31}},{"start":{"line":449,"column":31},"end":{"line":449,"column":44}}],"line":449},"82":{"loc":{"start":{"line":450,"column":14},"end":{"line":453,"column":null}},"type":"binary-expr","locations":[{"start":{"line":450,"column":14},"end":{"line":450,"column":28}},{"start":{"line":450,"column":28},"end":{"line":453,"column":null}}],"line":450},"83":{"loc":{"start":{"line":467,"column":12},"end":{"line":467,"column":null}},"type":"cond-expr","locations":[{"start":{"line":467,"column":25},"end":{"line":467,"column":43}},{"start":{"line":467,"column":43},"end":{"line":467,"column":null}}],"line":467},"84":{"loc":{"start":{"line":470,"column":13},"end":{"line":476,"column":null}},"type":"binary-expr","locations":[{"start":{"line":470,"column":13},"end":{"line":470,"column":null}},{"start":{"line":471,"column":14},"end":{"line":476,"column":null}}],"line":470},"85":{"loc":{"start":{"line":478,"column":13},"end":{"line":484,"column":null}},"type":"binary-expr","locations":[{"start":{"line":478,"column":13},"end":{"line":478,"column":null}},{"start":{"line":479,"column":14},"end":{"line":484,"column":null}}],"line":478},"86":{"loc":{"start":{"line":491,"column":73},"end":{"line":491,"column":null}},"type":"cond-expr","locations":[{"start":{"line":491,"column":163},"end":{"line":491,"column":214}},{"start":{"line":491,"column":214},"end":{"line":491,"column":null}}],"line":491},"87":{"loc":{"start":{"line":491,"column":73},"end":{"line":491,"column":163}},"type":"binary-expr","locations":[{"start":{"line":491,"column":73},"end":{"line":491,"column":90}},{"start":{"line":491,"column":90},"end":{"line":491,"column":110}},{"start":{"line":491,"column":110},"end":{"line":491,"column":163}}],"line":491},"88":{"loc":{"start":{"line":492,"column":11},"end":{"line":494,"column":null}},"type":"cond-expr","locations":[{"start":{"line":493,"column":14},"end":{"line":493,"column":null}},{"start":{"line":494,"column":14},"end":{"line":494,"column":null}}],"line":492},"89":{"loc":{"start":{"line":492,"column":11},"end":{"line":492,"column":null}},"type":"binary-expr","locations":[{"start":{"line":492,"column":11},"end":{"line":492,"column":28}},{"start":{"line":492,"column":28},"end":{"line":492,"column":null}}],"line":492},"90":{"loc":{"start":{"line":493,"column":58},"end":{"line":493,"column":148}},"type":"cond-expr","locations":[{"start":{"line":493,"column":111},"end":{"line":493,"column":146}},{"start":{"line":493,"column":146},"end":{"line":493,"column":148}}],"line":493},"91":{"loc":{"start":{"line":501,"column":29},"end":{"line":501,"column":45}},"type":"binary-expr","locations":[{"start":{"line":501,"column":29},"end":{"line":501,"column":43}},{"start":{"line":501,"column":43},"end":{"line":501,"column":45}}],"line":501},"92":{"loc":{"start":{"line":502,"column":41},"end":{"line":502,"column":59}},"type":"binary-expr","locations":[{"start":{"line":502,"column":41},"end":{"line":502,"column":55}},{"start":{"line":502,"column":55},"end":{"line":502,"column":59}}],"line":502},"93":{"loc":{"start":{"line":503,"column":47},"end":{"line":503,"column":65}},"type":"binary-expr","locations":[{"start":{"line":503,"column":47},"end":{"line":503,"column":61}},{"start":{"line":503,"column":61},"end":{"line":503,"column":65}}],"line":503},"94":{"loc":{"start":{"line":532,"column":9},"end":{"line":576,"column":null}},"type":"cond-expr","locations":[{"start":{"line":533,"column":10},"end":{"line":535,"column":null}},{"start":{"line":537,"column":10},"end":{"line":576,"column":null}}],"line":532},"95":{"loc":{"start":{"line":534,"column":13},"end":{"line":534,"column":null}},"type":"cond-expr","locations":[{"start":{"line":534,"column":21},"end":{"line":534,"column":43}},{"start":{"line":534,"column":43},"end":{"line":534,"column":null}}],"line":534},"96":{"loc":{"start":{"line":539,"column":30},"end":{"line":539,"column":null}},"type":"binary-expr","locations":[{"start":{"line":539,"column":30},"end":{"line":539,"column":56}},{"start":{"line":539,"column":56},"end":{"line":539,"column":null}}],"line":539},"97":{"loc":{"start":{"line":566,"column":23},"end":{"line":568,"column":null}},"type":"cond-expr","locations":[{"start":{"line":567,"column":26},"end":{"line":567,"column":null}},{"start":{"line":568,"column":26},"end":{"line":568,"column":null}}],"line":566},"98":{"loc":{"start":{"line":573,"column":17},"end":{"line":573,"column":null}},"type":"binary-expr","locations":[{"start":{"line":573,"column":17},"end":{"line":573,"column":38}},{"start":{"line":573,"column":38},"end":{"line":573,"column":null}}],"line":573},"99":{"loc":{"start":{"line":587,"column":11},"end":{"line":595,"column":null}},"type":"cond-expr","locations":[{"start":{"line":588,"column":14},"end":{"line":588,"column":null}},{"start":{"line":589,"column":14},"end":{"line":595,"column":null}}],"line":587},"100":{"loc":{"start":{"line":589,"column":14},"end":{"line":595,"column":null}},"type":"cond-expr","locations":[{"start":{"line":590,"column":16},"end":{"line":590,"column":null}},{"start":{"line":591,"column":16},"end":{"line":595,"column":null}}],"line":589},"101":{"loc":{"start":{"line":591,"column":16},"end":{"line":595,"column":null}},"type":"cond-expr","locations":[{"start":{"line":592,"column":18},"end":{"line":592,"column":null}},{"start":{"line":593,"column":18},"end":{"line":595,"column":null}}],"line":591},"102":{"loc":{"start":{"line":591,"column":16},"end":{"line":591,"column":null}},"type":"binary-expr","locations":[{"start":{"line":591,"column":16},"end":{"line":591,"column":48}},{"start":{"line":591,"column":48},"end":{"line":591,"column":null}}],"line":591},"103":{"loc":{"start":{"line":593,"column":18},"end":{"line":595,"column":null}},"type":"cond-expr","locations":[{"start":{"line":594,"column":20},"end":{"line":594,"column":null}},{"start":{"line":595,"column":20},"end":{"line":595,"column":null}}],"line":593},"104":{"loc":{"start":{"line":593,"column":18},"end":{"line":593,"column":null}},"type":"binary-expr","locations":[{"start":{"line":593,"column":18},"end":{"line":593,"column":50}},{"start":{"line":593,"column":50},"end":{"line":593,"column":null}}],"line":593},"105":{"loc":{"start":{"line":598,"column":11},"end":{"line":603,"column":null}},"type":"binary-expr","locations":[{"start":{"line":598,"column":11},"end":{"line":598,"column":null}},{"start":{"line":599,"column":12},"end":{"line":603,"column":null}}],"line":598},"106":{"loc":{"start":{"line":607,"column":63},"end":{"line":607,"column":96}},"type":"if","locations":[{"start":{"line":607,"column":63},"end":{"line":607,"column":96}},{"start":{},"end":{}}],"line":607},"107":{"loc":{"start":{"line":623,"column":7},"end":{"line":632,"column":null}},"type":"binary-expr","locations":[{"start":{"line":623,"column":7},"end":{"line":623,"column":null}},{"start":{"line":624,"column":8},"end":{"line":632,"column":null}}],"line":623},"108":{"loc":{"start":{"line":637,"column":9},"end":{"line":694,"column":null}},"type":"cond-expr","locations":[{"start":{"line":637,"column":9},"end":{"line":640,"column":null}},{"start":{"line":641,"column":10},"end":{"line":694,"column":null}}],"line":637},"109":{"loc":{"start":{"line":643,"column":13},"end":{"line":669,"column":null}},"type":"binary-expr","locations":[{"start":{"line":643,"column":13},"end":{"line":643,"column":30}},{"start":{"line":643,"column":13},"end":{"line":669,"column":null}}],"line":643},"110":{"loc":{"start":{"line":644,"column":26},"end":{"line":644,"column":null}},"type":"binary-expr","locations":[{"start":{"line":644,"column":26},"end":{"line":644,"column":62}},{"start":{"line":644,"column":62},"end":{"line":644,"column":null}}],"line":644},"111":{"loc":{"start":{"line":645,"column":43},"end":{"line":645,"column":71}},"type":"binary-expr","locations":[{"start":{"line":645,"column":43},"end":{"line":645,"column":63}},{"start":{"line":645,"column":63},"end":{"line":645,"column":71}}],"line":645},"112":{"loc":{"start":{"line":646,"column":53},"end":{"line":646,"column":81}},"type":"binary-expr","locations":[{"start":{"line":646,"column":53},"end":{"line":646,"column":73}},{"start":{"line":646,"column":73},"end":{"line":646,"column":81}}],"line":646},"113":{"loc":{"start":{"line":671,"column":13},"end":{"line":685,"column":null}},"type":"binary-expr","locations":[{"start":{"line":671,"column":13},"end":{"line":671,"column":28}},{"start":{"line":671,"column":28},"end":{"line":671,"column":null}},{"start":{"line":672,"column":14},"end":{"line":685,"column":null}}],"line":671},"114":{"loc":{"start":{"line":682,"column":41},"end":{"line":682,"column":91}},"type":"cond-expr","locations":[{"start":{"line":682,"column":67},"end":{"line":682,"column":79}},{"start":{"line":682,"column":79},"end":{"line":682,"column":91}}],"line":682},"115":{"loc":{"start":{"line":687,"column":13},"end":{"line":692,"column":null}},"type":"cond-expr","locations":[{"start":{"line":688,"column":14},"end":{"line":690,"column":null}},{"start":{"line":692,"column":14},"end":{"line":692,"column":null}}],"line":687},"116":{"loc":{"start":{"line":689,"column":17},"end":{"line":689,"column":null}},"type":"cond-expr","locations":[{"start":{"line":689,"column":31},"end":{"line":689,"column":50}},{"start":{"line":689,"column":50},"end":{"line":689,"column":null}}],"line":689}},"s":{"0":2,"1":118,"2":0,"3":118,"4":118,"5":2,"6":116,"7":116,"8":116,"9":0,"10":0,"11":116,"12":0,"13":116,"14":116,"15":116,"16":116,"17":116,"18":116,"19":112,"20":112,"21":266,"22":43,"23":43,"24":43,"25":12,"26":12,"27":12,"28":5,"29":5,"30":5,"31":5,"32":25,"33":25,"34":5,"35":20,"36":20,"37":0,"38":20,"39":5,"40":78,"41":2,"42":2,"43":66,"44":58,"45":2,"46":4,"47":4,"48":13,"49":2,"50":5,"51":5,"52":5,"53":4,"54":1,"55":2,"56":33,"57":33,"58":33,"59":33,"60":3,"61":3,"62":6,"63":6,"64":6,"65":6,"66":28,"67":6,"68":22,"69":22,"70":21,"71":1,"72":1,"73":0,"74":1,"75":0,"76":1,"77":1,"78":0,"79":0,"80":0,"81":29,"82":13,"83":29,"84":12,"85":12,"86":13,"87":6,"88":6,"89":6,"90":6,"91":0,"92":0,"93":0,"94":6,"95":6,"96":0,"97":6,"98":28,"99":6,"100":6,"101":28,"102":6,"103":6,"104":6,"105":0,"106":6,"107":6,"108":5,"109":0,"110":6,"111":5,"112":5,"113":5,"114":6,"115":28,"116":6,"117":6,"118":1,"119":6,"120":6,"121":67,"122":61,"123":54,"124":81,"125":0,"126":1,"127":7,"128":6,"129":40,"130":0,"131":4,"132":22,"133":0,"134":2,"135":2,"136":11,"137":67,"138":67,"139":67,"140":46,"141":42,"142":0,"143":0,"144":4,"145":4,"146":4,"147":67,"148":4,"149":4,"150":73,"151":16,"152":3,"153":3,"154":3,"155":55,"156":55,"157":55,"158":55,"159":55,"160":55,"161":55,"162":55,"163":3,"164":3,"165":3,"166":3,"167":55,"168":2,"169":2,"170":2,"171":1,"172":1,"173":2,"174":55,"175":47,"176":47,"177":141,"178":0,"179":47,"180":55,"181":47,"182":44,"183":3,"184":3,"185":15,"186":55,"187":47,"188":55,"189":47,"190":55,"191":55,"192":49,"193":55,"194":55,"195":50,"196":5,"197":55,"198":48,"199":0,"200":0,"201":0,"202":55,"203":50,"204":45,"205":5,"206":5,"207":8,"208":55,"209":109,"210":109,"211":109,"212":109,"213":109,"214":109,"215":0,"216":55,"217":9,"218":9,"219":9,"220":9,"221":9,"222":0,"223":17,"224":17,"225":17,"226":17,"227":2,"228":0,"229":18,"230":55,"231":2,"232":2,"233":0,"234":1,"235":9,"236":9,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":91,"244":2},"f":{"0":118,"1":118,"2":266,"3":43,"4":12,"5":5,"6":5,"7":25,"8":5,"9":78,"10":66,"11":4,"12":13,"13":5,"14":33,"15":3,"16":6,"17":28,"18":29,"19":13,"20":13,"21":6,"22":0,"23":28,"24":28,"25":5,"26":0,"27":28,"28":1,"29":67,"30":81,"31":7,"32":40,"33":22,"34":11,"35":67,"36":46,"37":0,"38":4,"39":4,"40":73,"41":16,"42":3,"43":55,"44":3,"45":3,"46":2,"47":2,"48":47,"49":47,"50":15,"51":47,"52":47,"53":49,"54":50,"55":5,"56":48,"57":0,"58":0,"59":0,"60":50,"61":8,"62":109,"63":0,"64":9,"65":0,"66":17,"67":2,"68":0,"69":18,"70":2,"71":1,"72":9,"73":0,"74":0,"75":91},"b":{"0":[0,118],"1":[118,108,37],"2":[2,116],"3":[0,116],"4":[0,116],"5":[0,116],"6":[0,116],"7":[4,112],"8":[266,2],"9":[12,4],"10":[5,20],"11":[0,20],"12":[78,0],"13":[78,0],"14":[58,2,4,2],"15":[4,1,0],"16":[4,0,0],"17":[5,1],"18":[5,1],"19":[5,0],"20":[5,0],"21":[4,1],"22":[0,0],"23":[6,22],"24":[21,1],"25":[0,1],"26":[0,1],"27":[1,0],"28":[0,0],"29":[12,17],"30":[6,0],"31":[0,6],"32":[0,0],"33":[6,6],"34":[0,6],"35":[28,22,17],"36":[28,15,5,5],"37":[6,6],"38":[0,6],"39":[5,5],"40":[5,0],"41":[5,5],"42":[28,10,5],"43":[61,4,0,2],"44":[54,0,1,6],"45":[81,81],"46":[7,1],"47":[22,6,6],"48":[11,3,3],"49":[42,4],"50":[0,0],"51":[0,0],"52":[4,63],"53":[67,4],"54":[67,4],"55":[16,4],"56":[4,12],"57":[4,12],"58":[55,42],"59":[1,1],"60":[0,141],"61":[44,3],"62":[3,3],"63":[15,0],"64":[6,41],"65":[6,41],"66":[55,53],"67":[6,43],"68":[1,49],"69":[1,47],"70":[45,5],"71":[8,8],"72":[109],"73":[109,0],"74":[109,10],"75":[109,10],"76":[109,10],"77":[109,0],"78":[109,0],"79":[109,109,109],"80":[0,109],"81":[109,109],"82":[109,0],"83":[0,109],"84":[109,0],"85":[109,8],"86":[4,105],"87":[109,8,8],"88":[8,101],"89":[109,8],"90":[4,4],"91":[9,0],"92":[9,0],"93":[9,0],"94":[0,9],"95":[0,0],"96":[17,16],"97":[1,16],"98":[17,16],"99":[9,46],"100":[0,46],"101":[0,46],"102":[46,42],"103":[5,41],"104":[46,42],"105":[55,46],"106":[0,2],"107":[55,3],"108":[9,46],"109":[46,0],"110":[0,0],"111":[0,0],"112":[0,0],"113":[46,5,4],"114":[4,0],"115":[16,30],"116":[1,15]},"meta":{"lastBranch":117,"lastFunction":76,"lastStatement":245,"seen":{"s:15:83:24:Infinity":0,"f:26:9:26:21":0,"b:27:2:27:Infinity:undefined:undefined:undefined:undefined":0,"s:27:2:27:Infinity":1,"s:27:18:27:Infinity":2,"s:28:2:28:Infinity":3,"b:28:10:28:17:28:17:28:40:28:40:28:Infinity":1,"f:46:9:46:22":1,"b:47:2:47:Infinity:undefined:undefined:undefined:undefined":2,"s:47:2:47:Infinity":4,"s:47:11:47:Infinity":5,"s:48:14:48:Infinity":6,"s:49:15:49:Infinity":7,"b:50:2:53:Infinity:undefined:undefined:undefined:undefined":3,"s:50:2:53:Infinity":8,"s:51:17:51:Infinity":9,"s:52:4:52:Infinity":10,"b:54:2:54:Infinity:undefined:undefined:undefined:undefined":4,"s:54:2:54:Infinity":11,"s:54:17:54:Infinity":12,"b:55:2:55:Infinity:undefined:undefined:undefined:undefined":5,"s:55:2:55:Infinity":13,"s:55:19:55:Infinity":14,"b:56:2:56:Infinity:undefined:undefined:undefined:undefined":6,"s:56:2:56:Infinity":15,"s:56:20:56:Infinity":16,"b:57:2:57:Infinity:undefined:undefined:undefined:undefined":7,"s:57:2:57:Infinity":17,"s:57:21:57:Infinity":18,"s:58:15:58:Infinity":19,"s:59:2:59:Infinity":20,"f:62:9:62:24":2,"s:63:2:63:Infinity":21,"b:63:9:63:29:63:29:63:Infinity":8,"f:66:9:66:19":3,"s:67:15:67:Infinity":22,"s:68:19:68:Infinity":23,"s:69:2:73:Infinity":24,"f:69:19:69:20":4,"s:70:16:70:Infinity":25,"s:71:18:71:Infinity":26,"s:72:4:72:Infinity":27,"b:72:11:72:29:72:29:72:Infinity":9,"f:76:9:76:21":5,"s:77:2:90:Infinity":28,"f:78:9:78:10":6,"s:80:18:80:Infinity":29,"s:81:20:81:Infinity":30,"s:82:6:88:Infinity":31,"f:82:26:82:27":7,"s:83:21:83:Infinity":32,"b:84:8:84:Infinity:undefined:undefined:undefined:undefined":10,"s:84:8:84:Infinity":33,"s:84:28:84:Infinity":34,"s:85:25:85:Infinity":35,"b:86:8:86:Infinity:undefined:undefined:undefined:undefined":11,"s:86:8:86:Infinity":36,"s:86:49:86:Infinity":37,"s:87:8:87:Infinity":38,"f:90:12:90:13":8,"s:90:36:90:51":39,"f:93:16:93:31":9,"s:94:2:94:Infinity":40,"b:94:10:94:31:94:31:94:37":12,"b:94:37:94:58:94:58:94:Infinity":13,"s:99:68:104:Infinity":41,"s:106:45:111:Infinity":42,"f:113:16:113:34":10,"b:115:4:116:Infinity:117:4:118:Infinity:119:4:120:Infinity:121:4:127:Infinity":14,"s:114:2:128:Infinity":43,"s:116:6:116:Infinity":44,"s:118:6:118:Infinity":45,"f:118:13:118:14":11,"s:118:17:118:Infinity":46,"b:118:24:118:39:118:39:118:55:118:55:118:61":15,"b:118:61:118:76:118:76:118:92:118:92:118:Infinity":16,"s:120:6:120:Infinity":47,"f:120:13:120:14":12,"s:120:23:120:Infinity":48,"s:122:6:127:Infinity":49,"f:122:13:122:14":13,"s:123:19:123:Infinity":50,"b:123:19:123:51:123:51:123:Infinity":17,"b:123:32:123:44:123:44:123:46":18,"s:124:19:124:Infinity":51,"b:124:19:124:51:124:51:124:Infinity":19,"b:124:32:124:44:124:44:124:46":20,"b:125:8:125:Infinity:undefined:undefined:undefined:undefined":21,"s:125:8:125:Infinity":52,"s:125:23:125:Infinity":53,"s:126:8:126:Infinity":54,"s:131:25:131:Infinity":55,"f:133:9:133:59":14,"s:134:2:139:Infinity":56,"s:135:16:135:Infinity":57,"s:136:4:136:Infinity":58,"b:136:17:136:35:136:35:136:Infinity":22,"s:138:4:138:Infinity":59,"f:142:9:142:29":15,"s:143:2:145:Infinity":60,"s:144:4:144:Infinity":61,"f:148:9:148:23":16,"s:149:15:149:Infinity":62,"s:150:19:150:Infinity":63,"s:151:18:151:Infinity":64,"s:153:2:164:Infinity":65,"f:153:27:153:28":17,"b:154:4:154:Infinity:undefined:undefined:undefined:undefined":23,"s:154:4:154:Infinity":66,"s:154:32:154:Infinity":67,"s:155:20:155:Infinity":68,"b:156:4:156:Infinity:undefined:undefined:undefined:undefined":24,"s:156:4:156:Infinity":69,"s:156:18:156:Infinity":70,"s:157:4:159:Infinity":71,"b:158:6:158:Infinity:undefined:undefined:undefined:undefined":25,"s:158:6:158:Infinity":72,"s:158:40:158:Infinity":73,"b:160:4:160:Infinity:undefined:undefined:undefined:undefined":26,"s:160:4:160:Infinity":74,"s:160:41:160:Infinity":75,"b:161:4:161:Infinity:undefined:undefined:undefined:undefined":27,"s:161:4:161:Infinity":76,"s:161:45:161:Infinity":77,"b:162:4:162:Infinity:undefined:undefined:undefined:undefined":28,"s:162:4:162:Infinity":78,"s:162:44:162:Infinity":79,"s:163:4:163:Infinity":80,"f:167:9:167:Infinity":18,"s:173:17:173:Infinity":81,"f:173:32:173:33":19,"s:173:39:173:56":82,"b:174:2:177:Infinity:undefined:undefined:undefined:undefined":29,"s:174:2:177:Infinity":83,"s:175:4:175:Infinity":84,"s:176:4:176:Infinity":85,"f:176:19:176:20":20,"s:176:26:176:42":86,"f:180:16:180:Infinity":21,"s:185:38:185:Infinity":87,"s:186:15:186:Infinity":88,"s:187:15:187:Infinity":89,"b:187:15:187:39:187:39:187:Infinity":30,"b:190:2:195:Infinity:undefined:undefined:undefined:undefined":31,"s:190:2:195:Infinity":90,"s:191:22:193:Infinity":91,"f:192:14:192:15":22,"s:192:21:192:64":92,"b:192:21:192:47:192:47:192:64":32,"s:194:4:194:Infinity":93,"s:198:18:198:Infinity":94,"b:198:18:198:33:198:33:198:Infinity":33,"b:199:2:201:Infinity:undefined:undefined:undefined:undefined":34,"s:199:2:201:Infinity":95,"s:200:4:200:Infinity":96,"s:204:19:206:Infinity":97,"f:205:12:205:13":23,"s:205:19:205:91":98,"b:205:19:205:40:205:40:205:61:205:61:205:91":35,"s:207:2:207:Infinity":99,"s:210:17:217:Infinity":100,"f:212:6:212:7":24,"s:213:8:215:Infinity":101,"b:213:8:213:Infinity:214:8:214:Infinity:215:9:215:43:215:43:215:Infinity":36,"s:218:2:218:Infinity":102,"s:221:20:221:Infinity":103,"b:221:20:221:38:221:38:221:Infinity":37,"b:222:2:224:Infinity:undefined:undefined:undefined:undefined":38,"s:222:2:224:Infinity":104,"s:223:4:223:Infinity":105,"s:227:22:227:Infinity":106,"s:228:20:230:Infinity":107,"f:229:12:229:13":25,"s:229:19:229:68":108,"b:229:19:229:42:229:42:229:68":39,"f:230:10:230:11":26,"s:230:20:230:38":109,"s:231:2:236:Infinity":110,"s:232:17:232:Infinity":111,"b:233:4:235:Infinity:undefined:undefined:undefined:undefined":40,"s:233:4:235:Infinity":112,"b:233:8:233:16:233:16:233:33":41,"s:234:6:234:Infinity":113,"s:239:23:241:Infinity":114,"f:240:12:240:13":27,"s:240:19:240:91":115,"b:240:19:240:40:240:40:240:61:240:61:240:91":42,"s:242:2:242:Infinity":116,"s:245:20:247:Infinity":117,"f:246:12:246:13":28,"s:246:19:246:36":118,"s:248:2:248:Infinity":119,"s:250:2:250:Infinity":120,"f:253:16:253:30":29,"b:255:4:266:Infinity:267:4:268:Infinity:269:4:270:Infinity:271:4:274:Infinity":43,"s:254:2:275:Infinity":121,"b:257:8:258:Infinity:259:8:260:Infinity:261:8:262:Infinity:263:8:264:Infinity":44,"s:256:6:265:Infinity":122,"s:258:10:258:Infinity":123,"f:258:32:258:33":30,"s:258:39:258:64":124,"b:258:39:258:54:258:54:258:64":45,"s:260:10:260:Infinity":125,"s:262:10:262:Infinity":126,"f:262:32:262:33":31,"s:262:39:262:63":127,"b:262:39:262:53:262:53:262:63":46,"s:264:10:264:Infinity":128,"f:264:32:264:33":32,"s:264:39:264:48":129,"s:266:6:266:Infinity":130,"s:268:6:268:Infinity":131,"f:268:28:268:29":33,"s:268:35:268:88":132,"b:268:35:268:63:268:63:268:78:268:78:268:88":47,"s:270:6:270:Infinity":133,"s:272:20:272:Infinity":134,"s:273:6:273:Infinity":135,"f:273:28:273:29":34,"s:273:35:273:93":136,"b:273:35:273:68:273:68:273:83:273:83:273:93":48,"f:278:9:278:22":35,"s:287:22:287:Infinity":137,"s:288:8:288:Infinity":138,"s:290:2:297:Infinity":139,"f:290:12:290:18":36,"b:291:4:291:Infinity:undefined:undefined:undefined:undefined":49,"s:291:4:291:Infinity":140,"s:291:15:291:Infinity":141,"f:292:13:292:25":37,"b:293:6:293:Infinity:undefined:undefined:undefined:undefined":50,"s:293:6:293:Infinity":142,"b:293:10:293:25:293:25:293:66":51,"s:293:66:293:Infinity":143,"s:295:4:295:Infinity":144,"s:296:4:296:Infinity":145,"f:296:11:296:17":38,"s:296:17:296:Infinity":146,"s:299:2:343:Infinity":147,"b:300:64:300:69:300:69:300:71":52,"b:304:10:304:18:304:18:304:Infinity":53,"f:306:17:306:18":39,"s:306:26:306:47":148,"s:306:47:306:62":149,"f:311:69:311:70":40,"s:311:76:311:95":150,"b:313:7:313:Infinity:314:8:341:Infinity":54,"f:319:28:319:29":41,"s:320:12:339:Infinity":151,"b:324:16:324:41:324:41:324:Infinity":55,"b:326:106:326:124:326:124:326:138":56,"f:327:23:327:24":42,"s:328:16:328:Infinity":152,"s:329:16:329:Infinity":153,"s:330:16:330:Infinity":154,"b:335:18:335:Infinity:336:18:336:Infinity":57,"f:347:9:347:23":43,"s:348:26:348:Infinity":155,"s:349:40:349:Infinity":156,"s:350:44:350:Infinity":157,"s:351:32:351:Infinity":158,"s:353:23:353:Infinity":159,"s:354:25:354:Infinity":160,"s:355:22:355:Infinity":161,"b:355:22:355:53:355:53:355:Infinity":58,"s:357:8:363:Infinity":162,"f:357:39:357:40":44,"s:358:4:362:Infinity":163,"f:358:17:358:18":45,"s:359:19:359:Infinity":164,"s:360:6:360:Infinity":165,"s:361:6:361:Infinity":166,"s:365:8:372:Infinity":167,"f:365:34:365:35":46,"s:366:4:371:Infinity":168,"f:366:23:366:24":47,"s:367:19:367:Infinity":169,"b:368:6:369:Infinity:369:11:369:Infinity":59,"s:368:6:369:Infinity":170,"s:368:27:368:Infinity":171,"s:369:11:369:Infinity":172,"s:370:6:370:Infinity":173,"s:375:8:381:Infinity":174,"f:375:31:375:37":48,"s:376:44:376:Infinity":175,"s:377:4:379:Infinity":176,"b:378:6:378:Infinity:undefined:undefined:undefined:undefined":60,"s:378:6:378:Infinity":177,"s:378:28:378:Infinity":178,"s:380:4:380:Infinity":179,"s:384:8:388:Infinity":180,"f:384:31:384:37":49,"b:385:4:385:Infinity:undefined:undefined:undefined:undefined":61,"s:385:4:385:Infinity":181,"s:385:25:385:Infinity":182,"s:386:22:386:Infinity":183,"s:387:4:387:Infinity":184,"b:387:11:387:76:387:76:387:Infinity":62,"f:387:24:387:25":50,"s:387:31:387:71":185,"b:387:31:387:51:387:51:387:71":63,"s:390:8:393:Infinity":186,"f:391:4:391:10":51,"s:391:10:391:Infinity":187,"b:391:25:391:89:391:89:391:Infinity":64,"s:395:8:398:Infinity":188,"f:396:4:396:10":52,"s:396:10:396:Infinity":189,"b:396:25:396:30:396:30:396:Infinity":65,"s:400:19:400:Infinity":190,"b:400:19:400:44:400:44:400:Infinity":66,"s:402:8:405:Infinity":191,"f:403:4:403:10":53,"s:403:10:403:Infinity":192,"b:403:25:403:30:403:30:403:Infinity":67,"s:407:16:407:Infinity":193,"s:409:8:412:Infinity":194,"f:410:4:410:10":54,"s:410:10:410:Infinity":195,"b:410:18:410:80:410:80:410:Infinity":68,"f:410:32:410:33":55,"s:410:39:410:76":196,"s:414:8:424:Infinity":197,"f:415:4:415:10":56,"s:415:10:422:Infinity":198,"b:416:8:421:Infinity:422:8:422:Infinity":69,"f:417:15:417:16":57,"s:417:23:420:12":199,"f:419:38:419:39":58,"s:419:45:419:82":200,"f:421:18:421:19":59,"s:421:25:421:45":201,"s:427:8:431:Infinity":202,"f:427:36:427:42":60,"b:428:4:428:Infinity:undefined:undefined:undefined:undefined":70,"s:428:4:428:Infinity":203,"s:428:22:428:Infinity":204,"s:429:16:429:Infinity":205,"s:430:4:430:Infinity":206,"f:430:27:430:28":61,"s:430:34:430:82":207,"b:430:34:430:50:430:50:430:82":71,"s:433:8:498:Infinity":208,"f:433:33:433:34":62,"b:433:64:433:74":72,"s:434:23:434:Infinity":209,"b:434:23:434:60:434:60:434:Infinity":73,"s:435:15:435:Infinity":210,"b:435:28:435:41:435:41:435:43":74,"s:436:10:436:Infinity":211,"b:436:35:436:48:436:48:436:56":75,"s:437:10:437:Infinity":212,"b:437:45:437:58:437:58:437:66":76,"s:438:21:438:Infinity":213,"s:439:4:496:Infinity":214,"b:444:10:444:22:444:22:444:Infinity":77,"b:445:10:445:24:445:24:445:Infinity":78,"b:446:10:446:23:446:23:446:38:446:38:446:Infinity":79,"b:449:44:449:68:449:68:449:Infinity":80,"b:449:19:449:31:449:31:449:44":81,"b:450:14:450:28:450:28:453:Infinity":82,"f:455:17:455:23":63,"s:455:23:455:Infinity":215,"b:467:25:467:43:467:43:467:Infinity":83,"b:470:13:470:Infinity:471:14:476:Infinity":84,"b:478:13:478:Infinity:479:14:484:Infinity":85,"b:491:163:491:214:491:214:491:Infinity":86,"b:491:73:491:90:491:90:491:110:491:110:491:163":87,"b:493:14:493:Infinity:494:14:494:Infinity":88,"b:492:11:492:28:492:28:492:Infinity":89,"b:493:111:493:146:493:146:493:148":90,"s:500:8:580:Infinity":216,"f:500:39:500:40":64,"s:501:16:501:Infinity":217,"b:501:29:501:43:501:43:501:45":91,"s:502:10:502:Infinity":218,"b:502:41:502:55:502:55:502:59":92,"s:503:10:503:Infinity":219,"b:503:47:503:61:503:61:503:65":93,"s:504:23:504:Infinity":220,"s:505:4:578:Infinity":221,"f:511:19:511:25":65,"s:511:25:511:Infinity":222,"b:533:10:535:Infinity:537:10:576:Infinity":94,"b:534:21:534:43:534:43:534:Infinity":95,"f:537:21:537:22":66,"s:538:37:538:Infinity":223,"s:539:30:539:Infinity":224,"b:539:30:539:56:539:56:539:Infinity":96,"s:540:34:540:Infinity":225,"s:541:12:574:Infinity":226,"f:549:29:549:35":67,"s:549:35:549:Infinity":227,"f:564:31:564:37":68,"s:564:37:564:Infinity":228,"b:567:26:567:Infinity:568:26:568:Infinity":97,"b:573:17:573:38:573:38:573:Infinity":98,"f:573:56:573:57":69,"s:573:72:573:94":229,"s:582:2:697:Infinity":230,"b:588:14:588:Infinity:589:14:595:Infinity":99,"b:590:16:590:Infinity:591:16:595:Infinity":100,"b:592:18:592:Infinity:593:18:595:Infinity":101,"b:591:16:591:48:591:48:591:Infinity":102,"b:594:20:594:Infinity:595:20:595:Infinity":103,"b:593:18:593:50:593:50:593:Infinity":104,"b:598:11:598:Infinity:599:12:603:Infinity":105,"f:607:21:607:27":70,"s:607:29:607:63":231,"b:607:63:607:96:undefined:undefined:undefined:undefined":106,"s:607:63:607:96":232,"s:607:82:607:96":233,"b:623:7:623:Infinity:624:8:632:Infinity":107,"f:628:22:628:23":71,"s:628:29:628:Infinity":234,"b:637:9:640:Infinity:641:10:694:Infinity":108,"f:637:25:637:31":72,"s:638:25:638:Infinity":235,"s:639:10:639:Infinity":236,"b:643:13:643:30:643:13:669:Infinity":109,"f:643:30:643:36":73,"s:644:26:644:Infinity":237,"b:644:26:644:62:644:62:644:Infinity":110,"s:645:20:645:Infinity":238,"b:645:43:645:63:645:63:645:71":111,"s:646:20:646:Infinity":239,"b:646:53:646:73:646:73:646:81":112,"s:647:29:647:Infinity":240,"s:648:14:667:Infinity":241,"f:652:27:652:33":74,"s:652:33:652:Infinity":242,"b:671:13:671:28:671:28:671:Infinity:672:14:685:Infinity":113,"b:682:67:682:79:682:79:682:91":114,"b:688:14:690:Infinity:692:14:692:Infinity":115,"b:689:31:689:50:689:50:689:Infinity":116,"f:692:27:692:28":75,"s:692:38:692:55":243,"s:701:13:701:Infinity":244}}} +,"/Users/luca/Workspace/laputa-app/src/components/QuickOpenPalette.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/QuickOpenPalette.tsx","statementMap":{"0":{"start":{"line":15,"column":12},"end":{"line":15,"column":null}},"1":{"start":{"line":16,"column":12},"end":{"line":16,"column":null}},"2":{"start":{"line":17,"column":11},"end":{"line":17,"column":null}},"3":{"start":{"line":18,"column":14},"end":{"line":18,"column":null}},"4":{"start":{"line":19,"column":23},"end":{"line":19,"column":null}},"5":{"start":{"line":21,"column":2},"end":{"line":29,"column":null}},"6":{"start":{"line":21,"column":16},"end":{"line":21,"column":19}},"7":{"start":{"line":22,"column":4},"end":{"line":28,"column":null}},"8":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"9":{"start":{"line":23,"column":37},"end":{"line":23,"column":null}},"10":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"11":{"start":{"line":24,"column":62},"end":{"line":24,"column":null}},"12":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"13":{"start":{"line":26,"column":6},"end":{"line":26,"column":null}},"14":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"15":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"16":{"start":{"line":35,"column":24},"end":{"line":35,"column":null}},"17":{"start":{"line":36,"column":40},"end":{"line":36,"column":null}},"18":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"19":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"20":{"start":{"line":40,"column":2},"end":{"line":46,"column":null}},"21":{"start":{"line":41,"column":4},"end":{"line":45,"column":null}},"22":{"start":{"line":42,"column":6},"end":{"line":42,"column":null}},"23":{"start":{"line":43,"column":6},"end":{"line":43,"column":null}},"24":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"25":{"start":{"line":44,"column":23},"end":{"line":44,"column":50}},"26":{"start":{"line":48,"column":8},"end":{"line":58,"column":null}},"27":{"start":{"line":49,"column":4},"end":{"line":51,"column":null}},"28":{"start":{"line":50,"column":6},"end":{"line":50,"column":null}},"29":{"start":{"line":50,"column":35},"end":{"line":50,"column":82}},"30":{"start":{"line":52,"column":4},"end":{"line":57,"column":null}},"31":{"start":{"line":53,"column":23},"end":{"line":53,"column":68}},"32":{"start":{"line":54,"column":21},"end":{"line":54,"column":28}},"33":{"start":{"line":55,"column":22},"end":{"line":55,"column":39}},"34":{"start":{"line":57,"column":18},"end":{"line":57,"column":25}},"35":{"start":{"line":60,"column":2},"end":{"line":62,"column":null}},"36":{"start":{"line":61,"column":4},"end":{"line":61,"column":null}},"37":{"start":{"line":64,"column":2},"end":{"line":68,"column":null}},"38":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"39":{"start":{"line":65,"column":26},"end":{"line":65,"column":null}},"40":{"start":{"line":66,"column":21},"end":{"line":66,"column":null}},"41":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"42":{"start":{"line":70,"column":2},"end":{"line":92,"column":null}},"43":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"44":{"start":{"line":71,"column":15},"end":{"line":71,"column":null}},"45":{"start":{"line":72,"column":22},"end":{"line":89,"column":null}},"46":{"start":{"line":73,"column":6},"end":{"line":88,"column":null}},"47":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"48":{"start":{"line":75,"column":8},"end":{"line":75,"column":null}},"49":{"start":{"line":76,"column":6},"end":{"line":88,"column":null}},"50":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"51":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"52":{"start":{"line":78,"column":32},"end":{"line":78,"column":67}},"53":{"start":{"line":79,"column":6},"end":{"line":88,"column":null}},"54":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"55":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"56":{"start":{"line":81,"column":32},"end":{"line":81,"column":50}},"57":{"start":{"line":82,"column":6},"end":{"line":88,"column":null}},"58":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"59":{"start":{"line":84,"column":8},"end":{"line":87,"column":null}},"60":{"start":{"line":85,"column":10},"end":{"line":85,"column":null}},"61":{"start":{"line":86,"column":10},"end":{"line":86,"column":null}},"62":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"63":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"64":{"start":{"line":91,"column":17},"end":{"line":91,"column":null}},"65":{"start":{"line":94,"column":2},"end":{"line":94,"column":null}},"66":{"start":{"line":94,"column":13},"end":{"line":94,"column":null}},"67":{"start":{"line":96,"column":2},"end":{"line":143,"column":null}},"68":{"start":{"line":103,"column":24},"end":{"line":103,"column":null}},"69":{"start":{"line":111,"column":27},"end":{"line":111,"column":null}},"70":{"start":{"line":120,"column":14},"end":{"line":138,"column":null}},"71":{"start":{"line":127,"column":18},"end":{"line":127,"column":null}},"72":{"start":{"line":128,"column":18},"end":{"line":128,"column":null}},"73":{"start":{"line":130,"column":36},"end":{"line":130,"column":null}}},"fnMap":{"0":{"name":"fuzzyMatch","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":20}},"loc":{"start":{"line":14,"column":86},"end":{"line":32,"column":null}},"line":14},"1":{"name":"QuickOpenPalette","decl":{"start":{"line":34,"column":16},"end":{"line":34,"column":33}},"loc":{"start":{"line":34,"column":94},"end":{"line":145,"column":null}},"line":34},"2":{"name":"(anonymous_2)","decl":{"start":{"line":40,"column":12},"end":{"line":40,"column":18}},"loc":{"start":{"line":40,"column":18},"end":{"line":46,"column":5}},"line":40},"3":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":17},"end":{"line":44,"column":23}},"loc":{"start":{"line":44,"column":23},"end":{"line":44,"column":50}},"line":44},"4":{"name":"(anonymous_4)","decl":{"start":{"line":48,"column":26},"end":{"line":48,"column":32}},"loc":{"start":{"line":48,"column":32},"end":{"line":58,"column":5}},"line":48},"5":{"name":"(anonymous_5)","decl":{"start":{"line":50,"column":31},"end":{"line":50,"column":32}},"loc":{"start":{"line":50,"column":35},"end":{"line":50,"column":82}},"line":50},"6":{"name":"(anonymous_6)","decl":{"start":{"line":53,"column":11},"end":{"line":53,"column":12}},"loc":{"start":{"line":53,"column":23},"end":{"line":53,"column":68}},"line":53},"7":{"name":"(anonymous_7)","decl":{"start":{"line":54,"column":14},"end":{"line":54,"column":15}},"loc":{"start":{"line":54,"column":21},"end":{"line":54,"column":28}},"line":54},"8":{"name":"(anonymous_8)","decl":{"start":{"line":55,"column":12},"end":{"line":55,"column":13}},"loc":{"start":{"line":55,"column":22},"end":{"line":55,"column":39}},"line":55},"9":{"name":"(anonymous_9)","decl":{"start":{"line":57,"column":11},"end":{"line":57,"column":12}},"loc":{"start":{"line":57,"column":18},"end":{"line":57,"column":25}},"line":57},"10":{"name":"(anonymous_10)","decl":{"start":{"line":60,"column":12},"end":{"line":60,"column":18}},"loc":{"start":{"line":60,"column":18},"end":{"line":62,"column":5}},"line":60},"11":{"name":"(anonymous_11)","decl":{"start":{"line":64,"column":12},"end":{"line":64,"column":18}},"loc":{"start":{"line":64,"column":18},"end":{"line":68,"column":5}},"line":64},"12":{"name":"(anonymous_12)","decl":{"start":{"line":70,"column":12},"end":{"line":70,"column":18}},"loc":{"start":{"line":70,"column":18},"end":{"line":92,"column":5}},"line":70},"13":{"name":"(anonymous_13)","decl":{"start":{"line":72,"column":22},"end":{"line":72,"column":23}},"loc":{"start":{"line":72,"column":44},"end":{"line":89,"column":null}},"line":72},"14":{"name":"(anonymous_14)","decl":{"start":{"line":78,"column":25},"end":{"line":78,"column":26}},"loc":{"start":{"line":78,"column":32},"end":{"line":78,"column":67}},"line":78},"15":{"name":"(anonymous_15)","decl":{"start":{"line":81,"column":25},"end":{"line":81,"column":26}},"loc":{"start":{"line":81,"column":32},"end":{"line":81,"column":50}},"line":81},"16":{"name":"(anonymous_16)","decl":{"start":{"line":91,"column":11},"end":{"line":91,"column":17}},"loc":{"start":{"line":91,"column":17},"end":{"line":91,"column":null}},"line":91},"17":{"name":"(anonymous_17)","decl":{"start":{"line":103,"column":17},"end":{"line":103,"column":18}},"loc":{"start":{"line":103,"column":24},"end":{"line":103,"column":null}},"line":103},"18":{"name":"(anonymous_18)","decl":{"start":{"line":111,"column":20},"end":{"line":111,"column":21}},"loc":{"start":{"line":111,"column":27},"end":{"line":111,"column":null}},"line":111},"19":{"name":"(anonymous_19)","decl":{"start":{"line":119,"column":24},"end":{"line":119,"column":25}},"loc":{"start":{"line":120,"column":14},"end":{"line":138,"column":null}},"line":120},"20":{"name":"(anonymous_20)","decl":{"start":{"line":126,"column":25},"end":{"line":126,"column":31}},"loc":{"start":{"line":126,"column":31},"end":{"line":129,"column":null}},"line":126},"21":{"name":"(anonymous_21)","decl":{"start":{"line":130,"column":30},"end":{"line":130,"column":36}},"loc":{"start":{"line":130,"column":36},"end":{"line":130,"column":null}},"line":130}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":19},"end":{"line":21,"column":51}},"type":"binary-expr","locations":[{"start":{"line":21,"column":19},"end":{"line":21,"column":36}},{"start":{"line":21,"column":36},"end":{"line":21,"column":51}}],"line":21},"1":{"loc":{"start":{"line":22,"column":4},"end":{"line":28,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":28,"column":null}},{"start":{},"end":{}}],"line":22},"2":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},{"start":{},"end":{}}],"line":23},"3":{"loc":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},{"start":{},"end":{}}],"line":24},"4":{"loc":{"start":{"line":24,"column":10},"end":{"line":24,"column":62}},"type":"binary-expr","locations":[{"start":{"line":24,"column":10},"end":{"line":24,"column":22}},{"start":{"line":24,"column":22},"end":{"line":24,"column":43}},{"start":{"line":24,"column":43},"end":{"line":24,"column":62}}],"line":24},"5":{"loc":{"start":{"line":41,"column":4},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":4},"end":{"line":45,"column":null}},{"start":{},"end":{}}],"line":41},"6":{"loc":{"start":{"line":49,"column":4},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":4},"end":{"line":51,"column":null}},{"start":{},"end":{}}],"line":49},"7":{"loc":{"start":{"line":50,"column":42},"end":{"line":50,"column":64}},"type":"binary-expr","locations":[{"start":{"line":50,"column":42},"end":{"line":50,"column":58}},{"start":{"line":50,"column":58},"end":{"line":50,"column":64}}],"line":50},"8":{"loc":{"start":{"line":50,"column":64},"end":{"line":50,"column":82}},"type":"binary-expr","locations":[{"start":{"line":50,"column":64},"end":{"line":50,"column":80}},{"start":{"line":50,"column":80},"end":{"line":50,"column":82}}],"line":50},"9":{"loc":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},{"start":{},"end":{}}],"line":65},"10":{"loc":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},{"start":{},"end":{}}],"line":71},"11":{"loc":{"start":{"line":73,"column":6},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":6},"end":{"line":88,"column":null}},{"start":{"line":76,"column":6},"end":{"line":88,"column":null}}],"line":73},"12":{"loc":{"start":{"line":76,"column":6},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":6},"end":{"line":88,"column":null}},{"start":{"line":79,"column":6},"end":{"line":88,"column":null}}],"line":76},"13":{"loc":{"start":{"line":79,"column":6},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":6},"end":{"line":88,"column":null}},{"start":{"line":82,"column":6},"end":{"line":88,"column":null}}],"line":79},"14":{"loc":{"start":{"line":82,"column":6},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":82,"column":6},"end":{"line":88,"column":null}},{"start":{},"end":{}}],"line":82},"15":{"loc":{"start":{"line":84,"column":8},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":87,"column":null}},{"start":{},"end":{}}],"line":84},"16":{"loc":{"start":{"line":94,"column":2},"end":{"line":94,"column":null}},"type":"if","locations":[{"start":{"line":94,"column":2},"end":{"line":94,"column":null}},{"start":{},"end":{}}],"line":94},"17":{"loc":{"start":{"line":114,"column":11},"end":{"line":139,"column":null}},"type":"cond-expr","locations":[{"start":{"line":115,"column":12},"end":{"line":117,"column":null}},{"start":{"line":119,"column":12},"end":{"line":139,"column":null}}],"line":114},"18":{"loc":{"start":{"line":124,"column":18},"end":{"line":124,"column":null}},"type":"cond-expr","locations":[{"start":{"line":124,"column":40},"end":{"line":124,"column":54}},{"start":{"line":124,"column":54},"end":{"line":124,"column":null}}],"line":124},"19":{"loc":{"start":{"line":133,"column":17},"end":{"line":136,"column":null}},"type":"binary-expr","locations":[{"start":{"line":133,"column":17},"end":{"line":133,"column":null}},{"start":{"line":134,"column":18},"end":{"line":136,"column":null}}],"line":133}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":22,"17":22,"18":22,"19":22,"20":22,"21":7,"22":0,"23":0,"24":0,"25":0,"26":22,"27":21,"28":21,"29":7,"30":0,"31":0,"32":0,"33":0,"34":0,"35":22,"36":7,"37":22,"38":7,"39":7,"40":0,"41":0,"42":22,"43":22,"44":22,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":22,"66":22,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0},"f":{"0":0,"1":22,"2":7,"3":0,"4":21,"5":7,"6":0,"7":0,"8":0,"9":0,"10":7,"11":7,"12":22,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0,0],"5":[0,7],"6":[21,0],"7":[7,0],"8":[7,0],"9":[7,0],"10":[22,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[22,0],"17":[0,0],"18":[0,0],"19":[0,0]},"meta":{"lastBranch":20,"lastFunction":22,"lastStatement":74,"seen":{"f:14:9:14:20":0,"s:15:12:15:Infinity":0,"s:16:12:16:Infinity":1,"s:17:11:17:Infinity":2,"s:18:14:18:Infinity":3,"s:19:23:19:Infinity":4,"s:21:2:29:Infinity":5,"s:21:16:21:19":6,"b:21:19:21:36:21:36:21:51":0,"b:22:4:28:Infinity:undefined:undefined:undefined:undefined":1,"s:22:4:28:Infinity":7,"b:23:6:23:Infinity:undefined:undefined:undefined:undefined":2,"s:23:6:23:Infinity":8,"s:23:37:23:Infinity":9,"b:24:6:24:Infinity:undefined:undefined:undefined:undefined":3,"s:24:6:24:Infinity":10,"b:24:10:24:22:24:22:24:43:24:43:24:62":4,"s:24:62:24:Infinity":11,"s:25:6:25:Infinity":12,"s:26:6:26:Infinity":13,"s:27:6:27:Infinity":14,"s:31:2:31:Infinity":15,"f:34:16:34:33":1,"s:35:24:35:Infinity":16,"s:36:40:36:Infinity":17,"s:37:8:37:Infinity":18,"s:38:8:38:Infinity":19,"s:40:2:46:Infinity":20,"f:40:12:40:18":2,"b:41:4:45:Infinity:undefined:undefined:undefined:undefined":5,"s:41:4:45:Infinity":21,"s:42:6:42:Infinity":22,"s:43:6:43:Infinity":23,"s:44:6:44:Infinity":24,"f:44:17:44:23":3,"s:44:23:44:50":25,"s:48:8:58:Infinity":26,"f:48:26:48:32":4,"b:49:4:51:Infinity:undefined:undefined:undefined:undefined":6,"s:49:4:51:Infinity":27,"s:50:6:50:Infinity":28,"f:50:31:50:32":5,"s:50:35:50:82":29,"b:50:42:50:58:50:58:50:64":7,"b:50:64:50:80:50:80:50:82":8,"s:52:4:57:Infinity":30,"f:53:11:53:12":6,"s:53:23:53:68":31,"f:54:14:54:15":7,"s:54:21:54:28":32,"f:55:12:55:13":8,"s:55:22:55:39":33,"f:57:11:57:12":9,"s:57:18:57:25":34,"s:60:2:62:Infinity":35,"f:60:12:60:18":10,"s:61:4:61:Infinity":36,"s:64:2:68:Infinity":37,"f:64:12:64:18":11,"b:65:4:65:Infinity:undefined:undefined:undefined:undefined":9,"s:65:4:65:Infinity":38,"s:65:26:65:Infinity":39,"s:66:21:66:Infinity":40,"s:67:4:67:Infinity":41,"s:70:2:92:Infinity":42,"f:70:12:70:18":12,"b:71:4:71:Infinity:undefined:undefined:undefined:undefined":10,"s:71:4:71:Infinity":43,"s:71:15:71:Infinity":44,"s:72:22:89:Infinity":45,"f:72:22:72:23":13,"b:73:6:88:Infinity:76:6:88:Infinity":11,"s:73:6:88:Infinity":46,"s:74:8:74:Infinity":47,"s:75:8:75:Infinity":48,"b:76:6:88:Infinity:79:6:88:Infinity":12,"s:76:6:88:Infinity":49,"s:77:8:77:Infinity":50,"s:78:8:78:Infinity":51,"f:78:25:78:26":14,"s:78:32:78:67":52,"b:79:6:88:Infinity:82:6:88:Infinity":13,"s:79:6:88:Infinity":53,"s:80:8:80:Infinity":54,"s:81:8:81:Infinity":55,"f:81:25:81:26":15,"s:81:32:81:50":56,"b:82:6:88:Infinity:undefined:undefined:undefined:undefined":14,"s:82:6:88:Infinity":57,"s:83:8:83:Infinity":58,"b:84:8:87:Infinity:undefined:undefined:undefined:undefined":15,"s:84:8:87:Infinity":59,"s:85:10:85:Infinity":60,"s:86:10:86:Infinity":61,"s:90:4:90:Infinity":62,"s:91:4:91:Infinity":63,"f:91:11:91:17":16,"s:91:17:91:Infinity":64,"b:94:2:94:Infinity:undefined:undefined:undefined:undefined":16,"s:94:2:94:Infinity":65,"s:94:13:94:Infinity":66,"s:96:2:143:Infinity":67,"f:103:17:103:18":17,"s:103:24:103:Infinity":68,"f:111:20:111:21":18,"s:111:27:111:Infinity":69,"b:115:12:117:Infinity:119:12:139:Infinity":17,"f:119:24:119:25":19,"s:120:14:138:Infinity":70,"b:124:40:124:54:124:54:124:Infinity":18,"f:126:25:126:31":20,"s:127:18:127:Infinity":71,"s:128:18:128:Infinity":72,"f:130:30:130:36":21,"s:130:36:130:Infinity":73,"b:133:17:133:Infinity:134:18:136:Infinity":19}}} +,"/Users/luca/Workspace/laputa-app/src/components/ResizeHandle.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ResizeHandle.tsx","statementMap":{"0":{"start":{"line":8,"column":8},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":8},"end":{"line":10,"column":null}},"3":{"start":{"line":11,"column":8},"end":{"line":11,"column":null}},"4":{"start":{"line":13,"column":8},"end":{"line":23,"column":null}},"5":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"6":{"start":{"line":16,"column":6},"end":{"line":16,"column":null}},"7":{"start":{"line":17,"column":6},"end":{"line":17,"column":null}},"8":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"9":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"10":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"11":{"start":{"line":25,"column":2},"end":{"line":66,"column":null}},"12":{"start":{"line":26,"column":28},"end":{"line":40,"column":null}},"13":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"14":{"start":{"line":27,"column":31},"end":{"line":27,"column":null}},"15":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"16":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"17":{"start":{"line":31,"column":6},"end":{"line":39,"column":null}},"18":{"start":{"line":32,"column":8},"end":{"line":38,"column":null}},"19":{"start":{"line":33,"column":10},"end":{"line":36,"column":null}},"20":{"start":{"line":34,"column":12},"end":{"line":34,"column":null}},"21":{"start":{"line":35,"column":12},"end":{"line":35,"column":null}},"22":{"start":{"line":37,"column":10},"end":{"line":37,"column":null}},"23":{"start":{"line":42,"column":26},"end":{"line":57,"column":null}},"24":{"start":{"line":43,"column":6},"end":{"line":56,"column":null}},"25":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"26":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"27":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"28":{"start":{"line":48,"column":8},"end":{"line":51,"column":null}},"29":{"start":{"line":49,"column":10},"end":{"line":49,"column":null}},"30":{"start":{"line":50,"column":10},"end":{"line":50,"column":null}},"31":{"start":{"line":52,"column":8},"end":{"line":55,"column":null}},"32":{"start":{"line":53,"column":10},"end":{"line":53,"column":null}},"33":{"start":{"line":54,"column":10},"end":{"line":54,"column":null}},"34":{"start":{"line":59,"column":4},"end":{"line":59,"column":null}},"35":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"36":{"start":{"line":61,"column":4},"end":{"line":65,"column":null}},"37":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"38":{"start":{"line":63,"column":6},"end":{"line":63,"column":null}},"39":{"start":{"line":64,"column":6},"end":{"line":64,"column":null}},"40":{"start":{"line":64,"column":25},"end":{"line":64,"column":null}},"41":{"start":{"line":68,"column":2},"end":{"line":72,"column":null}}},"fnMap":{"0":{"name":"ResizeHandle","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":29}},"loc":{"start":{"line":7,"column":62},"end":{"line":74,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":5}},"loc":{"start":{"line":14,"column":29},"end":{"line":21,"column":null}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":12},"end":{"line":25,"column":18}},"loc":{"start":{"line":25,"column":18},"end":{"line":66,"column":5}},"line":25},"3":{"name":"(anonymous_3)","decl":{"start":{"line":26,"column":28},"end":{"line":26,"column":29}},"loc":{"start":{"line":26,"column":47},"end":{"line":40,"column":null}},"line":26},"4":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":46},"end":{"line":32,"column":52}},"loc":{"start":{"line":32,"column":52},"end":{"line":38,"column":9}},"line":32},"5":{"name":"(anonymous_5)","decl":{"start":{"line":42,"column":26},"end":{"line":42,"column":32}},"loc":{"start":{"line":42,"column":32},"end":{"line":57,"column":null}},"line":42},"6":{"name":"(anonymous_6)","decl":{"start":{"line":61,"column":11},"end":{"line":61,"column":17}},"loc":{"start":{"line":61,"column":17},"end":{"line":65,"column":null}},"line":61}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},{"start":{},"end":{}}],"line":27},"1":{"loc":{"start":{"line":31,"column":6},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":6},"end":{"line":39,"column":null}},{"start":{},"end":{}}],"line":31},"2":{"loc":{"start":{"line":33,"column":10},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":10},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":33},"3":{"loc":{"start":{"line":43,"column":6},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":6},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":43},"4":{"loc":{"start":{"line":48,"column":8},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":8},"end":{"line":51,"column":null}},{"start":{},"end":{}}],"line":48},"5":{"loc":{"start":{"line":52,"column":8},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":8},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":52},"6":{"loc":{"start":{"line":64,"column":6},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":6},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":64}},"s":{"0":67,"1":67,"2":67,"3":67,"4":67,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":67,"12":22,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":22,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":22,"35":22,"36":22,"37":22,"38":22,"39":22,"40":0,"41":67},"f":{"0":67,"1":0,"2":22,"3":0,"4":0,"5":0,"6":22},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,22]},"meta":{"lastBranch":7,"lastFunction":7,"lastStatement":42,"seen":{"f:7:16:7:29":0,"s:8:8:8:Infinity":0,"s:9:8:9:Infinity":1,"s:10:8:10:Infinity":2,"s:11:8:11:Infinity":3,"s:13:8:23:Infinity":4,"f:14:4:14:5":1,"s:15:6:15:Infinity":5,"s:16:6:16:Infinity":6,"s:17:6:17:Infinity":7,"s:18:6:18:Infinity":8,"s:19:6:19:Infinity":9,"s:20:6:20:Infinity":10,"s:25:2:66:Infinity":11,"f:25:12:25:18":2,"s:26:28:40:Infinity":12,"f:26:28:26:29":3,"b:27:6:27:Infinity:undefined:undefined:undefined:undefined":0,"s:27:6:27:Infinity":13,"s:27:31:27:Infinity":14,"s:28:6:28:Infinity":15,"s:29:6:29:Infinity":16,"b:31:6:39:Infinity:undefined:undefined:undefined:undefined":1,"s:31:6:39:Infinity":17,"s:32:8:38:Infinity":18,"f:32:46:32:52":4,"b:33:10:36:Infinity:undefined:undefined:undefined:undefined":2,"s:33:10:36:Infinity":19,"s:34:12:34:Infinity":20,"s:35:12:35:Infinity":21,"s:37:10:37:Infinity":22,"s:42:26:57:Infinity":23,"f:42:26:42:32":5,"b:43:6:56:Infinity:undefined:undefined:undefined:undefined":3,"s:43:6:56:Infinity":24,"s:44:8:44:Infinity":25,"s:45:8:45:Infinity":26,"s:46:8:46:Infinity":27,"b:48:8:51:Infinity:undefined:undefined:undefined:undefined":4,"s:48:8:51:Infinity":28,"s:49:10:49:Infinity":29,"s:50:10:50:Infinity":30,"b:52:8:55:Infinity:undefined:undefined:undefined:undefined":5,"s:52:8:55:Infinity":31,"s:53:10:53:Infinity":32,"s:54:10:54:Infinity":33,"s:59:4:59:Infinity":34,"s:60:4:60:Infinity":35,"s:61:4:65:Infinity":36,"f:61:11:61:17":6,"s:62:6:62:Infinity":37,"s:63:6:63:Infinity":38,"b:64:6:64:Infinity:undefined:undefined:undefined:undefined":6,"s:64:6:64:Infinity":39,"s:64:25:64:Infinity":40,"s:68:2:72:Infinity":41}}} +,"/Users/luca/Workspace/laputa-app/src/components/Sidebar.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/Sidebar.tsx","statementMap":{"0":{"start":{"line":54,"column":16},"end":{"line":57,"column":null}},"1":{"start":{"line":66,"column":48},"end":{"line":75,"column":null}},"2":{"start":{"line":77,"column":23},"end":{"line":77,"column":null}},"3":{"start":{"line":77,"column":66},"end":{"line":77,"column":72}},"4":{"start":{"line":79,"column":13},"end":{"line":603,"column":null}},"5":{"start":{"line":80,"column":32},"end":{"line":80,"column":null}},"6":{"start":{"line":81,"column":44},"end":{"line":81,"column":null}},"7":{"start":{"line":82,"column":42},"end":{"line":82,"column":null}},"8":{"start":{"line":83,"column":44},"end":{"line":83,"column":null}},"9":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"10":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"11":{"start":{"line":86,"column":40},"end":{"line":86,"column":null}},"12":{"start":{"line":87,"column":8},"end":{"line":87,"column":null}},"13":{"start":{"line":88,"column":60},"end":{"line":88,"column":null}},"14":{"start":{"line":91,"column":2},"end":{"line":100,"column":null}},"15":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"16":{"start":{"line":92,"column":24},"end":{"line":92,"column":null}},"17":{"start":{"line":93,"column":24},"end":{"line":97,"column":null}},"18":{"start":{"line":94,"column":6},"end":{"line":96,"column":null}},"19":{"start":{"line":95,"column":8},"end":{"line":95,"column":null}},"20":{"start":{"line":98,"column":4},"end":{"line":98,"column":null}},"21":{"start":{"line":99,"column":4},"end":{"line":99,"column":null}},"22":{"start":{"line":99,"column":17},"end":{"line":99,"column":null}},"23":{"start":{"line":102,"column":24},"end":{"line":104,"column":null}},"24":{"start":{"line":103,"column":4},"end":{"line":103,"column":null}},"25":{"start":{"line":103,"column":28},"end":{"line":103,"column":71}},"26":{"start":{"line":107,"column":8},"end":{"line":113,"column":null}},"27":{"start":{"line":108,"column":44},"end":{"line":108,"column":null}},"28":{"start":{"line":109,"column":4},"end":{"line":111,"column":null}},"29":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"30":{"start":{"line":110,"column":28},"end":{"line":110,"column":null}},"31":{"start":{"line":112,"column":4},"end":{"line":112,"column":null}},"32":{"start":{"line":115,"column":19},"end":{"line":122,"column":null}},"33":{"start":{"line":116,"column":4},"end":{"line":116,"column":null}},"34":{"start":{"line":116,"column":37},"end":{"line":116,"column":null}},"35":{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},"36":{"start":{"line":117,"column":62},"end":{"line":117,"column":null}},"37":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"38":{"start":{"line":118,"column":74},"end":{"line":118,"column":null}},"39":{"start":{"line":119,"column":4},"end":{"line":119,"column":null}},"40":{"start":{"line":119,"column":62},"end":{"line":119,"column":null}},"41":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"42":{"start":{"line":120,"column":60},"end":{"line":120,"column":null}},"43":{"start":{"line":121,"column":4},"end":{"line":121,"column":null}},"44":{"start":{"line":125,"column":8},"end":{"line":135,"column":null}},"45":{"start":{"line":126,"column":4},"end":{"line":134,"column":null}},"46":{"start":{"line":127,"column":21},"end":{"line":127,"column":69}},"47":{"start":{"line":128,"column":22},"end":{"line":128,"column":52}},"48":{"start":{"line":129,"column":19},"end":{"line":134,"column":8}},"49":{"start":{"line":138,"column":8},"end":{"line":148,"column":null}},"50":{"start":{"line":139,"column":4},"end":{"line":147,"column":null}},"51":{"start":{"line":140,"column":24},"end":{"line":140,"column":null}},"52":{"start":{"line":141,"column":6},"end":{"line":141,"column":null}},"53":{"start":{"line":141,"column":49},"end":{"line":141,"column":null}},"54":{"start":{"line":142,"column":6},"end":{"line":146,"column":null}},"55":{"start":{"line":151,"column":8},"end":{"line":159,"column":null}},"56":{"start":{"line":152,"column":19},"end":{"line":152,"column":null}},"57":{"start":{"line":153,"column":4},"end":{"line":158,"column":null}},"58":{"start":{"line":154,"column":21},"end":{"line":154,"column":null}},"59":{"start":{"line":155,"column":21},"end":{"line":155,"column":null}},"60":{"start":{"line":156,"column":6},"end":{"line":156,"column":null}},"61":{"start":{"line":156,"column":29},"end":{"line":156,"column":null}},"62":{"start":{"line":157,"column":6},"end":{"line":157,"column":null}},"63":{"start":{"line":162,"column":8},"end":{"line":165,"column":null}},"64":{"start":{"line":167,"column":8},"end":{"line":170,"column":null}},"65":{"start":{"line":168,"column":10},"end":{"line":168,"column":null}},"66":{"start":{"line":168,"column":41},"end":{"line":168,"column":65}},"67":{"start":{"line":172,"column":8},"end":{"line":172,"column":null}},"68":{"start":{"line":172,"column":35},"end":{"line":172,"column":71}},"69":{"start":{"line":172,"column":62},"end":{"line":172,"column":68}},"70":{"start":{"line":174,"column":8},"end":{"line":189,"column":null}},"71":{"start":{"line":175,"column":29},"end":{"line":175,"column":null}},"72":{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},"73":{"start":{"line":176,"column":40},"end":{"line":176,"column":null}},"74":{"start":{"line":178,"column":21},"end":{"line":178,"column":null}},"75":{"start":{"line":179,"column":21},"end":{"line":179,"column":null}},"76":{"start":{"line":180,"column":4},"end":{"line":180,"column":null}},"77":{"start":{"line":180,"column":44},"end":{"line":180,"column":null}},"78":{"start":{"line":183,"column":22},"end":{"line":183,"column":null}},"79":{"start":{"line":184,"column":4},"end":{"line":184,"column":null}},"80":{"start":{"line":185,"column":4},"end":{"line":185,"column":null}},"81":{"start":{"line":187,"column":20},"end":{"line":187,"column":null}},"82":{"start":{"line":187,"column":52},"end":{"line":187,"column":75}},"83":{"start":{"line":188,"column":4},"end":{"line":188,"column":null}},"84":{"start":{"line":191,"column":8},"end":{"line":191,"column":null}},"85":{"start":{"line":191,"column":38},"end":{"line":191,"column":80}},"86":{"start":{"line":191,"column":60},"end":{"line":191,"column":70}},"87":{"start":{"line":192,"column":8},"end":{"line":192,"column":null}},"88":{"start":{"line":192,"column":37},"end":{"line":192,"column":78}},"89":{"start":{"line":192,"column":59},"end":{"line":192,"column":68}},"90":{"start":{"line":195,"column":2},"end":{"line":205,"column":null}},"91":{"start":{"line":196,"column":4},"end":{"line":196,"column":null}},"92":{"start":{"line":196,"column":25},"end":{"line":196,"column":null}},"93":{"start":{"line":197,"column":20},"end":{"line":202,"column":null}},"94":{"start":{"line":198,"column":6},"end":{"line":201,"column":null}},"95":{"start":{"line":199,"column":8},"end":{"line":199,"column":null}},"96":{"start":{"line":200,"column":8},"end":{"line":200,"column":null}},"97":{"start":{"line":203,"column":4},"end":{"line":203,"column":null}},"98":{"start":{"line":204,"column":4},"end":{"line":204,"column":null}},"99":{"start":{"line":204,"column":17},"end":{"line":204,"column":null}},"100":{"start":{"line":208,"column":2},"end":{"line":217,"column":null}},"101":{"start":{"line":209,"column":4},"end":{"line":209,"column":null}},"102":{"start":{"line":209,"column":26},"end":{"line":209,"column":null}},"103":{"start":{"line":210,"column":20},"end":{"line":214,"column":null}},"104":{"start":{"line":211,"column":6},"end":{"line":213,"column":null}},"105":{"start":{"line":212,"column":8},"end":{"line":212,"column":null}},"106":{"start":{"line":215,"column":4},"end":{"line":215,"column":null}},"107":{"start":{"line":216,"column":4},"end":{"line":216,"column":null}},"108":{"start":{"line":216,"column":17},"end":{"line":216,"column":null}},"109":{"start":{"line":219,"column":8},"end":{"line":224,"column":null}},"110":{"start":{"line":220,"column":4},"end":{"line":220,"column":null}},"111":{"start":{"line":221,"column":4},"end":{"line":221,"column":null}},"112":{"start":{"line":222,"column":4},"end":{"line":222,"column":null}},"113":{"start":{"line":223,"column":4},"end":{"line":223,"column":null}},"114":{"start":{"line":226,"column":8},"end":{"line":230,"column":null}},"115":{"start":{"line":227,"column":4},"end":{"line":227,"column":null}},"116":{"start":{"line":228,"column":4},"end":{"line":228,"column":null}},"117":{"start":{"line":229,"column":4},"end":{"line":229,"column":null}},"118":{"start":{"line":232,"column":8},"end":{"line":238,"column":null}},"119":{"start":{"line":233,"column":4},"end":{"line":233,"column":null}},"120":{"start":{"line":233,"column":26},"end":{"line":233,"column":null}},"121":{"start":{"line":234,"column":22},"end":{"line":234,"column":null}},"122":{"start":{"line":235,"column":4},"end":{"line":237,"column":null}},"123":{"start":{"line":236,"column":6},"end":{"line":236,"column":null}},"124":{"start":{"line":240,"column":8},"end":{"line":246,"column":null}},"125":{"start":{"line":241,"column":4},"end":{"line":241,"column":null}},"126":{"start":{"line":241,"column":26},"end":{"line":241,"column":null}},"127":{"start":{"line":242,"column":22},"end":{"line":242,"column":null}},"128":{"start":{"line":243,"column":4},"end":{"line":245,"column":null}},"129":{"start":{"line":244,"column":6},"end":{"line":244,"column":null}},"130":{"start":{"line":248,"column":31},"end":{"line":348,"column":null}},"131":{"start":{"line":249,"column":18},"end":{"line":249,"column":null}},"132":{"start":{"line":249,"column":40},"end":{"line":249,"column":83}},"133":{"start":{"line":250,"column":24},"end":{"line":250,"column":null}},"134":{"start":{"line":251,"column":20},"end":{"line":251,"column":null}},"135":{"start":{"line":252,"column":26},"end":{"line":252,"column":null}},"136":{"start":{"line":253,"column":10},"end":{"line":253,"column":null}},"137":{"start":{"line":254,"column":10},"end":{"line":254,"column":null}},"138":{"start":{"line":256,"column":28},"end":{"line":263,"column":null}},"139":{"start":{"line":257,"column":6},"end":{"line":257,"column":null}},"140":{"start":{"line":258,"column":6},"end":{"line":262,"column":null}},"141":{"start":{"line":259,"column":8},"end":{"line":259,"column":null}},"142":{"start":{"line":261,"column":8},"end":{"line":261,"column":null}},"143":{"start":{"line":265,"column":4},"end":{"line":346,"column":null}},"144":{"start":{"line":276,"column":25},"end":{"line":276,"column":null}},"145":{"start":{"line":277,"column":32},"end":{"line":277,"column":null}},"146":{"start":{"line":307,"column":16},"end":{"line":307,"column":null}},"147":{"start":{"line":308,"column":16},"end":{"line":308,"column":null}},"148":{"start":{"line":321,"column":14},"end":{"line":342,"column":null}},"149":{"start":{"line":337,"column":18},"end":{"line":337,"column":null}},"150":{"start":{"line":338,"column":18},"end":{"line":338,"column":null}},"151":{"start":{"line":358,"column":4},"end":{"line":358,"column":null}},"152":{"start":{"line":360,"column":18},"end":{"line":365,"column":null}},"153":{"start":{"line":367,"column":4},"end":{"line":370,"column":null}},"154":{"start":{"line":374,"column":2},"end":{"line":601,"column":null}},"155":{"start":{"line":383,"column":26},"end":{"line":383,"column":null}},"156":{"start":{"line":383,"column":67},"end":{"line":383,"column":92}},"157":{"start":{"line":384,"column":12},"end":{"line":406,"column":null}},"158":{"start":{"line":394,"column":31},"end":{"line":394,"column":null}},"159":{"start":{"line":418,"column":27},"end":{"line":418,"column":null}},"160":{"start":{"line":449,"column":27},"end":{"line":449,"column":null}},"161":{"start":{"line":474,"column":29},"end":{"line":474,"column":null}},"162":{"start":{"line":474,"column":53},"end":{"line":474,"column":55}},"163":{"start":{"line":500,"column":16},"end":{"line":531,"column":null}},"164":{"start":{"line":504,"column":33},"end":{"line":504,"column":null}},"165":{"start":{"line":541,"column":14},"end":{"line":541,"column":null}},"166":{"start":{"line":578,"column":27},"end":{"line":578,"column":null}},"167":{"start":{"line":597,"column":27},"end":{"line":597,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":77,"column":59},"end":{"line":77,"column":60}},"loc":{"start":{"line":77,"column":66},"end":{"line":77,"column":72}},"line":77},"1":{"name":"Sidebar2","decl":{"start":{"line":79,"column":37},"end":{"line":79,"column":45}},"loc":{"start":{"line":79,"column":207},"end":{"line":603,"column":1}},"line":79},"2":{"name":"(anonymous_2)","decl":{"start":{"line":91,"column":12},"end":{"line":91,"column":18}},"loc":{"start":{"line":91,"column":18},"end":{"line":100,"column":5}},"line":91},"3":{"name":"(anonymous_3)","decl":{"start":{"line":93,"column":24},"end":{"line":93,"column":25}},"loc":{"start":{"line":93,"column":43},"end":{"line":97,"column":null}},"line":93},"4":{"name":"(anonymous_4)","decl":{"start":{"line":99,"column":11},"end":{"line":99,"column":17}},"loc":{"start":{"line":99,"column":17},"end":{"line":99,"column":null}},"line":99},"5":{"name":"(anonymous_5)","decl":{"start":{"line":102,"column":24},"end":{"line":102,"column":25}},"loc":{"start":{"line":102,"column":42},"end":{"line":104,"column":null}},"line":102},"6":{"name":"(anonymous_6)","decl":{"start":{"line":103,"column":17},"end":{"line":103,"column":18}},"loc":{"start":{"line":103,"column":28},"end":{"line":103,"column":71}},"line":103},"7":{"name":"(anonymous_7)","decl":{"start":{"line":107,"column":31},"end":{"line":107,"column":37}},"loc":{"start":{"line":107,"column":37},"end":{"line":113,"column":5}},"line":107},"8":{"name":"(anonymous_8)","decl":{"start":{"line":115,"column":19},"end":{"line":115,"column":20}},"loc":{"start":{"line":115,"column":55},"end":{"line":122,"column":null}},"line":115},"9":{"name":"(anonymous_9)","decl":{"start":{"line":125,"column":54},"end":{"line":125,"column":60}},"loc":{"start":{"line":125,"column":60},"end":{"line":135,"column":5}},"line":125},"10":{"name":"(anonymous_10)","decl":{"start":{"line":127,"column":14},"end":{"line":127,"column":15}},"loc":{"start":{"line":127,"column":21},"end":{"line":127,"column":69}},"line":127},"11":{"name":"(anonymous_11)","decl":{"start":{"line":128,"column":12},"end":{"line":128,"column":13}},"loc":{"start":{"line":128,"column":22},"end":{"line":128,"column":52}},"line":128},"12":{"name":"(anonymous_12)","decl":{"start":{"line":129,"column":11},"end":{"line":129,"column":12}},"loc":{"start":{"line":129,"column":19},"end":{"line":134,"column":8}},"line":129},"13":{"name":"(anonymous_13)","decl":{"start":{"line":138,"column":55},"end":{"line":138,"column":61}},"loc":{"start":{"line":138,"column":61},"end":{"line":148,"column":5}},"line":138},"14":{"name":"(anonymous_14)","decl":{"start":{"line":139,"column":39},"end":{"line":139,"column":40}},"loc":{"start":{"line":139,"column":47},"end":{"line":147,"column":5}},"line":139},"15":{"name":"(anonymous_15)","decl":{"start":{"line":151,"column":35},"end":{"line":151,"column":41}},"loc":{"start":{"line":151,"column":41},"end":{"line":159,"column":5}},"line":151},"16":{"name":"(anonymous_16)","decl":{"start":{"line":153,"column":23},"end":{"line":153,"column":24}},"loc":{"start":{"line":153,"column":33},"end":{"line":158,"column":5}},"line":153},"17":{"name":"(anonymous_17)","decl":{"start":{"line":168,"column":4},"end":{"line":168,"column":10}},"loc":{"start":{"line":168,"column":10},"end":{"line":168,"column":null}},"line":168},"18":{"name":"(anonymous_18)","decl":{"start":{"line":168,"column":34},"end":{"line":168,"column":35}},"loc":{"start":{"line":168,"column":41},"end":{"line":168,"column":65}},"line":168},"19":{"name":"(anonymous_19)","decl":{"start":{"line":172,"column":29},"end":{"line":172,"column":35}},"loc":{"start":{"line":172,"column":35},"end":{"line":172,"column":71}},"line":172},"20":{"name":"(anonymous_20)","decl":{"start":{"line":172,"column":55},"end":{"line":172,"column":56}},"loc":{"start":{"line":172,"column":62},"end":{"line":172,"column":68}},"line":172},"21":{"name":"(anonymous_21)","decl":{"start":{"line":174,"column":36},"end":{"line":174,"column":37}},"loc":{"start":{"line":174,"column":61},"end":{"line":189,"column":5}},"line":174},"22":{"name":"(anonymous_22)","decl":{"start":{"line":187,"column":34},"end":{"line":187,"column":35}},"loc":{"start":{"line":187,"column":52},"end":{"line":187,"column":75}},"line":187},"23":{"name":"(anonymous_23)","decl":{"start":{"line":191,"column":32},"end":{"line":191,"column":38}},"loc":{"start":{"line":191,"column":38},"end":{"line":191,"column":80}},"line":191},"24":{"name":"(anonymous_24)","decl":{"start":{"line":191,"column":53},"end":{"line":191,"column":54}},"loc":{"start":{"line":191,"column":60},"end":{"line":191,"column":70}},"line":191},"25":{"name":"(anonymous_25)","decl":{"start":{"line":192,"column":31},"end":{"line":192,"column":37}},"loc":{"start":{"line":192,"column":37},"end":{"line":192,"column":78}},"line":192},"26":{"name":"(anonymous_26)","decl":{"start":{"line":192,"column":52},"end":{"line":192,"column":53}},"loc":{"start":{"line":192,"column":59},"end":{"line":192,"column":68}},"line":192},"27":{"name":"(anonymous_27)","decl":{"start":{"line":195,"column":12},"end":{"line":195,"column":18}},"loc":{"start":{"line":195,"column":18},"end":{"line":205,"column":5}},"line":195},"28":{"name":"(anonymous_28)","decl":{"start":{"line":197,"column":20},"end":{"line":197,"column":21}},"loc":{"start":{"line":197,"column":39},"end":{"line":202,"column":null}},"line":197},"29":{"name":"(anonymous_29)","decl":{"start":{"line":204,"column":11},"end":{"line":204,"column":17}},"loc":{"start":{"line":204,"column":17},"end":{"line":204,"column":null}},"line":204},"30":{"name":"(anonymous_30)","decl":{"start":{"line":208,"column":12},"end":{"line":208,"column":18}},"loc":{"start":{"line":208,"column":18},"end":{"line":217,"column":5}},"line":208},"31":{"name":"(anonymous_31)","decl":{"start":{"line":210,"column":20},"end":{"line":210,"column":21}},"loc":{"start":{"line":210,"column":39},"end":{"line":214,"column":null}},"line":210},"32":{"name":"(anonymous_32)","decl":{"start":{"line":216,"column":11},"end":{"line":216,"column":17}},"loc":{"start":{"line":216,"column":17},"end":{"line":216,"column":null}},"line":216},"33":{"name":"(anonymous_33)","decl":{"start":{"line":219,"column":40},"end":{"line":219,"column":41}},"loc":{"start":{"line":219,"column":79},"end":{"line":224,"column":5}},"line":219},"34":{"name":"(anonymous_34)","decl":{"start":{"line":226,"column":43},"end":{"line":226,"column":44}},"loc":{"start":{"line":226,"column":61},"end":{"line":230,"column":5}},"line":226},"35":{"name":"(anonymous_35)","decl":{"start":{"line":232,"column":42},"end":{"line":232,"column":43}},"loc":{"start":{"line":232,"column":60},"end":{"line":238,"column":5}},"line":232},"36":{"name":"(anonymous_36)","decl":{"start":{"line":240,"column":43},"end":{"line":240,"column":44}},"loc":{"start":{"line":240,"column":62},"end":{"line":246,"column":5}},"line":240},"37":{"name":"(anonymous_37)","decl":{"start":{"line":248,"column":31},"end":{"line":248,"column":32}},"loc":{"start":{"line":248,"column":128},"end":{"line":348,"column":null}},"line":248},"38":{"name":"(anonymous_38)","decl":{"start":{"line":249,"column":33},"end":{"line":249,"column":34}},"loc":{"start":{"line":249,"column":40},"end":{"line":249,"column":83}},"line":249},"39":{"name":"(anonymous_39)","decl":{"start":{"line":256,"column":28},"end":{"line":256,"column":29}},"loc":{"start":{"line":256,"column":53},"end":{"line":263,"column":null}},"line":256},"40":{"name":"(anonymous_40)","decl":{"start":{"line":276,"column":19},"end":{"line":276,"column":25}},"loc":{"start":{"line":276,"column":25},"end":{"line":276,"column":null}},"line":276},"41":{"name":"(anonymous_41)","decl":{"start":{"line":277,"column":25},"end":{"line":277,"column":26}},"loc":{"start":{"line":277,"column":32},"end":{"line":277,"column":null}},"line":277},"42":{"name":"(anonymous_42)","decl":{"start":{"line":306,"column":23},"end":{"line":306,"column":24}},"loc":{"start":{"line":306,"column":30},"end":{"line":309,"column":null}},"line":306},"43":{"name":"(anonymous_43)","decl":{"start":{"line":320,"column":23},"end":{"line":320,"column":24}},"loc":{"start":{"line":321,"column":14},"end":{"line":342,"column":null}},"line":321},"44":{"name":"(anonymous_44)","decl":{"start":{"line":336,"column":25},"end":{"line":336,"column":31}},"loc":{"start":{"line":336,"column":31},"end":{"line":339,"column":null}},"line":336},"45":{"name":"SortableSection","decl":{"start":{"line":350,"column":11},"end":{"line":350,"column":27}},"loc":{"start":{"line":350,"column":63},"end":{"line":372,"column":null}},"line":350},"46":{"name":"(anonymous_46)","decl":{"start":{"line":382,"column":23},"end":{"line":382,"column":24}},"loc":{"start":{"line":382,"column":52},"end":{"line":408,"column":11}},"line":382},"47":{"name":"(anonymous_47)","decl":{"start":{"line":383,"column":60},"end":{"line":383,"column":61}},"loc":{"start":{"line":383,"column":67},"end":{"line":383,"column":92}},"line":383},"48":{"name":"(anonymous_48)","decl":{"start":{"line":394,"column":25},"end":{"line":394,"column":31}},"loc":{"start":{"line":394,"column":31},"end":{"line":394,"column":null}},"line":394},"49":{"name":"(anonymous_49)","decl":{"start":{"line":418,"column":21},"end":{"line":418,"column":27}},"loc":{"start":{"line":418,"column":27},"end":{"line":418,"column":null}},"line":418},"50":{"name":"(anonymous_50)","decl":{"start":{"line":449,"column":21},"end":{"line":449,"column":27}},"loc":{"start":{"line":449,"column":27},"end":{"line":449,"column":null}},"line":449},"51":{"name":"(anonymous_51)","decl":{"start":{"line":474,"column":23},"end":{"line":474,"column":29}},"loc":{"start":{"line":474,"column":29},"end":{"line":474,"column":null}},"line":474},"52":{"name":"(anonymous_52)","decl":{"start":{"line":474,"column":46},"end":{"line":474,"column":47}},"loc":{"start":{"line":474,"column":53},"end":{"line":474,"column":55}},"line":474},"53":{"name":"(anonymous_53)","decl":{"start":{"line":499,"column":36},"end":{"line":499,"column":37}},"loc":{"start":{"line":500,"column":16},"end":{"line":531,"column":null}},"line":500},"54":{"name":"(anonymous_54)","decl":{"start":{"line":504,"column":27},"end":{"line":504,"column":33}},"loc":{"start":{"line":504,"column":33},"end":{"line":504,"column":null}},"line":504},"55":{"name":"(anonymous_55)","decl":{"start":{"line":540,"column":33},"end":{"line":540,"column":34}},"loc":{"start":{"line":541,"column":14},"end":{"line":541,"column":null}},"line":541},"56":{"name":"(anonymous_56)","decl":{"start":{"line":578,"column":21},"end":{"line":578,"column":27}},"loc":{"start":{"line":578,"column":27},"end":{"line":578,"column":null}},"line":578},"57":{"name":"(anonymous_57)","decl":{"start":{"line":597,"column":21},"end":{"line":597,"column":27}},"loc":{"start":{"line":597,"column":27},"end":{"line":597,"column":null}},"line":597}},"branchMap":{"0":{"loc":{"start":{"line":79,"column":158},"end":{"line":79,"column":177}},"type":"default-arg","locations":[{"start":{"line":79,"column":174},"end":{"line":79,"column":177}}],"line":79},"1":{"loc":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},{"start":{},"end":{}}],"line":92},"2":{"loc":{"start":{"line":94,"column":6},"end":{"line":96,"column":null}},"type":"if","locations":[{"start":{"line":94,"column":6},"end":{"line":96,"column":null}},{"start":{},"end":{}}],"line":94},"3":{"loc":{"start":{"line":94,"column":10},"end":{"line":94,"column":84}},"type":"binary-expr","locations":[{"start":{"line":94,"column":10},"end":{"line":94,"column":34}},{"start":{"line":94,"column":34},"end":{"line":94,"column":84}}],"line":94},"4":{"loc":{"start":{"line":103,"column":49},"end":{"line":103,"column":69}},"type":"binary-expr","locations":[{"start":{"line":103,"column":49},"end":{"line":103,"column":63}},{"start":{"line":103,"column":63},"end":{"line":103,"column":69}}],"line":103},"5":{"loc":{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},"type":"if","locations":[{"start":{"line":110,"column":6},"end":{"line":110,"column":null}},{"start":{},"end":{}}],"line":110},"6":{"loc":{"start":{"line":116,"column":4},"end":{"line":116,"column":null}},"type":"if","locations":[{"start":{"line":116,"column":4},"end":{"line":116,"column":null}},{"start":{},"end":{}}],"line":116},"7":{"loc":{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},"type":"if","locations":[{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},{"start":{},"end":{}}],"line":117},"8":{"loc":{"start":{"line":117,"column":8},"end":{"line":117,"column":62}},"type":"binary-expr","locations":[{"start":{"line":117,"column":8},"end":{"line":117,"column":33}},{"start":{"line":117,"column":33},"end":{"line":117,"column":62}}],"line":117},"9":{"loc":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},{"start":{},"end":{}}],"line":118},"10":{"loc":{"start":{"line":118,"column":8},"end":{"line":118,"column":74}},"type":"binary-expr","locations":[{"start":{"line":118,"column":8},"end":{"line":118,"column":39}},{"start":{"line":118,"column":39},"end":{"line":118,"column":74}}],"line":118},"11":{"loc":{"start":{"line":119,"column":4},"end":{"line":119,"column":null}},"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":119,"column":null}},{"start":{},"end":{}}],"line":119},"12":{"loc":{"start":{"line":119,"column":8},"end":{"line":119,"column":62}},"type":"binary-expr","locations":[{"start":{"line":119,"column":8},"end":{"line":119,"column":33}},{"start":{"line":119,"column":33},"end":{"line":119,"column":62}}],"line":119},"13":{"loc":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},{"start":{},"end":{}}],"line":120},"14":{"loc":{"start":{"line":120,"column":8},"end":{"line":120,"column":60}},"type":"binary-expr","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":32}},{"start":{"line":120,"column":32},"end":{"line":120,"column":60}}],"line":120},"15":{"loc":{"start":{"line":127,"column":21},"end":{"line":127,"column":69}},"type":"binary-expr","locations":[{"start":{"line":127,"column":21},"end":{"line":127,"column":41}},{"start":{"line":127,"column":41},"end":{"line":127,"column":69}}],"line":127},"16":{"loc":{"start":{"line":141,"column":6},"end":{"line":141,"column":null}},"type":"if","locations":[{"start":{"line":141,"column":6},"end":{"line":141,"column":null}},{"start":{},"end":{}}],"line":141},"17":{"loc":{"start":{"line":141,"column":10},"end":{"line":141,"column":49}},"type":"binary-expr","locations":[{"start":{"line":141,"column":10},"end":{"line":141,"column":30}},{"start":{"line":141,"column":30},"end":{"line":141,"column":49}}],"line":141},"18":{"loc":{"start":{"line":144,"column":14},"end":{"line":144,"column":null}},"type":"cond-expr","locations":[{"start":{"line":144,"column":25},"end":{"line":144,"column":62}},{"start":{"line":144,"column":62},"end":{"line":144,"column":null}}],"line":144},"19":{"loc":{"start":{"line":145,"column":21},"end":{"line":145,"column":null}},"type":"binary-expr","locations":[{"start":{"line":145,"column":21},"end":{"line":145,"column":41}},{"start":{"line":145,"column":41},"end":{"line":145,"column":null}}],"line":145},"20":{"loc":{"start":{"line":154,"column":21},"end":{"line":154,"column":null}},"type":"binary-expr","locations":[{"start":{"line":154,"column":21},"end":{"line":154,"column":52}},{"start":{"line":154,"column":52},"end":{"line":154,"column":null}}],"line":154},"21":{"loc":{"start":{"line":155,"column":21},"end":{"line":155,"column":null}},"type":"binary-expr","locations":[{"start":{"line":155,"column":21},"end":{"line":155,"column":52}},{"start":{"line":155,"column":52},"end":{"line":155,"column":null}}],"line":155},"22":{"loc":{"start":{"line":156,"column":6},"end":{"line":156,"column":null}},"type":"if","locations":[{"start":{"line":156,"column":6},"end":{"line":156,"column":null}},{"start":{},"end":{}}],"line":156},"23":{"loc":{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},"type":"if","locations":[{"start":{"line":176,"column":4},"end":{"line":176,"column":null}},{"start":{},"end":{}}],"line":176},"24":{"loc":{"start":{"line":176,"column":8},"end":{"line":176,"column":40}},"type":"binary-expr","locations":[{"start":{"line":176,"column":8},"end":{"line":176,"column":17}},{"start":{"line":176,"column":17},"end":{"line":176,"column":40}}],"line":176},"25":{"loc":{"start":{"line":180,"column":4},"end":{"line":180,"column":null}},"type":"if","locations":[{"start":{"line":180,"column":4},"end":{"line":180,"column":null}},{"start":{},"end":{}}],"line":180},"26":{"loc":{"start":{"line":180,"column":8},"end":{"line":180,"column":44}},"type":"binary-expr","locations":[{"start":{"line":180,"column":8},"end":{"line":180,"column":27}},{"start":{"line":180,"column":27},"end":{"line":180,"column":44}}],"line":180},"27":{"loc":{"start":{"line":196,"column":4},"end":{"line":196,"column":null}},"type":"if","locations":[{"start":{"line":196,"column":4},"end":{"line":196,"column":null}},{"start":{},"end":{}}],"line":196},"28":{"loc":{"start":{"line":198,"column":6},"end":{"line":201,"column":null}},"type":"if","locations":[{"start":{"line":198,"column":6},"end":{"line":201,"column":null}},{"start":{},"end":{}}],"line":198},"29":{"loc":{"start":{"line":198,"column":10},"end":{"line":198,"column":88}},"type":"binary-expr","locations":[{"start":{"line":198,"column":10},"end":{"line":198,"column":36}},{"start":{"line":198,"column":36},"end":{"line":198,"column":88}}],"line":198},"30":{"loc":{"start":{"line":209,"column":4},"end":{"line":209,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":4},"end":{"line":209,"column":null}},{"start":{},"end":{}}],"line":209},"31":{"loc":{"start":{"line":211,"column":6},"end":{"line":213,"column":null}},"type":"if","locations":[{"start":{"line":211,"column":6},"end":{"line":213,"column":null}},{"start":{},"end":{}}],"line":211},"32":{"loc":{"start":{"line":211,"column":10},"end":{"line":211,"column":80}},"type":"binary-expr","locations":[{"start":{"line":211,"column":10},"end":{"line":211,"column":32}},{"start":{"line":211,"column":32},"end":{"line":211,"column":80}}],"line":211},"33":{"loc":{"start":{"line":233,"column":4},"end":{"line":233,"column":null}},"type":"if","locations":[{"start":{"line":233,"column":4},"end":{"line":233,"column":null}},{"start":{},"end":{}}],"line":233},"34":{"loc":{"start":{"line":235,"column":4},"end":{"line":237,"column":null}},"type":"if","locations":[{"start":{"line":235,"column":4},"end":{"line":237,"column":null}},{"start":{},"end":{}}],"line":235},"35":{"loc":{"start":{"line":235,"column":8},"end":{"line":235,"column":38}},"type":"binary-expr","locations":[{"start":{"line":235,"column":8},"end":{"line":235,"column":21}},{"start":{"line":235,"column":21},"end":{"line":235,"column":38}}],"line":235},"36":{"loc":{"start":{"line":236,"column":45},"end":{"line":236,"column":70}},"type":"binary-expr","locations":[{"start":{"line":236,"column":45},"end":{"line":236,"column":64}},{"start":{"line":236,"column":64},"end":{"line":236,"column":70}}],"line":236},"37":{"loc":{"start":{"line":241,"column":4},"end":{"line":241,"column":null}},"type":"if","locations":[{"start":{"line":241,"column":4},"end":{"line":241,"column":null}},{"start":{},"end":{}}],"line":241},"38":{"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":null}},"type":"if","locations":[{"start":{"line":243,"column":4},"end":{"line":245,"column":null}},{"start":{},"end":{}}],"line":243},"39":{"loc":{"start":{"line":243,"column":8},"end":{"line":243,"column":38}},"type":"binary-expr","locations":[{"start":{"line":243,"column":8},"end":{"line":243,"column":21}},{"start":{"line":243,"column":21},"end":{"line":243,"column":38}}],"line":243},"40":{"loc":{"start":{"line":244,"column":39},"end":{"line":244,"column":70}},"type":"binary-expr","locations":[{"start":{"line":244,"column":39},"end":{"line":244,"column":57}},{"start":{"line":244,"column":57},"end":{"line":244,"column":70}}],"line":244},"41":{"loc":{"start":{"line":249,"column":40},"end":{"line":249,"column":83}},"type":"binary-expr","locations":[{"start":{"line":249,"column":40},"end":{"line":249,"column":58}},{"start":{"line":249,"column":58},"end":{"line":249,"column":73}},{"start":{"line":249,"column":73},"end":{"line":249,"column":83}}],"line":249},"42":{"loc":{"start":{"line":250,"column":24},"end":{"line":250,"column":null}},"type":"binary-expr","locations":[{"start":{"line":250,"column":24},"end":{"line":250,"column":43}},{"start":{"line":250,"column":43},"end":{"line":250,"column":null}}],"line":250},"43":{"loc":{"start":{"line":258,"column":6},"end":{"line":262,"column":null}},"type":"if","locations":[{"start":{"line":258,"column":6},"end":{"line":262,"column":null}},{"start":{"line":260,"column":13},"end":{"line":262,"column":null}}],"line":258},"44":{"loc":{"start":{"line":271,"column":12},"end":{"line":273,"column":null}},"type":"cond-expr","locations":[{"start":{"line":272,"column":16},"end":{"line":272,"column":null}},{"start":{"line":273,"column":16},"end":{"line":273,"column":null}}],"line":271},"45":{"loc":{"start":{"line":293,"column":14},"end":{"line":302,"column":null}},"type":"binary-expr","locations":[{"start":{"line":293,"column":14},"end":{"line":293,"column":31}},{"start":{"line":293,"column":31},"end":{"line":293,"column":48}},{"start":{"line":293,"column":48},"end":{"line":293,"column":null}},{"start":{"line":294,"column":14},"end":{"line":302,"column":null}}],"line":293},"46":{"loc":{"start":{"line":298,"column":28},"end":{"line":298,"column":null}},"type":"cond-expr","locations":[{"start":{"line":298,"column":44},"end":{"line":298,"column":64}},{"start":{"line":298,"column":64},"end":{"line":298,"column":null}}],"line":298},"47":{"loc":{"start":{"line":299,"column":23},"end":{"line":299,"column":null}},"type":"cond-expr","locations":[{"start":{"line":299,"column":39},"end":{"line":299,"column":52}},{"start":{"line":299,"column":52},"end":{"line":299,"column":null}}],"line":299},"48":{"loc":{"start":{"line":310,"column":26},"end":{"line":310,"column":null}},"type":"cond-expr","locations":[{"start":{"line":310,"column":40},"end":{"line":310,"column":60}},{"start":{"line":310,"column":60},"end":{"line":310,"column":null}}],"line":310},"49":{"loc":{"start":{"line":312,"column":15},"end":{"line":312,"column":null}},"type":"cond-expr","locations":[{"start":{"line":312,"column":29},"end":{"line":312,"column":58}},{"start":{"line":312,"column":58},"end":{"line":312,"column":null}}],"line":312},"50":{"loc":{"start":{"line":318,"column":9},"end":{"line":344,"column":null}},"type":"binary-expr","locations":[{"start":{"line":318,"column":9},"end":{"line":318,"column":25}},{"start":{"line":318,"column":25},"end":{"line":318,"column":null}},{"start":{"line":319,"column":10},"end":{"line":344,"column":null}}],"line":318},"51":{"loc":{"start":{"line":325,"column":18},"end":{"line":327,"column":null}},"type":"cond-expr","locations":[{"start":{"line":326,"column":22},"end":{"line":326,"column":null}},{"start":{"line":327,"column":22},"end":{"line":327,"column":null}}],"line":325},"52":{"loc":{"start":{"line":325,"column":27},"end":{"line":325,"column":89}},"type":"cond-expr","locations":[{"start":{"line":325,"column":37},"end":{"line":325,"column":64}},{"start":{"line":325,"column":64},"end":{"line":325,"column":89}}],"line":325},"53":{"loc":{"start":{"line":331,"column":22},"end":{"line":334,"column":null}},"type":"binary-expr","locations":[{"start":{"line":331,"column":22},"end":{"line":331,"column":98}},{"start":{"line":331,"column":98},"end":{"line":334,"column":null}}],"line":331},"54":{"loc":{"start":{"line":331,"column":31},"end":{"line":331,"column":93}},"type":"cond-expr","locations":[{"start":{"line":331,"column":41},"end":{"line":331,"column":68}},{"start":{"line":331,"column":68},"end":{"line":331,"column":93}}],"line":331},"55":{"loc":{"start":{"line":337,"column":27},"end":{"line":337,"column":89}},"type":"cond-expr","locations":[{"start":{"line":337,"column":37},"end":{"line":337,"column":64}},{"start":{"line":337,"column":64},"end":{"line":337,"column":89}}],"line":337},"56":{"loc":{"start":{"line":363,"column":15},"end":{"line":363,"column":null}},"type":"cond-expr","locations":[{"start":{"line":363,"column":28},"end":{"line":363,"column":34}},{"start":{"line":363,"column":34},"end":{"line":363,"column":null}}],"line":363},"57":{"loc":{"start":{"line":383,"column":26},"end":{"line":383,"column":null}},"type":"cond-expr","locations":[{"start":{"line":383,"column":45},"end":{"line":383,"column":103}},{"start":{"line":383,"column":103},"end":{"line":383,"column":null}}],"line":383},"58":{"loc":{"start":{"line":383,"column":67},"end":{"line":383,"column":92}},"type":"binary-expr","locations":[{"start":{"line":383,"column":67},"end":{"line":383,"column":82}},{"start":{"line":383,"column":82},"end":{"line":383,"column":92}}],"line":383},"59":{"loc":{"start":{"line":389,"column":18},"end":{"line":391,"column":null}},"type":"cond-expr","locations":[{"start":{"line":390,"column":22},"end":{"line":390,"column":null}},{"start":{"line":391,"column":22},"end":{"line":391,"column":null}}],"line":389},"60":{"loc":{"start":{"line":398,"column":17},"end":{"line":404,"column":null}},"type":"binary-expr","locations":[{"start":{"line":398,"column":17},"end":{"line":398,"column":null}},{"start":{"line":399,"column":18},"end":{"line":404,"column":null}}],"line":398},"61":{"loc":{"start":{"line":413,"column":14},"end":{"line":415,"column":null}},"type":"cond-expr","locations":[{"start":{"line":414,"column":18},"end":{"line":414,"column":null}},{"start":{"line":415,"column":18},"end":{"line":415,"column":null}}],"line":413},"62":{"loc":{"start":{"line":422,"column":13},"end":{"line":428,"column":null}},"type":"binary-expr","locations":[{"start":{"line":422,"column":13},"end":{"line":422,"column":null}},{"start":{"line":423,"column":14},"end":{"line":428,"column":null}}],"line":422},"63":{"loc":{"start":{"line":444,"column":14},"end":{"line":446,"column":null}},"type":"cond-expr","locations":[{"start":{"line":445,"column":18},"end":{"line":445,"column":null}},{"start":{"line":446,"column":18},"end":{"line":446,"column":null}}],"line":444},"64":{"loc":{"start":{"line":453,"column":13},"end":{"line":459,"column":null}},"type":"binary-expr","locations":[{"start":{"line":453,"column":13},"end":{"line":453,"column":null}},{"start":{"line":454,"column":14},"end":{"line":459,"column":null}}],"line":453},"65":{"loc":{"start":{"line":482,"column":11},"end":{"line":533,"column":null}},"type":"binary-expr","locations":[{"start":{"line":482,"column":11},"end":{"line":482,"column":null}},{"start":{"line":483,"column":12},"end":{"line":533,"column":null}}],"line":482},"66":{"loc":{"start":{"line":516,"column":39},"end":{"line":516,"column":null}},"type":"cond-expr","locations":[{"start":{"line":516,"column":64},"end":{"line":516,"column":83}},{"start":{"line":516,"column":83},"end":{"line":516,"column":null}}],"line":516},"67":{"loc":{"start":{"line":517,"column":38},"end":{"line":517,"column":null}},"type":"cond-expr","locations":[{"start":{"line":517,"column":63},"end":{"line":517,"column":76}},{"start":{"line":517,"column":76},"end":{"line":517,"column":null}}],"line":517},"68":{"loc":{"start":{"line":548,"column":7},"end":{"line":566,"column":null}},"type":"binary-expr","locations":[{"start":{"line":548,"column":7},"end":{"line":548,"column":null}},{"start":{"line":549,"column":8},"end":{"line":566,"column":null}}],"line":548},"69":{"loc":{"start":{"line":557,"column":13},"end":{"line":563,"column":null}},"type":"binary-expr","locations":[{"start":{"line":557,"column":13},"end":{"line":557,"column":null}},{"start":{"line":558,"column":14},"end":{"line":563,"column":null}}],"line":557},"70":{"loc":{"start":{"line":570,"column":7},"end":{"line":582,"column":null}},"type":"binary-expr","locations":[{"start":{"line":570,"column":7},"end":{"line":570,"column":25}},{"start":{"line":570,"column":25},"end":{"line":570,"column":null}},{"start":{"line":571,"column":8},"end":{"line":582,"column":null}}],"line":570},"71":{"loc":{"start":{"line":586,"column":7},"end":{"line":599,"column":null}},"type":"binary-expr","locations":[{"start":{"line":586,"column":7},"end":{"line":586,"column":null}},{"start":{"line":587,"column":8},"end":{"line":599,"column":null}}],"line":586},"72":{"loc":{"start":{"line":593,"column":25},"end":{"line":593,"column":null}},"type":"binary-expr","locations":[{"start":{"line":593,"column":25},"end":{"line":593,"column":64}},{"start":{"line":593,"column":64},"end":{"line":593,"column":null}}],"line":593},"73":{"loc":{"start":{"line":594,"column":26},"end":{"line":594,"column":null}},"type":"binary-expr","locations":[{"start":{"line":594,"column":26},"end":{"line":594,"column":66}},{"start":{"line":594,"column":66},"end":{"line":594,"column":null}}],"line":594}},"s":{"0":2,"1":2,"2":2,"3":16,"4":2,"5":74,"6":74,"7":74,"8":74,"9":74,"10":74,"11":74,"12":74,"13":74,"14":74,"15":43,"16":38,"17":5,"18":1,"19":1,"20":5,"21":5,"22":5,"23":74,"24":12,"25":12,"26":74,"27":51,"28":51,"29":246,"30":12,"31":51,"32":74,"33":960,"34":664,"35":296,"36":296,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":74,"45":51,"46":246,"47":4,"48":8,"49":74,"50":51,"51":408,"52":408,"53":408,"54":0,"55":74,"56":51,"57":51,"58":848,"59":848,"60":848,"61":8,"62":840,"63":74,"64":74,"65":55,"66":448,"67":74,"68":55,"69":441,"70":74,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":74,"85":51,"86":246,"87":74,"88":51,"89":246,"90":74,"91":37,"92":37,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":74,"101":37,"102":37,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":74,"110":0,"111":0,"112":0,"113":0,"114":74,"115":0,"116":0,"117":0,"118":74,"119":0,"120":0,"121":0,"122":0,"123":0,"124":74,"125":0,"126":0,"127":0,"128":0,"129":0,"130":74,"131":624,"132":3702,"133":624,"134":624,"135":624,"136":624,"137":624,"138":624,"139":3,"140":3,"141":1,"142":2,"143":624,"144":2,"145":0,"146":12,"147":12,"148":20,"149":2,"150":2,"151":624,"152":624,"153":624,"154":74,"155":148,"156":427,"157":148,"158":0,"159":0,"160":0,"161":5,"162":5,"163":72,"164":4,"165":595,"166":0,"167":0},"f":{"0":16,"1":74,"2":43,"3":1,"4":5,"5":12,"6":12,"7":51,"8":960,"9":51,"10":246,"11":4,"12":8,"13":51,"14":408,"15":51,"16":848,"17":55,"18":448,"19":55,"20":441,"21":0,"22":0,"23":51,"24":246,"25":51,"26":246,"27":37,"28":0,"29":0,"30":37,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":624,"38":3702,"39":3,"40":2,"41":0,"42":12,"43":20,"44":2,"45":624,"46":148,"47":427,"48":0,"49":0,"50":0,"51":5,"52":5,"53":72,"54":4,"55":595,"56":0,"57":0},"b":{"0":[74],"1":[38,5],"2":[1,0],"3":[1,1],"4":[12,11],"5":[12,234],"6":[664,296],"7":[296,0],"8":[296,296],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[246,12],"16":[408,0],"17":[408,408],"18":[0,0],"19":[408,0],"20":[848,842],"21":[848,843],"22":[8,840],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[37,0],"28":[0,0],"29":[0,0],"30":[37,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0],"41":[3702,449,449],"42":[624,605],"43":[1,2],"44":[0,624],"45":[624,392,50,233],"46":[29,204],"47":[29,204],"48":[606,18],"49":[606,18],"50":[624,18,18],"51":[0,20],"52":[4,16],"53":[20,0],"54":[4,16],"55":[1,1],"56":[0,624],"57":[74,74],"58":[427,427],"59":[74,74],"60":[148,57],"61":[0,74],"62":[74,0],"63":[0,74],"64":[74,0],"65":[74,9],"66":[69,3],"67":[69,3],"68":[74,24],"69":[24,1],"70":[74,0,0],"71":[74,0],"72":[0,0],"73":[0,0]},"meta":{"lastBranch":74,"lastFunction":58,"lastStatement":168,"seen":{"s:54:16:57:Infinity":0,"s:66:48:75:Infinity":1,"s:77:23:77:Infinity":2,"f:77:59:77:60":0,"s:77:66:77:72":3,"s:79:13:603:Infinity":4,"f:79:37:79:45":1,"b:79:174:79:177":0,"s:80:32:80:Infinity":5,"s:81:44:81:Infinity":6,"s:82:42:82:Infinity":7,"s:83:44:83:Infinity":8,"s:84:8:84:Infinity":9,"s:85:8:85:Infinity":10,"s:86:40:86:Infinity":11,"s:87:8:87:Infinity":12,"s:88:60:88:Infinity":13,"s:91:2:100:Infinity":14,"f:91:12:91:18":2,"b:92:4:92:Infinity:undefined:undefined:undefined:undefined":1,"s:92:4:92:Infinity":15,"s:92:24:92:Infinity":16,"s:93:24:97:Infinity":17,"f:93:24:93:25":3,"b:94:6:96:Infinity:undefined:undefined:undefined:undefined":2,"s:94:6:96:Infinity":18,"b:94:10:94:34:94:34:94:84":3,"s:95:8:95:Infinity":19,"s:98:4:98:Infinity":20,"s:99:4:99:Infinity":21,"f:99:11:99:17":4,"s:99:17:99:Infinity":22,"s:102:24:104:Infinity":23,"f:102:24:102:25":5,"s:103:4:103:Infinity":24,"f:103:17:103:18":6,"s:103:28:103:71":25,"b:103:49:103:63:103:63:103:69":4,"s:107:8:113:Infinity":26,"f:107:31:107:37":7,"s:108:44:108:Infinity":27,"s:109:4:111:Infinity":28,"b:110:6:110:Infinity:undefined:undefined:undefined:undefined":5,"s:110:6:110:Infinity":29,"s:110:28:110:Infinity":30,"s:112:4:112:Infinity":31,"s:115:19:122:Infinity":32,"f:115:19:115:20":8,"b:116:4:116:Infinity:undefined:undefined:undefined:undefined":6,"s:116:4:116:Infinity":33,"s:116:37:116:Infinity":34,"b:117:4:117:Infinity:undefined:undefined:undefined:undefined":7,"s:117:4:117:Infinity":35,"b:117:8:117:33:117:33:117:62":8,"s:117:62:117:Infinity":36,"b:118:4:118:Infinity:undefined:undefined:undefined:undefined":9,"s:118:4:118:Infinity":37,"b:118:8:118:39:118:39:118:74":10,"s:118:74:118:Infinity":38,"b:119:4:119:Infinity:undefined:undefined:undefined:undefined":11,"s:119:4:119:Infinity":39,"b:119:8:119:33:119:33:119:62":12,"s:119:62:119:Infinity":40,"b:120:4:120:Infinity:undefined:undefined:undefined:undefined":13,"s:120:4:120:Infinity":41,"b:120:8:120:32:120:32:120:60":14,"s:120:60:120:Infinity":42,"s:121:4:121:Infinity":43,"s:125:8:135:Infinity":44,"f:125:54:125:60":9,"s:126:4:134:Infinity":45,"f:127:14:127:15":10,"s:127:21:127:69":46,"b:127:21:127:41:127:41:127:69":15,"f:128:12:128:13":11,"s:128:22:128:52":47,"f:129:11:129:12":12,"s:129:19:134:8":48,"s:138:8:148:Infinity":49,"f:138:55:138:61":13,"s:139:4:147:Infinity":50,"f:139:39:139:40":14,"s:140:24:140:Infinity":51,"b:141:6:141:Infinity:undefined:undefined:undefined:undefined":16,"s:141:6:141:Infinity":52,"b:141:10:141:30:141:30:141:49":17,"s:141:49:141:Infinity":53,"s:142:6:146:Infinity":54,"b:144:25:144:62:144:62:144:Infinity":18,"b:145:21:145:41:145:41:145:Infinity":19,"s:151:8:159:Infinity":55,"f:151:35:151:41":15,"s:152:19:152:Infinity":56,"s:153:4:158:Infinity":57,"f:153:23:153:24":16,"s:154:21:154:Infinity":58,"b:154:21:154:52:154:52:154:Infinity":20,"s:155:21:155:Infinity":59,"b:155:21:155:52:155:52:155:Infinity":21,"b:156:6:156:Infinity:undefined:undefined:undefined:undefined":22,"s:156:6:156:Infinity":60,"s:156:29:156:Infinity":61,"s:157:6:157:Infinity":62,"s:162:8:165:Infinity":63,"s:167:8:170:Infinity":64,"f:168:4:168:10":17,"s:168:10:168:Infinity":65,"f:168:34:168:35":18,"s:168:41:168:65":66,"s:172:8:172:Infinity":67,"f:172:29:172:35":19,"s:172:35:172:71":68,"f:172:55:172:56":20,"s:172:62:172:68":69,"s:174:8:189:Infinity":70,"f:174:36:174:37":21,"s:175:29:175:Infinity":71,"b:176:4:176:Infinity:undefined:undefined:undefined:undefined":23,"s:176:4:176:Infinity":72,"b:176:8:176:17:176:17:176:40":24,"s:176:40:176:Infinity":73,"s:178:21:178:Infinity":74,"s:179:21:179:Infinity":75,"b:180:4:180:Infinity:undefined:undefined:undefined:undefined":25,"s:180:4:180:Infinity":76,"b:180:8:180:27:180:27:180:44":26,"s:180:44:180:Infinity":77,"s:183:22:183:Infinity":78,"s:184:4:184:Infinity":79,"s:185:4:185:Infinity":80,"s:187:20:187:Infinity":81,"f:187:34:187:35":22,"s:187:52:187:75":82,"s:188:4:188:Infinity":83,"s:191:8:191:Infinity":84,"f:191:32:191:38":23,"s:191:38:191:80":85,"f:191:53:191:54":24,"s:191:60:191:70":86,"s:192:8:192:Infinity":87,"f:192:31:192:37":25,"s:192:37:192:78":88,"f:192:52:192:53":26,"s:192:59:192:68":89,"s:195:2:205:Infinity":90,"f:195:12:195:18":27,"b:196:4:196:Infinity:undefined:undefined:undefined:undefined":27,"s:196:4:196:Infinity":91,"s:196:25:196:Infinity":92,"s:197:20:202:Infinity":93,"f:197:20:197:21":28,"b:198:6:201:Infinity:undefined:undefined:undefined:undefined":28,"s:198:6:201:Infinity":94,"b:198:10:198:36:198:36:198:88":29,"s:199:8:199:Infinity":95,"s:200:8:200:Infinity":96,"s:203:4:203:Infinity":97,"s:204:4:204:Infinity":98,"f:204:11:204:17":29,"s:204:17:204:Infinity":99,"s:208:2:217:Infinity":100,"f:208:12:208:18":30,"b:209:4:209:Infinity:undefined:undefined:undefined:undefined":30,"s:209:4:209:Infinity":101,"s:209:26:209:Infinity":102,"s:210:20:214:Infinity":103,"f:210:20:210:21":31,"b:211:6:213:Infinity:undefined:undefined:undefined:undefined":31,"s:211:6:213:Infinity":104,"b:211:10:211:32:211:32:211:80":32,"s:212:8:212:Infinity":105,"s:215:4:215:Infinity":106,"s:216:4:216:Infinity":107,"f:216:11:216:17":32,"s:216:17:216:Infinity":108,"s:219:8:224:Infinity":109,"f:219:40:219:41":33,"s:220:4:220:Infinity":110,"s:221:4:221:Infinity":111,"s:222:4:222:Infinity":112,"s:223:4:223:Infinity":113,"s:226:8:230:Infinity":114,"f:226:43:226:44":34,"s:227:4:227:Infinity":115,"s:228:4:228:Infinity":116,"s:229:4:229:Infinity":117,"s:232:8:238:Infinity":118,"f:232:42:232:43":35,"b:233:4:233:Infinity:undefined:undefined:undefined:undefined":33,"s:233:4:233:Infinity":119,"s:233:26:233:Infinity":120,"s:234:22:234:Infinity":121,"b:235:4:237:Infinity:undefined:undefined:undefined:undefined":34,"s:235:4:237:Infinity":122,"b:235:8:235:21:235:21:235:38":35,"s:236:6:236:Infinity":123,"b:236:45:236:64:236:64:236:70":36,"s:240:8:246:Infinity":124,"f:240:43:240:44":36,"b:241:4:241:Infinity:undefined:undefined:undefined:undefined":37,"s:241:4:241:Infinity":125,"s:241:26:241:Infinity":126,"s:242:22:242:Infinity":127,"b:243:4:245:Infinity:undefined:undefined:undefined:undefined":38,"s:243:4:245:Infinity":128,"b:243:8:243:21:243:21:243:38":39,"s:244:6:244:Infinity":129,"b:244:39:244:57:244:57:244:70":40,"s:248:31:348:Infinity":130,"f:248:31:248:32":37,"s:249:18:249:Infinity":131,"f:249:33:249:34":38,"s:249:40:249:83":132,"b:249:40:249:58:249:58:249:73:249:73:249:83":41,"s:250:24:250:Infinity":133,"b:250:24:250:43:250:43:250:Infinity":42,"s:251:20:251:Infinity":134,"s:252:26:252:Infinity":135,"s:253:10:253:Infinity":136,"s:254:10:254:Infinity":137,"s:256:28:263:Infinity":138,"f:256:28:256:29":39,"s:257:6:257:Infinity":139,"b:258:6:262:Infinity:260:13:262:Infinity":43,"s:258:6:262:Infinity":140,"s:259:8:259:Infinity":141,"s:261:8:261:Infinity":142,"s:265:4:346:Infinity":143,"b:272:16:272:Infinity:273:16:273:Infinity":44,"f:276:19:276:25":40,"s:276:25:276:Infinity":144,"f:277:25:277:26":41,"s:277:32:277:Infinity":145,"b:293:14:293:31:293:31:293:48:293:48:293:Infinity:294:14:302:Infinity":45,"b:298:44:298:64:298:64:298:Infinity":46,"b:299:39:299:52:299:52:299:Infinity":47,"f:306:23:306:24":42,"s:307:16:307:Infinity":146,"s:308:16:308:Infinity":147,"b:310:40:310:60:310:60:310:Infinity":48,"b:312:29:312:58:312:58:312:Infinity":49,"b:318:9:318:25:318:25:318:Infinity:319:10:344:Infinity":50,"f:320:23:320:24":43,"s:321:14:342:Infinity":148,"b:326:22:326:Infinity:327:22:327:Infinity":51,"b:325:37:325:64:325:64:325:89":52,"b:331:22:331:98:331:98:334:Infinity":53,"b:331:41:331:68:331:68:331:93":54,"f:336:25:336:31":44,"s:337:18:337:Infinity":149,"b:337:37:337:64:337:64:337:89":55,"s:338:18:338:Infinity":150,"f:350:11:350:27":45,"s:358:4:358:Infinity":151,"s:360:18:365:Infinity":152,"b:363:28:363:34:363:34:363:Infinity":56,"s:367:4:370:Infinity":153,"s:374:2:601:Infinity":154,"f:382:23:382:24":46,"s:383:26:383:Infinity":155,"b:383:45:383:103:383:103:383:Infinity":57,"f:383:60:383:61":47,"s:383:67:383:92":156,"b:383:67:383:82:383:82:383:92":58,"s:384:12:406:Infinity":157,"b:390:22:390:Infinity:391:22:391:Infinity":59,"f:394:25:394:31":48,"s:394:31:394:Infinity":158,"b:398:17:398:Infinity:399:18:404:Infinity":60,"b:414:18:414:Infinity:415:18:415:Infinity":61,"f:418:21:418:27":49,"s:418:27:418:Infinity":159,"b:422:13:422:Infinity:423:14:428:Infinity":62,"b:445:18:445:Infinity:446:18:446:Infinity":63,"f:449:21:449:27":50,"s:449:27:449:Infinity":160,"b:453:13:453:Infinity:454:14:459:Infinity":64,"f:474:23:474:29":51,"s:474:29:474:Infinity":161,"f:474:46:474:47":52,"s:474:53:474:55":162,"b:482:11:482:Infinity:483:12:533:Infinity":65,"f:499:36:499:37":53,"s:500:16:531:Infinity":163,"f:504:27:504:33":54,"s:504:33:504:Infinity":164,"b:516:64:516:83:516:83:516:Infinity":66,"b:517:63:517:76:517:76:517:Infinity":67,"f:540:33:540:34":55,"s:541:14:541:Infinity":165,"b:548:7:548:Infinity:549:8:566:Infinity":68,"b:557:13:557:Infinity:558:14:563:Infinity":69,"b:570:7:570:25:570:25:570:Infinity:571:8:582:Infinity":70,"f:578:21:578:27":56,"s:578:27:578:Infinity":166,"b:586:7:586:Infinity:587:8:599:Infinity":71,"b:593:25:593:64:593:64:593:Infinity":72,"b:594:26:594:66:594:66:594:Infinity":73,"f:597:21:597:27":57,"s:597:27:597:Infinity":167}}} +,"/Users/luca/Workspace/laputa-app/src/components/StatusBar.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/StatusBar.tsx","statementMap":{"0":{"start":{"line":17,"column":40},"end":{"line":17,"column":null}},"1":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"2":{"start":{"line":20,"column":22},"end":{"line":20,"column":null}},"3":{"start":{"line":20,"column":41},"end":{"line":20,"column":61}},"4":{"start":{"line":22,"column":2},"end":{"line":31,"column":null}},"5":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"6":{"start":{"line":23,"column":24},"end":{"line":23,"column":null}},"7":{"start":{"line":24,"column":24},"end":{"line":28,"column":null}},"8":{"start":{"line":25,"column":6},"end":{"line":27,"column":null}},"9":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"10":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"11":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"12":{"start":{"line":30,"column":17},"end":{"line":30,"column":null}},"13":{"start":{"line":33,"column":2},"end":{"line":157,"column":null}},"14":{"start":{"line":53,"column":27},"end":{"line":53,"column":null}},"15":{"start":{"line":53,"column":51},"end":{"line":53,"column":53}},"16":{"start":{"line":85,"column":16},"end":{"line":112,"column":null}},"17":{"start":{"line":89,"column":20},"end":{"line":89,"column":null}},"18":{"start":{"line":90,"column":20},"end":{"line":90,"column":null}},"19":{"start":{"line":104,"column":20},"end":{"line":104,"column":null}},"20":{"start":{"line":104,"column":46},"end":{"line":104,"column":null}},"21":{"start":{"line":107,"column":20},"end":{"line":107,"column":null}},"22":{"start":{"line":107,"column":46},"end":{"line":107,"column":null}}},"fnMap":{"0":{"name":"StatusBar","decl":{"start":{"line":16,"column":16},"end":{"line":16,"column":26}},"loc":{"start":{"line":16,"column":91},"end":{"line":159,"column":null}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":34},"end":{"line":20,"column":35}},"loc":{"start":{"line":20,"column":41},"end":{"line":20,"column":61}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":22,"column":12},"end":{"line":22,"column":18}},"loc":{"start":{"line":22,"column":18},"end":{"line":31,"column":5}},"line":22},"3":{"name":"(anonymous_3)","decl":{"start":{"line":24,"column":24},"end":{"line":24,"column":25}},"loc":{"start":{"line":24,"column":43},"end":{"line":28,"column":null}},"line":24},"4":{"name":"(anonymous_4)","decl":{"start":{"line":30,"column":11},"end":{"line":30,"column":17}},"loc":{"start":{"line":30,"column":17},"end":{"line":30,"column":null}},"line":30},"5":{"name":"(anonymous_5)","decl":{"start":{"line":53,"column":21},"end":{"line":53,"column":27}},"loc":{"start":{"line":53,"column":27},"end":{"line":53,"column":null}},"line":53},"6":{"name":"(anonymous_6)","decl":{"start":{"line":53,"column":44},"end":{"line":53,"column":45}},"loc":{"start":{"line":53,"column":51},"end":{"line":53,"column":53}},"line":53},"7":{"name":"(anonymous_7)","decl":{"start":{"line":84,"column":26},"end":{"line":84,"column":27}},"loc":{"start":{"line":85,"column":16},"end":{"line":112,"column":null}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":88,"column":27},"end":{"line":88,"column":33}},"loc":{"start":{"line":88,"column":33},"end":{"line":91,"column":null}},"line":88},"9":{"name":"(anonymous_9)","decl":{"start":{"line":103,"column":32},"end":{"line":103,"column":33}},"loc":{"start":{"line":103,"column":39},"end":{"line":105,"column":null}},"line":103},"10":{"name":"(anonymous_10)","decl":{"start":{"line":106,"column":32},"end":{"line":106,"column":33}},"loc":{"start":{"line":106,"column":39},"end":{"line":108,"column":null}},"line":106}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},{"start":{},"end":{}}],"line":23},"1":{"loc":{"start":{"line":25,"column":6},"end":{"line":27,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":6},"end":{"line":27,"column":null}},{"start":{},"end":{}}],"line":25},"2":{"loc":{"start":{"line":25,"column":10},"end":{"line":25,"column":74}},"type":"binary-expr","locations":[{"start":{"line":25,"column":10},"end":{"line":25,"column":29}},{"start":{"line":25,"column":29},"end":{"line":25,"column":74}}],"line":25},"3":{"loc":{"start":{"line":61,"column":26},"end":{"line":61,"column":null}},"type":"cond-expr","locations":[{"start":{"line":61,"column":42},"end":{"line":61,"column":59}},{"start":{"line":61,"column":59},"end":{"line":61,"column":null}}],"line":61},"4":{"loc":{"start":{"line":66,"column":13},"end":{"line":66,"column":null}},"type":"binary-expr","locations":[{"start":{"line":66,"column":13},"end":{"line":66,"column":35}},{"start":{"line":66,"column":35},"end":{"line":66,"column":null}}],"line":66},"5":{"loc":{"start":{"line":68,"column":11},"end":{"line":114,"column":null}},"type":"binary-expr","locations":[{"start":{"line":68,"column":11},"end":{"line":68,"column":null}},{"start":{"line":69,"column":12},"end":{"line":114,"column":null}}],"line":68},"6":{"loc":{"start":{"line":99,"column":32},"end":{"line":99,"column":null}},"type":"cond-expr","locations":[{"start":{"line":99,"column":55},"end":{"line":99,"column":72}},{"start":{"line":99,"column":72},"end":{"line":99,"column":null}}],"line":99},"7":{"loc":{"start":{"line":100,"column":27},"end":{"line":100,"column":null}},"type":"cond-expr","locations":[{"start":{"line":100,"column":50},"end":{"line":100,"column":72}},{"start":{"line":100,"column":72},"end":{"line":100,"column":null}}],"line":100},"8":{"loc":{"start":{"line":104,"column":20},"end":{"line":104,"column":null}},"type":"if","locations":[{"start":{"line":104,"column":20},"end":{"line":104,"column":null}},{"start":{},"end":{}}],"line":104},"9":{"loc":{"start":{"line":107,"column":20},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":107,"column":20},"end":{"line":107,"column":null}},{"start":{},"end":{}}],"line":107},"10":{"loc":{"start":{"line":110,"column":19},"end":{"line":110,"column":null}},"type":"cond-expr","locations":[{"start":{"line":110,"column":42},"end":{"line":110,"column":64}},{"start":{"line":110,"column":64},"end":{"line":110,"column":null}}],"line":110}},"s":{"0":22,"1":22,"2":22,"3":22,"4":22,"5":7,"6":7,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":22,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0},"f":{"0":22,"1":22,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[7,0],"1":[0,0],"2":[0,0],"3":[0,22],"4":[22,0],"5":[22,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0]},"meta":{"lastBranch":11,"lastFunction":11,"lastStatement":23,"seen":{"f:16:16:16:26":0,"s:17:40:17:Infinity":0,"s:18:8:18:Infinity":1,"s:20:22:20:Infinity":2,"f:20:34:20:35":1,"s:20:41:20:61":3,"s:22:2:31:Infinity":4,"f:22:12:22:18":2,"b:23:4:23:Infinity:undefined:undefined:undefined:undefined":0,"s:23:4:23:Infinity":5,"s:23:24:23:Infinity":6,"s:24:24:28:Infinity":7,"f:24:24:24:25":3,"b:25:6:27:Infinity:undefined:undefined:undefined:undefined":1,"s:25:6:27:Infinity":8,"b:25:10:25:29:25:29:25:74":2,"s:26:8:26:Infinity":9,"s:29:4:29:Infinity":10,"s:30:4:30:Infinity":11,"f:30:11:30:17":4,"s:30:17:30:Infinity":12,"s:33:2:157:Infinity":13,"f:53:21:53:27":5,"s:53:27:53:Infinity":14,"f:53:44:53:45":6,"s:53:51:53:53":15,"b:61:42:61:59:61:59:61:Infinity":3,"b:66:13:66:35:66:35:66:Infinity":4,"b:68:11:68:Infinity:69:12:114:Infinity":5,"f:84:26:84:27":7,"s:85:16:112:Infinity":16,"f:88:27:88:33":8,"s:89:20:89:Infinity":17,"s:90:20:90:Infinity":18,"b:99:55:99:72:99:72:99:Infinity":6,"b:100:50:100:72:100:72:100:Infinity":7,"f:103:32:103:33":9,"b:104:20:104:Infinity:undefined:undefined:undefined:undefined":8,"s:104:20:104:Infinity":19,"s:104:46:104:Infinity":20,"f:106:32:106:33":10,"b:107:20:107:Infinity:undefined:undefined:undefined:undefined":9,"s:107:20:107:Infinity":21,"s:107:46:107:Infinity":22,"b:110:42:110:64:110:64:110:Infinity":10}}} +,"/Users/luca/Workspace/laputa-app/src/components/TabBar.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/TabBar.tsx","statementMap":{"0":{"start":{"line":21,"column":28},"end":{"line":21,"column":null}},"1":{"start":{"line":23,"column":13},"end":{"line":210,"column":null}},"2":{"start":{"line":26,"column":32},"end":{"line":26,"column":null}},"3":{"start":{"line":27,"column":32},"end":{"line":27,"column":null}},"4":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"5":{"start":{"line":30,"column":8},"end":{"line":43,"column":null}},"6":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"7":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"8":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"9":{"start":{"line":35,"column":4},"end":{"line":42,"column":null}},"10":{"start":{"line":36,"column":6},"end":{"line":36,"column":null}},"11":{"start":{"line":37,"column":6},"end":{"line":41,"column":null}},"12":{"start":{"line":38,"column":8},"end":{"line":40,"column":null}},"13":{"start":{"line":39,"column":10},"end":{"line":39,"column":null}},"14":{"start":{"line":45,"column":8},"end":{"line":52,"column":null}},"15":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"16":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"17":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"18":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"19":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"20":{"start":{"line":54,"column":8},"end":{"line":66,"column":null}},"21":{"start":{"line":55,"column":4},"end":{"line":55,"column":null}},"22":{"start":{"line":56,"column":4},"end":{"line":56,"column":null}},"23":{"start":{"line":57,"column":4},"end":{"line":60,"column":null}},"24":{"start":{"line":58,"column":6},"end":{"line":58,"column":null}},"25":{"start":{"line":59,"column":6},"end":{"line":59,"column":null}},"26":{"start":{"line":62,"column":17},"end":{"line":62,"column":null}},"27":{"start":{"line":63,"column":21},"end":{"line":63,"column":null}},"28":{"start":{"line":64,"column":24},"end":{"line":64,"column":null}},"29":{"start":{"line":65,"column":4},"end":{"line":65,"column":null}},"30":{"start":{"line":68,"column":8},"end":{"line":78,"column":null}},"31":{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},"32":{"start":{"line":70,"column":4},"end":{"line":76,"column":null}},"33":{"start":{"line":72,"column":22},"end":{"line":72,"column":null}},"34":{"start":{"line":73,"column":6},"end":{"line":75,"column":null}},"35":{"start":{"line":74,"column":8},"end":{"line":74,"column":null}},"36":{"start":{"line":77,"column":4},"end":{"line":77,"column":null}},"37":{"start":{"line":80,"column":8},"end":{"line":86,"column":null}},"38":{"start":{"line":82,"column":26},"end":{"line":82,"column":null}},"39":{"start":{"line":83,"column":4},"end":{"line":85,"column":null}},"40":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"41":{"start":{"line":88,"column":2},"end":{"line":208,"column":null}},"42":{"start":{"line":96,"column":25},"end":{"line":96,"column":null}},"43":{"start":{"line":97,"column":31},"end":{"line":97,"column":null}},"44":{"start":{"line":98,"column":30},"end":{"line":98,"column":null}},"45":{"start":{"line":99,"column":8},"end":{"line":168,"column":null}},"46":{"start":{"line":103,"column":32},"end":{"line":103,"column":null}},"47":{"start":{"line":105,"column":31},"end":{"line":105,"column":null}},"48":{"start":{"line":123,"column":27},"end":{"line":123,"column":null}},"49":{"start":{"line":148,"column":16},"end":{"line":148,"column":null}},"50":{"start":{"line":149,"column":16},"end":{"line":149,"column":null}}},"fnMap":{"0":{"name":"TabBar2","decl":{"start":{"line":23,"column":36},"end":{"line":23,"column":43}},"loc":{"start":{"line":25,"column":16},"end":{"line":210,"column":1}},"line":25},"1":{"name":"(anonymous_1)","decl":{"start":{"line":30,"column":38},"end":{"line":30,"column":39}},"loc":{"start":{"line":30,"column":93},"end":{"line":43,"column":5}},"line":30},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":28},"end":{"line":37,"column":34}},"loc":{"start":{"line":37,"column":34},"end":{"line":41,"column":7}},"line":37},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":36},"end":{"line":45,"column":42}},"loc":{"start":{"line":45,"column":42},"end":{"line":52,"column":5}},"line":45},"4":{"name":"(anonymous_4)","decl":{"start":{"line":54,"column":37},"end":{"line":54,"column":38}},"loc":{"start":{"line":54,"column":92},"end":{"line":66,"column":5}},"line":54},"5":{"name":"(anonymous_5)","decl":{"start":{"line":68,"column":33},"end":{"line":68,"column":34}},"loc":{"start":{"line":68,"column":73},"end":{"line":78,"column":5}},"line":68},"6":{"name":"(anonymous_6)","decl":{"start":{"line":80,"column":38},"end":{"line":80,"column":39}},"loc":{"start":{"line":80,"column":78},"end":{"line":86,"column":5}},"line":80},"7":{"name":"(anonymous_7)","decl":{"start":{"line":95,"column":16},"end":{"line":95,"column":17}},"loc":{"start":{"line":95,"column":32},"end":{"line":170,"column":7}},"line":95},"8":{"name":"(anonymous_8)","decl":{"start":{"line":103,"column":25},"end":{"line":103,"column":26}},"loc":{"start":{"line":103,"column":32},"end":{"line":103,"column":null}},"line":103},"9":{"name":"(anonymous_9)","decl":{"start":{"line":105,"column":24},"end":{"line":105,"column":25}},"loc":{"start":{"line":105,"column":31},"end":{"line":105,"column":null}},"line":105},"10":{"name":"(anonymous_10)","decl":{"start":{"line":123,"column":21},"end":{"line":123,"column":27}},"loc":{"start":{"line":123,"column":27},"end":{"line":123,"column":null}},"line":123},"11":{"name":"(anonymous_11)","decl":{"start":{"line":147,"column":23},"end":{"line":147,"column":24}},"loc":{"start":{"line":147,"column":30},"end":{"line":150,"column":null}},"line":147}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":4},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":4},"end":{"line":42,"column":null}},{"start":{},"end":{}}],"line":35},"1":{"loc":{"start":{"line":38,"column":8},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":8},"end":{"line":40,"column":null}},{"start":{},"end":{}}],"line":38},"2":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},{"start":{},"end":{}}],"line":46},"3":{"loc":{"start":{"line":57,"column":4},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":4},"end":{"line":60,"column":null}},{"start":{},"end":{}}],"line":57},"4":{"loc":{"start":{"line":57,"column":8},"end":{"line":57,"column":51}},"type":"binary-expr","locations":[{"start":{"line":57,"column":8},"end":{"line":57,"column":30}},{"start":{"line":57,"column":30},"end":{"line":57,"column":51}}],"line":57},"5":{"loc":{"start":{"line":64,"column":24},"end":{"line":64,"column":null}},"type":"cond-expr","locations":[{"start":{"line":64,"column":47},"end":{"line":64,"column":55}},{"start":{"line":64,"column":55},"end":{"line":64,"column":null}}],"line":64},"6":{"loc":{"start":{"line":70,"column":4},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":70,"column":4},"end":{"line":76,"column":null}},{"start":{},"end":{}}],"line":70},"7":{"loc":{"start":{"line":70,"column":8},"end":{"line":70,"column":94}},"type":"binary-expr","locations":[{"start":{"line":70,"column":8},"end":{"line":70,"column":30}},{"start":{"line":70,"column":30},"end":{"line":70,"column":52}},{"start":{"line":70,"column":52},"end":{"line":70,"column":79}},{"start":{"line":70,"column":79},"end":{"line":70,"column":94}}],"line":70},"8":{"loc":{"start":{"line":72,"column":22},"end":{"line":72,"column":null}},"type":"cond-expr","locations":[{"start":{"line":72,"column":46},"end":{"line":72,"column":62}},{"start":{"line":72,"column":62},"end":{"line":72,"column":null}}],"line":72},"9":{"loc":{"start":{"line":73,"column":6},"end":{"line":75,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":6},"end":{"line":75,"column":null}},{"start":{},"end":{}}],"line":73},"10":{"loc":{"start":{"line":83,"column":4},"end":{"line":85,"column":null}},"type":"if","locations":[{"start":{"line":83,"column":4},"end":{"line":85,"column":null}},{"start":{},"end":{}}],"line":83},"11":{"loc":{"start":{"line":98,"column":30},"end":{"line":98,"column":null}},"type":"binary-expr","locations":[{"start":{"line":98,"column":30},"end":{"line":98,"column":57}},{"start":{"line":98,"column":57},"end":{"line":98,"column":null}}],"line":98},"12":{"loc":{"start":{"line":109,"column":14},"end":{"line":111,"column":null}},"type":"cond-expr","locations":[{"start":{"line":110,"column":18},"end":{"line":110,"column":null}},{"start":{"line":111,"column":18},"end":{"line":111,"column":null}}],"line":109},"13":{"loc":{"start":{"line":114,"column":26},"end":{"line":114,"column":null}},"type":"cond-expr","locations":[{"start":{"line":114,"column":37},"end":{"line":114,"column":59}},{"start":{"line":114,"column":59},"end":{"line":114,"column":null}}],"line":114},"14":{"loc":{"start":{"line":115,"column":40},"end":{"line":115,"column":92}},"type":"cond-expr","locations":[{"start":{"line":115,"column":51},"end":{"line":115,"column":69}},{"start":{"line":115,"column":69},"end":{"line":115,"column":92}}],"line":115},"15":{"loc":{"start":{"line":116,"column":28},"end":{"line":116,"column":null}},"type":"cond-expr","locations":[{"start":{"line":116,"column":39},"end":{"line":116,"column":48}},{"start":{"line":116,"column":48},"end":{"line":116,"column":null}}],"line":116},"16":{"loc":{"start":{"line":119,"column":26},"end":{"line":119,"column":null}},"type":"cond-expr","locations":[{"start":{"line":119,"column":37},"end":{"line":119,"column":43}},{"start":{"line":119,"column":43},"end":{"line":119,"column":null}}],"line":119},"17":{"loc":{"start":{"line":120,"column":22},"end":{"line":120,"column":null}},"type":"cond-expr","locations":[{"start":{"line":120,"column":43},"end":{"line":120,"column":56}},{"start":{"line":120,"column":56},"end":{"line":120,"column":null}}],"line":120},"18":{"loc":{"start":{"line":125,"column":13},"end":{"line":137,"column":null}},"type":"binary-expr","locations":[{"start":{"line":125,"column":13},"end":{"line":125,"column":null}},{"start":{"line":126,"column":14},"end":{"line":137,"column":null}}],"line":125},"19":{"loc":{"start":{"line":143,"column":16},"end":{"line":143,"column":null}},"type":"cond-expr","locations":[{"start":{"line":143,"column":27},"end":{"line":143,"column":43}},{"start":{"line":143,"column":43},"end":{"line":143,"column":null}}],"line":143},"20":{"loc":{"start":{"line":154,"column":13},"end":{"line":166,"column":null}},"type":"binary-expr","locations":[{"start":{"line":154,"column":13},"end":{"line":154,"column":null}},{"start":{"line":155,"column":14},"end":{"line":166,"column":null}}],"line":154}},"s":{"0":3,"1":3,"2":29,"3":29,"4":29,"5":29,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":0,"14":29,"15":2,"16":2,"17":2,"18":2,"19":2,"20":29,"21":2,"22":2,"23":2,"24":1,"25":1,"26":1,"27":1,"28":1,"29":2,"30":29,"31":2,"32":2,"33":1,"34":1,"35":1,"36":2,"37":29,"38":0,"39":0,"40":0,"41":29,"42":36,"43":36,"44":36,"45":36,"46":2,"47":2,"48":2,"49":1,"50":1},"f":{"0":29,"1":2,"2":2,"3":2,"4":2,"5":2,"6":0,"7":36,"8":2,"9":2,"10":2,"11":1},"b":{"0":[2,0],"1":[0,2],"2":[2,0],"3":[1,1],"4":[2,2],"5":[0,1],"6":[1,1],"7":[2,2,1,1],"8":[1,0],"9":[1,0],"10":[0,0],"11":[36,1],"12":[19,17],"13":[19,17],"14":[19,17],"15":[19,17],"16":[19,17],"17":[10,26],"18":[36,0],"19":[19,17],"20":[36,1]},"meta":{"lastBranch":21,"lastFunction":12,"lastStatement":51,"seen":{"s:21:28:21:Infinity":0,"s:23:13:210:Infinity":1,"f:23:36:23:43":0,"s:26:32:26:Infinity":2,"s:27:32:27:Infinity":3,"s:28:8:28:Infinity":4,"s:30:8:43:Infinity":5,"f:30:38:30:39":1,"s:31:4:31:Infinity":6,"s:32:4:32:Infinity":7,"s:33:4:33:Infinity":8,"b:35:4:42:Infinity:undefined:undefined:undefined:undefined":0,"s:35:4:42:Infinity":9,"s:36:6:36:Infinity":10,"s:37:6:41:Infinity":11,"f:37:28:37:34":2,"b:38:8:40:Infinity:undefined:undefined:undefined:undefined":1,"s:38:8:40:Infinity":12,"s:39:10:39:Infinity":13,"s:45:8:52:Infinity":14,"f:45:36:45:42":3,"b:46:4:48:Infinity:undefined:undefined:undefined:undefined":2,"s:46:4:48:Infinity":15,"s:47:6:47:Infinity":16,"s:49:4:49:Infinity":17,"s:50:4:50:Infinity":18,"s:51:4:51:Infinity":19,"s:54:8:66:Infinity":20,"f:54:37:54:38":4,"s:55:4:55:Infinity":21,"s:56:4:56:Infinity":22,"b:57:4:60:Infinity:undefined:undefined:undefined:undefined":3,"s:57:4:60:Infinity":23,"b:57:8:57:30:57:30:57:51":4,"s:58:6:58:Infinity":24,"s:59:6:59:Infinity":25,"s:62:17:62:Infinity":26,"s:63:21:63:Infinity":27,"s:64:24:64:Infinity":28,"b:64:47:64:55:64:55:64:Infinity":5,"s:65:4:65:Infinity":29,"s:68:8:78:Infinity":30,"f:68:33:68:34":5,"s:69:4:69:Infinity":31,"b:70:4:76:Infinity:undefined:undefined:undefined:undefined":6,"s:70:4:76:Infinity":32,"b:70:8:70:30:70:30:70:52:70:52:70:79:70:79:70:94":7,"s:72:22:72:Infinity":33,"b:72:46:72:62:72:62:72:Infinity":8,"b:73:6:75:Infinity:undefined:undefined:undefined:undefined":9,"s:73:6:75:Infinity":34,"s:74:8:74:Infinity":35,"s:77:4:77:Infinity":36,"s:80:8:86:Infinity":37,"f:80:38:80:39":6,"s:82:26:82:Infinity":38,"b:83:4:85:Infinity:undefined:undefined:undefined:undefined":10,"s:83:4:85:Infinity":39,"s:84:6:84:Infinity":40,"s:88:2:208:Infinity":41,"f:95:16:95:17":7,"s:96:25:96:Infinity":42,"s:97:31:97:Infinity":43,"s:98:30:98:Infinity":44,"b:98:30:98:57:98:57:98:Infinity":11,"s:99:8:168:Infinity":45,"f:103:25:103:26":8,"s:103:32:103:Infinity":46,"f:105:24:105:25":9,"s:105:31:105:Infinity":47,"b:110:18:110:Infinity:111:18:111:Infinity":12,"b:114:37:114:59:114:59:114:Infinity":13,"b:115:51:115:69:115:69:115:92":14,"b:116:39:116:48:116:48:116:Infinity":15,"b:119:37:119:43:119:43:119:Infinity":16,"b:120:43:120:56:120:56:120:Infinity":17,"f:123:21:123:27":10,"s:123:27:123:Infinity":48,"b:125:13:125:Infinity:126:14:137:Infinity":18,"b:143:27:143:43:143:43:143:Infinity":19,"f:147:23:147:24":11,"s:148:16:148:Infinity":49,"s:149:16:149:Infinity":50,"b:154:13:154:Infinity:155:14:166:Infinity":20}}} +,"/Users/luca/Workspace/laputa-app/src/components/Toast.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/Toast.tsx","statementMap":{"0":{"start":{"line":10,"column":2},"end":{"line":14,"column":null}},"1":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"2":{"start":{"line":11,"column":18},"end":{"line":11,"column":null}},"3":{"start":{"line":12,"column":18},"end":{"line":12,"column":null}},"4":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"5":{"start":{"line":13,"column":17},"end":{"line":13,"column":null}},"6":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"7":{"start":{"line":16,"column":16},"end":{"line":16,"column":null}},"8":{"start":{"line":18,"column":2},"end":{"line":26,"column":null}}},"fnMap":{"0":{"name":"Toast","decl":{"start":{"line":9,"column":16},"end":{"line":9,"column":22}},"loc":{"start":{"line":9,"column":58},"end":{"line":28,"column":null}},"line":9},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":12},"end":{"line":10,"column":18}},"loc":{"start":{"line":10,"column":18},"end":{"line":14,"column":5}},"line":10},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":11},"end":{"line":13,"column":17}},"loc":{"start":{"line":13,"column":17},"end":{"line":13,"column":null}},"line":13}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":4},"end":{"line":11,"column":null}},{"start":{},"end":{}}],"line":11},"1":{"loc":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},{"start":{},"end":{}}],"line":16}},"s":{"0":22,"1":22,"2":21,"3":1,"4":1,"5":1,"6":22,"7":21,"8":1},"f":{"0":22,"1":22,"2":1},"b":{"0":[21,1],"1":[21,1]},"meta":{"lastBranch":2,"lastFunction":3,"lastStatement":9,"seen":{"f:9:16:9:22":0,"s:10:2:14:Infinity":0,"f:10:12:10:18":1,"b:11:4:11:Infinity:undefined:undefined:undefined:undefined":0,"s:11:4:11:Infinity":1,"s:11:18:11:Infinity":2,"s:12:18:12:Infinity":3,"s:13:4:13:Infinity":4,"f:13:11:13:17":2,"s:13:17:13:Infinity":5,"b:16:2:16:Infinity:undefined:undefined:undefined:undefined":1,"s:16:2:16:Infinity":6,"s:16:16:16:Infinity":7,"s:18:2:26:Infinity":8}}} +,"/Users/luca/Workspace/laputa-app/src/components/TypeCustomizePopover.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/TypeCustomizePopover.tsx","statementMap":{"0":{"start":{"line":14,"column":80},"end":{"line":50,"column":null}},"1":{"start":{"line":52,"column":59},"end":{"line":54,"column":null}},"2":{"start":{"line":53,"column":26},"end":{"line":53,"column":42}},"3":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"4":{"start":{"line":76,"column":40},"end":{"line":76,"column":null}},"5":{"start":{"line":77,"column":38},"end":{"line":77,"column":null}},"6":{"start":{"line":79,"column":27},"end":{"line":82,"column":null}},"7":{"start":{"line":80,"column":4},"end":{"line":80,"column":null}},"8":{"start":{"line":81,"column":4},"end":{"line":81,"column":null}},"9":{"start":{"line":84,"column":26},"end":{"line":87,"column":null}},"10":{"start":{"line":85,"column":4},"end":{"line":85,"column":null}},"11":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"12":{"start":{"line":89,"column":2},"end":{"line":143,"column":null}},"13":{"start":{"line":93,"column":22},"end":{"line":93,"column":null}},"14":{"start":{"line":94,"column":28},"end":{"line":94,"column":null}},"15":{"start":{"line":100,"column":10},"end":{"line":109,"column":null}},"16":{"start":{"line":107,"column":27},"end":{"line":107,"column":null}},"17":{"start":{"line":117,"column":10},"end":{"line":130,"column":null}},"18":{"start":{"line":126,"column":27},"end":{"line":126,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":53,"column":19},"end":{"line":53,"column":20}},"loc":{"start":{"line":53,"column":26},"end":{"line":53,"column":42}},"line":53},"1":{"name":"resolveIcon","decl":{"start":{"line":57,"column":16},"end":{"line":57,"column":28}},"loc":{"start":{"line":57,"column":75},"end":{"line":59,"column":null}},"line":57},"2":{"name":"TypeCustomizePopover","decl":{"start":{"line":69,"column":16},"end":{"line":69,"column":37}},"loc":{"start":{"line":75,"column":30},"end":{"line":145,"column":null}},"line":75},"3":{"name":"(anonymous_3)","decl":{"start":{"line":79,"column":27},"end":{"line":79,"column":28}},"loc":{"start":{"line":79,"column":44},"end":{"line":82,"column":null}},"line":79},"4":{"name":"(anonymous_4)","decl":{"start":{"line":84,"column":26},"end":{"line":84,"column":27}},"loc":{"start":{"line":84,"column":44},"end":{"line":87,"column":null}},"line":84},"5":{"name":"(anonymous_5)","decl":{"start":{"line":93,"column":15},"end":{"line":93,"column":16}},"loc":{"start":{"line":93,"column":22},"end":{"line":93,"column":null}},"line":93},"6":{"name":"(anonymous_6)","decl":{"start":{"line":94,"column":21},"end":{"line":94,"column":22}},"loc":{"start":{"line":94,"column":28},"end":{"line":94,"column":null}},"line":94},"7":{"name":"(anonymous_7)","decl":{"start":{"line":99,"column":27},"end":{"line":99,"column":28}},"loc":{"start":{"line":100,"column":10},"end":{"line":109,"column":null}},"line":100},"8":{"name":"(anonymous_8)","decl":{"start":{"line":107,"column":21},"end":{"line":107,"column":27}},"loc":{"start":{"line":107,"column":27},"end":{"line":107,"column":null}},"line":107},"9":{"name":"(anonymous_9)","decl":{"start":{"line":116,"column":26},"end":{"line":116,"column":27}},"loc":{"start":{"line":117,"column":10},"end":{"line":130,"column":null}},"line":117},"10":{"name":"(anonymous_10)","decl":{"start":{"line":126,"column":21},"end":{"line":126,"column":27}},"loc":{"start":{"line":126,"column":27},"end":{"line":126,"column":null}},"line":126}},"branchMap":{"0":{"loc":{"start":{"line":58,"column":10},"end":{"line":58,"column":null}},"type":"binary-expr","locations":[{"start":{"line":58,"column":10},"end":{"line":58,"column":18}},{"start":{"line":58,"column":18},"end":{"line":58,"column":37}},{"start":{"line":58,"column":37},"end":{"line":58,"column":null}}],"line":58},"1":{"loc":{"start":{"line":104,"column":14},"end":{"line":104,"column":null}},"type":"cond-expr","locations":[{"start":{"line":104,"column":40},"end":{"line":104,"column":72}},{"start":{"line":104,"column":72},"end":{"line":104,"column":null}}],"line":104},"2":{"loc":{"start":{"line":106,"column":76},"end":{"line":106,"column":158}},"type":"cond-expr","locations":[{"start":{"line":106,"column":102},"end":{"line":106,"column":134}},{"start":{"line":106,"column":134},"end":{"line":106,"column":158}}],"line":106},"3":{"loc":{"start":{"line":121,"column":14},"end":{"line":123,"column":null}},"type":"cond-expr","locations":[{"start":{"line":122,"column":18},"end":{"line":122,"column":null}},{"start":{"line":123,"column":18},"end":{"line":123,"column":null}}],"line":121}},"s":{"0":3,"1":3,"2":105,"3":8,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"f":{"0":105,"1":8,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[8,0,8],"1":[0,0],"2":[0,0],"3":[0,0]},"meta":{"lastBranch":4,"lastFunction":11,"lastStatement":19,"seen":{"s:14:80:50:Infinity":0,"s:52:59:54:Infinity":1,"f:53:19:53:20":0,"s:53:26:53:42":2,"f:57:16:57:28":1,"s:58:2:58:Infinity":3,"b:58:10:58:18:58:18:58:37:58:37:58:Infinity":0,"f:69:16:69:37":2,"s:76:40:76:Infinity":4,"s:77:38:77:Infinity":5,"s:79:27:82:Infinity":6,"f:79:27:79:28":3,"s:80:4:80:Infinity":7,"s:81:4:81:Infinity":8,"s:84:26:87:Infinity":9,"f:84:26:84:27":4,"s:85:4:85:Infinity":10,"s:86:4:86:Infinity":11,"s:89:2:143:Infinity":12,"f:93:15:93:16":5,"s:93:22:93:Infinity":13,"f:94:21:94:22":6,"s:94:28:94:Infinity":14,"f:99:27:99:28":7,"s:100:10:109:Infinity":15,"b:104:40:104:72:104:72:104:Infinity":1,"b:106:102:106:134:106:134:106:158":2,"f:107:21:107:27":8,"s:107:27:107:Infinity":16,"f:116:26:116:27":9,"s:117:10:130:Infinity":17,"b:122:18:122:Infinity:123:18:123:Infinity":3,"f:126:21:126:27":10,"s:126:27:126:Infinity":18}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/badge.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/badge.tsx","statementMap":{"0":{"start":{"line":7,"column":6},"end":{"line":27,"column":null}},"1":{"start":{"line":36,"column":15},"end":{"line":36,"column":null}},"2":{"start":{"line":38,"column":2},"end":{"line":44,"column":null}}},"fnMap":{"0":{"name":"Badge","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":15}},"loc":{"start":{"line":35,"column":62},"end":{"line":46,"column":null}},"line":35}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"type":"default-arg","locations":[{"start":{"line":31,"column":12},"end":{"line":31,"column":null}}],"line":31},"1":{"loc":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"type":"default-arg","locations":[{"start":{"line":32,"column":12},"end":{"line":32,"column":null}}],"line":32},"2":{"loc":{"start":{"line":36,"column":15},"end":{"line":36,"column":null}},"type":"cond-expr","locations":[{"start":{"line":36,"column":25},"end":{"line":36,"column":37}},{"start":{"line":36,"column":37},"end":{"line":36,"column":null}}],"line":36}},"s":{"0":1,"1":0,"2":0},"f":{"0":0},"b":{"0":[0],"1":[0],"2":[0,0]},"meta":{"lastBranch":3,"lastFunction":1,"lastStatement":3,"seen":{"s:7:6:27:Infinity":0,"f:29:9:29:15":0,"b:31:12:31:Infinity":0,"b:32:12:32:Infinity":1,"s:36:15:36:Infinity":1,"b:36:25:36:37:36:37:36:Infinity":2,"s:38:2:44:Infinity":2}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/button.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/button.tsx","statementMap":{"0":{"start":{"line":7,"column":6},"end":{"line":39,"column":null}},"1":{"start":{"line":51,"column":15},"end":{"line":51,"column":null}},"2":{"start":{"line":53,"column":2},"end":{"line":60,"column":null}}},"fnMap":{"0":{"name":"Button","decl":{"start":{"line":41,"column":9},"end":{"line":41,"column":16}},"loc":{"start":{"line":50,"column":5},"end":{"line":62,"column":null}},"line":50}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":2},"end":{"line":43,"column":null}},"type":"default-arg","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":null}}],"line":43},"1":{"loc":{"start":{"line":44,"column":2},"end":{"line":44,"column":null}},"type":"default-arg","locations":[{"start":{"line":44,"column":9},"end":{"line":44,"column":null}}],"line":44},"2":{"loc":{"start":{"line":45,"column":2},"end":{"line":45,"column":null}},"type":"default-arg","locations":[{"start":{"line":45,"column":12},"end":{"line":45,"column":null}}],"line":45},"3":{"loc":{"start":{"line":51,"column":15},"end":{"line":51,"column":null}},"type":"cond-expr","locations":[{"start":{"line":51,"column":25},"end":{"line":51,"column":37}},{"start":{"line":51,"column":37},"end":{"line":51,"column":null}}],"line":51}},"s":{"0":4,"1":22,"2":22},"f":{"0":22},"b":{"0":[22],"1":[22],"2":[22],"3":[0,22]},"meta":{"lastBranch":4,"lastFunction":1,"lastStatement":3,"seen":{"s:7:6:39:Infinity":0,"f:41:9:41:16":0,"b:43:12:43:Infinity":0,"b:44:9:44:Infinity":1,"b:45:12:45:Infinity":2,"s:51:15:51:Infinity":1,"b:51:25:51:37:51:37:51:Infinity":3,"s:53:2:60:Infinity":2}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/card.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/card.tsx","statementMap":{"0":{"start":{"line":6,"column":2},"end":{"line":14,"column":null}},"1":{"start":{"line":19,"column":2},"end":{"line":27,"column":null}},"2":{"start":{"line":32,"column":2},"end":{"line":37,"column":null}},"3":{"start":{"line":42,"column":2},"end":{"line":47,"column":null}},"4":{"start":{"line":52,"column":2},"end":{"line":60,"column":null}},"5":{"start":{"line":65,"column":2},"end":{"line":70,"column":null}},"6":{"start":{"line":75,"column":2},"end":{"line":80,"column":null}}},"fnMap":{"0":{"name":"Card","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":14}},"loc":{"start":{"line":5,"column":68},"end":{"line":16,"column":null}},"line":5},"1":{"name":"CardHeader","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":20}},"loc":{"start":{"line":18,"column":74},"end":{"line":29,"column":null}},"line":18},"2":{"name":"CardTitle","decl":{"start":{"line":31,"column":9},"end":{"line":31,"column":19}},"loc":{"start":{"line":31,"column":73},"end":{"line":39,"column":null}},"line":31},"3":{"name":"CardDescription","decl":{"start":{"line":41,"column":9},"end":{"line":41,"column":25}},"loc":{"start":{"line":41,"column":79},"end":{"line":49,"column":null}},"line":41},"4":{"name":"CardAction","decl":{"start":{"line":51,"column":9},"end":{"line":51,"column":20}},"loc":{"start":{"line":51,"column":74},"end":{"line":62,"column":null}},"line":51},"5":{"name":"CardContent","decl":{"start":{"line":64,"column":9},"end":{"line":64,"column":21}},"loc":{"start":{"line":64,"column":75},"end":{"line":72,"column":null}},"line":64},"6":{"name":"CardFooter","decl":{"start":{"line":74,"column":9},"end":{"line":74,"column":20}},"loc":{"start":{"line":74,"column":74},"end":{"line":82,"column":null}},"line":74}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{},"meta":{"lastBranch":0,"lastFunction":7,"lastStatement":7,"seen":{"f:5:9:5:14":0,"s:6:2:14:Infinity":0,"f:18:9:18:20":1,"s:19:2:27:Infinity":1,"f:31:9:31:19":2,"s:32:2:37:Infinity":2,"f:41:9:41:25":3,"s:42:2:47:Infinity":3,"f:51:9:51:20":4,"s:52:2:60:Infinity":4,"f:64:9:64:21":5,"s:65:2:70:Infinity":5,"f:74:9:74:20":6,"s:75:2:80:Infinity":6}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/dialog.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/dialog.tsx","statementMap":{"0":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"1":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"2":{"start":{"line":23,"column":2},"end":{"line":23,"column":null}},"3":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"4":{"start":{"line":36,"column":2},"end":{"line":44,"column":null}},"5":{"start":{"line":56,"column":2},"end":{"line":78,"column":null}},"6":{"start":{"line":83,"column":2},"end":{"line":88,"column":null}},"7":{"start":{"line":100,"column":2},"end":{"line":115,"column":null}},"8":{"start":{"line":123,"column":2},"end":{"line":128,"column":null}},"9":{"start":{"line":136,"column":2},"end":{"line":141,"column":null}}},"fnMap":{"0":{"name":"Dialog","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":16}},"loc":{"start":{"line":10,"column":54},"end":{"line":12,"column":null}},"line":10},"1":{"name":"DialogTrigger","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":23}},"loc":{"start":{"line":16,"column":57},"end":{"line":18,"column":null}},"line":16},"2":{"name":"DialogPortal","decl":{"start":{"line":20,"column":9},"end":{"line":20,"column":22}},"loc":{"start":{"line":22,"column":56},"end":{"line":24,"column":null}},"line":22},"3":{"name":"DialogClose","decl":{"start":{"line":26,"column":9},"end":{"line":26,"column":21}},"loc":{"start":{"line":28,"column":55},"end":{"line":30,"column":null}},"line":28},"4":{"name":"DialogOverlay","decl":{"start":{"line":32,"column":9},"end":{"line":32,"column":23}},"loc":{"start":{"line":35,"column":57},"end":{"line":46,"column":null}},"line":35},"5":{"name":"DialogContent","decl":{"start":{"line":48,"column":9},"end":{"line":48,"column":23}},"loc":{"start":{"line":55,"column":3},"end":{"line":80,"column":null}},"line":55},"6":{"name":"DialogHeader","decl":{"start":{"line":82,"column":9},"end":{"line":82,"column":22}},"loc":{"start":{"line":82,"column":76},"end":{"line":90,"column":null}},"line":82},"7":{"name":"DialogFooter","decl":{"start":{"line":92,"column":9},"end":{"line":92,"column":22}},"loc":{"start":{"line":99,"column":3},"end":{"line":117,"column":null}},"line":99},"8":{"name":"DialogTitle","decl":{"start":{"line":119,"column":9},"end":{"line":119,"column":21}},"loc":{"start":{"line":122,"column":55},"end":{"line":130,"column":null}},"line":122},"9":{"name":"DialogDescription","decl":{"start":{"line":132,"column":9},"end":{"line":132,"column":27}},"loc":{"start":{"line":135,"column":61},"end":{"line":143,"column":null}},"line":135}},"branchMap":{"0":{"loc":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"type":"default-arg","locations":[{"start":{"line":51,"column":20},"end":{"line":51,"column":null}}],"line":51},"1":{"loc":{"start":{"line":68,"column":9},"end":{"line":75,"column":null}},"type":"binary-expr","locations":[{"start":{"line":68,"column":9},"end":{"line":68,"column":null}},{"start":{"line":69,"column":10},"end":{"line":75,"column":null}}],"line":68},"2":{"loc":{"start":{"line":94,"column":2},"end":{"line":94,"column":null}},"type":"default-arg","locations":[{"start":{"line":94,"column":20},"end":{"line":94,"column":null}}],"line":94},"3":{"loc":{"start":{"line":110,"column":7},"end":{"line":113,"column":null}},"type":"binary-expr","locations":[{"start":{"line":110,"column":7},"end":{"line":110,"column":null}},{"start":{"line":111,"column":8},"end":{"line":113,"column":null}}],"line":110}},"s":{"0":78,"1":0,"2":78,"3":0,"4":18,"5":78,"6":11,"7":11,"8":11,"9":0},"f":{"0":78,"1":0,"2":78,"3":0,"4":18,"5":78,"6":11,"7":11,"8":11,"9":0},"b":{"0":[78],"1":[78,0],"2":[11],"3":[11,0]},"meta":{"lastBranch":4,"lastFunction":10,"lastStatement":10,"seen":{"f:8:9:8:16":0,"s:11:2:11:Infinity":0,"f:14:9:14:23":1,"s:17:2:17:Infinity":1,"f:20:9:20:22":2,"s:23:2:23:Infinity":2,"f:26:9:26:21":3,"s:29:2:29:Infinity":3,"f:32:9:32:23":4,"s:36:2:44:Infinity":4,"f:48:9:48:23":5,"b:51:20:51:Infinity":0,"s:56:2:78:Infinity":5,"b:68:9:68:Infinity:69:10:75:Infinity":1,"f:82:9:82:22":6,"s:83:2:88:Infinity":6,"f:92:9:92:22":7,"b:94:20:94:Infinity":2,"s:100:2:115:Infinity":7,"b:110:7:110:Infinity:111:8:113:Infinity":3,"f:119:9:119:21":8,"s:123:2:128:Infinity":8,"f:132:9:132:27":9,"s:136:2:141:Infinity":9}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/dropdown-menu.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/dropdown-menu.tsx","statementMap":{"0":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"1":{"start":{"line":18,"column":2},"end":{"line":19,"column":null}},"2":{"start":{"line":26,"column":2},"end":{"line":30,"column":null}},"3":{"start":{"line":39,"column":2},"end":{"line":50,"column":null}},"4":{"start":{"line":57,"column":2},"end":{"line":58,"column":null}},"5":{"start":{"line":71,"column":2},"end":{"line":81,"column":null}},"6":{"start":{"line":91,"column":2},"end":{"line":107,"column":null}},"7":{"start":{"line":114,"column":2},"end":{"line":118,"column":null}},"8":{"start":{"line":127,"column":2},"end":{"line":142,"column":null}},"9":{"start":{"line":153,"column":2},"end":{"line":162,"column":null}},"10":{"start":{"line":170,"column":2},"end":{"line":175,"column":null}},"11":{"start":{"line":183,"column":2},"end":{"line":191,"column":null}},"12":{"start":{"line":198,"column":2},"end":{"line":198,"column":null}},"13":{"start":{"line":209,"column":2},"end":{"line":221,"column":null}},"14":{"start":{"line":229,"column":2},"end":{"line":237,"column":null}}},"fnMap":{"0":{"name":"DropdownMenu","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":22}},"loc":{"start":{"line":11,"column":60},"end":{"line":13,"column":null}},"line":11},"1":{"name":"DropdownMenuPortal","decl":{"start":{"line":15,"column":9},"end":{"line":15,"column":28}},"loc":{"start":{"line":17,"column":62},"end":{"line":21,"column":null}},"line":17},"2":{"name":"DropdownMenuTrigger","decl":{"start":{"line":23,"column":9},"end":{"line":23,"column":29}},"loc":{"start":{"line":25,"column":63},"end":{"line":32,"column":null}},"line":25},"3":{"name":"DropdownMenuContent","decl":{"start":{"line":34,"column":9},"end":{"line":34,"column":29}},"loc":{"start":{"line":38,"column":63},"end":{"line":52,"column":null}},"line":38},"4":{"name":"DropdownMenuGroup","decl":{"start":{"line":54,"column":9},"end":{"line":54,"column":27}},"loc":{"start":{"line":56,"column":61},"end":{"line":60,"column":null}},"line":56},"5":{"name":"DropdownMenuItem","decl":{"start":{"line":62,"column":9},"end":{"line":62,"column":26}},"loc":{"start":{"line":70,"column":3},"end":{"line":83,"column":null}},"line":70},"6":{"name":"DropdownMenuCheckboxItem","decl":{"start":{"line":85,"column":9},"end":{"line":85,"column":34}},"loc":{"start":{"line":90,"column":68},"end":{"line":109,"column":null}},"line":90},"7":{"name":"DropdownMenuRadioGroup","decl":{"start":{"line":111,"column":9},"end":{"line":111,"column":32}},"loc":{"start":{"line":113,"column":66},"end":{"line":120,"column":null}},"line":113},"8":{"name":"DropdownMenuRadioItem","decl":{"start":{"line":122,"column":9},"end":{"line":122,"column":31}},"loc":{"start":{"line":126,"column":65},"end":{"line":144,"column":null}},"line":126},"9":{"name":"DropdownMenuLabel","decl":{"start":{"line":146,"column":9},"end":{"line":146,"column":27}},"loc":{"start":{"line":152,"column":3},"end":{"line":164,"column":null}},"line":152},"10":{"name":"DropdownMenuSeparator","decl":{"start":{"line":166,"column":9},"end":{"line":166,"column":31}},"loc":{"start":{"line":169,"column":65},"end":{"line":177,"column":null}},"line":169},"11":{"name":"DropdownMenuShortcut","decl":{"start":{"line":179,"column":9},"end":{"line":179,"column":30}},"loc":{"start":{"line":182,"column":33},"end":{"line":193,"column":null}},"line":182},"12":{"name":"DropdownMenuSub","decl":{"start":{"line":195,"column":9},"end":{"line":195,"column":25}},"loc":{"start":{"line":197,"column":59},"end":{"line":199,"column":null}},"line":197},"13":{"name":"DropdownMenuSubTrigger","decl":{"start":{"line":201,"column":9},"end":{"line":201,"column":32}},"loc":{"start":{"line":208,"column":3},"end":{"line":223,"column":null}},"line":208},"14":{"name":"DropdownMenuSubContent","decl":{"start":{"line":225,"column":9},"end":{"line":225,"column":32}},"loc":{"start":{"line":228,"column":66},"end":{"line":239,"column":null}},"line":228}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"type":"default-arg","locations":[{"start":{"line":36,"column":15},"end":{"line":36,"column":null}}],"line":36},"1":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":null}},"type":"default-arg","locations":[{"start":{"line":65,"column":12},"end":{"line":65,"column":null}}],"line":65}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0],"1":[0]},"meta":{"lastBranch":2,"lastFunction":15,"lastStatement":15,"seen":{"f:9:9:9:22":0,"s:12:2:12:Infinity":0,"f:15:9:15:28":1,"s:18:2:19:Infinity":1,"f:23:9:23:29":2,"s:26:2:30:Infinity":2,"f:34:9:34:29":3,"b:36:15:36:Infinity":0,"s:39:2:50:Infinity":3,"f:54:9:54:27":4,"s:57:2:58:Infinity":4,"f:62:9:62:26":5,"b:65:12:65:Infinity":1,"s:71:2:81:Infinity":5,"f:85:9:85:34":6,"s:91:2:107:Infinity":6,"f:111:9:111:32":7,"s:114:2:118:Infinity":7,"f:122:9:122:31":8,"s:127:2:142:Infinity":8,"f:146:9:146:27":9,"s:153:2:162:Infinity":9,"f:166:9:166:31":10,"s:170:2:175:Infinity":10,"f:179:9:179:30":11,"s:183:2:191:Infinity":11,"f:195:9:195:25":12,"s:198:2:198:Infinity":12,"f:201:9:201:32":13,"s:209:2:221:Infinity":13,"f:225:9:225:32":14,"s:229:2:237:Infinity":14}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/input.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/input.tsx","statementMap":{"0":{"start":{"line":6,"column":2},"end":{"line":17,"column":null}}},"fnMap":{"0":{"name":"Input","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":15}},"loc":{"start":{"line":5,"column":77},"end":{"line":19,"column":null}},"line":5}},"branchMap":{},"s":{"0":14},"f":{"0":14},"b":{},"meta":{"lastBranch":0,"lastFunction":1,"lastStatement":1,"seen":{"f:5:9:5:15":0,"s:6:2:17:Infinity":0}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/scroll-area.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/scroll-area.tsx","statementMap":{"0":{"start":{"line":11,"column":2},"end":{"line":25,"column":null}},"1":{"start":{"line":34,"column":2},"end":{"line":52,"column":null}}},"fnMap":{"0":{"name":"ScrollArea","decl":{"start":{"line":6,"column":9},"end":{"line":6,"column":20}},"loc":{"start":{"line":10,"column":58},"end":{"line":27,"column":null}},"line":10},"1":{"name":"ScrollBar","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":19}},"loc":{"start":{"line":33,"column":73},"end":{"line":54,"column":null}},"line":33}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"type":"default-arg","locations":[{"start":{"line":31,"column":16},"end":{"line":31,"column":null}}],"line":31},"1":{"loc":{"start":{"line":40,"column":8},"end":{"line":41,"column":null}},"type":"binary-expr","locations":[{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},{"start":{"line":41,"column":10},"end":{"line":41,"column":null}}],"line":40},"2":{"loc":{"start":{"line":42,"column":8},"end":{"line":43,"column":null}},"type":"binary-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":null}},{"start":{"line":43,"column":10},"end":{"line":43,"column":null}}],"line":42}},"s":{"0":0,"1":0},"f":{"0":0,"1":0},"b":{"0":[0],"1":[0,0],"2":[0,0]},"meta":{"lastBranch":3,"lastFunction":2,"lastStatement":2,"seen":{"f:6:9:6:20":0,"s:11:2:25:Infinity":0,"f:29:9:29:19":1,"b:31:16:31:Infinity":0,"s:34:2:52:Infinity":1,"b:40:8:40:Infinity:41:10:41:Infinity":1,"b:42:8:42:Infinity:43:10:43:Infinity":2}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/select.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/select.tsx","statementMap":{"0":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"1":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"2":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"3":{"start":{"line":33,"column":2},"end":{"line":47,"column":null}},"4":{"start":{"line":58,"column":2},"end":{"line":84,"column":null}},"5":{"start":{"line":92,"column":2},"end":{"line":97,"column":null}},"6":{"start":{"line":106,"column":2},"end":{"line":124,"column":null}},"7":{"start":{"line":132,"column":2},"end":{"line":137,"column":null}},"8":{"start":{"line":145,"column":2},"end":{"line":155,"column":null}},"9":{"start":{"line":163,"column":2},"end":{"line":173,"column":null}}},"fnMap":{"0":{"name":"Select","decl":{"start":{"line":7,"column":9},"end":{"line":7,"column":16}},"loc":{"start":{"line":9,"column":54},"end":{"line":11,"column":null}},"line":9},"1":{"name":"SelectGroup","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":21}},"loc":{"start":{"line":15,"column":55},"end":{"line":17,"column":null}},"line":15},"2":{"name":"SelectValue","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":21}},"loc":{"start":{"line":21,"column":55},"end":{"line":23,"column":null}},"line":21},"3":{"name":"SelectTrigger","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":23}},"loc":{"start":{"line":32,"column":3},"end":{"line":49,"column":null}},"line":32},"4":{"name":"SelectContent","decl":{"start":{"line":51,"column":9},"end":{"line":51,"column":23}},"loc":{"start":{"line":57,"column":57},"end":{"line":86,"column":null}},"line":57},"5":{"name":"SelectLabel","decl":{"start":{"line":88,"column":9},"end":{"line":88,"column":21}},"loc":{"start":{"line":91,"column":55},"end":{"line":99,"column":null}},"line":91},"6":{"name":"SelectItem","decl":{"start":{"line":101,"column":9},"end":{"line":101,"column":20}},"loc":{"start":{"line":105,"column":54},"end":{"line":126,"column":null}},"line":105},"7":{"name":"SelectSeparator","decl":{"start":{"line":128,"column":9},"end":{"line":128,"column":25}},"loc":{"start":{"line":131,"column":59},"end":{"line":139,"column":null}},"line":131},"8":{"name":"SelectScrollUpButton","decl":{"start":{"line":141,"column":9},"end":{"line":141,"column":30}},"loc":{"start":{"line":144,"column":64},"end":{"line":157,"column":null}},"line":144},"9":{"name":"SelectScrollDownButton","decl":{"start":{"line":159,"column":9},"end":{"line":159,"column":32}},"loc":{"start":{"line":162,"column":66},"end":{"line":175,"column":null}},"line":162}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},"type":"default-arg","locations":[{"start":{"line":27,"column":9},"end":{"line":27,"column":null}}],"line":27},"1":{"loc":{"start":{"line":54,"column":2},"end":{"line":54,"column":null}},"type":"default-arg","locations":[{"start":{"line":54,"column":13},"end":{"line":54,"column":null}}],"line":54},"2":{"loc":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"type":"default-arg","locations":[{"start":{"line":55,"column":10},"end":{"line":55,"column":null}}],"line":55},"3":{"loc":{"start":{"line":64,"column":10},"end":{"line":65,"column":null}},"type":"binary-expr","locations":[{"start":{"line":64,"column":10},"end":{"line":64,"column":null}},{"start":{"line":65,"column":12},"end":{"line":65,"column":null}}],"line":64},"4":{"loc":{"start":{"line":76,"column":12},"end":{"line":77,"column":null}},"type":"binary-expr","locations":[{"start":{"line":76,"column":12},"end":{"line":76,"column":null}},{"start":{"line":77,"column":14},"end":{"line":77,"column":null}}],"line":76}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0,0],"4":[0,0]},"meta":{"lastBranch":5,"lastFunction":10,"lastStatement":10,"seen":{"f:7:9:7:16":0,"s:10:2:10:Infinity":0,"f:13:9:13:21":1,"s:16:2:16:Infinity":1,"f:19:9:19:21":2,"s:22:2:22:Infinity":2,"f:25:9:25:23":3,"b:27:9:27:Infinity":0,"s:33:2:47:Infinity":3,"f:51:9:51:23":4,"b:54:13:54:Infinity":1,"b:55:10:55:Infinity":2,"s:58:2:84:Infinity":4,"b:64:10:64:Infinity:65:12:65:Infinity":3,"b:76:12:76:Infinity:77:14:77:Infinity":4,"f:88:9:88:21":5,"s:92:2:97:Infinity":5,"f:101:9:101:20":6,"s:106:2:124:Infinity":6,"f:128:9:128:25":7,"s:132:2:137:Infinity":7,"f:141:9:141:30":8,"s:145:2:155:Infinity":8,"f:159:9:159:32":9,"s:163:2:173:Infinity":9}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/separator.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/separator.tsx","statementMap":{"0":{"start":{"line":14,"column":2},"end":{"line":24,"column":null}}},"fnMap":{"0":{"name":"Separator","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":19}},"loc":{"start":{"line":13,"column":57},"end":{"line":26,"column":null}},"line":13}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"type":"default-arg","locations":[{"start":{"line":10,"column":16},"end":{"line":10,"column":null}}],"line":10},"1":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"type":"default-arg","locations":[{"start":{"line":11,"column":15},"end":{"line":11,"column":null}}],"line":11}},"s":{"0":0},"f":{"0":0},"b":{"0":[0],"1":[0]},"meta":{"lastBranch":2,"lastFunction":1,"lastStatement":1,"seen":{"f:8:9:8:19":0,"b:10:16:10:Infinity":0,"b:11:15:11:Infinity":1,"s:14:2:24:Infinity":0}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/tabs.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/tabs.tsx","statementMap":{"0":{"start":{"line":12,"column":2},"end":{"line":22,"column":null}},"1":{"start":{"line":26,"column":6},"end":{"line":39,"column":null}},"2":{"start":{"line":47,"column":2},"end":{"line":53,"column":null}},"3":{"start":{"line":61,"column":2},"end":{"line":72,"column":null}},"4":{"start":{"line":80,"column":2},"end":{"line":85,"column":null}}},"fnMap":{"0":{"name":"Tabs","decl":{"start":{"line":7,"column":9},"end":{"line":7,"column":14}},"loc":{"start":{"line":11,"column":52},"end":{"line":24,"column":null}},"line":11},"1":{"name":"TabsList","decl":{"start":{"line":41,"column":9},"end":{"line":41,"column":18}},"loc":{"start":{"line":46,"column":41},"end":{"line":55,"column":null}},"line":46},"2":{"name":"TabsTrigger","decl":{"start":{"line":57,"column":9},"end":{"line":57,"column":21}},"loc":{"start":{"line":60,"column":55},"end":{"line":74,"column":null}},"line":60},"3":{"name":"TabsContent","decl":{"start":{"line":76,"column":9},"end":{"line":76,"column":21}},"loc":{"start":{"line":79,"column":55},"end":{"line":87,"column":null}},"line":79}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"type":"default-arg","locations":[{"start":{"line":9,"column":16},"end":{"line":9,"column":null}}],"line":9},"1":{"loc":{"start":{"line":43,"column":2},"end":{"line":43,"column":null}},"type":"default-arg","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":null}}],"line":43}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0]},"meta":{"lastBranch":2,"lastFunction":4,"lastStatement":5,"seen":{"f:7:9:7:14":0,"b:9:16:9:Infinity":0,"s:12:2:22:Infinity":0,"s:26:6:39:Infinity":1,"f:41:9:41:18":1,"b:43:12:43:Infinity":1,"s:47:2:53:Infinity":2,"f:57:9:57:21":2,"s:61:2:72:Infinity":3,"f:76:9:76:21":3,"s:80:2:85:Infinity":4}}} +,"/Users/luca/Workspace/laputa-app/src/components/ui/tooltip.tsx": {"path":"/Users/luca/Workspace/laputa-app/src/components/ui/tooltip.tsx","statementMap":{"0":{"start":{"line":12,"column":2},"end":{"line":17,"column":null}},"1":{"start":{"line":24,"column":2},"end":{"line":24,"column":null}},"2":{"start":{"line":30,"column":2},"end":{"line":30,"column":null}},"3":{"start":{"line":39,"column":2},"end":{"line":53,"column":null}}},"fnMap":{"0":{"name":"TooltipProvider","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":25}},"loc":{"start":{"line":11,"column":59},"end":{"line":19,"column":null}},"line":11},"1":{"name":"Tooltip","decl":{"start":{"line":21,"column":9},"end":{"line":21,"column":17}},"loc":{"start":{"line":23,"column":55},"end":{"line":25,"column":null}},"line":23},"2":{"name":"TooltipTrigger","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":24}},"loc":{"start":{"line":29,"column":58},"end":{"line":31,"column":null}},"line":29},"3":{"name":"TooltipContent","decl":{"start":{"line":33,"column":9},"end":{"line":33,"column":24}},"loc":{"start":{"line":38,"column":58},"end":{"line":55,"column":null}},"line":38}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"type":"default-arg","locations":[{"start":{"line":9,"column":18},"end":{"line":9,"column":null}}],"line":9},"1":{"loc":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"type":"default-arg","locations":[{"start":{"line":35,"column":15},"end":{"line":35,"column":null}}],"line":35}},"s":{"0":0,"1":0,"2":0,"3":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0]},"meta":{"lastBranch":2,"lastFunction":4,"lastStatement":4,"seen":{"f:8:9:8:25":0,"b:9:18:9:Infinity":0,"s:12:2:17:Infinity":0,"f:21:9:21:17":1,"s:24:2:24:Infinity":1,"f:27:9:27:24":2,"s:30:2:30:Infinity":2,"f:33:9:33:24":3,"b:35:15:35:Infinity":1,"s:39:2:53:Infinity":3}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useAIChat.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useAIChat.ts","statementMap":{"0":{"start":{"line":13,"column":16},"end":{"line":13,"column":null}},"1":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"2":{"start":{"line":15,"column":16},"end":{"line":15,"column":null}},"3":{"start":{"line":17,"column":2},"end":{"line":19,"column":null}},"4":{"start":{"line":18,"column":4},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":2},"end":{"line":22,"column":null}},"6":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"7":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"8":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"9":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},"10":{"start":{"line":36,"column":30},"end":{"line":36,"column":null}},"11":{"start":{"line":37,"column":36},"end":{"line":37,"column":null}},"12":{"start":{"line":38,"column":46},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":8},"end":{"line":39,"column":null}},"14":{"start":{"line":41,"column":8},"end":{"line":88,"column":null}},"15":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"16":{"start":{"line":42,"column":37},"end":{"line":42,"column":null}},"17":{"start":{"line":44,"column":33},"end":{"line":44,"column":null}},"18":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"19":{"start":{"line":45,"column":24},"end":{"line":45,"column":42}},"20":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"21":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"22":{"start":{"line":48,"column":4},"end":{"line":48,"column":null}},"23":{"start":{"line":50,"column":24},"end":{"line":50,"column":null}},"24":{"start":{"line":50,"column":57},"end":{"line":50,"column":94}},"25":{"start":{"line":51,"column":22},"end":{"line":51,"column":null}},"26":{"start":{"line":53,"column":4},"end":{"line":62,"column":null}},"27":{"start":{"line":54,"column":22},"end":{"line":54,"column":null}},"28":{"start":{"line":55,"column":6},"end":{"line":60,"column":null}},"29":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"30":{"start":{"line":56,"column":30},"end":{"line":56,"column":null}},"31":{"start":{"line":57,"column":25},"end":{"line":57,"column":null}},"32":{"start":{"line":58,"column":8},"end":{"line":58,"column":null}},"33":{"start":{"line":58,"column":28},"end":{"line":58,"column":100}},"34":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"35":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"36":{"start":{"line":64,"column":33},"end":{"line":64,"column":null}},"37":{"start":{"line":65,"column":22},"end":{"line":65,"column":null}},"38":{"start":{"line":67,"column":20},"end":{"line":71,"column":null}},"39":{"start":{"line":68,"column":6},"end":{"line":68,"column":null}},"40":{"start":{"line":68,"column":28},"end":{"line":68,"column":null}},"41":{"start":{"line":69,"column":6},"end":{"line":69,"column":null}},"42":{"start":{"line":70,"column":6},"end":{"line":70,"column":null}},"43":{"start":{"line":73,"column":19},"end":{"line":78,"column":null}},"44":{"start":{"line":74,"column":6},"end":{"line":74,"column":null}},"45":{"start":{"line":74,"column":28},"end":{"line":74,"column":null}},"46":{"start":{"line":75,"column":6},"end":{"line":75,"column":null}},"47":{"start":{"line":75,"column":26},"end":{"line":75,"column":101}},"48":{"start":{"line":76,"column":6},"end":{"line":76,"column":null}},"49":{"start":{"line":77,"column":6},"end":{"line":77,"column":null}},"50":{"start":{"line":80,"column":20},"end":{"line":85,"column":null}},"51":{"start":{"line":81,"column":6},"end":{"line":81,"column":null}},"52":{"start":{"line":81,"column":28},"end":{"line":81,"column":null}},"53":{"start":{"line":82,"column":6},"end":{"line":82,"column":null}},"54":{"start":{"line":82,"column":26},"end":{"line":82,"column":107}},"55":{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},"56":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"57":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"58":{"start":{"line":90,"column":8},"end":{"line":95,"column":null}},"59":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"60":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"61":{"start":{"line":93,"column":4},"end":{"line":93,"column":null}},"62":{"start":{"line":94,"column":4},"end":{"line":94,"column":null}},"63":{"start":{"line":97,"column":8},"end":{"line":105,"column":null}},"64":{"start":{"line":98,"column":25},"end":{"line":98,"column":null}},"65":{"start":{"line":99,"column":4},"end":{"line":99,"column":null}},"66":{"start":{"line":99,"column":26},"end":{"line":99,"column":null}},"67":{"start":{"line":100,"column":20},"end":{"line":100,"column":null}},"68":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}},"69":{"start":{"line":101,"column":33},"end":{"line":101,"column":null}},"70":{"start":{"line":103,"column":4},"end":{"line":103,"column":null}},"71":{"start":{"line":103,"column":24},"end":{"line":103,"column":47}},"72":{"start":{"line":104,"column":4},"end":{"line":104,"column":null}},"73":{"start":{"line":107,"column":2},"end":{"line":107,"column":null}}},"fnMap":{"0":{"name":"generateMockResponse","decl":{"start":{"line":12,"column":9},"end":{"line":12,"column":30}},"loc":{"start":{"line":12,"column":98},"end":{"line":28,"column":null}},"line":12},"1":{"name":"useAIChat","decl":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"loc":{"start":{"line":35,"column":2},"end":{"line":108,"column":null}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":34},"end":{"line":41,"column":35}},"loc":{"start":{"line":41,"column":52},"end":{"line":88,"column":5}},"line":41},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":16},"end":{"line":45,"column":24}},"loc":{"start":{"line":45,"column":24},"end":{"line":45,"column":42}},"line":45},"4":{"name":"(anonymous_4)","decl":{"start":{"line":50,"column":51},"end":{"line":50,"column":57}},"loc":{"start":{"line":50,"column":57},"end":{"line":50,"column":94}},"line":50},"5":{"name":"(anonymous_5)","decl":{"start":{"line":55,"column":17},"end":{"line":55,"column":23}},"loc":{"start":{"line":55,"column":23},"end":{"line":60,"column":9}},"line":55},"6":{"name":"(anonymous_6)","decl":{"start":{"line":58,"column":20},"end":{"line":58,"column":28}},"loc":{"start":{"line":58,"column":28},"end":{"line":58,"column":100}},"line":58},"7":{"name":"(anonymous_7)","decl":{"start":{"line":67,"column":20},"end":{"line":67,"column":21}},"loc":{"start":{"line":67,"column":39},"end":{"line":71,"column":null}},"line":67},"8":{"name":"(anonymous_8)","decl":{"start":{"line":73,"column":19},"end":{"line":73,"column":25}},"loc":{"start":{"line":73,"column":25},"end":{"line":78,"column":null}},"line":73},"9":{"name":"(anonymous_9)","decl":{"start":{"line":75,"column":18},"end":{"line":75,"column":26}},"loc":{"start":{"line":75,"column":26},"end":{"line":75,"column":101}},"line":75},"10":{"name":"(anonymous_10)","decl":{"start":{"line":80,"column":20},"end":{"line":80,"column":21}},"loc":{"start":{"line":80,"column":39},"end":{"line":85,"column":null}},"line":80},"11":{"name":"(anonymous_11)","decl":{"start":{"line":82,"column":18},"end":{"line":82,"column":26}},"loc":{"start":{"line":82,"column":26},"end":{"line":82,"column":107}},"line":82},"12":{"name":"(anonymous_12)","decl":{"start":{"line":90,"column":40},"end":{"line":90,"column":46}},"loc":{"start":{"line":90,"column":46},"end":{"line":95,"column":5}},"line":90},"13":{"name":"(anonymous_13)","decl":{"start":{"line":97,"column":35},"end":{"line":97,"column":36}},"loc":{"start":{"line":97,"column":57},"end":{"line":105,"column":5}},"line":97},"14":{"name":"(anonymous_14)","decl":{"start":{"line":103,"column":16},"end":{"line":103,"column":24}},"loc":{"start":{"line":103,"column":24},"end":{"line":103,"column":47}},"line":103}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":16},"end":{"line":13,"column":null}},"type":"binary-expr","locations":[{"start":{"line":13,"column":16},"end":{"line":13,"column":32}},{"start":{"line":13,"column":32},"end":{"line":13,"column":null}}],"line":13},"1":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":null}},{"start":{},"end":{}}],"line":17},"2":{"loc":{"start":{"line":20,"column":2},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":22,"column":null}},{"start":{},"end":{}}],"line":20},"3":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":23},"4":{"loc":{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":42,"column":null}},{"start":{},"end":{}}],"line":42},"5":{"loc":{"start":{"line":42,"column":8},"end":{"line":42,"column":37}},"type":"binary-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":24}},{"start":{"line":42,"column":24},"end":{"line":42,"column":37}}],"line":42},"6":{"loc":{"start":{"line":53,"column":4},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":53,"column":4},"end":{"line":62,"column":null}},{"start":{},"end":{}}],"line":53},"7":{"loc":{"start":{"line":54,"column":22},"end":{"line":54,"column":null}},"type":"cond-expr","locations":[{"start":{"line":54,"column":31},"end":{"line":54,"column":63}},{"start":{"line":54,"column":63},"end":{"line":54,"column":null}}],"line":54},"8":{"loc":{"start":{"line":54,"column":31},"end":{"line":54,"column":63}},"type":"binary-expr","locations":[{"start":{"line":54,"column":31},"end":{"line":54,"column":57}},{"start":{"line":54,"column":57},"end":{"line":54,"column":63}}],"line":54},"9":{"loc":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":56},"10":{"loc":{"start":{"line":68,"column":6},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":68,"column":6},"end":{"line":68,"column":null}},{"start":{},"end":{}}],"line":68},"11":{"loc":{"start":{"line":74,"column":6},"end":{"line":74,"column":null}},"type":"if","locations":[{"start":{"line":74,"column":6},"end":{"line":74,"column":null}},{"start":{},"end":{}}],"line":74},"12":{"loc":{"start":{"line":81,"column":6},"end":{"line":81,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":6},"end":{"line":81,"column":null}},{"start":{},"end":{}}],"line":81},"13":{"loc":{"start":{"line":99,"column":4},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":99,"column":null}},{"start":{},"end":{}}],"line":99},"14":{"loc":{"start":{"line":101,"column":4},"end":{"line":101,"column":null}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":101,"column":null}},{"start":{},"end":{}}],"line":101}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0]},"meta":{"lastBranch":15,"lastFunction":15,"lastStatement":74,"seen":{"f:12:9:12:30":0,"s:13:16:13:Infinity":0,"b:13:16:13:32:13:32:13:Infinity":0,"s:14:8:14:Infinity":1,"s:15:16:15:Infinity":2,"b:17:2:19:Infinity:undefined:undefined:undefined:undefined":1,"s:17:2:19:Infinity":3,"s:18:4:18:Infinity":4,"b:20:2:22:Infinity:undefined:undefined:undefined:undefined":2,"s:20:2:22:Infinity":5,"s:21:4:21:Infinity":6,"b:23:2:25:Infinity:undefined:undefined:undefined:undefined":3,"s:23:2:25:Infinity":7,"s:24:4:24:Infinity":8,"s:27:2:27:Infinity":9,"f:30:16:30:Infinity":1,"s:36:30:36:Infinity":10,"s:37:36:37:Infinity":11,"s:38:46:38:Infinity":12,"s:39:8:39:Infinity":13,"s:41:8:88:Infinity":14,"f:41:34:41:35":2,"b:42:4:42:Infinity:undefined:undefined:undefined:undefined":4,"s:42:4:42:Infinity":15,"b:42:8:42:24:42:24:42:37":5,"s:42:37:42:Infinity":16,"s:44:33:44:Infinity":17,"s:45:4:45:Infinity":18,"f:45:16:45:24":3,"s:45:24:45:42":19,"s:46:4:46:Infinity":20,"s:47:4:47:Infinity":21,"s:48:4:48:Infinity":22,"s:50:24:50:Infinity":23,"f:50:51:50:57":4,"s:50:57:50:94":24,"s:51:22:51:Infinity":25,"b:53:4:62:Infinity:undefined:undefined:undefined:undefined":6,"s:53:4:62:Infinity":26,"s:54:22:54:Infinity":27,"b:54:31:54:63:54:63:54:Infinity":7,"b:54:31:54:57:54:57:54:63":8,"s:55:6:60:Infinity":28,"f:55:17:55:23":5,"b:56:8:56:Infinity:undefined:undefined:undefined:undefined":9,"s:56:8:56:Infinity":29,"s:56:30:56:Infinity":30,"s:57:25:57:Infinity":31,"s:58:8:58:Infinity":32,"f:58:20:58:28":6,"s:58:28:58:100":33,"s:59:8:59:Infinity":34,"s:61:6:61:Infinity":35,"s:64:33:64:Infinity":36,"s:65:22:65:Infinity":37,"s:67:20:71:Infinity":38,"f:67:20:67:21":7,"b:68:6:68:Infinity:undefined:undefined:undefined:undefined":10,"s:68:6:68:Infinity":39,"s:68:28:68:Infinity":40,"s:69:6:69:Infinity":41,"s:70:6:70:Infinity":42,"s:73:19:78:Infinity":43,"f:73:19:73:25":8,"b:74:6:74:Infinity:undefined:undefined:undefined:undefined":11,"s:74:6:74:Infinity":44,"s:74:28:74:Infinity":45,"s:75:6:75:Infinity":46,"f:75:18:75:26":9,"s:75:26:75:101":47,"s:76:6:76:Infinity":48,"s:77:6:77:Infinity":49,"s:80:20:85:Infinity":50,"f:80:20:80:21":10,"b:81:6:81:Infinity:undefined:undefined:undefined:undefined":12,"s:81:6:81:Infinity":51,"s:81:28:81:Infinity":52,"s:82:6:82:Infinity":53,"f:82:18:82:26":11,"s:82:26:82:107":54,"s:83:6:83:Infinity":55,"s:84:6:84:Infinity":56,"s:87:4:87:Infinity":57,"s:90:8:95:Infinity":58,"f:90:40:90:46":12,"s:91:4:91:Infinity":59,"s:92:4:92:Infinity":60,"s:93:4:93:Infinity":61,"s:94:4:94:Infinity":62,"s:97:8:105:Infinity":63,"f:97:35:97:36":13,"s:98:25:98:Infinity":64,"b:99:4:99:Infinity:undefined:undefined:undefined:undefined":13,"s:99:4:99:Infinity":65,"s:99:26:99:Infinity":66,"s:100:20:100:Infinity":67,"b:101:4:101:Infinity:undefined:undefined:undefined:undefined":14,"s:101:4:101:Infinity":68,"s:101:33:101:Infinity":69,"s:103:4:103:Infinity":70,"f:103:16:103:24":14,"s:103:24:103:47":71,"s:104:4:104:Infinity":72,"s:107:2:107:Infinity":73}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useAppKeyboard.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useAppKeyboard.ts","statementMap":{"0":{"start":{"line":19,"column":24},"end":{"line":22,"column":null}},"1":{"start":{"line":19,"column":73},"end":{"line":22,"column":null}},"2":{"start":{"line":20,"column":17},"end":{"line":20,"column":null}},"3":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"4":{"start":{"line":21,"column":14},"end":{"line":21,"column":null}},"5":{"start":{"line":24,"column":8},"end":{"line":32,"column":null}},"6":{"start":{"line":24,"column":65},"end":{"line":32,"column":6}},"7":{"start":{"line":29,"column":31},"end":{"line":29,"column":62}},"8":{"start":{"line":34,"column":2},"end":{"line":46,"column":null}},"9":{"start":{"line":35,"column":26},"end":{"line":43,"column":null}},"10":{"start":{"line":36,"column":18},"end":{"line":36,"column":null}},"11":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"12":{"start":{"line":37,"column":16},"end":{"line":37,"column":null}},"13":{"start":{"line":38,"column":22},"end":{"line":38,"column":null}},"14":{"start":{"line":39,"column":6},"end":{"line":42,"column":null}},"15":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"16":{"start":{"line":41,"column":8},"end":{"line":41,"column":null}},"17":{"start":{"line":44,"column":4},"end":{"line":44,"column":null}},"18":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"19":{"start":{"line":45,"column":17},"end":{"line":45,"column":null}}},"fnMap":{"0":{"name":"useAppKeyboard","decl":{"start":{"line":15,"column":16},"end":{"line":15,"column":31}},"loc":{"start":{"line":18,"column":20},"end":{"line":47,"column":null}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":24},"end":{"line":19,"column":25}},"loc":{"start":{"line":19,"column":73},"end":{"line":22,"column":null}},"line":19},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":73},"end":{"line":19,"column":79}},"loc":{"start":{"line":19,"column":79},"end":{"line":22,"column":null}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":24,"column":25},"end":{"line":24,"column":65}},"loc":{"start":{"line":24,"column":65},"end":{"line":32,"column":6}},"line":24},"4":{"name":"(anonymous_4)","decl":{"start":{"line":29,"column":21},"end":{"line":29,"column":22}},"loc":{"start":{"line":29,"column":31},"end":{"line":29,"column":62}},"line":29},"5":{"name":"(anonymous_5)","decl":{"start":{"line":34,"column":12},"end":{"line":34,"column":18}},"loc":{"start":{"line":34,"column":18},"end":{"line":46,"column":5}},"line":34},"6":{"name":"(anonymous_6)","decl":{"start":{"line":35,"column":26},"end":{"line":35,"column":27}},"loc":{"start":{"line":35,"column":48},"end":{"line":43,"column":null}},"line":35},"7":{"name":"(anonymous_7)","decl":{"start":{"line":45,"column":11},"end":{"line":45,"column":17}},"loc":{"start":{"line":45,"column":17},"end":{"line":45,"column":null}},"line":45}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":21},"1":{"loc":{"start":{"line":36,"column":18},"end":{"line":36,"column":null}},"type":"binary-expr","locations":[{"start":{"line":36,"column":18},"end":{"line":36,"column":31}},{"start":{"line":36,"column":31},"end":{"line":36,"column":null}}],"line":36},"2":{"loc":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},{"start":{},"end":{}}],"line":37},"3":{"loc":{"start":{"line":39,"column":6},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":6},"end":{"line":42,"column":null}},{"start":{},"end":{}}],"line":39}},"s":{"0":22,"1":88,"2":0,"3":0,"4":0,"5":22,"6":22,"7":0,"8":22,"9":22,"10":1,"11":1,"12":0,"13":1,"14":1,"15":1,"16":1,"17":22,"18":22,"19":22},"f":{"0":22,"1":88,"2":0,"3":22,"4":0,"5":22,"6":1,"7":22},"b":{"0":[0,0],"1":[1,0],"2":[0,1],"3":[1,0]},"meta":{"lastBranch":4,"lastFunction":8,"lastStatement":20,"seen":{"f:15:16:15:31":0,"s:19:24:22:Infinity":0,"f:19:24:19:25":1,"s:19:73:22:Infinity":1,"f:19:73:19:79":2,"s:20:17:20:Infinity":2,"b:21:4:21:Infinity:undefined:undefined:undefined:undefined":0,"s:21:4:21:Infinity":3,"s:21:14:21:Infinity":4,"s:24:8:32:Infinity":5,"f:24:25:24:65":3,"s:24:65:32:6":6,"f:29:21:29:22":4,"s:29:31:29:62":7,"s:34:2:46:Infinity":8,"f:34:12:34:18":5,"s:35:26:43:Infinity":9,"f:35:26:35:27":6,"s:36:18:36:Infinity":10,"b:36:18:36:31:36:31:36:Infinity":1,"b:37:6:37:Infinity:undefined:undefined:undefined:undefined":2,"s:37:6:37:Infinity":11,"s:37:16:37:Infinity":12,"s:38:22:38:Infinity":13,"b:39:6:42:Infinity:undefined:undefined:undefined:undefined":3,"s:39:6:42:Infinity":14,"s:40:8:40:Infinity":15,"s:41:8:41:Infinity":16,"s:44:4:44:Infinity":17,"s:45:4:45:Infinity":18,"f:45:11:45:17":7,"s:45:17:45:Infinity":19}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useKeyboardNavigation.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useKeyboardNavigation.ts","statementMap":{"0":{"start":{"line":27,"column":2},"end":{"line":30,"column":null}},"1":{"start":{"line":28,"column":4},"end":{"line":29,"column":null}},"2":{"start":{"line":29,"column":22},"end":{"line":29,"column":31}},"3":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"4":{"start":{"line":40,"column":22},"end":{"line":40,"column":null}},"5":{"start":{"line":41,"column":2},"end":{"line":41,"column":null}},"6":{"start":{"line":41,"column":32},"end":{"line":41,"column":null}},"7":{"start":{"line":43,"column":22},"end":{"line":43,"column":null}},"8":{"start":{"line":44,"column":23},"end":{"line":44,"column":null}},"9":{"start":{"line":44,"column":52},"end":{"line":44,"column":80}},"10":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"11":{"start":{"line":46,"column":2},"end":{"line":46,"column":null}},"12":{"start":{"line":56,"column":16},"end":{"line":56,"column":null}},"13":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"14":{"start":{"line":57,"column":26},"end":{"line":57,"column":null}},"15":{"start":{"line":59,"column":22},"end":{"line":59,"column":null}},"16":{"start":{"line":60,"column":23},"end":{"line":60,"column":null}},"17":{"start":{"line":60,"column":46},"end":{"line":60,"column":68}},"18":{"start":{"line":62,"column":20},"end":{"line":64,"column":null}},"19":{"start":{"line":66,"column":19},"end":{"line":66,"column":null}},"20":{"start":{"line":67,"column":2},"end":{"line":71,"column":null}},"21":{"start":{"line":68,"column":4},"end":{"line":68,"column":null}},"22":{"start":{"line":70,"column":4},"end":{"line":70,"column":null}},"23":{"start":{"line":84,"column":8},"end":{"line":87,"column":null}},"24":{"start":{"line":85,"column":10},"end":{"line":85,"column":null}},"25":{"start":{"line":89,"column":8},"end":{"line":89,"column":null}},"26":{"start":{"line":90,"column":2},"end":{"line":90,"column":null}},"27":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"28":{"start":{"line":92,"column":2},"end":{"line":92,"column":null}},"29":{"start":{"line":93,"column":8},"end":{"line":93,"column":null}},"30":{"start":{"line":94,"column":2},"end":{"line":94,"column":null}},"31":{"start":{"line":95,"column":8},"end":{"line":95,"column":null}},"32":{"start":{"line":96,"column":2},"end":{"line":96,"column":null}},"33":{"start":{"line":97,"column":8},"end":{"line":97,"column":null}},"34":{"start":{"line":98,"column":2},"end":{"line":98,"column":null}},"35":{"start":{"line":99,"column":8},"end":{"line":99,"column":null}},"36":{"start":{"line":100,"column":2},"end":{"line":100,"column":null}},"37":{"start":{"line":102,"column":2},"end":{"line":125,"column":null}},"38":{"start":{"line":103,"column":10},"end":{"line":103,"column":null}},"39":{"start":{"line":105,"column":26},"end":{"line":121,"column":null}},"40":{"start":{"line":106,"column":18},"end":{"line":106,"column":null}},"41":{"start":{"line":107,"column":6},"end":{"line":107,"column":null}},"42":{"start":{"line":107,"column":16},"end":{"line":107,"column":null}},"43":{"start":{"line":109,"column":28},"end":{"line":111,"column":null}},"44":{"start":{"line":112,"column":29},"end":{"line":112,"column":null}},"45":{"start":{"line":114,"column":6},"end":{"line":120,"column":null}},"46":{"start":{"line":115,"column":8},"end":{"line":115,"column":null}},"47":{"start":{"line":116,"column":8},"end":{"line":116,"column":null}},"48":{"start":{"line":117,"column":6},"end":{"line":120,"column":null}},"49":{"start":{"line":118,"column":8},"end":{"line":118,"column":null}},"50":{"start":{"line":119,"column":8},"end":{"line":119,"column":null}},"51":{"start":{"line":123,"column":4},"end":{"line":123,"column":null}},"52":{"start":{"line":124,"column":4},"end":{"line":124,"column":null}},"53":{"start":{"line":124,"column":17},"end":{"line":124,"column":null}}},"fnMap":{"0":{"name":"computeVisibleNotes","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":null}},"loc":{"start":{"line":26,"column":16},"end":{"line":32,"column":null}},"line":26},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":15},"end":{"line":29,"column":16}},"loc":{"start":{"line":29,"column":22},"end":{"line":29,"column":31}},"line":29},"2":{"name":"navigateTab","decl":{"start":{"line":34,"column":9},"end":{"line":34,"column":null}},"loc":{"start":{"line":39,"column":2},"end":{"line":47,"column":null}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":45},"end":{"line":44,"column":46}},"loc":{"start":{"line":44,"column":52},"end":{"line":44,"column":80}},"line":44},"4":{"name":"navigateNote","decl":{"start":{"line":49,"column":9},"end":{"line":49,"column":null}},"loc":{"start":{"line":55,"column":2},"end":{"line":72,"column":null}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":60,"column":39},"end":{"line":60,"column":40}},"loc":{"start":{"line":60,"column":46},"end":{"line":60,"column":68}},"line":60},"6":{"name":"useKeyboardNavigation","decl":{"start":{"line":74,"column":16},"end":{"line":74,"column":38}},"loc":{"start":{"line":83,"column":30},"end":{"line":126,"column":null}},"line":83},"7":{"name":"(anonymous_7)","decl":{"start":{"line":85,"column":4},"end":{"line":85,"column":10}},"loc":{"start":{"line":85,"column":10},"end":{"line":85,"column":null}},"line":85},"8":{"name":"(anonymous_8)","decl":{"start":{"line":102,"column":12},"end":{"line":102,"column":18}},"loc":{"start":{"line":102,"column":18},"end":{"line":125,"column":5}},"line":102},"9":{"name":"(anonymous_9)","decl":{"start":{"line":105,"column":26},"end":{"line":105,"column":27}},"loc":{"start":{"line":105,"column":48},"end":{"line":121,"column":null}},"line":105},"10":{"name":"(anonymous_10)","decl":{"start":{"line":124,"column":11},"end":{"line":124,"column":17}},"loc":{"start":{"line":124,"column":17},"end":{"line":124,"column":null}},"line":124}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":2},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":27},"1":{"loc":{"start":{"line":41,"column":2},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":41,"column":null}},{"start":{},"end":{}}],"line":41},"2":{"loc":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":57},"3":{"loc":{"start":{"line":62,"column":20},"end":{"line":64,"column":null}},"type":"cond-expr","locations":[{"start":{"line":63,"column":7},"end":{"line":63,"column":null}},{"start":{"line":63,"column":44},"end":{"line":64,"column":null}}],"line":62},"4":{"loc":{"start":{"line":63,"column":7},"end":{"line":63,"column":null}},"type":"cond-expr","locations":[{"start":{"line":63,"column":25},"end":{"line":63,"column":29}},{"start":{"line":63,"column":29},"end":{"line":63,"column":null}}],"line":63},"5":{"loc":{"start":{"line":67,"column":2},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":71,"column":null}},{"start":{"line":69,"column":9},"end":{"line":71,"column":null}}],"line":67},"6":{"loc":{"start":{"line":106,"column":18},"end":{"line":106,"column":null}},"type":"binary-expr","locations":[{"start":{"line":106,"column":18},"end":{"line":106,"column":31}},{"start":{"line":106,"column":31},"end":{"line":106,"column":null}}],"line":106},"7":{"loc":{"start":{"line":107,"column":6},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":107,"column":6},"end":{"line":107,"column":null}},{"start":{},"end":{}}],"line":107},"8":{"loc":{"start":{"line":109,"column":28},"end":{"line":111,"column":null}},"type":"cond-expr","locations":[{"start":{"line":110,"column":10},"end":{"line":110,"column":null}},{"start":{"line":111,"column":10},"end":{"line":111,"column":null}}],"line":109},"9":{"loc":{"start":{"line":110,"column":10},"end":{"line":110,"column":null}},"type":"binary-expr","locations":[{"start":{"line":110,"column":10},"end":{"line":110,"column":22}},{"start":{"line":110,"column":22},"end":{"line":110,"column":null}}],"line":110},"10":{"loc":{"start":{"line":111,"column":10},"end":{"line":111,"column":null}},"type":"binary-expr","locations":[{"start":{"line":111,"column":10},"end":{"line":111,"column":24}},{"start":{"line":111,"column":24},"end":{"line":111,"column":null}}],"line":111},"11":{"loc":{"start":{"line":112,"column":29},"end":{"line":112,"column":null}},"type":"binary-expr","locations":[{"start":{"line":112,"column":29},"end":{"line":112,"column":41}},{"start":{"line":112,"column":41},"end":{"line":112,"column":null}}],"line":112},"12":{"loc":{"start":{"line":114,"column":6},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":114,"column":6},"end":{"line":120,"column":null}},{"start":{"line":117,"column":6},"end":{"line":120,"column":null}}],"line":114},"13":{"loc":{"start":{"line":114,"column":10},"end":{"line":114,"column":78}},"type":"binary-expr","locations":[{"start":{"line":114,"column":10},"end":{"line":114,"column":28}},{"start":{"line":114,"column":28},"end":{"line":114,"column":53}},{"start":{"line":114,"column":53},"end":{"line":114,"column":78}}],"line":114},"14":{"loc":{"start":{"line":116,"column":63},"end":{"line":116,"column":94}},"type":"cond-expr","locations":[{"start":{"line":116,"column":88},"end":{"line":116,"column":92}},{"start":{"line":116,"column":92},"end":{"line":116,"column":94}}],"line":116},"15":{"loc":{"start":{"line":117,"column":6},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":117,"column":6},"end":{"line":120,"column":null}},{"start":{},"end":{}}],"line":117},"16":{"loc":{"start":{"line":117,"column":17},"end":{"line":117,"column":83}},"type":"binary-expr","locations":[{"start":{"line":117,"column":17},"end":{"line":117,"column":36}},{"start":{"line":117,"column":36},"end":{"line":117,"column":59}},{"start":{"line":117,"column":59},"end":{"line":117,"column":83}}],"line":117},"17":{"loc":{"start":{"line":119,"column":87},"end":{"line":119,"column":117}},"type":"cond-expr","locations":[{"start":{"line":119,"column":111},"end":{"line":119,"column":115}},{"start":{"line":119,"column":115},"end":{"line":119,"column":117}}],"line":119}},"s":{"0":21,"1":0,"2":0,"3":21,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":22,"24":21,"25":22,"26":22,"27":22,"28":22,"29":22,"30":22,"31":22,"32":22,"33":22,"34":22,"35":22,"36":22,"37":22,"38":7,"39":7,"40":1,"41":1,"42":0,"43":1,"44":1,"45":1,"46":0,"47":0,"48":1,"49":0,"50":0,"51":7,"52":7,"53":7},"f":{"0":21,"1":0,"2":0,"3":0,"4":0,"5":0,"6":22,"7":21,"8":7,"9":1,"10":7},"b":{"0":[0,21],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[1,0],"7":[0,1],"8":[0,1],"9":[0,0],"10":[1,0],"11":[1,0],"12":[0,1],"13":[1,0,0],"14":[0,0],"15":[0,1],"16":[1,0,0],"17":[0,0]},"meta":{"lastBranch":18,"lastFunction":11,"lastStatement":54,"seen":{"f:22:9:22:Infinity":0,"b:27:2:30:Infinity:undefined:undefined:undefined:undefined":0,"s:27:2:30:Infinity":0,"s:28:4:29:Infinity":1,"f:29:15:29:16":1,"s:29:22:29:31":2,"s:31:2:31:Infinity":3,"f:34:9:34:Infinity":2,"s:40:22:40:Infinity":4,"b:41:2:41:Infinity:undefined:undefined:undefined:undefined":1,"s:41:2:41:Infinity":5,"s:41:32:41:Infinity":6,"s:43:22:43:Infinity":7,"s:44:23:44:Infinity":8,"f:44:45:44:46":3,"s:44:52:44:80":9,"s:45:8:45:Infinity":10,"s:46:2:46:Infinity":11,"f:49:9:49:Infinity":4,"s:56:16:56:Infinity":12,"b:57:2:57:Infinity:undefined:undefined:undefined:undefined":2,"s:57:2:57:Infinity":13,"s:57:26:57:Infinity":14,"s:59:22:59:Infinity":15,"s:60:23:60:Infinity":16,"f:60:39:60:40":5,"s:60:46:60:68":17,"s:62:20:64:Infinity":18,"b:63:7:63:Infinity:63:44:64:Infinity":3,"b:63:25:63:29:63:29:63:Infinity":4,"s:66:19:66:Infinity":19,"b:67:2:71:Infinity:69:9:71:Infinity":5,"s:67:2:71:Infinity":20,"s:68:4:68:Infinity":21,"s:70:4:70:Infinity":22,"f:74:16:74:38":6,"s:84:8:87:Infinity":23,"f:85:4:85:10":7,"s:85:10:85:Infinity":24,"s:89:8:89:Infinity":25,"s:90:2:90:Infinity":26,"s:91:8:91:Infinity":27,"s:92:2:92:Infinity":28,"s:93:8:93:Infinity":29,"s:94:2:94:Infinity":30,"s:95:8:95:Infinity":31,"s:96:2:96:Infinity":32,"s:97:8:97:Infinity":33,"s:98:2:98:Infinity":34,"s:99:8:99:Infinity":35,"s:100:2:100:Infinity":36,"s:102:2:125:Infinity":37,"f:102:12:102:18":8,"s:103:10:103:Infinity":38,"s:105:26:121:Infinity":39,"f:105:26:105:27":9,"s:106:18:106:Infinity":40,"b:106:18:106:31:106:31:106:Infinity":6,"b:107:6:107:Infinity:undefined:undefined:undefined:undefined":7,"s:107:6:107:Infinity":41,"s:107:16:107:Infinity":42,"s:109:28:111:Infinity":43,"b:110:10:110:Infinity:111:10:111:Infinity":8,"b:110:10:110:22:110:22:110:Infinity":9,"b:111:10:111:24:111:24:111:Infinity":10,"s:112:29:112:Infinity":44,"b:112:29:112:41:112:41:112:Infinity":11,"b:114:6:120:Infinity:117:6:120:Infinity":12,"s:114:6:120:Infinity":45,"b:114:10:114:28:114:28:114:53:114:53:114:78":13,"s:115:8:115:Infinity":46,"s:116:8:116:Infinity":47,"b:116:88:116:92:116:92:116:94":14,"b:117:6:120:Infinity:undefined:undefined:undefined:undefined":15,"s:117:6:120:Infinity":48,"b:117:17:117:36:117:36:117:59:117:59:117:83":16,"s:118:8:118:Infinity":49,"s:119:8:119:Infinity":50,"b:119:111:119:115:119:115:119:117":17,"s:123:4:123:Infinity":51,"s:124:4:124:Infinity":52,"f:124:11:124:17":10,"s:124:17:124:Infinity":53}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useMcpBridge.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useMcpBridge.ts","statementMap":{"0":{"start":{"line":11,"column":23},"end":{"line":11,"column":null}},"1":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"2":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"3":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"4":{"start":{"line":28,"column":32},"end":{"line":28,"column":null}},"5":{"start":{"line":30,"column":8},"end":{"line":69,"column":null}},"6":{"start":{"line":31,"column":15},"end":{"line":31,"column":null}},"7":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"8":{"start":{"line":32,"column":48},"end":{"line":32,"column":null}},"9":{"start":{"line":34,"column":4},"end":{"line":68,"column":null}},"10":{"start":{"line":35,"column":20},"end":{"line":35,"column":null}},"11":{"start":{"line":37,"column":6},"end":{"line":41,"column":null}},"12":{"start":{"line":38,"column":8},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":8},"end":{"line":39,"column":null}},"14":{"start":{"line":40,"column":8},"end":{"line":40,"column":null}},"15":{"start":{"line":43,"column":6},"end":{"line":58,"column":null}},"16":{"start":{"line":44,"column":8},"end":{"line":57,"column":null}},"17":{"start":{"line":45,"column":22},"end":{"line":45,"column":null}},"18":{"start":{"line":46,"column":26},"end":{"line":46,"column":null}},"19":{"start":{"line":47,"column":10},"end":{"line":54,"column":null}},"20":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"21":{"start":{"line":49,"column":12},"end":{"line":53,"column":null}},"22":{"start":{"line":50,"column":14},"end":{"line":50,"column":null}},"23":{"start":{"line":52,"column":14},"end":{"line":52,"column":null}},"24":{"start":{"line":60,"column":6},"end":{"line":63,"column":null}},"25":{"start":{"line":61,"column":8},"end":{"line":61,"column":null}},"26":{"start":{"line":62,"column":8},"end":{"line":62,"column":null}},"27":{"start":{"line":65,"column":6},"end":{"line":67,"column":null}},"28":{"start":{"line":66,"column":8},"end":{"line":66,"column":null}},"29":{"start":{"line":71,"column":8},"end":{"line":87,"column":null}},"30":{"start":{"line":72,"column":15},"end":{"line":72,"column":null}},"31":{"start":{"line":73,"column":15},"end":{"line":73,"column":null}},"32":{"start":{"line":75,"column":4},"end":{"line":86,"column":null}},"33":{"start":{"line":76,"column":6},"end":{"line":76,"column":null}},"34":{"start":{"line":77,"column":6},"end":{"line":77,"column":null}},"35":{"start":{"line":80,"column":6},"end":{"line":85,"column":null}},"36":{"start":{"line":81,"column":8},"end":{"line":84,"column":null}},"37":{"start":{"line":82,"column":10},"end":{"line":82,"column":null}},"38":{"start":{"line":83,"column":10},"end":{"line":83,"column":null}},"39":{"start":{"line":89,"column":8},"end":{"line":92,"column":null}},"40":{"start":{"line":90,"column":22},"end":{"line":90,"column":null}},"41":{"start":{"line":94,"column":8},"end":{"line":98,"column":null}},"42":{"start":{"line":96,"column":6},"end":{"line":96,"column":null}},"43":{"start":{"line":100,"column":8},"end":{"line":104,"column":null}},"44":{"start":{"line":102,"column":6},"end":{"line":102,"column":null}},"45":{"start":{"line":106,"column":8},"end":{"line":110,"column":null}},"46":{"start":{"line":108,"column":6},"end":{"line":108,"column":null}},"47":{"start":{"line":112,"column":2},"end":{"line":112,"column":null}}},"fnMap":{"0":{"name":"useMcpBridge","decl":{"start":{"line":24,"column":16},"end":{"line":24,"column":29}},"loc":{"start":{"line":24,"column":53},"end":{"line":113,"column":null}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":30,"column":39},"end":{"line":30,"column":65}},"loc":{"start":{"line":30,"column":65},"end":{"line":69,"column":5}},"line":30},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":23},"end":{"line":34,"column":24}},"loc":{"start":{"line":34,"column":44},"end":{"line":68,"column":5}},"line":34},"3":{"name":"(anonymous_3)","decl":{"start":{"line":37,"column":21},"end":{"line":37,"column":27}},"loc":{"start":{"line":37,"column":27},"end":{"line":41,"column":null}},"line":37},"4":{"name":"(anonymous_4)","decl":{"start":{"line":43,"column":24},"end":{"line":43,"column":25}},"loc":{"start":{"line":43,"column":35},"end":{"line":58,"column":null}},"line":43},"5":{"name":"(anonymous_5)","decl":{"start":{"line":60,"column":22},"end":{"line":60,"column":28}},"loc":{"start":{"line":60,"column":28},"end":{"line":63,"column":null}},"line":60},"6":{"name":"(anonymous_6)","decl":{"start":{"line":65,"column":22},"end":{"line":65,"column":28}},"loc":{"start":{"line":65,"column":28},"end":{"line":67,"column":null}},"line":65},"7":{"name":"(anonymous_7)","decl":{"start":{"line":71,"column":31},"end":{"line":71,"column":41}},"loc":{"start":{"line":71,"column":97},"end":{"line":87,"column":5}},"line":71},"8":{"name":"(anonymous_8)","decl":{"start":{"line":75,"column":23},"end":{"line":75,"column":24}},"loc":{"start":{"line":75,"column":44},"end":{"line":86,"column":5}},"line":75},"9":{"name":"(anonymous_9)","decl":{"start":{"line":80,"column":17},"end":{"line":80,"column":23}},"loc":{"start":{"line":80,"column":23},"end":{"line":85,"column":9}},"line":80},"10":{"name":"(anonymous_10)","decl":{"start":{"line":90,"column":4},"end":{"line":90,"column":5}},"loc":{"start":{"line":90,"column":22},"end":{"line":90,"column":null}},"line":90},"11":{"name":"(anonymous_11)","decl":{"start":{"line":95,"column":4},"end":{"line":95,"column":5}},"loc":{"start":{"line":96,"column":6},"end":{"line":96,"column":null}},"line":96},"12":{"name":"(anonymous_12)","decl":{"start":{"line":101,"column":4},"end":{"line":101,"column":5}},"loc":{"start":{"line":102,"column":6},"end":{"line":102,"column":null}},"line":102},"13":{"name":"(anonymous_13)","decl":{"start":{"line":107,"column":4},"end":{"line":107,"column":5}},"loc":{"start":{"line":108,"column":6},"end":{"line":108,"column":null}},"line":108}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":29},"end":{"line":24,"column":53}},"type":"default-arg","locations":[{"start":{"line":24,"column":37},"end":{"line":24,"column":53}}],"line":24},"1":{"loc":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},{"start":{},"end":{}}],"line":32},"2":{"loc":{"start":{"line":32,"column":8},"end":{"line":32,"column":48}},"type":"binary-expr","locations":[{"start":{"line":32,"column":8},"end":{"line":32,"column":14}},{"start":{"line":32,"column":14},"end":{"line":32,"column":48}}],"line":32},"3":{"loc":{"start":{"line":47,"column":10},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":10},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":47},"4":{"loc":{"start":{"line":49,"column":12},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":12},"end":{"line":53,"column":null}},{"start":{"line":51,"column":19},"end":{"line":53,"column":null}}],"line":49},"5":{"loc":{"start":{"line":81,"column":8},"end":{"line":84,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":84,"column":null}},{"start":{},"end":{}}],"line":81}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]},"meta":{"lastBranch":6,"lastFunction":14,"lastStatement":48,"seen":{"s:11:23:11:Infinity":0,"f:24:16:24:29":0,"b:24:37:24:53":0,"s:25:8:25:Infinity":1,"s:26:8:26:Infinity":2,"s:27:8:27:Infinity":3,"s:28:32:28:Infinity":4,"s:30:8:69:Infinity":5,"f:30:39:30:65":1,"s:31:15:31:Infinity":6,"b:32:4:32:Infinity:undefined:undefined:undefined:undefined":1,"s:32:4:32:Infinity":7,"b:32:8:32:14:32:14:32:48":2,"s:32:48:32:Infinity":8,"s:34:4:68:Infinity":9,"f:34:23:34:24":2,"s:35:20:35:Infinity":10,"s:37:6:41:Infinity":11,"f:37:21:37:27":3,"s:38:8:38:Infinity":12,"s:39:8:39:Infinity":13,"s:40:8:40:Infinity":14,"s:43:6:58:Infinity":15,"f:43:24:43:25":4,"s:44:8:57:Infinity":16,"s:45:22:45:Infinity":17,"s:46:26:46:Infinity":18,"b:47:10:54:Infinity:undefined:undefined:undefined:undefined":3,"s:47:10:54:Infinity":19,"s:48:12:48:Infinity":20,"b:49:12:53:Infinity:51:19:53:Infinity":4,"s:49:12:53:Infinity":21,"s:50:14:50:Infinity":22,"s:52:14:52:Infinity":23,"s:60:6:63:Infinity":24,"f:60:22:60:28":5,"s:61:8:61:Infinity":25,"s:62:8:62:Infinity":26,"s:65:6:67:Infinity":27,"f:65:22:65:28":6,"s:66:8:66:Infinity":28,"s:71:8:87:Infinity":29,"f:71:31:71:41":7,"s:72:15:72:Infinity":30,"s:73:15:73:Infinity":31,"s:75:4:86:Infinity":32,"f:75:23:75:24":8,"s:76:6:76:Infinity":33,"s:77:6:77:Infinity":34,"s:80:6:85:Infinity":35,"f:80:17:80:23":9,"b:81:8:84:Infinity:undefined:undefined:undefined:undefined":5,"s:81:8:84:Infinity":36,"s:82:10:82:Infinity":37,"s:83:10:83:Infinity":38,"s:89:8:92:Infinity":39,"f:90:4:90:5":10,"s:90:22:90:Infinity":40,"s:94:8:98:Infinity":41,"f:95:4:95:5":11,"s:96:6:96:Infinity":42,"s:100:8:104:Infinity":43,"f:101:4:101:5":12,"s:102:6:102:Infinity":44,"s:106:8:110:Infinity":45,"f:107:4:107:5":13,"s:108:6:108:Infinity":46,"s:112:2:112:Infinity":47}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useNoteActions.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useNoteActions.ts","statementMap":{"0":{"start":{"line":14,"column":18},"end":{"line":14,"column":null}},"1":{"start":{"line":15,"column":18},"end":{"line":15,"column":null}},"2":{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},"3":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"4":{"start":{"line":19,"column":38},"end":{"line":19,"column":50}},"5":{"start":{"line":20,"column":2},"end":{"line":26,"column":null}},"6":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"7":{"start":{"line":22,"column":2},"end":{"line":26,"column":null}},"8":{"start":{"line":23,"column":4},"end":{"line":23,"column":null}},"9":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"10":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"11":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"12":{"start":{"line":32,"column":16},"end":{"line":32,"column":null}},"13":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"14":{"start":{"line":33,"column":20},"end":{"line":33,"column":null}},"15":{"start":{"line":35,"column":13},"end":{"line":35,"column":null}},"16":{"start":{"line":36,"column":15},"end":{"line":36,"column":null}},"17":{"start":{"line":37,"column":21},"end":{"line":37,"column":null}},"18":{"start":{"line":39,"column":2},"end":{"line":64,"column":null}},"19":{"start":{"line":40,"column":18},"end":{"line":40,"column":null}},"20":{"start":{"line":41,"column":31},"end":{"line":41,"column":null}},"21":{"start":{"line":42,"column":12},"end":{"line":42,"column":null}},"22":{"start":{"line":43,"column":4},"end":{"line":56,"column":null}},"23":{"start":{"line":44,"column":6},"end":{"line":53,"column":null}},"24":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"25":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"26":{"start":{"line":46,"column":64},"end":{"line":46,"column":null}},"27":{"start":{"line":47,"column":8},"end":{"line":51,"column":null}},"28":{"start":{"line":48,"column":10},"end":{"line":48,"column":null}},"29":{"start":{"line":50,"column":10},"end":{"line":50,"column":null}},"30":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"31":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"32":{"start":{"line":55,"column":6},"end":{"line":55,"column":null}},"33":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"34":{"start":{"line":59,"column":4},"end":{"line":63,"column":null}},"35":{"start":{"line":60,"column":6},"end":{"line":60,"column":null}},"36":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"37":{"start":{"line":68,"column":18},"end":{"line":68,"column":null}},"38":{"start":{"line":69,"column":2},"end":{"line":69,"column":null}},"39":{"start":{"line":69,"column":36},"end":{"line":69,"column":null}},"40":{"start":{"line":70,"column":16},"end":{"line":70,"column":null}},"41":{"start":{"line":71,"column":2},"end":{"line":71,"column":null}},"42":{"start":{"line":71,"column":20},"end":{"line":71,"column":null}},"43":{"start":{"line":73,"column":13},"end":{"line":73,"column":null}},"44":{"start":{"line":74,"column":15},"end":{"line":74,"column":null}},"45":{"start":{"line":75,"column":21},"end":{"line":75,"column":null}},"46":{"start":{"line":77,"column":16},"end":{"line":77,"column":null}},"47":{"start":{"line":78,"column":29},"end":{"line":78,"column":null}},"48":{"start":{"line":79,"column":10},"end":{"line":79,"column":null}},"49":{"start":{"line":80,"column":2},"end":{"line":88,"column":null}},"50":{"start":{"line":81,"column":4},"end":{"line":85,"column":null}},"51":{"start":{"line":82,"column":6},"end":{"line":82,"column":null}},"52":{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},"53":{"start":{"line":83,"column":62},"end":{"line":83,"column":null}},"54":{"start":{"line":84,"column":6},"end":{"line":84,"column":null}},"55":{"start":{"line":86,"column":4},"end":{"line":86,"column":null}},"56":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"57":{"start":{"line":89,"column":2},"end":{"line":89,"column":null}},"58":{"start":{"line":92,"column":22},"end":{"line":92,"column":null}},"59":{"start":{"line":95,"column":2},"end":{"line":97,"column":null}},"60":{"start":{"line":96,"column":4},"end":{"line":96,"column":null}},"61":{"start":{"line":96,"column":69},"end":{"line":96,"column":81}},"62":{"start":{"line":101,"column":2},"end":{"line":106,"column":null}},"63":{"start":{"line":102,"column":19},"end":{"line":102,"column":null}},"64":{"start":{"line":103,"column":4},"end":{"line":103,"column":null}},"65":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"66":{"start":{"line":110,"column":2},"end":{"line":112,"column":null}},"67":{"start":{"line":121,"column":23},"end":{"line":126,"column":null}},"68":{"start":{"line":122,"column":4},"end":{"line":124,"column":null}},"69":{"start":{"line":122,"column":22},"end":{"line":124,"column":5}},"70":{"start":{"line":123,"column":6},"end":{"line":123,"column":null}},"71":{"start":{"line":125,"column":4},"end":{"line":125,"column":null}},"72":{"start":{"line":127,"column":2},"end":{"line":132,"column":null}},"73":{"start":{"line":128,"column":4},"end":{"line":128,"column":null}},"74":{"start":{"line":130,"column":4},"end":{"line":130,"column":null}},"75":{"start":{"line":131,"column":4},"end":{"line":131,"column":null}},"76":{"start":{"line":141,"column":22},"end":{"line":141,"column":null}},"77":{"start":{"line":142,"column":40},"end":{"line":142,"column":null}},"78":{"start":{"line":143,"column":8},"end":{"line":143,"column":null}},"79":{"start":{"line":144,"column":2},"end":{"line":144,"column":null}},"80":{"start":{"line":145,"column":8},"end":{"line":145,"column":null}},"81":{"start":{"line":146,"column":2},"end":{"line":146,"column":null}},"82":{"start":{"line":147,"column":8},"end":{"line":147,"column":null}},"83":{"start":{"line":149,"column":8},"end":{"line":172,"column":null}},"84":{"start":{"line":151,"column":4},"end":{"line":154,"column":null}},"85":{"start":{"line":151,"column":36},"end":{"line":151,"column":63}},"86":{"start":{"line":152,"column":6},"end":{"line":152,"column":null}},"87":{"start":{"line":153,"column":6},"end":{"line":153,"column":null}},"88":{"start":{"line":157,"column":4},"end":{"line":171,"column":null}},"89":{"start":{"line":158,"column":22},"end":{"line":158,"column":null}},"90":{"start":{"line":159,"column":6},"end":{"line":162,"column":null}},"91":{"start":{"line":160,"column":8},"end":{"line":160,"column":null}},"92":{"start":{"line":160,"column":29},"end":{"line":160,"column":56}},"93":{"start":{"line":160,"column":59},"end":{"line":160,"column":null}},"94":{"start":{"line":161,"column":8},"end":{"line":161,"column":null}},"95":{"start":{"line":163,"column":6},"end":{"line":163,"column":null}},"96":{"start":{"line":165,"column":6},"end":{"line":165,"column":null}},"97":{"start":{"line":166,"column":6},"end":{"line":169,"column":null}},"98":{"start":{"line":167,"column":8},"end":{"line":167,"column":null}},"99":{"start":{"line":167,"column":29},"end":{"line":167,"column":56}},"100":{"start":{"line":167,"column":59},"end":{"line":167,"column":null}},"101":{"start":{"line":168,"column":8},"end":{"line":168,"column":null}},"102":{"start":{"line":170,"column":6},"end":{"line":170,"column":null}},"103":{"start":{"line":174,"column":8},"end":{"line":186,"column":null}},"104":{"start":{"line":175,"column":4},"end":{"line":185,"column":null}},"105":{"start":{"line":176,"column":19},"end":{"line":176,"column":null}},"106":{"start":{"line":176,"column":38},"end":{"line":176,"column":59}},"107":{"start":{"line":177,"column":6},"end":{"line":183,"column":null}},"108":{"start":{"line":178,"column":26},"end":{"line":178,"column":null}},"109":{"start":{"line":178,"column":48},"end":{"line":178,"column":69}},"110":{"start":{"line":179,"column":23},"end":{"line":179,"column":null}},"111":{"start":{"line":180,"column":8},"end":{"line":180,"column":null}},"112":{"start":{"line":181,"column":6},"end":{"line":183,"column":null}},"113":{"start":{"line":182,"column":8},"end":{"line":182,"column":null}},"114":{"start":{"line":184,"column":6},"end":{"line":184,"column":null}},"115":{"start":{"line":187,"column":2},"end":{"line":187,"column":null}},"116":{"start":{"line":189,"column":8},"end":{"line":191,"column":null}},"117":{"start":{"line":190,"column":4},"end":{"line":190,"column":null}},"118":{"start":{"line":193,"column":8},"end":{"line":214,"column":null}},"119":{"start":{"line":194,"column":24},"end":{"line":194,"column":null}},"120":{"start":{"line":195,"column":24},"end":{"line":195,"column":null}},"121":{"start":{"line":195,"column":39},"end":{"line":195,"column":null}},"122":{"start":{"line":196,"column":26},"end":{"line":196,"column":null}},"123":{"start":{"line":198,"column":18},"end":{"line":207,"column":null}},"124":{"start":{"line":199,"column":6},"end":{"line":199,"column":null}},"125":{"start":{"line":199,"column":49},"end":{"line":199,"column":null}},"126":{"start":{"line":200,"column":6},"end":{"line":200,"column":null}},"127":{"start":{"line":200,"column":32},"end":{"line":200,"column":63}},"128":{"start":{"line":200,"column":66},"end":{"line":200,"column":null}},"129":{"start":{"line":201,"column":23},"end":{"line":201,"column":null}},"130":{"start":{"line":202,"column":6},"end":{"line":202,"column":null}},"131":{"start":{"line":202,"column":50},"end":{"line":202,"column":null}},"132":{"start":{"line":203,"column":23},"end":{"line":203,"column":null}},"133":{"start":{"line":204,"column":6},"end":{"line":204,"column":null}},"134":{"start":{"line":204,"column":67},"end":{"line":204,"column":null}},"135":{"start":{"line":205,"column":6},"end":{"line":205,"column":null}},"136":{"start":{"line":205,"column":51},"end":{"line":205,"column":null}},"137":{"start":{"line":206,"column":6},"end":{"line":206,"column":null}},"138":{"start":{"line":209,"column":4},"end":{"line":213,"column":null}},"139":{"start":{"line":210,"column":6},"end":{"line":210,"column":null}},"140":{"start":{"line":212,"column":6},"end":{"line":212,"column":null}},"141":{"start":{"line":216,"column":8},"end":{"line":251,"column":null}},"142":{"start":{"line":217,"column":49},"end":{"line":221,"column":null}},"143":{"start":{"line":223,"column":19},"end":{"line":223,"column":null}},"144":{"start":{"line":224,"column":17},"end":{"line":224,"column":null}},"145":{"start":{"line":225,"column":17},"end":{"line":225,"column":null}},"146":{"start":{"line":226,"column":16},"end":{"line":226,"column":null}},"147":{"start":{"line":228,"column":26},"end":{"line":228,"column":null}},"148":{"start":{"line":229,"column":33},"end":{"line":236,"column":null}},"149":{"start":{"line":238,"column":24},"end":{"line":242,"column":null}},"150":{"start":{"line":243,"column":20},"end":{"line":243,"column":null}},"151":{"start":{"line":245,"column":4},"end":{"line":247,"column":null}},"152":{"start":{"line":246,"column":6},"end":{"line":246,"column":null}},"153":{"start":{"line":249,"column":4},"end":{"line":249,"column":null}},"154":{"start":{"line":250,"column":4},"end":{"line":250,"column":null}},"155":{"start":{"line":253,"column":8},"end":{"line":274,"column":null}},"156":{"start":{"line":254,"column":17},"end":{"line":254,"column":null}},"157":{"start":{"line":255,"column":17},"end":{"line":255,"column":null}},"158":{"start":{"line":256,"column":16},"end":{"line":256,"column":null}},"159":{"start":{"line":258,"column":33},"end":{"line":264,"column":null}},"160":{"start":{"line":266,"column":20},"end":{"line":266,"column":null}},"161":{"start":{"line":268,"column":4},"end":{"line":270,"column":null}},"162":{"start":{"line":269,"column":6},"end":{"line":269,"column":null}},"163":{"start":{"line":272,"column":4},"end":{"line":272,"column":null}},"164":{"start":{"line":273,"column":4},"end":{"line":273,"column":null}},"165":{"start":{"line":276,"column":8},"end":{"line":300,"column":null}},"166":{"start":{"line":277,"column":4},"end":{"line":299,"column":null}},"167":{"start":{"line":279,"column":6},"end":{"line":290,"column":null}},"168":{"start":{"line":280,"column":33},"end":{"line":280,"column":null}},"169":{"start":{"line":281,"column":8},"end":{"line":285,"column":null}},"170":{"start":{"line":281,"column":34},"end":{"line":281,"column":null}},"171":{"start":{"line":281,"column":46},"end":{"line":285,"column":null}},"172":{"start":{"line":282,"column":45},"end":{"line":282,"column":null}},"173":{"start":{"line":282,"column":57},"end":{"line":285,"column":null}},"174":{"start":{"line":283,"column":44},"end":{"line":283,"column":null}},"175":{"start":{"line":283,"column":56},"end":{"line":285,"column":null}},"176":{"start":{"line":284,"column":33},"end":{"line":284,"column":null}},"177":{"start":{"line":285,"column":13},"end":{"line":285,"column":null}},"178":{"start":{"line":286,"column":8},"end":{"line":286,"column":null}},"179":{"start":{"line":288,"column":8},"end":{"line":288,"column":null}},"180":{"start":{"line":289,"column":8},"end":{"line":289,"column":null}},"181":{"start":{"line":291,"column":6},"end":{"line":293,"column":null}},"182":{"start":{"line":291,"column":24},"end":{"line":293,"column":7}},"183":{"start":{"line":292,"column":8},"end":{"line":292,"column":null}},"184":{"start":{"line":294,"column":6},"end":{"line":294,"column":null}},"185":{"start":{"line":295,"column":6},"end":{"line":295,"column":null}},"186":{"start":{"line":297,"column":6},"end":{"line":297,"column":null}},"187":{"start":{"line":298,"column":6},"end":{"line":298,"column":null}},"188":{"start":{"line":302,"column":8},"end":{"line":320,"column":null}},"189":{"start":{"line":303,"column":4},"end":{"line":319,"column":null}},"190":{"start":{"line":305,"column":6},"end":{"line":310,"column":null}},"191":{"start":{"line":306,"column":8},"end":{"line":306,"column":null}},"192":{"start":{"line":308,"column":8},"end":{"line":308,"column":null}},"193":{"start":{"line":309,"column":8},"end":{"line":309,"column":null}},"194":{"start":{"line":311,"column":6},"end":{"line":313,"column":null}},"195":{"start":{"line":311,"column":24},"end":{"line":313,"column":7}},"196":{"start":{"line":312,"column":8},"end":{"line":312,"column":null}},"197":{"start":{"line":314,"column":6},"end":{"line":314,"column":null}},"198":{"start":{"line":315,"column":6},"end":{"line":315,"column":null}},"199":{"start":{"line":317,"column":6},"end":{"line":317,"column":null}},"200":{"start":{"line":318,"column":6},"end":{"line":318,"column":null}},"201":{"start":{"line":322,"column":8},"end":{"line":324,"column":null}},"202":{"start":{"line":323,"column":4},"end":{"line":323,"column":null}},"203":{"start":{"line":326,"column":8},"end":{"line":331,"column":null}},"204":{"start":{"line":327,"column":24},"end":{"line":327,"column":null}},"205":{"start":{"line":328,"column":4},"end":{"line":328,"column":null}},"206":{"start":{"line":328,"column":24},"end":{"line":328,"column":49}},"207":{"start":{"line":328,"column":49},"end":{"line":328,"column":56}},"208":{"start":{"line":329,"column":4},"end":{"line":329,"column":null}},"209":{"start":{"line":329,"column":36},"end":{"line":329,"column":null}},"210":{"start":{"line":330,"column":4},"end":{"line":330,"column":null}},"211":{"start":{"line":333,"column":8},"end":{"line":341,"column":null}},"212":{"start":{"line":334,"column":4},"end":{"line":340,"column":null}},"213":{"start":{"line":335,"column":19},"end":{"line":335,"column":null}},"214":{"start":{"line":336,"column":22},"end":{"line":336,"column":null}},"215":{"start":{"line":337,"column":6},"end":{"line":337,"column":null}},"216":{"start":{"line":338,"column":6},"end":{"line":338,"column":null}},"217":{"start":{"line":339,"column":6},"end":{"line":339,"column":null}},"218":{"start":{"line":344,"column":2},"end":{"line":350,"column":null}},"219":{"start":{"line":345,"column":4},"end":{"line":349,"column":null}},"220":{"start":{"line":346,"column":6},"end":{"line":346,"column":null}},"221":{"start":{"line":348,"column":6},"end":{"line":348,"column":null}},"222":{"start":{"line":348,"column":12},"end":{"line":348,"column":51}},"223":{"start":{"line":353,"column":2},"end":{"line":375,"column":null}},"224":{"start":{"line":354,"column":23},"end":{"line":354,"column":null}},"225":{"start":{"line":355,"column":4},"end":{"line":355,"column":null}},"226":{"start":{"line":355,"column":33},"end":{"line":355,"column":null}},"227":{"start":{"line":357,"column":4},"end":{"line":373,"column":null}},"228":{"start":{"line":358,"column":6},"end":{"line":358,"column":null}},"229":{"start":{"line":358,"column":28},"end":{"line":358,"column":null}},"230":{"start":{"line":359,"column":24},"end":{"line":359,"column":null}},"231":{"start":{"line":359,"column":46},"end":{"line":359,"column":63}},"232":{"start":{"line":360,"column":29},"end":{"line":360,"column":null}},"233":{"start":{"line":361,"column":6},"end":{"line":367,"column":null}},"234":{"start":{"line":362,"column":20},"end":{"line":362,"column":null}},"235":{"start":{"line":363,"column":8},"end":{"line":366,"column":null}},"236":{"start":{"line":364,"column":10},"end":{"line":364,"column":null}},"237":{"start":{"line":365,"column":10},"end":{"line":365,"column":null}},"238":{"start":{"line":369,"column":6},"end":{"line":371,"column":null}},"239":{"start":{"line":370,"column":8},"end":{"line":370,"column":null}},"240":{"start":{"line":372,"column":6},"end":{"line":372,"column":null}},"241":{"start":{"line":377,"column":8},"end":{"line":380,"column":null}},"242":{"start":{"line":378,"column":4},"end":{"line":378,"column":null}},"243":{"start":{"line":379,"column":4},"end":{"line":379,"column":null}},"244":{"start":{"line":382,"column":2},"end":{"line":399,"column":null}}},"fnMap":{"0":{"name":"updateMockFrontmatter","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":31}},"loc":{"start":{"line":13,"column":91},"end":{"line":65,"column":null}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":33},"end":{"line":19,"column":38}},"loc":{"start":{"line":19,"column":38},"end":{"line":19,"column":50}},"line":19},"2":{"name":"deleteMockFrontmatterProperty","decl":{"start":{"line":67,"column":9},"end":{"line":67,"column":39}},"loc":{"start":{"line":67,"column":74},"end":{"line":90,"column":null}},"line":67},"3":{"name":"saveTabOrder","decl":{"start":{"line":94,"column":9},"end":{"line":94,"column":22}},"loc":{"start":{"line":94,"column":35},"end":{"line":98,"column":null}},"line":94},"4":{"name":"(anonymous_4)","decl":{"start":{"line":96,"column":64},"end":{"line":96,"column":69}},"loc":{"start":{"line":96,"column":69},"end":{"line":96,"column":81}},"line":96},"5":{"name":"loadTabOrder","decl":{"start":{"line":100,"column":9},"end":{"line":100,"column":34}},"loc":{"start":{"line":100,"column":34},"end":{"line":107,"column":null}},"line":100},"6":{"name":"loadNoteContent","decl":{"start":{"line":109,"column":15},"end":{"line":109,"column":31}},"loc":{"start":{"line":109,"column":62},"end":{"line":113,"column":null}},"line":109},"7":{"name":"replaceTabWithEntry","decl":{"start":{"line":115,"column":15},"end":{"line":115,"column":null}},"loc":{"start":{"line":120,"column":2},"end":{"line":133,"column":null}},"line":120},"8":{"name":"(anonymous_8)","decl":{"start":{"line":121,"column":23},"end":{"line":121,"column":24}},"loc":{"start":{"line":121,"column":44},"end":{"line":126,"column":null}},"line":121},"9":{"name":"(anonymous_9)","decl":{"start":{"line":122,"column":12},"end":{"line":122,"column":13}},"loc":{"start":{"line":122,"column":22},"end":{"line":124,"column":5}},"line":122},"10":{"name":"(anonymous_10)","decl":{"start":{"line":122,"column":31},"end":{"line":122,"column":32}},"loc":{"start":{"line":123,"column":6},"end":{"line":123,"column":null}},"line":123},"11":{"name":"useNoteActions","decl":{"start":{"line":135,"column":16},"end":{"line":135,"column":null}},"loc":{"start":{"line":140,"column":2},"end":{"line":400,"column":null}},"line":140},"12":{"name":"(anonymous_12)","decl":{"start":{"line":147,"column":59},"end":{"line":147,"column":65}},"loc":{"start":{"line":147,"column":65},"end":{"line":147,"column":67}},"line":147},"13":{"name":"(anonymous_13)","decl":{"start":{"line":149,"column":39},"end":{"line":149,"column":46}},"loc":{"start":{"line":149,"column":68},"end":{"line":172,"column":5}},"line":149},"14":{"name":"(anonymous_14)","decl":{"start":{"line":151,"column":29},"end":{"line":151,"column":30}},"loc":{"start":{"line":151,"column":36},"end":{"line":151,"column":63}},"line":151},"15":{"name":"(anonymous_15)","decl":{"start":{"line":159,"column":14},"end":{"line":159,"column":15}},"loc":{"start":{"line":159,"column":24},"end":{"line":162,"column":7}},"line":159},"16":{"name":"(anonymous_16)","decl":{"start":{"line":160,"column":22},"end":{"line":160,"column":23}},"loc":{"start":{"line":160,"column":29},"end":{"line":160,"column":56}},"line":160},"17":{"name":"(anonymous_17)","decl":{"start":{"line":166,"column":14},"end":{"line":166,"column":15}},"loc":{"start":{"line":166,"column":24},"end":{"line":169,"column":7}},"line":166},"18":{"name":"(anonymous_18)","decl":{"start":{"line":167,"column":22},"end":{"line":167,"column":23}},"loc":{"start":{"line":167,"column":29},"end":{"line":167,"column":56}},"line":167},"19":{"name":"(anonymous_19)","decl":{"start":{"line":174,"column":37},"end":{"line":174,"column":38}},"loc":{"start":{"line":174,"column":55},"end":{"line":186,"column":5}},"line":174},"20":{"name":"(anonymous_20)","decl":{"start":{"line":175,"column":12},"end":{"line":175,"column":13}},"loc":{"start":{"line":175,"column":22},"end":{"line":185,"column":5}},"line":175},"21":{"name":"(anonymous_21)","decl":{"start":{"line":176,"column":31},"end":{"line":176,"column":32}},"loc":{"start":{"line":176,"column":38},"end":{"line":176,"column":59}},"line":176},"22":{"name":"(anonymous_22)","decl":{"start":{"line":178,"column":41},"end":{"line":178,"column":42}},"loc":{"start":{"line":178,"column":48},"end":{"line":178,"column":69}},"line":178},"23":{"name":"(anonymous_23)","decl":{"start":{"line":189,"column":38},"end":{"line":189,"column":39}},"loc":{"start":{"line":189,"column":56},"end":{"line":191,"column":5}},"line":189},"24":{"name":"(anonymous_24)","decl":{"start":{"line":193,"column":45},"end":{"line":193,"column":46}},"loc":{"start":{"line":193,"column":65},"end":{"line":214,"column":5}},"line":193},"25":{"name":"(anonymous_25)","decl":{"start":{"line":195,"column":24},"end":{"line":195,"column":25}},"loc":{"start":{"line":195,"column":39},"end":{"line":195,"column":null}},"line":195},"26":{"name":"(anonymous_26)","decl":{"start":{"line":198,"column":31},"end":{"line":198,"column":32}},"loc":{"start":{"line":198,"column":38},"end":{"line":207,"column":5}},"line":198},"27":{"name":"(anonymous_27)","decl":{"start":{"line":200,"column":25},"end":{"line":200,"column":26}},"loc":{"start":{"line":200,"column":32},"end":{"line":200,"column":63}},"line":200},"28":{"name":"(anonymous_28)","decl":{"start":{"line":216,"column":39},"end":{"line":216,"column":46}},"loc":{"start":{"line":216,"column":78},"end":{"line":251,"column":5}},"line":216},"29":{"name":"(anonymous_29)","decl":{"start":{"line":253,"column":39},"end":{"line":253,"column":46}},"loc":{"start":{"line":253,"column":67},"end":{"line":274,"column":5}},"line":253},"30":{"name":"(anonymous_30)","decl":{"start":{"line":276,"column":46},"end":{"line":276,"column":53}},"loc":{"start":{"line":276,"column":108},"end":{"line":300,"column":5}},"line":276},"31":{"name":"(anonymous_31)","decl":{"start":{"line":291,"column":14},"end":{"line":291,"column":15}},"loc":{"start":{"line":291,"column":24},"end":{"line":293,"column":7}},"line":291},"32":{"name":"(anonymous_32)","decl":{"start":{"line":291,"column":33},"end":{"line":291,"column":34}},"loc":{"start":{"line":292,"column":8},"end":{"line":292,"column":null}},"line":292},"33":{"name":"(anonymous_33)","decl":{"start":{"line":302,"column":43},"end":{"line":302,"column":50}},"loc":{"start":{"line":302,"column":80},"end":{"line":320,"column":5}},"line":302},"34":{"name":"(anonymous_34)","decl":{"start":{"line":311,"column":14},"end":{"line":311,"column":15}},"loc":{"start":{"line":311,"column":24},"end":{"line":313,"column":7}},"line":311},"35":{"name":"(anonymous_35)","decl":{"start":{"line":311,"column":33},"end":{"line":311,"column":34}},"loc":{"start":{"line":312,"column":8},"end":{"line":312,"column":null}},"line":312},"36":{"name":"(anonymous_36)","decl":{"start":{"line":322,"column":40},"end":{"line":322,"column":47}},"loc":{"start":{"line":322,"column":102},"end":{"line":324,"column":5}},"line":322},"37":{"name":"(anonymous_37)","decl":{"start":{"line":326,"column":45},"end":{"line":326,"column":52}},"loc":{"start":{"line":326,"column":74},"end":{"line":331,"column":5}},"line":326},"38":{"name":"(anonymous_38)","decl":{"start":{"line":333,"column":40},"end":{"line":333,"column":41}},"loc":{"start":{"line":333,"column":80},"end":{"line":341,"column":5}},"line":333},"39":{"name":"(anonymous_39)","decl":{"start":{"line":334,"column":12},"end":{"line":334,"column":13}},"loc":{"start":{"line":334,"column":22},"end":{"line":340,"column":5}},"line":334},"40":{"name":"(anonymous_40)","decl":{"start":{"line":344,"column":12},"end":{"line":344,"column":18}},"loc":{"start":{"line":344,"column":18},"end":{"line":350,"column":5}},"line":344},"41":{"name":"(anonymous_41)","decl":{"start":{"line":353,"column":12},"end":{"line":353,"column":18}},"loc":{"start":{"line":353,"column":18},"end":{"line":375,"column":5}},"line":353},"42":{"name":"(anonymous_42)","decl":{"start":{"line":357,"column":12},"end":{"line":357,"column":13}},"loc":{"start":{"line":357,"column":22},"end":{"line":373,"column":5}},"line":357},"43":{"name":"(anonymous_43)","decl":{"start":{"line":359,"column":41},"end":{"line":359,"column":46}},"loc":{"start":{"line":359,"column":46},"end":{"line":359,"column":63}},"line":359},"44":{"name":"(anonymous_44)","decl":{"start":{"line":377,"column":35},"end":{"line":377,"column":41}},"loc":{"start":{"line":377,"column":41},"end":{"line":380,"column":5}},"line":377}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":18},"end":{"line":14,"column":null}},"type":"binary-expr","locations":[{"start":{"line":14,"column":18},"end":{"line":14,"column":50}},{"start":{"line":14,"column":50},"end":{"line":14,"column":null}}],"line":14},"1":{"loc":{"start":{"line":15,"column":18},"end":{"line":15,"column":null}},"type":"cond-expr","locations":[{"start":{"line":15,"column":38},"end":{"line":15,"column":51}},{"start":{"line":15,"column":51},"end":{"line":15,"column":null}}],"line":15},"2":{"loc":{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":2},"end":{"line":26,"column":null}},{"start":{"line":20,"column":2},"end":{"line":26,"column":null}}],"line":18},"3":{"loc":{"start":{"line":20,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":26,"column":null}},{"start":{"line":22,"column":2},"end":{"line":26,"column":null}}],"line":20},"4":{"loc":{"start":{"line":21,"column":16},"end":{"line":21,"column":null}},"type":"cond-expr","locations":[{"start":{"line":21,"column":24},"end":{"line":21,"column":33}},{"start":{"line":21,"column":33},"end":{"line":21,"column":null}}],"line":21},"5":{"loc":{"start":{"line":22,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":26,"column":null}},{"start":{"line":24,"column":9},"end":{"line":26,"column":null}}],"line":22},"6":{"loc":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":28},"7":{"loc":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},{"start":{},"end":{}}],"line":33},"8":{"loc":{"start":{"line":39,"column":2},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":64,"column":null}},{"start":{"line":58,"column":9},"end":{"line":64,"column":null}}],"line":39},"9":{"loc":{"start":{"line":44,"column":6},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":6},"end":{"line":53,"column":null}},{"start":{},"end":{}}],"line":44},"10":{"loc":{"start":{"line":46,"column":15},"end":{"line":46,"column":64}},"type":"binary-expr","locations":[{"start":{"line":46,"column":15},"end":{"line":46,"column":35}},{"start":{"line":46,"column":35},"end":{"line":46,"column":64}}],"line":46},"11":{"loc":{"start":{"line":47,"column":8},"end":{"line":51,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":8},"end":{"line":51,"column":null}},{"start":{"line":49,"column":15},"end":{"line":51,"column":null}}],"line":47},"12":{"loc":{"start":{"line":59,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":4},"end":{"line":63,"column":null}},{"start":{"line":61,"column":11},"end":{"line":63,"column":null}}],"line":59},"13":{"loc":{"start":{"line":68,"column":18},"end":{"line":68,"column":null}},"type":"binary-expr","locations":[{"start":{"line":68,"column":18},"end":{"line":68,"column":50}},{"start":{"line":68,"column":50},"end":{"line":68,"column":null}}],"line":68},"14":{"loc":{"start":{"line":69,"column":2},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":69},"15":{"loc":{"start":{"line":71,"column":2},"end":{"line":71,"column":null}},"type":"if","locations":[{"start":{"line":71,"column":2},"end":{"line":71,"column":null}},{"start":{},"end":{}}],"line":71},"16":{"loc":{"start":{"line":81,"column":4},"end":{"line":85,"column":null}},"type":"if","locations":[{"start":{"line":81,"column":4},"end":{"line":85,"column":null}},{"start":{},"end":{}}],"line":81},"17":{"loc":{"start":{"line":83,"column":13},"end":{"line":83,"column":62}},"type":"binary-expr","locations":[{"start":{"line":83,"column":13},"end":{"line":83,"column":33}},{"start":{"line":83,"column":33},"end":{"line":83,"column":62}}],"line":83},"18":{"loc":{"start":{"line":103,"column":11},"end":{"line":103,"column":null}},"type":"cond-expr","locations":[{"start":{"line":103,"column":20},"end":{"line":103,"column":41}},{"start":{"line":103,"column":41},"end":{"line":103,"column":null}}],"line":103},"19":{"loc":{"start":{"line":110,"column":2},"end":{"line":112,"column":null}},"type":"cond-expr","locations":[{"start":{"line":110,"column":17},"end":{"line":111,"column":null}},{"start":{"line":111,"column":49},"end":{"line":112,"column":null}}],"line":110},"20":{"loc":{"start":{"line":123,"column":6},"end":{"line":123,"column":null}},"type":"cond-expr","locations":[{"start":{"line":123,"column":37},"end":{"line":123,"column":58}},{"start":{"line":123,"column":58},"end":{"line":123,"column":null}}],"line":123},"21":{"loc":{"start":{"line":151,"column":4},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":151,"column":4},"end":{"line":154,"column":null}},{"start":{},"end":{}}],"line":151},"22":{"loc":{"start":{"line":160,"column":8},"end":{"line":160,"column":null}},"type":"if","locations":[{"start":{"line":160,"column":8},"end":{"line":160,"column":null}},{"start":{},"end":{}}],"line":160},"23":{"loc":{"start":{"line":167,"column":8},"end":{"line":167,"column":null}},"type":"if","locations":[{"start":{"line":167,"column":8},"end":{"line":167,"column":null}},{"start":{},"end":{}}],"line":167},"24":{"loc":{"start":{"line":177,"column":6},"end":{"line":183,"column":null}},"type":"if","locations":[{"start":{"line":177,"column":6},"end":{"line":183,"column":null}},{"start":{"line":181,"column":6},"end":{"line":183,"column":null}}],"line":177},"25":{"loc":{"start":{"line":177,"column":10},"end":{"line":177,"column":64}},"type":"binary-expr","locations":[{"start":{"line":177,"column":10},"end":{"line":177,"column":47}},{"start":{"line":177,"column":47},"end":{"line":177,"column":64}}],"line":177},"26":{"loc":{"start":{"line":181,"column":6},"end":{"line":183,"column":null}},"type":"if","locations":[{"start":{"line":181,"column":6},"end":{"line":183,"column":null}},{"start":{},"end":{}}],"line":181},"27":{"loc":{"start":{"line":196,"column":38},"end":{"line":196,"column":71}},"type":"binary-expr","locations":[{"start":{"line":196,"column":38},"end":{"line":196,"column":65}},{"start":{"line":196,"column":65},"end":{"line":196,"column":71}}],"line":196},"28":{"loc":{"start":{"line":199,"column":6},"end":{"line":199,"column":null}},"type":"if","locations":[{"start":{"line":199,"column":6},"end":{"line":199,"column":null}},{"start":{},"end":{}}],"line":199},"29":{"loc":{"start":{"line":200,"column":6},"end":{"line":200,"column":null}},"type":"if","locations":[{"start":{"line":200,"column":6},"end":{"line":200,"column":null}},{"start":{},"end":{}}],"line":200},"30":{"loc":{"start":{"line":202,"column":6},"end":{"line":202,"column":null}},"type":"if","locations":[{"start":{"line":202,"column":6},"end":{"line":202,"column":null}},{"start":{},"end":{}}],"line":202},"31":{"loc":{"start":{"line":204,"column":6},"end":{"line":204,"column":null}},"type":"if","locations":[{"start":{"line":204,"column":6},"end":{"line":204,"column":null}},{"start":{},"end":{}}],"line":204},"32":{"loc":{"start":{"line":205,"column":6},"end":{"line":205,"column":null}},"type":"if","locations":[{"start":{"line":205,"column":6},"end":{"line":205,"column":null}},{"start":{},"end":{}}],"line":205},"33":{"loc":{"start":{"line":209,"column":4},"end":{"line":213,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":4},"end":{"line":213,"column":null}},{"start":{"line":211,"column":11},"end":{"line":213,"column":null}}],"line":209},"34":{"loc":{"start":{"line":223,"column":19},"end":{"line":223,"column":null}},"type":"binary-expr","locations":[{"start":{"line":223,"column":19},"end":{"line":223,"column":41}},{"start":{"line":223,"column":41},"end":{"line":223,"column":null}}],"line":223},"35":{"loc":{"start":{"line":232,"column":14},"end":{"line":232,"column":null}},"type":"cond-expr","locations":[{"start":{"line":232,"column":40},"end":{"line":232,"column":47}},{"start":{"line":232,"column":47},"end":{"line":232,"column":null}}],"line":232},"36":{"loc":{"start":{"line":240,"column":10},"end":{"line":240,"column":null}},"type":"cond-expr","locations":[{"start":{"line":240,"column":28},"end":{"line":240,"column":61}},{"start":{"line":240,"column":61},"end":{"line":240,"column":null}}],"line":240},"37":{"loc":{"start":{"line":245,"column":4},"end":{"line":247,"column":null}},"type":"if","locations":[{"start":{"line":245,"column":4},"end":{"line":247,"column":null}},{"start":{},"end":{}}],"line":245},"38":{"loc":{"start":{"line":268,"column":4},"end":{"line":270,"column":null}},"type":"if","locations":[{"start":{"line":268,"column":4},"end":{"line":270,"column":null}},{"start":{},"end":{}}],"line":268},"39":{"loc":{"start":{"line":279,"column":6},"end":{"line":290,"column":null}},"type":"if","locations":[{"start":{"line":279,"column":6},"end":{"line":290,"column":null}},{"start":{"line":287,"column":13},"end":{"line":290,"column":null}}],"line":279},"40":{"loc":{"start":{"line":281,"column":8},"end":{"line":285,"column":null}},"type":"if","locations":[{"start":{"line":281,"column":8},"end":{"line":285,"column":null}},{"start":{"line":281,"column":46},"end":{"line":285,"column":null}}],"line":281},"41":{"loc":{"start":{"line":281,"column":46},"end":{"line":285,"column":null}},"type":"if","locations":[{"start":{"line":281,"column":46},"end":{"line":285,"column":null}},{"start":{"line":282,"column":57},"end":{"line":285,"column":null}}],"line":281},"42":{"loc":{"start":{"line":282,"column":57},"end":{"line":285,"column":null}},"type":"if","locations":[{"start":{"line":282,"column":57},"end":{"line":285,"column":null}},{"start":{"line":283,"column":56},"end":{"line":285,"column":null}}],"line":282},"43":{"loc":{"start":{"line":283,"column":56},"end":{"line":285,"column":null}},"type":"if","locations":[{"start":{"line":283,"column":56},"end":{"line":285,"column":null}},{"start":{"line":285,"column":13},"end":{"line":285,"column":null}}],"line":283},"44":{"loc":{"start":{"line":292,"column":8},"end":{"line":292,"column":null}},"type":"cond-expr","locations":[{"start":{"line":292,"column":32},"end":{"line":292,"column":64}},{"start":{"line":292,"column":64},"end":{"line":292,"column":null}}],"line":292},"45":{"loc":{"start":{"line":305,"column":6},"end":{"line":310,"column":null}},"type":"if","locations":[{"start":{"line":305,"column":6},"end":{"line":310,"column":null}},{"start":{"line":307,"column":13},"end":{"line":310,"column":null}}],"line":305},"46":{"loc":{"start":{"line":312,"column":8},"end":{"line":312,"column":null}},"type":"cond-expr","locations":[{"start":{"line":312,"column":32},"end":{"line":312,"column":64}},{"start":{"line":312,"column":64},"end":{"line":312,"column":null}}],"line":312},"47":{"loc":{"start":{"line":328,"column":4},"end":{"line":328,"column":null}},"type":"if","locations":[{"start":{"line":328,"column":4},"end":{"line":328,"column":null}},{"start":{},"end":{}}],"line":328},"48":{"loc":{"start":{"line":329,"column":4},"end":{"line":329,"column":null}},"type":"if","locations":[{"start":{"line":329,"column":4},"end":{"line":329,"column":null}},{"start":{},"end":{}}],"line":329},"49":{"loc":{"start":{"line":345,"column":4},"end":{"line":349,"column":null}},"type":"if","locations":[{"start":{"line":345,"column":4},"end":{"line":349,"column":null}},{"start":{"line":347,"column":11},"end":{"line":349,"column":null}}],"line":345},"50":{"loc":{"start":{"line":355,"column":4},"end":{"line":355,"column":null}},"type":"if","locations":[{"start":{"line":355,"column":4},"end":{"line":355,"column":null}},{"start":{},"end":{}}],"line":355},"51":{"loc":{"start":{"line":358,"column":6},"end":{"line":358,"column":null}},"type":"if","locations":[{"start":{"line":358,"column":6},"end":{"line":358,"column":null}},{"start":{},"end":{}}],"line":358},"52":{"loc":{"start":{"line":363,"column":8},"end":{"line":366,"column":null}},"type":"if","locations":[{"start":{"line":363,"column":8},"end":{"line":366,"column":null}},{"start":{},"end":{}}],"line":363}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":1,"59":0,"60":0,"61":0,"62":7,"63":7,"64":7,"65":7,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":22,"77":22,"78":22,"79":22,"80":22,"81":22,"82":22,"83":22,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":22,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":22,"116":22,"117":0,"118":22,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":22,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":22,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":22,"166":0,"167":0,"168":0,"169":0,"170":0,"171":0,"172":0,"173":0,"174":0,"175":0,"176":0,"177":0,"178":0,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":22,"189":0,"190":0,"191":0,"192":0,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":22,"202":0,"203":22,"204":0,"205":0,"206":0,"207":0,"208":0,"209":0,"210":0,"211":22,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":22,"219":7,"220":0,"221":7,"222":7,"223":22,"224":7,"225":7,"226":7,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":22,"242":0,"243":0,"244":22},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":7,"6":0,"7":0,"8":0,"9":0,"10":0,"11":22,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":7,"41":7,"42":0,"43":0,"44":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,7],"50":[7,0],"51":[0,0],"52":[0,0]},"meta":{"lastBranch":53,"lastFunction":45,"lastStatement":245,"seen":{"f:13:9:13:31":0,"s:14:18:14:Infinity":0,"b:14:18:14:50:14:50:14:Infinity":0,"s:15:18:15:Infinity":1,"b:15:38:15:51:15:51:15:Infinity":1,"b:18:2:26:Infinity:20:2:26:Infinity":2,"s:18:2:26:Infinity":2,"s:19:4:19:Infinity":3,"f:19:33:19:38":1,"s:19:38:19:50":4,"b:20:2:26:Infinity:22:2:26:Infinity":3,"s:20:2:26:Infinity":5,"s:21:4:21:Infinity":6,"b:21:24:21:33:21:33:21:Infinity":4,"b:22:2:26:Infinity:24:9:26:Infinity":5,"s:22:2:26:Infinity":7,"s:23:4:23:Infinity":8,"s:25:4:25:Infinity":9,"b:28:2:30:Infinity:undefined:undefined:undefined:undefined":6,"s:28:2:30:Infinity":10,"s:29:4:29:Infinity":11,"s:32:16:32:Infinity":12,"b:33:2:33:Infinity:undefined:undefined:undefined:undefined":7,"s:33:2:33:Infinity":13,"s:33:20:33:Infinity":14,"s:35:13:35:Infinity":15,"s:36:15:36:Infinity":16,"s:37:21:37:Infinity":17,"b:39:2:64:Infinity:58:9:64:Infinity":8,"s:39:2:64:Infinity":18,"s:40:18:40:Infinity":19,"s:41:31:41:Infinity":20,"s:42:12:42:Infinity":21,"s:43:4:56:Infinity":22,"b:44:6:53:Infinity:undefined:undefined:undefined:undefined":9,"s:44:6:53:Infinity":23,"s:45:8:45:Infinity":24,"s:46:8:46:Infinity":25,"b:46:15:46:35:46:35:46:64":10,"s:46:64:46:Infinity":26,"b:47:8:51:Infinity:49:15:51:Infinity":11,"s:47:8:51:Infinity":27,"s:48:10:48:Infinity":28,"s:50:10:50:Infinity":29,"s:52:8:52:Infinity":30,"s:54:6:54:Infinity":31,"s:55:6:55:Infinity":32,"s:57:4:57:Infinity":33,"b:59:4:63:Infinity:61:11:63:Infinity":12,"s:59:4:63:Infinity":34,"s:60:6:60:Infinity":35,"s:62:6:62:Infinity":36,"f:67:9:67:39":2,"s:68:18:68:Infinity":37,"b:68:18:68:50:68:50:68:Infinity":13,"b:69:2:69:Infinity:undefined:undefined:undefined:undefined":14,"s:69:2:69:Infinity":38,"s:69:36:69:Infinity":39,"s:70:16:70:Infinity":40,"b:71:2:71:Infinity:undefined:undefined:undefined:undefined":15,"s:71:2:71:Infinity":41,"s:71:20:71:Infinity":42,"s:73:13:73:Infinity":43,"s:74:15:74:Infinity":44,"s:75:21:75:Infinity":45,"s:77:16:77:Infinity":46,"s:78:29:78:Infinity":47,"s:79:10:79:Infinity":48,"s:80:2:88:Infinity":49,"b:81:4:85:Infinity:undefined:undefined:undefined:undefined":16,"s:81:4:85:Infinity":50,"s:82:6:82:Infinity":51,"s:83:6:83:Infinity":52,"b:83:13:83:33:83:33:83:62":17,"s:83:62:83:Infinity":53,"s:84:6:84:Infinity":54,"s:86:4:86:Infinity":55,"s:87:4:87:Infinity":56,"s:89:2:89:Infinity":57,"s:92:22:92:Infinity":58,"f:94:9:94:22":3,"s:95:2:97:Infinity":59,"s:96:4:96:Infinity":60,"f:96:64:96:69":4,"s:96:69:96:81":61,"f:100:9:100:34":5,"s:101:2:106:Infinity":62,"s:102:19:102:Infinity":63,"s:103:4:103:Infinity":64,"b:103:20:103:41:103:41:103:Infinity":18,"s:105:4:105:Infinity":65,"f:109:15:109:31":6,"s:110:2:112:Infinity":66,"b:110:17:111:Infinity:111:49:112:Infinity":19,"f:115:15:115:Infinity":7,"s:121:23:126:Infinity":67,"f:121:23:121:24":8,"s:122:4:124:Infinity":68,"f:122:12:122:13":9,"s:122:22:124:5":69,"f:122:31:122:32":10,"s:123:6:123:Infinity":70,"b:123:37:123:58:123:58:123:Infinity":20,"s:125:4:125:Infinity":71,"s:127:2:132:Infinity":72,"s:128:4:128:Infinity":73,"s:130:4:130:Infinity":74,"s:131:4:131:Infinity":75,"f:135:16:135:Infinity":11,"s:141:22:141:Infinity":76,"s:142:40:142:Infinity":77,"s:143:8:143:Infinity":78,"s:144:2:144:Infinity":79,"s:145:8:145:Infinity":80,"s:146:2:146:Infinity":81,"s:147:8:147:Infinity":82,"f:147:59:147:65":12,"s:149:8:172:Infinity":83,"f:149:39:149:46":13,"b:151:4:154:Infinity:undefined:undefined:undefined:undefined":21,"s:151:4:154:Infinity":84,"f:151:29:151:30":14,"s:151:36:151:63":85,"s:152:6:152:Infinity":86,"s:153:6:153:Infinity":87,"s:157:4:171:Infinity":88,"s:158:22:158:Infinity":89,"s:159:6:162:Infinity":90,"f:159:14:159:15":15,"b:160:8:160:Infinity:undefined:undefined:undefined:undefined":22,"s:160:8:160:Infinity":91,"f:160:22:160:23":16,"s:160:29:160:56":92,"s:160:59:160:Infinity":93,"s:161:8:161:Infinity":94,"s:163:6:163:Infinity":95,"s:165:6:165:Infinity":96,"s:166:6:169:Infinity":97,"f:166:14:166:15":17,"b:167:8:167:Infinity:undefined:undefined:undefined:undefined":23,"s:167:8:167:Infinity":98,"f:167:22:167:23":18,"s:167:29:167:56":99,"s:167:59:167:Infinity":100,"s:168:8:168:Infinity":101,"s:170:6:170:Infinity":102,"s:174:8:186:Infinity":103,"f:174:37:174:38":19,"s:175:4:185:Infinity":104,"f:175:12:175:13":20,"s:176:19:176:Infinity":105,"f:176:31:176:32":21,"s:176:38:176:59":106,"b:177:6:183:Infinity:181:6:183:Infinity":24,"s:177:6:183:Infinity":107,"b:177:10:177:47:177:47:177:64":25,"s:178:26:178:Infinity":108,"f:178:41:178:42":22,"s:178:48:178:69":109,"s:179:23:179:Infinity":110,"s:180:8:180:Infinity":111,"b:181:6:183:Infinity:undefined:undefined:undefined:undefined":26,"s:181:6:183:Infinity":112,"s:182:8:182:Infinity":113,"s:184:6:184:Infinity":114,"s:187:2:187:Infinity":115,"s:189:8:191:Infinity":116,"f:189:38:189:39":23,"s:190:4:190:Infinity":117,"s:193:8:214:Infinity":118,"f:193:45:193:46":24,"s:194:24:194:Infinity":119,"s:195:24:195:Infinity":120,"f:195:24:195:25":25,"s:195:39:195:Infinity":121,"s:196:26:196:Infinity":122,"b:196:38:196:65:196:65:196:71":27,"s:198:18:207:Infinity":123,"f:198:31:198:32":26,"b:199:6:199:Infinity:undefined:undefined:undefined:undefined":28,"s:199:6:199:Infinity":124,"s:199:49:199:Infinity":125,"b:200:6:200:Infinity:undefined:undefined:undefined:undefined":29,"s:200:6:200:Infinity":126,"f:200:25:200:26":27,"s:200:32:200:63":127,"s:200:66:200:Infinity":128,"s:201:23:201:Infinity":129,"b:202:6:202:Infinity:undefined:undefined:undefined:undefined":30,"s:202:6:202:Infinity":130,"s:202:50:202:Infinity":131,"s:203:23:203:Infinity":132,"b:204:6:204:Infinity:undefined:undefined:undefined:undefined":31,"s:204:6:204:Infinity":133,"s:204:67:204:Infinity":134,"b:205:6:205:Infinity:undefined:undefined:undefined:undefined":32,"s:205:6:205:Infinity":135,"s:205:51:205:Infinity":136,"s:206:6:206:Infinity":137,"b:209:4:213:Infinity:211:11:213:Infinity":33,"s:209:4:213:Infinity":138,"s:210:6:210:Infinity":139,"s:212:6:212:Infinity":140,"s:216:8:251:Infinity":141,"f:216:39:216:46":28,"s:217:49:221:Infinity":142,"s:223:19:223:Infinity":143,"b:223:19:223:41:223:41:223:Infinity":34,"s:224:17:224:Infinity":144,"s:225:17:225:Infinity":145,"s:226:16:226:Infinity":146,"s:228:26:228:Infinity":147,"s:229:33:236:Infinity":148,"b:232:40:232:47:232:47:232:Infinity":35,"s:238:24:242:Infinity":149,"b:240:28:240:61:240:61:240:Infinity":36,"s:243:20:243:Infinity":150,"b:245:4:247:Infinity:undefined:undefined:undefined:undefined":37,"s:245:4:247:Infinity":151,"s:246:6:246:Infinity":152,"s:249:4:249:Infinity":153,"s:250:4:250:Infinity":154,"s:253:8:274:Infinity":155,"f:253:39:253:46":29,"s:254:17:254:Infinity":156,"s:255:17:255:Infinity":157,"s:256:16:256:Infinity":158,"s:258:33:264:Infinity":159,"s:266:20:266:Infinity":160,"b:268:4:270:Infinity:undefined:undefined:undefined:undefined":38,"s:268:4:270:Infinity":161,"s:269:6:269:Infinity":162,"s:272:4:272:Infinity":163,"s:273:4:273:Infinity":164,"s:276:8:300:Infinity":165,"f:276:46:276:53":30,"s:277:4:299:Infinity":166,"b:279:6:290:Infinity:287:13:290:Infinity":39,"s:279:6:290:Infinity":167,"s:280:33:280:Infinity":168,"b:281:8:285:Infinity:281:46:285:Infinity":40,"s:281:8:285:Infinity":169,"s:281:34:281:Infinity":170,"b:281:46:285:Infinity:282:57:285:Infinity":41,"s:281:46:285:Infinity":171,"s:282:45:282:Infinity":172,"b:282:57:285:Infinity:283:56:285:Infinity":42,"s:282:57:285:Infinity":173,"s:283:44:283:Infinity":174,"b:283:56:285:Infinity:285:13:285:Infinity":43,"s:283:56:285:Infinity":175,"s:284:33:284:Infinity":176,"s:285:13:285:Infinity":177,"s:286:8:286:Infinity":178,"s:288:8:288:Infinity":179,"s:289:8:289:Infinity":180,"s:291:6:293:Infinity":181,"f:291:14:291:15":31,"s:291:24:293:7":182,"f:291:33:291:34":32,"s:292:8:292:Infinity":183,"b:292:32:292:64:292:64:292:Infinity":44,"s:294:6:294:Infinity":184,"s:295:6:295:Infinity":185,"s:297:6:297:Infinity":186,"s:298:6:298:Infinity":187,"s:302:8:320:Infinity":188,"f:302:43:302:50":33,"s:303:4:319:Infinity":189,"b:305:6:310:Infinity:307:13:310:Infinity":45,"s:305:6:310:Infinity":190,"s:306:8:306:Infinity":191,"s:308:8:308:Infinity":192,"s:309:8:309:Infinity":193,"s:311:6:313:Infinity":194,"f:311:14:311:15":34,"s:311:24:313:7":195,"f:311:33:311:34":35,"s:312:8:312:Infinity":196,"b:312:32:312:64:312:64:312:Infinity":46,"s:314:6:314:Infinity":197,"s:315:6:315:Infinity":198,"s:317:6:317:Infinity":199,"s:318:6:318:Infinity":200,"s:322:8:324:Infinity":201,"f:322:40:322:47":36,"s:323:4:323:Infinity":202,"s:326:8:331:Infinity":203,"f:326:45:326:52":37,"s:327:24:327:Infinity":204,"b:328:4:328:Infinity:undefined:undefined:undefined:undefined":47,"s:328:4:328:Infinity":205,"s:328:24:328:49":206,"s:328:49:328:56":207,"b:329:4:329:Infinity:undefined:undefined:undefined:undefined":48,"s:329:4:329:Infinity":208,"s:329:36:329:Infinity":209,"s:330:4:330:Infinity":210,"s:333:8:341:Infinity":211,"f:333:40:333:41":38,"s:334:4:340:Infinity":212,"f:334:12:334:13":39,"s:335:19:335:Infinity":213,"s:336:22:336:Infinity":214,"s:337:6:337:Infinity":215,"s:338:6:338:Infinity":216,"s:339:6:339:Infinity":217,"s:344:2:350:Infinity":218,"f:344:12:344:18":40,"b:345:4:349:Infinity:347:11:349:Infinity":49,"s:345:4:349:Infinity":219,"s:346:6:346:Infinity":220,"s:348:6:348:Infinity":221,"s:348:12:348:51":222,"s:353:2:375:Infinity":223,"f:353:12:353:18":41,"s:354:23:354:Infinity":224,"b:355:4:355:Infinity:undefined:undefined:undefined:undefined":50,"s:355:4:355:Infinity":225,"s:355:33:355:Infinity":226,"s:357:4:373:Infinity":227,"f:357:12:357:13":42,"b:358:6:358:Infinity:undefined:undefined:undefined:undefined":51,"s:358:6:358:Infinity":228,"s:358:28:358:Infinity":229,"s:359:24:359:Infinity":230,"f:359:41:359:46":43,"s:359:46:359:63":231,"s:360:29:360:Infinity":232,"s:361:6:367:Infinity":233,"s:362:20:362:Infinity":234,"b:363:8:366:Infinity:undefined:undefined:undefined:undefined":52,"s:363:8:366:Infinity":235,"s:364:10:364:Infinity":236,"s:365:10:365:Infinity":237,"s:369:6:371:Infinity":238,"s:370:8:370:Infinity":239,"s:372:6:372:Infinity":240,"s:377:8:380:Infinity":241,"f:377:35:377:41":44,"s:378:4:378:Infinity":242,"s:379:4:379:Infinity":243,"s:382:2:399:Infinity":244}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useSectionVisibility.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useSectionVisibility.ts","statementMap":{"0":{"start":{"line":3,"column":20},"end":{"line":3,"column":null}},"1":{"start":{"line":6,"column":2},"end":{"line":14,"column":null}},"2":{"start":{"line":7,"column":16},"end":{"line":7,"column":null}},"3":{"start":{"line":8,"column":4},"end":{"line":11,"column":null}},"4":{"start":{"line":9,"column":18},"end":{"line":9,"column":null}},"5":{"start":{"line":10,"column":6},"end":{"line":10,"column":null}},"6":{"start":{"line":10,"column":30},"end":{"line":10,"column":null}},"7":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"8":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"9":{"start":{"line":23,"column":42},"end":{"line":23,"column":null}},"10":{"start":{"line":25,"column":8},"end":{"line":36,"column":null}},"11":{"start":{"line":26,"column":4},"end":{"line":35,"column":null}},"12":{"start":{"line":27,"column":19},"end":{"line":27,"column":null}},"13":{"start":{"line":28,"column":6},"end":{"line":32,"column":null}},"14":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"15":{"start":{"line":31,"column":8},"end":{"line":31,"column":null}},"16":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"17":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"18":{"start":{"line":38,"column":8},"end":{"line":41,"column":null}},"19":{"start":{"line":39,"column":22},"end":{"line":39,"column":null}},"20":{"start":{"line":43,"column":2},"end":{"line":43,"column":null}}},"fnMap":{"0":{"name":"loadHiddenSections","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":43}},"loc":{"start":{"line":5,"column":43},"end":{"line":16,"column":null}},"line":5},"1":{"name":"saveHiddenSections","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":28}},"loc":{"start":{"line":18,"column":49},"end":{"line":20,"column":null}},"line":18},"2":{"name":"useSectionVisibility","decl":{"start":{"line":22,"column":16},"end":{"line":22,"column":39}},"loc":{"start":{"line":22,"column":39},"end":{"line":44,"column":null}},"line":22},"3":{"name":"(anonymous_3)","decl":{"start":{"line":25,"column":36},"end":{"line":25,"column":37}},"loc":{"start":{"line":25,"column":54},"end":{"line":36,"column":5}},"line":25},"4":{"name":"(anonymous_4)","decl":{"start":{"line":26,"column":22},"end":{"line":26,"column":23}},"loc":{"start":{"line":26,"column":32},"end":{"line":35,"column":5}},"line":26},"5":{"name":"(anonymous_5)","decl":{"start":{"line":39,"column":4},"end":{"line":39,"column":5}},"loc":{"start":{"line":39,"column":22},"end":{"line":39,"column":null}},"line":39}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":4},"end":{"line":11,"column":null}},"type":"if","locations":[{"start":{"line":8,"column":4},"end":{"line":11,"column":null}},{"start":{},"end":{}}],"line":8},"1":{"loc":{"start":{"line":10,"column":6},"end":{"line":10,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":6},"end":{"line":10,"column":null}},{"start":{},"end":{}}],"line":10},"2":{"loc":{"start":{"line":28,"column":6},"end":{"line":32,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":6},"end":{"line":32,"column":null}},{"start":{"line":30,"column":13},"end":{"line":32,"column":null}}],"line":28}},"s":{"0":2,"1":37,"2":37,"3":37,"4":2,"5":2,"6":2,"7":35,"8":4,"9":74,"10":74,"11":4,"12":4,"13":4,"14":1,"15":3,"16":4,"17":4,"18":74,"19":592,"20":74},"f":{"0":37,"1":4,"2":74,"3":4,"4":4,"5":592},"b":{"0":[2,35],"1":[2,0],"2":[1,3]},"meta":{"lastBranch":3,"lastFunction":6,"lastStatement":21,"seen":{"s:3:20:3:Infinity":0,"f:5:9:5:43":0,"s:6:2:14:Infinity":1,"s:7:16:7:Infinity":2,"b:8:4:11:Infinity:undefined:undefined:undefined:undefined":0,"s:8:4:11:Infinity":3,"s:9:18:9:Infinity":4,"b:10:6:10:Infinity:undefined:undefined:undefined:undefined":1,"s:10:6:10:Infinity":5,"s:10:30:10:Infinity":6,"s:15:2:15:Infinity":7,"f:18:9:18:28":1,"s:19:2:19:Infinity":8,"f:22:16:22:39":2,"s:23:42:23:Infinity":9,"s:25:8:36:Infinity":10,"f:25:36:25:37":3,"s:26:4:35:Infinity":11,"f:26:22:26:23":4,"s:27:19:27:Infinity":12,"b:28:6:32:Infinity:30:13:32:Infinity":2,"s:28:6:32:Infinity":13,"s:29:8:29:Infinity":14,"s:31:8:31:Infinity":15,"s:33:6:33:Infinity":16,"s:34:6:34:Infinity":17,"s:38:8:41:Infinity":18,"f:39:4:39:5":5,"s:39:22:39:Infinity":19,"s:43:2:43:Infinity":20}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useTheme.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useTheme.ts","statementMap":{"0":{"start":{"line":11,"column":41},"end":{"line":11,"column":null}},"1":{"start":{"line":13,"column":2},"end":{"line":32,"column":null}},"2":{"start":{"line":14,"column":19},"end":{"line":14,"column":null}},"3":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"4":{"start":{"line":16,"column":47},"end":{"line":16,"column":null}},"5":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"6":{"start":{"line":17,"column":30},"end":{"line":17,"column":null}},"7":{"start":{"line":19,"column":4},"end":{"line":31,"column":null}},"8":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":4},"end":{"line":31,"column":null}},"10":{"start":{"line":24,"column":25},"end":{"line":26,"column":null}},"11":{"start":{"line":27,"column":22},"end":{"line":27,"column":null}},"12":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"13":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"14":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"15":{"start":{"line":38,"column":2},"end":{"line":38,"column":null}},"16":{"start":{"line":42,"column":31},"end":{"line":48,"column":null}},"17":{"start":{"line":43,"column":17},"end":{"line":43,"column":null}},"18":{"start":{"line":44,"column":16},"end":{"line":46,"column":null}},"19":{"start":{"line":45,"column":23},"end":{"line":45,"column":36}},"20":{"start":{"line":47,"column":4},"end":{"line":47,"column":null}},"21":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}}},"fnMap":{"0":{"name":"flattenTheme","decl":{"start":{"line":7,"column":9},"end":{"line":7,"column":null}},"loc":{"start":{"line":10,"column":26},"end":{"line":35,"column":null}},"line":10},"1":{"name":"camelToKebab","decl":{"start":{"line":37,"column":9},"end":{"line":37,"column":22}},"loc":{"start":{"line":37,"column":43},"end":{"line":39,"column":null}},"line":37},"2":{"name":"useEditorTheme","decl":{"start":{"line":41,"column":16},"end":{"line":41,"column":33}},"loc":{"start":{"line":41,"column":33},"end":{"line":51,"column":null}},"line":41},"3":{"name":"(anonymous_3)","decl":{"start":{"line":42,"column":43},"end":{"line":42,"column":49}},"loc":{"start":{"line":42,"column":49},"end":{"line":48,"column":5}},"line":42},"4":{"name":"(anonymous_4)","decl":{"start":{"line":45,"column":11},"end":{"line":45,"column":12}},"loc":{"start":{"line":45,"column":23},"end":{"line":45,"column":36}},"line":45}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"type":"default-arg","locations":[{"start":{"line":9,"column":11},"end":{"line":9,"column":null}}],"line":9},"1":{"loc":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},{"start":{},"end":{}}],"line":16},"2":{"loc":{"start":{"line":16,"column":8},"end":{"line":16,"column":47}},"type":"binary-expr","locations":[{"start":{"line":16,"column":8},"end":{"line":16,"column":26}},{"start":{"line":16,"column":26},"end":{"line":16,"column":47}}],"line":16},"3":{"loc":{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":17,"column":null}},{"start":{},"end":{}}],"line":17},"4":{"loc":{"start":{"line":19,"column":4},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":4},"end":{"line":31,"column":null}},{"start":{"line":21,"column":4},"end":{"line":31,"column":null}}],"line":19},"5":{"loc":{"start":{"line":21,"column":4},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":31,"column":null}},{"start":{"line":29,"column":11},"end":{"line":31,"column":null}}],"line":21},"6":{"loc":{"start":{"line":24,"column":25},"end":{"line":26,"column":null}},"type":"binary-expr","locations":[{"start":{"line":24,"column":25},"end":{"line":24,"column":null}},{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},{"start":{"line":26,"column":8},"end":{"line":26,"column":null}}],"line":24},"7":{"loc":{"start":{"line":28,"column":23},"end":{"line":28,"column":null}},"type":"cond-expr","locations":[{"start":{"line":28,"column":33},"end":{"line":28,"column":48}},{"start":{"line":28,"column":48},"end":{"line":28,"column":null}}],"line":28}},"s":{"0":168,"1":168,"2":936,"3":936,"4":0,"5":936,"6":8,"7":928,"8":160,"9":768,"10":456,"11":456,"12":456,"13":312,"14":168,"15":936,"16":8,"17":8,"18":8,"19":768,"20":8,"21":8},"f":{"0":168,"1":936,"2":8,"3":8,"4":768},"b":{"0":[168],"1":[0,936],"2":[936,936],"3":[8,928],"4":[160,768],"5":[456,312],"6":[456,368,368],"7":[368,88]},"meta":{"lastBranch":8,"lastFunction":5,"lastStatement":22,"seen":{"f:7:9:7:Infinity":0,"b:9:11:9:Infinity":0,"s:11:41:11:Infinity":0,"s:13:2:32:Infinity":1,"s:14:19:14:Infinity":2,"b:16:4:16:Infinity:undefined:undefined:undefined:undefined":1,"s:16:4:16:Infinity":3,"b:16:8:16:26:16:26:16:47":2,"s:16:47:16:Infinity":4,"b:17:4:17:Infinity:undefined:undefined:undefined:undefined":3,"s:17:4:17:Infinity":5,"s:17:30:17:Infinity":6,"b:19:4:31:Infinity:21:4:31:Infinity":4,"s:19:4:31:Infinity":7,"s:20:6:20:Infinity":8,"b:21:4:31:Infinity:29:11:31:Infinity":5,"s:21:4:31:Infinity":9,"s:24:25:26:Infinity":10,"b:24:25:24:Infinity:25:8:25:Infinity:26:8:26:Infinity":6,"s:27:22:27:Infinity":11,"s:28:6:28:Infinity":12,"b:28:33:28:48:28:48:28:Infinity":7,"s:30:6:30:Infinity":13,"s:34:2:34:Infinity":14,"f:37:9:37:22":1,"s:38:2:38:Infinity":15,"f:41:16:41:33":2,"s:42:31:48:Infinity":16,"f:42:43:42:49":3,"s:43:17:43:Infinity":17,"s:44:16:46:Infinity":18,"f:45:11:45:12":4,"s:45:23:45:36":19,"s:47:4:47:Infinity":20,"s:50:2:50:Infinity":21}}} +,"/Users/luca/Workspace/laputa-app/src/hooks/useVaultLoader.ts": {"path":"/Users/luca/Workspace/laputa-app/src/hooks/useVaultLoader.ts","statementMap":{"0":{"start":{"line":7,"column":28},"end":{"line":7,"column":null}},"1":{"start":{"line":8,"column":34},"end":{"line":8,"column":null}},"2":{"start":{"line":9,"column":40},"end":{"line":9,"column":null}},"3":{"start":{"line":11,"column":2},"end":{"line":40,"column":null}},"4":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"5":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"6":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"7":{"start":{"line":16,"column":22},"end":{"line":38,"column":null}},"8":{"start":{"line":17,"column":6},"end":{"line":37,"column":null}},"9":{"start":{"line":19,"column":8},"end":{"line":24,"column":null}},"10":{"start":{"line":20,"column":10},"end":{"line":20,"column":null}},"11":{"start":{"line":22,"column":10},"end":{"line":22,"column":null}},"12":{"start":{"line":23,"column":10},"end":{"line":23,"column":null}},"13":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"14":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"15":{"start":{"line":29,"column":8},"end":{"line":33,"column":null}},"16":{"start":{"line":30,"column":10},"end":{"line":30,"column":null}},"17":{"start":{"line":32,"column":10},"end":{"line":32,"column":null}},"18":{"start":{"line":34,"column":8},"end":{"line":34,"column":null}},"19":{"start":{"line":36,"column":8},"end":{"line":36,"column":null}},"20":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"21":{"start":{"line":42,"column":8},"end":{"line":55,"column":null}},"22":{"start":{"line":43,"column":4},"end":{"line":54,"column":null}},"23":{"start":{"line":45,"column":6},"end":{"line":49,"column":null}},"24":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"25":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"26":{"start":{"line":50,"column":6},"end":{"line":50,"column":null}},"27":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"28":{"start":{"line":53,"column":6},"end":{"line":53,"column":null}},"29":{"start":{"line":57,"column":2},"end":{"line":59,"column":null}},"30":{"start":{"line":58,"column":4},"end":{"line":58,"column":null}},"31":{"start":{"line":61,"column":8},"end":{"line":64,"column":null}},"32":{"start":{"line":62,"column":4},"end":{"line":62,"column":null}},"33":{"start":{"line":62,"column":25},"end":{"line":62,"column":41}},"34":{"start":{"line":63,"column":4},"end":{"line":63,"column":null}},"35":{"start":{"line":63,"column":29},"end":{"line":63,"column":64}},"36":{"start":{"line":66,"column":8},"end":{"line":68,"column":null}},"37":{"start":{"line":67,"column":4},"end":{"line":67,"column":null}},"38":{"start":{"line":67,"column":29},"end":{"line":67,"column":58}},"39":{"start":{"line":70,"column":8},"end":{"line":72,"column":null}},"40":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"41":{"start":{"line":71,"column":25},"end":{"line":71,"column":82}},"42":{"start":{"line":71,"column":41},"end":{"line":71,"column":81}},"43":{"start":{"line":74,"column":8},"end":{"line":85,"column":null}},"44":{"start":{"line":75,"column":4},"end":{"line":84,"column":null}},"45":{"start":{"line":76,"column":6},"end":{"line":80,"column":null}},"46":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"47":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"48":{"start":{"line":82,"column":6},"end":{"line":82,"column":null}},"49":{"start":{"line":83,"column":6},"end":{"line":83,"column":null}},"50":{"start":{"line":87,"column":8},"end":{"line":93,"column":null}},"51":{"start":{"line":88,"column":4},"end":{"line":92,"column":null}},"52":{"start":{"line":89,"column":6},"end":{"line":89,"column":null}},"53":{"start":{"line":91,"column":6},"end":{"line":91,"column":null}},"54":{"start":{"line":95,"column":8},"end":{"line":101,"column":null}},"55":{"start":{"line":96,"column":4},"end":{"line":100,"column":null}},"56":{"start":{"line":97,"column":6},"end":{"line":97,"column":null}},"57":{"start":{"line":99,"column":6},"end":{"line":99,"column":null}},"58":{"start":{"line":103,"column":8},"end":{"line":105,"column":null}},"59":{"start":{"line":104,"column":4},"end":{"line":104,"column":null}},"60":{"start":{"line":104,"column":37},"end":{"line":104,"column":52}},"61":{"start":{"line":107,"column":8},"end":{"line":121,"column":null}},"62":{"start":{"line":108,"column":4},"end":{"line":120,"column":null}},"63":{"start":{"line":109,"column":6},"end":{"line":109,"column":null}},"64":{"start":{"line":110,"column":6},"end":{"line":115,"column":null}},"65":{"start":{"line":111,"column":8},"end":{"line":111,"column":null}},"66":{"start":{"line":112,"column":8},"end":{"line":112,"column":null}},"67":{"start":{"line":114,"column":8},"end":{"line":114,"column":null}},"68":{"start":{"line":117,"column":6},"end":{"line":117,"column":null}},"69":{"start":{"line":118,"column":6},"end":{"line":118,"column":null}},"70":{"start":{"line":119,"column":6},"end":{"line":119,"column":null}},"71":{"start":{"line":123,"column":2},"end":{"line":136,"column":null}}},"fnMap":{"0":{"name":"useVaultLoader","decl":{"start":{"line":6,"column":16},"end":{"line":6,"column":31}},"loc":{"start":{"line":6,"column":50},"end":{"line":137,"column":null}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":12},"end":{"line":11,"column":18}},"loc":{"start":{"line":11,"column":18},"end":{"line":40,"column":5}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":22},"end":{"line":16,"column":34}},"loc":{"start":{"line":16,"column":34},"end":{"line":38,"column":null}},"line":16},"3":{"name":"(anonymous_3)","decl":{"start":{"line":42,"column":40},"end":{"line":42,"column":52}},"loc":{"start":{"line":42,"column":52},"end":{"line":55,"column":5}},"line":42},"4":{"name":"(anonymous_4)","decl":{"start":{"line":57,"column":12},"end":{"line":57,"column":18}},"loc":{"start":{"line":57,"column":18},"end":{"line":59,"column":5}},"line":57},"5":{"name":"(anonymous_5)","decl":{"start":{"line":61,"column":31},"end":{"line":61,"column":32}},"loc":{"start":{"line":61,"column":71},"end":{"line":64,"column":5}},"line":61},"6":{"name":"(anonymous_6)","decl":{"start":{"line":62,"column":15},"end":{"line":62,"column":16}},"loc":{"start":{"line":62,"column":25},"end":{"line":62,"column":41}},"line":62},"7":{"name":"(anonymous_7)","decl":{"start":{"line":63,"column":18},"end":{"line":63,"column":19}},"loc":{"start":{"line":63,"column":29},"end":{"line":63,"column":64}},"line":63},"8":{"name":"(anonymous_8)","decl":{"start":{"line":66,"column":36},"end":{"line":66,"column":37}},"loc":{"start":{"line":66,"column":71},"end":{"line":68,"column":5}},"line":66},"9":{"name":"(anonymous_9)","decl":{"start":{"line":67,"column":18},"end":{"line":67,"column":19}},"loc":{"start":{"line":67,"column":29},"end":{"line":67,"column":58}},"line":67},"10":{"name":"(anonymous_10)","decl":{"start":{"line":70,"column":34},"end":{"line":70,"column":35}},"loc":{"start":{"line":70,"column":80},"end":{"line":72,"column":5}},"line":70},"11":{"name":"(anonymous_11)","decl":{"start":{"line":71,"column":15},"end":{"line":71,"column":16}},"loc":{"start":{"line":71,"column":25},"end":{"line":71,"column":82}},"line":71},"12":{"name":"(anonymous_12)","decl":{"start":{"line":71,"column":34},"end":{"line":71,"column":35}},"loc":{"start":{"line":71,"column":41},"end":{"line":71,"column":81}},"line":71},"13":{"name":"(anonymous_13)","decl":{"start":{"line":74,"column":37},"end":{"line":74,"column":44}},"loc":{"start":{"line":74,"column":83},"end":{"line":85,"column":5}},"line":74},"14":{"name":"(anonymous_14)","decl":{"start":{"line":87,"column":39},"end":{"line":87,"column":46}},"loc":{"start":{"line":87,"column":100},"end":{"line":93,"column":5}},"line":87},"15":{"name":"(anonymous_15)","decl":{"start":{"line":95,"column":31},"end":{"line":95,"column":38}},"loc":{"start":{"line":95,"column":72},"end":{"line":101,"column":5}},"line":95},"16":{"name":"(anonymous_16)","decl":{"start":{"line":103,"column":37},"end":{"line":103,"column":38}},"loc":{"start":{"line":103,"column":64},"end":{"line":105,"column":5}},"line":103},"17":{"name":"(anonymous_17)","decl":{"start":{"line":104,"column":30},"end":{"line":104,"column":31}},"loc":{"start":{"line":104,"column":37},"end":{"line":104,"column":52}},"line":104},"18":{"name":"(anonymous_18)","decl":{"start":{"line":107,"column":36},"end":{"line":107,"column":43}},"loc":{"start":{"line":107,"column":80},"end":{"line":121,"column":5}},"line":107}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":8},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":24,"column":null}},{"start":{"line":21,"column":15},"end":{"line":24,"column":null}}],"line":19},"1":{"loc":{"start":{"line":29,"column":8},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":8},"end":{"line":33,"column":null}},{"start":{"line":31,"column":15},"end":{"line":33,"column":null}}],"line":29},"2":{"loc":{"start":{"line":45,"column":6},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":6},"end":{"line":49,"column":null}},{"start":{"line":47,"column":13},"end":{"line":49,"column":null}}],"line":45},"3":{"loc":{"start":{"line":71,"column":41},"end":{"line":71,"column":81}},"type":"cond-expr","locations":[{"start":{"line":71,"column":59},"end":{"line":71,"column":80}},{"start":{"line":71,"column":80},"end":{"line":71,"column":81}}],"line":71},"4":{"loc":{"start":{"line":76,"column":6},"end":{"line":80,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":6},"end":{"line":80,"column":null}},{"start":{"line":78,"column":13},"end":{"line":80,"column":null}}],"line":76},"5":{"loc":{"start":{"line":88,"column":4},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":92,"column":null}},{"start":{"line":90,"column":11},"end":{"line":92,"column":null}}],"line":88},"6":{"loc":{"start":{"line":96,"column":4},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":96,"column":4},"end":{"line":100,"column":null}},{"start":{"line":98,"column":11},"end":{"line":100,"column":null}}],"line":96},"7":{"loc":{"start":{"line":108,"column":4},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":108,"column":4},"end":{"line":120,"column":null}},{"start":{"line":116,"column":11},"end":{"line":120,"column":null}}],"line":108}},"s":{"0":22,"1":22,"2":22,"3":22,"4":7,"5":7,"6":7,"7":7,"8":7,"9":7,"10":0,"11":7,"12":7,"13":7,"14":7,"15":7,"16":0,"17":7,"18":7,"19":0,"20":7,"21":22,"22":7,"23":7,"24":0,"25":7,"26":7,"27":0,"28":0,"29":22,"30":7,"31":22,"32":0,"33":0,"34":0,"35":0,"36":22,"37":0,"38":0,"39":22,"40":0,"41":0,"42":0,"43":22,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":22,"51":0,"52":0,"53":0,"54":22,"55":0,"56":0,"57":0,"58":22,"59":0,"60":0,"61":22,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":22},"f":{"0":22,"1":7,"2":7,"3":7,"4":7,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,7],"1":[0,7],"2":[0,7],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]},"meta":{"lastBranch":8,"lastFunction":19,"lastStatement":72,"seen":{"f:6:16:6:31":0,"s:7:28:7:Infinity":0,"s:8:34:8:Infinity":1,"s:9:40:9:Infinity":2,"s:11:2:40:Infinity":3,"f:11:12:11:18":1,"s:12:4:12:Infinity":4,"s:13:4:13:Infinity":5,"s:14:4:14:Infinity":6,"s:16:22:38:Infinity":7,"f:16:22:16:34":2,"s:17:6:37:Infinity":8,"b:19:8:24:Infinity:21:15:24:Infinity":0,"s:19:8:24:Infinity":9,"s:20:10:20:Infinity":10,"s:22:10:22:Infinity":11,"s:23:10:23:Infinity":12,"s:25:8:25:Infinity":13,"s:26:8:26:Infinity":14,"b:29:8:33:Infinity:31:15:33:Infinity":1,"s:29:8:33:Infinity":15,"s:30:10:30:Infinity":16,"s:32:10:32:Infinity":17,"s:34:8:34:Infinity":18,"s:36:8:36:Infinity":19,"s:39:4:39:Infinity":20,"s:42:8:55:Infinity":21,"f:42:40:42:52":3,"s:43:4:54:Infinity":22,"b:45:6:49:Infinity:47:13:49:Infinity":2,"s:45:6:49:Infinity":23,"s:46:8:46:Infinity":24,"s:48:8:48:Infinity":25,"s:50:6:50:Infinity":26,"s:52:6:52:Infinity":27,"s:53:6:53:Infinity":28,"s:57:2:59:Infinity":29,"f:57:12:57:18":4,"s:58:4:58:Infinity":30,"s:61:8:64:Infinity":31,"f:61:31:61:32":5,"s:62:4:62:Infinity":32,"f:62:15:62:16":6,"s:62:25:62:41":33,"s:63:4:63:Infinity":34,"f:63:18:63:19":7,"s:63:29:63:64":35,"s:66:8:68:Infinity":36,"f:66:36:66:37":8,"s:67:4:67:Infinity":37,"f:67:18:67:19":9,"s:67:29:67:58":38,"s:70:8:72:Infinity":39,"f:70:34:70:35":10,"s:71:4:71:Infinity":40,"f:71:15:71:16":11,"s:71:25:71:82":41,"f:71:34:71:35":12,"s:71:41:71:81":42,"b:71:59:71:80:71:80:71:81":3,"s:74:8:85:Infinity":43,"f:74:37:74:44":13,"s:75:4:84:Infinity":44,"b:76:6:80:Infinity:78:13:80:Infinity":4,"s:76:6:80:Infinity":45,"s:77:8:77:Infinity":46,"s:79:8:79:Infinity":47,"s:82:6:82:Infinity":48,"s:83:6:83:Infinity":49,"s:87:8:93:Infinity":50,"f:87:39:87:46":14,"b:88:4:92:Infinity:90:11:92:Infinity":5,"s:88:4:92:Infinity":51,"s:89:6:89:Infinity":52,"s:91:6:91:Infinity":53,"s:95:8:101:Infinity":54,"f:95:31:95:38":15,"b:96:4:100:Infinity:98:11:100:Infinity":6,"s:96:4:100:Infinity":55,"s:97:6:97:Infinity":56,"s:99:6:99:Infinity":57,"s:103:8:105:Infinity":58,"f:103:37:103:38":16,"s:104:4:104:Infinity":59,"f:104:30:104:31":17,"s:104:37:104:52":60,"s:107:8:121:Infinity":61,"f:107:36:107:43":18,"b:108:4:120:Infinity:116:11:120:Infinity":7,"s:108:4:120:Infinity":62,"s:109:6:109:Infinity":63,"s:110:6:115:Infinity":64,"s:111:8:111:Infinity":65,"s:112:8:112:Infinity":66,"s:114:8:114:Infinity":67,"s:117:6:117:Infinity":68,"s:118:6:118:Infinity":69,"s:119:6:119:Infinity":70,"s:123:2:136:Infinity":71}}} +,"/Users/luca/Workspace/laputa-app/src/lib/utils.ts": {"path":"/Users/luca/Workspace/laputa-app/src/lib/utils.ts","statementMap":{"0":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}}},"fnMap":{"0":{"name":"cn","decl":{"start":{"line":4,"column":16},"end":{"line":4,"column":22}},"loc":{"start":{"line":4,"column":44},"end":{"line":6,"column":null}},"line":4}},"branchMap":{},"s":{"0":1714},"f":{"0":1714},"b":{},"meta":{"lastBranch":0,"lastFunction":1,"lastStatement":1,"seen":{"f:4:16:4:22":0,"s:5:2:5:Infinity":0}}} +,"/Users/luca/Workspace/laputa-app/src/utils/ai-chat.ts": {"path":"/Users/luca/Workspace/laputa-app/src/utils/ai-chat.ts","statementMap":{"0":{"start":{"line":8,"column":28},"end":{"line":8,"column":null}},"1":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"2":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"3":{"start":{"line":22,"column":14},"end":{"line":22,"column":null}},"4":{"start":{"line":23,"column":2},"end":{"line":23,"column":null}},"5":{"start":{"line":26,"column":30},"end":{"line":26,"column":null}},"6":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"7":{"start":{"line":40,"column":2},"end":{"line":42,"column":null}},"8":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"9":{"start":{"line":44,"column":24},"end":{"line":44,"column":null}},"10":{"start":{"line":45,"column":19},"end":{"line":49,"column":null}},"11":{"start":{"line":51,"column":26},"end":{"line":51,"column":null}},"12":{"start":{"line":52,"column":19},"end":{"line":52,"column":null}},"13":{"start":{"line":53,"column":18},"end":{"line":53,"column":null}},"14":{"start":{"line":55,"column":2},"end":{"line":71,"column":null}},"15":{"start":{"line":56,"column":20},"end":{"line":56,"column":null}},"16":{"start":{"line":57,"column":19},"end":{"line":57,"column":null}},"17":{"start":{"line":58,"column":21},"end":{"line":58,"column":null}},"18":{"start":{"line":60,"column":4},"end":{"line":67,"column":null}},"19":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"20":{"start":{"line":62,"column":6},"end":{"line":64,"column":null}},"21":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"22":{"start":{"line":65,"column":6},"end":{"line":65,"column":null}},"23":{"start":{"line":66,"column":6},"end":{"line":66,"column":null}},"24":{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},"25":{"start":{"line":70,"column":4},"end":{"line":70,"column":null}},"26":{"start":{"line":73,"column":17},"end":{"line":73,"column":null}},"27":{"start":{"line":74,"column":2},"end":{"line":74,"column":null}},"28":{"start":{"line":85,"column":19},"end":{"line":85,"column":null}},"29":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"30":{"start":{"line":93,"column":2},"end":{"line":93,"column":null}},"31":{"start":{"line":93,"column":34},"end":{"line":93,"column":null}},"32":{"start":{"line":94,"column":15},"end":{"line":94,"column":null}},"33":{"start":{"line":95,"column":2},"end":{"line":95,"column":null}},"34":{"start":{"line":95,"column":25},"end":{"line":95,"column":null}},"35":{"start":{"line":97,"column":2},"end":{"line":105,"column":null}},"36":{"start":{"line":98,"column":18},"end":{"line":98,"column":null}},"37":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"38":{"start":{"line":100,"column":6},"end":{"line":100,"column":null}},"39":{"start":{"line":102,"column":4},"end":{"line":102,"column":null}},"40":{"start":{"line":102,"column":39},"end":{"line":102,"column":null}},"41":{"start":{"line":106,"column":2},"end":{"line":106,"column":null}},"42":{"start":{"line":113,"column":18},"end":{"line":113,"column":null}},"43":{"start":{"line":114,"column":15},"end":{"line":114,"column":null}},"44":{"start":{"line":116,"column":2},"end":{"line":127,"column":null}},"45":{"start":{"line":117,"column":28},"end":{"line":117,"column":null}},"46":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"47":{"start":{"line":118,"column":14},"end":{"line":118,"column":null}},"48":{"start":{"line":120,"column":4},"end":{"line":120,"column":null}},"49":{"start":{"line":121,"column":18},"end":{"line":121,"column":null}},"50":{"start":{"line":122,"column":4},"end":{"line":122,"column":null}},"51":{"start":{"line":124,"column":4},"end":{"line":126,"column":null}},"52":{"start":{"line":125,"column":6},"end":{"line":125,"column":null}},"53":{"start":{"line":125,"column":40},"end":{"line":125,"column":null}},"54":{"start":{"line":131,"column":18},"end":{"line":131,"column":null}},"55":{"start":{"line":132,"column":2},"end":{"line":137,"column":null}},"56":{"start":{"line":133,"column":20},"end":{"line":133,"column":null}},"57":{"start":{"line":134,"column":4},"end":{"line":134,"column":null}},"58":{"start":{"line":136,"column":4},"end":{"line":136,"column":null}},"59":{"start":{"line":150,"column":17},"end":{"line":150,"column":null}},"60":{"start":{"line":151,"column":2},"end":{"line":154,"column":null}},"61":{"start":{"line":152,"column":4},"end":{"line":152,"column":null}},"62":{"start":{"line":153,"column":4},"end":{"line":153,"column":null}},"63":{"start":{"line":156,"column":2},"end":{"line":182,"column":null}},"64":{"start":{"line":157,"column":21},"end":{"line":165,"column":null}},"65":{"start":{"line":167,"column":4},"end":{"line":170,"column":null}},"66":{"start":{"line":168,"column":6},"end":{"line":168,"column":null}},"67":{"start":{"line":169,"column":6},"end":{"line":169,"column":null}},"68":{"start":{"line":172,"column":19},"end":{"line":172,"column":null}},"69":{"start":{"line":173,"column":4},"end":{"line":176,"column":null}},"70":{"start":{"line":174,"column":6},"end":{"line":174,"column":null}},"71":{"start":{"line":175,"column":6},"end":{"line":175,"column":null}},"72":{"start":{"line":178,"column":4},"end":{"line":178,"column":null}},"73":{"start":{"line":179,"column":4},"end":{"line":179,"column":null}},"74":{"start":{"line":181,"column":4},"end":{"line":181,"column":null}},"75":{"start":{"line":186,"column":29},"end":{"line":190,"column":null}}},"fnMap":{"0":{"name":"getApiKey","decl":{"start":{"line":10,"column":16},"end":{"line":10,"column":36}},"loc":{"start":{"line":10,"column":36},"end":{"line":12,"column":null}},"line":10},"1":{"name":"setApiKey","decl":{"start":{"line":14,"column":16},"end":{"line":14,"column":26}},"loc":{"start":{"line":14,"column":45},"end":{"line":16,"column":null}},"line":14},"2":{"name":"estimateTokens","decl":{"start":{"line":21,"column":16},"end":{"line":21,"column":31}},"loc":{"start":{"line":21,"column":62},"end":{"line":24,"column":null}},"line":21},"3":{"name":"getContextLimit","decl":{"start":{"line":28,"column":16},"end":{"line":28,"column":32}},"loc":{"start":{"line":28,"column":56},"end":{"line":30,"column":null}},"line":28},"4":{"name":"buildSystemPrompt","decl":{"start":{"line":35,"column":16},"end":{"line":35,"column":null}},"loc":{"start":{"line":39,"column":63},"end":{"line":75,"column":null}},"line":39},"5":{"name":"nextMessageId","decl":{"start":{"line":86,"column":16},"end":{"line":86,"column":40}},"loc":{"start":{"line":86,"column":40},"end":{"line":88,"column":null}},"line":86},"6":{"name":"parseSseEvent","decl":{"start":{"line":92,"column":9},"end":{"line":92,"column":23}},"loc":{"start":{"line":92,"column":79},"end":{"line":107,"column":null}},"line":92},"7":{"name":"readSseStream","decl":{"start":{"line":109,"column":15},"end":{"line":109,"column":null}},"loc":{"start":{"line":112,"column":17},"end":{"line":128,"column":null}},"line":112},"8":{"name":"parseApiError","decl":{"start":{"line":130,"column":15},"end":{"line":130,"column":29}},"loc":{"start":{"line":130,"column":66},"end":{"line":138,"column":null}},"line":130},"9":{"name":"streamChat","decl":{"start":{"line":142,"column":22},"end":{"line":142,"column":null}},"loc":{"start":{"line":149,"column":17},"end":{"line":183,"column":null}},"line":149}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":null}},"type":"binary-expr","locations":[{"start":{"line":11,"column":9},"end":{"line":11,"column":54}},{"start":{"line":11,"column":54},"end":{"line":11,"column":null}}],"line":11},"1":{"loc":{"start":{"line":22,"column":14},"end":{"line":22,"column":null}},"type":"cond-expr","locations":[{"start":{"line":22,"column":41},"end":{"line":22,"column":48}},{"start":{"line":22,"column":48},"end":{"line":22,"column":null}}],"line":22},"2":{"loc":{"start":{"line":40,"column":2},"end":{"line":42,"column":null}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":42,"column":null}},{"start":{},"end":{}}],"line":40},"3":{"loc":{"start":{"line":56,"column":20},"end":{"line":56,"column":null}},"type":"binary-expr","locations":[{"start":{"line":56,"column":20},"end":{"line":56,"column":45}},{"start":{"line":56,"column":45},"end":{"line":56,"column":null}}],"line":56},"4":{"loc":{"start":{"line":57,"column":47},"end":{"line":57,"column":65}},"type":"binary-expr","locations":[{"start":{"line":57,"column":47},"end":{"line":57,"column":59}},{"start":{"line":57,"column":59},"end":{"line":57,"column":65}}],"line":57},"5":{"loc":{"start":{"line":60,"column":4},"end":{"line":67,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":4},"end":{"line":67,"column":null}},{"start":{},"end":{}}],"line":60},"6":{"loc":{"start":{"line":62,"column":6},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":62,"column":6},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":62},"7":{"loc":{"start":{"line":93,"column":2},"end":{"line":93,"column":null}},"type":"if","locations":[{"start":{"line":93,"column":2},"end":{"line":93,"column":null}},{"start":{},"end":{}}],"line":93},"8":{"loc":{"start":{"line":95,"column":2},"end":{"line":95,"column":null}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":95,"column":null}},{"start":{},"end":{}}],"line":95},"9":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":101,"column":null}},{"start":{},"end":{}}],"line":99},"10":{"loc":{"start":{"line":99,"column":8},"end":{"line":99,"column":67}},"type":"binary-expr","locations":[{"start":{"line":99,"column":8},"end":{"line":99,"column":48}},{"start":{"line":99,"column":48},"end":{"line":99,"column":67}}],"line":99},"11":{"loc":{"start":{"line":102,"column":4},"end":{"line":102,"column":null}},"type":"if","locations":[{"start":{"line":102,"column":4},"end":{"line":102,"column":null}},{"start":{},"end":{}}],"line":102},"12":{"loc":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},{"start":{},"end":{}}],"line":118},"13":{"loc":{"start":{"line":122,"column":13},"end":{"line":122,"column":null}},"type":"binary-expr","locations":[{"start":{"line":122,"column":13},"end":{"line":122,"column":28}},{"start":{"line":122,"column":28},"end":{"line":122,"column":null}}],"line":122},"14":{"loc":{"start":{"line":125,"column":6},"end":{"line":125,"column":null}},"type":"if","locations":[{"start":{"line":125,"column":6},"end":{"line":125,"column":null}},{"start":{},"end":{}}],"line":125},"15":{"loc":{"start":{"line":134,"column":11},"end":{"line":134,"column":null}},"type":"binary-expr","locations":[{"start":{"line":134,"column":11},"end":{"line":134,"column":37}},{"start":{"line":134,"column":37},"end":{"line":134,"column":54}},{"start":{"line":134,"column":54},"end":{"line":134,"column":null}}],"line":134},"16":{"loc":{"start":{"line":151,"column":2},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":154,"column":null}},{"start":{},"end":{}}],"line":151},"17":{"loc":{"start":{"line":162,"column":16},"end":{"line":162,"column":null}},"type":"binary-expr","locations":[{"start":{"line":162,"column":16},"end":{"line":162,"column":32}},{"start":{"line":162,"column":32},"end":{"line":162,"column":null}}],"line":162},"18":{"loc":{"start":{"line":167,"column":4},"end":{"line":170,"column":null}},"type":"if","locations":[{"start":{"line":167,"column":4},"end":{"line":170,"column":null}},{"start":{},"end":{}}],"line":167},"19":{"loc":{"start":{"line":173,"column":4},"end":{"line":176,"column":null}},"type":"if","locations":[{"start":{"line":173,"column":4},"end":{"line":176,"column":null}},{"start":{},"end":{}}],"line":173},"20":{"loc":{"start":{"line":181,"column":12},"end":{"line":181,"column":42}},"type":"binary-expr","locations":[{"start":{"line":181,"column":12},"end":{"line":181,"column":27}},{"start":{"line":181,"column":27},"end":{"line":181,"column":42}}],"line":181}},"s":{"0":2,"1":0,"2":0,"3":0,"4":0,"5":2,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":2,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":2},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0]},"meta":{"lastBranch":21,"lastFunction":10,"lastStatement":76,"seen":{"s:8:28:8:Infinity":0,"f:10:16:10:36":0,"s:11:2:11:Infinity":1,"b:11:9:11:54:11:54:11:Infinity":0,"f:14:16:14:26":1,"s:15:2:15:Infinity":2,"f:21:16:21:31":2,"s:22:14:22:Infinity":3,"b:22:41:22:48:22:48:22:Infinity":1,"s:23:2:23:Infinity":4,"s:26:30:26:Infinity":5,"f:28:16:28:32":3,"s:29:2:29:Infinity":6,"f:35:16:35:Infinity":4,"b:40:2:42:Infinity:undefined:undefined:undefined:undefined":2,"s:40:2:42:Infinity":7,"s:41:4:41:Infinity":8,"s:44:24:44:Infinity":9,"s:45:19:49:Infinity":10,"s:51:26:51:Infinity":11,"s:52:19:52:Infinity":12,"s:53:18:53:Infinity":13,"s:55:2:71:Infinity":14,"s:56:20:56:Infinity":15,"b:56:20:56:45:56:45:56:Infinity":3,"s:57:19:57:Infinity":16,"b:57:47:57:59:57:59:57:65":4,"s:58:21:58:Infinity":17,"b:60:4:67:Infinity:undefined:undefined:undefined:undefined":5,"s:60:4:67:Infinity":18,"s:61:12:61:Infinity":19,"b:62:6:64:Infinity:undefined:undefined:undefined:undefined":6,"s:62:6:64:Infinity":20,"s:63:8:63:Infinity":21,"s:65:6:65:Infinity":22,"s:66:6:66:Infinity":23,"s:69:4:69:Infinity":24,"s:70:4:70:Infinity":25,"s:73:17:73:Infinity":26,"s:74:2:74:Infinity":27,"s:85:19:85:Infinity":28,"f:86:16:86:40":5,"s:87:2:87:Infinity":29,"f:92:9:92:23":6,"b:93:2:93:Infinity:undefined:undefined:undefined:undefined":7,"s:93:2:93:Infinity":30,"s:93:34:93:Infinity":31,"s:94:15:94:Infinity":32,"b:95:2:95:Infinity:undefined:undefined:undefined:undefined":8,"s:95:2:95:Infinity":33,"s:95:25:95:Infinity":34,"s:97:2:105:Infinity":35,"s:98:18:98:Infinity":36,"b:99:4:101:Infinity:undefined:undefined:undefined:undefined":9,"s:99:4:101:Infinity":37,"b:99:8:99:48:99:48:99:67":10,"s:100:6:100:Infinity":38,"b:102:4:102:Infinity:undefined:undefined:undefined:undefined":11,"s:102:4:102:Infinity":39,"s:102:39:102:Infinity":40,"s:106:2:106:Infinity":41,"f:109:15:109:Infinity":7,"s:113:18:113:Infinity":42,"s:114:15:114:Infinity":43,"s:116:2:127:Infinity":44,"s:117:28:117:Infinity":45,"b:118:4:118:Infinity:undefined:undefined:undefined:undefined":12,"s:118:4:118:Infinity":46,"s:118:14:118:Infinity":47,"s:120:4:120:Infinity":48,"s:121:18:121:Infinity":49,"s:122:4:122:Infinity":50,"b:122:13:122:28:122:28:122:Infinity":13,"s:124:4:126:Infinity":51,"b:125:6:125:Infinity:undefined:undefined:undefined:undefined":14,"s:125:6:125:Infinity":52,"s:125:40:125:Infinity":53,"f:130:15:130:29":8,"s:131:18:131:Infinity":54,"s:132:2:137:Infinity":55,"s:133:20:133:Infinity":56,"s:134:4:134:Infinity":57,"b:134:11:134:37:134:37:134:54:134:54:134:Infinity":15,"s:136:4:136:Infinity":58,"f:142:22:142:Infinity":9,"s:150:17:150:Infinity":59,"b:151:2:154:Infinity:undefined:undefined:undefined:undefined":16,"s:151:2:154:Infinity":60,"s:152:4:152:Infinity":61,"s:153:4:153:Infinity":62,"s:156:2:182:Infinity":63,"s:157:21:165:Infinity":64,"b:162:16:162:32:162:32:162:Infinity":17,"b:167:4:170:Infinity:undefined:undefined:undefined:undefined":18,"s:167:4:170:Infinity":65,"s:168:6:168:Infinity":66,"s:169:6:169:Infinity":67,"s:172:19:172:Infinity":68,"b:173:4:176:Infinity:undefined:undefined:undefined:undefined":19,"s:173:4:176:Infinity":69,"s:174:6:174:Infinity":70,"s:175:6:175:Infinity":71,"s:178:4:178:Infinity":72,"s:179:4:179:Infinity":73,"s:181:4:181:Infinity":74,"b:181:12:181:27:181:27:181:42":20,"s:186:29:190:Infinity":75}}} +,"/Users/luca/Workspace/laputa-app/src/utils/frontmatter.ts": {"path":"/Users/luca/Workspace/laputa-app/src/utils/frontmatter.ts","statementMap":{"0":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"1":{"start":{"line":9,"column":16},"end":{"line":9,"column":null}},"2":{"start":{"line":11,"column":16},"end":{"line":11,"column":null}},"3":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"4":{"start":{"line":12,"column":14},"end":{"line":12,"column":null}},"5":{"start":{"line":14,"column":15},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":36},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":34},"end":{"line":17,"column":null}},"8":{"start":{"line":18,"column":30},"end":{"line":18,"column":null}},"9":{"start":{"line":19,"column":15},"end":{"line":19,"column":null}},"10":{"start":{"line":21,"column":16},"end":{"line":21,"column":null}},"11":{"start":{"line":23,"column":2},"end":{"line":65,"column":null}},"12":{"start":{"line":24,"column":22},"end":{"line":24,"column":null}},"13":{"start":{"line":25,"column":4},"end":{"line":29,"column":null}},"14":{"start":{"line":26,"column":6},"end":{"line":26,"column":null}},"15":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"16":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"17":{"start":{"line":31,"column":4},"end":{"line":35,"column":null}},"18":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"19":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"20":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"21":{"start":{"line":37,"column":20},"end":{"line":37,"column":null}},"22":{"start":{"line":38,"column":4},"end":{"line":64,"column":null}},"23":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"24":{"start":{"line":40,"column":20},"end":{"line":40,"column":null}},"25":{"start":{"line":42,"column":6},"end":{"line":44,"column":null}},"26":{"start":{"line":43,"column":8},"end":{"line":43,"column":null}},"27":{"start":{"line":46,"column":6},"end":{"line":50,"column":null}},"28":{"start":{"line":47,"column":22},"end":{"line":47,"column":null}},"29":{"start":{"line":47,"column":61},"end":{"line":47,"column":97}},"30":{"start":{"line":48,"column":8},"end":{"line":48,"column":null}},"31":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"32":{"start":{"line":52,"column":23},"end":{"line":52,"column":null}},"33":{"start":{"line":54,"column":6},"end":{"line":57,"column":null}},"34":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"35":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"36":{"start":{"line":58,"column":6},"end":{"line":61,"column":null}},"37":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"38":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"39":{"start":{"line":63,"column":6},"end":{"line":63,"column":null}},"40":{"start":{"line":67,"column":2},"end":{"line":69,"column":null}},"41":{"start":{"line":68,"column":4},"end":{"line":68,"column":null}},"42":{"start":{"line":71,"column":2},"end":{"line":71,"column":null}}},"fnMap":{"0":{"name":"parseFrontmatter","decl":{"start":{"line":8,"column":16},"end":{"line":8,"column":33}},"loc":{"start":{"line":8,"column":76},"end":{"line":72,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":47,"column":56},"end":{"line":47,"column":61}},"loc":{"start":{"line":47,"column":61},"end":{"line":47,"column":97}},"line":47}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},{"start":{},"end":{}}],"line":9},"1":{"loc":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":25,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":4},"end":{"line":29,"column":null}},{"start":{},"end":{}}],"line":25},"3":{"loc":{"start":{"line":25,"column":8},"end":{"line":25,"column":33}},"type":"binary-expr","locations":[{"start":{"line":25,"column":8},"end":{"line":25,"column":21}},{"start":{"line":25,"column":21},"end":{"line":25,"column":33}}],"line":25},"4":{"loc":{"start":{"line":31,"column":4},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":35,"column":null}},{"start":{},"end":{}}],"line":31},"5":{"loc":{"start":{"line":31,"column":8},"end":{"line":31,"column":30}},"type":"binary-expr","locations":[{"start":{"line":31,"column":8},"end":{"line":31,"column":18}},{"start":{"line":31,"column":18},"end":{"line":31,"column":30}}],"line":31},"6":{"loc":{"start":{"line":32,"column":27},"end":{"line":32,"column":null}},"type":"cond-expr","locations":[{"start":{"line":32,"column":54},"end":{"line":32,"column":71}},{"start":{"line":32,"column":71},"end":{"line":32,"column":null}}],"line":32},"7":{"loc":{"start":{"line":38,"column":4},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":38},"8":{"loc":{"start":{"line":42,"column":6},"end":{"line":44,"column":null}},"type":"if","locations":[{"start":{"line":42,"column":6},"end":{"line":44,"column":null}},{"start":{},"end":{}}],"line":42},"9":{"loc":{"start":{"line":42,"column":10},"end":{"line":42,"column":58}},"type":"binary-expr","locations":[{"start":{"line":42,"column":10},"end":{"line":42,"column":26}},{"start":{"line":42,"column":26},"end":{"line":42,"column":43}},{"start":{"line":42,"column":43},"end":{"line":42,"column":58}}],"line":42},"10":{"loc":{"start":{"line":46,"column":6},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":6},"end":{"line":50,"column":null}},{"start":{},"end":{}}],"line":46},"11":{"loc":{"start":{"line":46,"column":10},"end":{"line":46,"column":56}},"type":"binary-expr","locations":[{"start":{"line":46,"column":10},"end":{"line":46,"column":35}},{"start":{"line":46,"column":35},"end":{"line":46,"column":56}}],"line":46},"12":{"loc":{"start":{"line":48,"column":29},"end":{"line":48,"column":null}},"type":"cond-expr","locations":[{"start":{"line":48,"column":50},"end":{"line":48,"column":61}},{"start":{"line":48,"column":61},"end":{"line":48,"column":null}}],"line":48},"13":{"loc":{"start":{"line":54,"column":6},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":54,"column":6},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":54},"14":{"loc":{"start":{"line":58,"column":6},"end":{"line":61,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":6},"end":{"line":61,"column":null}},{"start":{},"end":{}}],"line":58},"15":{"loc":{"start":{"line":67,"column":2},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":67},"16":{"loc":{"start":{"line":67,"column":6},"end":{"line":67,"column":28}},"type":"binary-expr","locations":[{"start":{"line":67,"column":6},"end":{"line":67,"column":16}},{"start":{"line":67,"column":16},"end":{"line":67,"column":28}}],"line":67},"17":{"loc":{"start":{"line":68,"column":25},"end":{"line":68,"column":null}},"type":"cond-expr","locations":[{"start":{"line":68,"column":52},"end":{"line":68,"column":69}},{"start":{"line":68,"column":69},"end":{"line":68,"column":null}}],"line":68}},"s":{"0":26,"1":10,"2":16,"3":16,"4":0,"5":16,"6":16,"7":16,"8":16,"9":16,"10":16,"11":16,"12":146,"13":146,"14":28,"15":28,"16":28,"17":118,"18":14,"19":14,"20":14,"21":118,"22":118,"23":118,"24":118,"25":118,"26":28,"27":90,"28":14,"29":42,"30":14,"31":14,"32":76,"33":76,"34":0,"35":0,"36":76,"37":0,"38":0,"39":76,"40":16,"41":14,"42":16},"f":{"0":26,"1":42},"b":{"0":[10,16],"1":[0,16],"2":[28,118],"3":[146,28],"4":[14,104],"5":[118,14],"6":[14,0],"7":[118,0],"8":[28,90],"9":[118,90,90],"10":[14,76],"11":[90,14],"12":[0,14],"13":[0,76],"14":[0,76],"15":[14,2],"16":[16,14],"17":[14,0]},"meta":{"lastBranch":18,"lastFunction":2,"lastStatement":43,"seen":{"f:8:16:8:33":0,"b:9:2:9:Infinity:undefined:undefined:undefined:undefined":0,"s:9:2:9:Infinity":0,"s:9:16:9:Infinity":1,"s:11:16:11:Infinity":2,"b:12:2:12:Infinity:undefined:undefined:undefined:undefined":1,"s:12:2:12:Infinity":3,"s:12:14:12:Infinity":4,"s:14:15:14:Infinity":5,"s:15:36:15:Infinity":6,"s:17:34:17:Infinity":7,"s:18:30:18:Infinity":8,"s:19:15:19:Infinity":9,"s:21:16:21:Infinity":10,"s:23:2:65:Infinity":11,"s:24:22:24:Infinity":12,"b:25:4:29:Infinity:undefined:undefined:undefined:undefined":2,"s:25:4:29:Infinity":13,"b:25:8:25:21:25:21:25:33":3,"s:26:6:26:Infinity":14,"s:27:6:27:Infinity":15,"s:28:6:28:Infinity":16,"b:31:4:35:Infinity:undefined:undefined:undefined:undefined":4,"s:31:4:35:Infinity":17,"b:31:8:31:18:31:18:31:30":5,"s:32:6:32:Infinity":18,"b:32:54:32:71:32:71:32:Infinity":6,"s:33:6:33:Infinity":19,"s:34:6:34:Infinity":20,"s:37:20:37:Infinity":21,"b:38:4:64:Infinity:undefined:undefined:undefined:undefined":7,"s:38:4:64:Infinity":22,"s:39:6:39:Infinity":23,"s:40:20:40:Infinity":24,"b:42:6:44:Infinity:undefined:undefined:undefined:undefined":8,"s:42:6:44:Infinity":25,"b:42:10:42:26:42:26:42:43:42:43:42:58":9,"s:43:8:43:Infinity":26,"b:46:6:50:Infinity:undefined:undefined:undefined:undefined":10,"s:46:6:50:Infinity":27,"b:46:10:46:35:46:35:46:56":11,"s:47:22:47:Infinity":28,"f:47:56:47:61":1,"s:47:61:47:97":29,"s:48:8:48:Infinity":30,"b:48:50:48:61:48:61:48:Infinity":12,"s:49:8:49:Infinity":31,"s:52:23:52:Infinity":32,"b:54:6:57:Infinity:undefined:undefined:undefined:undefined":13,"s:54:6:57:Infinity":33,"s:55:8:55:Infinity":34,"s:56:8:56:Infinity":35,"b:58:6:61:Infinity:undefined:undefined:undefined:undefined":14,"s:58:6:61:Infinity":36,"s:59:8:59:Infinity":37,"s:60:8:60:Infinity":38,"s:63:6:63:Infinity":39,"b:67:2:69:Infinity:undefined:undefined:undefined:undefined":15,"s:67:2:69:Infinity":40,"b:67:6:67:16:67:16:67:28":16,"s:68:4:68:Infinity":41,"b:68:52:68:69:68:69:68:Infinity":17,"s:71:2:71:Infinity":42}}} +,"/Users/luca/Workspace/laputa-app/src/utils/typeColors.ts": {"path":"/Users/luca/Workspace/laputa-app/src/utils/typeColors.ts","statementMap":{"0":{"start":{"line":6,"column":47},"end":{"line":15,"column":null}},"1":{"start":{"line":17,"column":53},"end":{"line":26,"column":null}},"2":{"start":{"line":28,"column":22},"end":{"line":28,"column":null}},"3":{"start":{"line":29,"column":28},"end":{"line":29,"column":null}},"4":{"start":{"line":32,"column":94},"end":{"line":39,"column":null}},"5":{"start":{"line":41,"column":49},"end":{"line":43,"column":null}},"6":{"start":{"line":42,"column":27},"end":{"line":42,"column":41}},"7":{"start":{"line":44,"column":55},"end":{"line":46,"column":null}},"8":{"start":{"line":45,"column":27},"end":{"line":45,"column":46}},"9":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"10":{"start":{"line":50,"column":58},"end":{"line":50,"column":null}},"11":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"12":{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},"13":{"start":{"line":56,"column":64},"end":{"line":56,"column":null}},"14":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":42,"column":20},"end":{"line":42,"column":21}},"loc":{"start":{"line":42,"column":27},"end":{"line":42,"column":41}},"line":42},"1":{"name":"(anonymous_1)","decl":{"start":{"line":45,"column":20},"end":{"line":45,"column":21}},"loc":{"start":{"line":45,"column":27},"end":{"line":45,"column":46}},"line":45},"2":{"name":"getTypeColor","decl":{"start":{"line":49,"column":16},"end":{"line":49,"column":29}},"loc":{"start":{"line":49,"column":89},"end":{"line":52,"column":null}},"line":49},"3":{"name":"getTypeLightColor","decl":{"start":{"line":55,"column":16},"end":{"line":55,"column":34}},"loc":{"start":{"line":55,"column":94},"end":{"line":58,"column":null}},"line":55}},"branchMap":{"0":{"loc":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},{"start":{},"end":{}}],"line":50},"1":{"loc":{"start":{"line":50,"column":6},"end":{"line":50,"column":58}},"type":"binary-expr","locations":[{"start":{"line":50,"column":6},"end":{"line":50,"column":24}},{"start":{"line":50,"column":24},"end":{"line":50,"column":58}}],"line":50},"2":{"loc":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"type":"binary-expr","locations":[{"start":{"line":51,"column":10},"end":{"line":51,"column":17}},{"start":{"line":51,"column":17},"end":{"line":51,"column":41}},{"start":{"line":51,"column":41},"end":{"line":51,"column":null}}],"line":51},"3":{"loc":{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},"type":"if","locations":[{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},{"start":{},"end":{}}],"line":56},"4":{"loc":{"start":{"line":56,"column":6},"end":{"line":56,"column":64}},"type":"binary-expr","locations":[{"start":{"line":56,"column":6},"end":{"line":56,"column":24}},{"start":{"line":56,"column":24},"end":{"line":56,"column":64}}],"line":56},"5":{"loc":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"type":"binary-expr","locations":[{"start":{"line":57,"column":10},"end":{"line":57,"column":17}},{"start":{"line":57,"column":17},"end":{"line":57,"column":47}},{"start":{"line":57,"column":47},"end":{"line":57,"column":null}}],"line":57}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5,"6":30,"7":5,"8":30,"9":832,"10":0,"11":832,"12":758,"13":0,"14":758},"f":{"0":30,"1":30,"2":832,"3":758},"b":{"0":[0,832],"1":[832,0],"2":[832,832,49],"3":[0,758],"4":[758,0],"5":[758,758,47]},"meta":{"lastBranch":6,"lastFunction":4,"lastStatement":15,"seen":{"s:6:47:15:Infinity":0,"s:17:53:26:Infinity":1,"s:28:22:28:Infinity":2,"s:29:28:29:Infinity":3,"s:32:94:39:Infinity":4,"s:41:49:43:Infinity":5,"f:42:20:42:21":0,"s:42:27:42:41":6,"s:44:55:46:Infinity":7,"f:45:20:45:21":1,"s:45:27:45:46":8,"f:49:16:49:29":2,"b:50:2:50:Infinity:undefined:undefined:undefined:undefined":0,"s:50:2:50:Infinity":9,"b:50:6:50:24:50:24:50:58":1,"s:50:58:50:Infinity":10,"s:51:2:51:Infinity":11,"b:51:10:51:17:51:17:51:41:51:41:51:Infinity":2,"f:55:16:55:34":3,"b:56:2:56:Infinity:undefined:undefined:undefined:undefined":3,"s:56:2:56:Infinity":12,"b:56:6:56:24:56:24:56:64":4,"s:56:64:56:Infinity":13,"s:57:2:57:Infinity":14,"b:57:10:57:17:57:17:57:47:57:47:57:Infinity":5}}} +,"/Users/luca/Workspace/laputa-app/src/utils/wikilinks.ts": {"path":"/Users/luca/Workspace/laputa-app/src/utils/wikilinks.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":15},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":14},"end":{"line":4,"column":null}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"4":{"start":{"line":8,"column":57},"end":{"line":8,"column":88}},"5":{"start":{"line":13,"column":2},"end":{"line":21,"column":null}},"6":{"start":{"line":14,"column":4},"end":{"line":16,"column":null}},"7":{"start":{"line":15,"column":6},"end":{"line":15,"column":null}},"8":{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},"9":{"start":{"line":18,"column":6},"end":{"line":18,"column":null}},"10":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"11":{"start":{"line":25,"column":24},"end":{"line":25,"column":null}},"12":{"start":{"line":26,"column":2},"end":{"line":49,"column":null}},"13":{"start":{"line":27,"column":4},"end":{"line":30,"column":null}},"14":{"start":{"line":28,"column":6},"end":{"line":28,"column":null}},"15":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"16":{"start":{"line":31,"column":17},"end":{"line":31,"column":null}},"17":{"start":{"line":32,"column":20},"end":{"line":32,"column":null}},"18":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"19":{"start":{"line":35,"column":4},"end":{"line":45,"column":null}},"20":{"start":{"line":36,"column":6},"end":{"line":38,"column":null}},"21":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"22":{"start":{"line":39,"column":6},"end":{"line":43,"column":null}},"23":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"24":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"25":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"26":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"27":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"28":{"start":{"line":55,"column":34},"end":{"line":55,"column":null}},"29":{"start":{"line":56,"column":14},"end":{"line":56,"column":null}},"30":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"31":{"start":{"line":57,"column":18},"end":{"line":57,"column":null}},"32":{"start":{"line":58,"column":11},"end":{"line":58,"column":null}},"33":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"34":{"start":{"line":59,"column":28},"end":{"line":59,"column":null}},"35":{"start":{"line":60,"column":2},"end":{"line":60,"column":null}},"36":{"start":{"line":64,"column":19},"end":{"line":64,"column":null}},"37":{"start":{"line":65,"column":15},"end":{"line":65,"column":null}},"38":{"start":{"line":66,"column":2},"end":{"line":66,"column":null}},"39":{"start":{"line":66,"column":13},"end":{"line":66,"column":null}},"40":{"start":{"line":67,"column":2},"end":{"line":67,"column":null}}},"fnMap":{"0":{"name":"preProcessWikilinks","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":36}},"loc":{"start":{"line":7,"column":56},"end":{"line":9,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":41},"end":{"line":8,"column":42}},"loc":{"start":{"line":8,"column":57},"end":{"line":8,"column":88}},"line":8},"2":{"name":"injectWikilinks","decl":{"start":{"line":12,"column":16},"end":{"line":12,"column":32}},"loc":{"start":{"line":12,"column":54},"end":{"line":22,"column":null}},"line":12},"3":{"name":"(anonymous_3)","decl":{"start":{"line":13,"column":20},"end":{"line":13,"column":29}},"loc":{"start":{"line":13,"column":29},"end":{"line":21,"column":3}},"line":13},"4":{"name":"expandWikilinksInContent","decl":{"start":{"line":24,"column":9},"end":{"line":24,"column":34}},"loc":{"start":{"line":24,"column":57},"end":{"line":51,"column":null}},"line":24},"5":{"name":"splitFrontmatter","decl":{"start":{"line":54,"column":16},"end":{"line":54,"column":33}},"loc":{"start":{"line":54,"column":68},"end":{"line":61,"column":null}},"line":54},"6":{"name":"countWords","decl":{"start":{"line":63,"column":16},"end":{"line":63,"column":27}},"loc":{"start":{"line":63,"column":52},"end":{"line":68,"column":null}},"line":63}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":4},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":16,"column":null}},{"start":{},"end":{}}],"line":14},"1":{"loc":{"start":{"line":14,"column":8},"end":{"line":14,"column":55}},"type":"binary-expr","locations":[{"start":{"line":14,"column":8},"end":{"line":14,"column":25}},{"start":{"line":14,"column":25},"end":{"line":14,"column":55}}],"line":14},"2":{"loc":{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},{"start":{},"end":{}}],"line":17},"3":{"loc":{"start":{"line":17,"column":8},"end":{"line":17,"column":57}},"type":"binary-expr","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":26}},{"start":{"line":17,"column":26},"end":{"line":17,"column":57}}],"line":17},"4":{"loc":{"start":{"line":27,"column":4},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":27},"5":{"loc":{"start":{"line":27,"column":8},"end":{"line":27,"column":96}},"type":"binary-expr","locations":[{"start":{"line":27,"column":8},"end":{"line":27,"column":32}},{"start":{"line":27,"column":32},"end":{"line":27,"column":65}},{"start":{"line":27,"column":65},"end":{"line":27,"column":96}}],"line":27},"6":{"loc":{"start":{"line":36,"column":6},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":6},"end":{"line":38,"column":null}},{"start":{},"end":{}}],"line":36},"7":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},{"start":{},"end":{}}],"line":46},"8":{"loc":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":55},"9":{"loc":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":57},"10":{"loc":{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":59,"column":null}},{"start":{},"end":{}}],"line":59},"11":{"loc":{"start":{"line":66,"column":2},"end":{"line":66,"column":null}},"type":"if","locations":[{"start":{"line":66,"column":2},"end":{"line":66,"column":null}},{"start":{},"end":{}}],"line":66}},"s":{"0":2,"1":2,"2":2,"3":8,"4":0,"5":9,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":1,"27":16,"28":0,"29":16,"30":16,"31":0,"32":16,"33":16,"34":16,"35":16,"36":8,"37":8,"38":8,"39":0,"40":8},"f":{"0":8,"1":0,"2":9,"3":1,"4":1,"5":16,"6":8},"b":{"0":[1,0],"1":[1,1],"2":[1,0],"3":[1,1],"4":[1,0],"5":[1,1,1],"6":[0,0],"7":[0,0],"8":[0,16],"9":[0,16],"10":[16,0],"11":[0,8]},"meta":{"lastBranch":12,"lastFunction":7,"lastStatement":41,"seen":{"s:2:17:2:Infinity":0,"s:3:15:3:Infinity":1,"s:4:14:4:Infinity":2,"f:7:16:7:36":0,"s:8:2:8:Infinity":3,"f:8:41:8:42":1,"s:8:57:8:88":4,"f:12:16:12:32":2,"s:13:2:21:Infinity":5,"f:13:20:13:29":3,"b:14:4:16:Infinity:undefined:undefined:undefined:undefined":0,"s:14:4:16:Infinity":6,"b:14:8:14:25:14:25:14:55":1,"s:15:6:15:Infinity":7,"b:17:4:19:Infinity:undefined:undefined:undefined:undefined":2,"s:17:4:19:Infinity":8,"b:17:8:17:26:17:26:17:57":3,"s:18:6:18:Infinity":9,"s:20:4:20:Infinity":10,"f:24:9:24:34":4,"s:25:24:25:Infinity":11,"s:26:2:49:Infinity":12,"b:27:4:30:Infinity:undefined:undefined:undefined:undefined":4,"s:27:4:30:Infinity":13,"b:27:8:27:32:27:32:27:65:27:65:27:96":5,"s:28:6:28:Infinity":14,"s:29:6:29:Infinity":15,"s:31:17:31:Infinity":16,"s:32:20:32:Infinity":17,"s:33:4:33:Infinity":18,"s:35:4:45:Infinity":19,"b:36:6:38:Infinity:undefined:undefined:undefined:undefined":6,"s:36:6:38:Infinity":20,"s:37:8:37:Infinity":21,"s:39:6:43:Infinity":22,"s:44:6:44:Infinity":23,"b:46:4:48:Infinity:undefined:undefined:undefined:undefined":7,"s:46:4:48:Infinity":24,"s:47:6:47:Infinity":25,"s:50:2:50:Infinity":26,"f:54:16:54:33":5,"b:55:2:55:Infinity:undefined:undefined:undefined:undefined":8,"s:55:2:55:Infinity":27,"s:55:34:55:Infinity":28,"s:56:14:56:Infinity":29,"b:57:2:57:Infinity:undefined:undefined:undefined:undefined":9,"s:57:2:57:Infinity":30,"s:57:18:57:Infinity":31,"s:58:11:58:Infinity":32,"b:59:2:59:Infinity:undefined:undefined:undefined:undefined":10,"s:59:2:59:Infinity":33,"s:59:28:59:Infinity":34,"s:60:2:60:Infinity":35,"f:63:16:63:27":6,"s:64:19:64:Infinity":36,"s:65:15:65:Infinity":37,"b:66:2:66:Infinity:undefined:undefined:undefined:undefined":11,"s:66:2:66:Infinity":38,"s:66:13:66:Infinity":39,"s:67:2:67:Infinity":40}}} +} diff --git a/coverage/favicon.png b/coverage/favicon.png new file mode 100644 index 00000000..c1525b81 Binary files /dev/null and b/coverage/favicon.png differ diff --git a/coverage/index.html b/coverage/index.html new file mode 100644 index 00000000..2bafc06e --- /dev/null +++ b/coverage/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 45.44% + Statements + 1003/2207 +
+ + +
+ 44.25% + Branches + 651/1471 +
+ + +
+ 40.81% + Functions + 269/659 +
+ + +
+ 47.64% + Lines + 911/1912 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
40.9%45/11050%11/2213.51%5/3745%45/100
src/components +
+
54.44%710/130450.75%540/106450.11%210/41957.02%629/1103
src/components/ui +
+
19.67%12/6122.85%8/3516.07%9/5619.67%12/61
src/hooks +
+
27.51%153/55616.45%38/23126.01%32/12329.77%145/487
src/lib +
+
100%1/1100%0/0100%1/1100%1/1
src/utils +
+
46.85%82/17545.37%54/11952.17%12/2349.37%79/160
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/prettify.css b/coverage/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/prettify.js b/coverage/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/sort-arrow-sprite.png b/coverage/sort-arrow-sprite.png new file mode 100644 index 00000000..6ed68316 Binary files /dev/null and b/coverage/sort-arrow-sprite.png differ diff --git a/coverage/sorter.js b/coverage/sorter.js new file mode 100644 index 00000000..4ed70ae5 --- /dev/null +++ b/coverage/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/src/App.tsx.html b/coverage/src/App.tsx.html new file mode 100644 index 00000000..fcfbd131 --- /dev/null +++ b/coverage/src/App.tsx.html @@ -0,0 +1,904 @@ + + + + + + Code coverage report for src/App.tsx + + + + + + + + + +
+
+

All files / src App.tsx

+
+ +
+ 40.9% + Statements + 45/110 +
+ + +
+ 50% + Branches + 11/22 +
+ + +
+ 13.51% + Functions + 5/37 +
+ + +
+ 45% + Lines + 45/100 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +  +22x +22x +  +  +22x +21x +14x +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +22x +7x +7x +7x +  +  +  +  +22x +  +  +  +  +22x +  +  +  +22x +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +22x +  +  +  +  +  +22x +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +22x +  +  +1x +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +22x +  +  +  +22x +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +22x +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useCallback, useEffect, useMemo, useState } from 'react'
+import { Sidebar } from './components/Sidebar'
+import { NoteList } from './components/NoteList'
+import { Editor } from './components/Editor'
+import { ResizeHandle } from './components/ResizeHandle'
+import { CreateNoteDialog } from './components/CreateNoteDialog'
+import { CreateTypeDialog } from './components/CreateTypeDialog'
+import { QuickOpenPalette } from './components/QuickOpenPalette'
+import { Toast } from './components/Toast'
+import { CommitDialog } from './components/CommitDialog'
+import { StatusBar } from './components/StatusBar'
+import { useVaultLoader } from './hooks/useVaultLoader'
+import { useNoteActions } from './hooks/useNoteActions'
+import { useAppKeyboard } from './hooks/useAppKeyboard'
+import { isTauri } from './mock-tauri'
+import { useKeyboardNavigation } from './hooks/useKeyboardNavigation'
+import type { SidebarSelection, GitCommit } from './types'
+import './App.css'
+ 
+// Type declaration for mock content storage
+declare global {
+  interface Window {
+    __mockContent?: Record<string, string>
+  }
+}
+ 
+const DEFAULT_SELECTION: SidebarSelection = { kind: 'filter', filter: 'all' }
+ 
+// In web/browser mode: only Demo v2 (no real vault access)
+// In native Tauri mode: Demo v2 + real Laputa vault
+const VAULTS = isTauri()
+  ? [
+      { label: 'Demo v2', path: '/Users/luca/Workspace/laputa-app/demo-vault-v2' },
+      { label: 'Laputa', path: '/Users/luca/Laputa' },
+    ]
+  : [
+      { label: 'Demo v2', path: '/Users/luca/Workspace/laputa-app/demo-vault-v2' },
+    ]
+ 
+const BUILT_IN_TYPE_NAMES = new Set([
+  'Project', 'Experiment', 'Responsibility', 'Procedure',
+  'Person', 'Event', 'Topic', 'Type', 'Note', 'Essay',
+  'Quarter', 'Journal', 'Evergreen',
+])
+ 
+function App() {
+  const [selection, setSelection] = useState<SidebarSelection>(DEFAULT_SELECTION)
+  const [sidebarWidth, setSidebarWidth] = useState(250)
+  const [noteListWidth, setNoteListWidth] = useState(300)
+  const [inspectorWidth, setInspectorWidth] = useState(280)
+  const [inspectorCollapsed, setInspectorCollapsed] = useState(false)
+  const [gitHistory, setGitHistory] = useState<GitCommit[]>([])
+  const [showCreateDialog, setShowCreateDialog] = useState(false)
+  const [createNoteDefaultType, setCreateNoteDefaultType] = useState<string | undefined>()
+  const [showCreateTypeDialog, setShowCreateTypeDialog] = useState(false)
+  const [showQuickOpen, setShowQuickOpen] = useState(false)
+  const [showCommitDialog, setShowCommitDialog] = useState(false)
+  const [toastMessage, setToastMessage] = useState<string | null>(null)
+  const [vaultPath, setVaultPath] = useState(VAULTS[0].path)
+  const [showAIChat, setShowAIChat] = useState(false)
+ 
+  const vault = useVaultLoader(vaultPath)
+  const notes = useNoteActions(vault.addEntry, vault.updateContent, vault.entries, setToastMessage)
+ 
+  // Derive custom types from vault (Type entries not in built-in list)
+  const customTypes = useMemo(
+    () => vault.entries
+      .filter((e) => e.isA === 'Type' && !BUILT_IN_TYPE_NAMES.has(e.title))
+      .map((e) => e.title)
+      .sort(),
+    [vault.entries],
+  )
+ 
+  // Reset UI state when vault changes
+  const handleSwitchVault = useCallback((path: string) => {
+    setVaultPath(path)
+    setSelection(DEFAULT_SELECTION)
+    setGitHistory([])
+    notes.closeAllTabs()
+  }, [notes])
+ 
+  // Load git history when active tab changes
+  useEffect(() => {
+    Eif (!notes.activeTabPath) {
+      setGitHistory([])
+      return
+    }
+    vault.loadGitHistory(notes.activeTabPath).then(setGitHistory)
+  }, [notes.activeTabPath, vault.loadGitHistory])
+ 
+  const openCreateDialog = useCallback((type?: string) => {
+    setCreateNoteDefaultType(type)
+    setShowCreateDialog(true)
+  }, [])
+ 
+  const openCreateTypeDialog = useCallback(() => {
+    setShowCreateTypeDialog(true)
+  }, [])
+ 
+  const handleCreateType = useCallback((name: string) => {
+    notes.handleCreateType(name)
+    setToastMessage(`Type "${name}" created`)
+  }, [notes, setToastMessage])
+ 
+  const handleCustomizeType = useCallback((typeName: string, icon: string, color: string) => {
+    const typeEntry = vault.entries.find((e) => e.isA === 'Type' && e.title === typeName)
+    if (!typeEntry) return
+    // Update icon and color in frontmatter (two separate calls)
+    notes.handleUpdateFrontmatter(typeEntry.path, 'icon', icon)
+    notes.handleUpdateFrontmatter(typeEntry.path, 'color', color)
+    // Also update the entry in-memory for instant UI feedback
+    vault.updateEntry(typeEntry.path, { icon, color })
+  }, [vault, notes])
+ 
+  const handleTrashNote = useCallback(async (path: string) => {
+    const now = new Date().toISOString().slice(0, 10)
+    await notes.handleUpdateFrontmatter(path, 'trashed', true)
+    await notes.handleUpdateFrontmatter(path, 'trashed_at', now)
+    vault.updateEntry(path, { trashed: true, trashedAt: Date.now() / 1000 })
+    setToastMessage('Note moved to trash')
+  }, [notes, vault, setToastMessage])
+ 
+  const handleRestoreNote = useCallback(async (path: string) => {
+    await notes.handleUpdateFrontmatter(path, 'trashed', false)
+    await notes.handleDeleteProperty(path, 'trashed_at')
+    vault.updateEntry(path, { trashed: false, trashedAt: null })
+    setToastMessage('Note restored from trash')
+  }, [notes, vault, setToastMessage])
+ 
+  const handleArchiveNote = useCallback(async (path: string) => {
+    await notes.handleUpdateFrontmatter(path, 'archived', true)
+    vault.updateEntry(path, { archived: true })
+    setToastMessage('Note archived')
+  }, [notes, vault, setToastMessage])
+ 
+  const handleUnarchiveNote = useCallback(async (path: string) => {
+    await notes.handleUpdateFrontmatter(path, 'archived', false)
+    vault.updateEntry(path, { archived: false })
+    setToastMessage('Note unarchived')
+  }, [notes, vault, setToastMessage])
+ 
+  const handleReorderSections = useCallback((orderedTypes: { typeName: string; order: number }[]) => {
+    for (const { typeName, order } of orderedTypes) {
+      const typeEntry = vault.entries.find((e) => e.isA === 'Type' && e.title === typeName)
+      if (!typeEntry) continue
+      notes.handleUpdateFrontmatter(typeEntry.path, 'order', order)
+      vault.updateEntry(typeEntry.path, { order })
+    }
+  }, [vault, notes])
+ 
+  useAppKeyboard({
+    onQuickOpen: () => setShowQuickOpen(true),
+    onCreateNote: openCreateDialog,
+    onSave: () => setToastMessage('Saved'),
+    onTrashNote: handleTrashNote,
+    onArchiveNote: handleArchiveNote,
+    activeTabPathRef: notes.activeTabPathRef,
+    handleCloseTabRef: notes.handleCloseTabRef,
+  })
+ 
+  useKeyboardNavigation({
+    tabs: notes.tabs,
+    activeTabPath: notes.activeTabPath,
+    entries: vault.entries,
+    selection,
+    allContent: vault.allContent,
+    onSwitchTab: notes.handleSwitchTab,
+    onReplaceActiveTab: notes.handleReplaceActiveTab,
+    onSelectNote: notes.handleSelectNote,
+  })
+ 
+  const handleSidebarResize = useCallback((delta: number) => {
+    setSidebarWidth((w) => Math.max(150, Math.min(400, w + delta)))
+  }, [])
+ 
+  const handleNoteListResize = useCallback((delta: number) => {
+    setNoteListWidth((w) => Math.max(200, Math.min(500, w + delta)))
+  }, [])
+ 
+  const handleInspectorResize = useCallback((delta: number) => {
+    setInspectorWidth((w) => Math.max(200, Math.min(500, w - delta)))
+  }, [])
+ 
+  const handleCommitPush = useCallback(async (message: string) => {
+    setShowCommitDialog(false)
+    try {
+      const result = await vault.commitAndPush(message)
+      setToastMessage(result)
+      vault.loadModifiedFiles()
+    } catch (err) {
+      console.error('Commit failed:', err)
+      setToastMessage(`Commit failed: ${err}`)
+    }
+  }, [vault])
+ 
+  const activeTab = notes.tabs.find((t) => t.entry.path === notes.activeTabPath) ?? null
+ 
+  return (
+    <div className="app-shell">
+      <div className="app">
+        <div className="app__sidebar" style={{ width: sidebarWidth }}>
+          <Sidebar entries={vault.entries} selection={selection} onSelect={setSelection} onSelectNote={notes.handleSelectNote} onCreateType={openCreateDialog} onCreateNewType={openCreateTypeDialog} onCustomizeType={handleCustomizeType} onReorderSections={handleReorderSections} modifiedCount={vault.modifiedFiles.length} onCommitPush={() => setShowCommitDialog(true)} />
+        </div>
+        <ResizeHandle onResize={handleSidebarResize} />
+        <div className="app__note-list" style={{ width: noteListWidth }}>
+          <NoteList entries={vault.entries} selection={selection} selectedNote={activeTab?.entry ?? null} allContent={vault.allContent} modifiedFiles={vault.modifiedFiles} onSelectNote={notes.handleSelectNote} onCreateNote={openCreateDialog} />
+        </div>
+        <ResizeHandle onResize={handleNoteListResize} />
+        <div className="app__editor">
+          <Editor
+            tabs={notes.tabs}
+            activeTabPath={notes.activeTabPath}
+            entries={vault.entries}
+            onSwitchTab={notes.handleSwitchTab}
+            onCloseTab={notes.handleCloseTab}
+            onReorderTabs={notes.handleReorderTabs}
+            onNavigateWikilink={notes.handleNavigateWikilink}
+            onLoadDiff={vault.loadDiff}
+            onLoadDiffAtCommit={vault.loadDiffAtCommit}
+            isModified={vault.isFileModified}
+            onCreateNote={openCreateDialog}
+            inspectorCollapsed={inspectorCollapsed}
+            onToggleInspector={() => setInspectorCollapsed((c) => !c)}
+            inspectorWidth={inspectorWidth}
+            onInspectorResize={handleInspectorResize}
+            inspectorEntry={activeTab?.entry ?? null}
+            inspectorContent={activeTab?.content ?? null}
+            allContent={vault.allContent}
+            gitHistory={gitHistory}
+            onUpdateFrontmatter={notes.handleUpdateFrontmatter}
+            onDeleteProperty={notes.handleDeleteProperty}
+            onAddProperty={notes.handleAddProperty}
+            showAIChat={showAIChat}
+            onToggleAIChat={() => setShowAIChat(c => !c)}
+            vaultPath={vaultPath}
+            onTrashNote={handleTrashNote}
+            onRestoreNote={handleRestoreNote}
+            onArchiveNote={handleArchiveNote}
+            onUnarchiveNote={handleUnarchiveNote}
+          />
+        </div>
+      </div>
+      <StatusBar noteCount={vault.entries.length} vaultPath={vaultPath} vaults={VAULTS} onSwitchVault={handleSwitchVault} />
+      <Toast message={toastMessage} onDismiss={() => setToastMessage(null)} />
+      <QuickOpenPalette
+        open={showQuickOpen}
+        entries={vault.entries}
+        onSelect={notes.handleSelectNote}
+        onClose={() => setShowQuickOpen(false)}
+      />
+      <CreateNoteDialog
+        open={showCreateDialog}
+        onClose={() => setShowCreateDialog(false)}
+        onCreate={notes.handleCreateNote}
+        defaultType={createNoteDefaultType}
+        customTypes={customTypes}
+      />
+      <CreateTypeDialog
+        open={showCreateTypeDialog}
+        onClose={() => setShowCreateTypeDialog(false)}
+        onCreate={handleCreateType}
+      />
+      <CommitDialog
+        open={showCommitDialog}
+        modifiedCount={vault.modifiedFiles.length}
+        onCommit={handleCommitPush}
+        onClose={() => setShowCommitDialog(false)}
+      />
+    </div>
+  )
+}
+ 
+export default App
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/AIChatPanel.tsx.html b/coverage/src/components/AIChatPanel.tsx.html new file mode 100644 index 00000000..f8eeca41 --- /dev/null +++ b/coverage/src/components/AIChatPanel.tsx.html @@ -0,0 +1,1288 @@ + + + + + + Code coverage report for src/components/AIChatPanel.tsx + + + + + + + + + +
+
+

All files / src/components AIChatPanel.tsx

+
+ +
+ 1.17% + Statements + 1/85 +
+ + +
+ 0% + Branches + 0/49 +
+ + +
+ 0% + Functions + 0/55 +
+ + +
+ 1.47% + Lines + 1/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useRef, useEffect, useMemo } from 'react'
+import type { VaultEntry } from '../types'
+import {
+  X, Plus, PaperPlaneRight, Copy, ArrowClockwise,
+  TextIndent, Sparkle, Key, MagnifyingGlass, Minus,
+} from '@phosphor-icons/react'
+import {
+  type ChatMessage, getApiKey, setApiKey,
+  buildSystemPrompt, MODEL_OPTIONS,
+} from '../utils/ai-chat'
+import { useAIChat } from '../hooks/useAIChat'
+ 
+// --- Sub-components ---
+ 
+interface AIChatPanelProps {
+  entry: VaultEntry | null
+  allContent: Record<string, string>
+  entries?: VaultEntry[]
+  onClose: () => void
+}
+ 
+function TypingIndicator() {
+  return (
+    <div className="flex items-start gap-2" style={{ padding: '8px 12px' }}>
+      <div style={{ display: 'flex', gap: 4, padding: '10px 0' }}>
+        <span className="typing-dot" />
+        <span className="typing-dot" style={{ animationDelay: '0.2s' }} />
+        <span className="typing-dot" style={{ animationDelay: '0.4s' }} />
+      </div>
+    </div>
+  )
+}
+ 
+function ContextPill({ note, onRemove }: { note: VaultEntry; onRemove: () => void }) {
+  return (
+    <span
+      className="flex items-center gap-1"
+      style={{
+        background: 'var(--accent-green-light)',
+        borderRadius: 99, fontSize: 11,
+        padding: '2px 6px 2px 8px', color: 'var(--foreground)', maxWidth: 160,
+      }}
+    >
+      <span className="truncate">{note.title}</span>
+      <button
+        className="flex items-center justify-center shrink-0 border-none bg-transparent p-0 cursor-pointer text-muted-foreground hover:text-foreground"
+        onClick={onRemove} title={`Remove ${note.title}`}
+      >
+        <Minus size={10} weight="bold" />
+      </button>
+    </span>
+  )
+}
+ 
+function ContextSearchDropdown({
+  entries, contextPaths, onAdd, onClose,
+}: {
+  entries: VaultEntry[]; contextPaths: Set<string>
+  onAdd: (entry: VaultEntry) => void; onClose: () => void
+}) {
+  const [query, setQuery] = useState('')
+  const inputRef = useRef<HTMLInputElement>(null)
+  useEffect(() => { inputRef.current?.focus() }, [])
+ 
+  const filtered = useMemo(() => {
+    const q = query.toLowerCase()
+    return entries
+      .filter(e => !contextPaths.has(e.path))
+      .filter(e => !q || e.title.toLowerCase().includes(q) || (e.isA ?? '').toLowerCase().includes(q))
+      .slice(0, 8)
+  }, [entries, contextPaths, query])
+ 
+  return (
+    <div className="absolute left-0 right-0 bg-background border border-border rounded shadow-lg z-10"
+      style={{ top: '100%', maxHeight: 240, overflow: 'hidden' }}>
+      <div className="flex items-center gap-1 border-b border-border" style={{ padding: '4px 8px' }}>
+        <MagnifyingGlass size={12} className="text-muted-foreground shrink-0" />
+        <input ref={inputRef} value={query} onChange={e => setQuery(e.target.value)}
+          onKeyDown={e => e.key === 'Escape' && onClose()} placeholder="Search notes..."
+          className="flex-1 border-none bg-transparent text-foreground outline-none"
+          style={{ fontSize: 12, padding: '2px 0' }} />
+      </div>
+      <div style={{ overflow: 'auto', maxHeight: 200 }}>
+        {filtered.map(entry => (
+          <button key={entry.path}
+            className="flex items-center gap-2 w-full text-left border-none bg-transparent cursor-pointer hover:bg-accent text-foreground"
+            style={{ padding: '6px 10px', fontSize: 12 }}
+            onClick={() => { onAdd(entry); onClose() }}>
+            <span className="text-muted-foreground" style={{ fontSize: 10, minWidth: 60 }}>{entry.isA ?? 'Note'}</span>
+            <span className="truncate">{entry.title}</span>
+          </button>
+        ))}
+        {filtered.length === 0 && (
+          <div className="text-muted-foreground text-center" style={{ padding: 12, fontSize: 12 }}>No matching notes</div>
+        )}
+      </div>
+    </div>
+  )
+}
+ 
+function ApiKeyDialog({ onClose }: { onClose: () => void }) {
+  const [key, setKey] = useState(getApiKey())
+  return (
+    <div className="fixed inset-0 flex items-center justify-center z-50" style={{ background: 'rgba(0,0,0,0.4)' }}>
+      <div className="bg-background border border-border rounded-lg shadow-xl" style={{ width: 400, padding: 20 }}>
+        <h3 className="text-foreground" style={{ fontSize: 14, fontWeight: 600, margin: '0 0 12px' }}>Anthropic API Key</h3>
+        <p className="text-muted-foreground" style={{ fontSize: 12, margin: '0 0 12px', lineHeight: 1.5 }}>
+          Enter your Anthropic API key. Stored locally in your browser.
+        </p>
+        <input type="password" value={key} onChange={e => setKey(e.target.value)} placeholder="sk-ant-..."
+          className="w-full border border-border bg-transparent text-foreground rounded"
+          style={{ fontSize: 13, padding: '8px 10px', outline: 'none', marginBottom: 12 }} />
+        <div className="flex justify-end gap-2">
+          <button className="border border-border bg-transparent text-foreground rounded cursor-pointer hover:bg-accent"
+            style={{ fontSize: 12, padding: '6px 14px' }} onClick={onClose}>Cancel</button>
+          <button className="border-none rounded cursor-pointer"
+            style={{ fontSize: 12, padding: '6px 14px', background: 'var(--primary)', color: 'white' }}
+            onClick={() => { setApiKey(key); onClose() }}>Save</button>
+        </div>
+      </div>
+    </div>
+  )
+}
+ 
+function AssistantMessage({ msg, onRetry }: { msg: ChatMessage; onRetry: () => void }) {
+  return (
+    <div>
+      <div style={{ fontSize: 13, lineHeight: 1.6, whiteSpace: 'pre-wrap' }}
+        dangerouslySetInnerHTML={{
+          __html: msg.content.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>').replace(/\n/g, '<br/>'),
+        }} />
+      <div className="flex items-center gap-3" style={{ marginTop: 4 }}>
+        <button className="border-none bg-transparent p-0 text-muted-foreground cursor-pointer hover:underline"
+          style={{ fontSize: 11 }} onClick={() => navigator.clipboard.writeText(msg.content)}>
+          <Copy size={12} style={{ marginRight: 3, verticalAlign: 'middle' }} />Copy
+        </button>
+        <button className="border-none bg-transparent p-0 text-muted-foreground cursor-pointer hover:underline"
+          style={{ fontSize: 11 }} onClick={onRetry}>
+          <ArrowClockwise size={12} style={{ marginRight: 3, verticalAlign: 'middle' }} />Retry
+        </button>
+        <button className="border-none bg-transparent p-0 text-muted-foreground cursor-pointer hover:underline"
+          style={{ fontSize: 11 }}>
+          <TextIndent size={12} style={{ marginRight: 3, verticalAlign: 'middle' }} />Insert
+        </button>
+      </div>
+    </div>
+  )
+}
+ 
+function StreamingContent({ content }: { content: string }) {
+  return (
+    <div style={{ marginBottom: 12 }}>
+      <div style={{ fontSize: 13, lineHeight: 1.6, whiteSpace: 'pre-wrap' }}
+        dangerouslySetInnerHTML={{
+          __html: content.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>').replace(/\n/g, '<br/>'),
+        }} />
+    </div>
+  )
+}
+ 
+function UserBubble({ content }: { content: string }) {
+  return (
+    <div className="flex justify-end">
+      <div style={{
+        background: 'var(--primary)', color: 'white',
+        borderRadius: '12px 12px 2px 12px', maxWidth: '85%',
+        padding: '8px 12px', fontSize: 13, lineHeight: 1.5, whiteSpace: 'pre-wrap',
+      }}>{content}</div>
+    </div>
+  )
+}
+ 
+function formatTokens(n: number): string {
+  return n < 1000 ? String(n) : `${(n / 1000).toFixed(1)}k`
+}
+ 
+const QUICK_ACTIONS = [
+  { label: 'Summarize', message: 'Summarize this note' },
+  { label: 'Expand', message: 'Expand this note with more detail' },
+  { label: 'Fix grammar', message: 'Fix grammar and improve readability' },
+]
+ 
+// --- Context management hook ---
+ 
+function useContextNotes(entry: VaultEntry | null) {
+  const [contextNotes, setContextNotes] = useState<VaultEntry[]>([])
+ 
+  useEffect(() => {
+    if (entry) {
+      setContextNotes(prev => prev.some(n => n.path === entry.path) ? prev : [entry, ...prev])
+    }
+  }, [entry?.path]) // eslint-disable-line react-hooks/exhaustive-deps
+ 
+  const addNote = (note: VaultEntry) => {
+    setContextNotes(prev => prev.some(n => n.path === note.path) ? prev : [...prev, note])
+  }
+  const removeNote = (path: string) => {
+    setContextNotes(prev => prev.filter(n => n.path !== path))
+  }
+  const paths = useMemo(() => new Set(contextNotes.map(n => n.path)), [contextNotes])
+ 
+  return { contextNotes, addNote, removeNote, paths }
+}
+ 
+// --- Main component ---
+ 
+export function AIChatPanel({ entry, allContent, entries = [], onClose }: AIChatPanelProps) {
+  const [input, setInput] = useState('')
+  const [model, setModel] = useState<string>(MODEL_OPTIONS[0].value)
+  const [showSearch, setShowSearch] = useState(false)
+  const [showApiKeyDialog, setShowApiKeyDialog] = useState(false)
+  const messagesEndRef = useRef<HTMLDivElement>(null)
+ 
+  const ctx = useContextNotes(entry)
+  const chat = useAIChat(entry, allContent, ctx.contextNotes, model)
+ 
+  const contextInfo = useMemo(
+    () => buildSystemPrompt(ctx.contextNotes, allContent, model),
+    [ctx.contextNotes, allContent, model],
+  )
+ 
+  useEffect(() => {
+    messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })
+  }, [chat.messages, chat.isStreaming, chat.streamingContent])
+ 
+  const handleSend = () => { chat.sendMessage(input); setInput('') }
+ 
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend() }
+  }
+ 
+  return (
+    <aside className="flex flex-1 flex-col overflow-hidden border-l border-border bg-background text-foreground">
+      <PanelHeader onApiKey={() => setShowApiKeyDialog(true)} onClear={chat.clearConversation} onClose={onClose} />
+ 
+      <ContextBar
+        notes={ctx.contextNotes} entries={entries} contextPaths={ctx.paths}
+        tokenCount={contextInfo.totalTokens} truncated={contextInfo.truncated}
+        showSearch={showSearch} onToggleSearch={() => setShowSearch(!showSearch)}
+        onAdd={ctx.addNote} onRemove={ctx.removeNote} onCloseSearch={() => setShowSearch(false)}
+      />
+ 
+      <MessageList
+        messages={chat.messages} isStreaming={chat.isStreaming}
+        streamingContent={chat.streamingContent} onRetry={chat.retryMessage}
+        messagesEndRef={messagesEndRef}
+      />
+ 
+      <QuickActionsBar actions={QUICK_ACTIONS} disabled={chat.isStreaming}
+        onAction={msg => { chat.sendMessage(msg); setInput('') }} />
+ 
+      <InputArea model={model} onModelChange={setModel} input={input} onInputChange={setInput}
+        onKeyDown={handleKeyDown} onSend={handleSend} disabled={chat.isStreaming || !input.trim()} />
+ 
+      {showApiKeyDialog && <ApiKeyDialog onClose={() => setShowApiKeyDialog(false)} />}
+ 
+      <style>{`
+        .typing-dot {
+          width: 6px; height: 6px; border-radius: 50%;
+          background: var(--muted-foreground);
+          animation: typing-bounce 1.2s infinite ease-in-out;
+        }
+        @keyframes typing-bounce {
+          0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); }
+          40% { opacity: 1; transform: scale(1); }
+        }
+      `}</style>
+    </aside>
+  )
+}
+ 
+// --- Extracted layout sections ---
+ 
+function PanelHeader({ onApiKey, onClear, onClose }: { onApiKey: () => void; onClear: () => void; onClose: () => void }) {
+  return (
+    <div className="flex shrink-0 items-center border-b border-border" style={{ height: 45, padding: '0 12px', gap: 8 }}>
+      <Sparkle size={16} className="shrink-0 text-muted-foreground" />
+      <span className="flex-1 text-muted-foreground" style={{ fontSize: 13, fontWeight: 600 }}>AI Chat</span>
+      <button className="shrink-0 border-none bg-transparent p-1 text-muted-foreground cursor-pointer hover:text-foreground transition-colors"
+        onClick={onApiKey} title="API Key settings">
+        <Key size={14} weight={getApiKey() ? 'fill' : 'regular'} />
+      </button>
+      <button className="shrink-0 border-none bg-transparent p-1 text-muted-foreground cursor-pointer hover:text-foreground transition-colors"
+        onClick={onClear} title="New conversation"><Plus size={16} /></button>
+      <button className="shrink-0 border-none bg-transparent p-1 text-muted-foreground cursor-pointer hover:text-foreground transition-colors"
+        onClick={onClose} title="Close AI Chat"><X size={16} /></button>
+    </div>
+  )
+}
+ 
+function ContextBar({
+  notes, entries, contextPaths, tokenCount, truncated,
+  showSearch, onToggleSearch, onAdd, onRemove, onCloseSearch,
+}: {
+  notes: VaultEntry[]; entries: VaultEntry[]; contextPaths: Set<string>
+  tokenCount: number; truncated: boolean
+  showSearch: boolean; onToggleSearch: () => void
+  onAdd: (note: VaultEntry) => void; onRemove: (path: string) => void; onCloseSearch: () => void
+}) {
+  return (
+    <div className="relative flex shrink-0 flex-wrap items-center gap-1.5 border-b border-border" style={{ padding: '6px 12px' }}>
+      {notes.map(note => (
+        <ContextPill key={note.path} note={note} onRemove={() => onRemove(note.path)} />
+      ))}
+      <button
+        className="flex items-center gap-0.5 border border-dashed border-border bg-transparent text-muted-foreground cursor-pointer hover:text-foreground rounded-full"
+        style={{ fontSize: 11, padding: '2px 8px' }} onClick={onToggleSearch} title="Add note to context">
+        <Plus size={10} weight="bold" /><span>Add</span>
+      </button>
+      {notes.length > 0 && (
+        <span className="text-muted-foreground ml-auto" style={{ fontSize: 10 }}>
+          ~{formatTokens(tokenCount)} tokens{truncated && ' (truncated)'}
+        </span>
+      )}
+      {showSearch && (
+        <ContextSearchDropdown entries={entries} contextPaths={contextPaths} onAdd={onAdd} onClose={onCloseSearch} />
+      )}
+    </div>
+  )
+}
+ 
+function MessageList({
+  messages, isStreaming, streamingContent, onRetry, messagesEndRef,
+}: {
+  messages: ChatMessage[]; isStreaming: boolean; streamingContent: string
+  onRetry: (idx: number) => void; messagesEndRef: React.RefObject<HTMLDivElement | null>
+}) {
+  return (
+    <div className="flex-1 overflow-y-auto" style={{ padding: 12 }}>
+      {messages.length === 0 && !isStreaming && (
+        <div className="flex flex-col items-center justify-center text-center text-muted-foreground" style={{ paddingTop: 40 }}>
+          <Sparkle size={24} style={{ marginBottom: 8, opacity: 0.5 }} />
+          <p style={{ fontSize: 13, margin: '0 0 4px' }}>Ask anything about your notes</p>
+          <p style={{ fontSize: 11, margin: 0, opacity: 0.6 }}>
+            {getApiKey() ? 'Connected to Anthropic API' : 'Set API key for real AI responses'}
+          </p>
+        </div>
+      )}
+      {messages.map((msg, idx) => (
+        <div key={msg.id} style={{ marginBottom: 12 }}>
+          {msg.role === 'user'
+            ? <UserBubble content={msg.content} />
+            : <AssistantMessage msg={msg} onRetry={() => onRetry(idx)} />}
+        </div>
+      ))}
+      {isStreaming && streamingContent && <StreamingContent content={streamingContent} />}
+      {isStreaming && !streamingContent && <TypingIndicator />}
+      <div ref={messagesEndRef} />
+    </div>
+  )
+}
+ 
+function QuickActionsBar({
+  actions, disabled, onAction,
+}: {
+  actions: { label: string; message: string }[]; disabled: boolean; onAction: (msg: string) => void
+}) {
+  return (
+    <div className="flex shrink-0 flex-wrap items-center gap-1.5 border-t border-border" style={{ padding: '8px 12px' }}>
+      {actions.map(a => (
+        <button key={a.label}
+          className="cursor-pointer bg-transparent text-foreground hover:bg-accent transition-colors"
+          style={{ fontSize: 11, border: '1px solid var(--border)', borderRadius: 99, padding: '3px 10px' }}
+          onClick={() => onAction(a.message)} disabled={disabled}>
+          {a.label}
+        </button>
+      ))}
+    </div>
+  )
+}
+ 
+function InputArea({
+  model, onModelChange, input, onInputChange, onKeyDown, onSend, disabled,
+}: {
+  model: string; onModelChange: (m: string) => void
+  input: string; onInputChange: (v: string) => void
+  onKeyDown: (e: React.KeyboardEvent) => void; onSend: () => void; disabled: boolean
+}) {
+  return (
+    <div className="flex shrink-0 flex-col border-t border-border" style={{ padding: '8px 12px' }}>
+      <div style={{ marginBottom: 6 }}>
+        <select value={model} onChange={e => onModelChange(e.target.value)}
+          className="border border-border bg-transparent text-muted-foreground"
+          style={{ fontSize: 11, borderRadius: 4, padding: '2px 6px', outline: 'none' }}>
+          {MODEL_OPTIONS.map(opt => <option key={opt.value} value={opt.value}>{opt.label}</option>)}
+        </select>
+      </div>
+      <div className="flex items-end gap-2">
+        <textarea value={input} onChange={e => onInputChange(e.target.value)} onKeyDown={onKeyDown}
+          placeholder="Ask about your notes..." rows={1}
+          className="flex-1 resize-none border border-border bg-transparent text-foreground"
+          style={{ fontSize: 13, borderRadius: 8, padding: '8px 10px', outline: 'none', lineHeight: 1.4, maxHeight: 100, fontFamily: 'inherit' }} />
+        <button className="shrink-0 flex items-center justify-center border-none cursor-pointer transition-colors"
+          style={{ background: 'var(--primary)', color: 'white', borderRadius: 8, width: 32, height: 34 }}
+          onClick={onSend} disabled={disabled} title="Send message">
+          <PaperPlaneRight size={16} />
+        </button>
+      </div>
+    </div>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/BreadcrumbBar.tsx.html b/coverage/src/components/BreadcrumbBar.tsx.html new file mode 100644 index 00000000..6d4a8596 --- /dev/null +++ b/coverage/src/components/BreadcrumbBar.tsx.html @@ -0,0 +1,616 @@ + + + + + + Code coverage report for src/components/BreadcrumbBar.tsx + + + + + + + + + +
+
+

All files / src/components BreadcrumbBar.tsx

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 69.23% + Branches + 18/26 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { memo } from 'react'
+import type { VaultEntry } from '../types'
+import { cn } from '@/lib/utils'
+import {
+  MagnifyingGlass,
+  GitBranch,
+  CursorText,
+  Sparkle,
+  SlidersHorizontal,
+  DotsThree,
+  Trash,
+  ArrowCounterClockwise,
+  Archive,
+  ArrowUUpLeft,
+} from '@phosphor-icons/react'
+ 
+interface BreadcrumbBarProps {
+  entry: VaultEntry
+  wordCount: number
+  isModified: boolean
+  showDiffToggle: boolean
+  diffMode: boolean
+  diffLoading: boolean
+  onToggleDiff: () => void
+  showAIChat?: boolean
+  onToggleAIChat?: () => void
+  inspectorCollapsed?: boolean
+  onToggleInspector?: () => void
+  onTrash?: () => void
+  onRestore?: () => void
+  onArchive?: () => void
+  onUnarchive?: () => void
+}
+ 
+const DISABLED_ICON_STYLE = { opacity: 0.4, cursor: 'not-allowed' } as const
+ 
+function BreadcrumbActions({ entry, showDiffToggle, diffMode, diffLoading, onToggleDiff,
+  showAIChat, onToggleAIChat, inspectorCollapsed, onToggleInspector,
+  onTrash, onRestore, onArchive, onUnarchive,
+}: Omit<BreadcrumbBarProps, 'wordCount' | 'isModified'>) {
+  return (
+    <div className="flex items-center" style={{ gap: 12 }}>
+      <button
+        className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground cursor-pointer hover:text-foreground transition-colors"
+        title="Search in file"
+      >
+        <MagnifyingGlass size={16} />
+      </button>
+      {showDiffToggle ? (
+        <button
+          className={cn(
+            "flex items-center justify-center border-none bg-transparent p-0 cursor-pointer transition-colors",
+            diffMode ? "text-foreground" : "text-muted-foreground hover:text-foreground"
+          )}
+          onClick={onToggleDiff}
+          disabled={diffLoading}
+          title={diffLoading ? 'Loading diff...' : diffMode ? 'Back to editor' : 'Show diff'}
+        >
+          <GitBranch size={16} />
+        </button>
+      ) : (
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground"
+          style={DISABLED_ICON_STYLE}
+          title="No changes"
+          tabIndex={-1}
+        >
+          <GitBranch size={16} />
+        </button>
+      )}
+      <button
+        className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground"
+        style={DISABLED_ICON_STYLE}
+        title="Coming soon"
+        tabIndex={-1}
+      >
+        <CursorText size={16} />
+      </button>
+      <button
+        className={cn(
+          "flex items-center justify-center border-none bg-transparent p-0 cursor-pointer transition-colors",
+          showAIChat ? "" : "text-muted-foreground hover:text-foreground"
+        )}
+        style={showAIChat ? { color: 'var(--primary)' } : undefined}
+        onClick={onToggleAIChat}
+        title={showAIChat ? 'Close AI Chat' : 'Open AI Chat'}
+      >
+        <Sparkle size={16} weight={showAIChat ? 'fill' : 'regular'} />
+      </button>
+      {entry.archived ? (
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 cursor-pointer transition-colors text-muted-foreground hover:text-foreground"
+          onClick={onUnarchive}
+          title="Unarchive (Cmd+E)"
+        >
+          <ArrowUUpLeft size={16} />
+        </button>
+      ) : (
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 cursor-pointer transition-colors text-muted-foreground hover:text-foreground"
+          onClick={onArchive}
+          title="Archive (Cmd+E)"
+        >
+          <Archive size={16} />
+        </button>
+      )}
+      {entry.trashed ? (
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 cursor-pointer transition-colors text-muted-foreground hover:text-foreground"
+          onClick={onRestore}
+          title="Restore from trash"
+        >
+          <ArrowCounterClockwise size={16} />
+        </button>
+      ) : (
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 cursor-pointer transition-colors text-muted-foreground hover:text-destructive"
+          onClick={onTrash}
+          title="Move to trash (Cmd+Delete)"
+        >
+          <Trash size={16} />
+        </button>
+      )}
+      {inspectorCollapsed && (
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground cursor-pointer hover:text-foreground transition-colors"
+          onClick={onToggleInspector}
+          title="Open Properties"
+        >
+          <SlidersHorizontal size={16} />
+        </button>
+      )}
+      <button
+        className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground"
+        style={DISABLED_ICON_STYLE}
+        title="Coming soon"
+        tabIndex={-1}
+      >
+        <DotsThree size={16} />
+      </button>
+    </div>
+  )
+}
+ 
+export const BreadcrumbBar = memo(function BreadcrumbBar({
+  entry, wordCount, isModified, ...actionProps
+}: BreadcrumbBarProps) {
+  return (
+    <div
+      className="flex shrink-0 items-center justify-between"
+      style={{
+        height: 45,
+        background: 'var(--background)',
+        borderBottom: '1px solid var(--border)',
+        padding: '6px 16px',
+      }}
+    >
+      {/* Left: breadcrumb */}
+      <div className="flex items-center gap-1" style={{ fontSize: 12 }}>
+        <span className="text-muted-foreground">{entry.isA || 'Note'}</span>
+        <span className="text-muted-foreground" style={{ margin: '0 2px' }}>&rsaquo;</span>
+        <span className="font-medium text-foreground">{entry.title}</span>
+        <span className="text-muted-foreground" style={{ margin: '0 4px' }}>&middot;</span>
+        <span className="text-muted-foreground">{wordCount.toLocaleString()} words</span>
+        {isModified && (
+          <>
+            <span className="text-muted-foreground" style={{ margin: '0 4px' }}>&middot;</span>
+            <span className="font-semibold" style={{ color: 'var(--accent-yellow)' }}>M</span>
+          </>
+        )}
+      </div>
+ 
+      {/* Right: action icons */}
+      <BreadcrumbActions entry={entry} {...actionProps} />
+    </div>
+  )
+})
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/CommitDialog.tsx.html b/coverage/src/components/CommitDialog.tsx.html new file mode 100644 index 00000000..db76804f --- /dev/null +++ b/coverage/src/components/CommitDialog.tsx.html @@ -0,0 +1,304 @@ + + + + + + Code coverage report for src/components/CommitDialog.tsx + + + + + + + + + +
+
+

All files / src/components CommitDialog.tsx

+
+ +
+ 31.81% + Statements + 7/22 +
+ + +
+ 13.33% + Branches + 2/15 +
+ + +
+ 28.57% + Functions + 2/7 +
+ + +
+ 36.84% + Lines + 7/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74  +  +  +  +  +  +  +  +  +  +  +  +  +22x +22x +  +22x +7x +  +  +  +  +  +22x +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect, useRef } from 'react'
+import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'
+import { Button } from '@/components/ui/button'
+import { Badge } from '@/components/ui/badge'
+ 
+interface CommitDialogProps {
+  open: boolean
+  modifiedCount: number
+  onCommit: (message: string) => void
+  onClose: () => void
+}
+ 
+export function CommitDialog({ open, modifiedCount, onCommit, onClose }: CommitDialogProps) {
+  const [message, setMessage] = useState('')
+  const inputRef = useRef<HTMLTextAreaElement>(null)
+ 
+  useEffect(() => {
+    Iif (open) {
+      setMessage('')
+      setTimeout(() => inputRef.current?.focus(), 50)
+    }
+  }, [open])
+ 
+  const handleSubmit = () => {
+    const trimmed = message.trim()
+    if (!trimmed) return
+    onCommit(trimmed)
+  }
+ 
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
+      e.preventDefault()
+      handleSubmit()
+    } else if (e.key === 'Escape') {
+      onClose()
+    }
+  }
+ 
+  return (
+    <Dialog open={open} onOpenChange={(isOpen) => { if (!isOpen) onClose() }}>
+      <DialogContent showCloseButton={false} className="sm:max-w-[420px]">
+        <DialogHeader>
+          <div className="flex items-center justify-between">
+            <DialogTitle>Commit & Push</DialogTitle>
+            <Badge variant="secondary" className="text-xs">
+              {modifiedCount} file{modifiedCount !== 1 ? 's' : ''} changed
+            </Badge>
+          </div>
+        </DialogHeader>
+        <textarea
+          ref={inputRef}
+          className="w-full resize-y rounded-lg border border-input bg-[var(--bg-input)] px-3 py-2.5 text-[13px] text-foreground placeholder:text-muted-foreground outline-none transition-colors focus:border-ring"
+          placeholder="Commit message..."
+          value={message}
+          onChange={(e) => setMessage(e.target.value)}
+          onKeyDown={handleKeyDown}
+          rows={3}
+        />
+        <DialogFooter className="flex-row items-center justify-between sm:justify-between">
+          <span className="text-[11px] text-muted-foreground">Cmd+Enter to commit</span>
+          <div className="flex gap-2">
+            <Button variant="outline" onClick={onClose}>
+              Cancel
+            </Button>
+            <Button onClick={handleSubmit} disabled={!message.trim()}>
+              Commit & Push
+            </Button>
+          </div>
+        </DialogFooter>
+      </DialogContent>
+    </Dialog>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/CreateNoteDialog.tsx.html b/coverage/src/components/CreateNoteDialog.tsx.html new file mode 100644 index 00000000..9fd0e92e --- /dev/null +++ b/coverage/src/components/CreateNoteDialog.tsx.html @@ -0,0 +1,442 @@ + + + + + + Code coverage report for src/components/CreateNoteDialog.tsx + + + + + + + + + +
+
+

All files / src/components CreateNoteDialog.tsx

+
+ +
+ 36% + Statements + 9/25 +
+ + +
+ 35.29% + Branches + 6/17 +
+ + +
+ 30% + Functions + 3/10 +
+ + +
+ 40.9% + Lines + 9/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +22x +22x +  +22x +7x +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +176x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useRef, useEffect } from 'react'
+import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+import { cn } from '@/lib/utils'
+ 
+const BUILT_IN_TYPES = [
+  'Note',
+  'Project',
+  'Experiment',
+  'Responsibility',
+  'Procedure',
+  'Person',
+  'Event',
+  'Topic',
+] as const
+ 
+export type NoteType = (typeof BUILT_IN_TYPES)[number]
+ 
+interface CreateNoteDialogProps {
+  open: boolean
+  onClose: () => void
+  onCreate: (title: string, type: string) => void
+  defaultType?: string
+  /** Custom types from the vault (Type documents not in built-in list) */
+  customTypes?: string[]
+}
+ 
+export function CreateNoteDialog({ open, onClose, onCreate, defaultType, customTypes = [] }: CreateNoteDialogProps) {
+  const [title, setTitle] = useState('')
+  const [type, setType] = useState<string>('Note')
+  const inputRef = useRef<HTMLInputElement>(null)
+ 
+  useEffect(() => {
+    Iif (open) {
+      setTitle('')
+      setType(defaultType ?? 'Note')
+      setTimeout(() => inputRef.current?.focus(), 50)
+    }
+  }, [open, defaultType])
+ 
+  const handleSubmit = (e: React.FormEvent) => {
+    e.preventDefault()
+    const trimmed = title.trim()
+    if (!trimmed) return
+    onCreate(trimmed, type)
+    onClose()
+  }
+ 
+  return (
+    <Dialog open={open} onOpenChange={(isOpen) => { if (!isOpen) onClose() }}>
+      <DialogContent showCloseButton={false} className="sm:max-w-[420px]">
+        <DialogHeader>
+          <DialogTitle>Create New Note</DialogTitle>
+        </DialogHeader>
+        <form onSubmit={handleSubmit} className="space-y-4">
+          <div className="space-y-1.5">
+            <label className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
+              Title
+            </label>
+            <Input
+              ref={inputRef}
+              placeholder="Enter note title..."
+              value={title}
+              onChange={(e) => setTitle(e.target.value)}
+            />
+          </div>
+          <div className="space-y-1.5">
+            <label className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
+              Type
+            </label>
+            <div className="flex flex-wrap gap-1.5">
+              {BUILT_IN_TYPES.map((t) => (
+                <Button
+                  key={t}
+                  type="button"
+                  variant={type === t ? 'default' : 'outline'}
+                  size="sm"
+                  className={cn(
+                    "rounded-full text-xs",
+                    type === t && "bg-primary text-primary-foreground"
+                  )}
+                  onClick={() => setType(t)}
+                >
+                  {t}
+                </Button>
+              ))}
+              {customTypes.map((t) => (
+                <Button
+                  key={t}
+                  type="button"
+                  variant={type === t ? 'default' : 'outline'}
+                  size="sm"
+                  className={cn(
+                    "rounded-full text-xs",
+                    type === t
+                      ? "bg-[var(--accent-blue)] text-white"
+                      : "border-[var(--accent-blue)] text-[var(--accent-blue)]"
+                  )}
+                  onClick={() => setType(t)}
+                >
+                  {t}
+                </Button>
+              ))}
+            </div>
+          </div>
+          <DialogFooter>
+            <Button type="button" variant="outline" onClick={onClose}>
+              Cancel
+            </Button>
+            <Button type="submit" disabled={!title.trim()}>
+              Create
+            </Button>
+          </DialogFooter>
+        </form>
+      </DialogContent>
+    </Dialog>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/CreateTypeDialog.tsx.html b/coverage/src/components/CreateTypeDialog.tsx.html new file mode 100644 index 00000000..dc477a4b --- /dev/null +++ b/coverage/src/components/CreateTypeDialog.tsx.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for src/components/CreateTypeDialog.tsx + + + + + + + + + +
+
+

All files / src/components CreateTypeDialog.tsx

+
+ +
+ 88.88% + Statements + 16/18 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 93.33% + Lines + 14/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65  +  +  +  +  +  +  +  +  +  +  +  +38x +38x +  +38x +15x +7x +7x +  +  +  +38x +3x +3x +3x +2x +2x +  +  +38x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useRef, useEffect } from 'react'
+import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+ 
+interface CreateTypeDialogProps {
+  open: boolean
+  onClose: () => void
+  onCreate: (name: string) => void
+}
+ 
+export function CreateTypeDialog({ open, onClose, onCreate }: CreateTypeDialogProps) {
+  const [name, setName] = useState('')
+  const inputRef = useRef<HTMLInputElement>(null)
+ 
+  useEffect(() => {
+    if (open) {
+      setName('')
+      setTimeout(() => inputRef.current?.focus(), 50)
+    }
+  }, [open])
+ 
+  const handleSubmit = (e: React.FormEvent) => {
+    e.preventDefault()
+    const trimmed = name.trim()
+    if (!trimmed) return
+    onCreate(trimmed)
+    onClose()
+  }
+ 
+  return (
+    <Dialog open={open} onOpenChange={(isOpen) => { if (!isOpen) onClose() }}>
+      <DialogContent showCloseButton={false} className="sm:max-w-[380px]">
+        <DialogHeader>
+          <DialogTitle>Create New Type</DialogTitle>
+        </DialogHeader>
+        <form onSubmit={handleSubmit} className="space-y-4">
+          <div className="space-y-1.5">
+            <label className="text-xs font-medium uppercase tracking-wide text-muted-foreground">
+              Type Name
+            </label>
+            <Input
+              ref={inputRef}
+              placeholder="e.g. Recipe, Book, Habit..."
+              value={name}
+              onChange={(e) => setName(e.target.value)}
+            />
+            <p className="text-xs text-muted-foreground">
+              Creates a type document. Its properties become defaults for new docs of this type.
+            </p>
+          </div>
+          <DialogFooter>
+            <Button type="button" variant="outline" onClick={onClose}>
+              Cancel
+            </Button>
+            <Button type="submit" disabled={!name.trim()}>
+              Create
+            </Button>
+          </DialogFooter>
+        </form>
+      </DialogContent>
+    </Dialog>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/DiffView.tsx.html b/coverage/src/components/DiffView.tsx.html new file mode 100644 index 00000000..8d15f6a7 --- /dev/null +++ b/coverage/src/components/DiffView.tsx.html @@ -0,0 +1,220 @@ + + + + + + Code coverage report for src/components/DiffView.tsx + + + + + + + + + +
+
+

All files / src/components DiffView.tsx

+
+ +
+ 0% + Statements + 0/14 +
+ + +
+ 0% + Branches + 0/21 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { cn } from '@/lib/utils'
+ 
+interface DiffViewProps {
+  diff: string
+}
+ 
+export function DiffView({ diff }: DiffViewProps) {
+  if (!diff) {
+    return (
+      <div className="flex h-full items-center justify-center text-sm text-muted-foreground">
+        No changes to display
+      </div>
+    )
+  }
+ 
+  const lines = diff.split('\n')
+ 
+  return (
+    <div className="font-mono text-[13px] leading-relaxed py-3">
+      {lines.map((line, i) => {
+        let lineClass = 'text-secondary-foreground'
+        if (line.startsWith('+') && !line.startsWith('+++')) {
+          lineClass = 'bg-[rgba(76,175,80,0.12)] text-[#4caf50]'
+        } else if (line.startsWith('-') && !line.startsWith('---')) {
+          lineClass = 'bg-[rgba(244,67,54,0.12)] text-[#f44336]'
+        } else if (line.startsWith('@@')) {
+          lineClass = 'bg-[rgba(33,150,243,0.08)] text-primary italic'
+        } else if (line.startsWith('diff') || line.startsWith('index') || line.startsWith('---') || line.startsWith('+++') || line.startsWith('new file')) {
+          lineClass = 'bg-muted text-muted-foreground font-semibold'
+        }
+ 
+        return (
+          <div key={i} className={cn("flex min-h-[22px] px-4", lineClass)}>
+            <span className="w-10 shrink-0 text-right pr-3 text-muted-foreground select-none">
+              {i + 1}
+            </span>
+            <span className="flex-1 whitespace-pre-wrap break-all px-2">
+              {line || '\u00A0'}
+            </span>
+          </div>
+        )
+      })}
+    </div>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/DynamicPropertiesPanel.tsx.html b/coverage/src/components/DynamicPropertiesPanel.tsx.html new file mode 100644 index 00000000..2ca9f396 --- /dev/null +++ b/coverage/src/components/DynamicPropertiesPanel.tsx.html @@ -0,0 +1,943 @@ + + + + + + Code coverage report for src/components/DynamicPropertiesPanel.tsx + + + + + + + + + +
+
+

All files / src/components DynamicPropertiesPanel.tsx

+
+ +
+ 41.96% + Statements + 47/112 +
+ + +
+ 40.24% + Branches + 33/82 +
+ + +
+ 27.77% + Functions + 10/36 +
+ + +
+ 47.19% + Lines + 42/89 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +3x +  +  +152x +84x +  +  +  +  +16x +16x +208x +16x +  +  +  +16x +16x +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +16x +16x +16x +16x +  +16x +  +16x +16x +  +118x +118x +76x +76x +  +  +  +16x +  +  +  +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +  +16x +76x +  +  +  +  +  +  +  +  +  +  +76x +16x +16x +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +  +  +  +60x +14x +  +  +46x +  +  +  +  +  +  +  +  +  +  +46x +  +  +  +  +  +  +  +  +  +  +46x +  +  +  +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +76x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useMemo, useState, useCallback } from 'react'
+import type { VaultEntry } from '../types'
+import type { FrontmatterValue } from './Inspector'
+import type { ParsedFrontmatter } from '../utils/frontmatter'
+import { EditableValue, TagPillList } from './EditableValue'
+import { Button } from '@/components/ui/button'
+import { getTypeColor, getTypeLightColor } from '../utils/typeColors'
+ 
+const STATUS_STYLES: Record<string, { bg: string; color: string }> = {
+  Active: { bg: 'var(--accent-green-light)', color: 'var(--accent-green)' },
+  Done: { bg: 'var(--accent-blue-light)', color: 'var(--accent-blue)' },
+  Paused: { bg: 'var(--accent-yellow-light)', color: 'var(--accent-yellow)' },
+  Archived: { bg: 'var(--accent-blue-light)', color: 'var(--muted-foreground)' },
+  Dropped: { bg: 'var(--accent-red-light)', color: 'var(--accent-red)' },
+  Open: { bg: 'var(--accent-green-light)', color: 'var(--accent-green)' },
+  Closed: { bg: 'var(--accent-blue-light)', color: 'var(--muted-foreground)' },
+  'Not started': { bg: 'var(--accent-blue-light)', color: 'var(--muted-foreground)' },
+  Draft: { bg: 'var(--accent-yellow-light)', color: 'var(--accent-yellow)' },
+  Mixed: { bg: 'var(--accent-yellow-light)', color: 'var(--accent-yellow)' },
+}
+ 
+const DEFAULT_STATUS_STYLE = { bg: 'var(--accent-blue-light)', color: 'var(--muted-foreground)' }
+ 
+// Keys that are relationships (contain wikilinks)
+export const RELATIONSHIP_KEYS = new Set([
+  'Belongs to', 'Related to', 'Events', 'Has Data', 'Owner',
+  'Advances', 'Parent', 'Children', 'Has', 'Notes',
+])
+ 
+// Keys to skip showing in Properties
+const SKIP_KEYS = new Set(['aliases', 'notion_id', 'workspace'])
+ 
+export function containsWikilinks(value: FrontmatterValue): boolean {
+  if (typeof value === 'string') return /^\[\[.*\]\]$/.test(value)
+  Eif (Array.isArray(value)) return value.some(v => typeof v === 'string' && /^\[\[.*\]\]$/.test(v))
+  return false
+}
+ 
+function countWords(content: string | null): number {
+  Iif (!content) return 0
+  const stripped = content.replace(/^---[\s\S]*?---\n?/, '')
+  const words = stripped.trim().split(/\s+/).filter((w) => w.length > 0)
+  return words.length
+}
+ 
+function formatDate(timestamp: number | null): string {
+  Iif (!timestamp) return '\u2014'
+  const d = new Date(timestamp * 1000)
+  return d.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' })
+}
+ 
+export function DynamicPropertiesPanel({
+  entry,
+  content,
+  frontmatter,
+  onUpdateProperty,
+  onDeleteProperty,
+  onAddProperty,
+  onNavigate,
+}: {
+  entry: VaultEntry
+  content: string | null
+  frontmatter: ParsedFrontmatter
+  onUpdateProperty?: (key: string, value: FrontmatterValue) => void
+  onDeleteProperty?: (key: string) => void
+  onAddProperty?: (key: string, value: FrontmatterValue) => void
+  onNavigate?: (target: string) => void
+}) {
+  const [editingKey, setEditingKey] = useState<string | null>(null)
+  const [showAddDialog, setShowAddDialog] = useState(false)
+  const [newKey, setNewKey] = useState('')
+  const [newValue, setNewValue] = useState('')
+ 
+  const wordCount = countWords(content)
+ 
+  const propertyEntries = useMemo(() => {
+    return Object.entries(frontmatter)
+      .filter(([key, value]) => {
+        Iif (SKIP_KEYS.has(key)) return false
+        if (RELATIONSHIP_KEYS.has(key)) return false
+        Iif (containsWikilinks(value)) return false
+        return true
+      })
+  }, [frontmatter])
+ 
+  const handleSaveValue = useCallback((key: string, newValue: string) => {
+    setEditingKey(null)
+    if (onUpdateProperty) {
+      if (newValue.toLowerCase() === 'true') onUpdateProperty(key, true)
+      else if (newValue.toLowerCase() === 'false') onUpdateProperty(key, false)
+      else if (!isNaN(Number(newValue)) && newValue.trim() !== '') onUpdateProperty(key, Number(newValue))
+      else onUpdateProperty(key, newValue)
+    }
+  }, [onUpdateProperty])
+ 
+  const handleSaveList = useCallback((key: string, newItems: string[]) => {
+    if (onUpdateProperty) {
+      if (newItems.length === 0) onDeleteProperty?.(key)
+      else if (newItems.length === 1) onUpdateProperty(key, newItems[0])
+      else onUpdateProperty(key, newItems)
+    }
+  }, [onUpdateProperty, onDeleteProperty])
+ 
+  const handleAddProperty = useCallback(() => {
+    if (newKey.trim() && onAddProperty) {
+      if (newValue.includes(',')) {
+        const items = newValue.split(',').map(s => s.trim()).filter(s => s)
+        onAddProperty(newKey.trim(), items.length === 1 ? items[0] : items)
+      } else {
+        onAddProperty(newKey.trim(), newValue.trim() || '')
+      }
+      setNewKey('')
+      setNewValue('')
+      setShowAddDialog(false)
+    }
+  }, [newKey, newValue, onAddProperty])
+ 
+  const handleAddKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter') handleAddProperty()
+    else if (e.key === 'Escape') {
+      setShowAddDialog(false)
+      setNewKey('')
+      setNewValue('')
+    }
+  }
+ 
+  const renderEditableValue = (key: string, value: FrontmatterValue) => {
+    Iif (value === null || value === undefined) {
+      return (
+        <EditableValue
+          value="" isEditing={editingKey === key}
+          onStartEdit={() => setEditingKey(key)}
+          onSave={(v) => handleSaveValue(key, v)}
+          onCancel={() => setEditingKey(null)}
+        />
+      )
+    }
+ 
+    if (key === 'Status' || key.includes('Status')) {
+      const statusStr = String(value)
+      const style = STATUS_STYLES[statusStr] ?? DEFAULT_STATUS_STYLE
+      Iif (editingKey === key) {
+        return (
+          <input
+            className="w-full rounded border border-ring bg-muted px-2 py-1 text-[13px] text-foreground outline-none focus:border-primary"
+            type="text" defaultValue={statusStr}
+            onKeyDown={(e) => {
+              if (e.key === 'Enter') handleSaveValue(key, (e.target as HTMLInputElement).value)
+              if (e.key === 'Escape') setEditingKey(null)
+            }}
+            onBlur={(e) => handleSaveValue(key, e.target.value)}
+            autoFocus
+          />
+        )
+      }
+      return (
+        <span
+          className="inline-block min-w-0 cursor-pointer truncate transition-opacity hover:opacity-80"
+          style={{ backgroundColor: style.bg, color: style.color, borderRadius: 16, padding: '1px 6px', fontFamily: "'IBM Plex Mono', monospace", fontSize: 10, fontWeight: 600, letterSpacing: '1.2px', textTransform: 'uppercase' as const }}
+          onClick={() => setEditingKey(key)} title={statusStr}
+        >
+          {statusStr}
+        </span>
+      )
+    }
+ 
+    if (Array.isArray(value)) {
+      return <TagPillList items={value.map(String)} onSave={(items) => handleSaveList(key, items)} label={key} />
+    }
+ 
+    Iif (key.includes('Created') || key.includes('Modified') || key.includes('time') || key.includes('Date')) {
+      return (
+        <EditableValue
+          value={String(value)} isEditing={editingKey === key}
+          onStartEdit={() => setEditingKey(key)}
+          onSave={(v) => handleSaveValue(key, v)}
+          onCancel={() => setEditingKey(null)}
+        />
+      )
+    }
+ 
+    Iif (typeof value === 'boolean') {
+      return (
+        <button
+          className="rounded border border-border bg-transparent px-2 py-0.5 text-xs text-secondary-foreground transition-colors hover:bg-muted"
+          onClick={() => onUpdateProperty?.(key, !value)}
+        >
+          {value ? '\u2713 Yes' : '\u2717 No'}
+        </button>
+      )
+    }
+ 
+    return (
+      <EditableValue
+        value={String(value)} isEditing={editingKey === key}
+        onStartEdit={() => setEditingKey(key)}
+        onSave={(v) => handleSaveValue(key, v)}
+        onCancel={() => setEditingKey(null)}
+      />
+    )
+  }
+ 
+  return (
+    <div>
+      <div className="flex flex-col gap-2">
+        {entry.isA && (
+          <div className="flex items-center justify-between">
+            <span className="font-mono-overline shrink-0 text-muted-foreground">Type</span>
+            {onNavigate ? (
+              <button
+                className="min-w-0 truncate border-none text-right cursor-pointer hover:opacity-80"
+                style={{
+                  background: getTypeLightColor(entry.isA),
+                  color: getTypeColor(entry.isA),
+                  borderRadius: 6,
+                  padding: '2px 8px',
+                  fontSize: 12,
+                  fontWeight: 500,
+                }}
+                onClick={() => onNavigate(`type/${entry.isA!.toLowerCase()}`)}
+                title={entry.isA}
+              >
+                {entry.isA}
+              </button>
+            ) : (
+              <span className="text-right text-[12px] text-secondary-foreground">{entry.isA}</span>
+            )}
+          </div>
+        )}
+ 
+        {propertyEntries.map(([key, value]) => (
+          <div key={key} className="group/prop flex items-center justify-between">
+            <span className="font-mono-overline flex shrink-0 items-center gap-1 text-muted-foreground">
+              {key}
+              {onDeleteProperty && (
+                <button
+                  className="border-none bg-transparent p-0 text-sm leading-none text-muted-foreground opacity-0 transition-all hover:text-destructive group-hover/prop:opacity-100"
+                  onClick={() => onDeleteProperty(key)} title="Delete property"
+                >
+                  &times;
+                </button>
+              )}
+            </span>
+            {renderEditableValue(key, value)}
+          </div>
+        ))}
+ 
+        <div className="flex items-center justify-between">
+          <span className="font-mono-overline shrink-0 text-muted-foreground">Modified</span>
+          <span className="text-right text-[12px] text-secondary-foreground">{formatDate(entry.modifiedAt)}</span>
+        </div>
+        <div className="flex items-center justify-between">
+          <span className="font-mono-overline shrink-0 text-muted-foreground">Words</span>
+          <span className="text-right text-[12px] text-secondary-foreground">{wordCount}</span>
+        </div>
+      </div>
+ 
+      {showAddDialog ? (
+        <div className="mt-3 flex flex-col gap-2 rounded-md border border-border bg-muted p-3">
+          <input
+            className="w-full rounded border border-ring bg-muted px-2 py-1 text-[13px] text-foreground outline-none focus:border-primary"
+            type="text" placeholder="Property name" value={newKey}
+            onChange={(e) => setNewKey(e.target.value)} onKeyDown={handleAddKeyDown} autoFocus
+          />
+          <input
+            className="w-full rounded border border-ring bg-muted px-2 py-1 text-[13px] text-foreground outline-none focus:border-primary"
+            type="text" placeholder="Value" value={newValue}
+            onChange={(e) => setNewValue(e.target.value)} onKeyDown={handleAddKeyDown}
+          />
+          <div className="flex justify-end gap-2">
+            <Button size="xs" onClick={handleAddProperty} disabled={!newKey.trim()}>Add</Button>
+            <Button size="xs" variant="outline" onClick={() => { setShowAddDialog(false); setNewKey(''); setNewValue('') }}>Cancel</Button>
+          </div>
+        </div>
+      ) : (
+        <button
+          className="mt-3 w-full cursor-pointer border border-border bg-transparent text-center text-muted-foreground transition-colors hover:border-primary hover:text-primary disabled:cursor-not-allowed disabled:opacity-50"
+          style={{ borderRadius: 6, padding: '6px 12px', fontSize: 12 }}
+          onClick={() => setShowAddDialog(true)} disabled={!onAddProperty}
+        >
+          + Add property
+        </button>
+      )}
+    </div>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/EditableValue.tsx.html b/coverage/src/components/EditableValue.tsx.html new file mode 100644 index 00000000..112ffecb --- /dev/null +++ b/coverage/src/components/EditableValue.tsx.html @@ -0,0 +1,628 @@ + + + + + + Code coverage report for src/components/EditableValue.tsx + + + + + + + + + +
+
+

All files / src/components EditableValue.tsx

+
+ +
+ 24.59% + Statements + 15/61 +
+ + +
+ 16.66% + Branches + 5/30 +
+ + +
+ 15% + Functions + 3/20 +
+ + +
+ 26.31% + Lines + 15/57 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +46x +  +46x +  +  +  +  +  +  +  +  +46x +  +  +  +  +  +  +  +  +  +  +  +  +  +46x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +14x +14x +14x +  +14x +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +14x +  +  +  +  +14x +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +  +  +42x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState } from 'react'
+ 
+export function EditableValue({
+  value,
+  onSave,
+  onCancel,
+  isEditing,
+  onStartEdit
+}: {
+  value: string
+  onSave: (newValue: string) => void
+  onCancel: () => void
+  isEditing: boolean
+  onStartEdit: () => void
+}) {
+  const [editValue, setEditValue] = useState(value)
+ 
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter') {
+      onSave(editValue)
+    } else if (e.key === 'Escape') {
+      setEditValue(value)
+      onCancel()
+    }
+  }
+ 
+  Iif (isEditing) {
+    return (
+      <input
+        className="w-full rounded border border-ring bg-muted px-2 py-1 text-[13px] text-foreground outline-none focus:border-primary"
+        type="text"
+        value={editValue}
+        onChange={(e) => setEditValue(e.target.value)}
+        onKeyDown={handleKeyDown}
+        onBlur={() => onSave(editValue)}
+        autoFocus
+      />
+    )
+  }
+ 
+  return (
+    <span
+      className="min-w-0 cursor-pointer truncate rounded px-1 py-0.5 text-right text-secondary-foreground transition-colors hover:bg-muted"
+      onClick={onStartEdit}
+      title={value || 'Click to edit'}
+    >
+      {value || '\u2014'}
+    </span>
+  )
+}
+ 
+export function TagPillList({
+  items,
+  onSave,
+  label,
+}: {
+  items: string[]
+  onSave: (newItems: string[]) => void
+  label: string
+}) {
+  const [editingIndex, setEditingIndex] = useState<number | null>(null)
+  const [editValue, setEditValue] = useState('')
+  const [isAddingNew, setIsAddingNew] = useState(false)
+  const [newValue, setNewValue] = useState('')
+ 
+  const handleStartEdit = (index: number) => {
+    setEditingIndex(index)
+    setEditValue(items[index])
+  }
+ 
+  const handleSaveEdit = () => {
+    if (editingIndex !== null) {
+      const newItems = [...items]
+      if (editValue.trim()) {
+        newItems[editingIndex] = editValue.trim()
+      } else {
+        newItems.splice(editingIndex, 1)
+      }
+      onSave(newItems)
+      setEditingIndex(null)
+    }
+  }
+ 
+  const handleDeleteItem = (index: number) => {
+    const newItems = items.filter((_, i) => i !== index)
+    onSave(newItems)
+  }
+ 
+  const handleAddNew = () => {
+    if (newValue.trim()) {
+      onSave([...items, newValue.trim()])
+      setNewValue('')
+      setIsAddingNew(false)
+    }
+  }
+ 
+  const handleKeyDown = (e: React.KeyboardEvent, action: 'edit' | 'add') => {
+    if (e.key === 'Enter') {
+      if (action === 'edit') handleSaveEdit()
+      else handleAddNew()
+    } else if (e.key === 'Escape') {
+      if (action === 'edit') {
+        setEditingIndex(null)
+        setEditValue('')
+      } else {
+        setIsAddingNew(false)
+        setNewValue('')
+      }
+    }
+  }
+ 
+  return (
+    <div className="flex flex-wrap items-center gap-1">
+      {items.map((item, idx) =>
+        editingIndex === idx ? (
+          <input
+            key={idx}
+            className="rounded-full border border-ring bg-muted px-2 py-0.5 text-[11px] text-foreground outline-none focus:border-primary"
+            style={{ width: Math.max(60, editValue.length * 7 + 16) }}
+            type="text"
+            value={editValue}
+            onChange={(e) => setEditValue(e.target.value)}
+            onKeyDown={(e) => handleKeyDown(e, 'edit')}
+            onBlur={handleSaveEdit}
+            autoFocus
+          />
+        ) : (
+          <span
+            key={idx}
+            className="group/pill inline-flex cursor-pointer items-center gap-0.5 rounded-full py-0.5 pl-2 pr-1 transition-colors"
+            style={{
+              backgroundColor: 'var(--accent-blue-light)',
+              color: 'var(--accent-blue)',
+              fontSize: 11,
+              fontWeight: 500,
+            }}
+            onClick={() => handleStartEdit(idx)}
+            title="Click to edit"
+          >
+            {item}
+            <button
+              className="ml-0.5 inline-flex h-3.5 w-3.5 items-center justify-center rounded-full border-none bg-transparent p-0 text-[10px] leading-none opacity-0 transition-all hover:bg-[var(--accent-red-light)] hover:text-[var(--accent-red)] group-hover/pill:opacity-100"
+              style={{ color: 'var(--accent-blue)' }}
+              onClick={(e) => {
+                e.stopPropagation()
+                handleDeleteItem(idx)
+              }}
+              title="Remove"
+            >
+              &times;
+            </button>
+          </span>
+        )
+      )}
+      {isAddingNew ? (
+        <input
+          className="rounded-full border border-ring bg-muted px-2 py-0.5 text-[11px] text-foreground outline-none focus:border-primary"
+          style={{ width: Math.max(60, newValue.length * 7 + 16) }}
+          type="text"
+          value={newValue}
+          onChange={(e) => setNewValue(e.target.value)}
+          onKeyDown={(e) => handleKeyDown(e, 'add')}
+          onBlur={() => {
+            if (newValue.trim()) handleAddNew()
+            else { setIsAddingNew(false); setNewValue('') }
+          }}
+          placeholder={`${label}...`}
+          autoFocus
+        />
+      ) : (
+        <button
+          className="inline-flex h-5 w-5 items-center justify-center rounded-full border border-dashed border-[var(--accent-blue)] bg-transparent p-0 text-[12px] leading-none text-[var(--accent-blue)] transition-colors hover:bg-[var(--accent-blue-light)]"
+          onClick={() => setIsAddingNew(true)}
+          title={`Add ${label.toLowerCase()}`}
+        >
+          +
+        </button>
+      )}
+    </div>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/Editor.tsx.html b/coverage/src/components/Editor.tsx.html new file mode 100644 index 00000000..c2b52783 --- /dev/null +++ b/coverage/src/components/Editor.tsx.html @@ -0,0 +1,1693 @@ + + + + + + Code coverage report for src/components/Editor.tsx + + + + + + + + + +
+
+

All files / src/components Editor.tsx

+
+ +
+ 50.52% + Statements + 97/192 +
+ + +
+ 48.33% + Branches + 58/120 +
+ + +
+ 47.36% + Functions + 18/38 +
+ + +
+ 53.84% + Lines + 91/169 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +8x +8x +8x +  +  +8x +8x +  +  +8x +8x +8x +8x +  +  +  +  +  +  +  +  +8x +8x +  +  +8x +8x +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +33x +33x +33x +  +  +33x +33x +  +  +33x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +33x +33x +33x +33x +  +  +33x +  +33x +11x +  +33x +33x +  +  +  +33x +  +  +  +  +  +33x +  +  +  +  +  +33x +33x +33x +  +  +33x +  +  +33x +  +33x +  +8x +8x +  +8x +8x +8x +8x +1x +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +8x +  +8x +  +8x +  +  +  +  +8x +8x +8x +  +8x +8x +8x +8x +8x +  +8x +1x +  +8x +  +8x +8x +  +  +  +  +  +  +  +  +  +  +8x +  +  +8x +  +  +  +  +  +  +33x +33x +18x +18x +  +  +  +  +18x +  +  +33x +33x +33x +  +33x +18x +18x +  +  +33x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +33x +  +  +  +  +  +  +  +  +  +  +  +  +  +33x +33x +  +  +33x +  +  +  +  +  +  +  +  +  +33x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +33x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +33x +25x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect, useState, useCallback, useMemo, useRef, memo } from 'react'
+import { BlockNoteSchema, defaultInlineContentSpecs } from '@blocknote/core'
+import { filterSuggestionItems } from '@blocknote/core/extensions'
+import { createReactInlineContentSpec, useCreateBlockNote, SuggestionMenuController } from '@blocknote/react'
+import { BlockNoteView } from '@blocknote/mantine'
+import '@blocknote/mantine/style.css'
+import { invoke, convertFileSrc } from '@tauri-apps/api/core'
+import { isTauri } from '../mock-tauri'
+import type { VaultEntry, GitCommit } from '../types'
+import { Inspector, type FrontmatterValue } from './Inspector'
+import { AIChatPanel } from './AIChatPanel'
+import { DiffView } from './DiffView'
+import { ResizeHandle } from './ResizeHandle'
+import { TabBar } from './TabBar'
+import { BreadcrumbBar } from './BreadcrumbBar'
+import { useEditorTheme } from '../hooks/useTheme'
+import { splitFrontmatter, preProcessWikilinks, injectWikilinks, countWords } from '../utils/wikilinks'
+import './Editor.css'
+import './EditorTheme.css'
+ 
+interface Tab {
+  entry: VaultEntry
+  content: string
+}
+ 
+interface EditorProps {
+  tabs: Tab[]
+  activeTabPath: string | null
+  entries: VaultEntry[]
+  onSwitchTab: (path: string) => void
+  onCloseTab: (path: string) => void
+  onReorderTabs?: (fromIndex: number, toIndex: number) => void
+  onNavigateWikilink: (target: string) => void
+  onLoadDiff?: (path: string) => Promise<string>
+  onLoadDiffAtCommit?: (path: string, commitHash: string) => Promise<string>
+  isModified?: (path: string) => boolean
+  onCreateNote?: () => void
+  // Inspector props
+  inspectorCollapsed: boolean
+  onToggleInspector: () => void
+  inspectorWidth: number
+  onInspectorResize: (delta: number) => void
+  inspectorEntry: VaultEntry | null
+  inspectorContent: string | null
+  allContent: Record<string, string>
+  gitHistory: GitCommit[]
+  onUpdateFrontmatter?: (path: string, key: string, value: FrontmatterValue) => Promise<void>
+  onDeleteProperty?: (path: string, key: string) => Promise<void>
+  onAddProperty?: (path: string, key: string, value: FrontmatterValue) => Promise<void>
+  showAIChat?: boolean
+  onToggleAIChat?: () => void
+  vaultPath?: string
+  onTrashNote?: (path: string) => void
+  onRestoreNote?: (path: string) => void
+  onArchiveNote?: (path: string) => void
+  onUnarchiveNote?: (path: string) => void
+}
+ 
+// --- Custom Inline Content: WikiLink ---
+ 
+// Module-level cache so the WikiLink renderer (defined outside React) can access entries
+const _wikilinkEntriesRef: { current: VaultEntry[] } = { current: [] }
+ 
+const TYPE_COLOR_MAP: Record<string, string> = {
+  red: 'var(--accent-red)',
+  orange: 'var(--accent-orange)',
+  yellow: 'var(--accent-yellow)',
+  green: 'var(--accent-green)',
+  blue: 'var(--accent-blue)',
+  purple: 'var(--accent-purple)',
+}
+ 
+function resolveWikilinkColor(target: string): string | undefined {
+  const entries = _wikilinkEntriesRef.current
+  if (!entries.length) return undefined
+  // Find the target entry by title or filename slug
+  const entry = entries.find(
+    e => e.title === target || e.filename.replace(/\.md$/, '') === target
+  )
+  if (!entry) return undefined
+  // If entry is itself a Type, use its own color
+  if (entry.isA === 'Type' && entry.color) return TYPE_COLOR_MAP[entry.color]
+  // Otherwise look up the type entry
+  if (entry.isA) {
+    const typeEntry = entries.find(e => e.isA === 'Type' && e.title === entry.isA)
+    if (typeEntry?.color) return TYPE_COLOR_MAP[typeEntry.color]
+  }
+  return undefined
+}
+ 
+const WikiLink = createReactInlineContentSpec(
+  {
+    type: "wikilink" as const,
+    propSchema: {
+      target: { default: "" },
+    },
+    content: "none",
+  },
+  {
+    render: (props) => {
+      const target = props.inlineContent.props.target
+      const color = resolveWikilinkColor(target)
+      return (
+        <span
+          className="wikilink"
+          data-target={target}
+          style={color ? { color, textDecorationColor: color } : undefined}
+        >
+          {target}
+        </span>
+      )
+    },
+  }
+)
+ 
+// --- Schema with wikilink ---
+ 
+const schema = BlockNoteSchema.create({
+  inlineContentSpecs: {
+    ...defaultInlineContentSpecs,
+    wikilink: WikiLink,
+  },
+})
+ 
+/** Single BlockNote editor view — content is swapped via replaceBlocks */
+function SingleEditorView({ editor, entries, onNavigateWikilink }: { editor: ReturnType<typeof useCreateBlockNote>; entries: VaultEntry[]; onNavigateWikilink: (target: string) => void }) {
+  const navigateRef = useRef(onNavigateWikilink)
+  navigateRef.current = onNavigateWikilink
+  const { cssVars } = useEditorTheme()
+ 
+  // Keep module-level ref in sync so WikiLink renderer can access vault entries
+  useEffect(() => {
+    _wikilinkEntriesRef.current = entries
+  }, [entries])
+ 
+  useEffect(() => {
+    const container = document.querySelector('.editor__blocknote-container')
+    Iif (!container) return
+    const handler = (e: MouseEvent) => {
+      const wikilink = (e.target as HTMLElement).closest('.wikilink')
+      if (wikilink) {
+        e.preventDefault()
+        e.stopPropagation()
+        const target = (wikilink as HTMLElement).dataset.target
+        if (target) navigateRef.current(target)
+      }
+    }
+    container.addEventListener('click', handler as EventListener, true)
+    return () => container.removeEventListener('click', handler as EventListener, true)
+  }, [editor])
+ 
+  const baseItems = useMemo(
+    () => entries.map(entry => ({
+      title: entry.title,
+      aliases: [entry.filename.replace(/\.md$/, ''), ...entry.aliases],
+      group: entry.isA || 'Note',
+      entryTitle: entry.title,
+    })),
+    [entries]
+  )
+ 
+  const getWikilinkItems = useCallback(async (query: string) => {
+    const items = baseItems.map(item => ({
+      ...item,
+      onItemClick: () => {
+        editor.insertInlineContent([
+          {
+            type: 'wikilink' as const,
+            props: { target: item.entryTitle },
+          },
+          " ",
+        ])
+      },
+    }))
+    return filterSuggestionItems(items, query)
+  }, [baseItems, editor])
+ 
+  return (
+    <div className="editor__blocknote-container" style={cssVars as React.CSSProperties}>
+      <BlockNoteView
+        editor={editor}
+        theme="light"
+      >
+        <SuggestionMenuController
+          triggerCharacter="[["
+          getItems={getWikilinkItems}
+        />
+      </BlockNoteView>
+    </div>
+  )
+}
+ 
+export const Editor = memo(function Editor({
+  tabs, activeTabPath, entries, onSwitchTab, onCloseTab, onReorderTabs, onNavigateWikilink, onLoadDiff, onLoadDiffAtCommit, isModified, onCreateNote,
+  inspectorCollapsed, onToggleInspector, inspectorWidth, onInspectorResize,
+  inspectorEntry, inspectorContent, allContent, gitHistory,
+  onUpdateFrontmatter, onDeleteProperty, onAddProperty,
+  showAIChat, onToggleAIChat,
+  vaultPath,
+  onTrashNote, onRestoreNote,
+  onArchiveNote, onUnarchiveNote,
+}: EditorProps) {
+  const [diffMode, setDiffMode] = useState(false)
+  const [diffContent, setDiffContent] = useState<string | null>(null)
+  const [diffLoading, setDiffLoading] = useState(false)
+ 
+  // Ref for vaultPath so the uploadFile closure always sees the latest value
+  const vaultPathRef = useRef(vaultPath)
+  vaultPathRef.current = vaultPath
+ 
+  // Single editor instance — reused across all tabs
+  const editor = useCreateBlockNote({
+    schema,
+    uploadFile: async (file: File) => {
+      if (isTauri() && vaultPathRef.current) {
+        // Tauri mode: save to vault/attachments and return a stable asset URL
+        const buf = await file.arrayBuffer()
+        const bytes = new Uint8Array(buf)
+        let binary = ''
+        for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i])
+        const base64 = btoa(binary)
+        const savedPath = await invoke<string>('save_image', {
+          vaultPath: vaultPathRef.current,
+          filename: file.name,
+          data: base64,
+        })
+        return convertFileSrc(savedPath)
+      }
+      // Browser dev mode: use data URL (survives reload, acceptable for dev)
+      return new Promise<string>((resolve, reject) => {
+        const reader = new FileReader()
+        reader.onload = () => resolve(reader.result as string)
+        reader.onerror = () => reject(reader.error)
+        reader.readAsDataURL(file)
+      })
+    },
+  })
+  // Cache parsed blocks per tab path for instant switching
+  const tabCacheRef = useRef<Map<string, any[]>>(new Map())
+  const prevActivePathRef = useRef<string | null>(null)
+  const editorMountedRef = useRef(false)
+  const pendingSwapRef = useRef<(() => void) | null>(null)
+ 
+  // Track editor mount state
+  useEffect(() => {
+    // Check if already mounted (prosemirrorView exists)
+    if (editor.prosemirrorView) {
+      editorMountedRef.current = true
+    }
+    const cleanup = editor.onMount(() => {
+      editorMountedRef.current = true
+      // Execute any pending content swap that was queued before mount.
+      // Defer via queueMicrotask so BlockNote's internal flushSync calls
+      // don't collide with React's commit phase.
+      Iif (pendingSwapRef.current) {
+        const swap = pendingSwapRef.current
+        pendingSwapRef.current = null
+        queueMicrotask(swap)
+      }
+    })
+    return cleanup
+  }, [editor])
+ 
+  // Swap document content when active tab changes.
+  // Uses queueMicrotask to defer BlockNote mutations outside React's commit phase,
+  // avoiding flushSync-inside-lifecycle errors that silently prevent content from rendering.
+  useEffect(() => {
+    const cache = tabCacheRef.current
+    const prevPath = prevActivePathRef.current
+ 
+    // Save current editor state for the tab we're leaving
+    Iif (prevPath && prevPath !== activeTabPath && editorMountedRef.current) {
+      cache.set(prevPath, editor.document)
+    }
+    prevActivePathRef.current = activeTabPath
+ 
+    if (!activeTabPath) return
+ 
+    const tab = tabs.find(t => t.entry.path === activeTabPath)
+    Iif (!tab) return
+ 
+    const applyBlocks = (blocks: any[]) => {
+      try {
+        const current = editor.document
+        if (current.length > 0 && blocks.length > 0) {
+          editor.replaceBlocks(current, blocks)
+        I} else if (blocks.length > 0) {
+          editor.insertBlocks(blocks, current[0], 'before')
+        }
+      } catch (err) {
+        console.error('applyBlocks failed, trying fallback:', err)
+        try {
+          const html = editor.blocksToHTMLLossy(blocks)
+          editor._tiptapEditor.commands.setContent(html)
+        } catch (err2) {
+          console.error('Fallback also failed:', err2)
+        }
+      }
+    }
+ 
+    const targetPath = activeTabPath
+ 
+    const doSwap = () => {
+      // Guard: bail if user switched tabs since this swap was scheduled
+      Iif (prevActivePathRef.current !== targetPath) return
+ 
+      Iif (cache.has(targetPath)) {
+        applyBlocks(cache.get(targetPath)!)
+        return
+      }
+ 
+      const [, rawBody] = splitFrontmatter(tab.content)
+      const body = rawBody.replace(/^# [^\n]*\n?/, '').trimStart()
+      const preprocessed = preProcessWikilinks(body)
+ 
+      try {
+        const result = editor.tryParseMarkdownToBlocks(preprocessed)
+        const handleBlocks = (blocks: any[]) => {
+          Iif (prevActivePathRef.current !== targetPath) return
+          const withWikilinks = injectWikilinks(blocks)
+          // Only cache non-empty results to avoid poisoning the cache
+          if (withWikilinks.length > 0) {
+            cache.set(targetPath, withWikilinks)
+          }
+          applyBlocks(withWikilinks)
+        }
+        if (result && typeof (result as any).then === 'function') {
+          (result as unknown as Promise<any[]>).then(handleBlocks).catch((err) => {
+            console.error('Async markdown parse failed:', err)
+          })
+        } else E{
+          handleBlocks(result as any[])
+        }
+      } catch (err) {
+        console.error('Failed to parse/swap editor content:', err)
+      }
+    }
+ 
+    if (editor.prosemirrorView) {
+      // Defer the swap outside React's commit phase so BlockNote's internal
+      // flushSync calls don't collide with React's rendering lifecycle.
+      queueMicrotask(doSwap)
+    } else E{
+      pendingSwapRef.current = doSwap
+    }
+  }, [activeTabPath, tabs, editor])
+ 
+  // Clean up cache entries when tabs are closed
+  const tabPathsRef = useRef<Set<string>>(new Set())
+  useEffect(() => {
+    const currentPaths = new Set(tabs.map(t => t.entry.path))
+    for (const path of tabPathsRef.current) {
+      if (!currentPaths.has(path)) {
+        tabCacheRef.current.delete(path)
+      }
+    }
+    tabPathsRef.current = currentPaths
+  }, [tabs])
+ 
+  const activeTab = tabs.find((t) => t.entry.path === activeTabPath) ?? null
+  const isLoadingNewTab = activeTabPath !== null && !activeTab
+  const showDiffToggle = activeTab && (diffMode || isModified?.(activeTab.entry.path))
+ 
+  useEffect(() => {
+    setDiffMode(false)
+    setDiffContent(null)
+  }, [activeTabPath])
+ 
+  const handleToggleDiff = useCallback(async () => {
+    if (diffMode) {
+      setDiffMode(false)
+      setDiffContent(null)
+      return
+    }
+    if (!activeTabPath || !onLoadDiff) return
+    setDiffLoading(true)
+    try {
+      const diff = await onLoadDiff(activeTabPath)
+      setDiffContent(diff)
+      setDiffMode(true)
+    } catch (err) {
+      console.warn('Failed to load diff:', err)
+    } finally {
+      setDiffLoading(false)
+    }
+  }, [diffMode, activeTabPath, onLoadDiff])
+ 
+  const handleViewCommitDiff = useCallback(async (commitHash: string) => {
+    if (!activeTabPath || !onLoadDiffAtCommit) return
+    setDiffLoading(true)
+    try {
+      const diff = await onLoadDiffAtCommit(activeTabPath, commitHash)
+      setDiffContent(diff)
+      setDiffMode(true)
+    } catch (err) {
+      console.warn('Failed to load commit diff:', err)
+    } finally {
+      setDiffLoading(false)
+    }
+  }, [activeTabPath, onLoadDiffAtCommit])
+ 
+  const activeModified = activeTab ? isModified?.(activeTab.entry.path) ?? false : false
+  const wordCount = activeTab ? countWords(activeTab.content) : 0
+ 
+  const tabBar = (
+    <TabBar
+      tabs={tabs}
+      activeTabPath={activeTabPath}
+      onSwitchTab={onSwitchTab}
+      onCloseTab={onCloseTab}
+      onCreateNote={onCreateNote}
+      onReorderTabs={onReorderTabs}
+    />
+  )
+ 
+  const breadcrumbBar = activeTab ? (
+    <BreadcrumbBar
+      entry={activeTab.entry}
+      wordCount={wordCount}
+      isModified={activeModified}
+      showDiffToggle={!!showDiffToggle}
+      diffMode={diffMode}
+      diffLoading={diffLoading}
+      onToggleDiff={handleToggleDiff}
+      showAIChat={showAIChat}
+      onToggleAIChat={onToggleAIChat}
+      inspectorCollapsed={inspectorCollapsed}
+      onToggleInspector={onToggleInspector}
+      onTrash={onTrashNote ? () => onTrashNote(activeTab.entry.path) : undefined}
+      onRestore={onRestoreNote ? () => onRestoreNote(activeTab.entry.path) : undefined}
+      onArchive={onArchiveNote ? () => onArchiveNote(activeTab.entry.path) : undefined}
+      onUnarchive={onUnarchiveNote ? () => onUnarchiveNote(activeTab.entry.path) : undefined}
+    />
+  ) : null
+ 
+  const rightPanel = showAIChat ? (
+    <div
+      className="shrink-0 flex flex-col min-h-0"
+      style={{ width: inspectorWidth, height: '100%' }}
+    >
+      <AIChatPanel
+        entry={inspectorEntry}
+        allContent={allContent}
+        entries={entries}
+        onClose={() => onToggleAIChat?.()}
+      />
+    </div>
+  ) : inspectorCollapsed ? null : (
+    <div
+      className="shrink-0 flex flex-col min-h-0"
+      style={{ width: inspectorWidth, height: '100%' }}
+    >
+      <Inspector
+        collapsed={inspectorCollapsed}
+        onToggle={onToggleInspector}
+        entry={inspectorEntry}
+        content={inspectorContent}
+        entries={entries}
+        allContent={allContent}
+        gitHistory={gitHistory}
+        onNavigate={onNavigateWikilink}
+        onViewCommitDiff={handleViewCommitDiff}
+        onUpdateFrontmatter={onUpdateFrontmatter}
+        onDeleteProperty={onDeleteProperty}
+        onAddProperty={onAddProperty}
+      />
+    </div>
+  )
+ 
+  if (tabs.length === 0) {
+    return (
+      <div className="editor flex flex-col min-h-0 overflow-hidden bg-background text-foreground">
+        {tabBar}
+        <div className="flex flex-1 min-h-0">
+          <div className="flex flex-1 flex-col items-center justify-center gap-2 text-center text-muted-foreground">
+            <p className="m-0 text-[15px]">Select a note to start editing</p>
+            <span className="text-xs text-muted-foreground">Cmd+P to search &middot; Cmd+N to create</span>
+          </div>
+          {(showAIChat || !inspectorCollapsed) && <ResizeHandle onResize={onInspectorResize} />}
+          {rightPanel}
+        </div>
+      </div>
+    )
+  }
+ 
+  return (
+    <div className="editor flex flex-col min-h-0 overflow-hidden bg-background text-foreground">
+      {tabBar}
+      <div className="flex flex-1 min-h-0">
+        <div className="flex flex-1 flex-col min-w-0 min-h-0">
+          {breadcrumbBar}
+          {diffMode && (
+            <div className="flex-1 overflow-auto">
+              <button
+                className="flex items-center gap-1.5 px-4 py-2 text-xs text-primary bg-muted border-b border-border cursor-pointer hover:bg-accent transition-colors w-full border-t-0 border-l-0 border-r-0"
+                onClick={handleToggleDiff}
+                title="Back to editor"
+              >
+                <span style={{ fontSize: 14, lineHeight: 1 }}>&larr;</span>
+                Back to editor
+              </button>
+              <DiffView diff={diffContent ?? ''} />
+            </div>
+          )}
+          {!diffMode && activeTab && (
+            <div
+              style={{
+                display: 'flex',
+                flex: 1,
+                flexDirection: 'column',
+                minHeight: 0,
+              }}
+            >
+              <SingleEditorView
+                editor={editor}
+                entries={entries}
+                onNavigateWikilink={onNavigateWikilink}
+              />
+            </div>
+          )}
+          {isLoadingNewTab && !diffMode && (
+            <div className="flex flex-1 flex-col gap-3 p-8 animate-pulse" style={{ minHeight: 0 }}>
+              <div className="h-6 w-2/5 rounded bg-muted" />
+              <div className="h-4 w-4/5 rounded bg-muted" />
+              <div className="h-4 w-3/5 rounded bg-muted" />
+              <div className="h-4 w-4/5 rounded bg-muted" />
+              <div className="h-4 w-2/5 rounded bg-muted" />
+            </div>
+          )}
+        </div>
+        {(showAIChat || !inspectorCollapsed) && <ResizeHandle onResize={onInspectorResize} />}
+        {rightPanel}
+      </div>
+    </div>
+  )
+})
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/Inspector.tsx.html b/coverage/src/components/Inspector.tsx.html new file mode 100644 index 00000000..df3803e2 --- /dev/null +++ b/coverage/src/components/Inspector.tsx.html @@ -0,0 +1,1333 @@ + + + + + + Code coverage report for src/components/Inspector.tsx + + + + + + + + + +
+
+

All files / src/components Inspector.tsx

+
+ +
+ 64.28% + Statements + 90/140 +
+ + +
+ 52.17% + Branches + 84/161 +
+ + +
+ 72.09% + Functions + 31/43 +
+ + +
+ 76.19% + Lines + 80/105 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +30x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +42x +  +  +  +  +28x +28x +28x +28x +56x +  +  +  +  +29x +29x +29x +  +  +  +28x +28x +10x +10x +10x +10x +10x +  +  +  +  +  +28x +28x +  +  +  +  +28x +28x +28x +28x +28x +28x +28x +28x +28x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +16x +16x +16x +16x +  +16x +16x +118x +  +42x +42x +  +42x +  +42x +  +  +  +16x +  +16x +  +  +  +  +  +  +  +  +  +16x +  +  +  +  +16x +  +  +  +  +  +28x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +41x +40x +16x +16x +16x +16x +  +16x +6x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +9x +9x +9x +9x +9x +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +9x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +24x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +41x +41x +  +41x +  +  +  +41x +  +  +  +41x +  +  +  +41x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useMemo, useCallback, useState, useRef } from 'react'
+import type { ComponentType, SVGAttributes } from 'react'
+import type { VaultEntry, GitCommit } from '../types'
+import { cn } from '@/lib/utils'
+import {
+  SlidersHorizontal, X, Wrench, Flask, Target, ArrowsClockwise,
+  Users, CalendarBlank, Tag, FileText, StackSimple, Trash,
+} from '@phosphor-icons/react'
+import { parseFrontmatter, type ParsedFrontmatter } from '../utils/frontmatter'
+import { DynamicPropertiesPanel, RELATIONSHIP_KEYS, containsWikilinks } from './DynamicPropertiesPanel'
+import { getTypeColor, getTypeLightColor } from '../utils/typeColors'
+ 
+const TYPE_ICON_MAP: Record<string, ComponentType<SVGAttributes<SVGSVGElement>>> = {
+  Project: Wrench,
+  Experiment: Flask,
+  Responsibility: Target,
+  Procedure: ArrowsClockwise,
+  Person: Users,
+  Event: CalendarBlank,
+  Topic: Tag,
+  Type: StackSimple,
+}
+ 
+function getTypeIcon(isA: string | undefined): ComponentType<SVGAttributes<SVGSVGElement>> {
+  return (isA && TYPE_ICON_MAP[isA]) || FileText
+}
+ 
+interface InspectorProps {
+  collapsed: boolean
+  onToggle: () => void
+  entry: VaultEntry | null
+  content: string | null
+  entries: VaultEntry[]
+  allContent: Record<string, string>
+  gitHistory: GitCommit[]
+  onNavigate: (target: string) => void
+  onViewCommitDiff?: (commitHash: string) => void
+  onUpdateFrontmatter?: (path: string, key: string, value: FrontmatterValue) => Promise<void>
+  onDeleteProperty?: (path: string, key: string) => Promise<void>
+  onAddProperty?: (path: string, key: string, value: FrontmatterValue) => Promise<void>
+}
+ 
+export type FrontmatterValue = string | number | boolean | string[] | null
+ 
+/** Check if a string is a wikilink */
+function isWikilink(value: string): boolean {
+  return /^\[\[.*\]\]$/.test(value)
+}
+ 
+/** Extract display name from a wikilink */
+function wikilinkDisplay(ref: string): string {
+  const inner = ref.replace(/^\[\[|\]\]$/g, '')
+  const pipeIdx = inner.indexOf('|')
+  Iif (pipeIdx !== -1) return inner.slice(pipeIdx + 1)
+  const last = inner.split('/').pop() ?? inner
+  return last.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase())
+}
+ 
+/** Extract the target path for navigation from a wikilink ref */
+function wikilinkTarget(ref: string): string {
+  const inner = ref.replace(/^\[\[|\]\]$/g, '')
+  const pipeIdx = inner.indexOf('|')
+  return pipeIdx !== -1 ? inner.slice(0, pipeIdx) : inner
+}
+ 
+function resolveRef(ref: string, entries: VaultEntry[]): VaultEntry | undefined {
+  const target = wikilinkTarget(ref)
+  return entries.find((e) => {
+    const stem = e.path.replace(/^.*\/Laputa\//, '').replace(/\.md$/, '')
+    Iif (stem === target) return true
+    const fileStem = e.filename.replace(/\.md$/, '')
+    Iif (fileStem === target.split('/').pop()) return true
+    return false
+  })
+}
+ 
+ 
+function RelationshipGroup({ label, refs, entries, onNavigate }: { label: string; refs: string[]; entries: VaultEntry[]; onNavigate: (target: string) => void }) {
+  Iif (refs.length === 0) return null
+  return (
+    <div className="mb-2.5">
+      <span className="font-mono-overline mb-1 block text-muted-foreground">{label}</span>
+      <div className="flex flex-col gap-1">
+        {refs.map((ref, idx) => {
+          const resolved = resolveRef(ref, entries)
+          const refType = resolved?.isA ?? undefined
+          const isArchived = resolved?.archived ?? false
+          const isTrashed = resolved?.trashed ?? false
+          const isDimmed = isArchived || isTrashed
+          const color = refType ? getTypeColor(refType) : 'var(--accent-blue)'
+          const bgColor = refType ? getTypeLightColor(refType) : 'var(--accent-blue-light)'
+          const TypeIcon = getTypeIcon(refType)
+          return (
+            <button
+              key={`${ref}-${idx}`}
+              className="flex items-center justify-between gap-2 border-none text-left cursor-pointer hover:opacity-80"
+              style={{
+                background: isDimmed ? 'var(--muted)' : bgColor,
+                color: isDimmed ? 'var(--muted-foreground)' : color,
+                borderRadius: 6, padding: '6px 10px', fontSize: 12, fontWeight: 500,
+                opacity: isDimmed ? 0.7 : 1,
+              }}
+              onClick={() => onNavigate(wikilinkTarget(ref))}
+              title={isTrashed ? 'Trashed' : isArchived ? 'Archived' : undefined}
+            >
+              <span className="flex items-center gap-1 flex-1 truncate">
+                {isTrashed && <Trash size={12} className="shrink-0" />}
+                {wikilinkDisplay(ref)}
+                {isTrashed && <span style={{ fontSize: 10, opacity: 0.8 }}>(trashed)</span>}
+                {isArchived && !isTrashed && <span style={{ marginLeft: 4, fontSize: 10, opacity: 0.8 }}>(archived)</span>}
+              </span>
+              <TypeIcon width={14} height={14} className="shrink-0" style={{ color: isDimmed ? 'var(--muted-foreground)' : color }} />
+            </button>
+          )
+        })}
+      </div>
+    </div>
+  )
+}
+ 
+function DynamicRelationshipsPanel({
+  frontmatter, entries, onNavigate, onAddProperty,
+}: {
+  frontmatter: ParsedFrontmatter
+  entries: VaultEntry[]
+  onNavigate: (target: string) => void
+  onAddProperty?: (key: string, value: FrontmatterValue) => void
+}) {
+  const [showForm, setShowForm] = useState(false)
+  const [relKey, setRelKey] = useState('')
+  const [relTarget, setRelTarget] = useState('')
+  const keyInputRef = useRef<HTMLInputElement>(null)
+ 
+  const relationshipEntries = useMemo(() => {
+    return Object.entries(frontmatter)
+      .filter(([key, value]) => key !== 'Type' && (RELATIONSHIP_KEYS.has(key) || containsWikilinks(value)))
+      .map(([key, value]) => {
+        const refs: string[] = []
+        if (typeof value === 'string' && isWikilink(value)) refs.push(valueI)
+        else if (Array.isArray(value)) value.forEach(v => { if (typeof v === 'string' && isWikilink(v)) refs.push(v) })
+        return { key, refs }
+      })
+      .filter(({ refs }) => refs.length > 0)
+  }, [frontmatter])
+ 
+  // All note titles for datalist autocomplete
+  const noteTitles = useMemo(() => entries.map(e => e.title), [entries])
+ 
+  const handleAdd = useCallback(() => {
+    const key = relKey.trim()
+    const target = relTarget.trim()
+    if (!key || !target || !onAddProperty) return
+    onAddProperty(key, `[[${target}]]`)
+    setRelKey('')
+    setRelTarget('')
+    setShowForm(false)
+  }, [relKey, relTarget, onAddProperty])
+ 
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Enter') handleAdd()
+    else if (e.key === 'Escape') { setShowForm(false); setRelKey(''); setRelTarget('') }
+  }
+ 
+  return (
+    <div>
+      {relationshipEntries.length === 0 ? (
+        <p className="m-0 text-[13px] text-muted-foreground">No relationships</p>
+      ) : (
+        relationshipEntries.map(({ key, refs }) => (
+          <RelationshipGroup key={key} label={key} refs={refs} entries={entries} onNavigate={onNavigate} />
+        ))
+      )}
+ 
+      {showForm ? (
+        <div className="mt-2 flex flex-col gap-1.5" onKeyDown={handleKeyDown}>
+          <datalist id="rel-note-titles">
+            {noteTitles.map(t => <option key={t} value={t} />)}
+          </datalist>
+          <input
+            ref={keyInputRef}
+            autoFocus
+            className="w-full border border-border bg-transparent px-2 py-1 text-xs text-foreground"
+            style={{ borderRadius: 4, outline: 'none' }}
+            placeholder="Relationship name (e.g. Has, Related to)"
+            value={relKey}
+            onChange={e => setRelKey(e.target.value)}
+          />
+          <input
+            className="w-full border border-border bg-transparent px-2 py-1 text-xs text-foreground"
+            style={{ borderRadius: 4, outline: 'none' }}
+            placeholder="Note title"
+            list="rel-note-titles"
+            value={relTarget}
+            onChange={e => setRelTarget(e.target.value)}
+          />
+          <div className="flex gap-1.5">
+            <button
+              className="flex-1 border border-border bg-transparent text-xs text-foreground"
+              style={{ borderRadius: 4, padding: '4px 0' }}
+              onClick={handleAdd}
+              disabled={!relKey.trim() || !relTarget.trim()}
+            >
+              Add
+            </button>
+            <button
+              className="border border-border bg-transparent text-xs text-muted-foreground"
+              style={{ borderRadius: 4, padding: '4px 8px' }}
+              onClick={() => { setShowForm(false); setRelKey(''); setRelTarget('') }}
+            >
+              Cancel
+            </button>
+          </div>
+        </div>
+      ) : (
+        <button
+          className="mt-2 w-full border border-border bg-transparent text-center text-muted-foreground"
+          style={{ borderRadius: 6, padding: '6px 12px', fontSize: 12, opacity: onAddProperty ? 1 : 0.5, cursor: onAddProperty ? 'pointer' : 'not-allowed' }}
+          disabled={!onAddProperty}
+          onClick={() => { setShowForm(true); setTimeout(() => keyInputRef.current?.focus(), 0) }}
+        >
+          + Link existing
+        </button>
+      )}
+    </div>
+  )
+}
+ 
+function useBacklinks(entry: VaultEntry | null, entries: VaultEntry[], allContent: Record<string, string>): VaultEntry[] {
+  return useMemo(() => {
+    if (!entry) return []
+    const title = entry.title
+    const stem = entry.filename.replace(/\.md$/, '')
+    const targets = [title, ...entry.aliases]
+    const pathStem = entry.path.replace(/^.*\/Laputa\//, '').replace(/\.md$/, '')
+ 
+    return entries.filter((e) => {
+      if (e.path === entry.path) return false
+      const content = allContent[e.path]
+      Iif (!content) return false
+      for (const t of targets) {
+        Eif (content.includes(`[[${t}]]`)) return true
+      }
+      if (content.includes(`[[${stem}]]`)) return true
+      if (content.includes(`[[${pathStem}]]`)) return true
+      if (content.includes(`[[${pathStem}|`)) return true
+      return false
+    })
+  }, [entry, entries, allContent])
+}
+ 
+function BacklinksPanel({ backlinks, onNavigate }: { backlinks: VaultEntry[]; onNavigate: (target: string) => void }) {
+  return (
+    <div>
+      <h4 className="font-mono-overline mb-2 text-muted-foreground">
+        Backlinks {backlinks.length > 0 && <span className="ml-1" style={{ fontWeight: 400 }}>{backlinks.length}</span>}
+      </h4>
+      {backlinks.length === 0 ? (
+        <p className="m-0 text-[13px] text-muted-foreground">No backlinks</p>
+      ) : (
+        <div className="flex flex-col gap-0.5">
+          {backlinks.map((e) => {
+            const color = e.isA ? getTypeColor(e.isA) : 'var(--accent-blue)'
+            const TypeIcon = getTypeIcon(e.isA ?? undefined)
+            const isDimmed = e.archived || e.trashed
+            return (
+              <button
+                key={e.path}
+                className="flex items-center justify-between gap-2 border-none bg-transparent p-0 py-1 text-left text-[13px] cursor-pointer hover:opacity-80"
+                style={{ color: isDimmed ? 'var(--muted-foreground)' : color, opacity: isDimmed ? 0.7 : 1 }}
+                onClick={() => onNavigate(e.title)}
+                title={e.trashed ? 'Trashed' : e.archived ? 'Archived' : undefined}
+              >
+                <span className="flex items-center gap-1 flex-1 truncate">
+                  {e.trashed && <Trash size={12} className="shrink-0" />}
+                  {e.title}
+                  {e.trashed && <span style={{ fontSize: 10, opacity: 0.8 }}>(trashed)</span>}
+                  {e.archived && !e.trashed && <span style={{ marginLeft: 4, fontSize: 10, opacity: 0.8 }}>(archived)</span>}
+                </span>
+                {e.isA && <TypeIcon width={14} height={14} className="shrink-0" style={{ color: isDimmed ? 'var(--muted-foreground)' : color }} />}
+              </button>
+            )
+          })}
+        </div>
+      )}
+    </div>
+  )
+}
+ 
+function formatRelativeDate(timestamp: number): string {
+  const now = Math.floor(Date.now() / 1000)
+  const diff = now - timestamp
+  Iif (diff < 86400) return 'today'
+  const days = Math.floor(diff / 86400)
+  Iif (days === 1) return 'yesterday'
+  Eif (days < 30) return `${days}d ago`
+  const months = Math.floor(days / 30)
+  if (months === 1) return '1mo ago'
+  return `${months}mo ago`
+}
+ 
+function GitHistoryPanel({ commits, onViewCommitDiff }: { commits: GitCommit[]; onViewCommitDiff?: (commitHash: string) => void }) {
+  return (
+    <div>
+      <h4 className="font-mono-overline mb-2 text-muted-foreground">History</h4>
+      {commits.length === 0 ? (
+        <p className="m-0 text-[13px] text-muted-foreground">No revision history</p>
+      ) : (
+        <div className="flex flex-col gap-2.5">
+          {commits.map((c) => (
+            <div key={c.hash} style={{ borderLeft: '2px solid var(--border)', paddingLeft: 10 }}>
+              <div className="mb-0.5 flex items-center justify-between">
+                <button
+                  className="border-none bg-transparent p-0 font-mono text-primary cursor-pointer hover:underline"
+                  style={{ fontSize: 11 }}
+                  onClick={() => onViewCommitDiff?.(c.hash)}
+                  title={`View diff for ${c.shortHash}`}
+                >
+                  {c.shortHash}
+                </button>
+                <span className="text-muted-foreground" style={{ fontSize: 10 }}>{formatRelativeDate(c.date)}</span>
+              </div>
+              <div className="truncate text-xs text-secondary-foreground">{c.message}</div>
+              {c.author && (
+                <div className="truncate text-muted-foreground" style={{ fontSize: 10, marginTop: 1 }}>{c.author}</div>
+              )}
+            </div>
+          ))}
+        </div>
+      )}
+    </div>
+  )
+}
+ 
+function EmptyInspector() {
+  return (
+    <>
+      <div>
+        <p className="m-0 text-[13px] text-muted-foreground">No note selected</p>
+      </div>
+      <div>
+        <p className="m-0 text-[13px] text-muted-foreground">No relationships</p>
+      </div>
+      <div>
+        <h4 className="font-mono-overline mb-2 text-muted-foreground">Backlinks</h4>
+        <p className="m-0 text-[13px] text-muted-foreground">No backlinks</p>
+      </div>
+      <div>
+        <h4 className="font-mono-overline mb-2 text-muted-foreground">History</h4>
+        <p className="m-0 text-[13px] text-muted-foreground">No revision history</p>
+      </div>
+    </>
+  )
+}
+ 
+export function Inspector({
+  collapsed, onToggle, entry, content, entries, allContent, gitHistory, onNavigate,
+  onViewCommitDiff, onUpdateFrontmatter, onDeleteProperty, onAddProperty,
+}: InspectorProps) {
+  const backlinks = useBacklinks(entry, entries, allContent)
+  const frontmatter = useMemo(() => parseFrontmatter(content), [content])
+ 
+  const handleUpdateProperty = useCallback((key: string, value: FrontmatterValue) => {
+    if (entry && onUpdateFrontmatter) onUpdateFrontmatter(entry.path, key, value)
+  }, [entry, onUpdateFrontmatter])
+ 
+  const handleDeleteProperty = useCallback((key: string) => {
+    if (entry && onDeleteProperty) onDeleteProperty(entry.path, key)
+  }, [entry, onDeleteProperty])
+ 
+  const handleAddProperty = useCallback((key: string, value: FrontmatterValue) => {
+    if (entry && onAddProperty) onAddProperty(entry.path, key, value)
+  }, [entry, onAddProperty])
+ 
+  return (
+    <aside className={cn(
+      "flex flex-1 flex-col overflow-y-auto border-l border-border bg-background text-foreground transition-[width] duration-200",
+      collapsed && "!w-10 !min-w-10"
+    )}>
+      <div className="flex items-center border-b border-border" style={{ height: 45, padding: '0 12px', gap: 8 }} data-tauri-drag-region>
+        {collapsed ? (
+          <button className="shrink-0 border-none bg-transparent p-1 text-muted-foreground cursor-pointer hover:text-foreground" onClick={onToggle} style={{ WebkitAppRegion: 'no-drag' } as React.CSSProperties}>
+            <SlidersHorizontal size={16} />
+          </button>
+        ) : (
+          <>
+            <SlidersHorizontal size={16} className="shrink-0 text-muted-foreground" />
+            <span className="flex-1 text-muted-foreground" style={{ fontSize: 13, fontWeight: 600 }}>Properties</span>
+            <button className="shrink-0 border-none bg-transparent p-1 text-muted-foreground cursor-pointer hover:text-foreground" onClick={onToggle} style={{ WebkitAppRegion: 'no-drag' } as React.CSSProperties}>
+              <X size={16} />
+            </button>
+          </>
+        )}
+      </div>
+      {!collapsed && (
+        <div className="flex flex-col gap-4 p-3">
+          {entry ? (
+            <>
+              <DynamicPropertiesPanel
+                entry={entry} content={content} frontmatter={frontmatter}
+                onUpdateProperty={onUpdateFrontmatter ? handleUpdateProperty : undefined}
+                onDeleteProperty={onDeleteProperty ? handleDeleteProperty : undefined}
+                onAddProperty={onAddProperty ? handleAddProperty : undefined}
+                onNavigate={onNavigate}
+              />
+              <DynamicRelationshipsPanel frontmatter={frontmatter} entries={entries} onNavigate={onNavigate} onAddProperty={onAddProperty ? handleAddProperty : undefined} />
+              <BacklinksPanel backlinks={backlinks} onNavigate={onNavigate} />
+              <GitHistoryPanel commits={gitHistory} onViewCommitDiff={onViewCommitDiff} />
+            </>
+          ) : (
+            <EmptyInspector />
+          )}
+        </div>
+      )}
+    </aside>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/NoteList.tsx.html b/coverage/src/components/NoteList.tsx.html new file mode 100644 index 00000000..1d2f6280 --- /dev/null +++ b/coverage/src/components/NoteList.tsx.html @@ -0,0 +1,2188 @@ + + + + + + Code coverage report for src/components/NoteList.tsx + + + + + + + + + +
+
+

All files / src/components NoteList.tsx

+
+ +
+ 85.71% + Statements + 210/245 +
+ + +
+ 76.49% + Branches + 192/251 +
+ + +
+ 85.52% + Functions + 65/76 +
+ + +
+ 87.5% + Lines + 182/208 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +118x +118x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +118x +116x +116x +116x +  +  +  +116x +116x +116x +116x +112x +112x +  +  +  +266x +  +  +  +43x +43x +43x +12x +12x +12x +  +  +  +  +5x +  +  +5x +5x +5x +25x +25x +20x +20x +20x +  +  +5x +  +  +  +78x +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +66x +  +58x +  +4x +  +13x +  +2x +5x +5x +5x +1x +  +  +  +  +2x +  +  +33x +33x +33x +  +33x +  +  +  +  +3x +3x +  +  +  +  +6x +6x +6x +  +6x +28x +22x +22x +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +29x +29x +12x +13x +  +  +  +  +  +  +  +  +6x +6x +6x +  +  +6x +  +  +  +  +  +  +  +6x +6x +  +  +  +  +6x +28x +  +6x +  +  +6x +  +  +28x +  +  +  +  +6x +  +  +6x +6x +  +  +  +  +6x +6x +5x +  +6x +5x +5x +5x +  +  +  +  +6x +28x +  +6x +  +  +6x +1x +  +6x +  +6x +  +  +  +67x +  +61x +  +81x +  +  +  +7x +  +40x +  +  +  +22x +  +  +  +2x +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +67x +67x +  +67x +46x +  +  +  +4x +4x +  +  +67x +  +  +  +  +  +  +4x +  +  +  +  +73x +  +  +  +  +  +  +  +  +16x +  +  +  +  +  +  +  +3x +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +55x +55x +55x +55x +  +55x +55x +55x +  +55x +3x +3x +3x +3x +  +  +  +55x +2x +2x +2x +1x +2x +  +  +  +  +55x +47x +47x +141x +  +47x +  +  +  +55x +47x +3x +15x +  +  +55x +47x +  +  +  +55x +47x +  +  +  +55x +  +55x +49x +  +  +  +55x +  +55x +50x +  +  +  +55x +48x +  +  +  +  +  +  +  +  +  +  +  +55x +50x +5x +8x +  +  +55x +109x +109x +109x +109x +109x +109x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +55x +9x +9x +9x +9x +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +17x +17x +17x +17x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +18x +  +  +  +  +  +  +  +  +55x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +9x +9x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +91x +  +  +  +  +  +  +  +  +2x + 
import { useState, useMemo, useCallback, useEffect, useRef, memo } from 'react'
+// Virtuoso removed — flat list rendering used instead
+import type { VaultEntry, SidebarSelection, ModifiedFile } from '../types'
+import { cn } from '@/lib/utils'
+import { Input } from '@/components/ui/input'
+import {
+  MagnifyingGlass, Plus, Wrench, Flask, Target, ArrowsClockwise,
+  Users, CalendarBlank, Tag, FileText, CaretDown, CaretRight, StackSimple,
+  ArrowsDownUp, Check, Warning,
+} from '@phosphor-icons/react'
+import type { ComponentType, SVGAttributes } from 'react'
+import { getTypeColor, getTypeLightColor } from '../utils/typeColors'
+import { resolveIcon } from './TypeCustomizePopover'
+ 
+const TYPE_ICON_MAP: Record<string, ComponentType<SVGAttributes<SVGSVGElement>>> = {
+  Project: Wrench,
+  Experiment: Flask,
+  Responsibility: Target,
+  Procedure: ArrowsClockwise,
+  Person: Users,
+  Event: CalendarBlank,
+  Topic: Tag,
+  Type: StackSimple,
+}
+ 
+function getTypeIcon(isA: string | null, customIcon?: string | null): ComponentType<SVGAttributes<SVGSVGElement>> {
+  Iif (customIcon) return resolveIcon(customIcon)
+  return (isA && TYPE_ICON_MAP[isA]) || FileText
+}
+ 
+interface NoteListProps {
+  entries: VaultEntry[]
+  selection: SidebarSelection
+  selectedNote: VaultEntry | null
+  allContent: Record<string, string>
+  modifiedFiles?: ModifiedFile[]
+  onSelectNote: (entry: VaultEntry) => void
+  onCreateNote: () => void
+}
+ 
+interface RelationshipGroup {
+  label: string
+  entries: VaultEntry[]
+}
+ 
+function relativeDate(ts: number | null): string {
+  if (!ts) return ''
+  const now = Math.floor(Date.now() / 1000)
+  const diff = now - ts
+  Iif (diff < 0) {
+    const date = new Date(ts * 1000)
+    return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
+  }
+  Iif (diff < 60) return 'just now'
+  Iif (diff < 3600) return `${Math.floor(diff / 60)}m ago`
+  Iif (diff < 86400) return `${Math.floor(diff / 3600)}h ago`
+  if (diff < 604800) return `${Math.floor(diff / 86400)}d ago`
+  const date = new Date(ts * 1000)
+  return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })
+}
+ 
+function getDisplayDate(entry: VaultEntry): number | null {
+  return entry.modifiedAt ?? entry.createdAt
+}
+ 
+function refsMatch(refs: string[], entry: VaultEntry): boolean {
+  const stem = entry.path.replace(/^.*\/Laputa\//, '').replace(/\.md$/, '')
+  const fileStem = entry.filename.replace(/\.md$/, '')
+  return refs.some((ref) => {
+    const raw = ref.replace(/^\[\[/, '').replace(/\]\]$/, '')
+    const inner = raw.split('|')[0]
+    return inner === stem || inner.split('/').pop() === fileStem
+  })
+}
+ 
+function resolveRefs(refs: string[], entries: VaultEntry[]): VaultEntry[] {
+  return refs
+    .map((ref) => {
+      // Strip [[ ]] and remove alias (|display text) if present
+      const raw = ref.replace(/^\[\[/, '').replace(/\]\]$/, '')
+      const inner = raw.split('|')[0]
+      return entries.find((e) => {
+        const stem = e.path.replace(/^.*\/Laputa\//, '').replace(/\.md$/, '')
+        if (stem === inner) return true
+        const fileStem = e.filename.replace(/\.md$/, '')
+        Iif (fileStem === inner.split('/').pop()) return true
+        return false
+      })
+    })
+    .filter((e): e is VaultEntry => e !== undefined)
+}
+ 
+export function sortByModified(a: VaultEntry, b: VaultEntry): number {
+  return (getDisplayDate(b) ?? 0) - (getDisplayDate(a) ?? 0)
+}
+ 
+export type SortOption = 'modified' | 'created' | 'title' | 'status'
+ 
+export const SORT_OPTIONS: { value: SortOption; label: string }[] = [
+  { value: 'modified', label: 'Modified' },
+  { value: 'created', label: 'Created' },
+  { value: 'title', label: 'Title' },
+  { value: 'status', label: 'Status' },
+]
+ 
+const STATUS_ORDER: Record<string, number> = {
+  Active: 0,
+  Paused: 1,
+  Done: 2,
+  Finished: 3,
+}
+ 
+export function getSortComparator(option: SortOption): (a: VaultEntry, b: VaultEntry) => number {
+  switch (option) {
+    case 'modified':
+      return sortByModified
+    case 'created':
+      return (a, b) => (b.createdAt ?? b.modifiedAt ?? 0) - (a.createdAt ?? a.modifiedAt ?? 0)
+    case 'title':
+      return (a, b) => a.title.localeCompare(b.title)
+    case 'status':
+      return (a, b) => {
+        const sa = STATUS_ORDER[a.status ?? ''] ?? 999
+        const sb = STATUS_ORDER[b.status ?? ''] ?? 999
+        if (sa !== sb) return sa - sb
+        return sortByModified(a, b)
+      }
+  }
+}
+ 
+const SORT_STORAGE_KEY = 'laputa-sort-preferences'
+ 
+function loadSortPreferences(): Record<string, SortOption> {
+  try {
+    const raw = localStorage.getItem(SORT_STORAGE_KEY)
+    return raw ? JSON.parse(raw) : {}
+  } catch {
+    return {}
+  }
+}
+ 
+function saveSortPreferences(prefs: Record<string, SortOption>) {
+  try {
+    localStorage.setItem(SORT_STORAGE_KEY, JSON.stringify(prefs))
+  } catch { /* ignore */ }
+}
+ 
+function findBacklinks(entity: VaultEntry, allEntries: VaultEntry[], allContent: Record<string, string>): VaultEntry[] {
+  const stem = entity.filename.replace(/\.md$/, '')
+  const pathStem = entity.path.replace(/^.*\/Laputa\//, '').replace(/\.md$/, '')
+  const targets = [entity.title, ...entity.aliases]
+ 
+  return allEntries.filter((e) => {
+    if (e.path === entity.path) return false
+    const content = allContent[e.path]
+    if (!content) return false
+    for (const t of targets) {
+      Iif (content.includes(`[[${t}]]`)) return true
+    }
+    Iif (content.includes(`[[${stem}]]`)) return true
+    Eif (content.includes(`[[${pathStem}]]`)) return true
+    if (content.includes(`[[${pathStem}|`)) return true
+    return false
+  })
+}
+ 
+function addGroup(
+  groups: RelationshipGroup[],
+  label: string,
+  entries: VaultEntry[],
+  seen: Set<string>,
+) {
+  const unseen = entries.filter((e) => !seen.has(e.path))
+  if (unseen.length > 0) {
+    groups.push({ label, entries: unseen })
+    unseen.forEach((e) => seen.add(e.path))
+  }
+}
+ 
+export function buildRelationshipGroups(
+  entity: VaultEntry,
+  allEntries: VaultEntry[],
+  allContent: Record<string, string>,
+): RelationshipGroup[] {
+  const groups: RelationshipGroup[] = []
+  const seen = new Set<string>([entity.path])
+  const rels = entity.relationships ?? {}
+ 
+  // 0. "Instances" — for type documents, show all entries of this type
+  Iif (entity.isA === 'Type') {
+    const instances = allEntries
+      .filter((e) => e.isA === entity.title && !seen.has(e.path))
+      .sort(sortByModified)
+    addGroup(groups, 'Instances', instances, seen)
+  }
+ 
+  // 1. "Has" — from the entity's own relationships map
+  const hasRefs = rels['Has'] ?? []
+  Iif (hasRefs.length > 0) {
+    addGroup(groups, 'Has', resolveRefs(hasRefs, allEntries).sort(sortByModified), seen)
+  }
+ 
+  // 2. Children — entries whose belongsTo points to this entity (reverse lookup, excluding events)
+  const children = allEntries
+    .filter((e) => !seen.has(e.path) && e.isA !== 'Event' && refsMatch(e.belongsTo, entity))
+    .sort(sortByModified)
+  addGroup(groups, 'Children', children, seen)
+ 
+  // 3. Events — entities of type Event that reference this entity via belongsTo/relatedTo
+  const events = allEntries
+    .filter(
+      (e) =>
+        !seen.has(e.path) &&
+        e.isA === 'Event' &&
+        (refsMatch(e.belongsTo, entity) || refsMatch(e.relatedTo, entity))
+    )
+    .sort(sortByModified)
+  addGroup(groups, 'Events', events, seen)
+ 
+  // 4. "Topics" — from the entity's own relationships map
+  const topicRefs = rels['Topics'] ?? []
+  Iif (topicRefs.length > 0) {
+    addGroup(groups, 'Topics', resolveRefs(topicRefs, allEntries).sort(sortByModified), seen)
+  }
+ 
+  // 5. All other generic relationship fields (alphabetically)
+  const handledKeys = new Set(['Has', 'Topics'])
+  const otherKeys = Object.keys(rels)
+    .filter((k) => !handledKeys.has(k) && k.toLowerCase() !== 'type')
+    .sort((a, b) => a.localeCompare(b))
+  for (const key of otherKeys) {
+    const refs = rels[key]
+    Eif (refs && refs.length > 0) {
+      addGroup(groups, key, resolveRefs(refs, allEntries).sort(sortByModified), seen)
+    }
+  }
+ 
+  // 6. Referenced By — entries that reference this entity via relatedTo (reverse lookup)
+  const referencedBy = allEntries
+    .filter((e) => !seen.has(e.path) && e.isA !== 'Event' && refsMatch(e.relatedTo, entity))
+    .sort(sortByModified)
+  addGroup(groups, 'Referenced By', referencedBy, seen)
+ 
+  // 7. Backlinks — always last
+  const backlinks = findBacklinks(entity, allEntries, allContent)
+    .filter((e) => !seen.has(e.path))
+    .sort(sortByModified)
+  addGroup(groups, 'Backlinks', backlinks, seen)
+ 
+  return groups
+}
+ 
+export function filterEntries(entries: VaultEntry[], selection: SidebarSelection, _modifiedFiles?: ModifiedFile[]): VaultEntry[] {
+  switch (selection.kind) {
+    case 'filter':
+      switch (selection.filter) {
+        case 'all':
+          return entries.filter((e) => !e.archived && !e.trashed)
+        case 'favorites':
+          return []
+        case 'archived':
+          return entries.filter((e) => e.archived && !e.trashed)
+        case 'trash':
+          return entries.filter((e) => e.trashed)
+      }
+      break
+    case 'sectionGroup':
+      return entries.filter((e) => e.isA === selection.type && !e.archived && !e.trashed)
+    case 'entity':
+      return []
+    case 'topic': {
+      const topic = selection.entry
+      return entries.filter((e) => refsMatch(e.relatedTo, topic) && !e.archived && !e.trashed)
+    }
+  }
+}
+ 
+function SortDropdown({
+  groupLabel,
+  current,
+  onChange,
+}: {
+  groupLabel: string
+  current: SortOption
+  onChange: (groupLabel: string, option: SortOption) => void
+}) {
+  const [open, setOpen] = useState(false)
+  const ref = useRef<HTMLDivElement>(null)
+ 
+  useEffect(() => {
+    if (!open) return
+    function handleClick(e: MouseEvent) {
+      if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)
+    }
+    document.addEventListener('mousedown', handleClick)
+    return () => document.removeEventListener('mousedown', handleClick)
+  }, [open])
+ 
+  return (
+    <div ref={ref} className="relative" style={{ zIndex: open ? 10 : 0 }}>
+      <button
+        className={cn(
+          "flex items-center gap-0.5 rounded px-1 py-0.5 text-muted-foreground transition-colors hover:text-foreground hover:bg-accent",
+          open && "bg-accent text-foreground"
+        )}
+        onClick={(e) => { e.stopPropagation(); setOpen(!open) }}
+        title={`Sort by ${current}`}
+        data-testid={`sort-button-${groupLabel}`}
+      >
+        <ArrowsDownUp size={12} />
+        <span className="text-[10px] font-medium">{SORT_OPTIONS.find((o) => o.value === current)?.label}</span>
+      </button>
+      {open && (
+        <div
+          className="absolute right-0 top-full mt-1 rounded-md border border-border bg-popover shadow-md"
+          style={{ width: 130, padding: 4 }}
+          data-testid={`sort-menu-${groupLabel}`}
+        >
+          {SORT_OPTIONS.map((opt) => (
+            <button
+              key={opt.value}
+              className={cn(
+                "flex w-full items-center gap-1.5 rounded px-2 text-[12px] text-popover-foreground hover:bg-accent",
+                opt.value === current && "bg-accent font-medium"
+              )}
+              style={{ height: 28, border: 'none', cursor: 'pointer', background: opt.value === current ? 'var(--accent)' : 'transparent' }}
+              onClick={(e) => {
+                e.stopPropagation()
+                onChange(groupLabel, opt.value)
+                setOpen(false)
+              }}
+              data-testid={`sort-option-${opt.value}`}
+            >
+              {opt.value === current
+                ? <Check size={12} />
+                : <span style={{ width: 12, height: 12, display: 'inline-block' }} />
+              }
+              {opt.label}
+            </button>
+          ))}
+        </div>
+      )}
+    </div>
+  )
+}
+ 
+function NoteListInner({ entries, selection, selectedNote, allContent, modifiedFiles, onSelectNote, onCreateNote }: NoteListProps) {
+  const [search, setSearch] = useState('')
+  const [searchVisible, setSearchVisible] = useState(false)
+  const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(new Set())
+  const [sortPrefs, setSortPrefs] = useState<Record<string, SortOption>>(loadSortPreferences)
+ 
+  const isEntityView = selection.kind === 'entity'
+  const isSectionGroup = selection.kind === 'sectionGroup'
+  const isTrashView = selection.kind === 'filter' && selection.filter === 'trash'
+ 
+  const handleSortChange = useCallback((groupLabel: string, option: SortOption) => {
+    setSortPrefs((prev) => {
+      const next = { ...prev, [groupLabel]: option }
+      saveSortPreferences(next)
+      return next
+    })
+  }, [])
+ 
+  const toggleGroup = useCallback((label: string) => {
+    setCollapsedGroups((prev) => {
+      const next = new Set(prev)
+      if (next.has(label)) next.delete(label)
+      else next.add(label)
+      return next
+    })
+  }, [])
+ 
+  // Build type entry map for custom icon/color lookup
+  const typeEntryMap = useMemo(() => {
+    const map: Record<string, VaultEntry> = {}
+    for (const e of entries) {
+      Iif (e.isA === 'Type') map[e.title] = e
+    }
+    return map
+  }, [entries])
+ 
+  // Find the type document for this section group (e.g., type/project.md for "Project")
+  const typeDocument = useMemo(() => {
+    if (!isSectionGroup) return null
+    const typeName = (selection as { kind: 'sectionGroup'; type: string }).type
+    return entries.find((e) => e.isA === 'Type' && e.title === typeName) ?? null
+  }, [isSectionGroup, selection, entries])
+ 
+  const entityGroups = useMemo(
+    () => isEntityView ? buildRelationshipGroups(selection.entry, entries, allContent) : [],
+    [isEntityView, selection, entries, allContent]
+  )
+ 
+  const filtered = useMemo(
+    () => isEntityView ? [] : filterEntries(entries, selection, modifiedFiles),
+    [entries, selection, modifiedFiles, isEntityView]
+  )
+ 
+  const listSort = sortPrefs['__list__'] ?? 'modified'
+ 
+  const sorted = useMemo(
+    () => isEntityView ? [] : [...filtered].sort(getSortComparator(listSort)),
+    [filtered, isEntityView, listSort]
+  )
+ 
+  const query = search.trim().toLowerCase()
+ 
+  const searched = useMemo(
+    () => query ? sorted.filter((e) => e.title.toLowerCase().includes(query)) : sorted,
+    [sorted, query]
+  )
+ 
+  const searchedGroups = useMemo(
+    () => query
+      ? entityGroups
+          .map((g) => ({
+            ...g,
+            entries: g.entries.filter((e) => e.title.toLowerCase().includes(query)),
+          }))
+          .filter((g) => g.entries.length > 0)
+      : entityGroups,
+    [entityGroups, query]
+  )
+ 
+ 
+  const expiredTrashCount = useMemo(() => {
+    if (!isTrashView) return 0
+    const now = Date.now() / 1000
+    return searched.filter((e) => e.trashedAt && (now - e.trashedAt) >= 86400 * 30).length
+  }, [isTrashView, searched])
+ 
+  const renderItem = useCallback((entry: VaultEntry, isPinned = false) => {
+    const isSelected = selectedNote?.path === entry.path && !isPinned
+    const te = typeEntryMap[entry.isA ?? '']
+    const typeColor = getTypeColor(entry.isA ?? 'Note', te?.color)
+    const typeLightColor = getTypeLightColor(entry.isA ?? 'Note', te?.color)
+    const TypeIcon = getTypeIcon(entry.isA, te?.icon)
+    return (
+      <div
+        key={entry.path}
+        className={cn(
+          "relative cursor-pointer border-b border-[var(--border)] transition-colors",
+          isPinned && "border-l-[3px] border-l-[var(--accent-green)] bg-muted",
+          isSelected && "border-l-[3px]",
+          !isPinned && !isSelected && "hover:bg-muted"
+        )}
+        style={{
+          padding: isPinned || isSelected ? '14px 16px 14px 13px' : '14px 16px',
+          ...(isSelected && {
+            borderLeftColor: typeColor,
+            backgroundColor: typeLightColor,
+          }),
+        }}
+        onClick={() => onSelectNote(entry)}
+      >
+        <TypeIcon
+          width={14}
+          height={14}
+          className="absolute right-3 top-2.5"
+          style={{ color: typeColor }}
+          data-testid="type-icon"
+        />
+        <div className="pr-5">
+          <div className={cn(
+            "truncate text-[13px] text-foreground",
+            isSelected ? "font-semibold" : "font-medium"
+          )}>
+            {entry.title}
+            {entry.archived && (
+              <span
+                className="ml-1.5 inline-block align-middle text-muted-foreground"
+                style={{ fontSize: 9, fontWeight: 500, background: 'var(--muted)', borderRadius: 4, padding: '1px 4px', verticalAlign: 'middle' }}
+              >
+                ARCHIVED
+              </span>
+            )}
+            {entry.trashed && (
+              <span
+                className="ml-1.5 inline-block align-middle"
+                style={{ fontSize: 9, fontWeight: 500, background: 'var(--destructive-light, #ef44441a)', color: 'var(--destructive)', borderRadius: 4, padding: '1px 4px', verticalAlign: 'middle' }}
+              >
+                TRASHED
+              </span>
+            )}
+          </div>
+        </div>
+        <div className="mt-0.5 text-[12px] leading-[1.5] text-muted-foreground" style={{ display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' }}>
+          {entry.snippet}
+        </div>
+        <div className="mt-0.5 text-[10px] text-muted-foreground" style={entry.trashed && entry.trashedAt && (Date.now() / 1000 - entry.trashedAt) >= 86400 * 30 ? { color: 'var(--destructive)', fontWeight: 500 } : undefined}>
+          {entry.trashed && entry.trashedAt
+            ? `Trashed ${relativeDate(entry.trashedAt)}${(Date.now() / 1000 - entry.trashedAt) >= 86400 * 30 ? ' — will be permanently deleted' : ''}`
+            : relativeDate(getDisplayDate(entry))}
+        </div>
+      </div>
+    )
+  }, [selectedNote?.path, onSelectNote, typeEntryMap])
+ 
+  const renderPinnedView = useCallback((entity: VaultEntry, groups: RelationshipGroup[]) => {
+    const ete = typeEntryMap[entity.isA ?? '']
+    const entityTypeColor = getTypeColor(entity.isA ?? '', ete?.color)
+    const entityLightColor = getTypeLightColor(entity.isA ?? '', ete?.color)
+    const EntityIcon = getTypeIcon(entity.isA, ete?.icon)
+    return (
+      <div className="h-full overflow-y-auto">
+        {/* Prominent card */}
+        <div
+          className="relative cursor-pointer border-b border-[var(--border)]"
+          style={{ backgroundColor: entityLightColor, padding: '14px 16px' }}
+          onClick={() => onSelectNote(entity)}
+        >
+          <EntityIcon
+            width={16}
+            height={16}
+            className="absolute right-3 top-3.5"
+            style={{ color: entityTypeColor }}
+            data-testid="type-icon"
+          />
+          <div className="pr-6 text-[14px] font-bold" style={{ color: entityTypeColor }}>
+            {entity.title}
+          </div>
+          <div className="mt-1 text-[12px] leading-[1.5] opacity-80" style={{ color: entityTypeColor, display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' }}>
+            {entity.snippet}
+          </div>
+          <div className="mt-1 text-[11px] opacity-60" style={{ color: entityTypeColor }}>
+            {relativeDate(getDisplayDate(entity))}
+          </div>
+        </div>
+ 
+        {/* Relationship groups */}
+        {groups.length === 0 ? (
+          <div className="px-4 py-8 text-center text-[13px] text-muted-foreground">
+            {query ? 'No matching items' : 'No related items'}
+          </div>
+        ) : (
+          groups.map((group) => {
+            const isGroupCollapsed = collapsedGroups.has(group.label)
+            const groupSort = sortPrefs[group.label] ?? 'modified'
+            const sortedEntries = [...group.entries].sort(getSortComparator(groupSort))
+            return (
+              <div key={group.label}>
+                <div
+                  className="flex w-full items-center justify-between bg-muted"
+                  style={{ height: 32, padding: '0 16px' }}
+                >
+                  <button
+                    className="flex flex-1 items-center gap-1.5 border-none bg-transparent cursor-pointer p-0"
+                    onClick={() => toggleGroup(group.label)}
+                  >
+                    <span className="font-mono-label text-muted-foreground">
+                      {group.label}
+                    </span>
+                    <span className="font-mono-label text-muted-foreground" style={{ fontWeight: 400 }}>{group.entries.length}</span>
+                  </button>
+                  <span className="flex items-center gap-1.5">
+                    <SortDropdown
+                      groupLabel={group.label}
+                      current={groupSort}
+                      onChange={handleSortChange}
+                    />
+                    <button
+                      className="flex items-center border-none bg-transparent cursor-pointer p-0 text-muted-foreground"
+                      onClick={() => toggleGroup(group.label)}
+                    >
+                      {isGroupCollapsed
+                        ? <CaretRight size={12} />
+                        : <CaretDown size={12} />
+                      }
+                    </button>
+                  </span>
+                </div>
+                {!isGroupCollapsed && sortedEntries.map((groupEntry) => renderItem(groupEntry))}
+              </div>
+            )
+          })
+        )}
+      </div>
+    )
+  }, [onSelectNote, query, collapsedGroups, toggleGroup, renderItem, typeEntryMap, sortPrefs, handleSortChange])
+ 
+  return (
+    <div className="flex flex-col overflow-hidden border-r border-border bg-card text-foreground" style={{ height: '100%' }}>
+      {/* Header */}
+      <div className="flex h-[45px] shrink-0 items-center justify-between border-b border-border px-4" data-tauri-drag-region style={{ WebkitAppRegion: 'drag' } as React.CSSProperties}>
+        <h3 className="m-0 min-w-0 flex-1 truncate text-[14px] font-semibold">
+          {isEntityView
+            ? selection.entry.title
+            : typeDocument
+              ? typeDocument.title
+              : selection.kind === 'filter' && (selection as { filter: string }).filter === 'archived'
+                ? 'Archive'
+                : selection.kind === 'filter' && (selection as { filter: string }).filter === 'trash'
+                  ? 'Trash'
+                  : 'Notes'}
+        </h3>
+        <div className="flex items-center gap-3" style={{ WebkitAppRegion: 'no-drag' } as React.CSSProperties}>
+          {!isEntityView && (
+            <SortDropdown
+              groupLabel="__list__"
+              current={listSort}
+              onChange={handleSortChange}
+            />
+          )}
+          <button
+            className="flex items-center text-muted-foreground transition-colors hover:text-foreground"
+            onClick={() => { setSearchVisible(!searchVisible); Iif (searchVisible) setSearch('') }}
+            title="Search notes"
+          >
+            <MagnifyingGlass size={16} />
+          </button>
+          <button
+            className="flex items-center text-muted-foreground transition-colors hover:text-foreground"
+            onClick={onCreateNote}
+            title="Create new note"
+          >
+            <Plus size={16} />
+          </button>
+        </div>
+      </div>
+ 
+      {/* Search (toggle on icon click) */}
+      {searchVisible && (
+        <div className="border-b border-border px-3 py-2">
+          <Input
+            placeholder="Search notes..."
+            value={search}
+            onChange={(e) => setSearch(e.target.value)}
+            className="h-8 text-[13px]"
+            autoFocus
+          />
+        </div>
+      )}
+ 
+      {/* Items */}
+      <div className="flex-1 overflow-hidden" style={{ minHeight: 0 }}>
+        {isEntityView ? (() => {
+          const entity = selection.entry
+          return renderPinnedView(entity, searchedGroups)
+        })() : (
+          <div className="h-full overflow-y-auto">
+            {/* Type document pinned card (for sectionGroup view) */}
+            {typeDocument && (() => {
+              const tde = typeEntryMap[typeDocument.title] ?? typeDocument
+              const tdColor = getTypeColor(typeDocument.isA ?? 'Type', tde?.color)
+              const tdLightColor = getTypeLightColor(typeDocument.isA ?? 'Type', tde?.color)
+              const TDIcon = getTypeIcon(typeDocument.isA, tde?.icon)
+              return (
+                <div
+                  className="relative cursor-pointer border-b border-[var(--border)]"
+                  style={{ backgroundColor: tdLightColor, padding: '14px 16px' }}
+                  onClick={() => onSelectNote(typeDocument)}
+                >
+                  <TDIcon
+                    width={16}
+                    height={16}
+                    className="absolute right-3 top-3.5"
+                    style={{ color: tdColor }}
+                    data-testid="type-icon"
+                  />
+                  <div className="pr-6 text-[14px] font-bold" style={{ color: tdColor }}>
+                    {typeDocument.title}
+                  </div>
+                  <div className="mt-1 text-[12px] leading-[1.5] opacity-80" style={{ color: tdColor, display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' }}>
+                    {typeDocument.snippet}
+                  </div>
+                </div>
+              )
+            })()}
+            {/* 30-day warning banner for trash view */}
+            {isTrashView && expiredTrashCount > 0 && (
+              <div
+                className="flex items-start gap-2 border-b border-[var(--border)]"
+                style={{ padding: '10px 12px', background: 'color-mix(in srgb, var(--destructive) 6%, transparent)' }}
+              >
+                <Warning size={16} className="shrink-0" style={{ color: 'var(--destructive)', marginTop: 1 }} />
+                <div>
+                  <div style={{ fontSize: 12, fontWeight: 600, color: 'var(--destructive)' }}>
+                    Notes in trash for 30+ days will be permanently deleted
+                  </div>
+                  <div className="text-muted-foreground" style={{ fontSize: 11 }}>
+                    {expiredTrashCount} {expiredTrashCount === 1 ? 'note is' : 'notes are'} past the 30-day retention period
+                  </div>
+                </div>
+              </div>
+            )}
+            {searched.length === 0 ? (
+              <div className="px-4 py-8 text-center text-[13px] text-muted-foreground">
+                {isTrashView ? 'Trash is empty' : 'No notes found'}
+              </div>
+            ) : (
+              searched.map((entry) => renderItem(entry))
+            )}
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+ 
+export const NoteList = memo(NoteListInner)
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/QuickOpenPalette.tsx.html b/coverage/src/components/QuickOpenPalette.tsx.html new file mode 100644 index 00000000..32e1b12f --- /dev/null +++ b/coverage/src/components/QuickOpenPalette.tsx.html @@ -0,0 +1,520 @@ + + + + + + Code coverage report for src/components/QuickOpenPalette.tsx + + + + + + + + + +
+
+

All files / src/components QuickOpenPalette.tsx

+
+ +
+ 27.02% + Statements + 20/74 +
+ + +
+ 17.07% + Branches + 7/41 +
+ + +
+ 31.81% + Functions + 7/22 +
+ + +
+ 25.39% + Lines + 16/63 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +22x +22x +22x +  +22x +7x +  +  +  +  +  +  +22x +21x +21x +  +  +  +  +  +  +  +  +  +22x +7x +  +  +22x +7x +  +  +  +  +22x +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useRef, useEffect, useMemo } from 'react'
+import type { VaultEntry } from '../types'
+import { cn } from '@/lib/utils'
+import { Badge } from '@/components/ui/badge'
+ 
+interface QuickOpenPaletteProps {
+  open: boolean
+  entries: VaultEntry[]
+  onSelect: (entry: VaultEntry) => void
+  onClose: () => void
+}
+ 
+/** Simple fuzzy match: all query chars appear in order in the target */
+function fuzzyMatch(query: string, target: string): { match: boolean; score: number } {
+  const q = query.toLowerCase()
+  const t = target.toLowerCase()
+  let qi = 0
+  let score = 0
+  let lastMatchIndex = -1
+ 
+  for (let ti = 0; ti < t.length && qi < q.length; ti++) {
+    if (t[ti] === q[qi]) {
+      if (ti === lastMatchIndex + 1) score += 2
+      if (ti === 0 || t[ti - 1] === ' ' || t[ti - 1] === '-') score += 3
+      score += 1
+      lastMatchIndex = ti
+      qi++
+    }
+  }
+ 
+  return { match: qi === q.length, score }
+}
+ 
+export function QuickOpenPalette({ open, entries, onSelect, onClose }: QuickOpenPaletteProps) {
+  const [query, setQuery] = useState('')
+  const [selectedIndex, setSelectedIndex] = useState(0)
+  const inputRef = useRef<HTMLInputElement>(null)
+  const listRef = useRef<HTMLDivElement>(null)
+ 
+  useEffect(() => {
+    Iif (open) {
+      setQuery('')
+      setSelectedIndex(0)
+      setTimeout(() => inputRef.current?.focus(), 50)
+    }
+  }, [open])
+ 
+  const results = useMemo(() => {
+    Eif (!query.trim()) {
+      return [...entries].sort((a, b) => (b.modifiedAt ?? 0) - (a.modifiedAt ?? 0)).slice(0, 20)
+    }
+    return entries
+      .map((entry) => ({ entry, ...fuzzyMatch(query, entry.title) }))
+      .filter((r) => r.match)
+      .sort((a, b) => b.score - a.score)
+      .slice(0, 20)
+      .map((r) => r.entry)
+  }, [entries, query])
+ 
+  useEffect(() => {
+    setSelectedIndex(0)
+  }, [query])
+ 
+  useEffect(() => {
+    Eif (!listRef.current) return
+    const selected = listRef.current.children[selectedIndex] as HTMLElement | undefined
+    selected?.scrollIntoView({ block: 'nearest' })
+  }, [selectedIndex])
+ 
+  useEffect(() => {
+    Eif (!open) return
+    const handleKey = (e: KeyboardEvent) => {
+      if (e.key === 'Escape') {
+        e.preventDefault()
+        onClose()
+      } else if (e.key === 'ArrowDown') {
+        e.preventDefault()
+        setSelectedIndex((i) => Math.min(i + 1, results.length - 1))
+      } else if (e.key === 'ArrowUp') {
+        e.preventDefault()
+        setSelectedIndex((i) => Math.max(i - 1, 0))
+      } else if (e.key === 'Enter') {
+        e.preventDefault()
+        if (results[selectedIndex]) {
+          onSelect(results[selectedIndex])
+          onClose()
+        }
+      }
+    }
+    window.addEventListener('keydown', handleKey)
+    return () => window.removeEventListener('keydown', handleKey)
+  }, [open, results, selectedIndex, onSelect, onClose])
+ 
+  Eif (!open) return null
+ 
+  return (
+    <div
+      className="fixed inset-0 z-[1000] flex justify-center bg-[var(--shadow-dialog)] pt-[15vh]"
+      onClick={onClose}
+    >
+      <div
+        className="flex w-[500px] max-w-[90vw] max-h-[400px] flex-col self-start overflow-hidden rounded-xl border border-[var(--border-dialog)] bg-popover shadow-[0_8px_32px_var(--shadow-dialog)]"
+        onClick={(e) => e.stopPropagation()}
+      >
+        <input
+          ref={inputRef}
+          className="border-b border-border bg-transparent px-4 py-3 text-[15px] text-foreground outline-none placeholder:text-muted-foreground"
+          type="text"
+          placeholder="Search notes..."
+          value={query}
+          onChange={(e) => setQuery(e.target.value)}
+        />
+        <div className="flex-1 overflow-y-auto py-1" ref={listRef}>
+          {results.length === 0 ? (
+            <div className="px-4 py-4 text-center text-[13px] text-muted-foreground">
+              No matching notes
+            </div>
+          ) : (
+            results.map((entry, i) => (
+              <div
+                key={entry.path}
+                className={cn(
+                  "flex cursor-pointer items-center justify-between px-4 py-2 transition-colors",
+                  i === selectedIndex ? "bg-accent" : "hover:bg-secondary"
+                )}
+                onClick={() => {
+                  onSelect(entry)
+                  onClose()
+                }}
+                onMouseEnter={() => setSelectedIndex(i)}
+              >
+                <span className="text-sm text-foreground">{entry.title}</span>
+                {entry.isA && (
+                  <Badge variant="secondary" className="text-[11px]">
+                    {entry.isA}
+                  </Badge>
+                )}
+              </div>
+            ))
+          )}
+        </div>
+      </div>
+    </div>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ResizeHandle.tsx.html b/coverage/src/components/ResizeHandle.tsx.html new file mode 100644 index 00000000..4f0b7817 --- /dev/null +++ b/coverage/src/components/ResizeHandle.tsx.html @@ -0,0 +1,307 @@ + + + + + + Code coverage report for src/components/ResizeHandle.tsx + + + + + + + + + +
+
+

All files / src/components ResizeHandle.tsx

+
+ +
+ 35.71% + Statements + 15/42 +
+ + +
+ 7.14% + Branches + 1/14 +
+ + +
+ 42.85% + Functions + 3/7 +
+ + +
+ 37.5% + Lines + 15/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75  +  +  +  +  +  +  +67x +67x +67x +67x +  +67x +  +  +  +  +  +  +  +  +  +  +  +67x +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +22x +22x +22x +22x +22x +  +  +  +67x +  +  +  +  +  +  + 
import { useCallback, useEffect, useRef } from 'react'
+ 
+interface ResizeHandleProps {
+  onResize: (delta: number) => void
+}
+ 
+export function ResizeHandle({ onResize }: ResizeHandleProps) {
+  const isDragging = useRef(false)
+  const lastX = useRef(0)
+  const pendingDelta = useRef(0)
+  const rafId = useRef(0)
+ 
+  const handleMouseDown = useCallback(
+    (e: React.MouseEvent) => {
+      e.preventDefault()
+      isDragging.current = true
+      lastX.current = e.clientX
+      pendingDelta.current = 0
+      document.body.style.cursor = 'col-resize'
+      document.body.style.userSelect = 'none'
+    },
+    [],
+  )
+ 
+  useEffect(() => {
+    const handleMouseMove = (e: MouseEvent) => {
+      if (!isDragging.current) return
+      pendingDelta.current += e.clientX - lastX.current
+      lastX.current = e.clientX
+ 
+      if (!rafId.current) {
+        rafId.current = requestAnimationFrame(() => {
+          if (pendingDelta.current !== 0) {
+            onResize(pendingDelta.current)
+            pendingDelta.current = 0
+          }
+          rafId.current = 0
+        })
+      }
+    }
+ 
+    const handleMouseUp = () => {
+      if (isDragging.current) {
+        isDragging.current = false
+        document.body.style.cursor = ''
+        document.body.style.userSelect = ''
+        // Flush any pending delta
+        if (rafId.current) {
+          cancelAnimationFrame(rafId.current)
+          rafId.current = 0
+        }
+        if (pendingDelta.current !== 0) {
+          onResize(pendingDelta.current)
+          pendingDelta.current = 0
+        }
+      }
+    }
+ 
+    document.addEventListener('mousemove', handleMouseMove)
+    document.addEventListener('mouseup', handleMouseUp)
+    return () => {
+      document.removeEventListener('mousemove', handleMouseMove)
+      document.removeEventListener('mouseup', handleMouseUp)
+      Iif (rafId.current) cancelAnimationFrame(rafId.current)
+    }
+  }, [onResize])
+ 
+  return (
+    <div
+      className="-ml-1 w-1 shrink-0 cursor-col-resize bg-transparent transition-colors hover:bg-[var(--border)]"
+      onMouseDown={handleMouseDown}
+    />
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/Sidebar.tsx.html b/coverage/src/components/Sidebar.tsx.html new file mode 100644 index 00000000..4f0684f0 --- /dev/null +++ b/coverage/src/components/Sidebar.tsx.html @@ -0,0 +1,1894 @@ + + + + + + Code coverage report for src/components/Sidebar.tsx + + + + + + + + + +
+
+

All files / src/components Sidebar.tsx

+
+ +
+ 66.07% + Statements + 111/168 +
+ + +
+ 55.92% + Branches + 85/152 +
+ + +
+ 72.41% + Functions + 42/58 +
+ + +
+ 65.69% + Lines + 90/137 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +16x +  +2x +74x +74x +74x +74x +74x +74x +74x +74x +74x +  +  +74x +43x +5x +1x +1x +  +  +5x +5x +  +  +74x +12x +  +  +  +74x +51x +51x +246x +  +51x +  +  +74x +960x +296x +  +  +  +  +  +  +  +74x +51x +246x +4x +8x +  +  +  +  +  +  +  +  +74x +51x +408x +408x +  +  +  +  +  +  +  +  +  +74x +51x +51x +848x +848x +848x +840x +  +  +  +  +74x +  +  +  +  +74x +448x +  +  +  +441x +  +74x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +246x +246x +  +  +74x +37x +  +  +  +  +  +  +  +  +  +  +  +74x +37x +  +  +  +  +  +  +  +  +  +74x +  +  +  +  +  +  +74x +  +  +  +  +  +74x +  +  +  +  +  +  +  +74x +  +  +  +  +  +  +  +74x +3702x +624x +624x +624x +624x +624x +  +624x +3x +3x +1x +  +2x +  +  +  +624x +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +12x +12x +  +  +  +  +  +  +  +  +  +  +  +  +20x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +624x +  +624x +  +  +  +  +  +  +624x +  +  +  +  +  +  +74x +  +  +  +  +  +  +  +  +427x +148x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +72x +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +595x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useMemo, useRef, useEffect, useCallback, memo, type ComponentType } from 'react'
+import type { VaultEntry, SidebarSelection } from '../types'
+import { cn } from '@/lib/utils'
+import { ChevronRight, ChevronDown, GitCommitHorizontal, Plus, SlidersHorizontal, GripVertical } from 'lucide-react'
+import { getTypeColor, getTypeLightColor } from '../utils/typeColors'
+import { resolveIcon, TypeCustomizePopover } from './TypeCustomizePopover'
+import { useSectionVisibility } from '../hooks/useSectionVisibility'
+import {
+  DndContext,
+  closestCenter,
+  KeyboardSensor,
+  PointerSensor,
+  useSensor,
+  useSensors,
+  type DragEndEvent,
+} from '@dnd-kit/core'
+import {
+  SortableContext,
+  sortableKeyboardCoordinates,
+  useSortable,
+  verticalListSortingStrategy,
+} from '@dnd-kit/sortable'
+import { CSS } from '@dnd-kit/utilities'
+import {
+  FileText,
+  Star,
+  Wrench,
+  Flask,
+  Target,
+  ArrowsClockwise,
+  Users,
+  CalendarBlank,
+  Tag,
+  TagSimple,
+  Trash,
+  StackSimple,
+  Archive,
+  type IconProps,
+} from '@phosphor-icons/react'
+ 
+interface SidebarProps {
+  entries: VaultEntry[]
+  selection: SidebarSelection
+  onSelect: (selection: SidebarSelection) => void
+  onSelectNote?: (entry: VaultEntry) => void
+  onCreateType?: (type: string) => void
+  onCreateNewType?: () => void
+  onCustomizeType?: (typeName: string, icon: string, color: string) => void
+  onReorderSections?: (orderedTypes: { typeName: string; order: number }[]) => void
+  modifiedCount?: number
+  onCommitPush?: () => void
+}
+ 
+const TOP_NAV = [
+  { label: 'All Notes', filter: 'all' as const, Icon: FileText },
+  { label: 'Favorites', filter: 'favorites' as const, Icon: Star },
+]
+ 
+interface SectionGroup {
+  label: string
+  type: string
+  Icon: ComponentType<IconProps>
+  customColor?: string | null
+}
+ 
+const BUILT_IN_SECTION_GROUPS: SectionGroup[] = [
+  { label: 'Projects', type: 'Project', Icon: Wrench },
+  { label: 'Experiments', type: 'Experiment', Icon: Flask },
+  { label: 'Responsibilities', type: 'Responsibility', Icon: Target },
+  { label: 'Procedures', type: 'Procedure', Icon: ArrowsClockwise },
+  { label: 'People', type: 'Person', Icon: Users },
+  { label: 'Events', type: 'Event', Icon: CalendarBlank },
+  { label: 'Topics', type: 'Topic', Icon: Tag },
+  { label: 'Types', type: 'Type', Icon: StackSimple },
+]
+ 
+const BUILT_IN_TYPES = new Set(BUILT_IN_SECTION_GROUPS.map((s) => s.type))
+ 
+export const Sidebar = memo(function Sidebar({ entries, selection, onSelect, onSelectNote, onCreateType, onCreateNewType, onCustomizeType, onReorderSections, modifiedCount = 0, onCommitPush }: SidebarProps) {
+  const [collapsed, setCollapsed] = useState<Record<string, boolean>>({})
+  const [customizeTarget, setCustomizeTarget] = useState<string | null>(null)
+  const [contextMenuPos, setContextMenuPos] = useState<{ x: number; y: number } | null>(null)
+  const [contextMenuType, setContextMenuType] = useState<string | null>(null)
+  const contextMenuRef = useRef<HTMLDivElement>(null)
+  const popoverRef = useRef<HTMLDivElement>(null)
+  const [showCustomize, setShowCustomize] = useState(false)
+  const customizeRef = useRef<HTMLDivElement>(null)
+  const { toggleSection: toggleVisibility, isSectionVisible } = useSectionVisibility()
+ 
+  // Close section-visibility popover on outside click
+  useEffect(() => {
+    if (!showCustomize) return
+    const handleClick = (e: MouseEvent) => {
+      Eif (customizeRef.current && !customizeRef.current.contains(e.target as Node)) {
+        setShowCustomize(false)
+      }
+    }
+    document.addEventListener('mousedown', handleClick)
+    return () => document.removeEventListener('mousedown', handleClick)
+  }, [showCustomize])
+ 
+  const toggleSection = (type: string) => {
+    setCollapsed((prev) => ({ ...prev, [type]: !(prev[type] ?? true) }))
+  }
+ 
+  // Build a map of type name → type entry for quick lookup of icon/color
+  const typeEntryMap = useMemo(() => {
+    const map: Record<string, VaultEntry> = {}
+    for (const e of entries) {
+      if (e.isA === 'Type') map[e.title] = e
+    }
+    return map
+  }, [entries])
+ 
+  const isActive = (sel: SidebarSelection): boolean => {
+    if (selection.kind !== sel.kind) return false
+    Eif (sel.kind === 'filter' && selection.kind === 'filter') return sel.filter === selection.filter
+    if (sel.kind === 'sectionGroup' && selection.kind === 'sectionGroup') return sel.type === selection.type
+    if (sel.kind === 'entity' && selection.kind === 'entity') return sel.entry.path === selection.entry.path
+    if (sel.kind === 'topic' && selection.kind === 'topic') return sel.entry.path === selection.entry.path
+    return false
+  }
+ 
+  // Derive custom type sections from Type entries not in the built-in list
+  const customSectionGroups: SectionGroup[] = useMemo(() => {
+    return entries
+      .filter((e) => e.isA === 'Type' && !BUILT_IN_TYPES.has(e.title))
+      .sort((a, b) => a.title.localeCompare(b.title))
+      .map((e) => ({
+        label: e.title + 's',
+        type: e.title,
+        Icon: resolveIcon(e.icon),
+        customColor: e.color,
+      }))
+  }, [entries])
+ 
+  // For built-in types, check if they have custom icon/color overrides from their type entry
+  const builtInWithOverrides: SectionGroup[] = useMemo(() => {
+    return BUILT_IN_SECTION_GROUPS.map((sg) => {
+      const typeEntry = typeEntryMap[sg.type]
+      Eif (!typeEntry?.icon && !typeEntry?.color) return sg
+      return {
+        ...sg,
+        Icon: typeEntry?.icon ? resolveIcon(typeEntry.icon) : sg.Icon,
+        customColor: typeEntry?.color ?? null,
+      }
+    })
+  }, [typeEntryMap])
+ 
+  // Merge built-in and custom sections, then sort by order from type entries
+  const allSectionGroups = useMemo(() => {
+    const merged = [...builtInWithOverrides, ...customSectionGroups]
+    return merged.sort((a, b) => {
+      const orderA = typeEntryMap[a.type]?.order ?? Infinity
+      const orderB = typeEntryMap[b.type]?.order ?? Infinity
+      if (orderA !== orderB) return orderA - orderB
+      return a.label.localeCompare(b.label)
+    })
+  }, [builtInWithOverrides, customSectionGroups, typeEntryMap])
+ 
+  // DnD sensors with activation distance to avoid accidental drags on click
+  const sensors = useSensors(
+    useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),
+    useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),
+  )
+ 
+  const visibleSections = useMemo(
+    () => allSectionGroups.filter((g) => isSectionVisible(g.type)),
+    [allSectionGroups, isSectionVisible],
+  )
+ 
+  const sectionIds = useMemo(() => visibleSections.map((g) => g.type), [visibleSections])
+ 
+  const handleDragEnd = useCallback((event: DragEndEvent) => {
+    const { active, over } = event
+    if (!over || active.id === over.id) return
+ 
+    const oldIndex = sectionIds.indexOf(active.id as string)
+    const newIndex = sectionIds.indexOf(over.id as string)
+    if (oldIndex === -1 || newIndex === -1) return
+ 
+    // Compute new order: assign sequential order values to the reordered list
+    const reordered = [...sectionIds]
+    reordered.splice(oldIndex, 1)
+    reordered.splice(newIndex, 0, active.id as string)
+ 
+    const updates = reordered.map((typeName, i) => ({ typeName, order: i }))
+    onReorderSections?.(updates)
+  }, [sectionIds, onReorderSections])
+ 
+  const archivedCount = useMemo(() => entries.filter((e) => e.archived).length, [entries])
+  const trashedCount = useMemo(() => entries.filter((e) => e.trashed).length, [entries])
+ 
+  // Close context menu on outside click
+  useEffect(() => {
+    Eif (!contextMenuPos) return
+    const handler = (e: MouseEvent) => {
+      if (contextMenuRef.current && !contextMenuRef.current.contains(e.target as Node)) {
+        setContextMenuPos(null)
+        setContextMenuType(null)
+      }
+    }
+    document.addEventListener('mousedown', handler)
+    return () => document.removeEventListener('mousedown', handler)
+  }, [contextMenuPos])
+ 
+  // Close customize popover on outside click
+  useEffect(() => {
+    Eif (!customizeTarget) return
+    const handler = (e: MouseEvent) => {
+      if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {
+        setCustomizeTarget(null)
+      }
+    }
+    document.addEventListener('mousedown', handler)
+    return () => document.removeEventListener('mousedown', handler)
+  }, [customizeTarget])
+ 
+  const handleContextMenu = useCallback((e: React.MouseEvent, type: string) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setContextMenuPos({ x: e.clientX, y: e.clientY })
+    setContextMenuType(type)
+  }, [])
+ 
+  const openCustomizePopover = useCallback((type: string) => {
+    setContextMenuPos(null)
+    setContextMenuType(null)
+    setCustomizeTarget(type)
+  }, [])
+ 
+  const handleCustomizeIcon = useCallback((icon: string) => {
+    if (!customizeTarget) return
+    const typeEntry = typeEntryMap[customizeTarget]
+    if (typeEntry && onCustomizeType) {
+      onCustomizeType(customizeTarget, icon, typeEntry.color ?? 'blue')
+    }
+  }, [customizeTarget, typeEntryMap, onCustomizeType])
+ 
+  const handleCustomizeColor = useCallback((color: string) => {
+    if (!customizeTarget) return
+    const typeEntry = typeEntryMap[customizeTarget]
+    if (typeEntry && onCustomizeType) {
+      onCustomizeType(customizeTarget, typeEntry.icon ?? 'file-text', color)
+    }
+  }, [customizeTarget, typeEntryMap, onCustomizeType])
+ 
+  const renderSectionContent = ({ label, type, Icon, customColor }: SectionGroup, dragHandleProps?: Record<string, unknown>) => {
+    const items = entries.filter((e) => e.isA === type && !e.archived && !e.trashed)
+    const isCollapsed = collapsed[type] ?? true
+    const isTopic = type === 'Topic'
+    const isTypeSection = type === 'Type'
+    const sectionColor = getTypeColor(type, customColor)
+    const sectionLightColor = getTypeLightColor(type, customColor)
+ 
+    const handlePlusClick = (e: React.MouseEvent) => {
+      e.stopPropagation()
+      if (isTypeSection) {
+        onCreateNewType?.()
+      } else {
+        onCreateType?.(type)
+      }
+    }
+ 
+    return (
+      <>
+        {/* Section header row */}
+        <div
+          className={cn(
+            "group/section flex cursor-pointer select-none items-center justify-between rounded transition-colors",
+            isActive({ kind: 'sectionGroup', type })
+              ? "bg-secondary"
+              : "hover:bg-accent"
+          )}
+          style={{ padding: '6px 8px 6px 6px', borderRadius: 4, gap: 4 }}
+          onClick={() => onSelect({ kind: 'sectionGroup', type })}
+          onContextMenu={(e) => handleContextMenu(e, type)}
+        >
+          <div className="flex items-center" style={{ gap: 4 }}>
+            {/* Drag handle */}
+            <div
+              className="flex shrink-0 items-center justify-center text-muted-foreground opacity-0 group-hover/section:opacity-50 hover:!opacity-100 cursor-grab"
+              style={{ width: 16, height: 16 }}
+              {...dragHandleProps}
+              aria-label={`Drag to reorder ${label}`}
+            >
+              <GripVertical size={12} />
+            </div>
+            <Icon size={16} style={{ color: sectionColor }} />
+            <span className="text-[13px] font-medium text-foreground" style={{ marginLeft: 4 }}>{label}</span>
+          </div>
+          <div className="flex items-center" style={{ gap: 2 }}>
+            {(onCreateType || (isTypeSection && onCreateNewType)) && (
+              <button
+                className="flex shrink-0 items-center justify-center rounded border-none bg-transparent p-0 text-muted-foreground opacity-0 transition-opacity hover:text-foreground group-hover/section:opacity-100 cursor-pointer"
+                style={{ width: 20, height: 20 }}
+                onClick={handlePlusClick}
+                aria-label={isTypeSection ? 'Create new Type' : `Create new ${type}`}
+                title={isTypeSection ? 'New Type' : `New ${type}`}
+              >
+                <Plus size={14} />
+              </button>
+            )}
+            <button
+              className="flex shrink-0 items-center border-none bg-transparent p-0 text-inherit cursor-pointer"
+              onClick={(e) => {
+                e.stopPropagation()
+                toggleSection(type)
+              }}
+              aria-label={isCollapsed ? `Expand ${label}` : `Collapse ${label}`}
+            >
+              {isCollapsed ? <ChevronRight size={12} /> : <ChevronDown size={12} />}
+            </button>
+          </div>
+        </div>
+ 
+        {/* Children items */}
+        {!isCollapsed && items.length > 0 && (
+          <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
+            {items.map((entry) => (
+              <div
+                key={entry.path}
+                className={cn(
+                  "cursor-pointer truncate rounded-md text-[13px] font-normal transition-colors",
+                  isActive(isTopic ? { kind: 'topic', entry } : { kind: 'entity', entry })
+                    ? "text-foreground"
+                    : "text-muted-foreground hover:bg-accent"
+                )}
+                style={{
+                  padding: '4px 16px 4px 28px',
+                  ...(isActive(isTopic ? { kind: 'topic', entry } : { kind: 'entity', entry }) && {
+                    backgroundColor: sectionLightColor,
+                    color: sectionColor,
+                  }),
+                }}
+                onClick={() => {
+                  onSelect(isTopic ? { kind: 'topic', entry } : { kind: 'entity', entry })
+                  onSelectNote?.(entry)
+                }}
+              >
+                {entry.title}
+              </div>
+            ))}
+          </div>
+        )}
+      </>
+    )
+  }
+ 
+  function SortableSection({ group }: { group: SectionGroup }) {
+    const {
+      attributes,
+      listeners,
+      setNodeRef,
+      transform,
+      transition,
+      isDragging,
+    } = useSortable({ id: group.type })
+ 
+    const style = {
+      transform: CSS.Transform.toString(transform),
+      transition,
+      opacity: isDragging ? 0.5 : 1,
+      padding: '4px 6px',
+    }
+ 
+    return (
+      <div ref={setNodeRef} style={style} {...attributes}>
+        {renderSectionContent(group, listeners)}
+      </div>
+    )
+  }
+ 
+  return (
+    <aside className="flex h-full flex-col overflow-hidden border-r border-[var(--sidebar-border)] bg-sidebar text-sidebar-foreground" style={{ paddingTop: 38 } as React.CSSProperties}>
+      {/* Native macOS title bar on top */}
+ 
+      {/* Navigation */}
+      <nav className="flex-1 overflow-y-auto">
+        {/* Top nav — All Notes + Favorites */}
+        <div className="border-b border-border" style={{ padding: '4px 6px' }}>
+          {TOP_NAV.map(({ label, filter, Icon }) => {
+            const count = filter === 'all' ? entries.filter((e) => !e.archived && !e.trashed).length : 0
+            return (
+              <div
+                key={filter}
+                className={cn(
+                  "flex cursor-pointer select-none items-center gap-2 rounded transition-colors",
+                  isActive({ kind: 'filter', filter })
+                    ? "bg-primary/10 text-primary"
+                    : "text-foreground hover:bg-accent"
+                )}
+                style={{ padding: '6px 16px', borderRadius: 4 }}
+                onClick={() => onSelect({ kind: 'filter', filter })}
+              >
+                <Icon size={16} />
+                <span className="flex-1 text-[13px] font-medium">{label}</span>
+                {count > 0 && (
+                  <span
+                    className="flex items-center justify-center bg-primary text-primary-foreground"
+                    style={{ height: 20, borderRadius: 9999, padding: '0 6px', fontSize: 10 }}
+                  >
+                    {count}
+                  </span>
+                )}
+              </div>
+            )
+          })}
+          {/* Archive filter */}
+          <div
+            className={cn(
+              "flex cursor-pointer select-none items-center gap-2 rounded transition-colors",
+              isActive({ kind: 'filter', filter: 'archived' })
+                ? "bg-primary/10 text-primary"
+                : "text-foreground hover:bg-accent"
+            )}
+            style={{ padding: '6px 16px', borderRadius: 4 }}
+            onClick={() => onSelect({ kind: 'filter', filter: 'archived' })}
+          >
+            <Archive size={16} />
+            <span className="flex-1 text-[13px] font-medium">Archive</span>
+            {archivedCount > 0 && (
+              <span
+                className="flex items-center justify-center text-muted-foreground"
+                style={{ height: 20, borderRadius: 9999, padding: '0 6px', fontSize: 10, background: 'var(--muted)' }}
+              >
+                {archivedCount}
+              </span>
+            )}
+          </div>
+          {/* Disabled placeholders */}
+          <div
+            className="flex select-none items-center gap-2 rounded text-foreground"
+            style={{ padding: '6px 16px', borderRadius: 4, opacity: 0.4, cursor: 'not-allowed' }}
+            title="Coming soon"
+          >
+            <TagSimple size={16} />
+            <span className="flex-1 text-[13px] font-medium">Untagged</span>
+          </div>
+          {/* Trash filter */}
+          <div
+            className={cn(
+              "flex cursor-pointer select-none items-center gap-2 rounded transition-colors",
+              isActive({ kind: 'filter', filter: 'trash' })
+                ? "bg-destructive/10 text-destructive"
+                : "text-foreground hover:bg-accent"
+            )}
+            style={{ padding: '6px 16px', borderRadius: 4 }}
+            onClick={() => onSelect({ kind: 'filter', filter: 'trash' })}
+          >
+            <Trash size={16} />
+            <span className="flex-1 text-[13px] font-medium">Trash</span>
+            {trashedCount > 0 && (
+              <span
+                className="flex items-center justify-center text-muted-foreground"
+                style={{ height: 20, borderRadius: 9999, padding: '0 6px', fontSize: 10, background: 'var(--muted)' }}
+              >
+                {trashedCount}
+              </span>
+            )}
+          </div>
+        </div>
+ 
+        {/* Sections header + customize popover */}
+        <div ref={customizeRef} style={{ position: 'relative', padding: '4px 6px 0' }}>
+          <div
+            className="flex w-full select-none items-center justify-between"
+            style={{ padding: '4px 16px' }}
+          >
+            <span className="text-[11px] font-semibold uppercase tracking-wider text-muted-foreground">Sections</span>
+            <button
+              className="flex shrink-0 cursor-pointer items-center justify-center rounded border-none bg-transparent p-0 text-muted-foreground transition-colors hover:text-foreground"
+              style={{ width: 20, height: 20 }}
+              onClick={() => setShowCustomize((v) => !v)}
+              aria-label="Customize sections"
+              title="Customize sections"
+            >
+              <SlidersHorizontal size={14} />
+            </button>
+          </div>
+ 
+          {showCustomize && (
+            <div
+              className="border border-border bg-popover text-popover-foreground"
+              style={{
+                position: 'absolute',
+                top: '100%',
+                left: 6,
+                right: 6,
+                zIndex: 50,
+                borderRadius: 8,
+                padding: '8px 0',
+                boxShadow: '0 4px 12px rgba(0,0,0,0.12)',
+              }}
+            >
+              <div className="text-[12px] font-semibold text-muted-foreground" style={{ padding: '0 12px 4px' }}>
+                Show in sidebar
+              </div>
+              {allSectionGroups.map(({ label, type, Icon }) => (
+                <button
+                  key={type}
+                  className="flex w-full cursor-pointer items-center border-none bg-transparent transition-colors hover:bg-accent"
+                  style={{ padding: '6px 12px', gap: 8 }}
+                  onClick={() => toggleVisibility(type)}
+                  aria-label={`Toggle ${label}`}
+                >
+                  <Icon size={14} style={{ color: getTypeColor(type) }} />
+                  <span className="flex-1 text-left text-[13px] text-foreground">{label}</span>
+                  <div
+                    className="flex items-center"
+                    style={{
+                      width: 32,
+                      height: 18,
+                      borderRadius: 9,
+                      padding: 2,
+                      backgroundColor: isSectionVisible(type) ? 'var(--primary)' : 'var(--muted)',
+                      justifyContent: isSectionVisible(type) ? 'flex-end' : 'flex-start',
+                      transition: 'background-color 150ms',
+                    }}
+                  >
+                    <div
+                      style={{
+                        width: 14,
+                        height: 14,
+                        borderRadius: 7,
+                        backgroundColor: 'white',
+                        transition: 'transform 150ms',
+                      }}
+                    />
+                  </div>
+                </button>
+              ))}
+            </div>
+          )}
+        </div>
+ 
+        {/* Section Groups (built-in + custom), filtered by visibility, sortable by drag */}
+        <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>
+          <SortableContext items={sectionIds} strategy={verticalListSortingStrategy}>
+            {visibleSections.map((g) => (
+              <SortableSection key={g.type} group={g} />
+            ))}
+          </SortableContext>
+        </DndContext>
+      </nav>
+ 
+      {/* Commit button — always visible */}
+      {onCommitPush && (
+        <div className="shrink-0 border-t border-border" style={{ padding: 12 }}>
+          <button
+            className="flex w-full items-center justify-center bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"
+            style={{ borderRadius: 6, gap: 6, padding: '8px 16px', border: 'none', cursor: 'pointer' }}
+            onClick={onCommitPush}
+          >
+            <GitCommitHorizontal size={14} />
+            <span className="text-[13px] font-medium">Commit & Push</span>
+            {modifiedCount > 0 && (
+              <span
+                className="text-white font-semibold"
+                style={{ background: '#ffffff40', borderRadius: 9, padding: '0 6px', fontSize: 10 }}
+              >
+                {modifiedCount}
+              </span>
+            )}
+          </button>
+        </div>
+      )}
+ 
+      {/* Context menu (right-click on section header) */}
+      {contextMenuPos && contextMenuType && (
+        <div
+          ref={contextMenuRef}
+          className="fixed z-50 rounded-md border bg-popover p-1 shadow-md"
+          style={{ left: contextMenuPos.x, top: contextMenuPos.y, minWidth: 180 }}
+        >
+          <button
+            className="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm cursor-default hover:bg-accent hover:text-accent-foreground transition-colors border-none bg-transparent text-left"
+            onClick={() => openCustomizePopover(contextMenuType)}
+          >
+            Customize icon & color…
+          </button>
+        </div>
+      )}
+ 
+      {/* Customize popover */}
+      {customizeTarget && (
+        <div
+          ref={popoverRef}
+          className="fixed z-50"
+          style={{ left: 20, top: 100 }}
+        >
+          <TypeCustomizePopover
+            currentIcon={typeEntryMap[customizeTarget]?.icon ?? null}
+            currentColor={typeEntryMap[customizeTarget]?.color ?? null}
+            onChangeIcon={handleCustomizeIcon}
+            onChangeColor={handleCustomizeColor}
+            onClose={() => setCustomizeTarget(null)}
+          />
+        </div>
+      )}
+    </aside>
+  )
+})
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/StatusBar.tsx.html b/coverage/src/components/StatusBar.tsx.html new file mode 100644 index 00000000..737f15a1 --- /dev/null +++ b/coverage/src/components/StatusBar.tsx.html @@ -0,0 +1,562 @@ + + + + + + Code coverage report for src/components/StatusBar.tsx + + + + + + + + + +
+
+

All files / src/components StatusBar.tsx

+
+ +
+ 34.78% + Statements + 8/23 +
+ + +
+ 18.18% + Branches + 4/22 +
+ + +
+ 27.27% + Functions + 3/11 +
+ + +
+ 35.29% + Lines + 6/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +22x +  +22x +  +22x +7x +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useRef, useEffect } from 'react'
+import { Package, GitBranch, RefreshCw, Sparkles, FileText, Bell, Settings, FolderOpen, Check } from 'lucide-react'
+ 
+export interface VaultOption {
+  label: string
+  path: string
+}
+ 
+interface StatusBarProps {
+  noteCount: number
+  vaultPath: string
+  vaults: VaultOption[]
+  onSwitchVault: (path: string) => void
+}
+ 
+export function StatusBar({ noteCount, vaultPath, vaults, onSwitchVault }: StatusBarProps) {
+  const [showVaultMenu, setShowVaultMenu] = useState(false)
+  const menuRef = useRef<HTMLDivElement>(null)
+ 
+  const activeVault = vaults.find((v) => v.path === vaultPath)
+ 
+  useEffect(() => {
+    Eif (!showVaultMenu) return
+    const handleClick = (e: MouseEvent) => {
+      if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
+        setShowVaultMenu(false)
+      }
+    }
+    document.addEventListener('mousedown', handleClick)
+    return () => document.removeEventListener('mousedown', handleClick)
+  }, [showVaultMenu])
+ 
+  return (
+    <footer
+      style={{
+        height: 30,
+        flexShrink: 0,
+        display: 'flex',
+        alignItems: 'center',
+        justifyContent: 'space-between',
+        background: 'var(--sidebar)',
+        borderTop: '1px solid var(--border)',
+        padding: '0 8px',
+        fontSize: 11,
+        color: 'var(--muted-foreground)',
+      }}
+    >
+      {/* Left section */}
+      <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
+        <div ref={menuRef} style={{ position: 'relative' }}>
+          <span
+            role="button"
+            onClick={() => setShowVaultMenu((v) => !v)}
+            style={{
+              display: 'flex',
+              alignItems: 'center',
+              gap: 4,
+              cursor: 'pointer',
+              padding: '2px 4px',
+              borderRadius: 3,
+              background: showVaultMenu ? 'var(--hover)' : 'transparent',
+            }}
+            title="Switch vault"
+          >
+            <FolderOpen size={13} />
+            {activeVault?.label ?? 'Vault'}
+          </span>
+          {showVaultMenu && (
+            <div
+              style={{
+                position: 'absolute',
+                bottom: '100%',
+                left: 0,
+                marginBottom: 4,
+                background: 'var(--sidebar)',
+                border: '1px solid var(--border)',
+                borderRadius: 6,
+                padding: 4,
+                minWidth: 160,
+                boxShadow: '0 4px 12px rgba(0,0,0,0.3)',
+                zIndex: 1000,
+              }}
+            >
+              {vaults.map((v) => (
+                <div
+                  key={v.path}
+                  role="button"
+                  onClick={() => {
+                    onSwitchVault(v.path)
+                    setShowVaultMenu(false)
+                  }}
+                  style={{
+                    display: 'flex',
+                    alignItems: 'center',
+                    gap: 6,
+                    padding: '4px 8px',
+                    borderRadius: 4,
+                    cursor: 'pointer',
+                    background: v.path === vaultPath ? 'var(--hover)' : 'transparent',
+                    color: v.path === vaultPath ? 'var(--foreground)' : 'var(--muted-foreground)',
+                    fontSize: 12,
+                  }}
+                  onMouseEnter={(e) => {
+                    if (v.path !== vaultPath) e.currentTarget.style.background = 'var(--hover)'
+                  }}
+                  onMouseLeave={(e) => {
+                    if (v.path !== vaultPath) e.currentTarget.style.background = 'transparent'
+                  }}
+                >
+                  {v.path === vaultPath ? <Check size={12} /> : <span style={{ width: 12 }} />}
+                  {v.label}
+                </div>
+              ))}
+            </div>
+          )}
+        </div>
+        <span style={{ color: 'var(--border)' }}>|</span>
+        <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
+          <Package size={13} />
+          v0.4.2
+        </span>
+        <span style={{ color: 'var(--border)' }}>|</span>
+        <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
+          <GitBranch size={13} />
+          main
+        </span>
+        <span style={{ color: 'var(--border)' }}>|</span>
+        <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
+          <RefreshCw size={13} style={{ color: 'var(--accent-green)' }} />
+          Synced 2m ago
+        </span>
+      </div>
+ 
+      {/* Right section */}
+      <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
+        <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
+          <Sparkles size={13} style={{ color: 'var(--accent-purple)' }} />
+          Claude Sonnet 4
+        </span>
+        <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
+          <FileText size={13} />
+          {noteCount.toLocaleString()} notes
+        </span>
+        <span
+          style={{ display: 'flex', alignItems: 'center', opacity: 0.4, cursor: 'not-allowed' }}
+          title="Coming soon"
+        >
+          <Bell size={14} />
+        </span>
+        <span
+          style={{ display: 'flex', alignItems: 'center', opacity: 0.4, cursor: 'not-allowed' }}
+          title="Coming soon"
+        >
+          <Settings size={14} />
+        </span>
+      </div>
+    </footer>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/TabBar.tsx.html b/coverage/src/components/TabBar.tsx.html new file mode 100644 index 00000000..1c650418 --- /dev/null +++ b/coverage/src/components/TabBar.tsx.html @@ -0,0 +1,715 @@ + + + + + + Code coverage report for src/components/TabBar.tsx + + + + + + + + + +
+
+

All files / src/components TabBar.tsx

+
+ +
+ 92.15% + Statements + 47/51 +
+ + +
+ 79.54% + Branches + 35/44 +
+ + +
+ 91.66% + Functions + 11/12 +
+ + +
+ 92.15% + Lines + 47/51 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +3x +  +  +29x +29x +29x +  +29x +2x +2x +2x +  +2x +2x +2x +2x +  +  +  +  +  +  +29x +2x +2x +  +2x +2x +2x +  +  +29x +2x +2x +2x +1x +1x +  +  +1x +1x +1x +2x +  +  +29x +2x +2x +  +1x +1x +1x +  +  +2x +  +  +29x +  +  +  +  +  +  +  +29x +  +  +  +  +  +  +  +36x +36x +36x +36x +  +  +  +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { memo, useState, useRef, useCallback } from 'react'
+import type { VaultEntry } from '../types'
+import { cn } from '@/lib/utils'
+import { X } from 'lucide-react'
+import { Plus, Columns, ArrowsOutSimple } from '@phosphor-icons/react'
+ 
+interface Tab {
+  entry: VaultEntry
+  content: string
+}
+ 
+interface TabBarProps {
+  tabs: Tab[]
+  activeTabPath: string | null
+  onSwitchTab: (path: string) => void
+  onCloseTab: (path: string) => void
+  onCreateNote?: () => void
+  onReorderTabs?: (fromIndex: number, toIndex: number) => void
+}
+ 
+const DISABLED_ICON_STYLE = { opacity: 0.4, cursor: 'not-allowed' } as const
+ 
+export const TabBar = memo(function TabBar({
+  tabs, activeTabPath, onSwitchTab, onCloseTab, onCreateNote, onReorderTabs,
+}: TabBarProps) {
+  const [dragIndex, setDragIndex] = useState<number | null>(null)
+  const [dropIndex, setDropIndex] = useState<number | null>(null)
+  const dragNodeRef = useRef<HTMLDivElement | null>(null)
+ 
+  const handleDragStart = useCallback((e: React.DragEvent<HTMLDivElement>, index: number) => {
+    setDragIndex(index)
+    e.dataTransfer.effectAllowed = 'move'
+    e.dataTransfer.setData('text/plain', String(index))
+    // Make the drag image slightly transparent
+    Eif (e.currentTarget) {
+      dragNodeRef.current = e.currentTarget
+      requestAnimationFrame(() => {
+        Iif (dragNodeRef.current) {
+          dragNodeRef.current.style.opacity = '0.5'
+        }
+      })
+    }
+  }, [])
+ 
+  const handleDragEnd = useCallback(() => {
+    Eif (dragNodeRef.current) {
+      dragNodeRef.current.style.opacity = ''
+    }
+    dragNodeRef.current = null
+    setDragIndex(null)
+    setDropIndex(null)
+  }, [])
+ 
+  const handleDragOver = useCallback((e: React.DragEvent<HTMLDivElement>, index: number) => {
+    e.preventDefault()
+    e.dataTransfer.dropEffect = 'move'
+    if (dragIndex === null || dragIndex === index) {
+      setDropIndex(null)
+      return
+    }
+    // Determine drop position based on cursor within the tab
+    const rect = e.currentTarget.getBoundingClientRect()
+    const midpoint = rect.left + rect.width / 2
+    const insertIndex = e.clientX < midpoint ? index : index + 1
+    setDropIndex(insertIndex)
+  }, [dragIndex])
+ 
+  const handleDrop = useCallback((e: React.DragEvent<HTMLDivElement>) => {
+    e.preventDefault()
+    if (dragIndex !== null && dropIndex !== null && dragIndex !== dropIndex && onReorderTabs) {
+      // Adjust target index: if dropping after the dragged item, account for removal
+      const toIndex = dropIndex > dragIndex ? dropIndex - 1 : dropIndex
+      Eif (toIndex !== dragIndex) {
+        onReorderTabs(dragIndex, toIndex)
+      }
+    }
+    handleDragEnd()
+  }, [dragIndex, dropIndex, onReorderTabs, handleDragEnd])
+ 
+  const handleDragLeave = useCallback((e: React.DragEvent<HTMLDivElement>) => {
+    // Only clear if we're leaving the tab bar entirely
+    const relatedTarget = e.relatedTarget as HTMLElement | null
+    if (!e.currentTarget.contains(relatedTarget)) {
+      setDropIndex(null)
+    }
+  }, [])
+ 
+  return (
+    <div
+      className="flex shrink-0 items-stretch"
+      style={{ height: 45, background: 'var(--sidebar)', WebkitAppRegion: 'drag' } as React.CSSProperties}
+      data-tauri-drag-region
+      onDragLeave={handleDragLeave}
+    >
+      {tabs.map((tab, index) => {
+        const isActive = tab.entry.path === activeTabPath
+        const showDropBefore = dropIndex === index
+        const showDropAfter = dropIndex === index + 1 && index === tabs.length - 1
+        return (
+          <div
+            key={tab.entry.path}
+            draggable
+            onDragStart={(e) => handleDragStart(e, index)}
+            onDragEnd={handleDragEnd}
+            onDragOver={(e) => handleDragOver(e, index)}
+            onDrop={handleDrop}
+            className={cn(
+              "group flex shrink-0 items-center gap-1.5 whitespace-nowrap max-w-[180px] transition-all relative",
+              isActive
+                ? "text-foreground"
+                : "text-muted-foreground hover:text-secondary-foreground"
+            )}
+            style={{
+              background: isActive ? 'var(--background)' : 'transparent',
+              borderRight: `1px solid ${isActive ? 'var(--border)' : 'var(--sidebar-border)'}`,
+              borderBottom: isActive ? 'none' : '1px solid var(--sidebar-border)',
+              padding: '0 12px',
+              fontSize: 12,
+              fontWeight: isActive ? 500 : 400,
+              cursor: dragIndex !== null ? 'grabbing' : 'grab',
+              WebkitAppRegion: 'no-drag',
+            } as React.CSSProperties}
+            onClick={() => onSwitchTab(tab.entry.path)}
+          >
+            {showDropBefore && (
+              <div
+                style={{
+                  position: 'absolute',
+                  left: -1,
+                  top: 8,
+                  bottom: 8,
+                  width: 2,
+                  background: 'var(--primary)',
+                  borderRadius: 1,
+                  zIndex: 10,
+                }}
+              />
+            )}
+            <span className="truncate">{tab.entry.title}</span>
+            <button
+              className={cn(
+                "shrink-0 rounded-sm p-0 bg-transparent border-none text-muted-foreground cursor-pointer transition-opacity hover:bg-accent hover:text-foreground",
+                isActive ? "opacity-100" : "opacity-0 group-hover:opacity-100"
+              )}
+              style={{ lineHeight: 0 }}
+              draggable={false}
+              onClick={(e) => {
+                e.stopPropagation()
+                onCloseTab(tab.entry.path)
+              }}
+            >
+              <X size={14} />
+            </button>
+            {showDropAfter && (
+              <div
+                style={{
+                  position: 'absolute',
+                  right: -1,
+                  top: 8,
+                  bottom: 8,
+                  width: 2,
+                  background: 'var(--primary)',
+                  borderRadius: 1,
+                  zIndex: 10,
+                }}
+              />
+            )}
+          </div>
+        )
+      })}
+ 
+      <div className="flex-1" style={{ borderBottom: '1px solid var(--border)' }} />
+ 
+      <div
+        className="flex shrink-0 items-center"
+        style={{
+          borderLeft: '1px solid var(--border)',
+          borderBottom: '1px solid var(--border)',
+          gap: 12,
+          padding: '0 12px',
+          WebkitAppRegion: 'no-drag',
+        } as React.CSSProperties}
+      >
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground cursor-pointer hover:text-foreground transition-colors"
+          onClick={onCreateNote}
+          title="New note"
+        >
+          <Plus size={16} />
+        </button>
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground"
+          style={DISABLED_ICON_STYLE}
+          title="Coming soon"
+          tabIndex={-1}
+        >
+          <Columns size={16} />
+        </button>
+        <button
+          className="flex items-center justify-center border-none bg-transparent p-0 text-muted-foreground"
+          style={DISABLED_ICON_STYLE}
+          title="Coming soon"
+          tabIndex={-1}
+        >
+          <ArrowsOutSimple size={16} />
+        </button>
+      </div>
+    </div>
+  )
+})
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/Toast.tsx.html b/coverage/src/components/Toast.tsx.html new file mode 100644 index 00000000..970ce596 --- /dev/null +++ b/coverage/src/components/Toast.tsx.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/components/Toast.tsx + + + + + + + + + +
+
+

All files / src/components Toast.tsx

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29  +  +  +  +  +  +  +  +  +22x +22x +1x +1x +  +  +22x +  +1x +  +  +  +  +  +  +  +  +  +  + 
import { useEffect } from 'react'
+import { cn } from '@/lib/utils'
+ 
+interface ToastProps {
+  message: string | null
+  onDismiss: () => void
+}
+ 
+export function Toast({ message, onDismiss }: ToastProps) {
+  useEffect(() => {
+    if (!message) return
+    const timer = setTimeout(onDismiss, 2000)
+    return () => clearTimeout(timer)
+  }, [message, onDismiss])
+ 
+  if (!message) return null
+ 
+  return (
+    <div className={cn(
+      "fixed bottom-8 left-1/2 -translate-x-1/2 z-[1100]",
+      "bg-secondary text-foreground px-5 py-2 rounded-lg text-[13px]",
+      "shadow-[0_4px_16px_var(--shadow-dialog)]",
+      "animate-in slide-in-from-bottom-2 fade-in duration-200"
+    )}>
+      {message}
+    </div>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/TypeCustomizePopover.tsx.html b/coverage/src/components/TypeCustomizePopover.tsx.html new file mode 100644 index 00000000..ac5d2fd4 --- /dev/null +++ b/coverage/src/components/TypeCustomizePopover.tsx.html @@ -0,0 +1,520 @@ + + + + + + Code coverage report for src/components/TypeCustomizePopover.tsx + + + + + + + + + +
+
+

All files / src/components TypeCustomizePopover.tsx

+
+ +
+ 21.05% + Statements + 4/19 +
+ + +
+ 22.22% + Branches + 2/9 +
+ + +
+ 18.18% + Functions + 2/11 +
+ + +
+ 21.05% + Lines + 4/19 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +105x +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, type ComponentType } from 'react'
+import {
+  FileText, Wrench, Flask, Target, ArrowsClockwise, Users, CalendarBlank,
+  Tag, StackSimple, BookOpen, CookingPot, Heart, Star, House, Lightbulb,
+  Briefcase, Gear, Cube, Leaf, MusicNote, Camera, Airplane, GameController,
+  PaintBrush, ShoppingCart, GraduationCap, Trophy, ChatCircle, Notebook,
+  MapPin, Code, Barbell, PawPrint, Pill, Knife,
+  type IconProps,
+} from '@phosphor-icons/react'
+import { ACCENT_COLORS } from '../utils/typeColors'
+import { cn } from '@/lib/utils'
+ 
+/** Curated Phosphor icons (normal weight) for type customization */
+export const ICON_OPTIONS: { name: string; Icon: ComponentType<IconProps> }[] = [
+  { name: 'file-text', Icon: FileText },
+  { name: 'wrench', Icon: Wrench },
+  { name: 'flask', Icon: Flask },
+  { name: 'target', Icon: Target },
+  { name: 'arrows-clockwise', Icon: ArrowsClockwise },
+  { name: 'users', Icon: Users },
+  { name: 'calendar-blank', Icon: CalendarBlank },
+  { name: 'tag', Icon: Tag },
+  { name: 'stack-simple', Icon: StackSimple },
+  { name: 'book-open', Icon: BookOpen },
+  { name: 'cooking-pot', Icon: CookingPot },
+  { name: 'heart', Icon: Heart },
+  { name: 'star', Icon: Star },
+  { name: 'house', Icon: House },
+  { name: 'lightbulb', Icon: Lightbulb },
+  { name: 'briefcase', Icon: Briefcase },
+  { name: 'gear', Icon: Gear },
+  { name: 'cube', Icon: Cube },
+  { name: 'leaf', Icon: Leaf },
+  { name: 'music-note', Icon: MusicNote },
+  { name: 'camera', Icon: Camera },
+  { name: 'airplane', Icon: Airplane },
+  { name: 'game-controller', Icon: GameController },
+  { name: 'paint-brush', Icon: PaintBrush },
+  { name: 'shopping-cart', Icon: ShoppingCart },
+  { name: 'graduation-cap', Icon: GraduationCap },
+  { name: 'trophy', Icon: Trophy },
+  { name: 'chat-circle', Icon: ChatCircle },
+  { name: 'notebook', Icon: Notebook },
+  { name: 'map-pin', Icon: MapPin },
+  { name: 'code', Icon: Code },
+  { name: 'barbell', Icon: Barbell },
+  { name: 'paw-print', Icon: PawPrint },
+  { name: 'pill', Icon: Pill },
+  { name: 'knife', Icon: Knife },
+]
+ 
+const ICON_MAP: Record<string, ComponentType<IconProps>> = Object.fromEntries(
+  ICON_OPTIONS.map((o) => [o.name, o.Icon]),
+)
+ 
+/** Resolves a Phosphor icon name to its component, with fallback to FileText */
+export function resolveIcon(name: string | null): ComponentType<IconProps> {
+  return (name && ICON_MAP[name]) || FileText
+}
+ 
+interface TypeCustomizePopoverProps {
+  currentIcon: string | null
+  currentColor: string | null
+  onChangeIcon: (icon: string) => void
+  onChangeColor: (color: string) => void
+  onClose: () => void
+}
+ 
+export function TypeCustomizePopover({
+  currentIcon,
+  currentColor,
+  onChangeIcon,
+  onChangeColor,
+  onClose,
+}: TypeCustomizePopoverProps) {
+  const [selectedColor, setSelectedColor] = useState(currentColor)
+  const [selectedIcon, setSelectedIcon] = useState(currentIcon)
+ 
+  const handleColorClick = (key: string) => {
+    setSelectedColor(key)
+    onChangeColor(key)
+  }
+ 
+  const handleIconClick = (name: string) => {
+    setSelectedIcon(name)
+    onChangeIcon(name)
+  }
+ 
+  return (
+    <div
+      className="bg-popover text-popover-foreground z-50 rounded-lg border shadow-md"
+      style={{ width: 264, padding: 12 }}
+      onClick={(e) => e.stopPropagation()}
+      onContextMenu={(e) => e.stopPropagation()}
+    >
+      {/* Color section */}
+      <div className="font-mono-overline mb-2 text-muted-foreground">COLOR</div>
+      <div className="flex gap-2 mb-3">
+        {ACCENT_COLORS.map((c) => (
+          <button
+            key={c.key}
+            className={cn(
+              "flex items-center justify-center rounded-full border-2 cursor-pointer transition-all",
+              selectedColor === c.key ? "border-foreground scale-110" : "border-transparent hover:scale-105",
+            )}
+            style={{ width: 28, height: 28, backgroundColor: c.css, border: selectedColor === c.key ? '2px solid var(--foreground)' : '2px solid transparent' }}
+            onClick={() => handleColorClick(c.key)}
+            title={c.label}
+          />
+        ))}
+      </div>
+ 
+      {/* Icon section */}
+      <div className="font-mono-overline mb-2 text-muted-foreground">ICON</div>
+      <div className="flex flex-wrap gap-1" style={{ maxHeight: 200, overflowY: 'auto' }}>
+        {ICON_OPTIONS.map(({ name, Icon }) => (
+          <button
+            key={name}
+            className={cn(
+              "flex items-center justify-center rounded cursor-pointer transition-colors",
+              selectedIcon === name
+                ? "bg-primary/10 text-primary"
+                : "text-muted-foreground hover:bg-accent hover:text-foreground",
+            )}
+            style={{ width: 30, height: 30 }}
+            onClick={() => handleIconClick(name)}
+            title={name}
+          >
+            <Icon size={16} />
+          </button>
+        ))}
+      </div>
+ 
+      {/* Done button */}
+      <div className="mt-3 flex justify-end">
+        <button
+          className="rounded px-3 py-1 text-[12px] font-medium text-muted-foreground hover:text-foreground hover:bg-accent cursor-pointer transition-colors border-none bg-transparent"
+          onClick={onClose}
+        >
+          Done
+        </button>
+      </div>
+    </div>
+  )
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/index.html b/coverage/src/components/index.html new file mode 100644 index 00000000..317a883d --- /dev/null +++ b/coverage/src/components/index.html @@ -0,0 +1,371 @@ + + + + + + Code coverage report for src/components + + + + + + + + + +
+
+

All files src/components

+
+ +
+ 54.44% + Statements + 710/1304 +
+ + +
+ 50.75% + Branches + 540/1064 +
+ + +
+ 50.11% + Functions + 210/419 +
+ + +
+ 57.02% + Lines + 629/1103 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
AIChatPanel.tsx +
+
1.17%1/850%0/490%0/551.47%1/68
BreadcrumbBar.tsx +
+
100%4/469.23%18/26100%2/2100%4/4
CommitDialog.tsx +
+
31.81%7/2213.33%2/1528.57%2/736.84%7/19
CreateNoteDialog.tsx +
+
36%9/2535.29%6/1730%3/1040.9%9/22
CreateTypeDialog.tsx +
+
88.88%16/1866.66%4/683.33%5/693.33%14/15
DiffView.tsx +
+
0%0/140%0/210%0/20%0/14
DynamicPropertiesPanel.tsx +
+
41.96%47/11240.24%33/8227.77%10/3647.19%42/89
EditableValue.tsx +
+
24.59%15/6116.66%5/3015%3/2026.31%15/57
Editor.tsx +
+
50.52%97/19248.33%58/12047.36%18/3853.84%91/169
Inspector.tsx +
+
64.28%90/14052.17%84/16172.09%31/4376.19%80/105
NoteList.tsx +
+
85.71%210/24576.49%192/25185.52%65/7687.5%182/208
QuickOpenPalette.tsx +
+
27.02%20/7417.07%7/4131.81%7/2225.39%16/63
ResizeHandle.tsx +
+
35.71%15/427.14%1/1442.85%3/737.5%15/40
Sidebar.tsx +
+
66.07%111/16855.92%85/15272.41%42/5865.69%90/137
StatusBar.tsx +
+
34.78%8/2318.18%4/2227.27%3/1135.29%6/17
TabBar.tsx +
+
92.15%47/5179.54%35/4491.66%11/1292.15%47/51
Toast.tsx +
+
100%9/9100%4/4100%3/3100%6/6
TypeCustomizePopover.tsx +
+
21.05%4/1922.22%2/918.18%2/1121.05%4/19
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/badge.tsx.html b/coverage/src/components/ui/badge.tsx.html new file mode 100644 index 00000000..92adfbc8 --- /dev/null +++ b/coverage/src/components/ui/badge.tsx.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/components/ui/badge.tsx + + + + + + + + + +
+
+

All files / src/components/ui badge.tsx

+
+ +
+ 33.33% + Statements + 1/3 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 33.33% + Lines + 1/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+import { Slot } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+const badgeVariants = cva(
+  "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
+  {
+    variants: {
+      variant: {
+        default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
+        secondary:
+          "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
+        destructive:
+          "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+        outline:
+          "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
+        ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
+        link: "text-primary underline-offset-4 [a&]:hover:underline",
+      },
+    },
+    defaultVariants: {
+      variant: "default",
+    },
+  }
+)
+ 
+function Badge({
+  className,
+  variant = "default",
+  asChild = false,
+  ...props
+}: React.ComponentProps<"span"> &
+  VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
+  const Comp = asChild ? Slot.Root : "span"
+ 
+  return (
+    <Comp
+      data-slot="badge"
+      data-variant={variant}
+      className={cn(badgeVariants({ variant }), className)}
+      {...props}
+    />
+  )
+}
+ 
+export { Badge, badgeVariants }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/button.tsx.html b/coverage/src/components/ui/button.tsx.html new file mode 100644 index 00000000..c9c558a8 --- /dev/null +++ b/coverage/src/components/ui/button.tsx.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for src/components/ui/button.tsx + + + + + + + + + +
+
+

All files / src/components/ui button.tsx

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 80% + Branches + 4/5 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +22x +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+import { Slot } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+const buttonVariants = cva(
+  "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+  {
+    variants: {
+      variant: {
+        default: "bg-primary text-primary-foreground hover:bg-primary/90",
+        destructive:
+          "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+        outline:
+          "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
+        secondary:
+          "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+        ghost:
+          "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+        link: "text-primary underline-offset-4 hover:underline",
+      },
+      size: {
+        default: "h-9 px-4 py-2 has-[>svg]:px-3",
+        xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
+        sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
+        lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
+        icon: "size-9",
+        "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
+        "icon-sm": "size-8",
+        "icon-lg": "size-10",
+      },
+    },
+    defaultVariants: {
+      variant: "default",
+      size: "default",
+    },
+  }
+)
+ 
+function Button({
+  className,
+  variant = "default",
+  size = "default",
+  asChild = false,
+  ...props
+}: React.ComponentProps<"button"> &
+  VariantProps<typeof buttonVariants> & {
+    asChild?: boolean
+  }) {
+  const Comp = asChild ? Slot.Root : "button"
+ 
+  return (
+    <Comp
+      data-slot="button"
+      data-variant={variant}
+      data-size={size}
+      className={cn(buttonVariants({ variant, size, className }))}
+      {...props}
+    />
+  )
+}
+ 
+export { Button, buttonVariants }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/card.tsx.html b/coverage/src/components/ui/card.tsx.html new file mode 100644 index 00000000..c46996a6 --- /dev/null +++ b/coverage/src/components/ui/card.tsx.html @@ -0,0 +1,361 @@ + + + + + + Code coverage report for src/components/ui/card.tsx + + + + + + + + + +
+
+

All files / src/components/ui card.tsx

+
+ +
+ 0% + Statements + 0/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 0% + Lines + 0/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+ 
+import { cn } from "@/lib/utils"
+ 
+function Card({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="card"
+      className={cn(
+        "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="card-header"
+      className={cn(
+        "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="card-title"
+      className={cn("leading-none font-semibold", className)}
+      {...props}
+    />
+  )
+}
+ 
+function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="card-description"
+      className={cn("text-muted-foreground text-sm", className)}
+      {...props}
+    />
+  )
+}
+ 
+function CardAction({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="card-action"
+      className={cn(
+        "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function CardContent({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="card-content"
+      className={cn("px-6", className)}
+      {...props}
+    />
+  )
+}
+ 
+function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="card-footer"
+      className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
+      {...props}
+    />
+  )
+}
+ 
+export {
+  Card,
+  CardHeader,
+  CardFooter,
+  CardTitle,
+  CardAction,
+  CardDescription,
+  CardContent,
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/dialog.tsx.html b/coverage/src/components/ui/dialog.tsx.html new file mode 100644 index 00000000..e5aa3765 --- /dev/null +++ b/coverage/src/components/ui/dialog.tsx.html @@ -0,0 +1,553 @@ + + + + + + Code coverage report for src/components/ui/dialog.tsx + + + + + + + + + +
+
+

All files / src/components/ui dialog.tsx

+
+ +
+ 70% + Statements + 7/10 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 70% + Functions + 7/10 +
+ + +
+ 70% + Lines + 7/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157  +  +  +  +  +  +  +  +  +  +78x +  +  +  +  +  +  +  +  +  +  +  +78x +  +  +  +  +  +  +  +  +  +  +  +  +18x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +78x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+import { XIcon } from "lucide-react"
+import { Dialog as DialogPrimitive } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+import { Button } from "@/components/ui/button"
+ 
+function Dialog({
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Root>) {
+  return <DialogPrimitive.Root data-slot="dialog" {...props} />
+}
+ 
+function DialogTrigger({
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
+  return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
+}
+ 
+function DialogPortal({
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Portal>) {
+  return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
+}
+ 
+function DialogClose({
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Close>) {
+  return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
+}
+ 
+function DialogOverlay({
+  className,
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
+  return (
+    <DialogPrimitive.Overlay
+      data-slot="dialog-overlay"
+      className={cn(
+        "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function DialogContent({
+  className,
+  children,
+  showCloseButton = true,
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Content> & {
+  showCloseButton?: boolean
+}) {
+  return (
+    <DialogPortal data-slot="dialog-portal">
+      <DialogOverlay />
+      <DialogPrimitive.Content
+        data-slot="dialog-content"
+        className={cn(
+          "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg",
+          className
+        )}
+        {...props}
+      >
+        {children}
+        {showCloseButton && (
+          <DialogPrimitive.Close
+            data-slot="dialog-close"
+            className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
+          >
+            <XIcon />
+            <span className="sr-only">Close</span>
+          </DialogPrimitive.Close>
+        )}
+      </DialogPrimitive.Content>
+    </DialogPortal>
+  )
+}
+ 
+function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
+  return (
+    <div
+      data-slot="dialog-header"
+      className={cn("flex flex-col gap-2 text-center sm:text-left", className)}
+      {...props}
+    />
+  )
+}
+ 
+function DialogFooter({
+  className,
+  showCloseButton = false,
+  children,
+  ...props
+}: React.ComponentProps<"div"> & {
+  showCloseButton?: boolean
+}) {
+  return (
+    <div
+      data-slot="dialog-footer"
+      className={cn(
+        "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
+        className
+      )}
+      {...props}
+    >
+      {children}
+      {showCloseButton && (
+        <DialogPrimitive.Close asChild>
+          <Button variant="outline">Close</Button>
+        </DialogPrimitive.Close>
+      )}
+    </div>
+  )
+}
+ 
+function DialogTitle({
+  className,
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Title>) {
+  return (
+    <DialogPrimitive.Title
+      data-slot="dialog-title"
+      className={cn("text-lg leading-none font-semibold", className)}
+      {...props}
+    />
+  )
+}
+ 
+function DialogDescription({
+  className,
+  ...props
+}: React.ComponentProps<typeof DialogPrimitive.Description>) {
+  return (
+    <DialogPrimitive.Description
+      data-slot="dialog-description"
+      className={cn("text-muted-foreground text-sm", className)}
+      {...props}
+    />
+  )
+}
+ 
+export {
+  Dialog,
+  DialogClose,
+  DialogContent,
+  DialogDescription,
+  DialogFooter,
+  DialogHeader,
+  DialogOverlay,
+  DialogPortal,
+  DialogTitle,
+  DialogTrigger,
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/dropdown-menu.tsx.html b/coverage/src/components/ui/dropdown-menu.tsx.html new file mode 100644 index 00000000..7586fd44 --- /dev/null +++ b/coverage/src/components/ui/dropdown-menu.tsx.html @@ -0,0 +1,856 @@ + + + + + + Code coverage report for src/components/ui/dropdown-menu.tsx + + + + + + + + + +
+
+

All files / src/components/ui dropdown-menu.tsx

+
+ +
+ 0% + Statements + 0/15 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/15 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
"use client"
+ 
+import * as React from "react"
+import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
+import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+function DropdownMenu({
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
+  return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />
+}
+ 
+function DropdownMenuPortal({
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
+  return (
+    <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
+  )
+}
+ 
+function DropdownMenuTrigger({
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
+  return (
+    <DropdownMenuPrimitive.Trigger
+      data-slot="dropdown-menu-trigger"
+      {...props}
+    />
+  )
+}
+ 
+function DropdownMenuContent({
+  className,
+  sideOffset = 4,
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
+  return (
+    <DropdownMenuPrimitive.Portal>
+      <DropdownMenuPrimitive.Content
+        data-slot="dropdown-menu-content"
+        sideOffset={sideOffset}
+        className={cn(
+          "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
+          className
+        )}
+        {...props}
+      />
+    </DropdownMenuPrimitive.Portal>
+  )
+}
+ 
+function DropdownMenuGroup({
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
+  return (
+    <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
+  )
+}
+ 
+function DropdownMenuItem({
+  className,
+  inset,
+  variant = "default",
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
+  inset?: boolean
+  variant?: "default" | "destructive"
+}) {
+  return (
+    <DropdownMenuPrimitive.Item
+      data-slot="dropdown-menu-item"
+      data-inset={inset}
+      data-variant={variant}
+      className={cn(
+        "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function DropdownMenuCheckboxItem({
+  className,
+  children,
+  checked,
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
+  return (
+    <DropdownMenuPrimitive.CheckboxItem
+      data-slot="dropdown-menu-checkbox-item"
+      className={cn(
+        "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+        className
+      )}
+      checked={checked}
+      {...props}
+    >
+      <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
+        <DropdownMenuPrimitive.ItemIndicator>
+          <CheckIcon className="size-4" />
+        </DropdownMenuPrimitive.ItemIndicator>
+      </span>
+      {children}
+    </DropdownMenuPrimitive.CheckboxItem>
+  )
+}
+ 
+function DropdownMenuRadioGroup({
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
+  return (
+    <DropdownMenuPrimitive.RadioGroup
+      data-slot="dropdown-menu-radio-group"
+      {...props}
+    />
+  )
+}
+ 
+function DropdownMenuRadioItem({
+  className,
+  children,
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
+  return (
+    <DropdownMenuPrimitive.RadioItem
+      data-slot="dropdown-menu-radio-item"
+      className={cn(
+        "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+        className
+      )}
+      {...props}
+    >
+      <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
+        <DropdownMenuPrimitive.ItemIndicator>
+          <CircleIcon className="size-2 fill-current" />
+        </DropdownMenuPrimitive.ItemIndicator>
+      </span>
+      {children}
+    </DropdownMenuPrimitive.RadioItem>
+  )
+}
+ 
+function DropdownMenuLabel({
+  className,
+  inset,
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
+  inset?: boolean
+}) {
+  return (
+    <DropdownMenuPrimitive.Label
+      data-slot="dropdown-menu-label"
+      data-inset={inset}
+      className={cn(
+        "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function DropdownMenuSeparator({
+  className,
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
+  return (
+    <DropdownMenuPrimitive.Separator
+      data-slot="dropdown-menu-separator"
+      className={cn("bg-border -mx-1 my-1 h-px", className)}
+      {...props}
+    />
+  )
+}
+ 
+function DropdownMenuShortcut({
+  className,
+  ...props
+}: React.ComponentProps<"span">) {
+  return (
+    <span
+      data-slot="dropdown-menu-shortcut"
+      className={cn(
+        "text-muted-foreground ml-auto text-xs tracking-widest",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function DropdownMenuSub({
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
+  return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
+}
+ 
+function DropdownMenuSubTrigger({
+  className,
+  inset,
+  children,
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
+  inset?: boolean
+}) {
+  return (
+    <DropdownMenuPrimitive.SubTrigger
+      data-slot="dropdown-menu-sub-trigger"
+      data-inset={inset}
+      className={cn(
+        "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+        className
+      )}
+      {...props}
+    >
+      {children}
+      <ChevronRightIcon className="ml-auto size-4" />
+    </DropdownMenuPrimitive.SubTrigger>
+  )
+}
+ 
+function DropdownMenuSubContent({
+  className,
+  ...props
+}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
+  return (
+    <DropdownMenuPrimitive.SubContent
+      data-slot="dropdown-menu-sub-content"
+      className={cn(
+        "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+export {
+  DropdownMenu,
+  DropdownMenuPortal,
+  DropdownMenuTrigger,
+  DropdownMenuContent,
+  DropdownMenuGroup,
+  DropdownMenuLabel,
+  DropdownMenuItem,
+  DropdownMenuCheckboxItem,
+  DropdownMenuRadioGroup,
+  DropdownMenuRadioItem,
+  DropdownMenuSeparator,
+  DropdownMenuShortcut,
+  DropdownMenuSub,
+  DropdownMenuSubTrigger,
+  DropdownMenuSubContent,
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/index.html b/coverage/src/components/ui/index.html new file mode 100644 index 00000000..5f5816a9 --- /dev/null +++ b/coverage/src/components/ui/index.html @@ -0,0 +1,266 @@ + + + + + + Code coverage report for src/components/ui + + + + + + + + + +
+
+

All files src/components/ui

+
+ +
+ 19.67% + Statements + 12/61 +
+ + +
+ 22.85% + Branches + 8/35 +
+ + +
+ 16.07% + Functions + 9/56 +
+ + +
+ 19.67% + Lines + 12/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
badge.tsx +
+
33.33%1/30%0/40%0/133.33%1/3
button.tsx +
+
100%3/380%4/5100%1/1100%3/3
card.tsx +
+
0%0/7100%0/00%0/70%0/7
dialog.tsx +
+
70%7/1066.66%4/670%7/1070%7/10
dropdown-menu.tsx +
+
0%0/150%0/20%0/150%0/15
input.tsx +
+
100%1/1100%0/0100%1/1100%1/1
scroll-area.tsx +
+
0%0/20%0/50%0/20%0/2
select.tsx +
+
0%0/100%0/70%0/100%0/10
separator.tsx +
+
0%0/10%0/20%0/10%0/1
tabs.tsx +
+
0%0/50%0/20%0/40%0/5
tooltip.tsx +
+
0%0/40%0/20%0/40%0/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/input.tsx.html b/coverage/src/components/ui/input.tsx.html new file mode 100644 index 00000000..fdd13019 --- /dev/null +++ b/coverage/src/components/ui/input.tsx.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/components/ui/input.tsx + + + + + + + + + +
+
+

All files / src/components/ui input.tsx

+
+ +
+ 100% + Statements + 1/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 1/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+ 
+import { cn } from "@/lib/utils"
+ 
+function Input({ className, type, ...props }: React.ComponentProps<"input">) {
+  return (
+    <input
+      type={type}
+      data-slot="input"
+      className={cn(
+        "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
+        "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
+        "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+export { Input }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/scroll-area.tsx.html b/coverage/src/components/ui/scroll-area.tsx.html new file mode 100644 index 00000000..3853d55e --- /dev/null +++ b/coverage/src/components/ui/scroll-area.tsx.html @@ -0,0 +1,253 @@ + + + + + + Code coverage report for src/components/ui/scroll-area.tsx + + + + + + + + + +
+
+

All files / src/components/ui scroll-area.tsx

+
+ +
+ 0% + Statements + 0/2 +
+ + +
+ 0% + Branches + 0/5 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+import { ScrollArea as ScrollAreaPrimitive } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+function ScrollArea({
+  className,
+  children,
+  ...props
+}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {
+  return (
+    <ScrollAreaPrimitive.Root
+      data-slot="scroll-area"
+      className={cn("relative", className)}
+      {...props}
+    >
+      <ScrollAreaPrimitive.Viewport
+        data-slot="scroll-area-viewport"
+        className="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
+      >
+        {children}
+      </ScrollAreaPrimitive.Viewport>
+      <ScrollBar />
+      <ScrollAreaPrimitive.Corner />
+    </ScrollAreaPrimitive.Root>
+  )
+}
+ 
+function ScrollBar({
+  className,
+  orientation = "vertical",
+  ...props
+}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {
+  return (
+    <ScrollAreaPrimitive.ScrollAreaScrollbar
+      data-slot="scroll-area-scrollbar"
+      orientation={orientation}
+      className={cn(
+        "flex touch-none p-px transition-colors select-none",
+        orientation === "vertical" &&
+          "h-full w-2.5 border-l border-l-transparent",
+        orientation === "horizontal" &&
+          "h-2.5 flex-col border-t border-t-transparent",
+        className
+      )}
+      {...props}
+    >
+      <ScrollAreaPrimitive.ScrollAreaThumb
+        data-slot="scroll-area-thumb"
+        className="bg-border relative flex-1 rounded-full"
+      />
+    </ScrollAreaPrimitive.ScrollAreaScrollbar>
+  )
+}
+ 
+export { ScrollArea, ScrollBar }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/select.tsx.html b/coverage/src/components/ui/select.tsx.html new file mode 100644 index 00000000..cedb775f --- /dev/null +++ b/coverage/src/components/ui/select.tsx.html @@ -0,0 +1,649 @@ + + + + + + Code coverage report for src/components/ui/select.tsx + + + + + + + + + +
+
+

All files / src/components/ui select.tsx

+
+ +
+ 0% + Statements + 0/10 +
+ + +
+ 0% + Branches + 0/7 +
+ + +
+ 0% + Functions + 0/10 +
+ + +
+ 0% + Lines + 0/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"
+import { Select as SelectPrimitive } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+function Select({
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Root>) {
+  return <SelectPrimitive.Root data-slot="select" {...props} />
+}
+ 
+function SelectGroup({
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Group>) {
+  return <SelectPrimitive.Group data-slot="select-group" {...props} />
+}
+ 
+function SelectValue({
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Value>) {
+  return <SelectPrimitive.Value data-slot="select-value" {...props} />
+}
+ 
+function SelectTrigger({
+  className,
+  size = "default",
+  children,
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
+  size?: "sm" | "default"
+}) {
+  return (
+    <SelectPrimitive.Trigger
+      data-slot="select-trigger"
+      data-size={size}
+      className={cn(
+        "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+        className
+      )}
+      {...props}
+    >
+      {children}
+      <SelectPrimitive.Icon asChild>
+        <ChevronDownIcon className="size-4 opacity-50" />
+      </SelectPrimitive.Icon>
+    </SelectPrimitive.Trigger>
+  )
+}
+ 
+function SelectContent({
+  className,
+  children,
+  position = "item-aligned",
+  align = "center",
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Content>) {
+  return (
+    <SelectPrimitive.Portal>
+      <SelectPrimitive.Content
+        data-slot="select-content"
+        className={cn(
+          "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
+          position === "popper" &&
+            "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
+          className
+        )}
+        position={position}
+        align={align}
+        {...props}
+      >
+        <SelectScrollUpButton />
+        <SelectPrimitive.Viewport
+          className={cn(
+            "p-1",
+            position === "popper" &&
+              "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
+          )}
+        >
+          {children}
+        </SelectPrimitive.Viewport>
+        <SelectScrollDownButton />
+      </SelectPrimitive.Content>
+    </SelectPrimitive.Portal>
+  )
+}
+ 
+function SelectLabel({
+  className,
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Label>) {
+  return (
+    <SelectPrimitive.Label
+      data-slot="select-label"
+      className={cn("text-muted-foreground px-2 py-1.5 text-xs", className)}
+      {...props}
+    />
+  )
+}
+ 
+function SelectItem({
+  className,
+  children,
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Item>) {
+  return (
+    <SelectPrimitive.Item
+      data-slot="select-item"
+      className={cn(
+        "focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
+        className
+      )}
+      {...props}
+    >
+      <span
+        data-slot="select-item-indicator"
+        className="absolute right-2 flex size-3.5 items-center justify-center"
+      >
+        <SelectPrimitive.ItemIndicator>
+          <CheckIcon className="size-4" />
+        </SelectPrimitive.ItemIndicator>
+      </span>
+      <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
+    </SelectPrimitive.Item>
+  )
+}
+ 
+function SelectSeparator({
+  className,
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.Separator>) {
+  return (
+    <SelectPrimitive.Separator
+      data-slot="select-separator"
+      className={cn("bg-border pointer-events-none -mx-1 my-1 h-px", className)}
+      {...props}
+    />
+  )
+}
+ 
+function SelectScrollUpButton({
+  className,
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {
+  return (
+    <SelectPrimitive.ScrollUpButton
+      data-slot="select-scroll-up-button"
+      className={cn(
+        "flex cursor-default items-center justify-center py-1",
+        className
+      )}
+      {...props}
+    >
+      <ChevronUpIcon className="size-4" />
+    </SelectPrimitive.ScrollUpButton>
+  )
+}
+ 
+function SelectScrollDownButton({
+  className,
+  ...props
+}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {
+  return (
+    <SelectPrimitive.ScrollDownButton
+      data-slot="select-scroll-down-button"
+      className={cn(
+        "flex cursor-default items-center justify-center py-1",
+        className
+      )}
+      {...props}
+    >
+      <ChevronDownIcon className="size-4" />
+    </SelectPrimitive.ScrollDownButton>
+  )
+}
+ 
+export {
+  Select,
+  SelectContent,
+  SelectGroup,
+  SelectItem,
+  SelectLabel,
+  SelectScrollDownButton,
+  SelectScrollUpButton,
+  SelectSeparator,
+  SelectTrigger,
+  SelectValue,
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/separator.tsx.html b/coverage/src/components/ui/separator.tsx.html new file mode 100644 index 00000000..61d44e93 --- /dev/null +++ b/coverage/src/components/ui/separator.tsx.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/components/ui/separator.tsx + + + + + + + + + +
+
+

All files / src/components/ui separator.tsx

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
"use client"
+ 
+import * as React from "react"
+import { Separator as SeparatorPrimitive } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+function Separator({
+  className,
+  orientation = "horizontal",
+  decorative = true,
+  ...props
+}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
+  return (
+    <SeparatorPrimitive.Root
+      data-slot="separator"
+      decorative={decorative}
+      orientation={orientation}
+      className={cn(
+        "bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+export { Separator }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/tabs.tsx.html b/coverage/src/components/ui/tabs.tsx.html new file mode 100644 index 00000000..35aea2bd --- /dev/null +++ b/coverage/src/components/ui/tabs.tsx.html @@ -0,0 +1,352 @@ + + + + + + Code coverage report for src/components/ui/tabs.tsx + + + + + + + + + +
+
+

All files / src/components/ui tabs.tsx

+
+ +
+ 0% + Statements + 0/5 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+import { Tabs as TabsPrimitive } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+function Tabs({
+  className,
+  orientation = "horizontal",
+  ...props
+}: React.ComponentProps<typeof TabsPrimitive.Root>) {
+  return (
+    <TabsPrimitive.Root
+      data-slot="tabs"
+      data-orientation={orientation}
+      orientation={orientation}
+      className={cn(
+        "group/tabs flex gap-2 data-[orientation=horizontal]:flex-col",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+const tabsListVariants = cva(
+  "rounded-lg p-[3px] group-data-[orientation=horizontal]/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col",
+  {
+    variants: {
+      variant: {
+        default: "bg-muted",
+        line: "gap-1 bg-transparent",
+      },
+    },
+    defaultVariants: {
+      variant: "default",
+    },
+  }
+)
+ 
+function TabsList({
+  className,
+  variant = "default",
+  ...props
+}: React.ComponentProps<typeof TabsPrimitive.List> &
+  VariantProps<typeof tabsListVariants>) {
+  return (
+    <TabsPrimitive.List
+      data-slot="tabs-list"
+      data-variant={variant}
+      className={cn(tabsListVariants({ variant }), className)}
+      {...props}
+    />
+  )
+}
+ 
+function TabsTrigger({
+  className,
+  ...props
+}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
+  return (
+    <TabsPrimitive.Trigger
+      data-slot="tabs-trigger"
+      className={cn(
+        "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+        "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent",
+        "data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:text-foreground",
+        "after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100",
+        className
+      )}
+      {...props}
+    />
+  )
+}
+ 
+function TabsContent({
+  className,
+  ...props
+}: React.ComponentProps<typeof TabsPrimitive.Content>) {
+  return (
+    <TabsPrimitive.Content
+      data-slot="tabs-content"
+      className={cn("flex-1 outline-none", className)}
+      {...props}
+    />
+  )
+}
+ 
+export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/components/ui/tooltip.tsx.html b/coverage/src/components/ui/tooltip.tsx.html new file mode 100644 index 00000000..42e02f7b --- /dev/null +++ b/coverage/src/components/ui/tooltip.tsx.html @@ -0,0 +1,256 @@ + + + + + + Code coverage report for src/components/ui/tooltip.tsx + + + + + + + + + +
+
+

All files / src/components/ui tooltip.tsx

+
+ +
+ 0% + Statements + 0/4 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
"use client"
+ 
+import * as React from "react"
+import { Tooltip as TooltipPrimitive } from "radix-ui"
+ 
+import { cn } from "@/lib/utils"
+ 
+function TooltipProvider({
+  delayDuration = 0,
+  ...props
+}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
+  return (
+    <TooltipPrimitive.Provider
+      data-slot="tooltip-provider"
+      delayDuration={delayDuration}
+      {...props}
+    />
+  )
+}
+ 
+function Tooltip({
+  ...props
+}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
+  return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
+}
+ 
+function TooltipTrigger({
+  ...props
+}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
+  return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
+}
+ 
+function TooltipContent({
+  className,
+  sideOffset = 0,
+  children,
+  ...props
+}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
+  return (
+    <TooltipPrimitive.Portal>
+      <TooltipPrimitive.Content
+        data-slot="tooltip-content"
+        sideOffset={sideOffset}
+        className={cn(
+          "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
+          className
+        )}
+        {...props}
+      >
+        {children}
+        <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
+      </TooltipPrimitive.Content>
+    </TooltipPrimitive.Portal>
+  )
+}
+ 
+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/index.html b/coverage/src/hooks/index.html new file mode 100644 index 00000000..7b391255 --- /dev/null +++ b/coverage/src/hooks/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for src/hooks + + + + + + + + + +
+
+

All files src/hooks

+
+ +
+ 27.51% + Statements + 153/556 +
+ + +
+ 16.45% + Branches + 38/231 +
+ + +
+ 26.01% + Functions + 32/123 +
+ + +
+ 29.77% + Lines + 145/487 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
useAIChat.ts +
+
0%0/740%0/300%0/150%0/61
useAppKeyboard.ts +
+
75%15/2037.5%3/875%6/880%12/15
useKeyboardNavigation.ts +
+
51.85%28/5426.31%10/3854.54%6/1156.25%27/48
useMcpBridge.ts +
+
0%0/480%0/110%0/140%0/47
useNoteActions.ts +
+
13.87%34/2451.88%2/1068.88%4/4515.23%32/210
useSectionVisibility.ts +
+
100%21/2183.33%5/6100%6/6100%20/20
useTheme.ts +
+
95.45%21/2293.75%15/16100%5/5100%20/20
useVaultLoader.ts +
+
47.22%34/7218.75%3/1626.31%5/1951.51%34/66
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useAIChat.ts.html b/coverage/src/hooks/useAIChat.ts.html new file mode 100644 index 00000000..76c33257 --- /dev/null +++ b/coverage/src/hooks/useAIChat.ts.html @@ -0,0 +1,409 @@ + + + + + + Code coverage report for src/hooks/useAIChat.ts + + + + + + + + + +
+
+

All files / src/hooks useAIChat.ts

+
+ +
+ 0% + Statements + 0/74 +
+ + +
+ 0% + Branches + 0/30 +
+ + +
+ 0% + Functions + 0/15 +
+ + +
+ 0% + Lines + 0/61 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Custom hook encapsulating AI chat state and message handling.
+ */
+import { useState, useCallback, useRef } from 'react'
+import type { VaultEntry } from '../types'
+import {
+  type ChatMessage, nextMessageId, getApiKey,
+  buildSystemPrompt, streamChat,
+} from '../utils/ai-chat'
+import { countWords } from '../utils/wikilinks'
+ 
+function generateMockResponse(message: string, entry: VaultEntry | null, content: string): string {
+  const title = entry?.title ?? 'Untitled'
+  const words = countWords(content)
+  const lower = message.toLowerCase()
+ 
+  if (lower.includes('summarize')) {
+    return `This note is about **${title}**. It contains ${words} words covering the main concepts documented in your vault.`
+  }
+  if (lower.includes('expand')) {
+    return `Here are some ways to expand this note:\n\n1. Add more detail to the introduction\n2. Include related examples\n3. Connect it to your quarterly goals\n4. Add a summary section at the end`
+  }
+  if (lower.includes('grammar')) {
+    return `I reviewed the document for grammar issues. The writing looks clean overall — no major errors found.`
+  }
+ 
+  return `Based on **${title}**, I can help with analysis, summarization, or expansion. What would you like to focus on?`
+}
+ 
+export function useAIChat(
+  entry: VaultEntry | null,
+  allContent: Record<string, string>,
+  contextNotes: VaultEntry[],
+  model: string,
+) {
+  const [messages, setMessages] = useState<ChatMessage[]>([])
+  const [isStreaming, setIsStreaming] = useState(false)
+  const [streamingContent, setStreamingContent] = useState('')
+  const abortRef = useRef(false)
+ 
+  const sendMessage = useCallback((text: string) => {
+    if (!text.trim() || isStreaming) return
+ 
+    const userMsg: ChatMessage = { role: 'user', content: text.trim(), id: nextMessageId() }
+    setMessages(prev => [...prev, userMsg])
+    setIsStreaming(true)
+    setStreamingContent('')
+    abortRef.current = false
+ 
+    const allMessages = [...messages, userMsg].map(m => ({ role: m.role, content: m.content }))
+    const hasApiKey = !!getApiKey()
+ 
+    if (!hasApiKey) {
+      const content = entry ? (allContent[entry.path] ?? '') : ''
+      setTimeout(() => {
+        if (abortRef.current) return
+        const response = generateMockResponse(text, entry, content)
+        setMessages(prev => [...prev, { role: 'assistant', content: response, id: nextMessageId() }])
+        setIsStreaming(false)
+      }, 800)
+      return
+    }
+ 
+    const { prompt: systemPrompt } = buildSystemPrompt(contextNotes, allContent, model)
+    let accumulated = ''
+ 
+    const onChunk = (chunk: string) => {
+      if (abortRef.current) return
+      accumulated += chunk
+      setStreamingContent(accumulated)
+    }
+ 
+    const onDone = () => {
+      if (abortRef.current) return
+      setMessages(prev => [...prev, { role: 'assistant', content: accumulated, id: nextMessageId() }])
+      setStreamingContent('')
+      setIsStreaming(false)
+    }
+ 
+    const onError = (error: string) => {
+      if (abortRef.current) return
+      setMessages(prev => [...prev, { role: 'assistant', content: `Error: ${error}`, id: nextMessageId() }])
+      setStreamingContent('')
+      setIsStreaming(false)
+    }
+ 
+    streamChat(allMessages, systemPrompt, model, onChunk, onDone, onError)
+  }, [isStreaming, entry, allContent, contextNotes, model, messages])
+ 
+  const clearConversation = useCallback(() => {
+    abortRef.current = true
+    setMessages([])
+    setIsStreaming(false)
+    setStreamingContent('')
+  }, [])
+ 
+  const retryMessage = useCallback((msgIndex: number) => {
+    const userMsgIndex = msgIndex - 1
+    if (userMsgIndex < 0) return
+    const userMsg = messages[userMsgIndex]
+    if (userMsg.role !== 'user') return
+ 
+    setMessages(prev => prev.slice(0, msgIndex))
+    sendMessage(userMsg.content)
+  }, [messages, sendMessage])
+ 
+  return { messages, isStreaming, streamingContent, sendMessage, clearConversation, retryMessage }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useAppKeyboard.ts.html b/coverage/src/hooks/useAppKeyboard.ts.html new file mode 100644 index 00000000..2cb1a9c4 --- /dev/null +++ b/coverage/src/hooks/useAppKeyboard.ts.html @@ -0,0 +1,226 @@ + + + + + + Code coverage report for src/hooks/useAppKeyboard.ts + + + + + + + + + +
+
+

All files / src/hooks useAppKeyboard.ts

+
+ +
+ 75% + Statements + 15/20 +
+ + +
+ 37.5% + Branches + 3/8 +
+ + +
+ 75% + Functions + 6/8 +
+ + +
+ 80% + Lines + 12/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +88x +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +22x +22x +1x +1x +1x +1x +1x +1x +  +  +22x +22x +  +  + 
import { useEffect, useMemo } from 'react'
+ 
+interface KeyboardActions {
+  onQuickOpen: () => void
+  onCreateNote: () => void
+  onSave: () => void
+  onTrashNote: (path: string) => void
+  onArchiveNote: (path: string) => void
+  activeTabPathRef: React.MutableRefObject<string | null>
+  handleCloseTabRef: React.MutableRefObject<(path: string) => void>
+}
+ 
+type ShortcutHandler = () => void
+ 
+export function useAppKeyboard({
+  onQuickOpen, onCreateNote, onSave, onTrashNote, onArchiveNote,
+  activeTabPathRef, handleCloseTabRef,
+}: KeyboardActions) {
+  const withActiveTab = (fn: (path: string) => void): ShortcutHandler => () => {
+    const path = activeTabPathRef.current
+    if (path) fn(path)
+  }
+ 
+  const keyMap = useMemo((): Record<string, ShortcutHandler> => ({
+    p: onQuickOpen,
+    n: onCreateNote,
+    s: onSave,
+    e: withActiveTab(onArchiveNote),
+    w: withActiveTab((path) => handleCloseTabRef.current(path)),
+    Backspace: withActiveTab(onTrashNote),
+    Delete: withActiveTab(onTrashNote),
+  }), [onQuickOpen, onCreateNote, onSave, onTrashNote, onArchiveNote, activeTabPathRef, handleCloseTabRef])
+ 
+  useEffect(() => {
+    const handleKeyDown = (e: KeyboardEvent) => {
+      const mod = e.metaKey || e.ctrlKey
+      Iif (!mod) return
+      const handler = keyMap[e.key]
+      Eif (handler) {
+        e.preventDefault()
+        handler()
+      }
+    }
+    window.addEventListener('keydown', handleKeyDown)
+    return () => window.removeEventListener('keydown', handleKeyDown)
+  }, [keyMap])
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useKeyboardNavigation.ts.html b/coverage/src/hooks/useKeyboardNavigation.ts.html new file mode 100644 index 00000000..46c8c588 --- /dev/null +++ b/coverage/src/hooks/useKeyboardNavigation.ts.html @@ -0,0 +1,463 @@ + + + + + + Code coverage report for src/hooks/useKeyboardNavigation.ts + + + + + + + + + +
+
+

All files / src/hooks useKeyboardNavigation.ts

+
+ +
+ 51.85% + Statements + 28/54 +
+ + +
+ 26.31% + Branches + 10/38 +
+ + +
+ 54.54% + Functions + 6/11 +
+ + +
+ 56.25% + Lines + 27/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +21x +  +  +  +21x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +21x +  +  +  +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +22x +  +22x +7x +  +7x +1x +1x +  +1x +  +  +1x +  +1x +  +  +1x +  +  +  +  +  +7x +7x +  +  + 
import { useEffect, useMemo, useRef } from 'react'
+import { isTauri } from '../mock-tauri'
+import { filterEntries, sortByModified, buildRelationshipGroups } from '../components/NoteList'
+import type { VaultEntry, SidebarSelection } from '../types'
+ 
+interface Tab {
+  entry: VaultEntry
+  content: string
+}
+ 
+interface KeyboardNavigationOptions {
+  tabs: Tab[]
+  activeTabPath: string | null
+  entries: VaultEntry[]
+  selection: SidebarSelection
+  allContent: Record<string, string>
+  onSwitchTab: (path: string) => void
+  onReplaceActiveTab: (entry: VaultEntry) => void
+  onSelectNote: (entry: VaultEntry) => void
+}
+ 
+function computeVisibleNotes(
+  entries: VaultEntry[],
+  selection: SidebarSelection,
+  allContent: Record<string, string>,
+): VaultEntry[] {
+  Iif (selection.kind === 'entity') {
+    return buildRelationshipGroups(selection.entry, entries, allContent)
+      .flatMap((g) => g.entries)
+  }
+  return [...filterEntries(entries, selection)].sort(sortByModified)
+}
+ 
+function navigateTab(
+  tabsRef: React.RefObject<Tab[]>,
+  activeTabPathRef: React.RefObject<string | null>,
+  onSwitchTab: React.RefObject<(path: string) => void>,
+  direction: 1 | -1,
+) {
+  const currentTabs = tabsRef.current!
+  if (currentTabs.length === 0) return
+ 
+  const currentPath = activeTabPathRef.current
+  const currentIndex = currentTabs.findIndex((t) => t.entry.path === currentPath)
+  const nextIndex = (currentIndex + direction + currentTabs.length) % currentTabs.length
+  onSwitchTab.current!(currentTabs[nextIndex].entry.path)
+}
+ 
+function navigateNote(
+  visibleNotesRef: React.RefObject<VaultEntry[]>,
+  activeTabPathRef: React.RefObject<string | null>,
+  onReplace: React.RefObject<(entry: VaultEntry) => void>,
+  onSelect: React.RefObject<(entry: VaultEntry) => void>,
+  direction: 1 | -1,
+) {
+  const notes = visibleNotesRef.current!
+  if (notes.length === 0) return
+ 
+  const currentPath = activeTabPathRef.current
+  const currentIndex = notes.findIndex((n) => n.path === currentPath)
+ 
+  const nextIndex = currentIndex === -1
+    ? (direction === 1 ? 0 : notes.length - 1)
+    : (currentIndex + direction + notes.length) % notes.length
+ 
+  const nextNote = notes[nextIndex]
+  if (currentPath) {
+    onReplace.current!(nextNote)
+  } else {
+    onSelect.current!(nextNote)
+  }
+}
+ 
+export function useKeyboardNavigation({
+  tabs,
+  activeTabPath,
+  entries,
+  selection,
+  allContent,
+  onSwitchTab,
+  onReplaceActiveTab,
+  onSelectNote,
+}: KeyboardNavigationOptions) {
+  const visibleNotes = useMemo(
+    () => computeVisibleNotes(entries, selection, allContent),
+    [entries, selection, allContent],
+  )
+ 
+  const tabsRef = useRef(tabs)
+  tabsRef.current = tabs
+  const activeTabPathRef = useRef(activeTabPath)
+  activeTabPathRef.current = activeTabPath
+  const visibleNotesRef = useRef(visibleNotes)
+  visibleNotesRef.current = visibleNotes
+  const onSwitchTabRef = useRef(onSwitchTab)
+  onSwitchTabRef.current = onSwitchTab
+  const onReplaceRef = useRef(onReplaceActiveTab)
+  onReplaceRef.current = onReplaceActiveTab
+  const onSelectNoteRef = useRef(onSelectNote)
+  onSelectNoteRef.current = onSelectNote
+ 
+  useEffect(() => {
+    const isRunningInTauri = isTauri()
+ 
+    const handleKeyDown = (e: KeyboardEvent) => {
+      const mod = e.metaKey || e.ctrlKey
+      Iif (!mod) return
+ 
+      const isTabShortcut = isRunningInTauri
+        ? e.altKey && !e.shiftKey
+        : e.shiftKey && !e.altKey
+      const isNoteShortcut = e.altKey && !e.shiftKey
+ 
+      Iif (isTabShortcut && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {
+        e.preventDefault()
+        navigateTab(tabsRef, activeTabPathRef, onSwitchTabRef, e.key === 'ArrowRight' ? 1 : -1)
+      I} else if (isNoteShortcut && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {
+        e.preventDefault()
+        navigateNote(visibleNotesRef, activeTabPathRef, onReplaceRef, onSelectNoteRef, e.key === 'ArrowDown' ? 1 : -1)
+      }
+    }
+ 
+    window.addEventListener('keydown', handleKeyDown)
+    return () => window.removeEventListener('keydown', handleKeyDown)
+  }, [])
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useMcpBridge.ts.html b/coverage/src/hooks/useMcpBridge.ts.html new file mode 100644 index 00000000..9d996117 --- /dev/null +++ b/coverage/src/hooks/useMcpBridge.ts.html @@ -0,0 +1,424 @@ + + + + + + Code coverage report for src/hooks/useMcpBridge.ts + + + + + + + + + +
+
+

All files / src/hooks useMcpBridge.ts

+
+ +
+ 0% + Statements + 0/48 +
+ + +
+ 0% + Branches + 0/11 +
+ + +
+ 0% + Functions + 0/14 +
+ + +
+ 0% + Lines + 0/47 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Hook for communicating with the Laputa MCP WebSocket bridge.
+ *
+ * Provides typed tool invocations for vault operations:
+ * - readNote, createNote, searchNotes, appendToNote
+ *
+ * Connection is lazy — only opens when first tool is called.
+ */
+import { useCallback, useRef, useState } from 'react'
+ 
+const DEFAULT_WS_URL = 'ws://localhost:9710'
+ 
+interface PendingRequest {
+  resolve: (value: any) => void
+  reject: (reason: any) => void
+}
+ 
+interface SearchResult {
+  path: string
+  title: string
+  snippet: string
+}
+ 
+export function useMcpBridge(wsUrl = DEFAULT_WS_URL) {
+  const wsRef = useRef<WebSocket | null>(null)
+  const pendingRef = useRef<Map<string, PendingRequest>>(new Map())
+  const idCounterRef = useRef(0)
+  const [connected, setConnected] = useState(false)
+ 
+  const ensureConnection = useCallback((): Promise<WebSocket> => {
+    const ws = wsRef.current
+    if (ws && ws.readyState === WebSocket.OPEN) return Promise.resolve(ws)
+ 
+    return new Promise((resolve, reject) => {
+      const newWs = new WebSocket(wsUrl)
+ 
+      newWs.onopen = () => {
+        wsRef.current = newWs
+        setConnected(true)
+        resolve(newWs)
+      }
+ 
+      newWs.onmessage = (event) => {
+        try {
+          const msg = JSON.parse(event.data)
+          const pending = pendingRef.current.get(msg.id)
+          if (pending) {
+            pendingRef.current.delete(msg.id)
+            if (msg.error) {
+              pending.reject(new Error(msg.error))
+            } else {
+              pending.resolve(msg.result)
+            }
+          }
+        } catch {
+          // ignore malformed messages
+        }
+      }
+ 
+      newWs.onclose = () => {
+        wsRef.current = null
+        setConnected(false)
+      }
+ 
+      newWs.onerror = () => {
+        reject(new Error('WebSocket connection failed'))
+      }
+    })
+  }, [wsUrl])
+ 
+  const callTool = useCallback(async <T>(tool: string, args: Record<string, any>): Promise<T> => {
+    const ws = await ensureConnection()
+    const id = `mcp-${++idCounterRef.current}`
+ 
+    return new Promise((resolve, reject) => {
+      pendingRef.current.set(id, { resolve, reject })
+      ws.send(JSON.stringify({ id, tool, args }))
+ 
+      // Timeout after 30 seconds
+      setTimeout(() => {
+        if (pendingRef.current.has(id)) {
+          pendingRef.current.delete(id)
+          reject(new Error('MCP tool call timed out'))
+        }
+      }, 30_000)
+    })
+  }, [ensureConnection])
+ 
+  const readNote = useCallback(
+    (path: string) => callTool<{ content: string }>('read_note', { path }),
+    [callTool],
+  )
+ 
+  const createNote = useCallback(
+    (path: string, title: string, isA?: string) =>
+      callTool<string>('create_note', { path, title, is_a: isA }),
+    [callTool],
+  )
+ 
+  const searchNotes = useCallback(
+    (query: string, limit?: number) =>
+      callTool<SearchResult[]>('search_notes', { query, limit }),
+    [callTool],
+  )
+ 
+  const appendToNote = useCallback(
+    (path: string, text: string) =>
+      callTool<{ ok: boolean }>('append_to_note', { path, text }),
+    [callTool],
+  )
+ 
+  return { connected, readNote, createNote, searchNotes, appendToNote, callTool }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useNoteActions.ts.html b/coverage/src/hooks/useNoteActions.ts.html new file mode 100644 index 00000000..4f190e5c --- /dev/null +++ b/coverage/src/hooks/useNoteActions.ts.html @@ -0,0 +1,1285 @@ + + + + + + Code coverage report for src/hooks/useNoteActions.ts + + + + + + + + + +
+
+

All files / src/hooks useNoteActions.ts

+
+ +
+ 13.87% + Statements + 34/245 +
+ + +
+ 1.88% + Branches + 2/106 +
+ + +
+ 8.88% + Functions + 4/45 +
+ + +
+ 15.23% + Lines + 32/210 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +7x +7x +7x +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +22x +22x +22x +22x +22x +22x +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +22x +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +22x +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +22x +7x +  +  +7x +  +  +  +  +22x +7x +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useCallback, useEffect, useRef, useState } from 'react'
+import { invoke } from '@tauri-apps/api/core'
+import { isTauri, mockInvoke, addMockEntry, updateMockContent } from '../mock-tauri'
+import type { VaultEntry } from '../types'
+import type { FrontmatterValue } from '../components/Inspector'
+ 
+interface Tab {
+  entry: VaultEntry
+  content: string
+}
+ 
+// Mock frontmatter helpers for browser testing
+function updateMockFrontmatter(path: string, key: string, value: FrontmatterValue): string {
+  const content = window.__mockContent?.[path] || ''
+  const yamlKey = key.includes(' ') ? `"${key}"` : key
+ 
+  let yamlValue: string
+  if (Array.isArray(value)) {
+    yamlValue = '\n' + value.map(v => `  - "${v}"`).join('\n')
+  } else if (typeof value === 'boolean') {
+    yamlValue = value ? 'true' : 'false'
+  } else if (value === null) {
+    yamlValue = 'null'
+  } else {
+    yamlValue = String(value)
+  }
+ 
+  if (!content.startsWith('---\n')) {
+    return `---\n${yamlKey}: ${yamlValue}\n---\n${content}`
+  }
+ 
+  const fmEnd = content.indexOf('\n---', 4)
+  if (fmEnd === -1) return content
+ 
+  const fm = content.slice(4, fmEnd)
+  const rest = content.slice(fmEnd + 4)
+  const keyPattern = new RegExp(`^["']?${key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["']?\\s*:`, 'm')
+ 
+  if (keyPattern.test(fm)) {
+    const lines = fm.split('\n')
+    const newLines: string[] = []
+    let i = 0
+    while (i < lines.length) {
+      if (keyPattern.test(lines[i])) {
+        i++
+        while (i < lines.length && lines[i].startsWith('  - ')) i++
+        if (Array.isArray(value)) {
+          newLines.push(`${yamlKey}:${yamlValue}`)
+        } else {
+          newLines.push(`${yamlKey}: ${yamlValue}`)
+        }
+        continue
+      }
+      newLines.push(lines[i])
+      i++
+    }
+    return `---\n${newLines.join('\n')}\n---${rest}`
+  } else {
+    if (Array.isArray(value)) {
+      return `---\n${fm}\n${yamlKey}:${yamlValue}\n---${rest}`
+    } else {
+      return `---\n${fm}\n${yamlKey}: ${yamlValue}\n---${rest}`
+    }
+  }
+}
+ 
+function deleteMockFrontmatterProperty(path: string, key: string): string {
+  const content = window.__mockContent?.[path] || ''
+  if (!content.startsWith('---\n')) return content
+  const fmEnd = content.indexOf('\n---', 4)
+  if (fmEnd === -1) return content
+ 
+  const fm = content.slice(4, fmEnd)
+  const rest = content.slice(fmEnd + 4)
+  const keyPattern = new RegExp(`^["']?${key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["']?\\s*:`, 'm')
+ 
+  const lines = fm.split('\n')
+  const newLines: string[] = []
+  let i = 0
+  while (i < lines.length) {
+    if (keyPattern.test(lines[i])) {
+      i++
+      while (i < lines.length && lines[i].startsWith('  - ')) i++
+      continue
+    }
+    newLines.push(lines[i])
+    i++
+  }
+  return `---\n${newLines.join('\n')}\n---${rest}`
+}
+ 
+const TAB_ORDER_KEY = 'laputa-tab-order'
+ 
+function saveTabOrder(tabs: Tab[]) {
+  try {
+    localStorage.setItem(TAB_ORDER_KEY, JSON.stringify(tabs.map(t => t.entry.path)))
+  } catch { /* localStorage may be unavailable */ }
+}
+ 
+function loadTabOrder(): string[] {
+  try {
+    const stored = localStorage.getItem(TAB_ORDER_KEY)
+    return stored ? JSON.parse(stored) : []
+  } catch {
+    return []
+  }
+}
+ 
+async function loadNoteContent(path: string): Promise<string> {
+  return isTauri()
+    ? invoke<string>('get_note_content', { path })
+    : mockInvoke<string>('get_note_content', { path })
+}
+ 
+async function replaceTabWithEntry(
+  entry: VaultEntry,
+  currentPath: string,
+  setTabs: React.Dispatch<React.SetStateAction<Tab[]>>,
+  setActiveTabPath: React.Dispatch<React.SetStateAction<string | null>>,
+) {
+  const applyReplace = (content: string) => {
+    setTabs((prev) => prev.map((t) =>
+      t.entry.path === currentPath ? { entry, content } : t
+    ))
+    setActiveTabPath(entry.path)
+  }
+  try {
+    applyReplace(await loadNoteContent(entry.path))
+  } catch (err) {
+    console.warn('Failed to load note content for replace:', err)
+    applyReplace('')
+  }
+}
+ 
+export function useNoteActions(
+  addEntry: (entry: VaultEntry, content: string) => void,
+  updateContent: (path: string, content: string) => void,
+  entries: VaultEntry[],
+  setToastMessage: (msg: string | null) => void,
+) {
+  const [tabs, setTabs] = useState<Tab[]>([])
+  const [activeTabPath, setActiveTabPath] = useState<string | null>(null)
+  const activeTabPathRef = useRef(activeTabPath)
+  activeTabPathRef.current = activeTabPath
+  const tabsRef = useRef(tabs)
+  tabsRef.current = tabs
+  const handleCloseTabRef = useRef<(path: string) => void>(() => {})
+ 
+  const handleSelectNote = useCallback(async (entry: VaultEntry) => {
+    // If already open, just switch — instant
+    if (tabsRef.current.some((t) => t.entry.path === entry.path)) {
+      setActiveTabPath(entry.path)
+      return
+    }
+ 
+    // Load content async, then add tab and set active together
+    try {
+      const content = await loadNoteContent(entry.path)
+      setTabs((prev) => {
+        if (prev.some((t) => t.entry.path === entry.path)) return prev
+        return [...prev, { entry, content }]
+      })
+      setActiveTabPath(entry.path)
+    } catch (err) {
+      console.warn('Failed to load note content:', err)
+      setTabs((prev) => {
+        if (prev.some((t) => t.entry.path === entry.path)) return prev
+        return [...prev, { entry, content: '' }]
+      })
+      setActiveTabPath(entry.path)
+    }
+  }, [])
+ 
+  const handleCloseTab = useCallback((path: string) => {
+    setTabs((prev) => {
+      const next = prev.filter((t) => t.entry.path !== path)
+      if (path === activeTabPathRef.current && next.length > 0) {
+        const closedIdx = prev.findIndex((t) => t.entry.path === path)
+        const newIdx = Math.min(closedIdx, next.length - 1)
+        setActiveTabPath(next[newIdx].entry.path)
+      } else if (next.length === 0) {
+        setActiveTabPath(null)
+      }
+      return next
+    })
+  }, [])
+  handleCloseTabRef.current = handleCloseTab
+ 
+  const handleSwitchTab = useCallback((path: string) => {
+    setActiveTabPath(path)
+  }, [])
+ 
+  const handleNavigateWikilink = useCallback((target: string) => {
+    const targetLower = target.toLowerCase()
+    const slugToWords = (s: string) => s.replace(/-/g, ' ').toLowerCase()
+    const targetAsWords = slugToWords(target.split('/').pop() ?? target)
+ 
+    const found = entries.find((e) => {
+      if (e.title.toLowerCase() === targetLower) return true
+      if (e.aliases.some((a) => a.toLowerCase() === targetLower)) return true
+      const pathStem = e.path.replace(/^.*\/Laputa\//, '').replace(/\.md$/, '')
+      if (pathStem.toLowerCase() === targetLower) return true
+      const fileStem = e.filename.replace(/\.md$/, '')
+      if (fileStem.toLowerCase() === targetLower.split('/').pop()) return true
+      if (e.title.toLowerCase() === targetAsWords) return true
+      return false
+    })
+ 
+    if (found) {
+      handleSelectNote(found)
+    } else {
+      console.warn(`Navigation target not found: ${target}`)
+    }
+  }, [entries, handleSelectNote])
+ 
+  const handleCreateNote = useCallback(async (title: string, type: string) => {
+    const typeToFolder: Record<string, string> = {
+      Note: 'note', Project: 'project', Experiment: 'experiment',
+      Responsibility: 'responsibility', Procedure: 'procedure',
+      Person: 'person', Event: 'event', Topic: 'topic',
+    }
+    // Custom types use lowercased type name as folder
+    const folder = typeToFolder[type] || type.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '')
+    const slug = title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '')
+    const path = `/Users/luca/Laputa/${folder}/${slug}.md`
+    const now = Math.floor(Date.now() / 1000)
+ 
+    const noStatusTypes = new Set(['Topic', 'Person'])
+    const newEntry: VaultEntry = {
+      path, filename: `${slug}.md`, title, isA: type,
+      aliases: [], belongsTo: [], relatedTo: [],
+      status: noStatusTypes.has(type) ? null : 'Active',
+      owner: null, cadence: null, archived: false, trashed: false, trashedAt: null,
+      modifiedAt: now, createdAt: now, fileSize: 0,
+      snippet: '', relationships: {}, icon: null, color: null, order: null,
+    }
+ 
+    const frontmatter = [
+      '---', `title: ${title}`, `is_a: ${type}`,
+      ...(newEntry.status ? [`status: ${newEntry.status}`] : []),
+      '---',
+    ].join('\n')
+    const content = `${frontmatter}\n\n# ${title}\n\n`
+ 
+    if (!isTauri()) {
+      addMockEntry(newEntry, content)
+    }
+ 
+    addEntry(newEntry, content)
+    handleSelectNote(newEntry)
+  }, [handleSelectNote, addEntry])
+ 
+  const handleCreateType = useCallback(async (typeName: string) => {
+    const slug = typeName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '')
+    const path = `/Users/luca/Laputa/type/${slug}.md`
+    const now = Math.floor(Date.now() / 1000)
+ 
+    const newEntry: VaultEntry = {
+      path, filename: `${slug}.md`, title: typeName, isA: 'Type',
+      aliases: [], belongsTo: [], relatedTo: [],
+      status: null, owner: null, cadence: null, archived: false, trashed: false, trashedAt: null,
+      modifiedAt: now, createdAt: now, fileSize: 0,
+      snippet: '', relationships: {}, icon: null, color: null, order: null,
+    }
+ 
+    const content = `---\nIs A: Type\n---\n\n# ${typeName}\n\n`
+ 
+    if (!isTauri()) {
+      addMockEntry(newEntry, content)
+    }
+ 
+    addEntry(newEntry, content)
+    handleSelectNote(newEntry)
+  }, [handleSelectNote, addEntry])
+ 
+  const handleUpdateFrontmatter = useCallback(async (path: string, key: string, value: FrontmatterValue) => {
+    try {
+      let newContent: string
+      if (isTauri()) {
+        let rustValue: unknown = value
+        if (Array.isArray(value)) rustValue = value
+        else if (typeof value === 'boolean') rustValue = value
+        else if (typeof value === 'number') rustValue = value
+        else if (value === null) rustValue = null
+        else rustValue = String(value)
+        newContent = await invoke<string>('update_frontmatter', { path, key, value: rustValue })
+      } else {
+        newContent = updateMockFrontmatter(path, key, value)
+        updateMockContent(path, newContent)
+      }
+      setTabs((prev) => prev.map((t) =>
+        t.entry.path === path ? { ...t, content: newContent } : t
+      ))
+      updateContent(path, newContent)
+      setToastMessage('Property updated')
+    } catch (err) {
+      console.error('Failed to update frontmatter:', err)
+      setToastMessage('Failed to update property')
+    }
+  }, [updateContent, setToastMessage])
+ 
+  const handleDeleteProperty = useCallback(async (path: string, key: string) => {
+    try {
+      let newContent: string
+      if (isTauri()) {
+        newContent = await invoke<string>('delete_frontmatter_property', { path, key })
+      } else {
+        newContent = deleteMockFrontmatterProperty(path, key)
+        updateMockContent(path, newContent)
+      }
+      setTabs((prev) => prev.map((t) =>
+        t.entry.path === path ? { ...t, content: newContent } : t
+      ))
+      updateContent(path, newContent)
+      setToastMessage('Property deleted')
+    } catch (err) {
+      console.error('Failed to delete property:', err)
+      setToastMessage('Failed to delete property')
+    }
+  }, [updateContent, setToastMessage])
+ 
+  const handleAddProperty = useCallback(async (path: string, key: string, value: FrontmatterValue) => {
+    return handleUpdateFrontmatter(path, key, value)
+  }, [handleUpdateFrontmatter])
+ 
+  const handleReplaceActiveTab = useCallback(async (entry: VaultEntry) => {
+    const currentPath = activeTabPathRef.current
+    if (!currentPath) { handleSelectNote(entry); return }
+    if (currentPath === entry.path) return
+    replaceTabWithEntry(entry, currentPath, setTabs, setActiveTabPath)
+  }, [handleSelectNote])
+ 
+  const handleReorderTabs = useCallback((fromIndex: number, toIndex: number) => {
+    setTabs((prev) => {
+      const next = [...prev]
+      const [moved] = next.splice(fromIndex, 1)
+      next.splice(toIndex, 0, moved)
+      saveTabOrder(next)
+      return next
+    })
+  }, [])
+ 
+  // Persist tab order to localStorage whenever tabs change
+  useEffect(() => {
+    Iif (tabs.length > 0) {
+      saveTabOrder(tabs)
+    } else {
+      try { localStorage.removeItem(TAB_ORDER_KEY) } catch { /* noop */ }
+    }
+  }, [tabs])
+ 
+  // Restore tab order from localStorage on mount
+  useEffect(() => {
+    const savedOrder = loadTabOrder()
+    Eif (savedOrder.length === 0) return
+ 
+    setTabs((prev) => {
+      if (prev.length <= 1) return prev
+      const pathToTab = new Map(prev.map(t => [t.entry.path, t]))
+      const ordered: Tab[] = []
+      for (const path of savedOrder) {
+        const tab = pathToTab.get(path)
+        if (tab) {
+          ordered.push(tab)
+          pathToTab.delete(path)
+        }
+      }
+      // Append any tabs not in saved order (newly opened)
+      for (const tab of pathToTab.values()) {
+        ordered.push(tab)
+      }
+      return ordered
+    })
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+ 
+  const closeAllTabs = useCallback(() => {
+    setTabs([])
+    setActiveTabPath(null)
+  }, [])
+ 
+  return {
+    tabs,
+    activeTabPath,
+    activeTabPathRef,
+    handleCloseTabRef,
+    handleSelectNote,
+    handleCloseTab,
+    handleSwitchTab,
+    handleReorderTabs,
+    handleNavigateWikilink,
+    handleCreateNote,
+    handleCreateType,
+    handleUpdateFrontmatter,
+    handleDeleteProperty,
+    handleAddProperty,
+    handleReplaceActiveTab,
+    closeAllTabs,
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useSectionVisibility.ts.html b/coverage/src/hooks/useSectionVisibility.ts.html new file mode 100644 index 00000000..6e579434 --- /dev/null +++ b/coverage/src/hooks/useSectionVisibility.ts.html @@ -0,0 +1,217 @@ + + + + + + Code coverage report for src/hooks/useSectionVisibility.ts + + + + + + + + + +
+
+

All files / src/hooks useSectionVisibility.ts

+
+ +
+ 100% + Statements + 21/21 +
+ + +
+ 83.33% + Branches + 5/6 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45  +  +2x +  +  +37x +37x +37x +2x +2x +  +  +  +  +35x +  +  +  +4x +  +  +  +74x +  +74x +4x +4x +4x +1x +  +3x +  +4x +4x +  +  +  +74x +592x +  +  +  +74x +  + 
import { useState, useCallback } from 'react'
+ 
+const STORAGE_KEY = 'laputa-hidden-sections'
+ 
+function loadHiddenSections(): Set<string> {
+  try {
+    const raw = localStorage.getItem(STORAGE_KEY)
+    if (raw) {
+      const arr = JSON.parse(raw)
+      Eif (Array.isArray(arr)) return new Set(arr)
+    }
+  } catch {
+    // ignore corrupt data
+  }
+  return new Set()
+}
+ 
+function saveHiddenSections(hidden: Set<string>) {
+  localStorage.setItem(STORAGE_KEY, JSON.stringify([...hidden]))
+}
+ 
+export function useSectionVisibility() {
+  const [hiddenSections, setHiddenSections] = useState<Set<string>>(loadHiddenSections)
+ 
+  const toggleSection = useCallback((type: string) => {
+    setHiddenSections((prev) => {
+      const next = new Set(prev)
+      if (next.has(type)) {
+        next.delete(type)
+      } else {
+        next.add(type)
+      }
+      saveHiddenSections(next)
+      return next
+    })
+  }, [])
+ 
+  const isSectionVisible = useCallback(
+    (type: string) => !hiddenSections.has(type),
+    [hiddenSections],
+  )
+ 
+  return { hiddenSections, toggleSection, isSectionVisible }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useTheme.ts.html b/coverage/src/hooks/useTheme.ts.html new file mode 100644 index 00000000..8e3c12d0 --- /dev/null +++ b/coverage/src/hooks/useTheme.ts.html @@ -0,0 +1,238 @@ + + + + + + Code coverage report for src/hooks/useTheme.ts + + + + + + + + + +
+
+

All files / src/hooks useTheme.ts

+
+ +
+ 95.45% + Statements + 21/22 +
+ + +
+ 93.75% + Branches + 15/16 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 100% + Lines + 20/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52  +  +  +  +  +  +  +  +  +  +168x +  +168x +936x +  +936x +936x +  +928x +160x +768x +  +  +456x +  +  +456x +456x +  +312x +  +  +  +168x +  +  +  +936x +  +  +  +8x +8x +8x +768x +  +8x +  +  +8x +  + 
import { useMemo } from 'react'
+import themeConfig from '../theme.json'
+ 
+type ThemeValue = string | number | Record<string, unknown> | unknown[]
+ 
+/** Convert a nested theme config object into a flat map of CSS custom properties */
+function flattenTheme(
+  obj: Record<string, ThemeValue>,
+  prefix = '--'
+): Record<string, string> {
+  const result: Record<string, string> = {}
+ 
+  for (const [key, value] of Object.entries(obj)) {
+    const cssKey = `${prefix}${camelToKebab(key)}`
+ 
+    Iif (value === null || value === undefined) continue
+    if (Array.isArray(value)) continue // skip arrays (e.g. nestedBulletSymbols)
+ 
+    if (typeof value === 'object') {
+      Object.assign(result, flattenTheme(value as Record<string, ThemeValue>, `${cssKey}-`))
+    } else if (typeof value === 'number') {
+      // Numbers that look like px values get 'px' suffix; ratios/weights don't
+      // These are unitless values; everything else gets 'px'
+      const isUnitless = /weight|lineHeight|opacity/i.test(key) ||
+        cssKey.includes('line-height') ||
+        cssKey.includes('font-weight')
+      const needsPx = !isUnitless
+      result[cssKey] = needsPx ? `${value}px` : String(value)
+    } else {
+      result[cssKey] = String(value)
+    }
+  }
+ 
+  return result
+}
+ 
+function camelToKebab(str: string): string {
+  return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()
+}
+ 
+export function useEditorTheme() {
+  const { cssVars, styleString } = useMemo(() => {
+    const vars = flattenTheme(themeConfig as Record<string, ThemeValue>)
+    const str = Object.entries(vars)
+      .map(([k, v]) => `${k}: ${v};`)
+      .join('\n')
+    return { cssVars: vars, styleString: str }
+  }, [])
+ 
+  return { themeConfig, cssVars, styleString }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/hooks/useVaultLoader.ts.html b/coverage/src/hooks/useVaultLoader.ts.html new file mode 100644 index 00000000..682c7e1f --- /dev/null +++ b/coverage/src/hooks/useVaultLoader.ts.html @@ -0,0 +1,496 @@ + + + + + + Code coverage report for src/hooks/useVaultLoader.ts + + + + + + + + + +
+
+

All files / src/hooks useVaultLoader.ts

+
+ +
+ 47.22% + Statements + 34/72 +
+ + +
+ 18.75% + Branches + 3/16 +
+ + +
+ 26.31% + Functions + 5/19 +
+ + +
+ 51.51% + Lines + 34/66 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138  +  +  +  +  +  +22x +22x +22x +  +22x +7x +7x +7x +  +7x +7x +  +7x +  +  +7x +7x +  +7x +7x +  +  +7x +  +  +7x +  +7x +  +  +  +  +7x +  +  +22x +7x +  +7x +  +  +7x +  +7x +  +  +  +  +  +  +22x +7x +  +  +22x +  +  +  +  +22x +  +  +  +22x +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +22x +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useCallback, useEffect, useState } from 'react'
+import { invoke } from '@tauri-apps/api/core'
+import { isTauri, mockInvoke } from '../mock-tauri'
+import type { VaultEntry, GitCommit, ModifiedFile } from '../types'
+ 
+export function useVaultLoader(vaultPath: string) {
+  const [entries, setEntries] = useState<VaultEntry[]>([])
+  const [allContent, setAllContent] = useState<Record<string, string>>({})
+  const [modifiedFiles, setModifiedFiles] = useState<ModifiedFile[]>([])
+ 
+  useEffect(() => {
+    setEntries([])
+    setAllContent({})
+    setModifiedFiles([])
+ 
+    const loadVault = async () => {
+      try {
+        let result: VaultEntry[]
+        Iif (isTauri()) {
+          result = await invoke<VaultEntry[]>('list_vault', { path: vaultPath })
+        } else {
+          console.info('[mock] Using mock Tauri data for browser testing')
+          result = await mockInvoke<VaultEntry[]>('list_vault', { path: vaultPath })
+        }
+        console.log(`Vault scan complete: ${result.length} entries found`)
+        setEntries(result)
+ 
+        let content: Record<string, string>
+        Iif (isTauri()) {
+          content = {}
+        } else {
+          content = await mockInvoke<Record<string, string>>('get_all_content', { path: vaultPath })
+        }
+        setAllContent(content)
+      } catch (err) {
+        console.warn('Vault scan failed:', err)
+      }
+    }
+    loadVault()
+  }, [vaultPath])
+ 
+  const loadModifiedFiles = useCallback(async () => {
+    try {
+      let files: ModifiedFile[]
+      Iif (isTauri()) {
+        files = await invoke<ModifiedFile[]>('get_modified_files', { vaultPath })
+      } else {
+        files = await mockInvoke<ModifiedFile[]>('get_modified_files', {})
+      }
+      setModifiedFiles(files)
+    } catch (err) {
+      console.warn('Failed to load modified files:', err)
+      setModifiedFiles([])
+    }
+  }, [vaultPath])
+ 
+  useEffect(() => {
+    loadModifiedFiles()
+  }, [loadModifiedFiles])
+ 
+  const addEntry = useCallback((entry: VaultEntry, content: string) => {
+    setEntries((prev) => [entry, ...prev])
+    setAllContent((prev) => ({ ...prev, [entry.path]: content }))
+  }, [])
+ 
+  const updateContent = useCallback((path: string, content: string) => {
+    setAllContent((prev) => ({ ...prev, [path]: content }))
+  }, [])
+ 
+  const updateEntry = useCallback((path: string, patch: Partial<VaultEntry>) => {
+    setEntries((prev) => prev.map((e) => e.path === path ? { ...e, ...patch } : e))
+  }, [])
+ 
+  const loadGitHistory = useCallback(async (path: string): Promise<GitCommit[]> => {
+    try {
+      if (isTauri()) {
+        return await invoke<GitCommit[]>('get_file_history', { vaultPath, path })
+      } else {
+        return await mockInvoke<GitCommit[]>('get_file_history', { path })
+      }
+    } catch (err) {
+      console.warn('Failed to load git history:', err)
+      return []
+    }
+  }, [vaultPath])
+ 
+  const loadDiffAtCommit = useCallback(async (path: string, commitHash: string): Promise<string> => {
+    if (isTauri()) {
+      return invoke<string>('get_file_diff_at_commit', { vaultPath, path, commitHash })
+    } else {
+      return mockInvoke<string>('get_file_diff_at_commit', { path, commitHash })
+    }
+  }, [vaultPath])
+ 
+  const loadDiff = useCallback(async (path: string): Promise<string> => {
+    if (isTauri()) {
+      return invoke<string>('get_file_diff', { vaultPath, path })
+    } else {
+      return mockInvoke<string>('get_file_diff', { path })
+    }
+  }, [vaultPath])
+ 
+  const isFileModified = useCallback((path: string): boolean => {
+    return modifiedFiles.some((f) => f.path === path)
+  }, [modifiedFiles])
+ 
+  const commitAndPush = useCallback(async (message: string): Promise<string> => {
+    if (isTauri()) {
+      await invoke<string>('git_commit', { vaultPath, message })
+      try {
+        await invoke<string>('git_push', { vaultPath })
+        return 'Committed and pushed'
+      } catch {
+        return 'Committed (push failed)'
+      }
+    } else {
+      await mockInvoke<string>('git_commit', { message })
+      await mockInvoke<string>('git_push', {})
+      return 'Committed and pushed'
+    }
+  }, [vaultPath])
+ 
+  return {
+    entries,
+    allContent,
+    modifiedFiles,
+    addEntry,
+    updateEntry,
+    updateContent,
+    loadModifiedFiles,
+    loadGitHistory,
+    loadDiff,
+    loadDiffAtCommit,
+    isFileModified,
+    commitAndPush,
+  }
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/index.html b/coverage/src/index.html new file mode 100644 index 00000000..6a52a2ee --- /dev/null +++ b/coverage/src/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 40.9% + Statements + 45/110 +
+ + +
+ 50% + Branches + 11/22 +
+ + +
+ 13.51% + Functions + 5/37 +
+ + +
+ 45% + Lines + 45/100 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
App.tsx +
+
40.9%45/11050%11/2213.51%5/3745%45/100
types.ts +
+
0%0/00%0/00%0/00%0/0
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/index.html b/coverage/src/lib/index.html new file mode 100644 index 00000000..2e36b64f --- /dev/null +++ b/coverage/src/lib/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/lib + + + + + + + + + +
+
+

All files src/lib

+
+ +
+ 100% + Statements + 1/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 1/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
utils.ts +
+
100%1/1100%0/0100%1/1100%1/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/utils.ts.html b/coverage/src/lib/utils.ts.html new file mode 100644 index 00000000..a4e8f4a0 --- /dev/null +++ b/coverage/src/lib/utils.ts.html @@ -0,0 +1,103 @@ + + + + + + Code coverage report for src/lib/utils.ts + + + + + + + + + +
+
+

All files / src/lib utils.ts

+
+ +
+ 100% + Statements + 1/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 1/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7  +  +  +  +1714x +  + 
import { clsx, type ClassValue } from "clsx"
+import { twMerge } from "tailwind-merge"
+ 
+export function cn(...inputs: ClassValue[]) {
+  return twMerge(clsx(inputs))
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/types.ts.html b/coverage/src/types.ts.html new file mode 100644 index 00000000..6775ff2e --- /dev/null +++ b/coverage/src/types.ts.html @@ -0,0 +1,226 @@ + + + + + + Code coverage report for src/types.ts + + + + + + + + + +
+
+

All files / src types.ts

+
+ +
+ 0% + Statements + 0/0 +
+ + +
+ 0% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export interface VaultEntry {
+  path: string
+  filename: string
+  title: string
+  isA: string | null
+  aliases: string[]
+  belongsTo: string[]
+  relatedTo: string[]
+  status: string | null
+  owner: string | null
+  cadence: string | null
+  archived: boolean
+  trashed: boolean
+  trashedAt: number | null
+  modifiedAt: number | null
+  createdAt: number | null
+  fileSize: number
+  snippet: string
+  /** Generic relationship fields: any frontmatter key whose value contains wikilinks. */
+  relationships: Record<string, string[]>
+  /** Phosphor icon name (kebab-case) for Type entries, e.g. "cooking-pot" */
+  icon: string | null
+  /** Accent color key for Type entries: "red" | "purple" | "blue" | "green" | "yellow" | "orange" */
+  color: string | null
+  /** Display order for Type entries in sidebar (lower = higher). null = use default order. */
+  order: number | null
+}
+ 
+export interface GitCommit {
+  hash: string
+  shortHash: string
+  message: string
+  author: string
+  date: number // unix timestamp
+}
+ 
+export interface ModifiedFile {
+  path: string
+  relativePath: string
+  status: 'modified' | 'added' | 'deleted' | 'untracked' | 'renamed'
+}
+ 
+export type SidebarSelection =
+  | { kind: 'filter'; filter: 'all' | 'favorites' | 'archived' | 'trash' }
+  | { kind: 'sectionGroup'; type: string }
+  | { kind: 'entity'; entry: VaultEntry }
+  | { kind: 'topic'; entry: VaultEntry }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/utils/ai-chat.ts.html b/coverage/src/utils/ai-chat.ts.html new file mode 100644 index 00000000..b2ef3a50 --- /dev/null +++ b/coverage/src/utils/ai-chat.ts.html @@ -0,0 +1,655 @@ + + + + + + Code coverage report for src/utils/ai-chat.ts + + + + + + + + + +
+
+

All files / src/utils ai-chat.ts

+
+ +
+ 5.26% + Statements + 4/76 +
+ + +
+ 0% + Branches + 0/43 +
+ + +
+ 0% + Functions + 0/10 +
+ + +
+ 5.63% + Lines + 4/71 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  + 
/**
+ * AI Chat utilities — Anthropic API client, token estimation, context building.
+ */
+ 
+import type { VaultEntry } from '../types'
+ 
+// --- localStorage key for API key ---
+const API_KEY_STORAGE_KEY = 'laputa:anthropic-api-key'
+ 
+export function getApiKey(): string {
+  return localStorage.getItem(API_KEY_STORAGE_KEY) ?? ''
+}
+ 
+export function setApiKey(key: string): void {
+  localStorage.setItem(API_KEY_STORAGE_KEY, key)
+}
+ 
+// --- Token estimation ---
+ 
+/** Rough token estimate: ~4 chars per token for English text. */
+export function estimateTokens(text: string | number): number {
+  const len = typeof text === 'number' ? text : text.length
+  return Math.ceil(len / 4)
+}
+ 
+const DEFAULT_CONTEXT_LIMIT = 180_000
+ 
+export function getContextLimit(_model: string): number {
+  return DEFAULT_CONTEXT_LIMIT
+}
+ 
+// --- Context building ---
+ 
+/** Build system prompt from selected context notes. */
+export function buildSystemPrompt(
+  notes: VaultEntry[],
+  allContent: Record<string, string>,
+  model: string,
+): { prompt: string; totalTokens: number; truncated: boolean } {
+  if (notes.length === 0) {
+    return { prompt: '', totalTokens: 0, truncated: false }
+  }
+ 
+  const contextBudget = Math.floor(getContextLimit(model) * 0.6)
+  const preamble = [
+    'You are a helpful AI assistant integrated into Laputa, a personal knowledge management app.',
+    'The user has selected the following notes as context. Use them to answer questions accurately.',
+    '',
+  ].join('\n')
+ 
+  const parts: string[] = [preamble]
+  let totalChars = preamble.length
+  let truncated = false
+ 
+  for (const note of notes) {
+    const content = allContent[note.path] ?? ''
+    const header = `--- Note: ${note.title} (${note.isA ?? 'Note'}) ---`
+    const noteText = `${header}\n${content}\n`
+ 
+    if (estimateTokens(totalChars + noteText.length) > contextBudget) {
+      const remaining = (contextBudget - estimateTokens(totalChars)) * 4
+      if (remaining > 200) {
+        parts.push(`${header}\n${content.slice(0, remaining)}\n[... truncated ...]`)
+      }
+      truncated = true
+      break
+    }
+ 
+    parts.push(noteText)
+    totalChars += noteText.length
+  }
+ 
+  const prompt = parts.join('\n')
+  return { prompt, totalTokens: estimateTokens(prompt), truncated }
+}
+ 
+// --- API types ---
+ 
+export interface ChatMessage {
+  role: 'user' | 'assistant'
+  content: string
+  id: string
+}
+ 
+let msgIdCounter = 0
+export function nextMessageId(): string {
+  return `msg-${++msgIdCounter}-${Date.now()}`
+}
+ 
+// --- SSE parsing ---
+ 
+function parseSseEvent(line: string, onChunk: (text: string) => void): boolean {
+  if (!line.startsWith('data: ')) return false
+  const data = line.slice(6)
+  if (data === '[DONE]') return true
+ 
+  try {
+    const event = JSON.parse(data)
+    if (event.type === 'content_block_delta' && event.delta?.text) {
+      onChunk(event.delta.text)
+    }
+    if (event.type === 'message_stop') return true
+  } catch {
+    // skip malformed events
+  }
+  return false
+}
+ 
+async function readSseStream(
+  reader: ReadableStreamDefaultReader<Uint8Array>,
+  onChunk: (text: string) => void,
+): Promise<void> {
+  const decoder = new TextDecoder()
+  let buffer = ''
+ 
+  while (true) {
+    const { value, done } = await reader.read()
+    if (done) break
+ 
+    buffer += decoder.decode(value, { stream: true })
+    const lines = buffer.split('\n')
+    buffer = lines.pop() ?? ''
+ 
+    for (const line of lines) {
+      if (parseSseEvent(line, onChunk)) return
+    }
+  }
+}
+ 
+async function parseApiError(response: Response): Promise<string> {
+  const errText = await response.text()
+  try {
+    const errJson = JSON.parse(errText)
+    return errJson.error?.message || errJson.error || `API error (${response.status})`
+  } catch {
+    return `API error (${response.status})`
+  }
+}
+ 
+// --- Streaming API call ---
+ 
+export async function streamChat(
+  messages: { role: 'user' | 'assistant'; content: string }[],
+  systemPrompt: string,
+  model: string,
+  onChunk: (text: string) => void,
+  onDone: () => void,
+  onError: (error: string) => void,
+): Promise<void> {
+  const apiKey = getApiKey()
+  if (!apiKey) {
+    onError('No API key configured. Click the key icon to set your Anthropic API key.')
+    return
+  }
+ 
+  try {
+    const response = await fetch('/api/ai/chat', {
+      method: 'POST',
+      headers: { 'Content-Type': 'application/json' },
+      body: JSON.stringify({
+        apiKey, model, messages,
+        system: systemPrompt || undefined,
+        maxTokens: 4096,
+      }),
+    })
+ 
+    if (!response.ok) {
+      onError(await parseApiError(response))
+      return
+    }
+ 
+    const reader = response.body?.getReader()
+    if (!reader) {
+      onError('No response body')
+      return
+    }
+ 
+    await readSseStream(reader, onChunk)
+    onDone()
+  } catch (err: any) {
+    onError(err.message || 'Network error')
+  }
+}
+ 
+// --- Model options ---
+export const MODEL_OPTIONS = [
+  { value: 'claude-3-5-haiku-20241022', label: 'Haiku 3.5' },
+  { value: 'claude-sonnet-4-20250514', label: 'Sonnet 4' },
+  { value: 'claude-opus-4-20250514', label: 'Opus 4' },
+] as const
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/utils/frontmatter.ts.html b/coverage/src/utils/frontmatter.ts.html new file mode 100644 index 00000000..930b241d --- /dev/null +++ b/coverage/src/utils/frontmatter.ts.html @@ -0,0 +1,301 @@ + + + + + + Code coverage report for src/utils/frontmatter.ts + + + + + + + + + +
+
+

All files / src/utils frontmatter.ts

+
+ +
+ 88.37% + Statements + 38/43 +
+ + +
+ 81.08% + Branches + 30/37 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 90% + Lines + 36/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73  +  +  +  +  +  +  +  +26x +  +16x +16x +  +16x +16x +  +16x +16x +16x +  +16x +  +16x +146x +146x +28x +28x +28x +  +  +118x +14x +14x +14x +  +  +118x +118x +118x +118x +  +118x +28x +  +  +90x +42x +14x +14x +  +  +76x +  +76x +  +  +  +76x +  +  +  +  +76x +  +  +  +16x +14x +  +  +16x +  + 
import type { FrontmatterValue } from '../components/Inspector'
+ 
+export interface ParsedFrontmatter {
+  [key: string]: FrontmatterValue
+}
+ 
+/** Parse YAML frontmatter from content */
+export function parseFrontmatter(content: string | null): ParsedFrontmatter {
+  if (!content) return {}
+ 
+  const match = content.match(/^---\n([\s\S]*?)\n---/)
+  Iif (!match) return {}
+ 
+  const yaml = match[1]
+  const result: ParsedFrontmatter = {}
+ 
+  let currentKey: string | null = null
+  let currentList: string[] = []
+  let inList = false
+ 
+  const lines = yaml.split('\n')
+ 
+  for (const line of lines) {
+    const listMatch = line.match(/^  - (.*)$/)
+    if (listMatch && currentKey) {
+      inList = true
+      currentList.push(listMatch[1].replace(/^["']|["']$/g, ''))
+      continue
+    }
+ 
+    if (inList && currentKey) {
+      result[currentKey] = currentList.length === 1 ? currentList[0] : currentList
+      currentList = []
+      inList = false
+    }
+ 
+    const kvMatch = line.match(/^["']?([^"':]+)["']?\s*:\s*(.*)$/)
+    Eif (kvMatch) {
+      currentKey = kvMatch[1].trim()
+      const value = kvMatch[2].trim()
+ 
+      if (value === '' || value === '|' || value === '>') {
+        continue
+      }
+ 
+      if (value.startsWith('[') && value.endsWith(']')) {
+        const items = value.slice(1, -1).split(',').map(s => s.trim().replace(/^["']|["']$/g, ''))
+        result[currentKey] = items.length === 1 ? items[0] : items
+        continue
+      }
+ 
+      const unquoted = value.replace(/^["']|["']$/g, '')
+ 
+      Iif (unquoted.toLowerCase() === 'true') {
+        result[currentKey] = true
+        continue
+      }
+      Iif (unquoted.toLowerCase() === 'false') {
+        result[currentKey] = false
+        continue
+      }
+ 
+      result[currentKey] = unquoted
+    }
+  }
+ 
+  if (inList && currentKey) {
+    result[currentKey] = currentList.length === 1 ? currentList[0] : currentList
+  }
+ 
+  return result
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/utils/index.html b/coverage/src/utils/index.html new file mode 100644 index 00000000..81013010 --- /dev/null +++ b/coverage/src/utils/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/utils + + + + + + + + + +
+
+

All files src/utils

+
+ +
+ 46.85% + Statements + 82/175 +
+ + +
+ 45.37% + Branches + 54/119 +
+ + +
+ 52.17% + Functions + 12/23 +
+ + +
+ 49.37% + Lines + 79/160 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ai-chat.ts +
+
5.26%4/760%0/430%0/105.63%4/71
frontmatter.ts +
+
88.37%38/4381.08%30/37100%2/290%36/40
typeColors.ts +
+
86.66%13/1571.42%10/14100%4/4100%13/13
wikilinks.ts +
+
65.85%27/4156%14/2585.71%6/772.22%26/36
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/utils/typeColors.ts.html b/coverage/src/utils/typeColors.ts.html new file mode 100644 index 00000000..f539c4f5 --- /dev/null +++ b/coverage/src/utils/typeColors.ts.html @@ -0,0 +1,259 @@ + + + + + + Code coverage report for src/utils/typeColors.ts + + + + + + + + + +
+
+

All files / src/utils typeColors.ts

+
+ +
+ 86.66% + Statements + 13/15 +
+ + +
+ 71.42% + Branches + 10/14 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +5x +5x +  +  +5x +  +  +  +  +  +  +  +  +5x +30x +  +5x +30x +  +  +  +  +832x +832x +  +  +  +  +758x +758x +  + 
/**
+ * Maps note types to their accent color CSS variables.
+ * Single source of truth for type→color mapping used across Sidebar, NoteList, and Inspector.
+ */
+ 
+const TYPE_COLOR_MAP: Record<string, string> = {
+  Project: 'var(--accent-red)',
+  Experiment: 'var(--accent-red)',
+  Responsibility: 'var(--accent-purple)',
+  Procedure: 'var(--accent-purple)',
+  Person: 'var(--accent-yellow)',
+  Event: 'var(--accent-yellow)',
+  Topic: 'var(--accent-green)',
+  Type: 'var(--accent-blue)',
+}
+ 
+const TYPE_LIGHT_COLOR_MAP: Record<string, string> = {
+  Project: 'var(--accent-red-light)',
+  Experiment: 'var(--accent-red-light)',
+  Responsibility: 'var(--accent-purple-light)',
+  Procedure: 'var(--accent-purple-light)',
+  Person: 'var(--accent-yellow-light)',
+  Event: 'var(--accent-yellow-light)',
+  Topic: 'var(--accent-green-light)',
+  Type: 'var(--accent-blue-light)',
+}
+ 
+const DEFAULT_COLOR = 'var(--accent-blue)'
+const DEFAULT_LIGHT_COLOR = 'var(--accent-blue-light)'
+ 
+/** Color key → CSS variable mapping for the design system accent palette */
+export const ACCENT_COLORS: { key: string; label: string; css: string; cssLight: string }[] = [
+  { key: 'red', label: 'Red', css: 'var(--accent-red)', cssLight: 'var(--accent-red-light)' },
+  { key: 'orange', label: 'Orange', css: 'var(--accent-orange)', cssLight: 'var(--accent-orange-light)' },
+  { key: 'yellow', label: 'Yellow', css: 'var(--accent-yellow)', cssLight: 'var(--accent-yellow-light)' },
+  { key: 'green', label: 'Green', css: 'var(--accent-green)', cssLight: 'var(--accent-green-light)' },
+  { key: 'blue', label: 'Blue', css: 'var(--accent-blue)', cssLight: 'var(--accent-blue-light)' },
+  { key: 'purple', label: 'Purple', css: 'var(--accent-purple)', cssLight: 'var(--accent-purple-light)' },
+]
+ 
+const COLOR_KEY_TO_CSS: Record<string, string> = Object.fromEntries(
+  ACCENT_COLORS.map((c) => [c.key, c.css]),
+)
+const COLOR_KEY_TO_CSS_LIGHT: Record<string, string> = Object.fromEntries(
+  ACCENT_COLORS.map((c) => [c.key, c.cssLight]),
+)
+ 
+/** Returns the CSS variable for the accent color of a given note type, with optional custom override */
+export function getTypeColor(isA: string | null, customColorKey?: string | null): string {
+  Iif (customColorKey && COLOR_KEY_TO_CSS[customColorKey]) return COLOR_KEY_TO_CSS[customColorKey]
+  return (isA && TYPE_COLOR_MAP[isA]) ?? DEFAULT_COLOR
+}
+ 
+/** Returns the CSS variable for the light/background variant of a given note type's color */
+export function getTypeLightColor(isA: string | null, customColorKey?: string | null): string {
+  Iif (customColorKey && COLOR_KEY_TO_CSS_LIGHT[customColorKey]) return COLOR_KEY_TO_CSS_LIGHT[customColorKey]
+  return (isA && TYPE_LIGHT_COLOR_MAP[isA]) ?? DEFAULT_LIGHT_COLOR
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/utils/wikilinks.ts.html b/coverage/src/utils/wikilinks.ts.html new file mode 100644 index 00000000..2ca14bb6 --- /dev/null +++ b/coverage/src/utils/wikilinks.ts.html @@ -0,0 +1,289 @@ + + + + + + Code coverage report for src/utils/wikilinks.ts + + + + + + + + + +
+
+

All files / src/utils wikilinks.ts

+
+ +
+ 65.85% + Statements + 27/41 +
+ + +
+ 56% + Branches + 14/25 +
+ + +
+ 85.71% + Functions + 6/7 +
+ + +
+ 72.22% + Lines + 26/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69  +2x +2x +2x +  +  +  +8x +  +  +  +  +9x +1x +1x +  +1x +1x +  +1x +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +16x +16x +16x +16x +16x +16x +  +  +  +8x +8x +8x +8x +  + 
// Wikilink placeholder tokens for markdown round-trip
+const WL_START = '\u2039WIKILINK:'
+const WL_END = '\u203A'
+const WL_RE = new RegExp(`${WL_START.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}([^${WL_END}]+)${WL_END.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, 'g')
+ 
+/** Pre-process markdown: replace [[target]] with placeholder tokens */
+export function preProcessWikilinks(md: string): string {
+  return md.replace(/\[\[([^\]]+)\]\]/g, (_m, target) => `${WL_START}${target}${WL_END}`)
+}
+ 
+/** Walk blocks and replace placeholder text with wikilink inline content */
+export function injectWikilinks(blocks: any[]): any[] {
+  return blocks.map(block => {
+    Eif (block.content && Array.isArray(block.content)) {
+      block.content = expandWikilinksInContent(block.content)
+    }
+    Eif (block.children && Array.isArray(block.children)) {
+      block.children = injectWikilinks(block.children)
+    }
+    return block
+  })
+}
+ 
+function expandWikilinksInContent(content: any[]): any[] {
+  const result: any[] = []
+  for (const item of content) {
+    Eif (item.type !== 'text' || typeof item.text !== 'string' || !item.text.includes(WL_START)) {
+      result.push(item)
+      continue
+    }
+    const text = item.text as string
+    let lastIndex = 0
+    WL_RE.lastIndex = 0
+    let match
+    while ((match = WL_RE.exec(text)) !== null) {
+      if (match.index > lastIndex) {
+        result.push({ ...item, text: text.slice(lastIndex, match.index) })
+      }
+      result.push({
+        type: 'wikilink',
+        props: { target: match[1] },
+        content: undefined,
+      })
+      lastIndex = match.index + match[0].length
+    }
+    if (lastIndex < text.length) {
+      result.push({ ...item, text: text.slice(lastIndex) })
+    }
+  }
+  return result
+}
+ 
+/** Strip YAML frontmatter from markdown, returning [frontmatter, body] */
+export function splitFrontmatter(content: string): [string, string] {
+  Iif (!content.startsWith('---')) return ['', content]
+  const end = content.indexOf('\n---', 3)
+  Iif (end === -1) return ['', content]
+  let to = end + 4
+  Eif (content[to] === '\n') to++
+  return [content.slice(0, to), content.slice(to)]
+}
+ 
+export function countWords(content: string): number {
+  const [, body] = splitFrontmatter(content)
+  const text = body.replace(/[#*_\[\]`>~\-|]/g, '').trim()
+  Iif (!text) return 0
+  return text.split(/\s+/).filter(Boolean).length
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/demo-vault-v2/attachments/1771694098221-CleanShot_2026-02-21_at_17.12.59_2x.png b/demo-vault-v2/attachments/1771694098221-CleanShot_2026-02-21_at_17.12.59_2x.png new file mode 100644 index 00000000..18138a75 Binary files /dev/null and b/demo-vault-v2/attachments/1771694098221-CleanShot_2026-02-21_at_17.12.59_2x.png differ diff --git a/demo-vault-v2/experiment/experiment-failed-podcast.md b/demo-vault-v2/experiment/experiment-failed-podcast.md index 147c27e2..ffb1cf9f 100644 --- a/demo-vault-v2/experiment/experiment-failed-podcast.md +++ b/demo-vault-v2/experiment/experiment-failed-podcast.md @@ -1,6 +1,6 @@ --- Is A: Experiment -Status: Dropped +Status: Open trashed: true trashed_at: "2026-02-05" --- diff --git a/demo-vault-v2/note/note-deprecated-workflow.md b/demo-vault-v2/note/note-deprecated-workflow.md index 6181c136..acee3619 100644 --- a/demo-vault-v2/note/note-deprecated-workflow.md +++ b/demo-vault-v2/note/note-deprecated-workflow.md @@ -1,7 +1,7 @@ --- Is A: Note trashed: true -trashed_at: "2026-01-15" +trashed_at: 2026-02-21 Topics: ["[[topic-productivity-systems]]"] --- # Deprecated Workflow diff --git a/design/leaner-note-creation.pen b/design/leaner-note-creation.pen new file mode 100644 index 00000000..11e28096 --- /dev/null +++ b/design/leaner-note-creation.pen @@ -0,0 +1,9372 @@ +{ + "version": "2.8", + "children": [ + { + "type": "frame", + "id": "qHhaj", + "x": 68, + "y": 3385, + "name": "Laputa App — Full Layout (Light)", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 1440, + "height": 900, + "fill": "$--background", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "yVQFF", + "name": "macOS Title Bar", + "width": "fill_container", + "height": 38, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "gap": 12, + "padding": [ + 0, + 12 + ], + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "0MCME", + "name": "trafficLights", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "ellipse", + "id": "c2AU6", + "name": "closeBtn", + "fill": "#FF5F57", + "width": 12, + "height": 12 + }, + { + "type": "ellipse", + "id": "h0zbh", + "name": "minimizeBtn", + "fill": "#FEBC2E", + "width": 12, + "height": 12 + }, + { + "type": "ellipse", + "id": "tcqbu", + "name": "maximizeBtn", + "fill": "#28C840", + "width": 12, + "height": 12 + } + ] + } + ] + }, + { + "type": "frame", + "id": "oHDfa", + "name": "Content", + "width": "fill_container", + "height": "fill_container", + "children": [ + { + "type": "frame", + "id": "ZTOSJ", + "name": "Panel: Sidebar", + "clip": true, + "width": 250, + "height": "fill_container", + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": 0, + "fill": "$--sidebar-border" + }, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "4wMva", + "name": "Filters", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 1, + "padding": [ + 8, + 8, + 16, + 8 + ], + "children": [ + { + "type": "frame", + "id": "Q78hg", + "name": "filterAll", + "width": "fill_container", + "fill": "#4a9eff18", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "5ip58", + "name": "leftAll", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "PXpWi", + "name": "iconAll", + "width": 18, + "height": 18, + "iconFontName": "tray-fill", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--primary" + }, + { + "type": "text", + "id": "NWprl", + "name": "fAllTxt", + "fill": "$--primary", + "content": "Untagged", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "NZ9Dv", + "name": "countAll", + "height": 20, + "fill": "$--primary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "mPlUV", + "name": "badgeAllTxt", + "fill": "$--primary-foreground", + "content": "24", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "YLWsY", + "name": "filterUntagged", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "k7LIr", + "name": "leftUntagged", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "FMVlh", + "name": "untaggedIcon", + "width": 18, + "height": 18, + "iconFontName": "cardholder", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "5XllD", + "name": "untaggedTxt", + "fill": "$--foreground", + "content": "All Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "aSpGv", + "name": "countUntagged", + "height": 20, + "fill": "$--secondary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "qZUFt", + "name": "untaggedBadgeTxt", + "fill": "$--muted-foreground", + "content": "6", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "Jahon", + "name": "filterTrash", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "IOiBI", + "name": "leftTrash", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "X6F74", + "name": "trashIcon", + "width": 18, + "height": 18, + "iconFontName": "trash", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "vRMH9", + "name": "trashTxt", + "fill": "$--foreground", + "content": "Archive", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "JMpkq", + "name": "countTrash", + "height": 20, + "fill": "$--secondary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "0cKm4", + "name": "trashBadgeTxt", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "6RMbq", + "name": "filterChanges", + "width": "fill_container", + "cornerRadius": 6, + "gap": 6, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "DpdBu", + "name": "leftChanges", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "VTusA", + "name": "iconChanges", + "width": 18, + "height": 18, + "iconFontName": "git-branch", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "qvq5O", + "name": "fChangesTxt", + "fill": "$--foreground", + "content": "Changes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "qAMES", + "name": "countChanges", + "height": 20, + "fill": "$--secondary", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "nkzVk", + "name": "badgeChangesTxt", + "fill": "$--muted-foreground", + "content": "3", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "SSEUP", + "name": "Sections", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "padding": [ + 8, + 0 + ], + "children": [ + { + "type": "frame", + "id": "nM2Cn", + "name": "projGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6, + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "ouIl9", + "name": "projHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "Rx1Cp", + "name": "leftProj", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "t5WJJ", + "name": "projIcon", + "width": 18, + "height": 18, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-red" + }, + { + "type": "text", + "id": "S3sGC", + "name": "projLabel", + "fill": "$--foreground", + "content": "Projects", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "FKwSS", + "name": "projChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "IHzFh", + "name": "projItem1", + "width": "fill_container", + "fill": "$--accent-red-light", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "iiFcl", + "name": "proj1Txt", + "fill": "$--accent-red", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "LdaU9", + "name": "projItem2", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "XRll4", + "name": "proj2Txt", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Vmykd", + "name": "projItem3", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "0PqQQ", + "name": "proj3Txt", + "fill": "$--muted-foreground", + "content": "AI Habit Tracker", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "WAQtn", + "name": "respGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "aSi3l", + "name": "respHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "lov6B", + "name": "leftResp", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "Em4ns", + "name": "respIcon", + "width": 18, + "height": 18, + "iconFontName": "medal", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "WPRCo", + "name": "respLabel", + "fill": "$--foreground", + "content": "Responsibilities", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "6hDdQ", + "name": "respChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "FmUu0", + "name": "procGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "Dat6o", + "name": "respHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "iJlgx", + "name": "leftResp", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "I2J1R", + "name": "respIcon", + "width": 18, + "height": 18, + "iconFontName": "arrows-clockwise", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "AToF0", + "name": "Procedures", + "fill": "$--foreground", + "content": "Procedures", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "meEIL", + "name": "procChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "T4NG2", + "name": "peopleGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "Q01iL", + "name": "peopleHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "eE6Ca", + "name": "leftPeople", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "jOmVa", + "name": "peopleIcon", + "width": 18, + "height": 18, + "iconFontName": "users", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "caelD", + "name": "peopleLbl", + "fill": "$--foreground", + "content": "People", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "TkuS1", + "name": "peopleChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "BY1Qx", + "name": "eventsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "v28d8", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "TPyOc", + "name": "leftEvents", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "ELRMi", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "calendar-blank", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "OlI6Q", + "name": "eventsLbl", + "fill": "$--foreground", + "content": "Events", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "TZwK8", + "name": "eventsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trKNW", + "name": "topicsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "qdbZ3", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "JP83M", + "name": "leftEvents", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "Q57kF", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "DeVxP", + "name": "eventsLbl", + "fill": "$--foreground", + "content": "Topics", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "nzAcm", + "name": "topicsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "ZWXuk", + "name": "topicsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "CQaLg", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "2SMcN", + "name": "leftEvents", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "0N8UH", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "6XB2H", + "name": "eventsLbl", + "fill": "$--foreground", + "content": "Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "NmBSB", + "name": "topicsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "2cQBp", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "0f10v", + "name": "leftEvents", + "gap": 8, + "padding": [ + 8, + 0 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "xBv1X", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "viWPL", + "name": "eventsLbl", + "fill": "$--muted-foreground", + "content": "Create new type", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "8lLHp", + "name": "Commit Area", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "top": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "padding": 12, + "children": [ + { + "type": "frame", + "id": "YYjuy", + "name": "commitBtn", + "width": "fill_container", + "fill": "$--primary", + "cornerRadius": 6, + "gap": 6, + "padding": [ + 8, + 16 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "YF44G", + "name": "commitIcon", + "width": 14, + "height": 14, + "iconFontName": "git-commit-horizontal", + "iconFontFamily": "lucide", + "fill": "$--primary-foreground" + }, + { + "type": "text", + "id": "vpzJm", + "name": "commitTxt", + "fill": "$--primary-foreground", + "content": "Commit & Push", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "vhU5z", + "name": "commitBadge", + "height": 18, + "fill": "#ffffff40", + "cornerRadius": 9, + "padding": [ + 0, + 5 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "sdvYT", + "name": "commitBadgeTxt", + "fill": "$--white", + "content": "3", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "IIvWr", + "name": "Resize Handle", + "fill": "$--border", + "width": 1, + "height": "fill_container" + }, + { + "type": "frame", + "id": "zFIJv", + "name": "Panel: NoteList", + "clip": true, + "width": 300, + "height": "fill_container", + "fill": "$--card", + "stroke": { + "align": "inside", + "thickness": 0, + "fill": "$--border" + }, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "uZJVN", + "name": "NoteList Header", + "width": "fill_container", + "height": 45, + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "padding": [ + 14, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "hmbdb", + "name": "nlTitle", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "m6AeW", + "name": "nlActions", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "8gMXE", + "name": "searchIcon", + "width": 16, + "height": 16, + "iconFontName": "magnifying-glass", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "YqvSN", + "name": "plusIcon", + "width": 16, + "height": 16, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "0aJUm", + "name": "Note Items", + "clip": true, + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "y9y05", + "name": "Backlinks Group", + "width": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "tMsM4", + "name": "Note Item Selected", + "width": "fill_container", + "fill": "$--accent-red-light", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "#E9E9E7" + }, + "children": [ + { + "type": "rectangle", + "id": "npYuc", + "name": "leftAccent", + "fill": "$--accent-red", + "width": 3, + "height": "fill_container" + }, + { + "type": "frame", + "id": "a33Wx", + "name": "noteSelContent", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "AZkyx", + "name": "noteSelRow", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "j7GDJ", + "name": "titleGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "j7o2Q", + "name": "noteSelTitle", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "icon_font", + "id": "BnkTG", + "name": "ico", + "width": 14, + "height": 14, + "iconFontName": "wrench", + "iconFontFamily": "lucide", + "fill": "$--accent-red" + } + ] + } + ] + }, + { + "type": "text", + "id": "Ac5Ds", + "name": "noteSelSnip", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Personal knowledge and life management desktop app...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "9ASsT", + "name": "noteSelTime", + "fill": "$--accent-red", + "content": "2m ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "7G8pN", + "name": "Related Notes Group", + "width": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "fDxtF", + "name": "Related Notes Header", + "width": "fill_container", + "height": 32, + "fill": "$--muted", + "padding": [ + 0, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "UBRdO", + "name": "rnLeft", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "8Z4Wq", + "name": "rnLabel", + "fill": "$--muted-foreground", + "content": "RELATED NOTES", + "fontFamily": "IBM Plex Mono", + "fontSize": 11 + }, + { + "type": "text", + "id": "vpnZr", + "name": "rnCount", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "X9LIR", + "name": "rnRight", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "fzVWu", + "name": "rnFilter", + "width": 12, + "height": 12, + "iconFontName": "funnel", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "wuqsO", + "name": "rnPlus", + "width": 12, + "height": 12, + "iconFontName": "plus", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "SbjLq", + "name": "rnChev", + "width": 12, + "height": 12, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "AsAKG", + "name": "Note Item", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "QX5A1", + "name": "note2Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "rYdta", + "name": "leafGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "PC9XN", + "name": "note2Title", + "fill": "$--foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "oI64Y", + "name": "leafIco", + "width": 14, + "height": 14, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + } + ] + }, + { + "type": "text", + "id": "S9JPj", + "name": "note2Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Redesigning portfolio site with modern stack and updated visual language...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "lU75x", + "name": "note2Time", + "fill": "$--muted-foreground", + "content": "1h ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "u6E6Z", + "name": "Note Item", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "ZjCz3", + "name": "note2Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "mxCzu", + "name": "leafGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "INenY", + "name": "note2Title", + "fill": "$--foreground", + "content": "Sample note 2", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "gz6qS", + "name": "leafIco", + "width": 14, + "height": 14, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + } + ] + }, + { + "type": "text", + "id": "s141z", + "name": "note2Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Lorem ipsum dolor sit amet consequetur with modern stack and updated language...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "SvGnt", + "name": "note2Time", + "fill": "$--muted-foreground", + "content": "1h ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "1GwHB", + "name": "Events Group", + "width": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "fp4xI", + "name": "Events Header", + "width": "fill_container", + "height": 32, + "fill": "$--muted", + "padding": [ + 0, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "MNNuU", + "name": "evLeft", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "BNxZp", + "name": "evLabel", + "fill": "$--muted-foreground", + "content": "EVENTS", + "fontFamily": "IBM Plex Mono", + "fontSize": 11 + }, + { + "type": "text", + "id": "qcEvw", + "name": "evCount", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "IBM Plex Sans", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "WCyfc", + "name": "evRight", + "gap": 10, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "SpCoO", + "name": "evFilter", + "width": 12, + "height": 12, + "iconFontName": "funnel", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "G1DCl", + "name": "evPlus", + "width": 12, + "height": 12, + "iconFontName": "plus", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "sAalN", + "name": "evChev", + "width": 12, + "height": 12, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "k7CjA", + "name": "Note Item 2", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "og5Gz", + "name": "note3Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "ttBdk", + "name": "calGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "KI8Bf", + "name": "note3Title", + "fill": "$--foreground", + "content": "Meeting with Grant", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "LdRjU", + "name": "calIco", + "width": 14, + "height": 14, + "iconFontName": "calendar", + "iconFontFamily": "lucide", + "fill": "$--accent-yellow" + } + ] + } + ] + }, + { + "type": "text", + "id": "FfPXa", + "name": "note3Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Discussed Q1 goals and hiring priorities with the engineering team leads...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "BHh4Z", + "name": "note3Time", + "fill": "$--muted-foreground", + "content": "Yesterday", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "AQ51u", + "name": "Note Item 2", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 4, + "padding": [ + 14, + 16 + ], + "children": [ + { + "type": "frame", + "id": "SHgK3", + "name": "note3Row", + "width": "fill_container", + "gap": 8, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "3rIet", + "name": "calGroup", + "width": "fill_container", + "gap": 6, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dCwzu", + "name": "note3Title", + "fill": "$--foreground", + "content": "Meeting with Matteo", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "l8O2I", + "name": "calIco", + "width": 14, + "height": 14, + "iconFontName": "calendar", + "iconFontFamily": "lucide", + "fill": "$--accent-yellow" + } + ] + } + ] + }, + { + "type": "text", + "id": "1L4oo", + "name": "note3Snip", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Discussed Q1 goals and hiring priorities with the engineering team leads...", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "3oBam", + "name": "note3Time", + "fill": "$--muted-foreground", + "content": "Yesterday", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "MeqjO", + "name": "Resize Handle 2", + "fill": "$--border", + "width": 1, + "height": "fill_container" + }, + { + "type": "frame", + "id": "zAbPt", + "name": "Panel: Editor", + "clip": true, + "width": "fill_container", + "height": "fill_container", + "fill": "$--background", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "NdYcO", + "name": "Tab Bar", + "width": "fill_container", + "height": 45, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "nVUGr", + "name": "Tab Active", + "height": "fill_container", + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "right": 1 + }, + "fill": "$--border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kBpGX", + "name": "tab1Txt", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "Bb2AE", + "name": "tab1Close", + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "GYeyL", + "name": "Tab Inactive", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kZ1bn", + "name": "tab2Txt", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "RwyYI", + "name": "tab2Close", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "sbpmq", + "name": "tabSpacer", + "width": "fill_container", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + } + }, + { + "type": "frame", + "id": "WF97k", + "name": "tabControls", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1, + "left": 1 + }, + "fill": "$--border" + }, + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_around", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "rfSoS", + "name": "iconPlus", + "width": 16, + "height": 16, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "t0u6z", + "name": "iconSplit", + "width": 16, + "height": 16, + "iconFontName": "columns", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "kbe1P", + "name": "iconExpand", + "width": 16, + "height": 16, + "iconFontName": "arrows-out-simple", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "rTdKS", + "name": "Editor Body", + "width": "fill_container", + "height": "fill_container", + "children": [ + { + "type": "frame", + "id": "NfyTF", + "name": "Editor Left", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "hvoFh", + "name": "Info Bar", + "width": "fill_container", + "height": 45, + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "bTP0I", + "name": "infoLeft", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Msj7v", + "name": "breadcrumbType", + "fill": "$--muted-foreground", + "content": "Project", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "wqdMG", + "name": "breadcrumbSep", + "fill": "$--muted-foreground", + "content": "›", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "FzENd", + "name": "breadcrumbName", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "pvTmc", + "name": "dotSep", + "fill": "$--muted-foreground", + "content": "·", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "9ga1R", + "name": "modifiedTxt", + "fill": "$--accent-yellow", + "content": "M", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "3bzDp", + "name": "infoRight", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "9Ctb0", + "name": "iconSearch", + "width": 16, + "height": 16, + "iconFontName": "magnifying-glass", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "csHzz", + "name": "iconSearch", + "width": 16, + "height": 16, + "iconFontName": "git-branch", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "2s6Of", + "name": "iconSearch", + "width": 16, + "height": 16, + "iconFontName": "cursor-text", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "JVSlj", + "name": "iconAI", + "width": 16, + "height": 16, + "iconFontName": "sparkle", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "k3AiV", + "name": "iconMore", + "width": 16, + "height": 16, + "iconFontName": "dots-three", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "vvETz", + "name": "Editor Content", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 16, + "padding": [ + 32, + 64 + ], + "children": [ + { + "type": "text", + "id": "b6up3", + "name": "editorP1", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Personal knowledge and life management desktop app, built with Tauri v2 + React + TypeScript + CodeMirror 6. It reads a vault of markdown files with YAML frontmatter and presents them in a four-panel UI inspired by Bear Notes.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "a2S43", + "name": "editorH2", + "fill": "$--foreground", + "content": "Architecture", + "lineHeight": 1.3, + "fontFamily": "Inter", + "fontSize": 24, + "fontWeight": "600" + }, + { + "type": "text", + "id": "wgvQa", + "name": "editorP2", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "The app uses a four-panel layout: Sidebar for navigation, NoteList for browsing, Editor for content, and Inspector for metadata. All data lives in markdown files with YAML frontmatter, git-versioned.", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "GGP97", + "name": "Inspector", + "clip": true, + "width": 260, + "height": "fill_container", + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "left": 1 + }, + "fill": "$--border" + }, + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "FbHy7", + "name": "Inspector Header", + "width": "fill_container", + "height": 45, + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "gap": 8, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "sA7Dx", + "name": "leftGroup", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "0ccF1", + "name": "propIcon", + "width": 16, + "height": 16, + "iconFontName": "sliders-horizontal", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "T2vTZ", + "name": "inspTitle", + "fill": "$--muted-foreground", + "content": "Properties", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + } + ] + }, + { + "type": "icon_font", + "id": "NQOhZ", + "name": "sidebarIcon", + "width": 16, + "height": 16, + "iconFontName": "x", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "LYFki", + "name": "Inspector Body", + "clip": true, + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 16, + "padding": 12, + "children": [ + { + "type": "frame", + "id": "8g61y", + "name": "Properties Section", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "frame", + "id": "VhH4P", + "name": "addPropBtn", + "width": "fill_container", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "padding": [ + 6, + 12 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Q9z8F", + "name": "addPropTxt", + "fill": "$--muted-foreground", + "content": "+ Add property", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "6PwTH", + "name": "propType", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "Vt2BC", + "name": "propTypeLbl", + "fill": "$--muted-foreground", + "content": "TYPE", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "uvBiY", + "name": "propTypeVal", + "fill": "$--foreground", + "content": "Project", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "FDbay", + "name": "propStatus", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "e426F", + "name": "propStatusLbl", + "fill": "$--muted-foreground", + "content": "STATUS", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "o2rZM", + "name": "propStatusBadge", + "fill": "$--accent-green-light", + "cornerRadius": 16, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "transparent" + }, + "gap": 8, + "padding": [ + 1, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "QM7L3", + "name": "Badge Text", + "fill": "$--accent-green", + "content": "ACTIVE", + "lineHeight": 1.33, + "textAlign": "center", + "textAlignVertical": "middle", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "600", + "letterSpacing": 1.2 + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "NmRLv", + "name": "Relationships Section", + "width": "fill_container", + "layout": "vertical", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "WFVAr", + "name": "relGroup1", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "0N729", + "name": "relGrp1Title", + "fill": "$--muted-foreground", + "content": "BELONGS TO", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + }, + { + "type": "frame", + "id": "zLl8F", + "name": "relLaputaBtn", + "width": "fill_container", + "fill": "$--accent-green-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kw9vC", + "name": "laputaTxt", + "fill": "$--accent-green", + "content": "Laputa", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "RFvoz", + "name": "topicIcon", + "opacity": 0.5, + "width": 14, + "height": 14, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + }, + { + "type": "frame", + "id": "ybi8Q", + "name": "relLaputaBtn", + "width": "fill_container", + "fill": "$--accent-green-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "VNcmt", + "name": "laputaTxt", + "fill": "$--accent-green", + "content": "Building", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "UVPwc", + "name": "topicIcon", + "opacity": 0.5, + "width": 14, + "height": 14, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "fill": "$--accent-green" + } + ] + }, + { + "type": "frame", + "id": "L6knW", + "name": "linkExisting", + "width": "fill_container", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "jwU3Z", + "name": "laputaTxt", + "fill": "$--muted-foreground", + "content": "+ Link existing", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "laPFL", + "name": "relGroup2", + "width": "fill_container", + "layout": "vertical", + "gap": 4, + "children": [ + { + "type": "text", + "id": "LOXUL", + "name": "relGrp2Title", + "fill": "$--muted-foreground", + "content": "RELATED TO", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + }, + { + "type": "frame", + "id": "qLTYD", + "name": "relMigrationBtn", + "width": "fill_container", + "fill": "$--accent-red-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "GBk2u", + "name": "migrationTxt", + "fill": "$--accent-red", + "content": "Shadcn Migration", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "Sy14T", + "name": "expIcon", + "opacity": 0.5, + "width": 14, + "height": 14, + "iconFontName": "flask", + "iconFontFamily": "phosphor", + "fill": "$--accent-red" + } + ] + }, + { + "type": "frame", + "id": "u8ijV", + "name": "linkExisting", + "width": "fill_container", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "padding": [ + 6, + 10 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "PUXx5", + "name": "laputaTxt", + "fill": "$--muted-foreground", + "content": "+ Link existing", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "6PUnO", + "name": "Backlinks Section", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "frame", + "id": "PllIu", + "name": "blTitle", + "gap": 4, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "ZbgbI", + "name": "blTitleTxt", + "rotation": -0.5285936385085725, + "fill": "$--muted-foreground", + "content": "BACKLINKS", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + } + ] + }, + { + "type": "text", + "id": "eRoDO", + "name": "blItem1", + "fill": "$--primary", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "u1olR", + "name": "blItem2", + "fill": "$--primary", + "content": "Meeting with Grant", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "oUd9s", + "name": "blItem3", + "fill": "$--primary", + "content": "Q1 Planning", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "yf0wj", + "name": "History Section", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "text", + "id": "dG7rj", + "name": "histTitle", + "fill": "$--muted-foreground", + "content": "HISTORY", + "fontFamily": "IBM Plex Mono", + "fontSize": 10 + }, + { + "type": "frame", + "id": "z2Mdy", + "name": "histItem1", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "left": 2 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 0, + 0, + 0, + 10 + ], + "children": [ + { + "type": "text", + "id": "AsiWz", + "name": "histItem1Hash", + "fill": "$--accent-blue", + "content": "a089f44 · feat: migrate to shadcn/ui", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "BdVhi", + "name": "histItem1Date", + "fill": "$--muted-foreground", + "content": "Feb 16, 2026", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "piJNC", + "name": "histItem2", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "left": 2 + }, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 0, + 0, + 0, + 10 + ], + "children": [ + { + "type": "text", + "id": "0PWoX", + "name": "histItem2Hash", + "fill": "$--accent-blue", + "content": "5a4b4ac · feat: emoji favicon", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "xySNW", + "name": "histItem2Date", + "fill": "$--muted-foreground", + "content": "Feb 15, 2026", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "normal" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "x1AHT", + "name": "lightStatusBar", + "width": "fill_container", + "height": 30, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "top": 1 + }, + "fill": "$--border" + }, + "padding": [ + 0, + 8 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "e2UzJ", + "name": "Status Left", + "height": "fill_container", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "mlD58", + "name": "versionIcon", + "width": 14, + "height": 14, + "iconFontName": "box", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "hRBRa", + "name": "versionText", + "fill": "$--muted-foreground", + "content": "v0.4.2", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "text", + "id": "bFwrw", + "name": "sep1", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "ey3Gr", + "name": "branchIcon", + "width": 14, + "height": 14, + "iconFontName": "git-branch", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "Kz0sS", + "name": "branchText", + "fill": "$--muted-foreground", + "content": "main", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "6IY1E", + "name": "sep2", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "IjEG1", + "name": "syncIcon", + "width": 13, + "height": 13, + "iconFontName": "refresh-cw", + "iconFontFamily": "lucide", + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "srxkr", + "name": "syncText", + "fill": "$--muted-foreground", + "content": "Synced 2m ago", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "4jgQF", + "name": "Status Right", + "height": "fill_container", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "3RPmA", + "name": "aiIcon", + "width": 13, + "height": 13, + "iconFontName": "sparkles", + "iconFontFamily": "lucide", + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "t0NOA", + "name": "aiText", + "fill": "$--muted-foreground", + "content": "Claude Sonnet 4", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "16V7i", + "name": "sep3", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "PXVrd", + "name": "notesCount", + "width": 13, + "height": 13, + "iconFontName": "file-text", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "2FxCi", + "name": "notesText", + "fill": "$--muted-foreground", + "content": "1,247 notes", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "pB6ds", + "name": "sep4", + "fill": "$--border", + "content": "|", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "fRHKs", + "name": "bellIcon", + "width": 13, + "height": 13, + "iconFontName": "bell", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "icon_font", + "id": "2sEBS", + "name": "settingsIcon", + "width": 13, + "height": 13, + "iconFontName": "settings", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "mOf4J", + "x": 0, + "y": 4457, + "name": "Color Palette — shadcn/ui Theme (Light)", + "theme": { + "Mode": "Light" + }, + "width": 1440, + "fill": "$--background", + "layout": "vertical", + "gap": 32, + "padding": 40, + "children": [ + { + "type": "text", + "id": "rmJdn", + "name": "cTitle", + "fill": "$--foreground", + "content": "Color Palette — shadcn/ui Theme Variables (Light)", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "text", + "id": "V79Zu", + "name": "cSub", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "All colors from src/index.css. Variables support light/dark mode via .dark class.", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "Xbdzq", + "name": "primLbl", + "fill": "$--foreground", + "content": "Primary Colors", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "NyoC7", + "name": "primRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "Inb1x", + "name": "sw1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "HRsVC", + "name": "sw1b", + "fill": "$--background", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "jV89s", + "name": "sw1n", + "fill": "$--foreground", + "content": "--background", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "qOUUY", + "name": "sw1v", + "fill": "$--muted-foreground", + "content": "L: #FFFFFF / D: #0f0f1a", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "QytAQ", + "name": "sw2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "TMuHH", + "name": "sw2b", + "fill": "$--foreground", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "k9qK4", + "name": "sw2n", + "fill": "$--foreground", + "content": "--foreground", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "BfEn7", + "name": "sw2v", + "fill": "$--muted-foreground", + "content": "L: #37352F / D: #e0e0e0", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "gJZtB", + "name": "sw3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "RRsQg", + "name": "sw3b", + "fill": "$--primary", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "CtJe4", + "name": "sw3n", + "fill": "$--foreground", + "content": "--primary", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "1iFr6", + "name": "sw3v", + "fill": "$--muted-foreground", + "content": "#155DFF", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "mbvua", + "name": "sw4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "fajNZ", + "name": "sw4b", + "fill": "$--primary-foreground", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "wVJ7z", + "name": "sw4n", + "fill": "$--foreground", + "content": "--primary-foreground", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "Oum5Q", + "name": "sw4v", + "fill": "$--muted-foreground", + "content": "L: #FFFFFF / D: #ffffff", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "text", + "id": "UvI4d", + "name": "accLbl", + "fill": "$--foreground", + "content": "Accent & Semantic Colors", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "jOmo7", + "name": "accRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "uFXJ3", + "name": "a1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "NRr0w", + "name": "a1b", + "fill": "$--accent-blue", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "ECVqk", + "name": "a1n", + "fill": "$--foreground", + "content": "--accent-blue", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "csKEt", + "name": "a2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "5IiT2", + "name": "a2b", + "fill": "$--accent-green", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "aCPba", + "name": "a2n", + "fill": "$--foreground", + "content": "--accent-green", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "XbY7C", + "name": "a3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "I9qCz", + "name": "a3b", + "fill": "$--accent-yellow", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "DfZVh", + "name": "a3n", + "fill": "$--foreground", + "content": "--accent-yellow", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "nROw3", + "name": "a4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "IcIoP", + "name": "a4b", + "fill": "$--accent-red", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "eGgz6", + "name": "a4n", + "fill": "$--foreground", + "content": "--destructive", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "J95fv", + "name": "a5", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "o03fQ", + "name": "a5b", + "fill": "$--accent-purple", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "H9VWy", + "name": "a5n", + "fill": "$--foreground", + "content": "--accent-purple", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "text", + "id": "GcYle", + "name": "lightLightLbl", + "fill": "$--foreground", + "content": "Accent Light Backgrounds", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "Ju2xp", + "name": "accLightRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "5dnn5", + "name": "al1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "7kcqW", + "name": "ll1b", + "fill": "$--accent-blue-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "dBCbF", + "name": "ll1n", + "fill": "$--foreground", + "content": "--accent-blue-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "W0t0j", + "name": "al2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "1vepp", + "name": "ll2b", + "fill": "$--accent-green-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "6kUyf", + "name": "ll2n", + "fill": "$--foreground", + "content": "--accent-green-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "zyV1j", + "name": "al3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "yUDBN", + "name": "ll3b", + "fill": "$--accent-yellow-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "dmfZ4", + "name": "ll3n", + "fill": "$--foreground", + "content": "--accent-yellow-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "yGmmo", + "name": "al4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "eLu8o", + "name": "ll4b", + "fill": "$--accent-red-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "PVLwR", + "name": "ll4n", + "fill": "$--foreground", + "content": "--accent-red-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "0BO2b", + "name": "al5", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "6FBws", + "name": "ll5b", + "fill": "$--accent-purple-light", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "i2DfV", + "name": "ll5n", + "fill": "$--foreground", + "content": "--accent-purple-light", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "text", + "id": "JFocf", + "name": "surfLbl", + "fill": "$--foreground", + "content": "Surface & Border Colors", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "YAJLW", + "name": "surfRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "JHS3j", + "name": "s1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "9Bj41", + "name": "s1b", + "fill": "$--card", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "wn4ua", + "name": "s1n", + "fill": "$--foreground", + "content": "--card", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "Fyvfd", + "name": "s2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "UFLw5", + "name": "s2b", + "fill": "$--sidebar", + "width": "fill_container", + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--sidebar-border" + } + }, + { + "type": "text", + "id": "gngfL", + "name": "s2n", + "fill": "$--foreground", + "content": "--sidebar", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "zbyEJ", + "name": "s3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "WnmQD", + "name": "s3b", + "fill": "$--secondary", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "wnkxR", + "name": "s3n", + "fill": "$--foreground", + "content": "--secondary", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "Z2FuK", + "name": "s4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "lNPnc", + "name": "s4b", + "fill": "$--border", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "x9aeh", + "name": "s4n", + "fill": "$--foreground", + "content": "--border / --input", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "TDDQ0", + "name": "s5", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "MwHOe", + "name": "s5b", + "fill": "$--muted-foreground", + "width": "fill_container", + "height": 60 + }, + { + "type": "text", + "id": "dHZj5", + "name": "s5n", + "fill": "$--foreground", + "content": "--muted-foreground", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "HZonq", + "x": 0, + "y": 5252, + "name": "Typography & Spacing Specs (Light)", + "theme": { + "Mode": "Light" + }, + "width": 1440, + "fill": "$--background", + "layout": "vertical", + "gap": 32, + "padding": 40, + "children": [ + { + "type": "text", + "id": "nGLlU", + "name": "tTitle", + "fill": "$--foreground", + "content": "Typography Scale (Light)", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "text", + "id": "gkQqO", + "name": "tSub", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Fonts: Inter, IBM Plex Mono. Base: 14px. System fallback: -apple-system, BlinkMacSystemFont, sans-serif.", + "lineHeight": 1.5, + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "QL9fK", + "name": "t1", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "px1l7", + "name": "t1s", + "fill": "$--foreground", + "content": "Heading 1", + "lineHeight": 1.2, + "fontFamily": "Inter", + "fontSize": 32, + "fontWeight": "700" + }, + { + "type": "text", + "id": "3UWKu", + "name": "t1d", + "fill": "$--muted-foreground", + "content": "32px / Bold / lh 1.2 — Editor H1", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Yjhit", + "name": "t2", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "iFzl0", + "name": "t2s", + "fill": "$--foreground", + "content": "Heading 2", + "lineHeight": 1.3, + "fontFamily": "Inter", + "fontSize": 24, + "fontWeight": "600" + }, + { + "type": "text", + "id": "cF55I", + "name": "t2d", + "fill": "$--muted-foreground", + "content": "24px / Semibold / lh 1.3 — Editor H2", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "bBHMa", + "name": "t3", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "kpSyr", + "name": "t3s", + "fill": "$--foreground", + "content": "App Title", + "fontFamily": "Inter", + "fontSize": 17, + "fontWeight": "700", + "letterSpacing": -0.3 + }, + { + "type": "text", + "id": "xUuNz", + "name": "t3d", + "fill": "$--muted-foreground", + "content": "17px / Bold / ls -0.3 — Sidebar header", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "Lsh7F", + "name": "t4", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "vTRSs", + "name": "t4s", + "fill": "$--foreground", + "content": "Body Text", + "lineHeight": 1.6, + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "fKa3p", + "name": "t4d", + "fill": "$--muted-foreground", + "content": "16px / Regular / lh 1.6 — Editor paragraphs", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "rpOTz", + "name": "t5", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "VXY3Z", + "name": "t5s", + "fill": "$--foreground", + "content": "UI Label / Button", + "lineHeight": 1.43, + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "500" + }, + { + "type": "text", + "id": "F6GQz", + "name": "t5d", + "fill": "$--muted-foreground", + "content": "14px / Medium / lh 1.43 — Buttons, NoteList header, Inspector labels", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "H6Rgt", + "name": "t6", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "xWvbj", + "name": "t6s", + "fill": "$--foreground", + "content": "Sidebar Item", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "text", + "id": "bvBBm", + "name": "t6d", + "fill": "$--muted-foreground", + "content": "13px / Medium — Sidebar nav items, filter items, search", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "GrFAq", + "name": "t7", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "vY8j4", + "name": "t7s", + "fill": "$--muted-foreground", + "content": "SECTION HEADER", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "600", + "letterSpacing": 0.5 + }, + { + "type": "text", + "id": "okws6", + "name": "t7d", + "fill": "$--muted-foreground", + "content": "11px / Semibold / ls 0.5 — Sidebar sections, type pills", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "awxls", + "name": "t8", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "mD3f5", + "name": "t8s", + "fill": "$--foreground", + "content": "ALL-CAPS LABEL", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "600", + "letterSpacing": 1.2 + }, + { + "type": "text", + "id": "jFpLw", + "name": "t8d", + "fill": "$--muted-foreground", + "content": "11px / Semibold / ls 1.2 / IBM Plex Mono — Section labels, metadata tags", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "ToLzL", + "name": "t9", + "width": "fill_container", + "gap": 24, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "LEsxW", + "name": "t9s", + "fill": "$--muted-foreground", + "content": "OVERLINE TEXT", + "fontFamily": "IBM Plex Mono", + "fontSize": 10, + "fontWeight": "500", + "letterSpacing": 1.5 + }, + { + "type": "text", + "id": "HQ3Df", + "name": "t9d", + "fill": "$--muted-foreground", + "content": "10px / Medium / ls 1.5 / IBM Plex Mono — Overlines, category labels, timestamps", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "rectangle", + "id": "3tiJ7", + "name": "div1", + "fill": "$--border", + "width": "fill_container", + "height": 1 + }, + { + "type": "text", + "id": "b2Mt9", + "name": "spTitle", + "fill": "$--foreground", + "content": "Spacing & Layout Reference", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "frame", + "id": "o6ETJ", + "name": "pnlRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "HhbOn", + "name": "p1", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "YBekR", + "name": "p1t", + "fill": "$--foreground", + "content": "Sidebar: 250px", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "dT8Xe", + "name": "p1d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --sidebar | padding: 8px container, 12px 16px header, 6px 16px items", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "aYkMZ", + "name": "p2", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "Eycne", + "name": "p2t", + "fill": "$--foreground", + "content": "NoteList: 300px", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "lyTZN", + "name": "p2d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --card | padding: 14px 16px header, 8px 12px search/pills, 10px 16px items", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "E6G3g", + "name": "p3", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "Xy5Gl", + "name": "p3t", + "fill": "$--foreground", + "content": "Editor: flexible", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "y4svr", + "name": "p3d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --background | padding: 32px 64px content, 7px 14px tabs, gap: 16px", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "RBPav", + "name": "p4", + "width": "fill_container", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 6, + "padding": 16, + "children": [ + { + "type": "text", + "id": "xKUWC", + "name": "p4t", + "fill": "$--foreground", + "content": "Inspector: 280px", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "u81W5", + "name": "p4d", + "fill": "$--muted-foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "bg: --sidebar | padding: 14px 12px header, 12px body, 16px section gap, 8px prop gap", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "text", + "id": "VvZyF", + "name": "radLbl", + "fill": "$--foreground", + "content": "Border Radius", + "fontFamily": "Inter", + "fontSize": 18, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "OwJH7", + "name": "radRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "DHrzV", + "name": "r1", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 4, + "id": "V35oi", + "name": "r1b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "HVQpq", + "name": "r1n", + "fill": "$--foreground", + "content": "4px (sm) — chips", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "wp350", + "name": "r2", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 6, + "id": "E031z", + "name": "r2b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "rDLff", + "name": "r2n", + "fill": "$--foreground", + "content": "6px (md) — buttons, inputs", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "d6tJt", + "name": "r3", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 8, + "id": "PNkS4", + "name": "r3b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "rZGXb", + "name": "r3n", + "fill": "$--foreground", + "content": "8px (lg) — cards, dialogs", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "UAZ8u", + "name": "r4", + "width": "fill_container", + "layout": "vertical", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "cornerRadius": 16, + "id": "wgMVG", + "name": "r4b", + "fill": "$--secondary", + "width": 80, + "height": 60, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + } + }, + { + "type": "text", + "id": "zw3RY", + "name": "r4n", + "fill": "$--foreground", + "content": "16px — badges", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "rectangle", + "id": "kIrXE", + "name": "div2", + "fill": "$--border", + "width": "fill_container", + "height": 1 + }, + { + "type": "text", + "id": "FYw8k", + "name": "compTitle", + "fill": "$--foreground", + "content": "shadcn/ui Component Inventory", + "fontFamily": "Inter", + "fontSize": 28, + "fontWeight": "700", + "letterSpacing": -0.5 + }, + { + "type": "frame", + "id": "7Q1Fi", + "name": "compRow", + "width": "fill_container", + "gap": 16, + "children": [ + { + "type": "frame", + "id": "XfUwj", + "name": "cg1", + "width": "fill_container", + "fill": "$--card", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 12, + "padding": 16, + "children": [ + { + "type": "text", + "id": "ly7m0", + "name": "cg1t", + "fill": "$--accent-green", + "content": "In Use", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "Re89a", + "name": "cg1r1", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Button — 5 variants (Default, Secondary, Outline, Ghost, Destructive)", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "ILbjW", + "name": "cg1r2", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Input — Default text input with label group", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "eurqS", + "name": "cg1r3", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Dialog — Modal overlay (CreateNote, Commit)", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "AZyZP", + "name": "cg1r4", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Badge — 4 variants (Default, Secondary, Outline, Destructive)", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "WtehQ", + "name": "cg2", + "width": "fill_container", + "fill": "$--card", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$--border" + }, + "layout": "vertical", + "gap": 12, + "padding": 16, + "children": [ + { + "type": "text", + "id": "KaMZ9", + "name": "cg2t", + "fill": "$--accent-yellow", + "content": "Available (Not Yet Used)", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + }, + { + "type": "text", + "id": "F8wam", + "name": "cg2r1", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "DropdownMenu — Context / dropdown menus", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "Nl1aV", + "name": "cg2r2", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Tabs — Tab navigation component", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "0sBwH", + "name": "cg2r3", + "fill": "$--foreground", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "Tooltip, Select, Card, Separator, ScrollArea", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "trSB1", + "x": 1600, + "y": 3385, + "name": "Trash — Sidebar Filter", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 260, + "height": 400, + "fill": "$--sidebar", + "layout": "vertical", + "gap": 0, + "padding": [ + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "trFAll", + "name": "filterAll", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trIAll", + "name": "iconAll", + "width": 16, + "height": 16, + "iconFontName": "file-text", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "trTAll", + "name": "txtAll", + "fill": "$--foreground", + "content": "All Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "trFFav", + "name": "filterFav", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trIFav", + "name": "iconFav", + "width": 16, + "height": 16, + "iconFontName": "star", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "trTFav", + "name": "txtFav", + "fill": "$--foreground", + "content": "Favorites", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "trFArc", + "name": "filterArchive", + "width": "fill_container", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trIArc", + "name": "iconArchive", + "width": 16, + "height": 16, + "iconFontName": "archive", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--foreground" + }, + { + "type": "text", + "id": "trTArc", + "name": "txtArchive", + "fill": "$--foreground", + "content": "Archive", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trBArc", + "name": "badgeArc", + "height": 20, + "fill": "$--muted", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trBTArc", + "fill": "$--muted-foreground", + "content": "2", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trFTr", + "name": "filterTrash", + "width": "fill_container", + "fill": "#ef444418", + "cornerRadius": 6, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trITr", + "name": "iconTrash", + "width": 16, + "height": 16, + "iconFontName": "trash", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--destructive" + }, + { + "type": "text", + "id": "trTTr", + "name": "txtTrash", + "fill": "$--destructive", + "content": "Trash", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "600" + }, + { + "type": "frame", + "id": "trBTr", + "name": "badgeTrash", + "height": 20, + "fill": "$--destructive", + "cornerRadius": 9999, + "padding": [ + 0, + 6 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trBTTr", + "fill": "#ffffff", + "content": "3", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "trNL1", + "x": 1600, + "y": 3815, + "name": "Trash — Note List View", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 340, + "height": 360, + "fill": "$--card", + "layout": "vertical", + "gap": 0, + "children": [ + { + "type": "frame", + "id": "trNLH", + "name": "header", + "width": "fill_container", + "height": 45, + "padding": [ + 0, + 16 + ], + "alignItems": "center", + "justifyContent": "space_between", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "children": [ + { + "type": "text", + "id": "trNLT", + "fill": "$--foreground", + "content": "Trash", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600" + } + ] + }, + { + "type": "frame", + "id": "trN1", + "name": "trashedNote1", + "width": "fill_container", + "layout": "vertical", + "gap": 2, + "padding": [ + 14, + 16 + ], + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "children": [ + { + "type": "frame", + "id": "trN1H", + "name": "titleRow", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN1T", + "fill": "$--foreground", + "content": "Old Draft Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trN1B", + "name": "trashedBadge", + "height": 16, + "fill": "#ef444418", + "cornerRadius": 4, + "padding": [ + 1, + 4 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN1BT", + "fill": "$--destructive", + "content": "TRASHED", + "fontFamily": "Inter", + "fontSize": 9, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "text", + "id": "trN1S", + "fill": "$--muted-foreground", + "content": "Some draft content that is no longer needed...", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400" + }, + { + "type": "text", + "id": "trN1D", + "fill": "$--muted-foreground", + "content": "5d ago", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "400" + } + ] + }, + { + "type": "frame", + "id": "trN2", + "name": "trashedNote2Warning", + "width": "fill_container", + "layout": "vertical", + "gap": 2, + "padding": [ + 14, + 16 + ], + "fill": "#ef44440a", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + }, + "children": [ + { + "type": "frame", + "id": "trN2H", + "name": "titleRow", + "gap": 6, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN2T", + "fill": "$--foreground", + "content": "Deprecated API Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trN2B", + "name": "warningBadge", + "height": 16, + "fill": "$--destructive", + "cornerRadius": 4, + "padding": [ + 1, + 4 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trN2BT", + "fill": "#ffffff", + "content": "30+ DAYS", + "fontFamily": "Inter", + "fontSize": 9, + "fontWeight": "600" + } + ] + } + ] + }, + { + "type": "text", + "id": "trN2S", + "fill": "$--muted-foreground", + "content": "Old API documentation that was replaced...", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400" + }, + { + "type": "text", + "id": "trN2D", + "fill": "$--destructive", + "content": "Trashed 35d ago — will be permanently deleted", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trRI1", + "x": 1970, + "y": 3385, + "name": "Trash — Relationship Indicator", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 300, + "height": 200, + "fill": "$--background", + "layout": "vertical", + "gap": 8, + "padding": [ + 16, + 16 + ], + "children": [ + { + "type": "text", + "id": "trRIL", + "fill": "$--muted-foreground", + "content": "BELONGS TO", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600", + "letterSpacing": 0.5 + }, + { + "type": "frame", + "id": "trRN", + "name": "normalRef", + "width": "fill_container", + "fill": "$--accent-blue-light", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "gap": 6, + "alignItems": "center", + "justifyContent": "space_between", + "children": [ + { + "type": "text", + "id": "trRNT", + "fill": "$--accent-blue", + "content": "Build Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "trRNI", + "width": 14, + "height": 14, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-blue" + } + ] + }, + { + "type": "frame", + "id": "trRT", + "name": "trashedRef", + "width": "fill_container", + "fill": "$--muted", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "gap": 6, + "alignItems": "center", + "justifyContent": "space_between", + "opacity": 0.7, + "children": [ + { + "type": "frame", + "id": "trRTL", + "gap": 4, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "trRTTI", + "width": 12, + "height": 12, + "iconFontName": "trash", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "trRTT", + "fill": "$--muted-foreground", + "content": "Old Draft Notes", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "trRTTX", + "fill": "$--muted-foreground", + "content": "(trashed)", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "400" + } + ] + }, + { + "type": "icon_font", + "id": "trRTI", + "width": 14, + "height": 14, + "iconFontName": "file-text", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "trRA", + "name": "archivedRef", + "width": "fill_container", + "fill": "$--muted", + "cornerRadius": 6, + "padding": [ + 6, + 10 + ], + "gap": 6, + "alignItems": "center", + "justifyContent": "space_between", + "opacity": 0.7, + "children": [ + { + "type": "frame", + "id": "trRAL", + "gap": 4, + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "trRAT", + "fill": "$--muted-foreground", + "content": "Website Redesign", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "text", + "id": "trRATX", + "fill": "$--muted-foreground", + "content": "(archived)", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "400" + } + ] + }, + { + "type": "icon_font", + "id": "trRAI", + "width": 14, + "height": 14, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "trW30", + "x": 1970, + "y": 3615, + "name": "Trash — 30-Day Auto-Delete Warning", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 340, + "height": 120, + "fill": "$--background", + "layout": "vertical", + "gap": 8, + "padding": [ + 16, + 16 + ], + "children": [ + { + "type": "text", + "id": "trW3L", + "fill": "$--muted-foreground", + "content": "Warning banner shown at top of trash view:", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "500" + }, + { + "type": "frame", + "id": "trW3B", + "name": "warningBanner", + "width": "fill_container", + "fill": "#ef44440f", + "cornerRadius": 8, + "padding": [ + 10, + 12 + ], + "gap": 8, + "alignItems": "center", + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#ef444430" + }, + "children": [ + { + "type": "icon_font", + "id": "trW3I", + "width": 16, + "height": 16, + "iconFontName": "warning", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--destructive" + }, + { + "type": "frame", + "id": "trW3T", + "layout": "vertical", + "gap": 2, + "children": [ + { + "type": "text", + "id": "trW3T1", + "fill": "$--destructive", + "content": "Notes in trash for 30+ days will be permanently deleted", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "text", + "id": "trW3T2", + "fill": "$--muted-foreground", + "content": "1 note is past the 30-day retention period", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "400" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "dt0", + "name": "Draggable Tabs — Default State", + "width": 800, + "height": 120, + "layout": "vertical", + "fill": "$--sidebar", + "theme": { + "Mode": "Light" + }, + "children": [ + { + "type": "text", + "id": "dt1", + "name": "frameLabel", + "content": "Default: tabs are draggable (grab cursor on hover)", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal", + "fill": "$--muted-foreground", + "padding": [ + 8, + 12 + ] + }, + { + "type": "frame", + "id": "dt2", + "name": "Tab Bar Default", + "width": "fill_container", + "height": 45, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dt3", + "name": "Tab Active", + "height": "fill_container", + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "right": 1 + }, + "fill": "$--border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dt4", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "dt5", + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dt6", + "name": "Tab Inactive", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dt7", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "dt8", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dt9", + "name": "Tab Inactive 2", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dta", + "fill": "$--muted-foreground", + "content": "Weekly Review", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "dtb", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dtc", + "name": "Tab Inactive 3", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dtd", + "fill": "$--muted-foreground", + "content": "Workout Log", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "dte", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dtf", + "name": "tabSpacer", + "width": "fill_container", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + } + }, + { + "type": "frame", + "id": "dtg", + "name": "tabControls", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1, + "left": 1 + }, + "fill": "$--border" + }, + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_around", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dth", + "width": 16, + "height": 16, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "text", + "id": "dti", + "name": "cursorNote", + "content": "cursor: grab → grabbing during drag", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "normal", + "fill": "$--muted-foreground", + "padding": [ + 4, + 12 + ] + } + ] + }, + { + "type": "frame", + "id": "dtj", + "name": "Draggable Tabs — Dragging (Tab Being Moved)", + "width": 800, + "height": 120, + "layout": "vertical", + "fill": "$--sidebar", + "theme": { + "Mode": "Light" + }, + "children": [ + { + "type": "text", + "id": "dtk", + "name": "frameLabel2", + "content": "Dragging: \"Portfolio Rewrite\" is being dragged left (opacity 0.5, blue drop indicator)", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal", + "fill": "$--muted-foreground", + "padding": [ + 8, + 12 + ] + }, + { + "type": "frame", + "id": "dtl", + "name": "Tab Bar Dragging", + "width": "fill_container", + "height": 45, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "alignItems": "center", + "children": [ + { + "type": "rectangle", + "id": "dtm", + "name": "Drop Indicator", + "width": 2, + "height": 30, + "fill": "$--primary", + "cornerRadius": 1 + }, + { + "type": "frame", + "id": "dtn", + "name": "Tab Active", + "height": "fill_container", + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "right": 1 + }, + "fill": "$--border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dto", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "dtp", + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dtq", + "name": "Tab Dragging (ghost)", + "height": "fill_container", + "opacity": 0.5, + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dtr", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "dts", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dtt", + "name": "Tab Inactive 2", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dtu", + "fill": "$--muted-foreground", + "content": "Weekly Review", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "dtv", + "name": "Tab Inactive 3", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dtw", + "fill": "$--muted-foreground", + "content": "Workout Log", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "frame", + "id": "dtx", + "name": "tabSpacer", + "width": "fill_container", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + } + }, + { + "type": "frame", + "id": "dty", + "name": "tabControls", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1, + "left": 1 + }, + "fill": "$--border" + }, + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_around", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dtz", + "width": 16, + "height": 16, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "text", + "id": "dt10", + "name": "dragNote", + "content": "Drop indicator: 2px $--primary bar shows insertion point. Dragged tab has opacity: 0.5.", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "normal", + "fill": "$--muted-foreground", + "padding": [ + 4, + 12 + ] + } + ] + }, + { + "type": "frame", + "id": "dt11", + "name": "Draggable Tabs — After Drop (Reordered)", + "width": 800, + "height": 120, + "layout": "vertical", + "fill": "$--sidebar", + "theme": { + "Mode": "Light" + }, + "children": [ + { + "type": "text", + "id": "dt12", + "name": "frameLabel3", + "content": "After drop: \"Portfolio Rewrite\" moved before \"Laputa App\". Order persisted to localStorage.", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal", + "fill": "$--muted-foreground", + "padding": [ + 8, + 12 + ] + }, + { + "type": "frame", + "id": "dt13", + "name": "Tab Bar Reordered", + "width": "fill_container", + "height": 45, + "fill": "$--sidebar", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dt14", + "name": "Tab Inactive (moved)", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dt15", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "dt16", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dt17", + "name": "Tab Active", + "height": "fill_container", + "fill": "$--background", + "stroke": { + "align": "inside", + "thickness": { + "right": 1 + }, + "fill": "$--border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dt18", + "fill": "$--foreground", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "500" + }, + { + "type": "icon_font", + "id": "dt19", + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dt1a", + "name": "Tab Inactive 2", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dt1b", + "fill": "$--muted-foreground", + "content": "Weekly Review", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "dt1c", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dt1d", + "name": "Tab Inactive 3", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "right": 1, + "bottom": 1 + }, + "fill": "$--sidebar-border" + }, + "gap": 6, + "padding": [ + 0, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dt1e", + "fill": "$--muted-foreground", + "content": "Workout Log", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "icon_font", + "id": "dt1f", + "opacity": 0, + "width": 14, + "height": 14, + "iconFontName": "x", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dt1g", + "name": "tabSpacer", + "width": "fill_container", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": "$--border" + } + }, + { + "type": "frame", + "id": "dt1h", + "name": "tabControls", + "height": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1, + "left": 1 + }, + "fill": "$--border" + }, + "gap": 12, + "padding": [ + 0, + 12 + ], + "justifyContent": "space_around", + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dt1i", + "width": 16, + "height": 16, + "iconFontName": "plus", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "text", + "id": "dt1j", + "name": "persistNote", + "content": "localStorage key: \"laputa-tab-order\" stores path array. Restored on next session.", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "normal", + "fill": "$--muted-foreground", + "padding": [ + 4, + 12 + ] + } + ] + }, + { + "type": "frame", + "id": "dsg01a", + "name": "Sidebar — Drag Handles Visible", + "x": 68, + "y": 6400, + "width": 330, + "height": 680, + "fill": "$--background", + "layout": "vertical", + "padding": [ + 16 + ], + "theme": { + "Mode": "Light" + }, + "children": [ + { + "type": "text", + "id": "dsg01b", + "name": "frame1Title", + "content": "Drag handles appear on section headers", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600", + "fill": "$--foreground" + }, + { + "type": "text", + "id": "dsg01c", + "name": "frame1Desc", + "content": "Grip icon shown left of section icon. Cursor changes to grab on hover.", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal", + "fill": "$--muted-foreground" + }, + { + "type": "frame", + "id": "dsg01d", + "height": 12 + }, + { + "type": "frame", + "id": "dsg01e", + "name": "sidebarDefault", + "width": 250, + "height": 600, + "fill": "$--sidebar", + "layout": "vertical", + "clip": true, + "children": [ + { + "type": "frame", + "id": "dsg01f", + "name": "filters", + "width": "fill_container", + "layout": "vertical", + "gap": 2, + "padding": [ + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg01g", + "name": "allNotesRow", + "width": "fill_container", + "cornerRadius": 4, + "padding": [ + 6, + 16 + ], + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg01h", + "width": 18, + "height": 18, + "iconFontName": "file-text", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "dsg01i", + "fill": "$--foreground", + "content": "All Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "dsg01j", + "name": "favRow", + "width": "fill_container", + "cornerRadius": 4, + "padding": [ + 6, + 16 + ], + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg01k", + "width": 18, + "height": 18, + "iconFontName": "star", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "dsg01l", + "fill": "$--muted-foreground", + "content": "Favorites", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg01m", + "name": "sectionsWrap", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "dsg00a", + "name": "projGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6, + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg005", + "name": "projHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg001", + "name": "projLeft", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg000", + "name": "projDrag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg002", + "name": "projIcon", + "width": 18, + "height": 18, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-red" + }, + { + "type": "text", + "id": "dsg003", + "name": "projLabel", + "fill": "$--foreground", + "content": "Projects", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg004", + "name": "projChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dsg006", + "name": "projItem0", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "fill": "$--accent-red-light", + "children": [ + { + "type": "text", + "id": "dsg007", + "name": "projItemTxt0", + "fill": "$--accent-red", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "dsg008", + "name": "projItem1", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dsg009", + "name": "projItemTxt1", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg00h", + "name": "respGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg00g", + "name": "respHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg00c", + "name": "respLeft", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg00b", + "name": "respDrag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg00d", + "name": "respIcon", + "width": 18, + "height": 18, + "iconFontName": "medal", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "dsg00e", + "name": "respLabel", + "fill": "$--foreground", + "content": "Responsibilities", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg00f", + "name": "respChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg00o", + "name": "procGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg00n", + "name": "procHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg00j", + "name": "procLeft", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg00i", + "name": "procDrag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg00k", + "name": "procIcon", + "width": 18, + "height": 18, + "iconFontName": "arrows-clockwise", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "dsg00l", + "name": "procLabel", + "fill": "$--foreground", + "content": "Procedures", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg00m", + "name": "procChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg00v", + "name": "peopleGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg00u", + "name": "peopleHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg00q", + "name": "peopleLeft", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg00p", + "name": "peopleDrag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg00r", + "name": "peopleIcon", + "width": 18, + "height": 18, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "dsg00s", + "name": "peopleLabel", + "fill": "$--foreground", + "content": "People", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg00t", + "name": "peopleChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg012", + "name": "eventsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg011", + "name": "eventsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg00x", + "name": "eventsLeft", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg00w", + "name": "eventsDrag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg00y", + "name": "eventsIcon", + "width": 18, + "height": 18, + "iconFontName": "cardholder", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "dsg00z", + "name": "eventsLabel", + "fill": "$--foreground", + "content": "Events", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg010", + "name": "eventsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg019", + "name": "topicsGroup", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg018", + "name": "topicsHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg014", + "name": "topicsLeft", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg013", + "name": "topicsDrag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg015", + "name": "topicsIcon", + "width": 18, + "height": 18, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "dsg016", + "name": "topicsLabel", + "fill": "$--foreground", + "content": "Topics", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg017", + "name": "topicsChev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg02w", + "name": "Sidebar — Section Being Dragged", + "x": 420, + "y": 6400, + "width": 330, + "height": 680, + "fill": "$--background", + "layout": "vertical", + "padding": [ + 16 + ], + "theme": { + "Mode": "Light" + }, + "children": [ + { + "type": "text", + "id": "dsg02x", + "name": "frame2Title", + "content": "Dragging \"People\" above \"Responsibilities\"", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600", + "fill": "$--foreground" + }, + { + "type": "text", + "id": "dsg02y", + "name": "frame2Desc", + "content": "Blue drop indicator line shows insertion point. Dragged section floats with blue border.", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal", + "fill": "$--muted-foreground" + }, + { + "type": "frame", + "id": "dsg02z", + "height": 12 + }, + { + "type": "frame", + "id": "dsg030", + "name": "sidebarDragging", + "width": 250, + "height": 600, + "fill": "$--sidebar", + "layout": "vertical", + "clip": true, + "children": [ + { + "type": "frame", + "id": "dsg031", + "name": "filters", + "width": "fill_container", + "layout": "vertical", + "gap": 2, + "padding": [ + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg032", + "name": "allNotesRow", + "width": "fill_container", + "cornerRadius": 4, + "padding": [ + 6, + 16 + ], + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg033", + "width": 18, + "height": 18, + "iconFontName": "file-text", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "dsg034", + "fill": "$--foreground", + "content": "All Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "dsg035", + "name": "favRow", + "width": "fill_container", + "cornerRadius": 4, + "padding": [ + 6, + 16 + ], + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg036", + "width": 18, + "height": 18, + "iconFontName": "star", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "dsg037", + "fill": "$--muted-foreground", + "content": "Favorites", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg038", + "name": "sectionsWrap", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "dsg01x", + "name": "proj2Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6, + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg01s", + "name": "proj2Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg01o", + "name": "proj2Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg01n", + "name": "proj2Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg01p", + "name": "proj2Icon", + "width": 18, + "height": 18, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-red" + }, + { + "type": "text", + "id": "dsg01q", + "name": "proj2Label", + "fill": "$--foreground", + "content": "Projects", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg01r", + "name": "proj2Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dsg01t", + "name": "proj2Item0", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "fill": "$--accent-red-light", + "children": [ + { + "type": "text", + "id": "dsg01u", + "name": "proj2ItemTxt0", + "fill": "$--accent-red", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "dsg01v", + "name": "proj2Item1", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dsg01w", + "name": "proj2ItemTxt1", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg01y", + "name": "dropIndicator", + "width": "fill_container", + "height": 2, + "fill": "$--accent-blue", + "cornerRadius": 1 + }, + { + "type": "frame", + "id": "dsg025", + "name": "resp2Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg024", + "name": "resp2Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg020", + "name": "resp2Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg01z", + "name": "resp2Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg021", + "name": "resp2Icon", + "width": 18, + "height": 18, + "iconFontName": "medal", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "dsg022", + "name": "resp2Label", + "fill": "$--foreground", + "content": "Responsibilities", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg023", + "name": "resp2Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg02c", + "name": "proc2Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg02b", + "name": "proc2Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg027", + "name": "proc2Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg026", + "name": "proc2Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg028", + "name": "proc2Icon", + "width": 18, + "height": 18, + "iconFontName": "arrows-clockwise", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "dsg029", + "name": "proc2Label", + "fill": "$--foreground", + "content": "Procedures", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg02a", + "name": "proc2Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg02j", + "name": "events2Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg02i", + "name": "events2Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg02e", + "name": "events2Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg02d", + "name": "events2Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg02f", + "name": "events2Icon", + "width": 18, + "height": 18, + "iconFontName": "cardholder", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "dsg02g", + "name": "events2Label", + "fill": "$--foreground", + "content": "Events", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg02h", + "name": "events2Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg02q", + "name": "topics2Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg02p", + "name": "topics2Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg02l", + "name": "topics2Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg02k", + "name": "topics2Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg02m", + "name": "topics2Icon", + "width": 18, + "height": 18, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "dsg02n", + "name": "topics2Label", + "fill": "$--foreground", + "content": "Topics", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg02o", + "name": "topics2Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg02r", + "name": "draggedSection", + "x": 8, + "y": 160, + "width": 234, + "fill": "$--sidebar", + "cornerRadius": 6, + "stroke": { + "align": "outside", + "thickness": 1, + "fill": { + "type": "color", + "color": "$--accent-blue" + } + }, + "opacity": 0.9, + "layout": "vertical", + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg02s", + "name": "draggedHeader", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg02t", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--accent-blue", + "opacity": 0.8 + }, + { + "type": "icon_font", + "id": "dsg02u", + "width": 18, + "height": 18, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "dsg02v", + "fill": "$--foreground", + "content": "People", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg04j", + "name": "Sidebar — After Reorder (People Moved Up)", + "x": 772, + "y": 6400, + "width": 330, + "height": 680, + "fill": "$--background", + "layout": "vertical", + "padding": [ + 16 + ], + "theme": { + "Mode": "Light" + }, + "children": [ + { + "type": "text", + "id": "dsg04k", + "name": "frame3Title", + "content": "After drop — People now second section", + "fontFamily": "Inter", + "fontSize": 14, + "fontWeight": "600", + "fill": "$--foreground" + }, + { + "type": "text", + "id": "dsg04l", + "name": "frame3Desc", + "content": "Order persisted as \"order\" property in each Type document frontmatter (e.g. order: 2).", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "normal", + "fill": "$--muted-foreground" + }, + { + "type": "frame", + "id": "dsg04m", + "height": 12 + }, + { + "type": "frame", + "id": "dsg04n", + "name": "sidebarReordered", + "width": 250, + "height": 600, + "fill": "$--sidebar", + "layout": "vertical", + "clip": true, + "children": [ + { + "type": "frame", + "id": "dsg04o", + "name": "filters", + "width": "fill_container", + "layout": "vertical", + "gap": 2, + "padding": [ + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg04p", + "name": "allNotesRow", + "width": "fill_container", + "cornerRadius": 4, + "padding": [ + 6, + 16 + ], + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg04q", + "width": 18, + "height": 18, + "iconFontName": "file-text", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "dsg04r", + "fill": "$--foreground", + "content": "All Notes", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "dsg04s", + "name": "favRow", + "width": "fill_container", + "cornerRadius": 4, + "padding": [ + 6, + 16 + ], + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg04t", + "width": 18, + "height": 18, + "iconFontName": "star", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "dsg04u", + "fill": "$--muted-foreground", + "content": "Favorites", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg04v", + "name": "sectionsWrap", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "children": [ + { + "type": "frame", + "id": "dsg03j", + "name": "proj3Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6, + 8, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg03e", + "name": "proj3Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg03a", + "name": "proj3Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg039", + "name": "proj3Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg03b", + "name": "proj3Icon", + "width": 18, + "height": 18, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-red" + }, + { + "type": "text", + "id": "dsg03c", + "name": "proj3Label", + "fill": "$--foreground", + "content": "Projects", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg03d", + "name": "proj3Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-down", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "dsg03f", + "name": "proj3Item0", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "fill": "$--accent-red-light", + "children": [ + { + "type": "text", + "id": "dsg03g", + "name": "proj3ItemTxt0", + "fill": "$--accent-red", + "content": "Laputa App", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "dsg03h", + "name": "proj3Item1", + "width": "fill_container", + "cornerRadius": 6, + "padding": [ + 6, + 16, + 6, + 28 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "dsg03i", + "name": "proj3ItemTxt1", + "fill": "$--muted-foreground", + "content": "Portfolio Rewrite", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg03q", + "name": "people3Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg03p", + "name": "people3Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg03l", + "name": "people3Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg03k", + "name": "people3Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg03m", + "name": "people3Icon", + "width": 18, + "height": 18, + "iconFontName": "leaf", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "dsg03n", + "name": "people3Label", + "fill": "$--foreground", + "content": "People", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg03o", + "name": "people3Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg03x", + "name": "resp3Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg03w", + "name": "resp3Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg03s", + "name": "resp3Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg03r", + "name": "resp3Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg03t", + "name": "resp3Icon", + "width": 18, + "height": 18, + "iconFontName": "medal", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "dsg03u", + "name": "resp3Label", + "fill": "$--foreground", + "content": "Responsibilities", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg03v", + "name": "resp3Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg044", + "name": "proc3Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg043", + "name": "proc3Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg03z", + "name": "proc3Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg03y", + "name": "proc3Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg040", + "name": "proc3Icon", + "width": 18, + "height": 18, + "iconFontName": "arrows-clockwise", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-purple" + }, + { + "type": "text", + "id": "dsg041", + "name": "proc3Label", + "fill": "$--foreground", + "content": "Procedures", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg042", + "name": "proc3Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg04b", + "name": "events3Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg04a", + "name": "events3Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg046", + "name": "events3Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg045", + "name": "events3Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg047", + "name": "events3Icon", + "width": 18, + "height": 18, + "iconFontName": "cardholder", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-yellow" + }, + { + "type": "text", + "id": "dsg048", + "name": "events3Label", + "fill": "$--foreground", + "content": "Events", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg049", + "name": "events3Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "dsg04i", + "name": "topics3Group", + "width": "fill_container", + "stroke": { + "align": "inside", + "thickness": { + "bottom": 1 + }, + "fill": { + "type": "color", + "color": "$--border", + "enabled": false + } + }, + "layout": "vertical", + "gap": 2, + "padding": [ + 4, + 6 + ], + "children": [ + { + "type": "frame", + "id": "dsg04h", + "name": "topics3Header", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "dsg04d", + "name": "topics3Left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "dsg04c", + "name": "topics3Drag", + "width": 14, + "height": 14, + "iconFontName": "grip-vertical", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground", + "opacity": 0.5 + }, + { + "type": "icon_font", + "id": "dsg04e", + "name": "topics3Icon", + "width": 18, + "height": 18, + "iconFontName": "tag", + "iconFontFamily": "phosphor", + "weight": 700, + "fill": "$--accent-green" + }, + { + "type": "text", + "id": "dsg04f", + "name": "topics3Label", + "fill": "$--foreground", + "content": "Topics", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "dsg04g", + "name": "topics3Chev", + "width": 14, + "height": 14, + "iconFontName": "chevron-right", + "iconFontFamily": "lucide", + "fill": "$--muted-foreground" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "csB01", + "x": 0, + "y": 7140, + "name": "Sections Header — Before (old design)", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 280, + "height": 120, + "fill": "$--sidebar", + "layout": "vertical", + "gap": 8, + "padding": [ + 16, + 12 + ], + "children": [ + { + "type": "text", + "id": "csB02", + "name": "frameLabel", + "fill": "$--muted-foreground", + "content": "BEFORE — Old Design", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600", + "letterSpacing": 1 + }, + { + "type": "frame", + "id": "csB03", + "name": "customizeBtn", + "width": "fill_container", + "cornerRadius": 4, + "gap": 6, + "padding": [ + 4, + 16 + ], + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "csB04", + "name": "slidersIcon", + "width": 14, + "height": 14, + "iconFontName": "sliders-horizontal", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + }, + { + "type": "text", + "id": "csB05", + "name": "customizeLabel", + "fill": "$--muted-foreground", + "content": "Customize sections", + "fontFamily": "Inter", + "fontSize": 12 + } + ] + }, + { + "type": "frame", + "id": "csB06", + "name": "sectionRow", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "csB07", + "name": "left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "csB08", + "name": "projIcon", + "width": 16, + "height": 16, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "fill": "$--accent-red" + }, + { + "type": "text", + "id": "csB09", + "name": "projLabel", + "fill": "$--foreground", + "content": "Projects", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "csB10", + "name": "chevron", + "width": 12, + "height": 12, + "iconFontName": "caret-right", + "iconFontFamily": "phosphor", + "fill": "$--foreground" + } + ] + } + ] + }, + { + "type": "frame", + "id": "csA01", + "x": 340, + "y": 7140, + "name": "Sections Header — After (new design)", + "theme": { + "Mode": "Light" + }, + "clip": true, + "width": 280, + "height": 120, + "fill": "$--sidebar", + "layout": "vertical", + "gap": 8, + "padding": [ + 16, + 12 + ], + "children": [ + { + "type": "text", + "id": "csA02", + "name": "frameLabel", + "fill": "$--muted-foreground", + "content": "AFTER — New Design", + "fontFamily": "Inter", + "fontSize": 10, + "fontWeight": "600", + "letterSpacing": 1 + }, + { + "type": "frame", + "id": "csA03", + "name": "sectionsHeader", + "width": "fill_container", + "padding": [ + 4, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "csA04", + "name": "sectionsLabel", + "fill": "$--muted-foreground", + "content": "SECTIONS", + "fontFamily": "Inter", + "fontSize": 11, + "fontWeight": "600", + "letterSpacing": 1.2 + }, + { + "type": "icon_font", + "id": "csA05", + "name": "settingsIcon", + "width": 14, + "height": 14, + "iconFontName": "sliders-horizontal", + "iconFontFamily": "phosphor", + "fill": "$--muted-foreground" + } + ] + }, + { + "type": "frame", + "id": "csA06", + "name": "sectionRow", + "width": "fill_container", + "cornerRadius": 4, + "gap": 8, + "padding": [ + 6, + 16 + ], + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "csA07", + "name": "left", + "gap": 8, + "alignItems": "center", + "children": [ + { + "type": "icon_font", + "id": "csA08", + "name": "projIcon", + "width": 16, + "height": 16, + "iconFontName": "wrench", + "iconFontFamily": "phosphor", + "fill": "$--accent-red" + }, + { + "type": "text", + "id": "csA09", + "name": "projLabel", + "fill": "$--foreground", + "content": "Projects", + "fontFamily": "Inter", + "fontSize": 13, + "fontWeight": "500" + } + ] + }, + { + "type": "icon_font", + "id": "csA10", + "name": "chevron", + "width": 12, + "height": 12, + "iconFontName": "caret-right", + "iconFontFamily": "phosphor", + "fill": "$--foreground" + } + ] + } + ] + } + ], + "themes": { + "Mode": [ + "Dark" + ] + }, + "variables": { + "--accent": { + "type": "color", + "value": [ + { + "value": "#EBEBEA" + }, + { + "value": "#252545", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-blue": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-green": { + "type": "color", + "value": [ + { + "value": "#0F7B6C" + }, + { + "value": "#4caf50", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#00B38B" + }, + { + "value": "#00B38B", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-orange": { + "type": "color", + "value": [ + { + "value": "#D9730D" + }, + { + "value": "#ff9800", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-purple": { + "type": "color", + "value": [ + { + "value": "#9065B0" + }, + { + "value": "#9c72ff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#A932FF" + }, + { + "value": "#A932FF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-red": { + "type": "color", + "value": [ + { + "value": "#E03E3E" + }, + { + "value": "#f44336", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--background": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#0f0f1a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--black": { + "type": "color", + "value": "#000000" + }, + "--border": { + "type": "color", + "value": [ + { + "value": "#E9E9E7" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--card": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#16162a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--card-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--destructive": { + "type": "color", + "value": [ + { + "value": "#E03E3E" + }, + { + "value": "#f44336", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--destructive-foreground": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--font-primary": { + "type": "string", + "value": [ + { + "value": "Inter" + }, + { + "value": "-apple-system, BlinkMacSystemFont, Inter, sans-serif" + }, + { + "value": "Inter" + } + ] + }, + "--font-system": { + "type": "string", + "value": "-apple-system, BlinkMacSystemFont, sans-serif" + }, + "--foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--input": { + "type": "color", + "value": [ + { + "value": "#E9E9E7" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--muted": { + "type": "color", + "value": [ + { + "value": "#F0F0EF" + }, + { + "value": "#1e1e3a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--muted-foreground": { + "type": "color", + "value": [ + { + "value": "#787774" + }, + { + "value": "#888888", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--popover": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#1e1e3a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--popover-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--primary": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--primary-foreground": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--radius-lg": { + "type": "number", + "value": 8 + }, + "--radius-md": { + "type": "number", + "value": 6 + }, + "--radius-sm": { + "type": "number", + "value": 4 + }, + "--ring": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--secondary": { + "type": "color", + "value": [ + { + "value": "#EBEBEA" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--secondary-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar": { + "type": "color", + "value": [ + { + "value": "#F7F6F3" + }, + { + "value": "#1a1a2e", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-accent": { + "type": "color", + "value": [ + { + "value": "#EBEBEA" + }, + { + "value": "#252545", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-accent-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-border": { + "type": "color", + "value": [ + { + "value": "#E9E9E7" + }, + { + "value": "#2a2a4a", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-foreground": { + "type": "color", + "value": [ + { + "value": "#37352F" + }, + { + "value": "#e0e0e0", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-primary": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-primary-foreground": { + "type": "color", + "value": [ + { + "value": "#FFFFFF" + }, + { + "value": "#ffffff", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--sidebar-ring": { + "type": "color", + "value": [ + { + "value": "#2383E2" + }, + { + "value": "#4a9eff", + "theme": { + "Mode": "Dark" + } + }, + { + "value": "#155DFF" + }, + { + "value": "#155DFF", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--white": { + "type": "color", + "value": "#ffffff" + }, + "--accent-yellow": { + "type": "color", + "value": [ + { + "value": "#F0B100" + }, + { + "value": "#F0B100", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-blue-light": { + "type": "color", + "value": [ + { + "value": "#155DFF14" + }, + { + "value": "#155DFF20", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-green-light": { + "type": "color", + "value": [ + { + "value": "#00B38B14" + }, + { + "value": "#00B38B20", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-purple-light": { + "type": "color", + "value": [ + { + "value": "#A932FF14" + }, + { + "value": "#A932FF20", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-red-light": { + "type": "color", + "value": [ + { + "value": "#E03E3E14" + }, + { + "value": "#f4433620", + "theme": { + "Mode": "Dark" + } + } + ] + }, + "--accent-yellow-light": { + "type": "color", + "value": [ + { + "value": "#F0B10014" + }, + { + "value": "#F0B10020", + "theme": { + "Mode": "Dark" + } + } + ] + } + }, + "fonts": [ + { + "name": "GT Pressura Trial", + "url": "GT-Pressura-Regular-Trial.otf" + } + ] +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index fb6f6094..254f1671 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,16 +1,15 @@ -import { useCallback, useEffect, useMemo, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import { Sidebar } from './components/Sidebar' import { NoteList } from './components/NoteList' import { Editor } from './components/Editor' import { ResizeHandle } from './components/ResizeHandle' -import { CreateNoteDialog } from './components/CreateNoteDialog' import { CreateTypeDialog } from './components/CreateTypeDialog' import { QuickOpenPalette } from './components/QuickOpenPalette' import { Toast } from './components/Toast' import { CommitDialog } from './components/CommitDialog' import { StatusBar } from './components/StatusBar' import { useVaultLoader } from './hooks/useVaultLoader' -import { useNoteActions } from './hooks/useNoteActions' +import { useNoteActions, generateUntitledName } from './hooks/useNoteActions' import { useAppKeyboard } from './hooks/useAppKeyboard' import { useEntryActions } from './hooks/useEntryActions' import { isTauri } from './mock-tauri' @@ -36,12 +35,6 @@ const VAULTS = isTauri() { label: 'Demo v2', path: '/Users/luca/Workspace/laputa-app/demo-vault-v2' }, ] -const BUILT_IN_TYPE_NAMES = new Set([ - 'Project', 'Experiment', 'Responsibility', 'Procedure', - 'Person', 'Event', 'Topic', 'Type', 'Note', 'Essay', - 'Quarter', 'Journal', 'Evergreen', -]) - function useLayoutPanels() { const [sidebarWidth, setSidebarWidth] = useState(250) const [noteListWidth, setNoteListWidth] = useState(300) @@ -57,8 +50,6 @@ function App() { const [selection, setSelection] = useState(DEFAULT_SELECTION) const layout = useLayoutPanels() const [gitHistory, setGitHistory] = useState([]) - const [showCreateDialog, setShowCreateDialog] = useState(false) - const [createNoteDefaultType, setCreateNoteDefaultType] = useState() const [showCreateTypeDialog, setShowCreateTypeDialog] = useState(false) const [showQuickOpen, setShowQuickOpen] = useState(false) const [showCommitDialog, setShowCommitDialog] = useState(false) @@ -77,13 +68,12 @@ function App() { setToastMessage, }) - const customTypes = useMemo( - () => vault.entries - .filter((e) => e.isA === 'Type' && !BUILT_IN_TYPE_NAMES.has(e.title)) - .map((e) => e.title) - .sort(), - [vault.entries], - ) + // Immediate note creation — no dialog, just create and open + const handleCreateNoteImmediate = useCallback((type?: string) => { + const noteType = type || 'Note' + notes.handleCreateNote(generateUntitledName(vault.entries, noteType), noteType) + window.dispatchEvent(new CustomEvent('laputa:focus-editor')) + }, [vault.entries, notes]) const handleSwitchVault = useCallback((path: string) => { setVaultPath(path) @@ -97,9 +87,8 @@ function App() { vault.loadGitHistory(notes.activeTabPath).then(setGitHistory) }, [notes.activeTabPath, vault.loadGitHistory]) - const openCreateDialog = useCallback((type?: string) => { - setCreateNoteDefaultType(type) - setShowCreateDialog(true) + const openCreateTypeDialog = useCallback(() => { + setShowCreateTypeDialog(true) }, []) const handleCreateType = useCallback((name: string) => { @@ -109,7 +98,7 @@ function App() { useAppKeyboard({ onQuickOpen: () => setShowQuickOpen(true), - onCreateNote: openCreateDialog, + onCreateNote: handleCreateNoteImmediate, onSave: () => setToastMessage('Saved'), onTrashNote: entryActions.handleTrashNote, onArchiveNote: entryActions.handleArchiveNote, @@ -146,11 +135,11 @@ function App() {
- setShowCreateTypeDialog(true)} onCustomizeType={entryActions.handleCustomizeType} onReorderSections={entryActions.handleReorderSections} modifiedCount={vault.modifiedFiles.length} onCommitPush={() => setShowCommitDialog(true)} /> + setShowCommitDialog(true)} />
- +
@@ -165,7 +154,7 @@ function App() { onLoadDiff={vault.loadDiff} onLoadDiffAtCommit={vault.loadDiffAtCommit} isModified={vault.isFileModified} - onCreateNote={openCreateDialog} + onCreateNote={handleCreateNoteImmediate} inspectorCollapsed={layout.inspectorCollapsed} onToggleInspector={() => layout.setInspectorCollapsed((c) => !c)} inspectorWidth={layout.inspectorWidth} @@ -190,7 +179,6 @@ function App() { setToastMessage(null)} /> setShowQuickOpen(false)} /> - setShowCreateDialog(false)} onCreate={notes.handleCreateNote} defaultType={createNoteDefaultType} customTypes={customTypes} /> setShowCreateTypeDialog(false)} onCreate={handleCreateType} /> setShowCommitDialog(false)} />
diff --git a/src/components/Editor.tsx b/src/components/Editor.tsx index 7ad58467..503f822f 100644 --- a/src/components/Editor.tsx +++ b/src/components/Editor.tsx @@ -357,6 +357,15 @@ export const Editor = memo(function Editor({ tabPathsRef.current = currentPaths }, [tabs]) + // Focus editor when a new note is created (signaled via custom event) + useEffect(() => { + const handler = () => { + setTimeout(() => editor.focus(), 150) + } + window.addEventListener('laputa:focus-editor', handler) + return () => window.removeEventListener('laputa:focus-editor', handler) + }, [editor]) + const activeTab = tabs.find((t) => t.entry.path === activeTabPath) ?? null const isLoadingNewTab = activeTabPath !== null && !activeTab const showDiffToggle = activeTab && (diffMode || isModified?.(activeTab.entry.path)) diff --git a/src/components/NoteList.tsx b/src/components/NoteList.tsx index 9c99b54f..0180b6a0 100644 --- a/src/components/NoteList.tsx +++ b/src/components/NoteList.tsx @@ -240,7 +240,7 @@ function NoteListInner({ entries, selection, selectedNote, allContent, modifiedF -
diff --git a/src/components/TabBar.tsx b/src/components/TabBar.tsx index c791c5d2..7ee20cca 100644 --- a/src/components/TabBar.tsx +++ b/src/components/TabBar.tsx @@ -144,7 +144,7 @@ function TabBarActions({ onCreateNote }: { onCreateNote?: () => void }) { gap: 12, padding: '0 12px', WebkitAppRegion: 'no-drag', } as React.CSSProperties} > -