@eastgatesystems/tbx-reader 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/tbx-document.iife.js +572 -0
- package/dist/tbx-document.mjs +5693 -0
- package/package.json +41 -0
|
@@ -0,0 +1,572 @@
|
|
|
1
|
+
var TbxDocument=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=class{get text(){return this._text}set text(e){this._text=e}get isRichText(){return this._isRichText}set isRichText(e){this._isRichText=e}constructor(e,t,n,r,i,a,o,s,c,l,u=!1){this.id=e,this.name=t,this.attributes=i,this.father=a,this.son=o,this.brother=s,this.elderBrother=c,this.ht=l,this.isAdornment=u,this.isAlias=!1,this.isAgent=!1,this.aliases=[],this._text=``,this._isRichText=!1,this.html=``,this._text=n,this._isRichText=r}getOriginal(){return this}unhook(){this.father?.son===this&&(this.father.son=this.brother),this.elderBrother&&(this.elderBrother.brother=this.brother),this.brother&&(this.brother.elderBrother=this.elderBrother),this.father=null,this.brother=null,this.elderBrother=null}getNumber(e){let t=parseFloat(this.get(e));return isNaN(t)?0:t}getBoolean(e){let t=this.get(e);return t!==``&&t!==`false`&&t!==`0`}getColor(e,t){let n=this.get(e);return!n||n===`transparent`?t:this.ht.colors.resolve(n)??t}get(e){let t=this.ht.getAttribute(e);return t?t.getValue(this):this.attributes.get(e)??``}get wordCount(){return this.text.trim()===``?0:this.text.trim().split(/\s+/).length}get children(){let e=[],t=this.son;for(;t;)e.push(t),t=t.brother;return e}get path(){let e=[],t=this;for(;t!==null&&t.father!==null;)e.unshift(t.name),t=t.father;return`/`+e.join(`/`)}isDescendantOf(e){let t=this;for(;t;){if(t===e)return!0;t=t.father}return!1}outboundLinks(){return this.ht.links.filter(e=>e.src===this&&!e.isPrototype()&&!e.isUrlLink())}outboundPlainLinks(){return this.ht.links.filter(e=>e.src===this&&e.srcSpan===null&&!e.isPrototype()&&!e.isUrlLink())}},n=class extends t{constructor(e,t,n,r,i,a,o){super(t,e.name,``,!1,n,r,null,null,null,o),this.original=e,this.isAlias=!0,this.brother=i,this.elderBrother=a}getOriginal(){return this.original}get text(){return this.original.text}get isRichText(){return this.original.isRichText}get html(){return this.original.html}set html(e){}get(e){let t=this.ht.getAttribute(e);return t?.canInherit?this.original.get(e):t?.getValue(this)??this.attributes.get(e)??``}},r=class extends t{constructor(e,t,n,r,i,a,o,s,c,l){super(e,t,n,r,i,a,o,s,c,l,!1),this.isAgent=!0}},i=function(e){return e[e.String=0]=`String`,e[e.Color=1]=`Color`,e[e.Number=2]=`Number`,e[e.File=3]=`File`,e[e.Boolean=4]=`Boolean`,e[e.Date=5]=`Date`,e[e.Alias=6]=`Alias`,e[e.Action=7]=`Action`,e[e.Set=8]=`Set`,e[e.URL=9]=`URL`,e[e.List=10]=`List`,e[e.Font=11]=`Font`,e[e.Interval=12]=`Interval`,e[e.Dictionary=13]=`Dictionary`,e[e.WindowPlace=100]=`WindowPlace`,e}({}),a=class{constructor(e){this.name=e.name,this.parent=e.parent,this.type=e.type,this.editable=e.editable,this.visibleInEditor=e.visibleInEditor,this.canInherit=e.canInherit,this.default=e.default,this.lines=e.lines}getValue(e){return this.resolve(e,new Set([e]))}resolve(e,t){let n=e.attributes.get(this.name);if(n!==void 0)return n;if(this.canInherit){let n=e.attributes.get(`Prototype`);if(n){let r=e.ht.findNoteByName(n);if(r&&!t.has(r))return t.add(r),this.resolve(r,t)}}return this.default}},o=class extends a{resolve(e,t){return String(e.text.length)}},s=class extends a{resolve(e,t){return String(e.wordCount)}};function c(e){if(e.son)return e.son;if(e.brother)return e.brother;let t=e.father;for(;t!==null&&t.father!==null;){if(t.brother)return t.brother;t=t.father}return null}var l=class extends a{resolve(e,t){let n=e;for(;n.father!==null;)n=n.father;let r=n,i=0;for(;r!==null;){if(r===e)return String(i);i++,r=c(r)}return this.default}},u=class extends a{resolve(e,t){if(e.father===null)return this.default;let n=1,r=e.father.son;for(;r!==null&&r!==e;)n++,r=r.brother;return String(n)}},d=class extends a{resolve(e,t){return e.attributes.get(`Name`)??e.name}},f=class extends a{resolve(e,t){return e.path}},p=class extends a{resolve(e,t){return e.father===null?``:e.father.path}},m=class extends a{resolve(e,t){let n=e.ht.links.filter(t=>t.dest===e&&!t.isPrototype()).length;return String(n)}},h=class extends a{resolve(e,t){let n=e.ht.links.filter(t=>t.src===e&&!t.isPrototype()&&!t.isUrlLink()).length;return String(n)}},g=class extends a{resolve(e,t){return String(e.ht.links.filter(t=>t.src===e&&t.isUrlLink()).length)}},_=class extends a{resolve(e,t){return String(e.ht.links.filter(t=>t.src===e&&t.srcSpan!==null).length)}},v=class extends a{resolve(e,t){return String(e.ht.links.filter(t=>t.src===e&&t.srcSpan===null).length)}},y=class extends a{resolve(e,t){let n=0,r=e;for(;r!==null&&r.father!==null;)n++,r=r.father;return String(n)}},b=class extends a{resolve(e,t){let n=0,r=e.son;for(;r!==null;)n++,r=r.brother;return String(n)}};function x(e){let t=0,n=e.son;for(;n!==null;)t+=1+x(n),n=n.brother;return t}var S={Name:d,TextLength:o,WordCount:s,OutlineOrder:l,SiblingOrder:u,Path:f,Container:p,InboundLinkCount:m,OutboundLinkCount:h,WebLinkCount:g,TextLinkCount:_,PlainLinkCount:v,OutlineDepth:y,ChildCount:b,DescendantCount:class extends a{resolve(e,t){return String(x(e))}}},C=class e{static hexToRgb(e){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);return t?[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]:null}static rgbToHex(e,t,n){let r=e=>Math.max(0,Math.min(255,Math.round(e))).toString(16).padStart(2,`0`);return`#${r(e)}${r(t)}${r(n)}`}static{this.MODIFIERS=[`lightest`,`lighter`,`light`,`darkest`,`darker`,`dark`,`muted`,`warmer`,`cooler`,`pale`]}static{this.MODIFIER_SET=new Set(e.MODIFIERS)}static{this.BLACK=new e(`#000000`)}static{this.WHITE=new e(`#ffffff`)}constructor(e){this.hex=e}toString(){return this.hex}static parse(t){if(/^#[0-9a-f]{6}$/i.test(t))return new e(t);let n=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(t);if(n)return new e(`#${n[1]}${n[1]}${n[2]}${n[2]}${n[3]}${n[3]}`);let r=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i.exec(t);if(r)return new e(e.rgbToHex(Math.max(0,Math.min(255,parseInt(r[1],10))),Math.max(0,Math.min(255,parseInt(r[2],10))),Math.max(0,Math.min(255,parseInt(r[3],10)))));let i=/^hsv\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/i.exec(t);return i?new w(parseFloat(i[1]),parseFloat(i[2]),parseFloat(i[3])).toTbxColor():null}get luma(){let t=e.hexToRgb(this.hex);if(!t)return 0;let n=t[0]/255,r=t[1]/255,i=t[2]/255;return Math.sqrt(.299*n*n+.587*r*r+.114*i*i)}get automaticBorderColor(){let t=e.hexToRgb(this.hex);if(!t)return e.BLACK;let n=w.from(this).v>50?0:255;return new e(e.rgbToHex(Math.round(.75*t[0]+.25*n),Math.round(.75*t[1]+.25*n),Math.round(.75*t[2]+.25*n)))}get contrastingTextColor(){let t=this.luma;return t>.7?e.BLACK:t>.55?new e(`#ffff00`):e.WHITE}},w=class e{constructor(e,t,n){this.h=e,this.s=t,this.v=n}static from(t){let n=C.hexToRgb(t.hex);if(!n)return new e(0,0,0);let[r,i,a]=n,o=r/255,s=i/255,c=a/255,l=Math.max(o,s,c),u=l-Math.min(o,s,c),d=l*100,f=l===0?0:u/l*100,p=0;return u!==0&&(p=o===l?(s-c)/u*60:s===l?(2+(c-o)/u)*60:(4+(o-s)/u)*60,p<0&&(p+=360)),new e(p,f,d)}toTbxColor(){let{h:e,s:t,v:n}=this,r=t/100,i=n/100;for(;e>360;)e-=360;for(;e<0;)e+=360;if(r===0){let e=Math.round(i*255);return new C(C.rgbToHex(e,e,e))}let a=e/60,o=Math.floor(a),s=a-o,c=i*(1-r),l=i*(1-r*s),u=i*(1-r*(1-s)),d,f,p;switch(o%6){case 0:d=i,f=u,p=c;break;case 1:d=l,f=i,p=c;break;case 2:d=c,f=i,p=u;break;case 3:d=c,f=l,p=i;break;case 4:d=u,f=c,p=i;break;default:d=i,f=c,p=l;break}let m=Math.max(1,d,f,p);return new C(C.rgbToHex(Math.round(d/m*255),Math.round(f/m*255),Math.round(p/m*255)))}darker(t){let n=t*.5;return new e(this.h,100-(100-this.s)/(1+n),this.v/(1+n))}lighter(t){return new e(this.h,this.s/(1+t),100-(100-this.v)/(1+t))}desaturate(){return new e(this.h,this.s/4,this.v)}warmer(){let t=this.h-10;return new e(t<0?t+360:t,this.s,this.v)}cooler(){return new e(this.h+10,this.s,this.v)}},T=class{constructor(e){this.map=new Map(e)}splitModifier(e){let t=e.indexOf(` `);if(t===-1)return{mod:null,base:e};let n=e.slice(0,t);return C.MODIFIER_SET.has(n)?{mod:n,base:e.slice(t+1).trim()}:{mod:null,base:e}}applyModifier(e,t){let n=w.from(e);switch(t){case`dark`:n=n.darker(1);break;case`darker`:n=n.darker(2);break;case`darkest`:n=n.darker(3);break;case`light`:n=n.lighter(1);break;case`lighter`:n=n.lighter(2);break;case`lightest`:n=n.lighter(3);break;case`muted`:n=n.desaturate();break;case`warmer`:n=n.warmer();break;case`cooler`:n=n.cooler();break;case`pale`:break}return n.toTbxColor()}resolve(e,t){let n=this.map.get(e);if(n)return new C(n);let r=C.parse(e);if(r)return r;let{mod:i,base:a}=this.splitModifier(e);if(i){let e=this.map.get(a)?new C(this.map.get(a)):C.parse(a);if(e)return this.applyModifier(e,i)}return t}};function E(e){return/\s/.test(e)}function D(e){return e>=`0`&&e<=`9`}function O(e){return/[a-zA-Z_]/.test(e)}function k(e){return/[a-zA-Z0-9_]/.test(e)}var A=new Set([`|=`,`&=`,`+=`,`-=`,`==`,`!=`,`<=`,`>=`]),ee=class{constructor(e){this.input=e,this.i=0,this.tokens=[]}lexAttrRef(){this.i++;let e=``;for(;this.i<this.input.length&&k(this.input[this.i]);)e+=this.input[this.i++];this.tokens.push({kind:`attrRef`,value:e})}lexQuotedString(e){this.i++;let t=``;for(;this.i<this.input.length&&this.input[this.i]!==e;)if(this.input[this.i]===`\\`&&this.i+1<this.input.length){this.i++;let e=this.input[this.i++];e===`"`?t+=`"`:e===`'`?t+=`'`:e===`\\`?t+=`\\`:e===`n`?t+=`
|
|
2
|
+
`:e===`t`?t+=` `:t+=e}else t+=this.input[this.i++];this.i<this.input.length&&this.i++,this.tokens.push({kind:`string`,value:t})}lexNumber(){let e=``;for(;this.i<this.input.length&&D(this.input[this.i]);)e+=this.input[this.i++];if(this.i<this.input.length&&this.input[this.i]===`.`&&this.i+1<this.input.length&&D(this.input[this.i+1]))for(e+=this.input[this.i++];this.i<this.input.length&&D(this.input[this.i]);)e+=this.input[this.i++];this.tokens.push({kind:`number`,value:e})}lexIdent(){let e=``;for(;this.i<this.input.length&&k(this.input[this.i]);)e+=this.input[this.i++];this.tokens.push({kind:`ident`,value:e})}tokenize(){for(;this.i<this.input.length;){if(E(this.input[this.i])){this.i++;continue}let e=this.input[this.i];if(e===`$`){this.lexAttrRef();continue}if(e===`"`||e===`'`){this.lexQuotedString(e);continue}if(D(e)){this.lexNumber();continue}if(O(e)){this.lexIdent();continue}if(e===`.`&&this.i+1<this.input.length&&this.input[this.i+1]===`.`){this.tokens.push({kind:`ident`,value:`..`}),this.i+=2;continue}if(this.i+1<this.input.length){let t=e+this.input[this.i+1];if(A.has(t)){this.tokens.push({kind:`op`,value:t}),this.i+=2;continue}}switch(e){case`=`:this.tokens.push({kind:`op`,value:`=`});break;case`+`:this.tokens.push({kind:`op`,value:`+`});break;case`-`:this.tokens.push({kind:`op`,value:`-`});break;case`*`:this.tokens.push({kind:`op`,value:`*`});break;case`/`:this.tokens.push({kind:`op`,value:`/`});break;case`<`:this.tokens.push({kind:`op`,value:`<`});break;case`>`:this.tokens.push({kind:`op`,value:`>`});break;case`&`:this.tokens.push({kind:`op`,value:`&`});break;case`|`:this.tokens.push({kind:`op`,value:`|`});break;case`!`:this.tokens.push({kind:`op`,value:`!`});break;case`(`:this.tokens.push({kind:`lparen`,value:`(`});break;case`)`:this.tokens.push({kind:`rparen`,value:`)`});break;case`{`:this.tokens.push({kind:`lbrace`,value:`{`});break;case`}`:this.tokens.push({kind:`rbrace`,value:`}`});break;case`[`:this.tokens.push({kind:`lbracket`,value:`[`});break;case`]`:this.tokens.push({kind:`rbracket`,value:`]`});break;case`;`:this.tokens.push({kind:`semi`,value:`;`});break;case`,`:this.tokens.push({kind:`comma`,value:`,`});break;case`.`:this.tokens.push({kind:`dot`,value:`.`});break;case`:`:this.tokens.push({kind:`colon`,value:`:`});break}this.i++}return this.tokens.push({kind:`eof`,value:``}),this.tokens}};function te(e){return new ee(e).tokenize()}var ne={"|":10,"&":20,"==":30,"!=":30,"<":40,"<=":40,">":40,">=":40,"+":50,"-":50,"*":60,"/":60},re=class{constructor(e){this.tokens=e,this.pos=0}peek(){return this.tokens[this.pos]??{kind:`eof`,value:``}}consume(){return this.tokens[this.pos++]??{kind:`eof`,value:``}}expect(e){let t=this.consume();if(t.kind!==e)throw Error(`Expected ${e}, got ${t.kind} ("${t.value}") at token ${this.pos}`);return t}at(e){return this.peek().kind===e}lbp(e){return e.kind===`dot`||e.kind===`lbracket`?80:e.kind===`op`?ne[e.value]??0:0}nud(e){switch(e.kind){case`string`:return{kind:`literal`,litKind:`string`,value:e.value};case`number`:return{kind:`literal`,litKind:`number`,value:e.value};case`attrRef`:{let t=null;return this.at(`lparen`)&&(this.consume(),t=this.parseExpr(0),this.expect(`rparen`)),{kind:`attrRef`,name:e.value,designator:t}}case`ident`:{let t=e.value;if(t===`true`)return{kind:`literal`,litKind:`boolean`,value:`true`};if(t===`false`)return{kind:`literal`,litKind:`boolean`,value:`false`};if(this.at(`lparen`)){this.consume();let e=this.parseArgList();return this.expect(`rparen`),{kind:`call`,name:t,args:e}}return{kind:`ident`,name:t}}case`op`:if(e.value===`-`)return{kind:`unary`,op:`-`,arg:this.parseExpr(70)};if(e.value===`!`)return{kind:`unary`,op:`!`,arg:this.parseExpr(70)};throw Error(`Unexpected operator in expression prefix: "${e.value}"`);case`lparen`:{let e=this.parseExpr(0);return this.expect(`rparen`),e}case`dot`:return{kind:`ident`,name:`.`};default:throw Error(`Unexpected token in expression: ${e.kind} ("${e.value}")`)}}led(e,t){if(e.kind===`dot`){let e=this.consume();if(e.kind!==`ident`)throw Error(`Expected method name after dot, got ${e.kind} ("${e.value}")`);let n=e.value;if(n===`eachLine`){this.expect(`lparen`);let e=this.consume();if(e.kind!==`ident`)throw Error(`Expected variable name in eachLine`);let n=e.value,r;return this.at(`colon`)&&(this.consume(),r=this.parseExpr(0)),this.expect(`rparen`),{kind:`dotEachLine`,left:t,loopVar:n,pred:r}}if(n===`try`||n===`thenTry`)return{kind:`dotBlock`,left:t,method:n};let r=[];return this.at(`lparen`)&&(this.consume(),r=this.parseArgList(),this.expect(`rparen`)),{kind:`dot`,left:t,method:n,args:r}}if(e.kind===`lbracket`){let e=this.parseExpr(0);return this.expect(`rbracket`),{kind:`subscript`,left:t,key:e}}if(e.kind===`op`){let n=e.value,r=ne[n]??0;return{kind:`binary`,op:n,left:t,right:this.parseExpr(r)}}throw Error(`Unexpected token in infix position: ${e.kind} ("${e.value}")`)}parseExpr(e=0){let t=this.consume(),n=this.nud(t);for(;;){let t=this.peek();if(this.lbp(t)<=e)break;this.consume(),n=this.led(t,n)}return n}parseArgList(){let e=[];if(this.at(`rparen`))return e;for(e.push(this.parseExpr(0));this.at(`comma`);)this.consume(),e.push(this.parseExpr(0));return e}};function ie(e){return new re(te(e)).parseExpr(0)}var ae=class{constructor(e,t,n,r){this.x=e,this.y=t,this.w=n,this.h=r}intersects(e){return this.x<e.x+e.w&&e.x<this.x+this.w&&this.y<e.y+e.h&&e.y<this.y+this.h}};function oe(e){return new ae(parseFloat(e.attributes.get(`Xpos`)??`0`),parseFloat(e.attributes.get(`Ypos`)??`0`),parseFloat(e.attributes.get(`Width`)??`0`),parseFloat(e.attributes.get(`Height`)??`0`))}var se=`__failed__`;function ce(e){return e?.get(se)===`true`}function j(e,t=!0){e.set(se,t?`true`:`false`)}function le(e){let t=[];function n(e){for(let r of e.children)r.isAdornment||(t.push(r),n(r))}return n(e),t}function ue(e){return e.father?e.father.children.filter(t=>t!==e&&!t.isAdornment):[]}function de(e){let t=[],n=e.father;for(;n!==null&&n.father!==null;)t.push(n),n=n.father;return t}function fe(e){if(e.son)return e.son;if(e.brother)return e.brother;let t=e.father;for(;t!==null&&t.father!==null;){if(t.brother)return t.brother;t=t.father}return null}function pe(e){let t=e.elderBrother;if(t){let e=t;for(;;){let t=e.children.filter(e=>!e.isAdornment);if(t.length===0)break;e=t[t.length-1]}return e}let n=e.father;return!n||n.father===null?null:n}function me(e){let t=new Map;if(e===``)return t;for(let n of e.split(`;`)){let e=n.indexOf(`:`);e===-1?t.set(n,``):t.set(n.slice(0,e),n.slice(e+1))}return t}function M(e,t){if(e.kind===`ident`)switch(e.name){case`children`:return t.children.filter(e=>!e.isAdornment);case`descendants`:return le(t);case`siblings`:return ue(t);case`ancestor`:case`ancestors`:return de(t);case`all`:return t.ht.root?le(t.ht.root):[]}let n=L(e,t),r=t.ht.findNoteByName(P(n));return r?[r]:[]}function N(e,t=2){return String(e).padStart(t,`0`)}function he(e){return`${e.getFullYear()}-${N(e.getMonth()+1)}-${N(e.getDate())} ${N(e.getHours())}:${N(e.getMinutes())}:${N(e.getSeconds())}`}function ge(e){if(!e)return new Date(0);let t=e.replace(` `,`T`),n=new Date(t);return isNaN(n.getTime())?new Date(0):n}var _e=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`],ve=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`];function ye(e,t){return t.replace(`%Y`,String(e.getFullYear())).replace(`%m`,N(e.getMonth()+1)).replace(`%d`,N(e.getDate())).replace(`%H`,N(e.getHours())).replace(`%M`,N(e.getMinutes())).replace(`%S`,N(e.getSeconds())).replace(`%A`,_e[e.getDay()]).replace(`%B`,ve[e.getMonth()])}function P(e){switch(e.kind){case`string`:return e.value;case`number`:return be(e.value);case`boolean`:return e.value?`true`:`false`;case`date`:return he(e.value);case`list`:return e.value.join(`;`);case`dict`:return[...e.value.entries()].map(([e,t])=>`${e}:${t}`).join(`;`);case`color`:return e.value;case`interval`:return String(e.value)}}function be(e){return String(e)}function F(e){switch(e.kind){case`number`:return e.value;case`string`:return parseFloat(e.value)||0;case`boolean`:return+!!e.value;default:return 0}}function xe(e){switch(e.kind){case`boolean`:return e.value;case`number`:return e.value!==0;case`string`:return e.value!==``&&e.value!==`false`&&e.value!==`0`;default:return!1}}function I(e){if(e.kind===`number`)return e.value;if(e.kind===`string`){if(e.value===``)return null;let t=parseFloat(e.value);return isNaN(t)?null:t}return null}function Se(e,t,n){if(e.kind===`ident`)switch(e.name){case`parent`:return t.father;case`firstChild`:return t.son;case`lastChild`:{let e=t.children.filter(e=>!e.isAdornment);return e.length>0?e[e.length-1]:null}case`nextSibling`:case`nextSiblingItem`:return t.brother;case`prevSibling`:case`previousSibling`:case`prevSiblingItem`:case`previousSiblingItem`:return t.elderBrother;case`.`:case`this`:return t;case`..`:return t.father;case`grandparent`:{let e=t.father;if(!e||e.father===null)return null;let n=e.father;return!n||n.father===null?null:n}case`child`:return t.son;case`firstSibling`:return t.father?t.father.son:null;case`lastSibling`:{if(!t.father)return null;let e=t.father.children.filter(e=>!e.isAdornment);return e.length>0?e[e.length-1]:null}case`cover`:return t.ht.root?t.ht.root.son:null;case`next`:return fe(t);case`nextItem`:return fe(t);case`previous`:return pe(t);case`previousItem`:return pe(t);case`randomChild`:case`randomchild`:{let e=t.children.filter(e=>!e.isAdornment);return e.length===0?t:e[Math.floor(Math.random()*e.length)]}case`that`:{let e=n?.get(`__that__`);return e===void 0?null:t.ht.findNoteById(parseInt(e,10))}case`agent`:{let e=n?.get(`__agent__`);return!e||!t?null:t.ht.findNoteById(parseInt(e,10))}default:return t.ht.findNoteByName(e.name)}if(e.kind===`literal`&&e.litKind===`string`)return t.ht.findNoteByName(e.value);let r=L(e,t,n);return t.ht.findNoteByName(P(r))}function L(e,t,n){switch(e.kind){case`literal`:switch(e.litKind){case`string`:return{kind:`string`,value:e.value};case`number`:return{kind:`number`,value:parseFloat(e.value)};case`boolean`:return{kind:`boolean`,value:e.value===`true`}}case`attrRef`:{if(!t)return{kind:`string`,value:``};let r=e.designator?Se(e.designator,t,n):t;if(!r)return{kind:`string`,value:``};let a=r.get(e.name),o=r.ht.getAttribute(e.name)?.type;return o===i.Set||o===i.List?{kind:`list`,value:a===``?[]:a.split(`;`)}:o===i.Dictionary?{kind:`dict`,value:me(a)}:{kind:`string`,value:a}}case`ident`:if(e.name===`now`)return{kind:`date`,value:new Date};if(e.name===`today`){let e=new Date;return e.setHours(0,0,0,0),{kind:`date`,value:e}}return n?.has(e.name)?{kind:`string`,value:n.get(e.name)}:t?{kind:`string`,value:t.get(e.name)}:{kind:`string`,value:e.name};case`unary`:{let r=L(e.arg,t,n);switch(e.op){case`-`:return{kind:`number`,value:-F(r)};case`!`:return{kind:`boolean`,value:!xe(r)};default:throw Error(`Unknown unary operator: ${e.op}`)}}case`binary`:{let r=L(e.left,t,n),i=L(e.right,t,n);switch(e.op){case`+`:{if(r.kind===`list`&&i.kind===`list`)return{kind:`list`,value:[...r.value,...i.value]};if(r.kind===`date`&&i.kind===`interval`)return{kind:`date`,value:new Date(r.value.getTime()+i.value*1e3)};let e=I(r),t=I(i);return e!==null&&t!==null?{kind:`number`,value:e+t}:{kind:`string`,value:P(r)+P(i)}}case`-`:return r.kind===`date`&&i.kind===`interval`?{kind:`date`,value:new Date(r.value.getTime()-i.value*1e3)}:r.kind===`date`&&i.kind===`date`?{kind:`interval`,value:(r.value.getTime()-i.value.getTime())/1e3}:{kind:`number`,value:F(r)-F(i)};case`*`:return{kind:`number`,value:F(r)*F(i)};case`/`:return{kind:`number`,value:F(r)/F(i)};case`<`:case`<=`:case`>`:case`>=`:{let t=I(r),n=I(i),a=t!==null&&n!==null?t-n:P(r).localeCompare(P(i));return{kind:`boolean`,value:Ce(e.op,a)}}case`==`:{let e=I(r),t=I(i);return e!==null&&t!==null?{kind:`boolean`,value:e===t}:{kind:`boolean`,value:P(r)===P(i)}}case`!=`:{let e=I(r),t=I(i);return e!==null&&t!==null?{kind:`boolean`,value:e!==t}:{kind:`boolean`,value:P(r)!==P(i)}}case`&`:return{kind:`boolean`,value:xe(r)&&xe(i)};case`|`:return{kind:`boolean`,value:xe(r)||xe(i)};default:throw Error(`Unknown binary operator: ${e.op}`)}}case`call`:return Ne(e.name,e.args,t,n);case`dot`:return Pe(L(e.left,t,n),e.method,e.args,t,n);case`subscript`:{let r=L(e.left,t,n),i=P(L(e.key,t,n));if(r.kind===`dict`)return{kind:`string`,value:r.value.get(i)??``};if(r.kind===`list`){let e=parseInt(i,10);return{kind:`string`,value:r.value[e]??``}}return{kind:`string`,value:``}}case`dotEachLine`:case`dotBlock`:return{kind:`string`,value:``}}}function Ce(e,t){switch(e){case`<`:return t<0;case`<=`:return t<=0;case`>`:return t>0;case`>=`:return t>=0;default:return!1}}function we(e,t){let n=new Map(t);return n.set(`__that__`,String(e.id)),n}function Te(e){return e.kind===`ident`&&(e.name===`children`||e.name===`descendants`||e.name===`siblings`||e.name===`ancestor`||e.name===`ancestors`||e.name===`all`)}function Ee(e){switch(e){case i.String:return`string`;case i.Color:return`color`;case i.Number:return`number`;case i.File:return`file`;case i.Boolean:return`boolean`;case i.Date:return`date`;case i.Alias:return`alias`;case i.Action:return`action`;case i.Set:return`set`;case i.URL:return`url`;case i.List:return`list`;case i.Font:return`font`;case i.Interval:return`interval`;case i.Dictionary:return`dictionary`;default:return`string`}}function De(e){let t=e.id;function n(e){for(let r of e.children)r.id>t&&(t=r.id),n(r)}return n(e),t}function Oe(e,t){let n=e.children;if(n.length===0)e.son=t;else{let e=n[n.length-1];e.brother=t,t.elderBrother=e}}function ke(e,t,n,r){if(!t||e.length<1)return{kind:`string`,value:``};let i=n.str(e[0]);if(!i)return{kind:`string`,value:``};let a,o;if(e.length>=2)o=i,a=R(n.str(e[1]),t);else if(i.startsWith(`/`)){let e=i.lastIndexOf(`/`);o=i.slice(e+1),a=R(i.slice(0,e)||`/`,t)}else o=i,a=t;if(!a||!o)return{kind:`string`,value:``};let s=a.children.find(e=>e.name===o);if(s)return{kind:`string`,value:s.get(`Path`)};let c=r(De(t.ht.root)+1,o,a,t.ht);return Oe(a,c),{kind:`string`,value:c.get(`Path`)}}function Ae(e){if(!e.isAlias)for(let t of[...e.aliases])Ae(t);for(let t of[...e.children])Ae(t);if(e.ht.links=e.ht.links.filter(t=>t.src!==e&&t.dest!==e),e.isAlias){let t=e.original;t.aliases=t.aliases.filter(t=>t!==e)}e.unhook()}function R(e,t){if(!e)return null;if(e.startsWith(`/`)){let n=e.slice(1).split(`/`).filter(e=>e!==``);if(n.length===0)return t.ht.root;let r=t.ht.root;for(let e of n)r=r?r.children.find(t=>t.name===e)??null:null;return r}return t.ht.findNoteByName(e)}function je(e,t){return!e||e.father!==t.father||e.isAdornment?!1:oe(e).intersects(oe(t))}var Me=class e{constructor(e,t){this.note=e,this.locals=t}eval(e){return L(e,this.note,this.locals)}str(e){return P(this.eval(e))}num(e){return F(this.eval(e))}bool(e){return xe(this.eval(e))}bind(t){return new e(t,this.locals)}inner(){return this.note?new e(this.note,we(this.note,this.locals)):this}};function Ne(e,i,a,o){let s=new Me(a,o);switch(e){case`count`:return a?{kind:`number`,value:M(i[0],a).length}:{kind:`number`,value:0};case`sum`:{if(!a)return{kind:`number`,value:0};let e=M(i[0],a),t=s.inner();return{kind:`number`,value:e.reduce((e,n)=>e+t.bind(n).num(i[1]),0)}}case`avg`:{if(!a)return{kind:`number`,value:0};let e=M(i[0],a);if(e.length===0)return{kind:`number`,value:0};let t=s.inner();return{kind:`number`,value:e.reduce((e,n)=>e+t.bind(n).num(i[1]),0)/e.length}}case`min`:{if(!Te(i[0]))return{kind:`number`,value:Math.min(s.num(i[0]),s.num(i[1]))};if(!a)return{kind:`number`,value:0};let e=M(i[0],a);if(e.length===0)return{kind:`number`,value:0};let t=s.inner();return{kind:`number`,value:Math.min(...e.map(e=>t.bind(e).num(i[1])))}}case`max`:{if(!Te(i[0]))return{kind:`number`,value:Math.max(s.num(i[0]),s.num(i[1]))};if(!a)return{kind:`number`,value:0};let e=M(i[0],a);if(e.length===0)return{kind:`number`,value:0};let t=s.inner();return{kind:`number`,value:Math.max(...e.map(e=>t.bind(e).num(i[1])))}}case`collect`:{if(!a)return{kind:`list`,value:[]};let e=s.inner();return{kind:`list`,value:M(i[0],a).map(t=>e.bind(t).str(i[1]))}}case`collect_if`:{if(!a)return{kind:`list`,value:[]};let e=s.inner();return{kind:`list`,value:M(i[0],a).filter(t=>e.bind(t).bool(i[1])).map(t=>e.bind(t).str(i[2]))}}case`count_if`:{if(!a)return{kind:`number`,value:0};let e=s.inner();return{kind:`number`,value:M(i[0],a).filter(t=>e.bind(t).bool(i[1])).length}}case`sum_if`:{if(!a)return{kind:`number`,value:0};let e=s.inner();return{kind:`number`,value:M(i[0],a).filter(t=>e.bind(t).bool(i[1])).reduce((t,n)=>t+e.bind(n).num(i[2]),0)}}case`every`:{if(!a)return{kind:`boolean`,value:!0};let e=s.inner();return{kind:`boolean`,value:M(i[0],a).every(t=>e.bind(t).bool(i[1]))}}case`any`:{if(!a)return{kind:`boolean`,value:!1};let e=s.inner();return{kind:`boolean`,value:M(i[0],a).some(t=>e.bind(t).bool(i[1]))}}case`abs`:return{kind:`number`,value:Math.abs(s.num(i[0]))};case`round`:return{kind:`number`,value:Math.round(s.num(i[0]))};case`floor`:return{kind:`number`,value:Math.floor(s.num(i[0]))};case`ceil`:return{kind:`number`,value:Math.ceil(s.num(i[0]))};case`sqrt`:return{kind:`number`,value:Math.sqrt(s.num(i[0]))};case`log`:return{kind:`number`,value:Math.log(s.num(i[0]))};case`exp`:return{kind:`number`,value:Math.exp(s.num(i[0]))};case`rand`:return{kind:`number`,value:Math.random()};case`pow`:return{kind:`number`,value:s.num(i[0])**+s.num(i[1])};case`mod`:return{kind:`number`,value:s.num(i[0])%s.num(i[1])};case`now`:return{kind:`date`,value:new Date};case`today`:{let e=new Date;return e.setHours(0,0,0,0),{kind:`date`,value:e}}case`date`:return i.length>=3?{kind:`date`,value:new Date(s.num(i[0]),s.num(i[1])-1,s.num(i[2]),i.length>=5?s.num(i[3]):0,i.length>=5?s.num(i[4]):0,0)}:{kind:`date`,value:ge(s.str(i[0]))};case`seconds`:return{kind:`interval`,value:s.num(i[0])};case`minutes`:return{kind:`interval`,value:s.num(i[0])*60};case`hours`:return{kind:`interval`,value:s.num(i[0])*3600};case`days`:return{kind:`interval`,value:s.num(i[0])*86400};case`weeks`:return{kind:`interval`,value:s.num(i[0])*604800};case`years`:return{kind:`interval`,value:s.num(i[0])*365*86400};case`attribute`:{if(!a)return{kind:`dict`,value:new Map};let e=s.str(i[0]),t=a.ht.getAttribute(e);return t?{kind:`dict`,value:new Map([[`type`,Ee(t.type)],[`default`,t.default],[`category`,t.parent],[`suggested`,``],[`description`,``],[`sequential`,``],[`lines`,`1`],[`readonly`,``]])}:{kind:`dict`,value:new Map}}case`number`:return{kind:`number`,value:s.num(i[0])};case`string`:return{kind:`string`,value:s.str(i[0])};case`boolean`:return{kind:`boolean`,value:s.bool(i[0])};case`find`:{if(!a)return{kind:`list`,value:[]};let e=a.ht.root;if(!e)return{kind:`list`,value:[]};let t=s.inner();return{kind:`list`,value:le(e).filter(e=>t.bind(e).bool(i[0])).map(e=>e.get(`Path`))}}case`format`:{if(i.length===0)return{kind:`string`,value:``};let e=s.eval(i[0]);if(e.kind===`date`)return i.length<2?{kind:`string`,value:``}:{kind:`string`,value:ye(e.value,s.str(i[1]))};if(e.kind===`list`){let t=e.value;if(i.length>=5){let e=s.str(i[1]),n=s.str(i[2]),r=s.str(i[3]),a=s.str(i[4]);return{kind:`string`,value:e+t.map(e=>n+e+r).join(``)+a}}return i.length>=2?{kind:`string`,value:t.join(s.str(i[1]))}:{kind:`string`,value:t.join(`;`)}}let t=F(e);if(i.length<2)return{kind:`string`,value:String(t)};let n=s.str(i[1]);if(n===`X`)return{kind:`string`,value:Fe(Math.floor(t))};if(n===`l`||n===`L`)return{kind:`string`,value:t.toLocaleString()};if(n===`$`)return{kind:`string`,value:t.toLocaleString(void 0,{style:`currency`,currency:`USD`})};let r=parseInt(n,10);if(isNaN(r))return{kind:`string`,value:String(t)};let a=t.toFixed(r);if(i.length>=3){let e=Math.round(s.num(i[2])),t=i.length>=4?s.str(i[3])[0]??` `:` `;return{kind:`string`,value:a.padStart(e,t)}}return{kind:`string`,value:a}}case`create`:return ke(i,a,s,(e,n,r,i)=>new t(e,n,``,!1,new Map,r,null,null,null,i));case`createAgent`:return ke(i,a,s,(e,t,n,i)=>new r(e,t,``,!1,new Map,n,null,null,null,i));case`createAdornment`:return ke(i,a,s,(e,n,r,i)=>new t(e,n,``,!1,new Map,r,null,null,null,i,!0));case`delete`:{if(!a||i.length<1)return{kind:`string`,value:``};let e=s.str(i[0]);if(!e)return{kind:`string`,value:``};let t;if(i.length>=2){let n=R(e,a),r=s.str(i[1]);t=n?.children.find(e=>e.name===r)??null}else t=R(e,a);return!t||t===a.ht.root||Ae(t),{kind:`string`,value:``}}case`inside`:{if(!a||i.length<1)return{kind:`boolean`,value:!1};let e=R(s.str(i[0]),a);if(!e||e===a)return{kind:`boolean`,value:!1};if(e.isAdornment)return{kind:`boolean`,value:je(a,e)||je(a.getOriginal(),e)};if(a.father===e)return{kind:`boolean`,value:!0};let t=a.getOriginal();return t.father===e||t.aliases.some(t=>t.father===e)?{kind:`boolean`,value:!0}:{kind:`boolean`,value:!1}}case`createAlias`:{if(!a||i.length<2)return{kind:`string`,value:``};let e=s.str(i[0]),t=s.str(i[1]),r=R(e,a);if(!r)return{kind:`string`,value:``};let o=R(t,a);if(!o)return{kind:`string`,value:``};o=o.getOriginal();let c=r.children.find(e=>e.isAlias&&e.original===o);if(c)return{kind:`string`,value:c.get(`Path`)};let l=new n(o,De(a.ht.root)+1,new Map,r,null,null,a.ht);return Oe(r,l),o.aliases.push(l),{kind:`string`,value:l.get(`Path`)}}default:return{kind:`string`,value:``}}}function Pe(e,t,n,r,i){let a=new Me(r,i);if(e.kind===`date`){let r=e.value;switch(t){case`year`:return{kind:`number`,value:r.getFullYear()};case`month`:return{kind:`number`,value:r.getMonth()+1};case`day`:return{kind:`number`,value:r.getDate()};case`hour`:return{kind:`number`,value:r.getHours()};case`minute`:return{kind:`number`,value:r.getMinutes()};case`second`:return{kind:`number`,value:r.getSeconds()};case`weekday`:return{kind:`number`,value:r.getDay()};case`format`:return{kind:`string`,value:ye(r,a.str(n[0]))};default:return{kind:`string`,value:``}}}if(e.kind===`list`)switch(t){case`count`:return{kind:`number`,value:e.value.length};case`contains`:return{kind:`boolean`,value:e.value.includes(a.str(n[0]))};case`sort`:return{kind:`list`,value:[...e.value].sort()};case`unique`:{let t=new Set;return{kind:`list`,value:e.value.filter(e=>t.has(e)?!1:(t.add(e),!0))}}default:return{kind:`string`,value:``}}if(e.kind===`dict`)switch(t){case`count`:return{kind:`number`,value:e.value.size};case`contains`:return{kind:`boolean`,value:e.value.has(a.str(n[0]))};case`keys`:return{kind:`list`,value:[...e.value.keys()]};case`values`:return{kind:`list`,value:[...e.value.values()]};default:return{kind:`string`,value:``}}let o=P(e);switch(t){case`failed`:return{kind:`boolean`,value:ce(i)};case`size`:return{kind:`number`,value:o.length};case`uppercase`:return{kind:`string`,value:o.toUpperCase()};case`lowercase`:return{kind:`string`,value:o.toLowerCase()};case`capitalize`:return{kind:`string`,value:o.length===0?``:o[0].toUpperCase()+o.slice(1)};case`trim`:return{kind:`string`,value:o.trim()};case`wordCount`:{let e=o.trim();return{kind:`number`,value:e===``?0:e.split(/\s+/).length}}case`contains`:{let e=a.str(n[0]);try{return{kind:`boolean`,value:new RegExp(e).test(o)}}catch{return{kind:`boolean`,value:o.includes(e)}}}case`icontains`:{let e=a.str(n[0]);try{return{kind:`boolean`,value:new RegExp(e,`i`).test(o)}}catch{return{kind:`boolean`,value:o.toLowerCase().includes(e.toLowerCase())}}}case`beginsWith`:return{kind:`boolean`,value:o.startsWith(a.str(n[0]))};case`endsWith`:return{kind:`boolean`,value:o.endsWith(a.str(n[0]))};case`split`:return{kind:`list`,value:o.split(a.str(n[0]))};case`substr`:{let e=o.length,t=a.num(n[0]);if(t<0&&(t=e+t),t<0&&(t=0),t>e&&(t=e),n.length>=2){let r=a.num(n[1]);return r<0&&(r=e-t+r),r+t>e&&(r=e-t),r<0&&(r=0),{kind:`string`,value:o.slice(t,t+r)}}return{kind:`string`,value:o.slice(t)}}case`indexOf`:return{kind:`number`,value:o.indexOf(a.str(n[0]))};case`at`:{let e=a.num(n[0]),t=o.length,r=e<0?t+e:e;return r<0||r>=t?{kind:`string`,value:``}:{kind:`string`,value:o[r]}}case`replace`:{let e=a.str(n[0]),t=a.str(n[1]);try{return{kind:`string`,value:o.replace(new RegExp(e,`g`),t)}}catch{return{kind:`string`,value:``}}}case`replaceAll`:{let e=a.str(n[0]),t=a.str(n[1]),r=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return{kind:`string`,value:o.replace(new RegExp(r,`g`),t)}}case`format`:return{kind:`string`,value:Ie(o,a.eval(n[0]))};case`skipWhitespace`:{let e=o.search(/\S/);return{kind:`string`,value:e===-1?``:o.slice(e)}}case`skipLine`:{if(o.length===0)return i&&j(i),{kind:`string`,value:``};let e=o.indexOf(`
|
|
3
|
+
`);return{kind:`string`,value:e===-1?``:o.slice(e+1)}}case`skip`:{let e=Math.round(a.num(n[0]));return e>o.length?(i&&j(i),{kind:`string`,value:``}):{kind:`string`,value:o.slice(e)}}case`skipTo`:{let e=a.str(n[0]),t=o.indexOf(e);return t===-1?(i&&j(i),{kind:`string`,value:``}):{kind:`string`,value:o.slice(t+e.length)}}case`skipToNumber`:{let e=o.match(/[0-9]/);if(!e||e.index===void 0)return i&&j(i),{kind:`string`,value:``};let t=e.index;return t>0&&(o[t-1]===`-`||o[t-1]===`+`)&&t--,{kind:`string`,value:o.slice(t)}}case`expect`:{let e=a.str(n[0]);return o.startsWith(e)?{kind:`string`,value:o.slice(e.length)}:(i&&j(i),{kind:`string`,value:``})}case`expectWhitespace`:{if(o.length===0||!/^\s/.test(o))return i&&j(i),{kind:`string`,value:``};let e=o.search(/\S/);return{kind:`string`,value:e===-1?``:o.slice(e)}}case`expectNumber`:{let e=o.match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);return e?{kind:`string`,value:o.slice(e[0].length)}:(i&&j(i),{kind:`string`,value:``})}case`expectWord`:{if(o.length===0||/^[\s\d\p{P}]/u.test(o))return i&&j(i),{kind:`string`,value:``};let e=o.match(/[\s\d\p{P}]/u)?.index??o.length;return{kind:`string`,value:o.slice(e)}}case`captureRest`:return B(z(n[0]),o,r,i),{kind:`string`,value:``};case`captureLine`:{if(o.length===0)return i&&j(i),{kind:`string`,value:``};let e=o.indexOf(`
|
|
4
|
+
`),t=z(n[0]);return e===-1?(B(t,o,r,i),{kind:`string`,value:``}):(B(t,o.slice(0,e),r,i),{kind:`string`,value:o.slice(e+1)})}case`captureWord`:{if(o.length===0||/^[\s\d\p{P}]/u.test(o))return i&&j(i),{kind:`string`,value:``};let e=o.match(/[\s\d\p{P}]/u)?.index??o.length;return B(z(n[0]),o.slice(0,e),r,i),{kind:`string`,value:o.slice(e)}}case`captureNumber`:{let e=o.match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);return e?(B(z(n[0]),e[0],r,i),{kind:`string`,value:o.slice(e[0].length)}):(i&&j(i),{kind:`string`,value:``})}case`captureToken`:{if(o.length===0)return i&&j(i),{kind:`string`,value:``};let e=o.match(/\s/)?.index??o.length;return B(z(n[0]),o.slice(0,e),r,i),{kind:`string`,value:o.slice(e)}}case`captureTo`:{let e=a.str(n[0]),t=z(n[1]),s=-1;for(let t=0;t<o.length;t++)if(e.includes(o[t])){s=t;break}return s===-1?(B(t,o,r,i),{kind:`string`,value:``}):(B(t,o.slice(0,s),r,i),{kind:`string`,value:o.slice(s+1)})}default:return{kind:`string`,value:``}}}function z(e){return e.kind===`attrRef`||e.kind===`ident`?e.name:``}function B(e,t,n,r){r?.has(e)?r.set(e,t):n&&n.attributes.set(e,t)}function Fe(e){if(e<=0)return``;let t=[1e3,900,500,400,100,90,50,40,10,9,5,4,1],n=[`M`,`CM`,`D`,`CD`,`C`,`XC`,`L`,`XL`,`X`,`IX`,`V`,`IV`,`I`],r=``;for(let i=0;i<t.length;i++)for(;e>=t[i];)r+=n[i],e-=t[i];return r}function Ie(e,t){return e.replace(/%(\.\d+)?([dfs])/g,(e,n,r)=>{switch(r){case`d`:return String(Math.trunc(F(t)));case`f`:{let e=F(t);if(n){let t=parseInt(n.slice(1),10);return e.toFixed(t)}return String(e)}case`s`:return P(t);default:return e}})}var Le=class extends a{resolve(e,t){let n=(e.attributes.get(`DisplayExpression`)??``).trim();if(!n)return e.get(`Name`);try{return P(L(ie(n),e))}catch{return e.get(`Name`)}}};S.DisplayName=Le;var Re=class{constructor(e=null,t=new Map,n=[],r=new T([]),i=new Map,a=new Map){this.root=e,this.links=n,this.colors=r,this.linkTypes=i,this.preferences=a,this.attributes=this.initSystemAttributes();for(let[e,n]of t)this.attributes.set(e,n)}initSystemAttributes(){let e=new Map,t=(t,n,r=a)=>e.set(t,new r({name:t,parent:``,type:n,editable:!1,visibleInEditor:!0,canInherit:!1,default:``,lines:1}));t(`Name`,i.String),t(`AgentQuery`,i.Action),t(`AgentAction`,i.Action),t(`IsAgent`,i.Boolean),t(`DisplayExpression`,i.Action),t(`DisplayName`,i.String,Le);for(let[e,n]of Object.entries(S))t(e,i.String,n);return e}getAttribute(e){return this.attributes.get(e)}findNoteById(e,t=this.root){return t?t.id===e?t:this.findNoteById(e,t.son)??this.findNoteById(e,t.brother):null}findNoteByName(e,t=this.root?.son??null){return t?t.name===e?t:this.findNoteByName(e,t.son)??this.findNoteByName(e,t.brother):null}findNote(e){return e.startsWith(`/`)?this.findNoteByPath(e)??this.findNoteByName(e):this.findNoteByName(e)}findNoteByPath(e){let t=e.replace(/^\//,``).split(`/`).filter(Boolean);if(t.length===0)return null;let n=this.root?.son??null,r=null;for(let e of t){r=null;let t=n;for(;t;){if(t.name===e){r=t;break}t=t.brother}if(!r)return null;n=r.son}return r}};function ze(e){let t=e.trim();return t===``?{kind:`always`}:t.startsWith(`guard(`)&&t.endsWith(`)`)?new He(t.slice(6,-1)).parseExpr():t.startsWith(`unvisited`)||t.startsWith(`visited`)?Be(t):{kind:`always`}}function Be(e){let t=e.indexOf(`(`),n,r;if(t===-1)n=e,r=null;else{if(!e.endsWith(`)`))return{kind:`always`};n=e.slice(0,t).trim(),r=e.slice(t+1,-1).trim()}if(n!==`unvisited`&&n!==`visited`)return{kind:`always`};let i;return i=!r||r===`destination`?{kind:`visited-dest`}:r.startsWith(`"`)&&r.endsWith(`"`)?{kind:`visited`,name:r.slice(1,-1)}:{kind:`visited`,name:r.startsWith(`/`)?r.slice(1):r},n===`visited`?i:{kind:`not`,expr:i}}var Ve=new Set([...`&|~()"`]),He=class{constructor(e){this.s=e,this.pos=0}parseExpr(){let e=this.parseTerm();for(;this.skip(),!(this.pos>=this.s.length||this.s[this.pos]!==`|`);)this.pos++,e={kind:`or`,left:e,right:this.parseTerm()};return e}parseTerm(){let e=this.parseFactor();for(;this.skip(),!(this.pos>=this.s.length||this.s[this.pos]!==`&`);)this.pos++,e={kind:`and`,left:e,right:this.parseFactor()};return e}parseFactor(){return this.skip(),this.s[this.pos]===`~`?(this.pos++,{kind:`not`,expr:this.parseFactor()}):this.parsePrimary()}parsePrimary(){this.skip();let e=this.s[this.pos];if(e===`(`){this.pos++;let e=this.parseExpr();return this.skip(),this.s[this.pos]===`)`&&this.pos++,e}return e===`?`?(this.pos++,{kind:`random`}):e===`*`?(this.pos++,{kind:`always`}):e===`"`?this.parseQuoted():this.parseBareWord()}parseQuoted(){this.pos++;let e=this.pos;for(;this.pos<this.s.length&&this.s[this.pos]!==`"`;)this.pos++;let t=this.s.slice(e,this.pos);return this.s[this.pos]===`"`&&this.pos++,{kind:`visited`,name:t}}parseBareWord(){let e=this.pos;for(;this.pos<this.s.length&&!Ve.has(this.s[this.pos]);)this.pos++;let t=this.s.slice(e,this.pos).trim();return t?{kind:`word`,name:t}:{kind:`always`}}skip(){for(;this.pos<this.s.length&&(this.s[this.pos]===` `||this.s[this.pos]===` `);)this.pos++}};function Ue(e,t,n,r=null){let i=e=>[...n].some(t=>t.name===e),a=e=>Ue(e,t,n,r);switch(e.kind){case`always`:return!0;case`random`:return Math.random()<.5;case`visited`:return i(e.name);case`word`:return r===`\0wildcard`||e.name===r;case`visited-dest`:return i(t);case`not`:return!a(e.expr);case`and`:return a(e.left)&&a(e.right);case`or`:return a(e.left)||a(e.right)}}var We=class{constructor(e,t,n,r,i,a,o,s){this.src=e,this.dest=t,this.name=n,this.srcSpan=r,this.destSpan=i,this.guard=a,this.url=o,this.title=s}destNote(){return this.dest}destName(){return this.dest?.name??``}isPrototype(){return this.name===`prototype`}isUrlLink(){return this.url!==``}guardSatisfied(e,t){return this.dest?Ue(ze(this.guard),this.dest.name,t,e):!1}};function Ge(e){return new DOMParser().parseFromString(e,`text/xml`)}function Ke(e,t){for(let n of e.children)if(n.tagName===t)return n;return null}function qe(e,t,n,r){for(let i of e.children)if(i.tagName===t&&i.getAttribute(n)===r)return i;return null}function Je(e){return qe(e,`attribute`,`name`,`Name`)?.textContent??``}function Ye(e){let t=new Map;for(let n of e.children)if(n.tagName===`attribute`){let e=n.getAttribute(`name`),r=n.textContent??``;e&&r!==`normal`&&t.set(e,r)}let n=e.getAttribute(`proto`);return n&&t.set(`Prototype`,n),t}function Xe(e){let t=atob(e.replace(/\s/g,``)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);let r=[],i=n.length,a=0;for(;a<i-12;)if(n[a]===137&&n[a+1]===80&&n[a+2]===78&&n[a+3]===71&&n[a+4]===13&&n[a+5]===10&&n[a+6]===26&&n[a+7]===10){let e=a,t=a+8;for(;t<=i-12;){if(n[t]===0&&n[t+1]===0&&n[t+2]===0&&n[t+3]===0&&n[t+4]===73&&n[t+5]===69&&n[t+6]===78&&n[t+7]===68&&n[t+8]===174&&n[t+9]===66&&n[t+10]===96&&n[t+11]===130){let i=t+12,o=``;for(let t=e;t<i;t++)o+=String.fromCharCode(n[t]);r.push(btoa(o)),a=i;break}t++}if(t>i-12)break}else a++;return r}function Ze(e,t){if(!e.includes(`tbx-picture:`))return e;let n=Xe(t);return e.replace(/src="tbx-picture:(\d+)"/g,(e,t)=>{let r=parseInt(t,10);return r<n.length?`src="data:image/png;base64,${n[r]}"`:e})}function Qe(e){let t=Ke(e,`rtfd`),n=Ke(e,`html`)?.textContent??``;n&&t?.textContent&&(n=Ze(n,t.textContent));let r=Ke(e,`text`);return r?.textContent?{text:r.textContent,isRichText:!1,html:n}:t?{text:``,isRichText:!0,html:n}:{text:``,isRichText:!1,html:n}}function $e(e){return parseInt(e.getAttribute(`ID`)??`0`,10)}function et(e,n,r){let{text:i,isRichText:a,html:o}=Qe(e),s=new t($e(e),Je(e),i,a,Ye(e),n,null,null,null,r,!0);return s.html=o,s}function tt(e,n,i){let{text:a,isRichText:o,html:s}=Qe(e),c=Ye(e),l=c.get(`IsAgent`)===`true`?new r($e(e),Je(e),a,o,c,n,null,null,null,i):new t($e(e),Je(e),a,o,c,n,null,null,null,i);l.html=s;let u=Array.from(e.children).filter(e=>e.tagName===`item`||e.tagName===`adornment`),d=null;for(let e of u){let t=e.tagName===`adornment`?et(e,l,i):tt(e,l,i);d===null?l.son=t:(d.brother=t,t.elderBrother=d),d=t}return l}function nt(e,t=new Re){let n=e.querySelector(`item`);return n?tt(n,null,t):null}function rt(e){let t=new Map;for(let n of e.querySelectorAll(`attrib`)){let e=n.getAttribute(`Name`);if(!e)continue;let r=parseInt(n.getAttribute(`type`)??`0`,10),o=S[e]??a;t.set(e,new o({name:e,parent:n.getAttribute(`parent`)??``,type:r in i?r:i.String,editable:n.getAttribute(`editable`)!==`0`,visibleInEditor:n.getAttribute(`visibleInEditor`)!==`0`,canInherit:n.getAttribute(`canInherit`)!==`0`,default:n.getAttribute(`default`)??``,lines:Math.max(1,parseInt(n.getAttribute(`lines`)??`1`,10)||1)}))}return t}function it(e,t){let n=parseInt(e??`-1`,10);return n<0?null:{start:n,length:parseInt(t??`0`,10)}}function at(e){let t=[];for(let n of e.querySelectorAll(`colors > color`)){let e=n.getAttribute(`name`),r=n.getAttribute(`color`);e&&r&&t.push([e,r])}return new T(t)}function ot(e){let t=new Map;for(let n of e.querySelectorAll(`linkTypes > linkType`)){let e=n.getAttribute(`name`);e&&t.set(e,{name:e,visible:n.getAttribute(`visible`)!==`0`,color:n.getAttribute(`colorString`)||`black`,style:parseInt(n.getAttribute(`style`)??`0`,10),arrowType:parseInt(n.getAttribute(`arrowType`)??`0`,10),dotted:!!(parseInt(n.getAttribute(`style`)??`0`,10)&8),dashed:!!(parseInt(n.getAttribute(`style`)??`0`,10)&16)})}return t}function st(e){let t=new Map,n=e.querySelector(`preferences`);if(n)for(let e of n.children){let n=e.textContent;n!==null&&t.set(e.tagName,n.trim())}return t}function ct(e){let t=[];function r(e){for(;e;)e.attributes.has(`Alias`)&&t.push(e),r(e.son),e=e.brother}e.root&&r(e.root.son);for(let r of t){let t=parseInt(r.attributes.get(`Alias`)??`0`,10);if(!t)continue;let i=e.findNoteById(t);if(!i)continue;let a=new Map(r.attributes);a.delete(`Alias`);let o=new n(i,r.id,a,r.father,r.brother,r.elderBrother,e);r.father?.son===r&&(r.father.son=o),r.elderBrother&&(r.elderBrother.brother=o),r.brother&&(r.brother.elderBrother=o),i.aliases.push(o)}}function lt(e){let t=new Re(null,rt(e),[],at(e),ot(e),st(e));t.root=nt(e,t),ct(t);for(let n of e.querySelectorAll(`links > link`)){let e=t.findNoteById(parseInt(n.getAttribute(`sourceid`)??`0`,10));if(!e)continue;let r=t.findNoteById(parseInt(n.getAttribute(`destid`)??`0`,10));t.links.push(new We(e,r,n.getAttribute(`name`)??``,it(n.getAttribute(`sstart`),n.getAttribute(`slen`)),it(n.getAttribute(`dstart`),n.getAttribute(`dlen`)),n.getAttribute(`guard`)??``,n.getAttribute(`URL`)??``,n.getAttribute(`title`)??``))}return t}var ut=class{constructor(e){this.onShow=e,this.currentNote=null,this.history=[],this.visitedNotes=new Set,this.clickedWord=null}show(e){this.currentNote=e,this.visitedNotes.add(e),this.onShow(e)}navigateTo(e){this.currentNote!==null&&this.history.push(this.currentNote),this.show(e)}goBack(){let e=this.history.pop();e&&this.show(e)}reset(){this.currentNote=null,this.history=[],this.visitedNotes.clear(),this.clickedWord=null}recordWord(e){this.clickedWord=e.replace(/ /g,` `),this.followGuardLink()}enterKey(){this.clickedWord=``,this.followGuardLink()}followGuardLink(){if(this.currentNote){for(let e of this.currentNote.outboundPlainLinks())if(e.guardSatisfied(this.clickedWord,this.visitedNotes)){this.navigateTo(e.destNote());return}}}truncateVisitedAt(e){let t=[...this.visitedNotes],n=t.indexOf(e);if(n!==-1)for(let e=n+1;e<t.length;e++)this.visitedNotes.delete(t[e]);this.history=this.history.filter(e=>this.visitedNotes.has(e))}},dt=class{constructor(e){this.currentNote=null,this.viewRoot=null,this.container=e}get el(){return this.container}willRender(e){}scrollToSelected(){}onArrow(e){return!1}getViewRoot(){return this.viewRoot}hoistTo(e,t){this.viewRoot=e,this.render(t)}};function V(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`)}function ft(e){return e.ht.links.filter(t=>t.src===e&&t.srcSpan!==null).flatMap(e=>{let t={start:e.srcSpan.start,length:e.srcSpan.length};if(e.url)return[{...t,type:`url`,href:e.url,title:e.title}];let n=e.dest?.path??``;return n?[{...t,type:`note`,destPath:n}]:[]})}function pt(e,t){let n=0;for(;n<=e.length-t.length;)if(e[n]===`<`){let t=e.indexOf(`>`,n);n=t===-1?e.length:t+1}else if(e.startsWith(t,n))return n;else n++;return-1}function mt(e,t,n){if(!n.length)return e;let r=[...n].sort((e,t)=>t.start-e.start);for(let n of r){let r=t.slice(n.start,n.start+n.length).replace(/<[^>]+>/g,``);if(!r)continue;let i=pt(e,r);if(i===-1)continue;let a;a=n.type===`url`?`<a href="${V(n.href)}" target="_blank" class="tbx-url"${n.title?` title="${V(n.title)}"`:``}>`:`<a data-dest="${V(n.destPath)}">`,e=e.slice(0,i)+a+r+`</a>`+e.slice(i+r.length)}return e}function ht(e,t){let n=[...t].sort((e,t)=>e.start-t.start),r=[[]],i=0;function a(e,t){e.split(`
|
|
5
|
+
`).forEach((e,n)=>{if(n>0&&r.push([]),!e)return;let i=V(e).split(`\u2028`).join(`<br>`);r[r.length-1].push(t?t(i):i)})}for(let t of n){t.start>i&&a(e.slice(i,t.start));let n=e.slice(t.start,t.start+t.length);if(t.type===`note`){let e=V(t.destPath);a(n,t=>`<a data-dest="${e}">${t}</a>`)}else{let e=V(t.href),r=t.title?` title="${V(t.title)}"`:``;a(n,t=>`<a href="${e}" target="_blank" class="tbx-url"${r}>${t}</a>`)}i=t.start+t.length}return a(e.slice(i)),r.map(e=>e.join(``)).filter(e=>e!==``).map(e=>`<p>${e}</p>`).join(``)}var gt=`
|
|
6
|
+
#tbx-content { flex: 1; min-height: 8em; padding: 24px 24px 0; overflow-y: auto; }
|
|
7
|
+
#tbx-content * { line-height: 1.4 !important; }
|
|
8
|
+
h1 {
|
|
9
|
+
font-family: var(--tbx-heading-font-family, Helvetica, Arial, sans-serif);
|
|
10
|
+
font-size: 1.1em;
|
|
11
|
+
font-weight: bold;
|
|
12
|
+
text-align: center;
|
|
13
|
+
margin: 0 0 0.75em 0;
|
|
14
|
+
line-height: 1.2 !important;
|
|
15
|
+
}
|
|
16
|
+
p { margin: 0 0 0.8em 0; }
|
|
17
|
+
p:last-child { margin-bottom: 0; }
|
|
18
|
+
a {
|
|
19
|
+
color: var(--tbx-link-color, inherit);
|
|
20
|
+
text-decoration: underline;
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
}
|
|
23
|
+
a.tbx-url { color: var(--tbx-url-color, #2255cc); }
|
|
24
|
+
`,_t=class extends dt{constructor(e,t){super(e),this.onNavigate=t,this.container.addEventListener(`click`,e=>{let n=e.target.closest(`a[data-dest]`);if(!n)return;e.preventDefault(),e.stopPropagation();let r=n.getAttribute(`data-dest`);if(!r||!this.currentNote)return;let i=this.currentNote.ht.findNote(r);i&&t(i)})}render(e){this.currentNote=e;let t=e.get(`NoteCSS`),n=t?`<style>${t}</style>`:``,r=`<h1>${V(e.get(`DisplayName`))}</h1>`,i=e.getColor(`TextBackgroundColor`);if(this.container.style.backgroundColor=i?i.hex:``,e.html){let t=ft(e),i=t.length?mt(e.html,e.text,t):e.html;this.container.innerHTML=n+r+i;return}if(e.isRichText){this.container.innerHTML=n+r+`<em>Rich text content not yet supported.</em>`;return}this.container.innerHTML=n+r+ht(e.text,ft(e))}};function vt(e){return{anchor:{x:e.right,y:(e.top+e.bottom)/2},tx:1,ty:0}}function yt(e){return{anchor:{x:e.left,y:(e.top+e.bottom)/2},tx:-1,ty:0}}function bt(e){return{anchor:{x:(e.left+e.right)/2,y:e.top},tx:0,ty:-1}}function xt(e){return{anchor:{x:(e.left+e.right)/2,y:e.bottom},tx:0,ty:1}}function St(e,t,n,r){if(n)return{src:xt(e),dst:vt(t)};let i=(e.left+e.right)/2,a=(e.top+e.bottom)/2,o=(t.left+t.right)/2,s=(t.top+t.bottom)/2,c=o-i,l=s-a,u=Math.abs(c),d=Math.abs(l),f=u-(e.right-e.left)/2-(t.right-t.left)/2,p=d-(e.bottom-e.top)/2-(t.bottom-t.top)/2,m=f<4*r,h=p<4*r,g=c>0?vt(e):yt(e);if(m&&(g=l>0?xt(e):bt(e)),h&&f<4*r){let n=yt(t),r=xt(e),i=bt(e);n.anchor.y>r.anchor.y?g=r:n.anchor.y<i.anchor.y&&(g=i)}let _=l>0?bt(t):xt(t),v=yt(t),y=vt(t);return m&&(v.anchor.x-g.anchor.x>4*r?_=v:g.anchor.x-y.anchor.x>4*r&&(_=y)),h&&(v.anchor.x-g.anchor.x>0?_=v:g.anchor.x-y.anchor.x>0&&(_=y)),{src:g,dst:_}}function Ct(e,t){let n=Math.hypot(t.anchor.x-e.anchor.x,t.anchor.y-e.anchor.y)/3;return{p0:e.anchor,p1:{x:e.anchor.x+n*e.tx,y:e.anchor.y+n*e.ty},p2:{x:t.anchor.x+n*t.tx,y:t.anchor.y+n*t.ty},p3:t.anchor}}function wt(e){if(e.isPrototype())return!1;let t=e.src.ht.linkTypes.get(e.name);return!(t&&!t.visible)}function Tt(e){let t=e.src.ht.linkTypes.get(e.name)?.color??``;return!t||t===`normal`?`black`:e.src.ht.colors.resolve(t.trim())?.hex??`black`}function Et(e){return e.src.ht.linkTypes.get(e.name)?.dotted??!1}function Dt(e){return e.src.ht.linkTypes.get(e.name)?.dashed??!1}function Ot(e,t,n=8){if(e.length===0)return[];let r=new Set(e.map(e=>e.id)),i=[],a=e[0].ht.links.filter(e=>wt(e)&&e.dest!==null&&!e.isUrlLink());for(let e of a){let a=e.dest;if(!r.has(e.src.id)||!r.has(a.id))continue;let{src:o,dst:s}=St(t.get(e.src.id),t.get(a.id),e.src===a,n),{p0:c,p1:l,p2:u,p3:d}=Ct(o,s);i.push({kind:`full`,p0:c,p1:l,p2:u,p3:d,color:Tt(e),arrowSize:n,dotted:Et(e),dashed:Dt(e)})}let o=new Map;for(let e of a){if(!r.has(e.src.id)||r.has(e.dest.id))continue;let t=o.get(e.src.id);t?t.count++:o.set(e.src.id,{count:1,color:Tt(e)})}for(let[e,{count:r,color:a}]of o){let o=t.get(e),s={x:(o.left+o.right)/2,y:o.bottom},c={x:s.x,y:s.y+4*n};i.push({kind:`out-stub`,from:s,tip:c,count:r,color:a,arrowSize:n,dotted:!1,dashed:!1})}let s=new Map;for(let e of a){if(!r.has(e.dest.id)||r.has(e.src.id))continue;let t=s.get(e.dest.id);t?t.count++:s.set(e.dest.id,{count:1,color:Tt(e)})}for(let[e,{count:r,color:a}]of s){let o=t.get(e),s={x:(o.left+o.right)/2,y:o.top},c={x:s.x,y:s.y-4*n};i.push({kind:`in-stub`,from:c,tip:s,count:r,color:a,arrowSize:n,dotted:!1,dashed:!1})}return i}function H(e){return Math.round(e*100)/100}function kt(e,t,n,r){let i=t.x-e.x,a=t.y-e.y,o=Math.hypot(i,a);if(o<1)return``;let s=i/o,c=a/o,l=-c,u=s,d=t.x-s*r,f=t.y-c*r,p=d+l*r*.4,m=f+u*r*.4,h=d-l*r*.4,g=f-u*r*.4;return`<polygon points="${H(t.x)},${H(t.y)} ${H(p)},${H(m)} ${H(h)},${H(g)}" fill="${n}" opacity="0.7"/>`}function At(e,t,n){return`<circle cx="${H(e)}" cy="${H(t)}" r="8" fill="#777"/><text x="${H(e)}" y="${H(t)}" dy="0.35em" text-anchor="middle" font-size="9" font-family="system-ui,sans-serif" font-variant-numeric="lining-nums" fill="white" font-weight="bold">${n}</text>`}function jt(e,t,n){let r=[];for(let t of e){let e=t.dotted?` stroke-dasharray="3 5"`:t.dashed?` stroke-dasharray="8 5"`:``;if(t.kind===`full`){let{p0:n,p1:i,p2:a,p3:o,color:s,arrowSize:c}=t,l=`M${H(n.x)},${H(n.y)} C${H(i.x)},${H(i.y)} ${H(a.x)},${H(a.y)} ${H(o.x)},${H(o.y)}`;r.push(`<path d="${l}" stroke="${s}" fill="none" stroke-opacity="0.5"${e}/>`),r.push(kt(a,o,s,c))}else{let{from:n,tip:i,count:a,color:o,arrowSize:s}=t;r.push(`<line x1="${H(n.x)}" y1="${H(n.y)}" x2="${H(i.x)}" y2="${H(i.y)}" stroke="${o}" stroke-width="1.5" stroke-opacity="0.7"${e}/>`),r.push(kt(n,i,o,s)),t.kind===`out-stub`?r.push(At(i.x,i.y+4,a)):r.push(At(n.x,n.y-4,a))}}return`<svg width="${t}" height="${n}" overflow="visible" style="position:absolute;top:0;left:0;pointer-events:none;">`+r.join(``)+`</svg>`}var Mt=32,U=16,Nt=new Set([`gradient`,`radial`,`diagonal`,`cylinder`]);function Pt(e,t,n){switch(e){case`gradient`:return`linear-gradient(to bottom, ${t}, ${n})`;case`cylinder`:return`linear-gradient(to bottom, ${t}, ${n} 50%, ${t})`;case`diagonal`:return`linear-gradient(135deg, ${t}, ${n})`;case`radial`:return`radial-gradient(ellipse at center, ${t}, ${n})`;default:return t.hex}}function Ft(e,t,n,r){let i=`<stop offset="0%" stop-color="${n}"/><stop offset="100%" stop-color="${r}"/>`;switch(t){case`gradient`:return{fill:`url(#${e})`,defs:`<defs><linearGradient id="${e}" x1="0" y1="0" x2="0" y2="1">${i}</linearGradient></defs>`};case`cylinder`:return{fill:`url(#${e})`,defs:`<defs><linearGradient id="${e}" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="${n}"/><stop offset="50%" stop-color="${r}"/><stop offset="100%" stop-color="${n}"/></linearGradient></defs>`};case`diagonal`:return{fill:`url(#${e})`,defs:`<defs><linearGradient id="${e}" x1="0" y1="0" x2="1" y2="1">${i}</linearGradient></defs>`};case`radial`:return{fill:`url(#${e})`,defs:`<defs><radialGradient id="${e}" cx="50%" cy="50%" r="70%">${i}</radialGradient></defs>`};default:return{fill:n.hex,defs:``}}}function It(e,t,n,r,i,a,o=0,s=0,c=!1,l=0){switch(e){case`lozenge`:return{kind:`css`,extra:`border-radius:${Math.min(t,n)/2}px;`};case`rounded`:return{kind:`css`,extra:`border-radius:${Math.min(t,n)/16}px;`};case`oval`:return{kind:`css`,extra:`border-radius:50%;`};case`diamond`:return{kind:`svg`,points:`${t/2},0 ${t},${n/2} ${t/2},${n} 0,${n/2}`};case`vertical tag`:{let e=n/4;return c?{kind:`svg`,points:`0,0 ${t},0 ${t},${n-e} ${t/2+e},${n-e} ${t/2},${n} ${t/2-e},${n-e} 0,${n-e}`}:{kind:`svg`,points:`0,${e} ${t/2-e},${e} ${t/2},0 ${t/2+e},${e} ${t},${e} ${t},${n} 0,${n}`}}case`arrow`:{let e=Math.min(n/2,t*.75),r=n*(.1+o*.2),i=e/4*s;return c?{kind:`svg`,points:`0,${r} ${t-e},${r} ${t-e-i},0 ${t},${n/2} ${t-e-i},${n} ${t-e},${n-r} 0,${n-r}`}:{kind:`svg`,points:`${e+i},0 ${e},${r} ${t},${r} ${t},${n-r} ${e},${n-r} ${e+i},${n} 0,${n/2}`}}case`hex`:{let e=Math.min(t/2,n/2);return t>=n?{kind:`svg`,points:`0,${n/2} ${e},0 ${t-e},0 ${t},${n/2} ${t-e},${n} ${e},${n}`}:{kind:`svg`,points:`0,${e} ${t/2},0 ${t},${e} ${t},${n-e} ${t/2},${n} 0,${n-e}`}}case`bubble`:{let e=.17,r=Math.sin(e),i=Math.cos(e),a=.4*n,o=t/2,s=a,l=a*(1+i),u=o*(1-r),d=o*(1+r),f=a*(1+i+.4),p=c?o*1.3:o*.7;return c?{kind:`path`,d:`M${d},${l} A${o},${s} 0 1 0 ${u},${l} L${p},${f} Z`}:{kind:`path`,d:`M${u},${l} A${o},${s} 0 1 1 ${d},${l} L${p},${f} Z`}}case`tag`:case`left tag`:{let e=Math.min(Math.round(n/2),t-5);return{kind:`svg`,points:`${e},0 ${t},0 ${t},${n} ${e},${n} 0,${n/2}`}}case`cloud`:{let e=Math.SQRT2/2,r=t/3,i=n/3,a=t/4,o=n/4;return{kind:`path`,d:`M${r*(1-e)},${i*(1+e)} A${r},${i} 0 0 1 ${r*(1+e)},${i*(1-e)} L${t*3/4-a*e},${n/4-o*e} A${a},${o} 0 0 1 ${t*3/4+a*e},${n/4+o*e} L${t*2/3+r*e},${n*2/3-i*e} A${r},${i} 0 0 1 ${t*2/3-r*e},${n*2/3+i*e} L${t/4+a*e},${n*3/4+o*e} A${a},${o} 0 0 1 ${t/4-a*e},${n*3/4-o*e} Z`}}case`leaf`:{let e=-1+o/2,r=-1+o,i=r+s,a=s,u=c?-1:1,d=e=>t/2*(1+u*e),f=e=>n/2*(1+e);return{kind:`path`,d:`M${d(-1)},${f(0)} C${d(e)},${f(-.5)} ${d(e)},${f(-1)} ${d(r)},${f(-1)} C${d(i)},${f(-.95)} ${d(a)},${f(0)} ${d(1)},${f(l)} C${d(a)},${f(0)} ${d(i)},${f(1)} ${d(r)},${f(1)} C${d(e)},${f(1)} ${d(e)},${f(.5)} ${d(-1)},${f(0)} Z`}}default:{let e=Math.min(t/8,16);return i?{kind:`css`,extra:`border-radius:${e}px ${e}px 0 0;`}:r?{kind:`css`,extra:`border-radius:0 0 ${e}px ${e}px;`}:{kind:`css`,extra:``}}}}var Lt=`
|
|
25
|
+
#tbx-outline { overflow-x: auto; }
|
|
26
|
+
.tbx-map-canvas { position: relative; cursor: grab; }
|
|
27
|
+
.tbx-map-canvas.tbx-panning { cursor: grabbing; }
|
|
28
|
+
.tbx-map-note {
|
|
29
|
+
position: absolute;
|
|
30
|
+
border: 1.5px solid currentColor;
|
|
31
|
+
box-sizing: border-box;
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
user-select: none;
|
|
35
|
+
}
|
|
36
|
+
.tbx-map-note:hover { filter: brightness(1.05); }
|
|
37
|
+
.tbx-map-note:not(.tbx-map-container) { display: flex; align-items: center; }
|
|
38
|
+
.tbx-map-note:not(.tbx-map-container) .tbx-map-title { width: 100%; }
|
|
39
|
+
.tbx-map-has-subtitle:not(.tbx-map-container) { flex-direction: column; align-items: stretch; justify-content: flex-start; }
|
|
40
|
+
.tbx-map-adornment:not(.tbx-map-container) { align-items: flex-start; }
|
|
41
|
+
.tbx-map-selected { outline: 3px solid var(--tbx-accent, #2266cc); outline-offset: 2px; animation: tbx-sel-pulse 500ms ease-in-out infinite alternate; }
|
|
42
|
+
.tbx-map-container { border-width: 2px; display: flex; flex-direction: column; }
|
|
43
|
+
.tbx-map-interior { position: relative; z-index: 1; }
|
|
44
|
+
.tbx-map-container:not(.tbx-map-agent) .tbx-map-interior { box-shadow: inset 0 4px 6px rgba(0,0,0,0.14); }
|
|
45
|
+
.tbx-map-agent .tbx-map-interior { box-shadow: inset 0 -4px 6px rgba(0,0,0,0.14); }
|
|
46
|
+
.tbx-map-title {
|
|
47
|
+
font-size: 0.72em;
|
|
48
|
+
font-weight: bold;
|
|
49
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
50
|
+
padding: 0.2em 0.4em;
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
word-break: break-word;
|
|
53
|
+
display: -webkit-box;
|
|
54
|
+
-webkit-box-orient: vertical;
|
|
55
|
+
}
|
|
56
|
+
.tbx-map-subtitle {
|
|
57
|
+
font-size: 0.65em;
|
|
58
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
59
|
+
padding: 0 0.4em 0.2em;
|
|
60
|
+
overflow: hidden;
|
|
61
|
+
word-break: break-word;
|
|
62
|
+
display: -webkit-box;
|
|
63
|
+
-webkit-box-orient: vertical;
|
|
64
|
+
opacity: 0.75;
|
|
65
|
+
}
|
|
66
|
+
`,Rt=class extends dt{constructor(e,t){let n=document.createElement(`div`);n.id=`tbx-map-pane`,n.style.display=`none`,e.appendChild(n),super(n),this.lastClickedId=null,this.scale=Mt,this.renderScheduled=!1,this.onNavigate=t,this.container.addEventListener(`click`,e=>this.handleClick(e)),this.container.addEventListener(`dblclick`,e=>this.handleDblClick(e)),this.container.addEventListener(`mousedown`,e=>this.handleMouseDown(e));let r=this.container.parentElement;document.addEventListener(`wheel`,e=>{e.ctrlKey&&r&&e.composedPath().includes(r)&&this.handleWheel(e)},{passive:!1,capture:!0}),`GestureEvent`in window&&this.registerGestureHandlers(r)}registerGestureHandlers(e){let t=Mt,n=1,r=null,i=0,a=0,o=0,s=0;document.addEventListener(`gesturestart`,c=>{if(!e||!c.composedPath().includes(e))return;c.preventDefault(),t=this.scale,n=Math.max(.01,c.scale??1),r=this.container.querySelector(`.tbx-map-canvas`);let l=e.getBoundingClientRect(),u=c.clientX,d=c.clientY;i=u!=null&&!isNaN(u)?u-l.left:e.clientWidth/2,a=d!=null&&!isNaN(d)?d-l.top:e.clientHeight/2,o=e.scrollLeft,s=e.scrollTop},{passive:!1,capture:!0}),document.addEventListener(`gesturechange`,t=>{if(!e||!t.composedPath().includes(e))return;t.preventDefault();let c=Math.max(.01,t.scale??1)/n;r&&(r.style.transformOrigin=`0 0`,r.style.transform=`scale(${c})`),e.scrollLeft=(o+i)*c-i,e.scrollTop=(s+a)*c-a},{passive:!1,capture:!0}),document.addEventListener(`gestureend`,c=>{if(!e||!c.composedPath().includes(e))return;c.preventDefault();let l=Math.max(.01,c.scale??1)/n;r&&(r.style.transform=``,r.style.transformOrigin=``),this.scale=Math.max(8,Math.min(128,t*l));let u=this.scale/t;e.scrollLeft=(o+i)*u-i,e.scrollTop=(s+a)*u-a,this.doRender()},{passive:!1,capture:!0})}render(e){if(this.currentNote=e,!e){this.container.parentElement?.style.removeProperty(`background`),this.container.innerHTML=``;return}(!this.viewRoot||e.father!==this.viewRoot)&&(this.viewRoot=e.father??e),this.doRender(),this.scrollToSelected()}scrollToSelected(){requestAnimationFrame(()=>{let e=this.container.querySelector(`.tbx-map-selected`),t=this.container.parentElement;if(!e||!t)return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect(),i=n.top-r.top,a=n.left-r.left,o=n.bottom-r.top,s=n.right-r.left,c=0,l=0;a<80?c=a-80:s>t.clientWidth-80&&(c=s-(t.clientWidth-80)),i<80?l=i-80:o>t.clientHeight-80&&(l=o-(t.clientHeight-80)),(c!==0||l!==0)&&t.scrollBy({left:c,top:l,behavior:`smooth`})})}zoom(e){let t=this.container.parentElement;t&&this.applyZoom(e,null,null,t)}applyZoom(e,t,n,r){let i=r.getBoundingClientRect(),a=t===null?r.clientWidth/2:t-i.left,o=n===null?r.clientHeight/2:n-i.top,s=a+r.scrollLeft,c=o+r.scrollTop,l=this.scale;this.scale=Math.max(8,Math.min(128,this.scale*e));let u=this.scale/l;r.scrollLeft=(s-U)*u+U-a,r.scrollTop=(c-U)*u+U-o,this.renderScheduled||(this.renderScheduled=!0,requestAnimationFrame(()=>{this.renderScheduled=!1,this.doRender()}))}doRender(){if(!this.viewRoot){this.container.innerHTML=``;return}let e=this.viewRoot.children.filter(e=>!e.getBoolean(`IsSeparator`)),t=e.filter(e=>e.isAdornment),n=e.filter(e=>!e.isAdornment),r=1/0,i=1/0;for(let t of e)r=Math.min(r,t.getNumber(`Xpos`)),i=Math.min(i,t.getNumber(`Ypos`));isFinite(r)||(r=0,i=0);let a=0,o=0,s=new Map,c=(e,t)=>{let n=(e.getNumber(`Xpos`)-r)*this.scale+U,c=(e.getNumber(`Ypos`)-i)*this.scale+U,l=e.getNumber(`Width`)*this.scale,u=e.getNumber(`Height`)*this.scale;return a=Math.max(a,n+l),o=Math.max(o,c+u),s.set(e.id,{left:n,top:c,right:n+l,bottom:c+u}),this.renderNote(e,n,c,l,u,t)},l=t.map(e=>c(e,e.getNumber(`Opacity`)*.375)).join(``),u=n.map(e=>c(e)).join(``),d=a+U,f=o+U,p=this.viewRoot.ht,m=jt(Ot(n,s,this.scale/4),d,f),h=(e,t)=>p.colors.resolve((e||t).trim())??C.WHITE,g=h(p.preferences.get(`MapBackgroundColorString`)??``,`lighter white`),_=h(p.preferences.get(`MapBackgroundColorString2`)??``,`lighter white`),v=(p.preferences.get(`MapBackgroundPattern`)??`plain`).trim(),y=Nt.has(v)?Pt(v,g,_):g.hex;this.container.parentElement.style.background=y,this.container.innerHTML=`<div class="tbx-map-canvas" style="width:${d}px;height:${f}px;">${l}${m}${u}</div>`}renderNote(e,t,n,r,i,a){let o=e.son!==null,s=e.isAgent,c=o||s,l=e.get(`Subtitle`),u=[`tbx-map-note`,e===this.currentNote?`tbx-map-selected`:``,c?`tbx-map-container`:``,s?`tbx-map-agent`:``,l?`tbx-map-has-subtitle`:``,e.isAdornment?`tbx-map-adornment`:``].filter(Boolean).join(` `),d=e.getNumber(`Base`),f=e.getNumber(`Tip`),p=e.getNumber(`Bend`),m=e.getBoolean(`Direction`),h=It(e.get(`Shape`),r,i,o,s,this.scale,d,f,m,p),g=e.getColor(`Color`),_=e.get(`BorderColor`)===`automatic`?(g??C.WHITE).automaticBorderColor:e.getColor(`BorderColor`)??C.BLACK,v=e.get(`NameColor`)===`automatic`||!e.get(`NameColor`)?(g??C.WHITE).contrastingTextColor:e.getColor(`NameColor`)??C.BLACK,y=e.get(`NameAlignment`)||`left`,b=(e.getNumber(`MapNameSize`)||100)*(e.isAdornment?2:1),x=this.scale/Mt,S=b/100*.72*x*16,w=b/100*.65*x*16,T=`font-size:${(S/16).toFixed(3)}em;`,E=i-.4*S,D=c?2:1/0,O=l?Math.max(1,Math.min(D,Math.min(2,Math.floor(E/3/(1.35*S))))):Math.max(1,Math.min(D,Math.floor(E/(1.35*S)))),k=l?Math.max(0,Math.floor((E-O*1.35*S)/(1.35*w))):0,A=e.get(`Pattern`)||``,ee=e.getColor(`AccentColor`)??C.WHITE,te=``;if(c){let t=e.ht,n=e.get(`MapBackgroundColor`)||(t.preferences.get(`MapBackgroundColorString`)||`lighter white`).trim(),r=t.colors.resolve(n)??C.WHITE,i=(e.get(`MapBackgroundPattern`)||t.preferences.get(`MapBackgroundPattern`)||`plain`).trim(),a=e.get(`MapBackgroundAccentColor`)||(t.preferences.get(`MapBackgroundColorString2`)||`lighter white`).trim(),o=t.colors.resolve(a)??C.WHITE;te=Nt.has(i)?Pt(i,r,o):r.hex}let ne,re;if(h.kind===`css`){let e=g?`background:${Nt.has(A)?Pt(A,g,ee):g};`:``;ne=`${h.extra}border-color:${_};${e}color:${v};`,re=``}else{ne=`border:none;background:none;color:${v};${e.get(`Shape`)===`bubble`?`padding:0 ${r/8}px ${i*.2}px ${r/8}px;`:``}`;let t=c?2:1.5,n=g?g.hex:`none`,a=``;if(g&&Nt.has(A)){let t=Ft(`g${e.id}`,A,g,ee);n=t.fill,a=t.defs}let o=t/2,s=`transform="translate(${o},${o}) scale(${(r-t)/r},${(i-t)/i})"`,l=h.kind===`path`?`<path d="${h.d}" ${s} fill="${n}" stroke="${_}" stroke-width="${t}" stroke-linejoin="round"/>`:`<polygon points="${h.points}" ${s} fill="${n}" stroke="${_}" stroke-width="${t}"/>`;re=`<svg width="${r}" height="${i}" style="position:absolute;top:0;left:0;">`+a+l+`</svg>`}let ie=l&&k>0?`<div class="tbx-map-subtitle" style="position:relative;z-index:1;font-size:${(w/16).toFixed(3)}em;-webkit-line-clamp:${k};">${V(l)}</div>`:``,ae=``;if(c){let e=C.hexToRgb(_.hex),t=e?`rgba(${e[0]},${e[1]},${e[2]},0.5)`:_.hex;ae=s?`border-top:1px solid ${t};`:`border-bottom:1px solid ${t};`}let oe=`<div class="tbx-map-title" style="position:relative;z-index:1;text-align:${y};${T}-webkit-line-clamp:${O};${ae}">${e.isAlias?`<em>${V(e.get(`DisplayName`))}</em>`:V(e.get(`DisplayName`))}</div>`,se=c?`<div class="tbx-map-interior" style="flex:1;background:${te};overflow:hidden;"></div>`:``,ce=a===void 0?``:`opacity:${a};`;return`<div class="${u}" data-id="${e.id}" style="left:${t}px;top:${n}px;width:${r}px;height:${i}px;${ce}${ne}">`+re+(s?se+oe:oe+se)+ie+`</div>`}handleWheel(e){let t=this.container.parentElement;if(!t)return;e.preventDefault();let n=Math.max(.85,Math.min(1.18,Math.exp(-e.deltaY*.01)));this.applyZoom(n,e.clientX,e.clientY,t)}handleMouseDown(e){if(e.target.closest(`[data-id]`))return;let t=this.container.parentElement;if(!t)return;e.preventDefault();let n=this.container.querySelector(`.tbx-map-canvas`);n?.classList.add(`tbx-panning`);let r=e.clientX,i=e.clientY,a=t.scrollLeft,o=t.scrollTop,s=!0,c=e=>{s||=(r=e.clientX,i=e.clientY,a=t.scrollLeft,o=t.scrollTop,!0),t.scrollLeft=a-(e.clientX-r),t.scrollTop=o-(e.clientY-i)},l=()=>{s=!1},u=()=>{n?.classList.remove(`tbx-panning`),t.removeEventListener(`mousemove`,c),t.removeEventListener(`mouseleave`,l),document.removeEventListener(`mouseup`,u)};t.addEventListener(`mousemove`,c),t.addEventListener(`mouseleave`,l),document.addEventListener(`mouseup`,u)}handleClick(e){if(e.detail>=2)return;let t=e.target.closest(`[data-id]`);if(!t)return;let n=parseInt(t.getAttribute(`data-id`),10);this.lastClickedId=n;let r=this.viewRoot?this.viewRoot.children.find(e=>e.id===n):null;r&&this.onNavigate(r)}handleDblClick(e){let t=this.lastClickedId;if(t===null||!this.viewRoot)return;let n=this.viewRoot.children.find(e=>e.id===t);n?.son&&(this.viewRoot=n,this.doRender(),this.onViewRootChange?.())}onArrow(e){if(e.key===`PageDown`||e.key===`PageUp`){let t=this.container.parentElement;return t?(t.scrollBy({top:t.clientHeight*(e.key===`PageDown`?1:-1),behavior:`smooth`}),!0):!1}if(!this.currentNote||!this.viewRoot)return!1;let t={ArrowRight:[1,0],ArrowLeft:[-1,0],ArrowDown:[0,1],ArrowUp:[0,-1]}[e.key];if(!t)return!1;let[n,r]=t,i=this.currentNote.getNumber(`Xpos`)+this.currentNote.getNumber(`Width`)/2,a=this.currentNote.getNumber(`Ypos`)+this.currentNote.getNumber(`Height`)/2,o=this.viewRoot.children.filter(e=>!e.isAdornment&&!e.getBoolean(`IsSeparator`)&&e!==this.currentNote),s=null,c=-1/0;for(let e of o){let t=e.getNumber(`Xpos`)+e.getNumber(`Width`)/2-i,o=e.getNumber(`Ypos`)+e.getNumber(`Height`)/2-a,l=t*n+o*r;if(l<=0)continue;let u=l/(t*t+o*o);u>c&&(c=u,s=e)}return s?(this.onNavigate(s),!0):!1}},zt=[0,0];function Bt(e,t){return[e[0]+t[0],e[1]+t[1]]}function Vt(e,t){return[e[0]-t[0],e[1]-t[1]]}function Ht(e,t){return[e[0]*t[0]-e[1]*t[1],e[0]*t[1]+e[1]*t[0]]}function Ut(e,t){let n=t[0]*t[0]+t[1]*t[1];return[(e[0]*t[0]+e[1]*t[1])/n,(e[1]*t[0]-e[0]*t[1])/n]}function Wt(e){return[e[0],-e[1]]}function W(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function Gt(e){return Math.atan2(e[1],e[0])}function Kt(e,t){return[e[0]*t,e[1]*t]}function qt(e,t){return[e*Math.cos(t),e*Math.sin(t)]}function Jt(e,t){return Ut(Vt(e,t),Vt([1,0],Ht(Wt(t),e)))}function Yt(e,t){return Ut(Bt(e,t),Bt([1,0],Ht(Wt(t),e)))}function Xt(e){return 2*Math.atanh(Math.min(W(e),.999999999999))}function Zt(e,t){return Xt(Jt(t,e))}function Qt(e,t,n){return Yt(qt(Math.tanh(t/2),n),e)}function $t(e){return 1-W(e)}function en(e,t,n){let[r,i]=Yt(e,n),[a,o]=t,s=r*r+i*i,c=a*a+o*o,l=1-c*s;return[(r*(1-c)-a*(1-s))/l,(i*(1-c)-o*(1-s))/l]}function tn(e,t){let n=Jt(t,e),r=W(n);return r<1e-12?e:Yt(Kt(n,r/(1+Math.sqrt(1-r*r))/r),e)}function nn(e,t,n){let[r,i]=n(e),[a,o]=n(t),[s,c]=n(tn(e,t)),l=2*(r*(c-o)+s*(o-i)+a*(i-c));if(Math.abs(l)<1)return`M${r.toFixed(1)},${i.toFixed(1)} L${a.toFixed(1)},${o.toFixed(1)}`;let u=r*r+i*i,d=s*s+c*c,f=a*a+o*o,p=(u*(c-o)+d*(o-i)+f*(i-c))/l,m=(u*(a-s)+d*(r-a)+f*(s-r))/l,h=Math.sqrt((r-p)*(r-p)+(i-m)*(i-m)),g=+(l>0);return`M${r.toFixed(1)},${i.toFixed(1)} A${h.toFixed(2)},${h.toFixed(2)} 0 0 ${g} ${a.toFixed(1)},${o.toFixed(1)}`}var rn=.65,an=class{constructor(e){this.index=new Map,this.root={note:e,parent:null,children:[],depth:0,angularWeight:0},this.byId=new Map([[e.id,this.root]]),this.order=[this.root]}buildSpanningTree(e){let t=[this.root];for(;t.length>0;){let n=t.shift();if(!(n.depth>=e))for(let e of on(n.note)){if(this.byId.has(e.id))continue;let r={note:e,parent:n,children:[],depth:n.depth+1,angularWeight:0};n.children.push(r),this.byId.set(e.id,r),this.order.push(r),t.push(r)}}}allocateAngularFootprint(){let e=2*Math.cosh(rn);for(let t=this.order.length-1;t>=0;t--){let n=this.order[t];n.angularWeight=n.children.length===0?1:Math.max(1,n.children.reduce((e,t)=>e+t.angularWeight,0)/e)}}buildLayout(){return{focus:this.place(this.root,zt,0,Math.PI,null),byId:this.index}}place(e,t,n,r,i){let a={note:e.note,pos:t,parent:i,children:[],depth:e.depth,coneCenter:n,coneHalf:r};if(this.index.set(e.note.id,a),e.children.length===0||$t(t)<.05)return a;let o=e.children.reduce((e,t)=>e+t.angularWeight,0),s=0;for(let i of e.children){let e=i.angularWeight/o,c=r*e,l=n-r+(s/o+e/2)*2*r,u=Qt(t,rn,l);a.children.push(this.place(i,u,l,c,a)),s+=i.angularWeight}return a}};function on(e){let t=[];for(let n of e.ht.links)n.isPrototype()||n.isUrlLink()||(n.src===e&&n.dest!==null&&n.dest!==e?t.push(n.dest):n.dest===e&&n.src!==e&&t.push(n.src));return t}function sn(e,t=3){let n=new an(e);return n.buildSpanningTree(t),n.allocateAngularFootprint(),n.buildLayout()}function cn(e,t){return e?.byId.get(t.id)}function ln(e){return Array.from(e.byId.values())}function un(e){let t=[];for(let n of e.byId.values())for(let e of n.children)t.push([n,e]);return t}function dn(e,t){let n=new Map;n.set(t.id,0);let r=[t];for(;r.length>0;){let e=r.shift(),t=n.get(e.id);if(!(t>=3))for(let i of on(e))n.has(i.id)||(n.set(i.id,t+1),r.push(i))}for(let t of Array.from(e.byId.values()))(n.get(t.note.id)??1/0)>3&&(e.byId.delete(t.note.id),t.parent&&(t.parent.children=t.parent.children.filter(e=>e!==t)));let i=new Set([t.id]),a=[t];for(;a.length>0;){let t=a.shift(),r=cn(e,t);for(let o of on(t))if(!i.has(o.id)&&(i.add(o.id),!((n.get(o.id)??1/0)>3)&&(a.push(o),!e.byId.has(o.id)&&r))){let t=fn(r,o);t&&e.byId.set(o.id,t)}}}function fn(e,t){if($t(e.pos)<.05)return null;let n=e.children.map(t=>Gt(Jt(t.pos,e.pos))),r=pn(n),i=n.length===0?Math.PI:Math.PI/(n.length+1),a={note:t,pos:Qt(e.pos,rn,r),parent:e,children:[],depth:e.depth+1,coneCenter:r,coneHalf:i};return e.children.push(a),a}function pn(e){if(e.length===0)return 0;let t=[...e].sort((e,t)=>e-t),n=0,r=t[0]+Math.PI;for(let e=0;e<t.length;e++){let i=t[e],a=(e+1<t.length?t[e+1]:t[0]+2*Math.PI)-i;if(a>n){n=a;let e=i+a/2;e>Math.PI&&(e-=2*Math.PI),r=e}}return r}function mn(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function hn(e,t){return[e[0]+t[0],e[1]+t[1]]}function gn(e,t){return[e[0]-t[0],e[1]-t[1]]}function G(e,t){return[e[0]*t,e[1]*t]}var _n=[0,0],vn=2*rn,yn=class{constructor(e,t){this.accel=new Map,this.vel=new Map,this.rafId=null,this.dt=.0015,this.decay=.9933,this.repetitions=20,this.convergenceLimit=6e-4,this.converged=!1,this.layout=e,this.onFrame=t}start(){this.rafId===null&&!this.converged&&(this.rafId=requestAnimationFrame(()=>this.tick()))}stop(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}wakeUp(){this.converged=!1,this.start()}tick(){if(this.rafId=null,this.converged)return;let e=ln(this.layout),t=this.layout.focus.note.id,n=performance.now();for(let r=0;r<this.repetitions;r++){if(this.step(e,t)<this.convergenceLimit){this.converged=!0;break}if(performance.now()-n>16)break}this.onFrame(),this.converged||(this.rafId=requestAnimationFrame(()=>this.tick()))}step(e,t){for(let t of e)this.accel.set(t.note.id,_n);this.applyLinks(e),this.applyRepel(e),this.applyBoundary(e);let n=0;for(let r of e){if(r.note.id===t)continue;let e=this.accel.get(r.note.id)??_n,i=hn(G(this.vel.get(r.note.id)??_n,this.decay),G(e,this.dt));this.vel.set(r.note.id,i);let a=G(i,this.dt);n+=mn(G(e,this.dt));let o=[r.pos[0]+a[0],r.pos[1]+a[1]];1-W(o)>.001&&(r.pos=o)}return n}applyLinks(e){for(let t of e){if(!t.parent)continue;let e=t,n=t.parent,r=gn(e.pos,n.pos),i=mn(r);if(i<1e-10)continue;let a=G(G(r,1/i),(rn-Zt(e.pos,n.pos))*5);e.depth>0&&this.add(e,a),n.depth>0&&this.add(n,G(a,-1))}}applyRepel(e){for(let t=0;t<e.length;t++)for(let n=t+1;n<e.length;n++){let r=e[t],i=e[n],a=Zt(r.pos,i.pos);if(a>=vn||a<1e-6)continue;let o=gn(i.pos,r.pos),s=mn(o);if(s<.001)continue;let c=G(G(o,1/s),Math.min(.3,.03/(a*a)));this.add(i,c),this.add(r,G(c,-1))}}applyBoundary(e){for(let t of e){let e=1-W(t.pos);if(e>=.05)continue;let n=W(t.pos);n<1e-10||this.add(t,G(t.pos,-Math.min(.5/e,1)/n))}}add(e,t){this.accel.set(e.note.id,hn(this.accel.get(e.note.id)??_n,t))}},bn=700,xn=.93,Sn=bn/2*xn,Cn=bn/2,wn=bn/2,Tn=300,En=`
|
|
67
|
+
.tbx-hyp-wrap { position: relative; }
|
|
68
|
+
.tbx-hyp-svg { display: block; cursor: grab; }
|
|
69
|
+
.tbx-hyp-svg.tbx-hyp-dragging { cursor: grabbing; }
|
|
70
|
+
.tbx-hyp-node { cursor: pointer; }
|
|
71
|
+
.tbx-hyp-node:hover rect { filter: brightness(1.1); }
|
|
72
|
+
.tbx-hyp-node.tbx-hyp-current rect { stroke: var(--tbx-accent, #2266cc); stroke-width: 3; animation: tbx-svg-pulse 500ms ease-in-out infinite alternate; }
|
|
73
|
+
`,Dn=class e extends dt{static{this.BOX_SIZES=[[96,32],[82,28],[70,24],[60,20],[52,18]]}static boxSize(t){return e.BOX_SIZES[Math.min(t,e.BOX_SIZES.length-1)]}constructor(e,t){let n=document.createElement(`div`);n.id=`tbx-hyp-pane`,n.style.cssText=`display:none; overflow:auto;`,e.appendChild(n),super(n),this.focusNote=null,this.selectedNote=null,this.viewCenter=zt,this.dragPx=0,this.layout=null,this.animFrameId=null,this.sim=null,this.clickTimer=null,this.pendingNote=null,this.onNavigate=t,this.container.addEventListener(`click`,e=>this.handleClick(e)),this.container.addEventListener(`mousedown`,e=>this.handleMouseDown(e))}getViewRoot(){return null}hoistTo(e,t){}render(e){if(this.currentNote=e,!e){this.sim?.stop(),this.sim=null,this.cancelPending(),this.container.innerHTML=``;return}if(e===this.selectedNote&&(this.animFrameId!==null||this.clickTimer!==null))return;this.cancelPending();let t=cn(this.layout,e);if(t){this.selectedNote=e,this.doRender(),e!==this.focusNote&&this.animateTo(this.viewCenter,t.pos,450,()=>this.refocus(e));return}this.selectedNote=e,this.focusNote=e,this.viewCenter=zt,this.layout=sn(e),this.startSim(),this.doRender()}isDoubleClickOn(e){return this.clickTimer!==null&&this.pendingNote===e}clearClickTimer(){this.clickTimer!==null&&(clearTimeout(this.clickTimer),this.clickTimer=null,this.pendingNote=null)}cancelPending(){this.cancelAnim(),this.clearClickTimer()}refocus(e){this.cancelAnim();let t=cn(this.layout,e),n=t?Jt(t.pos,this.viewCenter):zt;this.selectedNote=e,this.focusNote=e,this.layout=sn(e),this.startSim();let r=Kt(n,-1);this.viewCenter=r,this.animateTo(r,zt,450)}cancelAnim(){this.animFrameId!==null&&(cancelAnimationFrame(this.animFrameId),this.animFrameId=null)}startSim(){this.sim?.stop(),this.layout&&(this.sim=new yn(this.layout,()=>this.doRender()),this.sim.start())}animateTo(e,t,n,r){let i=performance.now(),a=o=>{let s=Math.min((o-i)/n,1),c=s*s*(3-2*s);this.viewCenter=[e[0]+(t[0]-e[0])*c,e[1]+(t[1]-e[1])*c],this.doRender(),s<1?this.animFrameId=requestAnimationFrame(a):(this.viewCenter=t,this.animFrameId=null,r?.())};this.animFrameId=requestAnimationFrame(a)}toSvgV(e){let t=Jt(e,this.viewCenter);return[Cn+t[0]*Sn,wn+t[1]*Sn]}clientToDisk(e,t){let n=this.container.querySelector(`svg`)?.getBoundingClientRect();if(!n)return null;let r=n.width/2,i=n.height/2,a=(e-n.left-r)/(r*xn),o=(t-n.top-i)/(i*xn);return a*a+o*o>=.999?null:[a,o]}doRender(){if(!this.layout||!this.currentNote)return;let e=`tbx-hyp-clip`,t=`<defs><clipPath id="${e}"><circle cx="${Cn}" cy="${wn}" r="${Sn}"/></clipPath></defs>`,n=`<circle cx="${Cn}" cy="${wn}" r="${Sn}" fill="#f5f5f0" stroke="#ccc" stroke-width="1"/>`;this.container.innerHTML=`<svg class="tbx-hyp-svg" width="100%" viewBox="0 0 ${bn} ${bn}">`+t+n+`<g clip-path="url(#${e})">${this.renderEdges()}</g>`+this.renderNodes()+`</svg>`}renderEdges(){let e=e=>this.toSvgV(e);return un(this.layout).map(([t,n])=>`<path d="${nn(t.pos,n.pos,e)}" stroke="#aaa" stroke-width="0.8" fill="none"/>`).join(``)}renderNodes(){return ln(this.layout).map(e=>this.renderNode(e)).join(``)}renderNode(t){let[n,r]=e.boxSize(t.depth),[i,a]=this.toSvgV(t.pos),o=i-n/2,s=a-r/2,c=t.note===this.focusNote,l=t.note===this.selectedNote,u=t.note===this.currentNote,d=c?`#c8c8b8`:l?`#d8eeff`:`#e8e8e0`,f=l?`#2266cc`:`#888`,p=l?2:1,m=u?`tbx-hyp-node tbx-hyp-current`:`tbx-hyp-node`,h=Math.max(8,Math.min(13,r*.45));return`<g class="${m}" data-id="${t.note.id}"><rect x="${o.toFixed(1)}" y="${s.toFixed(1)}" width="${n.toFixed(1)}" height="${r.toFixed(1)}" rx="3" fill="${d}" stroke="${f}" stroke-width="${p}"/><foreignObject x="${(o+1).toFixed(1)}" y="${s.toFixed(1)}" width="${(n-2).toFixed(1)}" height="${r.toFixed(1)}"><div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:${h}px;font-family:Helvetica,Arial,sans-serif;padding:0 2px;box-sizing:border-box;display:flex;align-items:center;">`+V(t.note.get(`DisplayName`))+`</div></foreignObject></g>`}handleMouseDown(e){if(this.dragPx=0,this.sim?.stop(),document.addEventListener(`mouseup`,()=>this.sim?.start(),{once:!0}),e.target.closest(`[data-id]`))return;let t=this.clientToDisk(e.clientX,e.clientY);if(!t)return;this.cancelPending(),e.preventDefault();let n=this.viewCenter,r=this.container.querySelector(`svg`);r?.classList.add(`tbx-hyp-dragging`),this.dragPx=0;let i=e=>{let r=this.clientToDisk(e.clientX,e.clientY);r&&(this.dragPx+=Math.hypot(e.movementX,e.movementY),this.viewCenter=en(t,r,n),this.doRender())},a=()=>{r?.classList.remove(`tbx-hyp-dragging`),document.removeEventListener(`mousemove`,i),document.removeEventListener(`mouseup`,a)};document.addEventListener(`mousemove`,i),document.addEventListener(`mouseup`,a)}onArrow(e){if(!this.layout||!this.selectedNote)return!1;let t={ArrowRight:[1,0],ArrowLeft:[-1,0],ArrowDown:[0,1],ArrowUp:[0,-1]}[e.key];if(!t)return!1;let[n,r]=t,i=cn(this.layout,this.selectedNote);if(!i)return!1;let[a,o]=this.toSvgV(i.pos),s=this.selectedNote,c=new Set,l=[];for(let e of s.ht.links){if(e.isPrototype()||e.isUrlLink())continue;let t=e.src===s&&e.dest!==s?e.dest:e.dest===s&&e.src!==s?e.src:null;if(!t||c.has(t.id))continue;c.add(t.id);let n=cn(this.layout,t);n&&l.push(n)}let u=null,d=-1/0;for(let e of l){let[t,i]=this.toSvgV(e.pos),s=t-a,c=i-o,l=s*n+c*r;if(l<=0)continue;let f=l/(s*s+c*c);f>d&&(d=f,u=e.note)}return u?(this.onNavigate(u),!0):!1}handleClick(e){if(this.dragPx>5)return;let t=e.target.closest(`[data-id]`);if(!t)return;let n=parseInt(t.getAttribute(`data-id`),10),r=this.layout?.byId.get(n)?.note;if(r){if(this.isDoubleClickOn(r)){this.clearClickTimer(),this.refocus(r);return}this.cancelPending(),this.selectedNote=r,this.pendingNote=r,this.layout&&dn(this.layout,r),this.sim?.wakeUp(),this.doRender(),this.clickTimer=setTimeout(()=>{this.clickTimer=null,this.pendingNote=null;let e=this.layout?.byId.get(n);e&&this.animateTo(this.viewCenter,e.pos,450)},Tn),this.onNavigate(r)}}};function On(e){let t=new Map;kn(e,t);let n=t.get(e.id);return n.weight=1,An(e,t),t}function kn(e,t){let n=e.children.filter(e=>!e.isAdornment);if(n.length===0)return t.set(e.id,{rawWeight:1,weight:1}),1;let r=0;for(let e of n)r+=kn(e,t);return t.set(e.id,{rawWeight:r,weight:1}),r}function An(e,t){let n=e.children.filter(e=>!e.isAdornment);if(n.length===0)return;let r=n.reduce((e,n)=>e+t.get(n.id).rawWeight,0),i=r===0?1:r;for(let e of n)t.get(e.id).weight=t.get(e.id).rawWeight/i,An(e,t)}function jn(e){return Math.floor((e-1)/2)}function Mn(e){return e.w>=e.h}function K(e,t){return t.get(e.id)?.weight??0}function Nn(e,t,n){let r=e.reduce((e,t)=>e+K(t,n),0);return t&&(r+=K(t,n)),r}function Pn(e,t,n,r){let i=K(e,r)+K(t,r),a=i===0?.5:K(e,r)/i;return Mn(n)?{pivotrect:{x:n.x,y:n.y,w:n.w*a,h:n.h},otherrect:{x:n.x+n.w*a,y:n.y,w:n.w*(1-a),h:n.h}}:{pivotrect:{x:n.x,y:n.y,w:n.w,h:n.h*a},otherrect:{x:n.x,y:n.y+n.h*a,w:n.w,h:n.h*(1-a)}}}function Fn(e,t,n,r,i){let a=K(t,i),o=K(e,i),s=K(n,i),c=a+o+s||1,l=a/c,u=o/c;return r.h<r.w/1.6?{lrect:{x:r.x,y:r.y,w:r.w*l,h:r.h},pivotrect:{x:r.x+r.w*l,y:r.y,w:r.w*u,h:r.h},rrect:{x:r.x+r.w*(l+u),y:r.y,w:r.w*(1-l-u),h:r.h}}:{lrect:{x:r.x,y:r.y,w:r.w,h:r.h*l},pivotrect:{x:r.x,y:r.y+r.h*l,w:r.w,h:r.h*u},rrect:{x:r.x,y:r.y+r.h*(l+u),w:r.w,h:r.h*(1-l-u)}}}function In(e,t,n,r,i,a){let o=Nn(t,null,a),s=Nn(n,e,a),c=Nn(r,null,a),l=o+s+c||1,u=o/l,d=s/l,f=Mn(i),p,m,h;f?(p={x:i.x,y:i.y,w:i.w*u,h:i.h},m={x:i.x+i.w*u,y:i.y,w:i.w*d,h:i.h},h={x:i.x+i.w*(u+d),y:i.y,w:i.w*(1-u-d),h:i.h}):(p={x:i.x,y:i.y,w:i.w,h:i.h*u},m={x:i.x,y:i.y+i.h*u,w:i.w,h:i.h*d},h={x:i.x,y:i.y+i.h*(u+d),w:i.w,h:i.h*(1-u-d)});let g=s===0?1:K(e,a)/s,_;return f?(_={...m,h:m.h*g},m={...m,y:m.y+m.h*g,h:m.h*(1-g)}):(_={...m,w:m.w*g},m={...m,x:m.x+m.w*g,w:m.w*(1-g)}),{lrect:p,mrect:m,rrect:h,pivotrect:_}}function Ln(e){if(e.w===0)return 0;let t=e.h/e.w-.6;return t*t}function Rn(e,t,n,r,i,a,o){if(t.length===0&&n.length===0&&r.length===0){q(e,i,a,o);return}if(t.length===0&&r.length===0&&n.length===1){let{pivotrect:t,otherrect:r}=Pn(e,n[0],i,a);q(e,t,a,o),q(n[0],r,a,o);return}if(t.length===1&&r.length===0&&n.length===1){let{lrect:r,pivotrect:s,rrect:c}=Fn(e,t[0],n[0],i,a);q(t[0],r,a,o),q(e,s,a,o),q(n[0],c,a,o);return}let s=In(e,t,n,r,i,a);for(;n.length>1;){let o=Ln(s.pivotrect);if(r.unshift(n.pop()),s=In(e,t,n,r,i,a),Ln(s.pivotrect)>=o){n.push(r.shift()),s=In(e,t,n,r,i,a);break}}q(e,s.pivotrect,a,o),zn(t,s.lrect,a,o),zn(n,s.mrect,a,o),zn(r,s.rrect,a,o)}function zn(e,t,n,r){if(e.length===0)return;if(e.length===1){q(e[0],t,n,r);return}let i=jn(e.length),a=e[i];Rn(a,e.slice(0,i),e.slice(i+1),[],t,n,r)}function q(e,t,n,r){r.set(e.id,t);let i=e.children.filter(e=>!e.isAdornment);if(i.length===0||t.w<=8||t.h<=20)return;let a={x:t.x+4,y:t.y+4+12,w:t.w-8,h:t.h-8-12};a.w<=0||a.h<=0||zn(i,a,n,r)}function Bn(e,t){let n=new Map,r=On(e);return zn(e.children.filter(e=>!e.isAdornment),t,r,n),n}var Vn=`
|
|
74
|
+
.tbx-tm-wrap { display: flex; flex-direction: column; width: 100%; height: 100%; }
|
|
75
|
+
.tbx-tm-canvas { position: relative; flex: 1; }
|
|
76
|
+
.tbx-tm-note {
|
|
77
|
+
position: absolute;
|
|
78
|
+
box-sizing: border-box;
|
|
79
|
+
cursor: pointer;
|
|
80
|
+
overflow: visible;
|
|
81
|
+
user-select: none;
|
|
82
|
+
}
|
|
83
|
+
.tbx-tm-note:hover .tbx-tm-title { text-decoration: underline; }
|
|
84
|
+
.tbx-tm-selected { outline: 3px solid var(--tbx-accent, #2266cc); outline-offset: -2px; animation: tbx-sel-pulse 500ms ease-in-out infinite alternate; }
|
|
85
|
+
.tbx-tm-title {
|
|
86
|
+
font-size: 0.68em;
|
|
87
|
+
font-weight: bold;
|
|
88
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
89
|
+
padding: 0.15em 0.3em;
|
|
90
|
+
overflow: hidden;
|
|
91
|
+
white-space: nowrap;
|
|
92
|
+
text-overflow: ellipsis;
|
|
93
|
+
line-height: 1.2;
|
|
94
|
+
}
|
|
95
|
+
`,Hn=class extends dt{constructor(e,t){let n=document.createElement(`div`);n.id=`tbx-treemap-pane`,n.style.cssText=`display:none; width:100%; height:100%;`,e.appendChild(n),super(n),this.lastClickId=null,this.onNavigate=t,this.container.addEventListener(`click`,e=>this.handleClick(e)),this.container.addEventListener(`dblclick`,e=>this.handleDblClick(e)),this.ro=new ResizeObserver(()=>{this.viewRoot&&this.doRender()}),this.ro.observe(this.container)}render(e){if(this.currentNote=e,!e){this.container.innerHTML=``;return}(!this.viewRoot||!e.isDescendantOf(this.viewRoot))&&(this.viewRoot=e.father??e),this.doRender()}doRender(){if(!this.viewRoot){this.container.innerHTML=``;return}let e=this.container.clientWidth,t=this.container.clientHeight;if(e<=0||t<=0)return;let n={x:0,y:0,w:e,h:t},r=Bn(this.viewRoot,n),i=this.renderSubtrees(this.viewRoot,r);this.container.innerHTML=`<div class="tbx-tm-wrap"><div class="tbx-tm-canvas" style="width:${e}px;height:${t}px;">`+i+`</div></div>`}renderSubtrees(e,t){let n=[],r=e.son;for(;r;)this.renderSubtree(r,t,n),r=r.brother;return n.join(``)}renderSubtree(e,t,n){let r=t.get(e.id);if(!r)return;n.push(this.renderTile(e,r));let i=e.son;for(;i;)this.renderSubtree(i,t,n),i=i.brother}renderTile(e,t){let n=e===this.currentNote,r=e.getColor(`Color`),i=e.get(`BorderColor`)===`automatic`?(r??C.WHITE).automaticBorderColor:e.getColor(`BorderColor`)??C.BLACK,a=e.get(`NameColor`)===`automatic`||!e.get(`NameColor`)?(r??C.WHITE).contrastingTextColor:e.getColor(`NameColor`)??C.BLACK,o=r?`background:${r.hex};`:`background:#e8e8e8;`;return`<div class="${`tbx-tm-note${n?` tbx-tm-selected`:``}`}" data-id="${e.id}" style="left:${t.x}px;top:${t.y}px;width:${t.w}px;height:${t.h}px;${o}border:1px solid ${i};color:${a};"><div class="tbx-tm-title">${V(e.get(`DisplayName`))}</div></div>`}onArrow(e){if(!this.currentNote)return!1;let t=this.currentNote;if(e.metaKey&&e.shiftKey&&e.key===`ArrowDown`)return t.son?(this.viewRoot=t,this.doRender(),this.onViewRootChange?.(),!0):!1;if(e.metaKey&&e.shiftKey&&e.key===`ArrowUp`)return this.viewRoot?.father?(this.viewRoot=this.viewRoot.father,this.doRender(),this.onViewRootChange?.(),!0):!1;let n=null;switch(e.key){case`ArrowDown`:{let e=t.son;for(;e&&(e.getBoolean(`IsSeparator`)||e.isAdornment);)e=e.brother;n=e;break}case`ArrowUp`:n=t.father;break;case`ArrowRight`:{let e=t.brother;for(;e&&(e.getBoolean(`IsSeparator`)||e.isAdornment);)e=e.brother;n=e;break}case`ArrowLeft`:{let e=t.elderBrother;for(;e&&(e.getBoolean(`IsSeparator`)||e.isAdornment);)e=e.elderBrother;n=e;break}default:return!1}return n?(this.onNavigate(n),!0):!1}handleClick(e){if(e.detail>=2)return;let t=e.target.closest(`[data-id]`);if(!t||!this.viewRoot)return;let n=parseInt(t.getAttribute(`data-id`),10);this.lastClickId=n;let r=this.findById(this.viewRoot,n);r&&this.onNavigate(r)}handleDblClick(e){if(this.lastClickId===null||!this.viewRoot)return;let t=this.findById(this.viewRoot,this.lastClickId);t?.father&&t.father!==this.viewRoot&&(this.viewRoot=t.father,this.doRender(),this.onViewRootChange?.())}findById(e,t){if(e.id===t)return e;let n=e.son;for(;n;){let e=this.findById(n,t);if(e)return e;n=n.brother}return null}},Un=`
|
|
96
|
+
#tbx-outline-pane { padding-left: 12px; }
|
|
97
|
+
.tbx-ol { list-style: none; margin: 0; padding: 0; }
|
|
98
|
+
.tbx-ol .tbx-ol { padding-left: 1.25em; }
|
|
99
|
+
.tbx-ol-item { padding: 0.1em 0; }
|
|
100
|
+
.tbx-ol-row { display: flex; align-items: baseline; gap: 0.25em; }
|
|
101
|
+
.tbx-ol-toggle {
|
|
102
|
+
font-size: 0.7em;
|
|
103
|
+
cursor: pointer;
|
|
104
|
+
user-select: none;
|
|
105
|
+
width: 1em;
|
|
106
|
+
text-align: center;
|
|
107
|
+
flex-shrink: 0;
|
|
108
|
+
}
|
|
109
|
+
.tbx-ol-leaf { cursor: default; }
|
|
110
|
+
.tbx-ol-icon {
|
|
111
|
+
display: inline-block;
|
|
112
|
+
width: 5px;
|
|
113
|
+
height: 13px;
|
|
114
|
+
border: 1px solid currentColor;
|
|
115
|
+
opacity: 0.35;
|
|
116
|
+
flex-shrink: 0;
|
|
117
|
+
}
|
|
118
|
+
.tbx-ol-text-none { height: 7px; margin-bottom: 3px; background: none; }
|
|
119
|
+
.tbx-ol-text-short { background: linear-gradient(to top, currentColor 35%, transparent 35%); }
|
|
120
|
+
.tbx-ol-text-medium { background: linear-gradient(to top, currentColor 65%, transparent 65%); }
|
|
121
|
+
.tbx-ol-text-long { background: currentColor; }
|
|
122
|
+
.tbx-ol-label {
|
|
123
|
+
cursor: pointer;
|
|
124
|
+
font-size: 0.85em;
|
|
125
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
126
|
+
}
|
|
127
|
+
.tbx-ol-label:hover { text-decoration: underline; }
|
|
128
|
+
.tbx-ol-row:has(.tbx-ol-selected) {
|
|
129
|
+
position: relative;
|
|
130
|
+
z-index: 0;
|
|
131
|
+
color: var(--tbx-selected-color, HighlightText);
|
|
132
|
+
}
|
|
133
|
+
.tbx-ol-row:has(.tbx-ol-selected)::before {
|
|
134
|
+
content: '';
|
|
135
|
+
position: absolute;
|
|
136
|
+
top: 0; bottom: 0;
|
|
137
|
+
left: -9999px; right: -9999px;
|
|
138
|
+
background: var(--tbx-selected-bg, Highlight);
|
|
139
|
+
z-index: -1;
|
|
140
|
+
}
|
|
141
|
+
.tbx-ol-sep-row { align-items: center; min-height: 1.4em; }
|
|
142
|
+
.tbx-ol-sep-line {
|
|
143
|
+
flex: 1;
|
|
144
|
+
height: 1px;
|
|
145
|
+
background: currentColor;
|
|
146
|
+
opacity: 0.35;
|
|
147
|
+
}
|
|
148
|
+
.tbx-ol-sep-full { flex: 4; }
|
|
149
|
+
.tbx-ol-sep-box {
|
|
150
|
+
flex: 2;
|
|
151
|
+
border: 1px solid currentColor;
|
|
152
|
+
text-align: center;
|
|
153
|
+
padding: 0.1em 0.4em;
|
|
154
|
+
font-size: 0.8em;
|
|
155
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
156
|
+
opacity: 0.55;
|
|
157
|
+
}
|
|
158
|
+
`;function Wn(e){let t=e.getOriginal().text.length;return t===0?`tbx-ol-text-none`:t<200?`tbx-ol-text-short`:t<1e3?`tbx-ol-text-medium`:`tbx-ol-text-long`}var Gn=class extends dt{constructor(e,t){let n=document.createElement(`div`);n.id=`tbx-outline-pane`,n.style.display=`none`,e.appendChild(n),super(n),this.expanded=new Set,this.initialized=!1,this.lastClickedId=null,this.onNavigate=t,this.container.addEventListener(`click`,e=>this.handleClick(e)),this.container.addEventListener(`dblclick`,e=>this.handleDblClick(e))}willRender(e){let t=this.container.parentElement;t&&(t.scrollTop=0,t.scrollLeft=0)}render(e){if(this.currentNote=e,!e){this.container.innerHTML=``;return}this.initialized||=(this.expandToDepth(e.ht.root?.son??null,1,2),!0),this.viewRoot&&!e.isDescendantOf(this.viewRoot)&&e!==this.viewRoot&&(this.viewRoot=null),this.expandAncestors(e),this.doRender(),this.scrollToSelected()}doRender(){let e=(this.viewRoot??this.currentNote?.ht?.root??null)?.son??null;this.container.innerHTML=e?this.renderList(e):``}renderList(e){let t=[],n=e;for(;n;)n.isAdornment||t.push(this.renderItem(n)),n=n.brother;return`<ul class="tbx-ol">${t.join(``)}</ul>`}renderItem(e){if(e.attributes.get(`IsSeparator`)===`true`)return this.renderSeparatorItem(e);let t=e.son!==null,n=this.expanded.has(e.id),r=e.id===this.currentNote?.id,i=t?`<span class="tbx-ol-toggle" data-toggle="${e.id}">${n?`▼`:`▶`}</span>`:`<span class="tbx-ol-toggle tbx-ol-leaf"></span>`,a=r?`tbx-ol-label tbx-ol-selected`:`tbx-ol-label`,o=e.isAlias?`<em>${V(e.get(`DisplayName`))}</em>`:V(e.get(`DisplayName`)),s=`<span class="${a}" data-nav="${e.id}">${o}</span>`;return`<li class="tbx-ol-item">${`<div class="tbx-ol-row">${i}${`<span class="tbx-ol-icon ${Wn(e)}" title="${e.wordCount} words"></span>`}${s}</div>`}${t&&n?this.renderList(e.son):``}</li>`}renderSeparatorItem(e){let t=e.name===``||e.name===`untitled`?`<div class="tbx-ol-row tbx-ol-sep-row"><div class="tbx-ol-sep-line tbx-ol-sep-full"></div></div>`:`<div class="tbx-ol-row tbx-ol-sep-row"><div class="tbx-ol-sep-line"></div><div class="tbx-ol-sep-box">${V(e.get(`DisplayName`))}</div><div class="tbx-ol-sep-line"></div></div>`,n=e.son!==null,r=this.expanded.has(e.id);return`<li class="tbx-ol-item">${t}${n&&r?this.renderList(e.son):``}</li>`}handleClick(e){let t=e.target,n=t.closest(`[data-toggle]`);if(n){let e=parseInt(n.getAttribute(`data-toggle`),10);this.expanded.has(e)?this.expanded.delete(e):this.expanded.add(e),this.doRender();return}let r=t.closest(`[data-nav]`);if(r){if(e.detail>=2)return;let t=parseInt(r.getAttribute(`data-nav`),10);this.lastClickedId=t;let n=this.currentNote?.ht?.root,i=n?this.findNote(n,t):null;i&&this.onNavigate(i)}}handleDblClick(e){let t=this.lastClickedId;if(t===null)return;let n=this.currentNote?.ht?.root?this.findNote(this.currentNote.ht.root,t):null;n?.son&&(this.viewRoot=n,this.doRender(),this.onViewRootChange?.())}findNote(e,t){let n=e;for(;n;){if(n.id===t)return n;if(n.son){let e=this.findNote(n.son,t);if(e)return e}n=n.brother}return null}expandAncestors(e){let t=e.father;for(;t!==null&&t.father!==null;)this.expanded.add(t.id),t=t.father}scrollToSelected(){let e=this.currentNote?.id;e!=null&&requestAnimationFrame(()=>{this.container.querySelector(`[data-nav="${e}"]`)?.scrollIntoView({behavior:`smooth`,block:`nearest`})})}pageSize(){let e=this.container.parentElement,t=this.container.querySelector(`.tbx-ol-row`);if(!e||!t)return 10;let n=t.offsetHeight||24;return Math.max(3,Math.floor(e.clientHeight/n)-1)}visibleNotes(){let e=[],t=this.viewRoot??this.currentNote?.ht?.root??null;if(!t)return e;let n=t=>{for(;t;)!t.isAdornment&&!t.getBoolean(`IsSeparator`)&&(e.push(t),t.son&&this.expanded.has(t.id)&&n(t.son)),t=t.brother};return n(t.son),e}onArrow(e){if(!this.currentNote)return!1;let{key:t,metaKey:n,shiftKey:r}=e;if(n&&r&&t===`ArrowDown`)return this.currentNote.son?(this.viewRoot=this.currentNote,this.doRender(),this.onViewRootChange?.(),!0):!1;if(n&&r&&t===`ArrowUp`){if(!this.viewRoot)return!1;let e=this.viewRoot.father,t=this.viewRoot;return this.viewRoot=e&&e.father!==null?e:null,this.onNavigate(t),!0}if(t===`ArrowDown`||t===`ArrowUp`||t===`PageDown`||t===`PageUp`||t===`Home`||t===`End`){let e=this.visibleNotes(),n=e.findIndex(e=>e.id===this.currentNote.id);if(n===-1)return!1;let r;if(t===`ArrowDown`)r=e[n+1];else if(t===`ArrowUp`)r=e[n-1];else if(t===`PageDown`||t===`PageUp`){let i=this.pageSize();r=t===`PageDown`?e[Math.min(n+i,e.length-1)]:e[Math.max(n-i,0)]}else r=t===`End`?e[e.length-1]:e[0];return r&&r!==this.currentNote?(this.onNavigate(r),!0):!1}if(t===`ArrowRight`){let e=this.currentNote;return e.son?(this.expanded.has(e.id)?this.onNavigate(e.son):(this.expanded.add(e.id),this.doRender()),!0):!1}if(t===`ArrowLeft`){let e=this.currentNote;if(e.son&&this.expanded.has(e.id))return this.expanded.delete(e.id),this.doRender(),!0;let t=this.viewRoot??this.currentNote?.ht?.root??null,n=e.father;return n&&n!==t?(this.onNavigate(n),!0):!1}return!1}expandToDepth(e,t,n){let r=e;for(;r;)r.son&&t<=n&&(this.expanded.add(r.id),this.expandToDepth(r.son,t+1,n)),r=r.brother}},J=11102230246251565e-32,Y=134217729,Kn=(3+8*J)*J;function qn(e,t,n,r,i){let a,o,s,c,l=t[0],u=r[0],d=0,f=0;u>l==u>-l?(a=l,l=t[++d]):(a=u,u=r[++f]);let p=0;if(d<e&&f<n)for(u>l==u>-l?(o=l+a,s=a-(o-l),l=t[++d]):(o=u+a,s=a-(o-u),u=r[++f]),a=o,s!==0&&(i[p++]=s);d<e&&f<n;)u>l==u>-l?(o=a+l,c=o-a,s=a-(o-c)+(l-c),l=t[++d]):(o=a+u,c=o-a,s=a-(o-c)+(u-c),u=r[++f]),a=o,s!==0&&(i[p++]=s);for(;d<e;)o=a+l,c=o-a,s=a-(o-c)+(l-c),l=t[++d],a=o,s!==0&&(i[p++]=s);for(;f<n;)o=a+u,c=o-a,s=a-(o-c)+(u-c),u=r[++f],a=o,s!==0&&(i[p++]=s);return(a!==0||p===0)&&(i[p++]=a),p}function Jn(e,t){let n=t[0];for(let r=1;r<e;r++)n+=t[r];return n}function X(e){return new Float64Array(e)}var Yn=(3+16*J)*J,Xn=(2+12*J)*J,Zn=(9+64*J)*J*J,Qn=X(4),$n=X(8),er=X(12),tr=X(16),Z=X(4);function nr(e,t,n,r,i,a,o){let s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T=e-i,E=n-i,D=t-a,O=r-a;b=T*O,f=Y*T,p=f-(f-T),m=T-p,f=Y*O,h=f-(f-O),g=O-h,x=m*g-(b-p*h-m*h-p*g),S=D*E,f=Y*D,p=f-(f-D),m=D-p,f=Y*E,h=f-(f-E),g=E-h,C=m*g-(S-p*h-m*h-p*g),_=x-C,d=x-_,Qn[0]=x-(_+d)+(d-C),v=b+_,d=v-b,y=b-(v-d)+(_-d),_=y-S,d=y-_,Qn[1]=y-(_+d)+(d-S),w=v+_,d=w-v,Qn[2]=v-(w-d)+(_-d),Qn[3]=w;let k=Jn(4,Qn),A=Xn*o;if(k>=A||-k>=A||(d=e-T,s=e-(T+d)+(d-i),d=n-E,l=n-(E+d)+(d-i),d=t-D,c=t-(D+d)+(d-a),d=r-O,u=r-(O+d)+(d-a),s===0&&c===0&&l===0&&u===0)||(A=Zn*o+Kn*Math.abs(k),k+=T*u+O*s-(D*l+E*c),k>=A||-k>=A))return k;b=s*O,f=Y*s,p=f-(f-s),m=s-p,f=Y*O,h=f-(f-O),g=O-h,x=m*g-(b-p*h-m*h-p*g),S=c*E,f=Y*c,p=f-(f-c),m=c-p,f=Y*E,h=f-(f-E),g=E-h,C=m*g-(S-p*h-m*h-p*g),_=x-C,d=x-_,Z[0]=x-(_+d)+(d-C),v=b+_,d=v-b,y=b-(v-d)+(_-d),_=y-S,d=y-_,Z[1]=y-(_+d)+(d-S),w=v+_,d=w-v,Z[2]=v-(w-d)+(_-d),Z[3]=w;let ee=qn(4,Qn,4,Z,$n);b=T*u,f=Y*T,p=f-(f-T),m=T-p,f=Y*u,h=f-(f-u),g=u-h,x=m*g-(b-p*h-m*h-p*g),S=D*l,f=Y*D,p=f-(f-D),m=D-p,f=Y*l,h=f-(f-l),g=l-h,C=m*g-(S-p*h-m*h-p*g),_=x-C,d=x-_,Z[0]=x-(_+d)+(d-C),v=b+_,d=v-b,y=b-(v-d)+(_-d),_=y-S,d=y-_,Z[1]=y-(_+d)+(d-S),w=v+_,d=w-v,Z[2]=v-(w-d)+(_-d),Z[3]=w;let te=qn(ee,$n,4,Z,er);return b=s*u,f=Y*s,p=f-(f-s),m=s-p,f=Y*u,h=f-(f-u),g=u-h,x=m*g-(b-p*h-m*h-p*g),S=c*l,f=Y*c,p=f-(f-c),m=c-p,f=Y*l,h=f-(f-l),g=l-h,C=m*g-(S-p*h-m*h-p*g),_=x-C,d=x-_,Z[0]=x-(_+d)+(d-C),v=b+_,d=v-b,y=b-(v-d)+(_-d),_=y-S,d=y-_,Z[1]=y-(_+d)+(d-S),w=v+_,d=w-v,Z[2]=v-(w-d)+(_-d),Z[3]=w,tr[qn(te,er,4,Z,tr)-1]}function rr(e,t,n,r,i,a){let o=(t-a)*(n-i),s=(e-i)*(r-a),c=o-s,l=Math.abs(o+s);return Math.abs(c)>=Yn*l?c:-nr(e,t,n,r,i,a,l)}(7+56*J)*J,(3+28*J)*J,(26+288*J)*J*J,X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(8),X(8),X(8),X(4),X(8),X(8),X(16),X(12),X(192),X(192),(10+96*J)*J,(4+48*J)*J,(44+576*J)*J*J,X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(8),X(8),X(8),X(8),X(8),X(8),X(8),X(8),X(8),X(4),X(4),X(4),X(8),X(16),X(16),X(16),X(32),X(32),X(48),X(64),X(1152),X(1152),(16+224*J)*J,(5+72*J)*J,(71+1408*J)*J*J,X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(4),X(24),X(24),X(24),X(24),X(24),X(24),X(24),X(24),X(24),X(24),X(1152),X(1152),X(1152),X(1152),X(1152),X(2304),X(2304),X(3456),X(5760),X(8),X(8),X(8),X(16),X(24),X(48),X(48),X(96),X(192),X(384),X(384),X(384),X(768),X(96),X(96),X(96),X(1152);var ir=2**-52,ar=new Uint32Array(512),or=class e{static from(t,n=mr,r=hr){let i=t.length,a=new Float64Array(i*2);for(let e=0;e<i;e++){let i=t[e];a[2*e]=n(i),a[2*e+1]=r(i)}return new e(a)}constructor(e){let t=e.length>>1;if(t>0&&typeof e[0]!=`number`)throw Error(`Expected coords to contain numbers.`);this.coords=e;let n=Math.max(2*t-5,0);this._triangles=new Uint32Array(n*3),this._halfedges=new Int32Array(n*3),this._hashSize=Math.ceil(Math.sqrt(t)),this._hullPrev=new Uint32Array(t),this._hullNext=new Uint32Array(t),this._hullTri=new Uint32Array(t),this._hullHash=new Int32Array(this._hashSize),this._ids=new Uint32Array(t),this._dists=new Float64Array(t),this.trianglesLen=0,this._cx=0,this._cy=0,this._hullStart=0,this.hull=this._triangles,this.triangles=this._triangles,this.halfedges=this._halfedges,this.update()}update(){let{coords:e,_hullPrev:t,_hullNext:n,_hullTri:r,_hullHash:i}=this,a=e.length>>1,o=1/0,s=1/0,c=-1/0,l=-1/0;for(let t=0;t<a;t++){let n=e[2*t],r=e[2*t+1];n<o&&(o=n),r<s&&(s=r),n>c&&(c=n),r>l&&(l=r),this._ids[t]=t}let u=(o+c)/2,d=(s+l)/2,f=0,p=0,m=0;for(let t=0,n=1/0;t<a;t++){let r=cr(u,d,e[2*t],e[2*t+1]);r<n&&(f=t,n=r)}let h=e[2*f],g=e[2*f+1];for(let t=0,n=1/0;t<a;t++){if(t===f)continue;let r=cr(h,g,e[2*t],e[2*t+1]);r<n&&r>0&&(p=t,n=r)}let _=e[2*p],v=e[2*p+1],y=1/0;for(let t=0;t<a;t++){if(t===f||t===p)continue;let n=ur(h,g,_,v,e[2*t],e[2*t+1]);n<y&&(m=t,y=n)}let b=e[2*m],x=e[2*m+1];if(y===1/0){for(let t=0;t<a;t++)this._dists[t]=e[2*t]-e[0]||e[2*t+1]-e[1];fr(this._ids,this._dists,0,a-1);let t=new Uint32Array(a),n=0;for(let e=0,r=-1/0;e<a;e++){let i=this._ids[e],a=this._dists[i];a>r&&(t[n++]=i,r=a)}this.hull=t.subarray(0,n),this.triangles=new Uint32Array,this.halfedges=new Int32Array;return}if(rr(h,g,_,v,b,x)<0){let e=p,t=_,n=v;p=m,_=b,v=x,m=e,b=t,x=n}let S=dr(h,g,_,v,b,x);this._cx=S.x,this._cy=S.y;for(let t=0;t<a;t++)this._dists[t]=cr(e[2*t],e[2*t+1],S.x,S.y);fr(this._ids,this._dists,0,a-1),this._hullStart=f;let C=3;n[f]=t[m]=p,n[p]=t[f]=m,n[m]=t[p]=f,r[f]=0,r[p]=1,r[m]=2,i.fill(-1),i[this._hashKey(h,g)]=f,i[this._hashKey(_,v)]=p,i[this._hashKey(b,x)]=m,this.trianglesLen=0,this._addTriangle(f,p,m,-1,-1,-1);for(let a=0,o=0,s=0;a<this._ids.length;a++){let c=this._ids[a],l=e[2*c],u=e[2*c+1];if(a>0&&Math.abs(l-o)<=ir&&Math.abs(u-s)<=ir||(o=l,s=u,c===f||c===p||c===m))continue;let d=0;for(let e=0,t=this._hashKey(l,u);e<this._hashSize&&(d=i[(t+e)%this._hashSize],!(d!==-1&&d!==n[d]));e++);d=t[d];let h=d,g;for(;g=n[h],rr(l,u,e[2*h],e[2*h+1],e[2*g],e[2*g+1])>=0;)if(h=g,h===d){h=-1;break}if(h===-1)continue;let _=this._addTriangle(h,c,n[h],-1,-1,r[h]);r[c]=this._legalize(_+2),r[h]=_,C++;let v=n[h];for(;g=n[v],rr(l,u,e[2*v],e[2*v+1],e[2*g],e[2*g+1])<0;)_=this._addTriangle(v,c,g,r[c],-1,r[v]),r[c]=this._legalize(_+2),n[v]=v,C--,v=g;if(h===d)for(;g=t[h],rr(l,u,e[2*g],e[2*g+1],e[2*h],e[2*h+1])<0;)_=this._addTriangle(g,c,h,-1,r[h],r[g]),this._legalize(_+2),r[g]=_,n[h]=h,C--,h=g;this._hullStart=t[c]=h,n[h]=t[v]=c,n[c]=v,i[this._hashKey(l,u)]=c,i[this._hashKey(e[2*h],e[2*h+1])]=h}this.hull=new Uint32Array(C);for(let e=0,t=this._hullStart;e<C;e++)this.hull[e]=t,t=n[t];this.triangles=this._triangles.subarray(0,this.trianglesLen),this.halfedges=this._halfedges.subarray(0,this.trianglesLen)}_hashKey(e,t){return Math.floor(sr(e-this._cx,t-this._cy)*this._hashSize)%this._hashSize}_legalize(e){let{_triangles:t,_halfedges:n,coords:r}=this,i=0,a=0;for(;;){let o=n[e],s=e-e%3;if(a=s+(e+2)%3,o===-1){if(i===0)break;e=ar[--i];continue}let c=o-o%3,l=s+(e+1)%3,u=c+(o+2)%3,d=t[a],f=t[e],p=t[l],m=t[u];if(lr(r[2*d],r[2*d+1],r[2*f],r[2*f+1],r[2*p],r[2*p+1],r[2*m],r[2*m+1])){t[e]=m,t[o]=d;let r=n[u];if(r===-1){let t=this._hullStart;do{if(this._hullTri[t]===u){this._hullTri[t]=e;break}t=this._hullPrev[t]}while(t!==this._hullStart)}this._link(e,r),this._link(o,n[a]),this._link(a,u);let s=c+(o+1)%3;i<ar.length&&(ar[i++]=s)}else{if(i===0)break;e=ar[--i]}}return a}_link(e,t){this._halfedges[e]=t,t!==-1&&(this._halfedges[t]=e)}_addTriangle(e,t,n,r,i,a){let o=this.trianglesLen;return this._triangles[o]=e,this._triangles[o+1]=t,this._triangles[o+2]=n,this._link(o,r),this._link(o+1,i),this._link(o+2,a),this.trianglesLen+=3,o}};function sr(e,t){let n=e/(Math.abs(e)+Math.abs(t));return(t>0?3-n:1+n)/4}function cr(e,t,n,r){let i=e-n,a=t-r;return i*i+a*a}function lr(e,t,n,r,i,a,o,s){let c=e-o,l=t-s,u=n-o,d=r-s,f=i-o,p=a-s,m=c*c+l*l,h=u*u+d*d,g=f*f+p*p;return c*(d*g-h*p)-l*(u*g-h*f)+m*(u*p-d*f)<0}function ur(e,t,n,r,i,a){let o=n-e,s=r-t,c=i-e,l=a-t,u=o*o+s*s,d=c*c+l*l,f=.5/(o*l-s*c),p=(l*u-s*d)*f,m=(o*d-c*u)*f;return p*p+m*m}function dr(e,t,n,r,i,a){let o=n-e,s=r-t,c=i-e,l=a-t,u=o*o+s*s,d=c*c+l*l,f=.5/(o*l-s*c);return{x:e+(l*u-s*d)*f,y:t+(o*d-c*u)*f}}function fr(e,t,n,r){if(r-n<=20)for(let i=n+1;i<=r;i++){let r=e[i],a=t[r],o=i-1;for(;o>=n&&t[e[o]]>a;)e[o+1]=e[o--];e[o+1]=r}else{let i=n+r>>1,a=n+1,o=r;pr(e,i,a),t[e[n]]>t[e[r]]&&pr(e,n,r),t[e[a]]>t[e[r]]&&pr(e,a,r),t[e[n]]>t[e[a]]&&pr(e,n,a);let s=e[a],c=t[s];for(;;){do a++;while(t[e[a]]<c);do o--;while(t[e[o]]>c);if(o<a)break;pr(e,a,o)}e[n+1]=e[o],e[o]=s,r-a+1>=o-n?(fr(e,t,a,r),fr(e,t,n,o-1)):(fr(e,t,n,o-1),fr(e,t,a,r))}}function pr(e,t,n){let r=e[t];e[t]=e[n],e[n]=r}function mr(e){return e[0]}function hr(e){return e[1]}var gr=1e-6,Q=class{constructor(){this._x0=this._y0=this._x1=this._y1=null,this._=``}moveTo(e,t){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+t}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+=`Z`)}lineTo(e,t){this._+=`L${this._x1=+e},${this._y1=+t}`}arc(e,t,n){e=+e,t=+t,n=+n;let r=e+n,i=t;if(n<0)throw Error(`negative radius`);this._x1===null?this._+=`M${r},${i}`:(Math.abs(this._x1-r)>gr||Math.abs(this._y1-i)>gr)&&(this._+=`L`+r+`,`+i),n&&(this._+=`A${n},${n},0,1,1,${e-n},${t}A${n},${n},0,1,1,${this._x1=r},${this._y1=i}`)}rect(e,t,n,r){this._+=`M${this._x0=this._x1=+e},${this._y0=this._y1=+t}h${+n}v${+r}h${-n}Z`}value(){return this._||null}},_r=class{constructor(){this._=[]}moveTo(e,t){this._.push([e,t])}closePath(){this._.push(this._[0].slice())}lineTo(e,t){this._.push([e,t])}value(){return this._.length?this._:null}},vr=class{constructor(e,[t,n,r,i]=[0,0,960,500]){if(!((r=+r)>=(t=+t))||!((i=+i)>=(n=+n)))throw Error(`invalid bounds`);this.delaunay=e,this._circumcenters=new Float64Array(e.points.length*2),this.vectors=new Float64Array(e.points.length*2),this.xmax=r,this.xmin=t,this.ymax=i,this.ymin=n,this._init()}update(){return this.delaunay.update(),this._init(),this}_init(){let{delaunay:{points:e,hull:t,triangles:n},vectors:r}=this,i,a,o=this.circumcenters=this._circumcenters.subarray(0,n.length/3*2);for(let r=0,s=0,c=n.length,l,u;r<c;r+=3,s+=2){let c=n[r]*2,d=n[r+1]*2,f=n[r+2]*2,p=e[c],m=e[c+1],h=e[d],g=e[d+1],_=e[f],v=e[f+1],y=h-p,b=g-m,x=_-p,S=v-m,C=(y*S-b*x)*2;if(Math.abs(C)<1e-9){if(i===void 0){i=a=0;for(let n of t)i+=e[n*2],a+=e[n*2+1];i/=t.length,a/=t.length}let n=1e9*Math.sign((i-p)*S-(a-m)*x);l=(p+_)/2-n*S,u=(m+v)/2+n*x}else{let e=1/C,t=y*y+b*b,n=x*x+S*S;l=p+(S*t-b*n)*e,u=m+(y*n-x*t)*e}o[s]=l,o[s+1]=u}let s=t[t.length-1],c,l=s*4,u,d=e[2*s],f,p=e[2*s+1];r.fill(0);for(let n=0;n<t.length;++n)s=t[n],c=l,u=d,f=p,l=s*4,d=e[2*s],p=e[2*s+1],r[c+2]=r[l]=f-p,r[c+3]=r[l+1]=d-u}render(e){let t=e==null?e=new Q:void 0,{delaunay:{halfedges:n,inedges:r,hull:i},circumcenters:a,vectors:o}=this;if(i.length<=1)return null;for(let t=0,r=n.length;t<r;++t){let r=n[t];if(r<t)continue;let i=Math.floor(t/3)*2,o=Math.floor(r/3)*2,s=a[i],c=a[i+1],l=a[o],u=a[o+1];this._renderSegment(s,c,l,u,e)}let s,c=i[i.length-1];for(let t=0;t<i.length;++t){s=c,c=i[t];let n=Math.floor(r[c]/3)*2,l=a[n],u=a[n+1],d=s*4,f=this._project(l,u,o[d+2],o[d+3]);f&&this._renderSegment(l,u,f[0],f[1],e)}return t&&t.value()}renderBounds(e){let t=e==null?e=new Q:void 0;return e.rect(this.xmin,this.ymin,this.xmax-this.xmin,this.ymax-this.ymin),t&&t.value()}renderCell(e,t){let n=t==null?t=new Q:void 0,r=this._clip(e);if(r===null||!r.length)return;t.moveTo(r[0],r[1]);let i=r.length;for(;r[0]===r[i-2]&&r[1]===r[i-1]&&i>1;)i-=2;for(let e=2;e<i;e+=2)(r[e]!==r[e-2]||r[e+1]!==r[e-1])&&t.lineTo(r[e],r[e+1]);return t.closePath(),n&&n.value()}*cellPolygons(){let{delaunay:{points:e}}=this;for(let t=0,n=e.length/2;t<n;++t){let e=this.cellPolygon(t);e&&(e.index=t,yield e)}}cellPolygon(e){let t=new _r;return this.renderCell(e,t),t.value()}_renderSegment(e,t,n,r,i){let a,o=this._regioncode(e,t),s=this._regioncode(n,r);o===0&&s===0?(i.moveTo(e,t),i.lineTo(n,r)):(a=this._clipSegment(e,t,n,r,o,s))&&(i.moveTo(a[0],a[1]),i.lineTo(a[2],a[3]))}contains(e,t,n){return(t=+t,t!==t)||(n=+n,n!==n)?!1:this.delaunay._step(e,t,n)===e}*neighbors(e){let t=this._clip(e);if(t)for(let n of this.delaunay.neighbors(e)){let e=this._clip(n);if(e){loop:for(let r=0,i=t.length;r<i;r+=2)for(let a=0,o=e.length;a<o;a+=2)if(t[r]===e[a]&&t[r+1]===e[a+1]&&t[(r+2)%i]===e[(a+o-2)%o]&&t[(r+3)%i]===e[(a+o-1)%o]){yield n;break loop}}}}_cell(e){let{circumcenters:t,delaunay:{inedges:n,halfedges:r,triangles:i}}=this,a=n[e];if(a===-1)return null;let o=[],s=a;do{let n=Math.floor(s/3);if(o.push(t[n*2],t[n*2+1]),s=s%3==2?s-2:s+1,i[s]!==e)break;s=r[s]}while(s!==a&&s!==-1);return o}_clip(e){if(e===0&&this.delaunay.hull.length===1)return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];let t=this._cell(e);if(t===null)return null;let{vectors:n}=this,r=e*4;return this._simplify(n[r]||n[r+1]?this._clipInfinite(e,t,n[r],n[r+1],n[r+2],n[r+3]):this._clipFinite(e,t))}_clipFinite(e,t){let n=t.length,r=null,i,a,o=t[n-2],s=t[n-1],c,l=this._regioncode(o,s),u,d=0;for(let f=0;f<n;f+=2)if(i=o,a=s,o=t[f],s=t[f+1],c=l,l=this._regioncode(o,s),c===0&&l===0)u=d,d=0,r?r.push(o,s):r=[o,s];else{let t,n,f,p,m;if(c===0){if((t=this._clipSegment(i,a,o,s,c,l))===null)continue;[n,f,p,m]=t}else{if((t=this._clipSegment(o,s,i,a,l,c))===null)continue;[p,m,n,f]=t,u=d,d=this._edgecode(n,f),u&&d&&this._edge(e,u,d,r,r.length),r?r.push(n,f):r=[n,f]}u=d,d=this._edgecode(p,m),u&&d&&this._edge(e,u,d,r,r.length),r?r.push(p,m):r=[p,m]}if(r)u=d,d=this._edgecode(r[0],r[1]),u&&d&&this._edge(e,u,d,r,r.length);else if(this.contains(e,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2))return[this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax,this.xmin,this.ymin];return r}_clipSegment(e,t,n,r,i,a){let o=i<a;for(o&&([e,t,n,r,i,a]=[n,r,e,t,a,i]);;){if(i===0&&a===0)return o?[n,r,e,t]:[e,t,n,r];if(i&a)return null;let s,c,l=i||a;l&8?(s=e+(n-e)*(this.ymax-t)/(r-t),c=this.ymax):l&4?(s=e+(n-e)*(this.ymin-t)/(r-t),c=this.ymin):l&2?(c=t+(r-t)*(this.xmax-e)/(n-e),s=this.xmax):(c=t+(r-t)*(this.xmin-e)/(n-e),s=this.xmin),i?(e=s,t=c,i=this._regioncode(e,t)):(n=s,r=c,a=this._regioncode(n,r))}}_clipInfinite(e,t,n,r,i,a){let o=Array.from(t),s;if((s=this._project(o[0],o[1],n,r))&&o.unshift(s[0],s[1]),(s=this._project(o[o.length-2],o[o.length-1],i,a))&&o.push(s[0],s[1]),o=this._clipFinite(e,o))for(let t=0,n=o.length,r,i=this._edgecode(o[n-2],o[n-1]);t<n;t+=2)r=i,i=this._edgecode(o[t],o[t+1]),r&&i&&(t=this._edge(e,r,i,o,t),n=o.length);else this.contains(e,(this.xmin+this.xmax)/2,(this.ymin+this.ymax)/2)&&(o=[this.xmin,this.ymin,this.xmax,this.ymin,this.xmax,this.ymax,this.xmin,this.ymax]);return o}_edge(e,t,n,r,i){for(;t!==n;){let n,a;switch(t){case 5:t=4;continue;case 4:t=6,n=this.xmax,a=this.ymin;break;case 6:t=2;continue;case 2:t=10,n=this.xmax,a=this.ymax;break;case 10:t=8;continue;case 8:t=9,n=this.xmin,a=this.ymax;break;case 9:t=1;continue;case 1:t=5,n=this.xmin,a=this.ymin;break}(r[i]!==n||r[i+1]!==a)&&this.contains(e,n,a)&&(r.splice(i,0,n,a),i+=2)}return i}_project(e,t,n,r){let i=1/0,a,o,s;if(r<0){if(t<=this.ymin)return null;(a=(this.ymin-t)/r)<i&&(s=this.ymin,o=e+(i=a)*n)}else if(r>0){if(t>=this.ymax)return null;(a=(this.ymax-t)/r)<i&&(s=this.ymax,o=e+(i=a)*n)}if(n>0){if(e>=this.xmax)return null;(a=(this.xmax-e)/n)<i&&(o=this.xmax,s=t+(i=a)*r)}else if(n<0){if(e<=this.xmin)return null;(a=(this.xmin-e)/n)<i&&(o=this.xmin,s=t+(i=a)*r)}return[o,s]}_edgecode(e,t){return(e===this.xmin?1:e===this.xmax?2:0)|(t===this.ymin?4:t===this.ymax?8:0)}_regioncode(e,t){return(e<this.xmin?1:e>this.xmax?2:0)|(t<this.ymin?4:t>this.ymax?8:0)}_simplify(e){if(e&&e.length>4){for(let t=0;t<e.length;t+=2){let n=(t+2)%e.length,r=(t+4)%e.length;(e[t]===e[n]&&e[n]===e[r]||e[t+1]===e[n+1]&&e[n+1]===e[r+1])&&(e.splice(n,2),t-=2)}e.length||(e=null)}return e}},yr=2*Math.PI,br=Math.pow;function xr(e){return e[0]}function Sr(e){return e[1]}function Cr(e){let{triangles:t,coords:n}=e;for(let e=0;e<t.length;e+=3){let r=2*t[e],i=2*t[e+1],a=2*t[e+2];if((n[a]-n[r])*(n[i+1]-n[r+1])-(n[i]-n[r])*(n[a+1]-n[r+1])>1e-10)return!1}return!0}function wr(e,t,n){return[e+Math.sin(e+t)*n,t+Math.cos(e-t)*n]}var Tr=class e{static from(t,n=xr,r=Sr,i){return new e(`length`in t?Er(t,n,r,i):Float64Array.from(Dr(t,n,r,i)))}constructor(e){this._delaunator=new or(e),this.inedges=new Int32Array(e.length/2),this._hullIndex=new Int32Array(e.length/2),this.points=this._delaunator.coords,this._init()}update(){return this._delaunator.update(),this._init(),this}_init(){let e=this._delaunator,t=this.points;if(e.hull&&e.hull.length>2&&Cr(e)){this.collinear=Int32Array.from({length:t.length/2},(e,t)=>t).sort((e,n)=>t[2*e]-t[2*n]||t[2*e+1]-t[2*n+1]);let e=this.collinear[0],n=this.collinear[this.collinear.length-1],r=[t[2*e],t[2*e+1],t[2*n],t[2*n+1]],i=1e-8*Math.hypot(r[3]-r[1],r[2]-r[0]);for(let e=0,n=t.length/2;e<n;++e){let n=wr(t[2*e],t[2*e+1],i);t[2*e]=n[0],t[2*e+1]=n[1]}this._delaunator=new or(t)}else delete this.collinear;let n=this.halfedges=this._delaunator.halfedges,r=this.hull=this._delaunator.hull,i=this.triangles=this._delaunator.triangles,a=this.inedges.fill(-1),o=this._hullIndex.fill(-1);for(let e=0,t=n.length;e<t;++e){let t=i[e%3==2?e-2:e+1];(n[e]===-1||a[t]===-1)&&(a[t]=e)}for(let e=0,t=r.length;e<t;++e)o[r[e]]=e;r.length<=2&&r.length>0&&(this.triangles=new Int32Array(3).fill(-1),this.halfedges=new Int32Array(3).fill(-1),this.triangles[0]=r[0],a[r[0]]=1,r.length===2&&(a[r[1]]=0,this.triangles[1]=r[1],this.triangles[2]=r[1]))}voronoi(e){return new vr(this,e)}*neighbors(e){let{inedges:t,hull:n,_hullIndex:r,halfedges:i,triangles:a,collinear:o}=this;if(o){let t=o.indexOf(e);t>0&&(yield o[t-1]),t<o.length-1&&(yield o[t+1]);return}let s=t[e];if(s===-1)return;let c=s,l=-1;do{if(yield l=a[c],c=c%3==2?c-2:c+1,a[c]!==e)return;if(c=i[c],c===-1){let t=n[(r[e]+1)%n.length];t!==l&&(yield t);return}}while(c!==s)}find(e,t,n=0){if((e=+e,e!==e)||(t=+t,t!==t))return-1;let r=n,i;for(;(i=this._step(n,e,t))>=0&&i!==n&&i!==r;)n=i;return i}_step(e,t,n){let{inedges:r,hull:i,_hullIndex:a,halfedges:o,triangles:s,points:c}=this;if(r[e]===-1||!c.length)return(e+1)%(c.length>>1);let l=e,u=br(t-c[e*2],2)+br(n-c[e*2+1],2),d=r[e],f=d;do{let r=s[f],d=br(t-c[r*2],2)+br(n-c[r*2+1],2);if(d<u&&(u=d,l=r),f=f%3==2?f-2:f+1,s[f]!==e)break;if(f=o[f],f===-1){if(f=i[(a[e]+1)%i.length],f!==r&&br(t-c[f*2],2)+br(n-c[f*2+1],2)<u)return f;break}}while(f!==d);return l}render(e){let t=e==null?e=new Q:void 0,{points:n,halfedges:r,triangles:i}=this;for(let t=0,a=r.length;t<a;++t){let a=r[t];if(a<t)continue;let o=i[t]*2,s=i[a]*2;e.moveTo(n[o],n[o+1]),e.lineTo(n[s],n[s+1])}return this.renderHull(e),t&&t.value()}renderPoints(e,t){t===void 0&&(!e||typeof e.moveTo!=`function`)&&(t=e,e=null),t=t==null?2:+t;let n=e==null?e=new Q:void 0,{points:r}=this;for(let n=0,i=r.length;n<i;n+=2){let i=r[n],a=r[n+1];e.moveTo(i+t,a),e.arc(i,a,t,0,yr)}return n&&n.value()}renderHull(e){let t=e==null?e=new Q:void 0,{hull:n,points:r}=this,i=n[0]*2,a=n.length;e.moveTo(r[i],r[i+1]);for(let t=1;t<a;++t){let i=2*n[t];e.lineTo(r[i],r[i+1])}return e.closePath(),t&&t.value()}hullPolygon(){let e=new _r;return this.renderHull(e),e.value()}renderTriangle(e,t){let n=t==null?t=new Q:void 0,{points:r,triangles:i}=this,a=i[e*=3]*2,o=i[e+1]*2,s=i[e+2]*2;return t.moveTo(r[a],r[a+1]),t.lineTo(r[o],r[o+1]),t.lineTo(r[s],r[s+1]),t.closePath(),n&&n.value()}*trianglePolygons(){let{triangles:e}=this;for(let t=0,n=e.length/3;t<n;++t)yield this.trianglePolygon(t)}trianglePolygon(e){let t=new _r;return this.renderTriangle(e,t),t.value()}};function Er(e,t,n,r){let i=e.length,a=new Float64Array(i*2);for(let o=0;o<i;++o){let i=e[o];a[o*2]=t.call(r,i,o,e),a[o*2+1]=n.call(r,i,o,e)}return a}function*Dr(e,t,n,r){let i=0;for(let a of e)yield t.call(r,a,i,e),yield n.call(r,a,i,e),++i}var Or=8,kr=5,Ar=18,jr=3;function Mr(e){let t=e.split(` `);if(t.length<2)return null;let n=e.length/2,r=0,i=1,a=1/0;for(let e=0;e<t.length-1;e++){r+=t[e].length+1;let o=Math.abs(r-n);o<a&&(a=o,i=e+1)}return[t.slice(0,i).join(` `),t.slice(i).join(` `)]}function Nr(e){let t=e.length>1&&e[0][0]===e[e.length-1][0]&&e[0][1]===e[e.length-1][1]?e.length-1:e.length,n=0;for(let r=0;r<t;r++){let i=(r+1)%t;n+=e[r][0]*e[i][1]-e[i][0]*e[r][1]}if(n/=2,Math.abs(n)<1e-6){let n=0,r=0;for(let i=0;i<t;i++)n+=e[i][0],r+=e[i][1];return[n/t,r/t]}let r=0,i=0;for(let n=0;n<t;n++){let a=(n+1)%t,o=e[n][0]*e[a][1]-e[a][0]*e[n][1];r+=(e[n][0]+e[a][0])*o,i+=(e[n][1]+e[a][1])*o}return[r/(6*n),i/(6*n)]}function Pr(e,t,n){let r=e.length>1&&e[0][0]===e[e.length-1][0]&&e[0][1]===e[e.length-1][1]?e.length-1:e.length,i=[];for(let a=0;a<r;a++){let r=e[a][0]-t[0],o=e[a][1]-t[1],s=Math.hypot(r,o);if(s<=n)i.push([t[0],t[1]]);else{let e=(s-n)/s;i.push([t[0]+r*e,t[1]+o*e])}}return i}function Fr(e,t){if(e.length<3)return``;let n=e.length,r=[],i=!0;for(let a=0;a<n;a++){let o=e[(a-1+n)%n],s=e[a],c=e[(a+1)%n],l=s[0]-o[0],u=s[1]-o[1],d=c[0]-s[0],f=c[1]-s[1],p=Math.hypot(l,u),m=Math.hypot(d,f);if(p<1e-6||m<1e-6)continue;let h=Math.min(t,p/2,m/2),g=s[0]-l/p*h,_=s[1]-u/p*h,v=s[0]+d/m*h,y=s[1]+f/m*h;i?(r.push(`M${g.toFixed(1)},${_.toFixed(1)}`),i=!1):r.push(`L${g.toFixed(1)},${_.toFixed(1)}`),r.push(`Q${s[0].toFixed(1)},${s[1].toFixed(1)} ${v.toFixed(1)},${y.toFixed(1)}`)}return r.push(`Z`),r.join(` `)}var Ir=class extends dt{constructor(e,t){let n=document.createElement(`div`);n.id=`tbx-gaudi-pane`,n.style.cssText=`display:none; width:100%; height:100%;`,e.appendChild(n),super(n),this.notes=[],this.pts=[],this.w=800,this.h=600,this.viewedParent=null,this.dragIdx=-1,this.dragOx=0,this.dragOy=0,this.dragStartX=0,this.dragStartY=0,this.didDrag=!1,this.onMouseMove=e=>this.handleMouseMove(e),this.onMouseUp=e=>this.handleMouseUp(e),this.onNavigate=t,this.container.addEventListener(`mousedown`,e=>this.handleMouseDown(e))}render(e){if(this.currentNote=e,!e){this.viewedParent=null,this.container.innerHTML=``;return}(!this.viewedParent||e.father!==this.viewedParent)&&(this.viewedParent=e.father??e);let t=[],n=this.viewedParent.son;for(;n;)n.attributes.get(`IsSeparator`)!==`true`&&n.attributes.get(`GaudiHidden`)!==`true`&&t.push(n),n=n.brother;if(this.notes=t,t.length===0){this.container.innerHTML=``;return}this.w=this.container.clientWidth||800,this.h=this.container.clientHeight||600;let r=t.every(e=>parseFloat(e.attributes.get(`Xg`)??`0`)!==0||parseFloat(e.attributes.get(`Yg`)??`0`)!==0);this.pts=this.seeds(t,this.w,this.h),this.pts=this.lloydRelax(this.pts,this.w,this.h,r?jr:Ar),this.savePositions(),this.doRedraw()}doRedraw(){this.container.innerHTML=this.buildSVG(this.notes,this.pts,this.w,this.h)}seeds(e,t,n){return e.map(e=>{let r=parseFloat(e.attributes.get(`Xg`)??`0`),i=parseFloat(e.attributes.get(`Yg`)??`0`);return r===0&&i===0?[t*.05+Math.random()*t*.9,n*.05+Math.random()*n*.9]:[r*t,i*n]})}lloydRelax(e,t,n,r,i=-1){for(let a=0;a<r;a++){let r=Tr.from(e).voronoi([0,0,t,n]);e=e.map((e,t)=>{if(t===i)return e;let n=r.cellPolygon(t);return!n||n.length<4?e:Nr(n)})}return e}savePositions(){for(let e=0;e<this.notes.length;e++)this.notes[e].attributes.set(`Xg`,String(this.pts[e][0]/this.w)),this.notes[e].attributes.set(`Yg`,String(this.pts[e][1]/this.h))}buildSVG(e,t,n,r){let i=Tr.from(t).voronoi([0,0,n,r]),a=Math.max(8,Math.min(16,Math.sqrt(n*r/e.length)/6)),o=[],s=[],c=[];for(let t=0;t<e.length;t++){let n=i.cellPolygon(t);if(!n)continue;let r=e[t],l=r.getColor(`Color`),u=l?l.hex:`#888`,d=Nr(n),f=Pr(n,d,Or);if(f.length<3)continue;let p=Fr(f,kr),m=`gvc${t}`;o.push(`<clipPath id="${m}"><path d="${p}"/></clipPath>`);let h=r===this.currentNote,g=h?` class="tbx-gaudi-sel"`:``,_=h?`4`:`1.5`;s.push(`<path${g} d="${p}" fill="white" stroke="${u}" stroke-width="${_}" data-idx="${t}" data-id="${r.id}"/>`),s.push(`<path d="${p}" fill="${u}" fill-opacity="0.1" stroke="none" pointer-events="none"/>`);let v=r.get(`DisplayName`),y=Mr(v),b=d[0].toFixed(1),x=`clip-path="url(#${m})" text-anchor="middle" font-size="${a.toFixed(1)}" font-family="Helvetica,Arial,sans-serif" fill="black" pointer-events="none"`;if(y){let e=a*1.2,t=(d[1]-e/2).toFixed(1),n=(d[1]+e/2).toFixed(1);c.push(`<text ${x}><tspan x="${b}" y="${t}" dominant-baseline="central">${V(y[0])}</tspan><tspan x="${b}" y="${n}" dominant-baseline="central">${V(y[1])}</tspan></text>`)}else c.push(`<text ${x} x="${b}" y="${d[1].toFixed(1)}" dominant-baseline="middle">${V(v)}</text>`)}return`<svg width="${n}" height="${r}" xmlns="http://www.w3.org/2000/svg"><defs>${o.join(``)}</defs><rect width="${n}" height="${r}" fill="white"/>`+s.join(``)+c.join(``)+`</svg>`}svgCoords(e){let t=this.container.getBoundingClientRect();return[e.clientX-t.left,e.clientY-t.top]}handleMouseDown(e){let t=e.target,n=parseInt(t.getAttribute(`data-idx`)??`-1`,10);if(n<0||n>=this.notes.length)return;e.preventDefault();let[r,i]=this.svgCoords(e);this.dragIdx=n,this.dragOx=this.pts[n][0]-r,this.dragOy=this.pts[n][1]-i,this.dragStartX=r,this.dragStartY=i,this.didDrag=!1,this.container.classList.add(`tbx-gaudi-dragging`),document.addEventListener(`mousemove`,this.onMouseMove),document.addEventListener(`mouseup`,this.onMouseUp)}handleMouseMove(e){if(this.dragIdx<0)return;let[t,n]=this.svgCoords(e);if(!this.didDrag){if(Math.hypot(t-this.dragStartX,n-this.dragStartY)<4)return;this.didDrag=!0}let r=Or*2;this.pts[this.dragIdx]=[Math.max(r,Math.min(this.w-r,t+this.dragOx)),Math.max(r,Math.min(this.h-r,n+this.dragOy))],this.pts=this.lloydRelax(this.pts,this.w,this.h,1,this.dragIdx),this.doRedraw()}handleMouseUp(e){document.removeEventListener(`mousemove`,this.onMouseMove),document.removeEventListener(`mouseup`,this.onMouseUp),this.container.classList.remove(`tbx-gaudi-dragging`);let t=this.dragIdx;if(this.dragIdx=-1,!(t<0)){if(!this.didDrag){t<this.notes.length&&this.onNavigate(this.notes[t]);return}this.pts=this.lloydRelax(this.pts,this.w,this.h,jr),this.savePositions(),this.doRedraw()}}onArrow(e){if(!this.currentNote||this.notes.length===0)return!1;let t={ArrowRight:[1,0],ArrowLeft:[-1,0],ArrowDown:[0,1],ArrowUp:[0,-1]}[e.key];if(!t)return!1;let[n,r]=t,i=this.notes.indexOf(this.currentNote);if(i<0)return!1;let[a,o]=this.pts[i],s=null,c=-1/0;for(let e=0;e<this.notes.length;e++){if(e===i)continue;let t=this.pts[e][0]-a,l=this.pts[e][1]-o,u=t*n+l*r;if(u<=0)continue;let d=u/(t*t+l*l);d>c&&(c=d,s=this.notes[e])}return s?(this.onNavigate(s),!0):!1}getViewRoot(){return this.viewedParent}hoistTo(e,t){this.viewedParent=e,this.render(t)}},Lr=`
|
|
159
|
+
#tbx-gaudi-pane { position: relative; width: 100%; height: 100%; }
|
|
160
|
+
#tbx-gaudi-pane svg { display: block; }
|
|
161
|
+
#tbx-gaudi-pane path { cursor: pointer; }
|
|
162
|
+
#tbx-gaudi-pane path:hover { filter: brightness(0.88); }
|
|
163
|
+
#tbx-gaudi-pane.tbx-gaudi-dragging,
|
|
164
|
+
#tbx-gaudi-pane.tbx-gaudi-dragging path { cursor: grabbing; }
|
|
165
|
+
#tbx-gaudi-pane .tbx-gaudi-sel { stroke: var(--tbx-accent, #2266cc); stroke-width: 4; animation: tbx-svg-pulse 500ms ease-in-out infinite alternate; }
|
|
166
|
+
`,Rr=/[ \t\r\n\f\v.,;:!?()\[\]{}"]/;function zr(e){return!Rr.test(e)}function Br(e,t){if(t<0||t>e.length)return null;let n=Math.min(t,e.length-1);if(!zr(e[n]))return null;let r=n;for(;r>0&&zr(e[r-1]);)r--;let i=n+1;for(;i<e.length&&zr(e[i]);)i++;return e.slice(r,i)||null}function Vr(e,t,n){if(e.caretRangeFromPoint){let r=e.caretRangeFromPoint(t,n);if(r?.startContainer.nodeType===Node.TEXT_NODE)return{node:r.startContainer,offset:r.startOffset}}if(e.caretPositionFromPoint){let r=e.caretPositionFromPoint(t,n);if(r?.offsetNode?.nodeType===Node.TEXT_NODE)return{node:r.offsetNode,offset:r.offset}}return null}function Hr(e,t,n){let r=Vr(n.ownerDocument,e,t);if(r&&n.contains(r.node))return Br(r.node.textContent??``,r.offset);let i=document.createTreeWalker(n,NodeFilter.SHOW_TEXT),a;for(;a=i.nextNode();){let n=a.textContent??``;if(!n)continue;let r=document.createRange();r.selectNodeContents(a);let i=[...r.getClientRects()];if(i.length>0){for(let r of i)if(e>=r.left&&e<=r.right&&t>=r.top&&t<=r.bottom){(r.top+r.bottom)/2;let t=0,i=n.length-1;for(;t<i;){let n=t+i>>1,o=document.createRange();o.setStart(a,n),o.setEnd(a,n+1);let s=o.getBoundingClientRect(),c=(s.top+s.bottom)/2;c<r.top?t=n+1:c>=r.bottom?i=n:s.right<=e?t=n+1:i=n}return Br(n,t)}continue}let o=a.parentElement;if(!o)continue;let s=o.getBoundingClientRect();if(!(t<s.top||t>s.bottom))return Br(n,Ur(o,n,e-s.left))}return null}function Ur(e,t,n){let r=window.getComputedStyle(e),i=document.createElement(`canvas`).getContext(`2d`);if(!i)return 0;i.font=`${r.fontStyle} ${r.fontWeight} ${r.fontSize} ${r.fontFamily}`;for(let e=1;e<=t.length;e++)if(i.measureText(t.slice(0,e)).width>=n)return e-1;return t.length-1}function Wr(e){return[`map`,`outline`,`treemap`,`gaudi`,`hyperbolic`].includes(e)}var Gr=class{constructor(e,t,n,r,i){this.panes=e,this._mode=t,this.leftColEl=n,this.outlineEl=r,this.getToolbarLeft=i}connectBreadcrumbs(e){this.updateBreadcrumbsFn=e;for(let{view:t}of this.panes.values())t.onViewRootChange=e}updateBreadcrumbs(){this.updateBreadcrumbsFn?.()}get mode(){return this._mode}get activeView(){return this.panes.get(this._mode).view}switchTo(e){this._mode=e}updateVisibility(){let{wide:e,fillHeight:t}=this.panes.get(this._mode);this.leftColEl.style.width=e?`50%`:``,this.outlineEl.style.overflowX=e?`auto`:`hidden`,this.outlineEl.style.paddingRight=e?`0`:``,this.outlineEl.style.height=t?`100%`:``;let n=this.getToolbarLeft();n&&(n.style.width=e?`${this.leftColEl.offsetWidth}px`:``);for(let[e,{view:t}]of this.panes)t.el.style.display=e===this._mode?``:`none`}renderCurrent(e){this.activeView.render(e)}scrollToSelected(){this.activeView.scrollToSelected()}onArrow(e){return this.activeView.onArrow(e)}getViewRoot(){return this.activeView.getViewRoot()}hoistTo(e,t){this.activeView.hoistTo(e,t)}renderOnSwitch(e){this.activeView.willRender(e),this.activeView.render(e)}switchView(e,t){this.switchTo(e),this.updateVisibility(),this.updateBreadcrumbs(),t&&(this.renderOnSwitch(t),this.scrollToSelected())}},Kr=`
|
|
167
|
+
#tbx-breadcrumbs {
|
|
168
|
+
flex-shrink: 0;
|
|
169
|
+
height: 26px;
|
|
170
|
+
display: flex;
|
|
171
|
+
align-items: stretch;
|
|
172
|
+
overflow: hidden;
|
|
173
|
+
background: linear-gradient(to bottom, #d4d4d4, #b8b8b8);
|
|
174
|
+
border-bottom: 1px solid rgba(0,0,0,0.28);
|
|
175
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
176
|
+
font-size: 0.85em;
|
|
177
|
+
transition: height 0.22s ease-out, border-bottom-width 0.22s ease-out;
|
|
178
|
+
}
|
|
179
|
+
#tbx-breadcrumbs.tbx-bc-hidden { height: 0; border-bottom-width: 0; }
|
|
180
|
+
.tbx-bc-crumb {
|
|
181
|
+
flex: 0 1 auto;
|
|
182
|
+
display: flex;
|
|
183
|
+
align-items: center;
|
|
184
|
+
padding: 0 1.2em 0 0.6em;
|
|
185
|
+
white-space: nowrap;
|
|
186
|
+
overflow: hidden;
|
|
187
|
+
color: #484848;
|
|
188
|
+
cursor: pointer;
|
|
189
|
+
/* Horizontal gradient: light left face → dark right edge, suggesting
|
|
190
|
+
depth at the chevron tip without relying on drop-shadow. */
|
|
191
|
+
background: linear-gradient(to right, #f6f6f6,#e6e6e6, #cccccc);
|
|
192
|
+
/* All crumbs: flat left + right-pointing chevron (9 px depth). */
|
|
193
|
+
clip-path: polygon(0 0, calc(100% - 12px) 0, 100% 50%, calc(100% - 12px) 100%, 0 100%);
|
|
194
|
+
margin-right: -5px;
|
|
195
|
+
}
|
|
196
|
+
.tbx-bc-crumb:hover {
|
|
197
|
+
color: #1a1a1a;
|
|
198
|
+
background: linear-gradient(to right, #ffffff, #d8d8d8);
|
|
199
|
+
}
|
|
200
|
+
.tbx-bc-sep { display: none; }
|
|
201
|
+
`;function qr(e){let t=[],n=e;for(;n!==null;)t.unshift(n),n=n.father;return t}var Jr=class{constructor(e){this.notes=[],this.el=e,this.el.classList.add(`tbx-bc-hidden`),this.el.addEventListener(`click`,e=>{let t=e.target.closest(`[data-bc-idx]`);if(!t)return;e.stopPropagation();let n=parseInt(t.getAttribute(`data-bc-idx`)??`-1`,10),r=this.notes[n];r&&this.onCrumbClick?.(r)})}update(e){if(!e||e.father===null){this.notes=[],this.el.classList.add(`tbx-bc-hidden`);return}this.notes=qr(e);let t=this.notes.slice(1),n=this.notes.length,r=[`<span class="tbx-bc-crumb" data-bc-idx="0" style="z-index:${n}">⌂</span>`,...t.map((e,t)=>`<span class="tbx-bc-crumb" data-bc-idx="${t+1}" style="z-index:${n-1-t}">${V(e.get(`DisplayName`))}</span>`)];this.el.innerHTML=r.join(``),this.el.classList.remove(`tbx-bc-hidden`)}},Yr=`
|
|
202
|
+
#tbx-link-browser {
|
|
203
|
+
display: none;
|
|
204
|
+
position: absolute;
|
|
205
|
+
top: 0;
|
|
206
|
+
right: 0;
|
|
207
|
+
background: var(--tbx-bg, #fff);
|
|
208
|
+
border: 1px solid var(--tbx-outline-border, #ccc);
|
|
209
|
+
border-radius: 4px;
|
|
210
|
+
box-shadow: 0 2px 10px rgba(0,0,0,0.15);
|
|
211
|
+
padding: 0.6em 0.75em;
|
|
212
|
+
min-width: 18em;
|
|
213
|
+
max-width: 36em;
|
|
214
|
+
max-height: 80vh;
|
|
215
|
+
overflow-y: auto;
|
|
216
|
+
z-index: 10;
|
|
217
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
218
|
+
font-size: 0.85em;
|
|
219
|
+
}
|
|
220
|
+
#tbx-link-browser.tbx-open { display: block; }
|
|
221
|
+
#tbx-lb-header {
|
|
222
|
+
display: flex;
|
|
223
|
+
justify-content: space-between;
|
|
224
|
+
align-items: baseline;
|
|
225
|
+
margin: -0.6em -0.75em 0.5em -0.75em;
|
|
226
|
+
padding: 0.4em 0.75em;
|
|
227
|
+
background: var(--tbx-outline-border, #e8e8e8);
|
|
228
|
+
font-weight: bold;
|
|
229
|
+
border-radius: 4px 4px 0 0;
|
|
230
|
+
}
|
|
231
|
+
#tbx-lb-close { font-weight: normal; font-size: 1.1em; opacity: 0.5; }
|
|
232
|
+
#tbx-lb-close:hover { opacity: 1; }
|
|
233
|
+
.tbx-lb-row {
|
|
234
|
+
display: grid;
|
|
235
|
+
grid-template-columns: minmax(6em, 1fr) minmax(6em, 1fr) minmax(6em, 1.5fr) 1.2em;
|
|
236
|
+
gap: 0 1.5em;
|
|
237
|
+
padding: 0.25em 0;
|
|
238
|
+
border-top: 1px solid var(--tbx-outline-border, #eee);
|
|
239
|
+
cursor: pointer;
|
|
240
|
+
}
|
|
241
|
+
.tbx-lb-row:hover { background: var(--tbx-hover-bg, #f5f5f5); }
|
|
242
|
+
.tbx-lb-name { font-style: italic; }
|
|
243
|
+
.tbx-lb-guard { opacity: 0.55; font-size: 0.9em; }
|
|
244
|
+
.tbx-lb-satisfiable { text-align: center; color: var(--tbx-link-color, #555); }
|
|
245
|
+
`,Xr=class{constructor(e,t,n,r){this.rowNotes=new Map,this.onDocClick=e=>{this.host.contains(e.target)||this.close()},this.container=e,this.host=t,this.onNavigate=n,this.visitedNotes=r,e.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`#tbx-lb-close`)){this.close();return}let n=t.closest(`.tbx-lb-row`);if(n){let e=this.rowNotes.get(n);e&&(this.close(),this.onNavigate(e))}})}get isOpen(){return this.container.classList.contains(`tbx-open`)}toggle(e){this.isOpen?this.close():this.open(e)}open(e){this.rowNotes.clear(),document.removeEventListener(`click`,this.onDocClick),this.container.innerHTML=`<div id="tbx-lb-header"><span>Links</span><button id="tbx-lb-close">×</button></div>`;let t=e?e.outboundLinks():[];t.length===0&&this.container.insertAdjacentHTML(`beforeend`,`<em>No outbound links</em>`);for(let e of t){let t=e.destNote(),n=e.guard||``,r=n.startsWith(`guard(`)&&n.endsWith(`)`)?n.slice(6,-1):n,i=document.createElement(`div`);i.className=`tbx-lb-row`;let a=document.createElement(`span`);a.className=`tbx-lb-dest`,a.textContent=t?.name??``;let o=document.createElement(`span`);o.className=`tbx-lb-name`,o.textContent=e.name||`—`;let s=document.createElement(`span`);s.className=`tbx-lb-guard`,s.textContent=r;let c=document.createElement(`span`);c.className=`tbx-lb-satisfiable`,c.textContent=e.guardSatisfied(`\0wildcard`,this.visitedNotes)?`✓`:``,i.append(a,o,s,c),t&&this.rowNotes.set(i,t),this.container.appendChild(i)}this.container.classList.add(`tbx-open`),document.addEventListener(`click`,this.onDocClick)}close(){this.container.classList.remove(`tbx-open`),document.removeEventListener(`click`,this.onDocClick)}},Zr=`
|
|
246
|
+
#tbx-history-browser {
|
|
247
|
+
display: none;
|
|
248
|
+
position: absolute;
|
|
249
|
+
top: 0;
|
|
250
|
+
right: 0;
|
|
251
|
+
background: var(--tbx-bg, #fff);
|
|
252
|
+
border: 1px solid var(--tbx-outline-border, #ccc);
|
|
253
|
+
border-radius: 4px;
|
|
254
|
+
box-shadow: 0 2px 10px rgba(0,0,0,0.15);
|
|
255
|
+
padding: 0.6em 0.75em;
|
|
256
|
+
min-width: 14em;
|
|
257
|
+
max-width: 28em;
|
|
258
|
+
max-height: 80vh;
|
|
259
|
+
overflow-y: auto;
|
|
260
|
+
z-index: 10;
|
|
261
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
262
|
+
font-size: 0.85em;
|
|
263
|
+
}
|
|
264
|
+
#tbx-history-browser.tbx-open { display: block; }
|
|
265
|
+
#tbx-hb-header {
|
|
266
|
+
display: flex;
|
|
267
|
+
justify-content: space-between;
|
|
268
|
+
align-items: baseline;
|
|
269
|
+
margin: -0.6em -0.75em 0.5em -0.75em;
|
|
270
|
+
padding: 0.4em 0.75em;
|
|
271
|
+
background: var(--tbx-outline-border, #e8e8e8);
|
|
272
|
+
font-weight: bold;
|
|
273
|
+
border-radius: 4px 4px 0 0;
|
|
274
|
+
}
|
|
275
|
+
#tbx-hb-close { font-weight: normal; font-size: 1.1em; opacity: 0.5; }
|
|
276
|
+
#tbx-hb-close:hover { opacity: 1; }
|
|
277
|
+
.tbx-hb-row {
|
|
278
|
+
padding: 0.25em 0;
|
|
279
|
+
border-top: 1px solid var(--tbx-outline-border, #eee);
|
|
280
|
+
cursor: pointer;
|
|
281
|
+
}
|
|
282
|
+
.tbx-hb-row:hover { background: var(--tbx-hover-bg, #f5f5f5); }
|
|
283
|
+
.tbx-hb-current { font-style: italic; }
|
|
284
|
+
`,Qr=class{constructor(e,t,n,r){this.rowNotes=new Map,this.onDocClick=e=>{this.host.contains(e.target)||this.close()},this.container=e,this.host=t,this.visitedNotes=n,this.onNavigate=r,e.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`#tbx-hb-close`)){this.close();return}let n=t.closest(`.tbx-hb-row`);if(n){let e=this.rowNotes.get(n);e&&(this.close(),this.onNavigate(e))}})}get isOpen(){return this.container.classList.contains(`tbx-open`)}toggle(e){this.isOpen?this.close():this.open(e)}open(e){this.rowNotes.clear(),document.removeEventListener(`click`,this.onDocClick),this.container.innerHTML=`<div id="tbx-hb-header"><span>History</span><button id="tbx-hb-close">×</button></div>`;let t=[...this.visitedNotes].reverse();t.length===0&&this.container.insertAdjacentHTML(`beforeend`,`<em>No history</em>`);for(let n of t){let t=document.createElement(`div`);t.className=n===e?`tbx-hb-row tbx-hb-current`:`tbx-hb-row`,t.textContent=n.name,this.rowNotes.set(t,n),this.container.appendChild(t)}this.container.classList.add(`tbx-open`),document.addEventListener(`click`,this.onDocClick)}close(){this.container.classList.remove(`tbx-open`),document.removeEventListener(`click`,this.onDocClick)}},$r=`
|
|
285
|
+
#tbx-right-col {
|
|
286
|
+
flex: 1;
|
|
287
|
+
min-width: 150px;
|
|
288
|
+
min-height: 0;
|
|
289
|
+
display: flex;
|
|
290
|
+
flex-direction: column;
|
|
291
|
+
}
|
|
292
|
+
#tbx-links-pane {
|
|
293
|
+
max-height: 200px;
|
|
294
|
+
flex-shrink: 0;
|
|
295
|
+
border-top: 1px solid var(--tbx-outline-border, #ddd);
|
|
296
|
+
overflow-y: auto;
|
|
297
|
+
padding: 0.5em 1.5em;
|
|
298
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
299
|
+
font-size: 0.85em;
|
|
300
|
+
display: flex;
|
|
301
|
+
gap: 1.5em;
|
|
302
|
+
transition: max-height 0.25s ease, padding-top 0.25s ease,
|
|
303
|
+
padding-bottom 0.25s ease, border-top-width 0.25s ease;
|
|
304
|
+
}
|
|
305
|
+
#tbx-links-pane.tbx-lp-collapsed {
|
|
306
|
+
max-height: 0;
|
|
307
|
+
padding-top: 0;
|
|
308
|
+
padding-bottom: 0;
|
|
309
|
+
border-top-width: 0;
|
|
310
|
+
overflow-y: hidden;
|
|
311
|
+
}
|
|
312
|
+
.tbx-lp-section {
|
|
313
|
+
flex: 1;
|
|
314
|
+
min-width: 0;
|
|
315
|
+
}
|
|
316
|
+
.tbx-lp-heading {
|
|
317
|
+
font-weight: bold;
|
|
318
|
+
margin-bottom: 0.3em;
|
|
319
|
+
opacity: 0.6;
|
|
320
|
+
font-size: 0.9em;
|
|
321
|
+
text-transform: uppercase;
|
|
322
|
+
letter-spacing: 0.04em;
|
|
323
|
+
}
|
|
324
|
+
.tbx-lp-item {
|
|
325
|
+
padding: 0.15em 0;
|
|
326
|
+
cursor: pointer;
|
|
327
|
+
white-space: nowrap;
|
|
328
|
+
overflow: hidden;
|
|
329
|
+
text-overflow: ellipsis;
|
|
330
|
+
}
|
|
331
|
+
.tbx-lp-item:hover { text-decoration: underline; }
|
|
332
|
+
.tbx-lp-none { opacity: 0.4; font-style: italic; }
|
|
333
|
+
`,ei=class{constructor(e,t){this.itemNotes=new Map,this.visible=!0,this.container=e,this.onNavigate=t,e.addEventListener(`click`,e=>{let t=e.target.closest(`.tbx-lp-item`);if(t){let e=this.itemNotes.get(t);e&&this.onNavigate(e)}})}toggle(){this.visible=!this.visible,this.container.classList.toggle(`tbx-lp-collapsed`,!this.visible)}render(e){this.itemNotes.clear();let t=e.outboundLinks(),n=e.ht.links.filter(t=>t.dest===e&&!t.isPrototype());this.container.innerHTML=``,this.container.appendChild(this.buildSection(`Inbound`,n.map(e=>e.src))),this.container.appendChild(this.buildSection(`Outbound`,t.map(e=>e.destNote()).filter(e=>e!==null)))}buildSection(e,t){let n=document.createElement(`div`);n.className=`tbx-lp-section`;let r=document.createElement(`div`);if(r.className=`tbx-lp-heading`,r.textContent=e,n.appendChild(r),t.length===0){let e=document.createElement(`div`);return e.className=`tbx-lp-none`,e.textContent=`none`,n.appendChild(e),n}for(let e of t){let t=document.createElement(`div`);t.className=`tbx-lp-item`,t.textContent=e.name,t.title=e.name,this.itemNotes.set(t,e),n.appendChild(t)}return n}},ti=`
|
|
334
|
+
#tbx-attrs-pane {
|
|
335
|
+
max-height: 300px;
|
|
336
|
+
flex-shrink: 1;
|
|
337
|
+
min-height: 0;
|
|
338
|
+
border-bottom: 1px solid var(--tbx-outline-border, #ddd);
|
|
339
|
+
overflow-y: auto;
|
|
340
|
+
padding: 0.4em 1.5em;
|
|
341
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
342
|
+
font-size: 0.85em;
|
|
343
|
+
transition: max-height 0.25s ease, padding-top 0.25s ease,
|
|
344
|
+
padding-bottom 0.25s ease, border-bottom-width 0.25s ease;
|
|
345
|
+
}
|
|
346
|
+
#tbx-attrs-pane.tbx-da-collapsed {
|
|
347
|
+
max-height: 0;
|
|
348
|
+
padding-top: 0;
|
|
349
|
+
padding-bottom: 0;
|
|
350
|
+
border-bottom-width: 0;
|
|
351
|
+
overflow-y: hidden;
|
|
352
|
+
}
|
|
353
|
+
.tbx-da-row {
|
|
354
|
+
display: grid;
|
|
355
|
+
grid-template-columns: minmax(6em, 1fr) 2fr;
|
|
356
|
+
align-items: start;
|
|
357
|
+
gap: 0.5em;
|
|
358
|
+
padding: 0.15em 0;
|
|
359
|
+
border-bottom: 1px solid var(--tbx-outline-border, #eee);
|
|
360
|
+
}
|
|
361
|
+
.tbx-da-row:last-child { border-bottom: none; }
|
|
362
|
+
.tbx-da-name {
|
|
363
|
+
opacity: 0.6;
|
|
364
|
+
overflow: hidden;
|
|
365
|
+
text-overflow: ellipsis;
|
|
366
|
+
white-space: nowrap;
|
|
367
|
+
}
|
|
368
|
+
.tbx-da-value {
|
|
369
|
+
opacity: 0.6;
|
|
370
|
+
overflow: hidden;
|
|
371
|
+
text-overflow: ellipsis;
|
|
372
|
+
white-space: nowrap;
|
|
373
|
+
}
|
|
374
|
+
.tbx-da-local .tbx-da-name,
|
|
375
|
+
.tbx-da-local .tbx-da-value {
|
|
376
|
+
opacity: 1;
|
|
377
|
+
font-weight: bold;
|
|
378
|
+
color: #000;
|
|
379
|
+
}
|
|
380
|
+
.tbx-da-empty {
|
|
381
|
+
opacity: 0.4;
|
|
382
|
+
font-style: italic;
|
|
383
|
+
}
|
|
384
|
+
`,ni=class{constructor(e){this.visible=!1,this.container=e,this.container.classList.add(`tbx-da-collapsed`)}toggle(){this.visible=!this.visible,this.container.classList.toggle(`tbx-da-collapsed`,!this.visible)}render(e){let t=e.get(`DisplayedAttributes`).trim(),n=t?t.split(`;`).map(e=>e.trim()).filter(Boolean):[];if(this.container.innerHTML=``,n.length===0){let e=document.createElement(`div`);e.className=`tbx-da-empty`,e.textContent=`No displayed attributes`,this.container.appendChild(e);return}for(let t of n){let n=e.attributes.has(t),r=e.get(t),i=e.ht.attributes.get(t)?.lines??1,a=document.createElement(`div`);a.className=n?`tbx-da-row tbx-da-local`:`tbx-da-row`;let o=document.createElement(`div`);o.className=`tbx-da-name`,o.textContent=t,o.title=t;let s=document.createElement(`div`);s.className=`tbx-da-value`,s.textContent=r,s.title=r,i>1&&(s.style.cssText=`white-space:pre-wrap;-webkit-line-clamp:${i};display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;`),a.appendChild(o),a.appendChild(s),this.container.appendChild(a)}}};function ri(e){return e.map(e=>{if(e.kind===`sep`)return`<div class="tbx-menu-sep"></div>`;let t=`tbx-menu-item${e.active?` tbx-active`:``}`,n=e.dataset?Object.entries(e.dataset).filter(([e])=>/^[a-zA-Z0-9][a-zA-Z0-9\-_.:]*$/.test(e)).map(([e,t])=>` data-${e}="${V(t)}"`).join(``):``,r=e.key?`<span class="tbx-menu-key">${V(e.key)}</span>`:``;return`<div class="${t}"${n}>${V(e.label)}${r}</div>`}).join(``)}var ii=class{constructor(){this._note=null,this.el=document.createElement(`div`),this.el.id=`tbx-context-menu`,this.el.addEventListener(`click`,e=>{let t=e.target.closest(`[data-ctx-action]`);if(t&&this._note){let e=t.getAttribute(`data-ctx-action`)??``,n=this._note;this.close(),this.onAction?.(e,n)}e.stopPropagation()})}get isOpen(){return this._note!==null}get note(){return this._note}closeIfOutside(e){this._note!==null&&!this.el.contains(e)&&this.close()}open(e,t,n,r){this._note=e,this.el.innerHTML=ri(t),this.el.style.left=`-9999px`,this.el.style.top=`-9999px`,this.el.classList.add(`tbx-open`);let i=this.el.offsetWidth,a=this.el.offsetHeight;this.el.style.left=`${Math.max(0,Math.min(n,window.innerWidth-i-8))}px`,this.el.style.top=`${Math.max(0,Math.min(r,window.innerHeight-a-8))}px`}close(){this.el.classList.remove(`tbx-open`),this._note=null}},ai=`
|
|
385
|
+
.tbx-dropdown-menu {
|
|
386
|
+
display: none;
|
|
387
|
+
position: fixed;
|
|
388
|
+
background: var(--tbx-bg, #fff);
|
|
389
|
+
border: 1px solid var(--tbx-outline-border, #ccc);
|
|
390
|
+
border-radius: 4px;
|
|
391
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.12);
|
|
392
|
+
z-index: 20;
|
|
393
|
+
min-width: 10em;
|
|
394
|
+
padding: 0.25em 0;
|
|
395
|
+
}
|
|
396
|
+
.tbx-dropdown-menu.tbx-open { display: block; }
|
|
397
|
+
|
|
398
|
+
.tbx-menu-item {
|
|
399
|
+
padding: 0.3em 0.75em;
|
|
400
|
+
cursor: pointer;
|
|
401
|
+
font-size: 0.85em;
|
|
402
|
+
font-family: var(--tbx-outline-font-family, Helvetica, Arial, sans-serif);
|
|
403
|
+
display: flex;
|
|
404
|
+
justify-content: space-between;
|
|
405
|
+
gap: 1.5em;
|
|
406
|
+
}
|
|
407
|
+
.tbx-menu-item:hover { background: var(--tbx-selected-bg, #e8e8e8); }
|
|
408
|
+
.tbx-menu-item.tbx-active { font-weight: bold; }
|
|
409
|
+
.tbx-menu-key { color: var(--tbx-muted, #aaa); font-weight: normal; }
|
|
410
|
+
.tbx-menu-sep {
|
|
411
|
+
border: none;
|
|
412
|
+
border-top: 1px solid var(--tbx-outline-border, #ccc);
|
|
413
|
+
margin: 0.25em 0;
|
|
414
|
+
}
|
|
415
|
+
`,oi=class{constructor(e,t,n){this.shadow=e,this.buttonId=t,this.menuId=n,this._isOpen=!1,this.el=document.createElement(`div`),this.el.id=n,this.el.classList.add(`tbx-dropdown-menu`),this.el.addEventListener(`click`,e=>{let t=e.target.closest(`.tbx-menu-item`);t&&(e.stopPropagation(),this.close(),this.onItemClick?.(t))})}get isOpen(){return this._isOpen}close(){this._isOpen&&(this._isOpen=!1,this.el.classList.remove(`tbx-open`))}toggle(e=[]){if(this._isOpen=!this._isOpen,this._isOpen){e.forEach(e=>{e!==this&&e.close()});let t=this.shadow.querySelector(`#${CSS.escape(this.buttonId)}`);if(t){let e=t.getBoundingClientRect();this.el.style.left=`-9999px`,this.el.style.top=`-9999px`,this.el.classList.add(`tbx-open`);let n=this.el.offsetWidth,r=this.el.offsetHeight;this.el.style.left=`${Math.max(0,Math.min(e.left,window.innerWidth-n-8))}px`,this.el.style.top=`${Math.max(0,Math.min(e.bottom,window.innerHeight-r-8))}px`;return}}this.el.classList.toggle(`tbx-open`,this._isOpen)}closeIfOutside(e){this._isOpen&&!this.el.contains(e)&&!e.closest(`#${CSS.escape(this.buttonId)}`)&&this.close()}},si=`
|
|
416
|
+
#tbx-context-menu {
|
|
417
|
+
display: none;
|
|
418
|
+
position: fixed;
|
|
419
|
+
background: var(--tbx-bg, #fff);
|
|
420
|
+
border: 1px solid var(--tbx-outline-border, #ccc);
|
|
421
|
+
border-radius: 4px;
|
|
422
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.12);
|
|
423
|
+
z-index: 500;
|
|
424
|
+
min-width: 10em;
|
|
425
|
+
padding: 0.25em 0;
|
|
426
|
+
}
|
|
427
|
+
#tbx-context-menu.tbx-open { display: block; }
|
|
428
|
+
`,ci=`
|
|
429
|
+
/* ── About overlay ──────────────────────────────────────────────── */
|
|
430
|
+
#tbx-about-overlay {
|
|
431
|
+
position: fixed;
|
|
432
|
+
inset: 0;
|
|
433
|
+
background: rgba(0,0,0,0.35);
|
|
434
|
+
display: flex;
|
|
435
|
+
align-items: center;
|
|
436
|
+
justify-content: center;
|
|
437
|
+
z-index: 1000;
|
|
438
|
+
}
|
|
439
|
+
#tbx-about-overlay.tbx-hidden { display: none; }
|
|
440
|
+
#tbx-about {
|
|
441
|
+
background: #f2f2f2;
|
|
442
|
+
border-radius: 12px;
|
|
443
|
+
box-shadow: 0 8px 40px rgba(0,0,0,0.45);
|
|
444
|
+
width: 320px;
|
|
445
|
+
overflow: hidden;
|
|
446
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif;
|
|
447
|
+
font-size: 14px;
|
|
448
|
+
line-height: 1.5;
|
|
449
|
+
color: #222;
|
|
450
|
+
}
|
|
451
|
+
.tbx-about-header {
|
|
452
|
+
padding: 24px 20px 14px;
|
|
453
|
+
text-align: center;
|
|
454
|
+
}
|
|
455
|
+
.tbx-about-appname { font-weight: bold; font-size: 1.1em; margin-bottom: 0.2em; }
|
|
456
|
+
.tbx-about-version { font-size: 0.85em; color: #666; }
|
|
457
|
+
.tbx-about-body {
|
|
458
|
+
background: #e8eede;
|
|
459
|
+
border-top: 1px solid #d0d4c8;
|
|
460
|
+
border-bottom: 1px solid #d0d4c8;
|
|
461
|
+
padding: 12px 18px;
|
|
462
|
+
font-size: 0.82em;
|
|
463
|
+
}
|
|
464
|
+
.tbx-about-section { margin-bottom: 10px; }
|
|
465
|
+
.tbx-about-section:last-child { margin-bottom: 0; }
|
|
466
|
+
.tbx-about-section strong { display: block; }
|
|
467
|
+
.tbx-about-footer {
|
|
468
|
+
padding: 12px 18px;
|
|
469
|
+
text-align: center;
|
|
470
|
+
font-size: 0.75em;
|
|
471
|
+
color: #666;
|
|
472
|
+
}
|
|
473
|
+
`,li=class{constructor(e){this.el=document.createElement(`div`),this.el.id=`tbx-about-overlay`,this.el.classList.add(`tbx-hidden`),this.el.innerHTML=`<div id="tbx-about"><div class="tbx-about-header"><div class="tbx-about-appname">Tinderbox Reader</div><div class="tbx-about-version">Version ${e}</div></div><div class="tbx-about-body"><div class="tbx-about-section"><strong>By:</strong><a href="https://www.eastgate.com" target="_blank">Eastgate Systems, Inc.</a><br>134 Main Street, Watertown MA 02472 USA<br>(800) 562-1638 +1 (617) 924-9044<br>info@eastgate.com</div><div class="tbx-about-section"><strong>Designer:</strong>Mark Bernstein</div></div><div class="tbx-about-footer">© 2002–2026 Eastgate Systems Inc. Released under the MIT License.</div></div>`}get isOpen(){return!this.el.classList.contains(`tbx-hidden`)}open(){this.el.classList.remove(`tbx-hidden`)}close(){this.el.classList.add(`tbx-hidden`)}},ui=`0.1.1`,di=[[`map`,`Map`,`⌘⌥M`],[`outline`,`Outline`,`⌘⌥O`],[`treemap`,`Treemap`,`⌘⌥P`],[`gaudi`,`Gaudí`,`⌘⌥G`],[`hyperbolic`,`Hyperbolic`,`⌃⌘H`]],fi=ai+si+ci+`
|
|
474
|
+
#tbx-toolbar {
|
|
475
|
+
display: flex;
|
|
476
|
+
flex-shrink: 0;
|
|
477
|
+
align-items: center;
|
|
478
|
+
min-height: 1.5em;
|
|
479
|
+
margin-bottom: 0.5em;
|
|
480
|
+
padding: 0.25em 0.75em;
|
|
481
|
+
position: relative;
|
|
482
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif;
|
|
483
|
+
}
|
|
484
|
+
#tbx-toolbar-left {
|
|
485
|
+
width: calc(var(--tbx-outline-width, 12em) + 0.75em);
|
|
486
|
+
flex-shrink: 0;
|
|
487
|
+
display: flex;
|
|
488
|
+
align-items: baseline;
|
|
489
|
+
gap: 0.75em;
|
|
490
|
+
}
|
|
491
|
+
#tbx-toolbar-right {
|
|
492
|
+
display: flex;
|
|
493
|
+
gap: 0.75em;
|
|
494
|
+
align-items: center;
|
|
495
|
+
margin-left: auto;
|
|
496
|
+
}
|
|
497
|
+
button {
|
|
498
|
+
background: none;
|
|
499
|
+
border: none;
|
|
500
|
+
cursor: pointer;
|
|
501
|
+
font-size: 1em;
|
|
502
|
+
padding: 0;
|
|
503
|
+
color: var(--tbx-link-color, inherit);
|
|
504
|
+
opacity: 0.6;
|
|
505
|
+
}
|
|
506
|
+
#tbx-back { font-size: 1.2em; }
|
|
507
|
+
#tbx-app { font-weight: bold; }
|
|
508
|
+
button:hover:not(:disabled) { opacity: 1; }
|
|
509
|
+
button:disabled { opacity: 0.25; cursor: default; }
|
|
510
|
+
`,pi=[`tbx-back`,`tbx-cover`,`tbx-right`,`tbx-down`,`tbx-links`,`tbx-history`],mi=class{constructor(e){this.shadow=e,this.viewMenu=new oi(e,`tbx-view`,`tbx-view-menu`),this.appMenu=new oi(e,`tbx-app`,`tbx-app-menu`),this.menuBar=[this.viewMenu,this.appMenu],this.contextMenu=new ii,this.about=new li(ui);let t=e=>{let t=e.dataset.view;if(t&&Wr(t)){this.onSwitchView?.(t);return}let n=e.dataset.action;if(n===`about`){this.about.open();return}n&&this.onAction?.(n)};this.viewMenu.onItemClick=t,this.appMenu.onItemClick=t,this.appMenu.el.innerHTML=ri([{kind:`item`,label:`About…`,dataset:{action:`about`}}]),this.contextMenu.onAction=(e,t)=>{e===`open-in-new-tab`&&this.onOpenInNewTab?.(t)},e.appendChild(this.viewMenu.el),e.appendChild(this.appMenu.el),e.appendChild(this.contextMenu.el),e.appendChild(this.about.el),this.el=document.createElement(`div`),this.el.id=`tbx-toolbar`,this.el.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`#tbx-app`)){this.appMenu.toggle(this.menuBar),e.stopPropagation();return}if(t.closest(`#tbx-view`)){this.viewMenu.toggle(this.menuBar),e.stopPropagation();return}for(let n of pi)if(t.closest(`#${n}`)){this.onNavButton?.(n),e.stopPropagation();return}})}get toolbarLeftEl(){return this.el.querySelector(`#tbx-toolbar-left`)}update(e){let{note:t,hasHistory:n,hasCover:r,viewMode:i,linksVisible:a,attrsVisible:o}=e,s=n?`<button id="tbx-back">←</button>`:``,c=r?`<button id="tbx-cover">cover</button>`:``,l=`<button id="tbx-right"${t?.brother?``:` disabled`}>→</button>`,u=`<button id="tbx-down"${t?.son?``:` disabled`}>↓</button>`;this.el.innerHTML=`<div id="tbx-toolbar-left"><button id="tbx-app">Tinderbox Reader</button><button id="tbx-view">View</button></div>${s}<div id="tbx-toolbar-right">${c}<button id="tbx-links">links</button><button id="tbx-history">history</button>${l}${u}</div>`;let d=a?`Hide Links`:`Show Links`,f=o?`Hide Attributes`:`Show Attributes`,p=[...di.map(([e,t,n])=>({kind:`item`,label:t,key:n,active:e===i,dataset:{view:e}})),{kind:`sep`},{kind:`item`,label:d,key:`⌘⌥L`,dataset:{action:`toggle-links-pane`}},{kind:`item`,label:f,key:`⌘⇧K`,dataset:{action:`toggle-attrs-pane`}}];this.viewMenu.el.innerHTML=ri(p)}openContextMenu(e,t,n){this.contextMenu.open(e,[{kind:`item`,label:`Open in New Tab`,dataset:{"ctx-action":`open-in-new-tab`}}],t,n)}closeAll(){let e=this.contextMenu.isOpen||this.about.isOpen||this.menuBar.some(e=>e.isOpen);return this.contextMenu.close(),this.about.close(),this.menuBar.forEach(e=>e.close()),e}closeOverlaysIfOutside(e){return this.contextMenu.closeIfOutside(e),e===this.about.el?(this.about.close(),!0):(this.menuBar.forEach(t=>t.closeIfOutside(e)),!1)}},hi=`
|
|
511
|
+
#tbx-divider {
|
|
512
|
+
width: 5px;
|
|
513
|
+
flex-shrink: 0;
|
|
514
|
+
cursor: col-resize;
|
|
515
|
+
background: var(--tbx-outline-border, #ddd);
|
|
516
|
+
transition: background 0.15s;
|
|
517
|
+
}
|
|
518
|
+
#tbx-divider:hover, #tbx-divider.tbx-dragging {
|
|
519
|
+
background: var(--tbx-divider-active, #aaa);
|
|
520
|
+
}
|
|
521
|
+
`,gi=class{constructor(e,t,n){this.leftCol=e,this.panes=t,this.getNavLeft=n,this.moveListener=null,this.upListener=null,this.onMousedown=e=>{this.moveListener&&document.removeEventListener(`mousemove`,this.moveListener),this.upListener&&document.removeEventListener(`mouseup`,this.upListener);let t=e.clientX,n=this.leftCol.offsetWidth,r=this.getNavLeft();this.el.classList.add(`tbx-dragging`),this.panes.style.userSelect=`none`,this.moveListener=e=>{let i=this.panes.offsetWidth-this.el.offsetWidth-150,a=Math.min(i,Math.max(150,n+e.clientX-t));this.leftCol.style.width=`${a}px`,r&&(r.style.width=`${this.leftCol.offsetWidth}px`)},this.upListener=()=>{this.el.classList.remove(`tbx-dragging`),this.panes.style.userSelect=``,document.removeEventListener(`mousemove`,this.moveListener),document.removeEventListener(`mouseup`,this.upListener),this.moveListener=null,this.upListener=null},document.addEventListener(`mousemove`,this.moveListener),document.addEventListener(`mouseup`,this.upListener)},this.el=document.createElement(`div`),this.el.id=`tbx-divider`,this.el.addEventListener(`mousedown`,this.onMousedown)}},_i=`
|
|
522
|
+
:host {
|
|
523
|
+
display: flex;
|
|
524
|
+
flex-direction: column;
|
|
525
|
+
height: 100vh;
|
|
526
|
+
box-sizing: border-box;
|
|
527
|
+
font-family: var(--tbx-font-family, Georgia, serif);
|
|
528
|
+
font-size: var(--tbx-font-size, 1rem);
|
|
529
|
+
line-height: var(--tbx-line-height, 1.4);
|
|
530
|
+
color: var(--tbx-color, #222);
|
|
531
|
+
max-width: var(--tbx-max-width, none);
|
|
532
|
+
margin: var(--tbx-margin, 0);
|
|
533
|
+
padding: var(--tbx-padding, 0);
|
|
534
|
+
--tbx-accent: #2266cc;
|
|
535
|
+
}
|
|
536
|
+
@media (prefers-reduced-motion: reduce) {
|
|
537
|
+
.tbx-map-selected,
|
|
538
|
+
.tbx-tm-selected,
|
|
539
|
+
#tbx-gaudi-pane .tbx-gaudi-sel,
|
|
540
|
+
.tbx-hyp-node.tbx-hyp-current rect { animation: none !important; }
|
|
541
|
+
}
|
|
542
|
+
@keyframes tbx-sel-pulse {
|
|
543
|
+
from { outline-color: var(--tbx-accent, #2266cc); }
|
|
544
|
+
to { outline-color: color-mix(in srgb, var(--tbx-accent, #2266cc) 50%, black); }
|
|
545
|
+
}
|
|
546
|
+
@keyframes tbx-svg-pulse {
|
|
547
|
+
from { stroke-opacity: 1; }
|
|
548
|
+
to { stroke-opacity: 0.5; }
|
|
549
|
+
}
|
|
550
|
+
#tbx-panes {
|
|
551
|
+
display: flex;
|
|
552
|
+
gap: 0;
|
|
553
|
+
position: relative;
|
|
554
|
+
flex: 1;
|
|
555
|
+
min-height: 0;
|
|
556
|
+
}
|
|
557
|
+
#tbx-left-col {
|
|
558
|
+
width: var(--tbx-outline-width, 12em);
|
|
559
|
+
flex-shrink: 0;
|
|
560
|
+
min-height: 0;
|
|
561
|
+
display: flex;
|
|
562
|
+
flex-direction: column;
|
|
563
|
+
}
|
|
564
|
+
#tbx-outline {
|
|
565
|
+
flex: 1;
|
|
566
|
+
min-height: 0;
|
|
567
|
+
overflow-x: hidden;
|
|
568
|
+
overflow-y: auto;
|
|
569
|
+
padding-right: 0.75em;
|
|
570
|
+
}
|
|
571
|
+
#tbx-outline-pane { padding-left: 12px; }
|
|
572
|
+
`;function $(e,t,n=``){let r=document.createElement(`div`);return r.id=t,n&&(r.style.cssText=n),e.appendChild(r),r}var vi=class extends HTMLElement{static{this.observedAttributes=[`src`,`note`,`view`,`user-css`]}toggleLinksPane(){this.linksPane.toggle(),this.updateToolbar()}toggleAttrsPane(){this.attrsPane.toggle(),this.updateToolbar()}switchView(e){this.paneManager.switchView(e,this.nav.currentNote),this.updateToolbar(),this.syncUrl(this.nav.currentNote,e)}get currentSrc(){return this.effectiveSrc??this.getAttribute(`src`)}syncUrl(e=this.nav.currentNote,t=this.paneManager.mode){let n=this.currentSrc;n&&e&&history.replaceState(null,``,`?`+new URLSearchParams({src:n,note:e.path,view:t}).toString())}constructor(){super(),this.ht=null,this.pendingNote=null,this.effectiveSrc=null,this.hasConnected=!1,this.onKeydown=e=>{if(e.key===`Enter`&&this.nav.enterKey(),e.metaKey&&(e.key===`-`||e.key===`=`)&&this.paneManager.mode===`map`&&(e.preventDefault(),this.mapView.zoom(e.key===`=`?1.25:1/1.25)),(e.key===`ArrowLeft`||e.key===`ArrowRight`||e.key===`ArrowUp`||e.key===`ArrowDown`||e.key===`PageUp`||e.key===`PageDown`||e.key===`Home`||e.key===`End`)&&this.paneManager.onArrow(e)&&e.preventDefault(),e.metaKey&&e.altKey){let t={KeyM:`map`,KeyO:`outline`,KeyG:`gaudi`,KeyP:`treemap`}[e.code];t&&(e.preventDefault(),this.switchView(t))}if(e.key===`Escape`){this.toolbar.closeAll();return}e.metaKey&&e.altKey&&e.code===`KeyL`&&(e.preventDefault(),this.toggleLinksPane()),e.metaKey&&e.shiftKey&&e.code===`KeyK`&&(e.preventDefault(),this.toggleAttrsPane()),e.metaKey&&e.ctrlKey&&e.code===`KeyH`&&(e.preventDefault(),this.switchView(`hyperbolic`))},this.navHandlers={"tbx-back":()=>this.nav.goBack(),"tbx-cover":()=>{let e=this.ht?.root?.son;e&&(this.nav.reset(),this.nav.show(e))},"tbx-right":()=>{let e=this.nav.currentNote;e?.brother&&this.nav.navigateTo(e.brother)},"tbx-down":()=>{let e=this.nav.currentNote;e?.son&&this.nav.navigateTo(e.son)},"tbx-links":()=>{this.historyBrowser.close(),this.linkBrowser.toggle(this.nav.currentNote)},"tbx-history":()=>{this.linkBrowser.close(),this.historyBrowser.toggle(this.nav.currentNote)}},this.onContextMenu=e=>{if(!this.ht)return;let t=e.target.closest(`[data-id],[data-nav]`);if(!t)return;e.preventDefault();let n=parseInt(t.getAttribute(`data-id`)??t.getAttribute(`data-nav`)??`0`,10),r=this.ht.findNoteById(n);r&&this.toolbar.openContextMenu(r,e.clientX,e.clientY)},this.onShadowClick=e=>{let t=e.target;this.toolbar.closeOverlaysIfOutside(t)||(!t.closest(`#tbx-link-browser`)&&!t.closest(`#tbx-links`)&&this.linkBrowser.close(),!t.closest(`#tbx-history-browser`)&&!t.closest(`#tbx-history`)&&this.historyBrowser.close())},this.shadow=this.attachShadow({mode:`open`});let e=document.createElement(`style`);e.textContent=_i+fi+gt+Un+Kr+hi+Lt+En+Vn+Lr+Yr+Zr+$r+ti,this.shadow.appendChild(e),this.userStyle=document.createElement(`style`),this.shadow.appendChild(this.userStyle),this.toolbar=new mi(this.shadow),this.toolbar.onNavButton=e=>this.navHandlers[e]?.(),this.toolbar.onSwitchView=e=>this.switchView(e),this.toolbar.onAction=e=>{e===`toggle-links-pane`&&this.toggleLinksPane(),e===`toggle-attrs-pane`&&this.toggleAttrsPane()},this.toolbar.onOpenInNewTab=e=>{let t=new URL(location.href);t.searchParams.set(`note`,e.path),window.open(t.toString(),`_blank`)},this.shadow.appendChild(this.toolbar.el),this.panesEl=$(this.shadow,`tbx-panes`),this.leftColEl=$(this.panesEl,`tbx-left-col`),this.breadcrumbBar=new Jr($(this.leftColEl,`tbx-breadcrumbs`)),this.outlineEl=$(this.leftColEl,`tbx-outline`),this.divider=new gi(this.leftColEl,this.panesEl,()=>this.toolbar.toolbarLeftEl),this.panesEl.appendChild(this.divider.el);let t=$(this.panesEl,`tbx-right-col`),n=$(t,`tbx-attrs-pane`);this.contentEl=$(t,`tbx-content`);let r=$(t,`tbx-links-pane`),i=$(this.panesEl,`tbx-link-browser`),a=$(this.panesEl,`tbx-history-browser`),o=e=>this.nav.navigateTo(e);this.textView=new _t(this.contentEl,o),this.mapView=new Rt(this.outlineEl,o);let s=new Map([[`map`,{view:this.mapView,wide:!0,fillHeight:!0}],[`outline`,{view:new Gn(this.outlineEl,o),wide:!1,fillHeight:!1}],[`treemap`,{view:new Hn(this.outlineEl,o),wide:!0,fillHeight:!0}],[`gaudi`,{view:new Ir(this.outlineEl,o),wide:!0,fillHeight:!0}],[`hyperbolic`,{view:new Dn(this.outlineEl,o),wide:!0,fillHeight:!1}]]);this.paneManager=new Gr(s,`hyperbolic`,this.leftColEl,this.outlineEl,()=>this.toolbar.toolbarLeftEl),this.paneManager.connectBreadcrumbs(()=>this.breadcrumbBar.update(this.paneManager.getViewRoot())),this.breadcrumbBar.onCrumbClick=e=>{this.nav.currentNote&&(this.paneManager.hoistTo(e,this.nav.currentNote),this.paneManager.updateBreadcrumbs())},this.nav=new ut(e=>{this.toolbar.closeAll(),this.updateToolbar(),this.paneManager.updateVisibility(),this.textView.render(e),this.paneManager.renderCurrent(e),this.paneManager.updateBreadcrumbs(),this.linksPane.render(e),this.attrsPane.render(e),this.syncUrl(e)}),this.linksPane=new ei(r,e=>this.nav.navigateTo(e)),this.attrsPane=new ni(n),this.linkBrowser=new Xr(i,this,e=>this.nav.navigateTo(e),this.nav.visitedNotes),this.historyBrowser=new Qr(a,this,this.nav.visitedNotes,e=>{this.nav.truncateVisitedAt(e),e!==this.nav.currentNote&&this.nav.show(e)}),this.contentEl.addEventListener(`click`,e=>{let t=e.target;if(t.closest(`a`))return;let n=Hr(e.clientX,e.clientY,t);n&&this.nav.recordWord(n)}),this.panesEl.addEventListener(`contextmenu`,this.onContextMenu),this.shadow.addEventListener(`click`,this.onShadowClick)}connectedCallback(){document.addEventListener(`keydown`,this.onKeydown),this.hasConnected=!0;let e=this.getAttribute(`view`);e&&Wr(e)&&this.paneManager.switchTo(e);let t=new URLSearchParams(location.search),n=t.get(`src`),r=t.get(`note`),i=t.get(`view`);n&&(this.effectiveSrc=n),r&&(this.pendingNote=r),i&&Wr(i)&&this.paneManager.switchTo(i),this.load()}disconnectedCallback(){document.removeEventListener(`keydown`,this.onKeydown)}attributeChangedCallback(e){if(e===`src`)this.ht=null,this.nav.reset(),this.pendingNote=null,this.effectiveSrc=null,this.isConnected&&this.hasConnected&&this.load();else if(e===`view`){if(!this.hasConnected)return;let e=this.getAttribute(`view`);e&&Wr(e)&&this.switchView(e)}else if(e===`user-css`)this.userStyle.textContent=this.getAttribute(`user-css`)??``;else if(e===`note`){let e=this.getAttribute(`note`);if(this.ht){if(e){let t=this.ht.findNote(e);t&&this.nav.show(t)}}else this.pendingNote=e}}async load(){let e=this.currentSrc;if(!e)return;this.contentEl.innerHTML=`<em>Loading…</em>`;let t;try{let n=await fetch(e);if(!n.ok)throw Error(`HTTP ${n.status}`);t=await n.text()}catch(t){this.contentEl.innerHTML=`<em>Could not load ${e}: ${t}</em>`;return}this.ht=lt(Ge(t));let n=this.ht.root?.son;if(!n){this.contentEl.innerHTML=`<em>No notes found in document.</em>`;return}let r=this.pendingNote?this.ht.findNote(this.pendingNote)??n:n;this.pendingNote=null,this.nav.show(r)}updateToolbar(){let e={note:this.nav.currentNote,hasHistory:this.nav.history.length>0,hasCover:!!this.ht?.root?.son,viewMode:this.paneManager.mode,linksVisible:this.linksPane.visible,attrsVisible:this.attrsPane.visible};this.toolbar.update(e)}};return customElements.define(`tbx-document`,vi),e.TbxDocument=vi,e})({});
|