diff --git a/customize.dist/src/less2/include/markdown.less b/customize.dist/src/less2/include/markdown.less index 7a8fc0ddf..b07fc9477 100644 --- a/customize.dist/src/less2/include/markdown.less +++ b/customize.dist/src/less2/include/markdown.less @@ -93,7 +93,13 @@ border: 1px solid #BBB; } - pre.mermaid { + pre.markmap { + border: 1px solid #ddd; + svg { + height: 400px; + } + } + pre[data-plugin] { svg { max-width: 100%; cursor: pointer; diff --git a/customize.dist/src/less2/include/modals-ui-elements.less b/customize.dist/src/less2/include/modals-ui-elements.less index c407c8523..e8282f6e8 100644 --- a/customize.dist/src/less2/include/modals-ui-elements.less +++ b/customize.dist/src/less2/include/modals-ui-elements.less @@ -150,6 +150,16 @@ overflow: unset; margin-bottom: 0; } + pre.markmap { + margin-bottom: 0; + max-height: 100%; + overflow: hidden; + display: flex; + flex-flow: column; + svg { + flex: 1; + } + } .cp-spinner { border-color: @colortheme_logo-1; border-top-color: transparent; diff --git a/www/common/diffMarked.js b/www/common/diffMarked.js index 3f53c1c64..e25be2c9d 100644 --- a/www/common/diffMarked.js +++ b/www/common/diffMarked.js @@ -2,7 +2,6 @@ define([ 'jquery', '/api/config', '/bower_components/marked/marked.min.js', - '/bower_components/MathJax/es5/tex-svg.js', '/common/common-hash.js', '/common/common-util.js', '/common/hyperscript.js', @@ -10,14 +9,17 @@ define([ '/common/media-tag.js', '/common/highlight/highlight.pack.js', '/customize/messages.js', - '/code/markmap/markmap-lib.transform.bundle.js', - '/code/markmap/markmap-lib.view.bundle.js', + '/lib/markmap/transform.min.js', + '/lib/markmap/view.min.js', + '/bower_components/MathJax/es5/tex-svg.js', '/bower_components/diff-dom/diffDOM.js', '/bower_components/tweetnacl/nacl-fast.min.js', 'css!/common/highlight/styles/github.css' -],function ($, ApiConfig, Marked, MathJax, Hash, Util, h, MT, MediaTag, Highlight, Messages, transform, Markmap) { +],function ($, ApiConfig, Marked, Hash, Util, h, MT, MediaTag, Highlight, Messages, + MarkMapTransform, Markmap) { var DiffMd = {}; + var MathJax = window.MathJax; var DiffDOM = window.diffDOM; var renderer = new Marked.Renderer(); var restrictedRenderer = new Marked.Renderer(); @@ -26,9 +28,6 @@ define([ init: function () {} }; - - var MathJax = window.MathJax; - var mermaidThemeCSS = //".node rect { fill: #DDD; stroke: #AAA; } " + "rect.task, rect.task0, rect.task2 { stroke-width: 1 !important; rx: 0 !important; } " + "g.grid g.tick line { opacity: 0.25; }" + @@ -100,15 +99,10 @@ define([ var defaultCode = renderer.code; renderer.code = function (code, language) { if (language === 'mermaid' && code.match(/^(graph|pie|gantt|sequenceDiagram|classDiagram|gitGraph)/)) { - return '
'+Util.fixHTML(code)+''; - } else if (language === 'markdown markmap') { - return '
'+Util.fixHTML(code)+''; - /* - var data = transform.transform(code); - var svgEl = document.createElement("svg"); - return '
'+ svgEl.outerHTML +''; - */ - } else if (language === 'mathjax') { + return '
'+Util.fixHTML(code)+''; + } else if (language === 'markmap') { + return '
'+Util.fixHTML(code)+''; + } else if (language === 'mathjax') { var svg = MathJax.tex2svg(code, {display: true}) return '
'+ svg.innerHTML.replace(/xlink:href/g, "href") +''; } else { @@ -313,6 +307,8 @@ define([ return patch; }; + var plugins = {}; + var removeMermaidClickables = function ($el) { // find all links in the tree and do the following for each one $el.find('a').each(function (index, a) { @@ -329,24 +325,74 @@ define([ // finally, find all 'clickable' items and remove the class $el.find('.clickable').removeClass('clickable'); }; - var renderMermaid = function ($el) { - Mermaid.init(undefined, $el); - // clickable elements in mermaid don't work well with our sandboxing setup - // the function below strips clickable elements but still leaves behind some artifacts - // tippy tooltips might still be useful, so they're not removed. It would be - // preferable to just support links, but this covers up a rough edge in the meantime - removeMermaidClickables($el); + + plugins.mermaid = { + name: 'mermaid', + attr: 'mermaid-source', + render: function ($el) { + Mermaid.init(undefined, $el); + // clickable elements in mermaid don't work well with our sandboxing setup + // the function below strips clickable elements but still leaves behind some artifacts + // tippy tooltips might still be useful, so they're not removed. It would be + // preferable to just support links, but this covers up a rough edge in the meantime + removeMermaidClickables($el); + } }; - var renderMarkmap = function ($el) { - var data = transform.transform($el[0].getAttribute("markmap-source")); - $el[0].innerHTML = "" - Markmap.markmap($el[0].firstChild, data) - removeMermaidClickables($el); - } + var sfCommon; + var fixMathjaxClickables = function ($svg) { + // find all links in the tree and do the following for each one + var onClick = function (e) { + e.preventDefault(); + e.stopImmediatePropagation(); + var $el = $(e.target); + // Open links only from the preview modal + if (!sfCommon) { return void console.error('No sfCommon'); } + + var href = $el.attr('href'); + if (!href || !/^(https?:\/\/|\/)/.test(href)) { return; } + + if (/^http/.test(href)) { + sfCommon.openUnsafeURL(href); + return; + } + sfCommon.openURL(href); + }; + $svg.find('a').click(onClick); + // make sure the links added later by collapsing/expading the map are also safe + var observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.type === 'childList') { + var n, $a; + for (var i = 0; i < mutation.addedNodes.length; i++) { + n = mutation.addedNodes[i]; + if (n.nodeName === "A") { return void n.addEventListener('click', onClick); } + $(n).find('a').click(onClick); + } + } + }); + }); + observer.observe($svg[0], { + childList: true, + subtree: true + }); + }; + + plugins.markmap = { + name: 'markmap', + attr: 'markmap-source', + render: function ($el) { + var data = MarkMapTransform.transform($el[0].getAttribute("markmap-source")); + $el[0].innerHTML = "" + Markmap.markmap($el[0].firstChild, data) + fixMathjaxClickables($el); + } + }; DiffMd.apply = function (newHtml, $content, common) { + if (!sfCommon) { sfCommon = common; } + var contextMenu = common.importMediaTagMenu(); var id = $content.attr('id'); if (!id) { throw new Error("The element must have a valid id"); } @@ -366,10 +412,10 @@ define([ var Dom = domFromHTML($('
\n"},k.blockquote_close=function(e,r){return""+y(e,r)},k.code=function(e,r){return e[r].block?"
"+m(e[r].content)+"
"+y(e,r):""+m(e[r].content)+"
"},k.fence=function(e,r,t,n,s){var i,a,c,p,u=e[r],h="",d=t.langPrefix;if(u.params){if(a=(i=u.params.split(/\s+/g)).join(" "),c=s.rules.fence_custom,p=i[0],c&&o.call(c,p))return s.rules.fence_custom[i[0]](e,r,t,n,s);h=' class="'+d+m(f(l(a)))+'"'}return""+(t.highlight&&t.highlight.apply(t.highlight,[u.content].concat(i))||m(u.content))+"
"+y(e,r)},k.fence_custom={},k.heading_open=function(e,r){return""},k.paragraph_close=function(e,r){var t=!(e[r].tight&&r&&"inline"===e[r-1].type&&!e[r-1].content);return(e[r].tight?"":"
")+(t?y(e,r):"")},k.link_open=function(e,r,t){var n=e[r].title?' title="'+m(f(e[r].title))+'"':"",o=t.linkTarget?' target="'+t.linkTarget+'"':"";return'"},k.link_close=function(){return""},k.image=function(e,r,t){var n=' src="'+m(e[r].src)+'"',o=e[r].title?' title="'+m(f(e[r].title))+'"':"";return""},k.table_open=function(){return"=p||58!==e.src.charCodeAt(++l))&&(n||(l++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),a=e.src.slice(c+2,l-2),e.env.footnotes.refs[":"+a]=-1,e.tokens.push({type:"footnote_reference_open",label:a,level:e.level++}),o=e.bMarks[r],s=e.tShift[r],i=e.parentType,e.tShift[r]=e.skipSpaces(l)-l,e.bMarks[r]=l,e.blkIndent+=4,e.parentType="footnote",e.tShift[r]3||l+2>=a)return!1;if(60!==e.src.charCodeAt(l))return!1;if(33===(o=e.src.charCodeAt(l+1))||63===o){if(n)return!0}else{if(47!==o&&!function(e){var r=32|e;return r>=97&&r<=122}(o))return!1;if(47===o){if(!(s=e.src.slice(l,a).match(F)))return!1}else if(!(s=e.src.slice(l,a).match(Z)))return!1;if(!0!==H[s[1].toLowerCase()])return!1;if(n)return!0}for(i=r+1;i
");else if(n.type.endsWith("_open")){const e=n.type.slice(0,-5);"link"===e?r.push(Ae("a",{href:n.href,title:n.title,target:"_blank",rel:"noopener noreferrer"})):t=Object.assign({},t,{[e]:!0})}else if(n.type.endsWith("_close")){const e=n.type.slice(0,-6);"link"===e?r.push(Ce("a")):t=Object.assign({},t,{[e]:!1})}return r.join("")}function Te(e){const r={t:"root",d:0,v:"",c:[]},t=[r];let n=0;for(const r of e){let e=t[t.length-1];if(r.type.endsWith("_open")){const i=r.type.slice(0,-5),l={};var o;if("heading"===i)for(n=r.hLevel;(null==(s=e)?void 0:s.d)>=n;){var s;t.pop(),e=t[t.length-1]}else n=Math.max(n,(null==(o=e)?void 0:o.d)||0)+1,"ordered_list"===i&&(l.start=r.order);const a={t:i,d:n,p:l,v:"",c:[]};e.c.push(a),t.push(a)}else{if(!e)continue;r.type===e.t+"_close"?"heading"===e.t?n=e.d:(t.pop(),n=0):"inline"===r.type?e.v=`${e.v||""}${Me(r)}`:"fence"===r.type&&e.c.push({t:r.type,d:n+1,v:`
`,c:[]})}}return r}Le.block.ruler.enable(["deflist"]),e.buildTree=Te,e.transform=function(e){var r;let t=Te(Le.parse(e||"",{}));return function e(r,t=0){if("heading"===r.t)r.c=r.c.filter(e=>"paragraph"!==e.t);else if("list_item"===r.t){var n;r.c=r.c.filter(e=>!["paragraph","fence"].includes(e.t)||(r.v||(r.v=e.v),!1)),null!=(null==(n=r.p)?void 0:n.index)&&(r.v=`${r.p.index}. ${r.v}`)}else if("ordered_list"===r.t){var o,s;let e=null!=(o=null==(s=r.p)?void 0:s.start)?o:1;r.c.forEach(r=>{"list_item"===r.t&&(r.p=Object.assign({},r.p,{index:e}),e+=1)})}0===r.c.length?delete r.c:(1!==r.c.length||r.c[0].v||(r.c=r.c[0].c),r.c.forEach(r=>e(r,t+1))),r.d=t,delete r.p}(t),1===(null==(r=t.c)?void 0:r.length)&&(t=t.c[0]),t}}));
diff --git a/www/lib/markmap/view.min.js b/www/lib/markmap/view.min.js
new file mode 100644
index 000000000..392a57fa0
--- /dev/null
+++ b/www/lib/markmap/view.min.js
@@ -0,0 +1,2 @@
+/*! markmap-lib v0.7.11 | MIT License */
+define(["exports"],(function(t){"use strict";function n(t,n){return t${we(r.content)}
=0&&(t=t.slice(0,n)),!t||"start"===t}))}(n)?Fn:Gn;return function(){var a=o(this,t),s=a.on;s!==r&&(i=(r=s).copy()).on(n,e),a.on=i}}var ye=wt.prototype.constructor;function ve(t){return function(){this.style.removeProperty(t)}}function _e(t,n,e){return function(r){this.style.setProperty(t,n.call(this,r),e)}}function we(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&_e(t,o,e)),r}return o._value=n,o}function xe(t){return function(n){this.textContent=t.call(this,n)}}function be(t){var n,e;function r(){var r=t.apply(this,arguments);return r!==e&&(n=(e=r)&&xe(r)),n}return r._value=t,r}var ze=0;function ke(t,n,e,r){this._groups=t,this._parents=n,this._name=e,this._id=r}function Me(){return++ze}var Ee=wt.prototype;ke.prototype=function(t){return wt().transition(t)}.prototype={constructor:ke,select:function(t){var n=this._name,e=this._id;"function"!=typeof t&&(t=_(t));for(var r=this._groups,i=r.length,o=new Array(i),a=0;a1e-6)if(Math.abs(c*s-u*l)>1e-6&&i){var f=e-o,p=r-a,d=s*s+u*u,m=f*f+p*p,g=Math.sqrt(d),y=Math.sqrt(h),v=i*Math.tan((Ne-Math.acos((d+h-m)/(2*g*y)))/2),_=v/y,w=v/g;Math.abs(_-1)>1e-6&&(this._+="L"+(t+_*l)+","+(n+_*c)),this._+="A"+i+","+i+",0,0,"+ +(c*f>l*p)+","+(this._x1=t+w*s)+","+(this._y1=n+w*u)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n,o=!!o;var a=(e=+e)*Math.cos(r),s=e*Math.sin(r),u=t+a,l=n+s,c=1^o,h=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+u+","+l:(Math.abs(this._x1-u)>1e-6||Math.abs(this._y1-l)>1e-6)&&(this._+="L"+u+","+l),e&&(h<0&&(h=h%Xe+Xe),h>$e?this._+="A"+e+","+e+",0,1,"+c+","+(t-a)+","+(n-s)+"A"+e+","+e+",0,1,"+c+","+(this._x1=u)+","+(this._y1=l):h>1e-6&&(this._+="A"+e+","+e+",0,"+ +(h>=Ne)+","+c+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};function Te(){}function Oe(t,n){var e=new Te;if(t instanceof Te)t.each((function(t,n){e.set(n,t)}));else if(Array.isArray(t)){var r,i=-1,o=t.length;if(null==n)for(;++ir?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}function gr(){var t,n,e=cr,r=hr,i=mr,o=pr,a=dr,u=[0,1/0],l=[[-1/0,-1/0],[1/0,1/0]],c=250,h=Mn,f=s("start","zoom","end"),p=0;function d(t){t.property("__zoom",fr).on("wheel.zoom",x).on("mousedown.zoom",b).on("dblclick.zoom",z).filter(a).on("touchstart.zoom",k).on("touchmove.zoom",M).on("touchend.zoom touchcancel.zoom",E).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function m(t,n){return(n=Math.max(u[0],Math.min(u[1],n)))===t.k?t:new or(n,t.x,t.y)}function g(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new or(t.k,r,i)}function y(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function v(t,n,e){t.on("start.zoom",(function(){_(this,arguments).start()})).on("interrupt.zoom end.zoom",(function(){_(this,arguments).end()})).tween("zoom",(function(){var t=this,i=arguments,o=_(t,i),a=r.apply(t,i),s=null==e?y(a):"function"==typeof e?e.apply(t,i):e,u=Math.max(a[1][0]-a[0][0],a[1][1]-a[0][1]),l=t.__zoom,c="function"==typeof n?n.apply(t,i):n,f=h(l.invert(s).concat(u/l.k),c.invert(s).concat(u/c.k));return function(t){if(1===t)t=c;else{var n=f(t),e=u/n[2];t=new or(e,s[0]-n[0]*e,s[1]-n[1]*e)}o.zoom(null,t)}}))}function _(t,n,e){return!e&&t.__zooming||new w(t,n)}function w(t,n){this.that=t,this.args=n,this.active=0,this.extent=r.apply(t,n),this.taps=0}function x(){if(e.apply(this,arguments)){var t=_(this,arguments),n=this.__zoom,r=Math.max(u[0],Math.min(u[1],n.k*Math.pow(2,o.apply(this,arguments)))),a=kt(this);if(t.wheel)t.mouse[0][0]===a[0]&&t.mouse[0][1]===a[1]||(t.mouse[1]=n.invert(t.mouse[0]=a)),clearTimeout(t.wheel);else{if(n.k===r)return;t.mouse=[a,n.invert(a)],Jn(this),t.start()}lr(),t.wheel=setTimeout(s,150),t.zoom("mouse",i(g(m(n,r),t.mouse[0],t.mouse[1]),t.extent,l))}function s(){t.wheel=null,t.end()}}function b(){if(!n&&e.apply(this,arguments)){var t=_(this,arguments,!0),r=xt(lt.view).on("mousemove.zoom",u,!0).on("mouseup.zoom",c,!0),o=kt(this),a=lt.clientX,s=lt.clientY;St(lt.view),ur(),t.mouse=[o,this.__zoom.invert(o)],Jn(this),t.start()}function u(){if(lr(),!t.moved){var n=lt.clientX-a,e=lt.clientY-s;t.moved=n*n+e*e>p}t.zoom("mouse",i(g(t.that.__zoom,t.mouse[0]=kt(t.that),t.mouse[1]),t.extent,l))}function c(){r.on("mousemove.zoom mouseup.zoom",null),At(lt.view,t.moved),lr(),t.end()}}function z(){if(e.apply(this,arguments)){var t=this.__zoom,n=kt(this),o=t.invert(n),a=t.k*(lt.shiftKey?.5:2),s=i(g(m(t,a),n,o),r.apply(this,arguments),l);lr(),c>0?xt(this).transition().duration(c).call(v,s,n):xt(this).call(d.transform,s)}}function k(){if(e.apply(this,arguments)){var n,r,i,o,a=lt.touches,s=a.length,u=_(this,arguments,lt.changedTouches.length===s);for(ur(),r=0;rt.children,nodeSize:t=>t.data.size,spacing:0});function vr(t){const n=Object.assign({},yr,t);function e(t){const e=n[t];return"function"==typeof e?e:()=>e}function r(t){const n=o(function(){const t=i(),n=e("nodeSize"),r=e("spacing");return class extends t{constructor(t){super(t),Object.assign(this,{x:0,y:0,relX:0,prelim:0,shift:0,change:0,lExt:this,lExtRelX:0,lThr:null,rExt:this,rExtRelX:0,rThr:null})}get size(){return n(this.data)}spacing(t){return r(this.data,t.data)}get x(){return this.data.x}set x(t){this.data.x=t}get y(){return this.data.y}set y(t){this.data.y=t}update(){return _r(this),wr(this),this}}}(),t,t=>t.children);return n.update(),n.data}function i(){const t=e("nodeSize"),n=e("spacing");return class e extends qe.prototype.constructor{constructor(t){super(t)}copy(){const t=o(this.constructor,this,t=>t.children);return t.each(t=>t.data=t.data.data),t}get size(){return t(this)}spacing(t){return n(this,t)}get nodes(){return this.descendants()}get xSize(){return this.size[0]}get ySize(){return this.size[1]}get top(){return this.y}get bottom(){return this.y+this.ySize}get left(){return this.x-this.xSize/2}get right(){return this.x+this.xSize/2}get root(){const t=this.ancestors();return t[t.length-1]}get numChildren(){return this.hasChildren?this.children.length:0}get hasChildren(){return!this.noChildren}get noChildren(){return null===this.children}get firstChild(){return this.hasChildren?this.children[0]:null}get lastChild(){return this.hasChildren?this.children[this.numChildren-1]:null}get extents(){return(this.children||[]).reduce((t,n)=>e.maxExtents(t,n.extents),this.nodeExtents)}get nodeExtents(){return{top:this.top,bottom:this.bottom,left:this.left,right:this.right}}static maxExtents(t,n){return{top:Math.min(t.top,n.top),bottom:Math.max(t.bottom,n.bottom),left:Math.min(t.left,n.left),right:Math.max(t.right,n.right)}}}}function o(t,n,e){const r=(n,i)=>{const o=new t(n);Object.assign(o,{parent:i,depth:null===i?0:i.depth+1,height:0,length:1});const a=e(n)||[];return o.children=0===a.length?null:a.map(t=>r(t,o)),o.children&&Object.assign(o,o.children.reduce((t,n)=>({height:Math.max(t.height,n.height+1),length:t.length+n.length}),o)),o};return r(n,null)}return Object.assign(r,{nodeSize(t){return arguments.length?(n.nodeSize=t,r):n.nodeSize},spacing(t){return arguments.length?(n.spacing=t,r):n.spacing},children(t){return arguments.length?(n.children=t,r):n.children},hierarchy(t,e){const r=void 0===e?n.children:e;return o(i(),t,r)},dump(t){const n=e("nodeSize"),r=t=>e=>{const i=t+" ",o=t+" ",{x:a,y:s}=e,u=n(e),l=e.children||[],c=0===l.length?" ":`,${i}children: [${o}${l.map(r(o)).join(o)}${i}],${t}`;return`{ size: [${u.join(", ")}],${i}x: ${a}, y: ${s}${c}},`};return r("\n")(t)}}),r}vr.version="2.1.1";const _r=(t,n=0)=>(t.y=n,(t.children||[]).reduce((n,e)=>{const[r,i]=n;_r(e,t.y+t.ySize);const o=(0===r?e.lExt:e.rExt).bottom;0!==r&&br(t,r,i);return[r+1,Xr(o,r,i)]},[0,null]),xr(t),Nr(t),t),wr=(t,n,e)=>{void 0===n&&(n=-t.relX-t.prelim,e=0);const r=n+t.relX;return t.relX=r+t.prelim-e,t.prelim=0,t.x=e+t.relX,(t.children||[]).forEach(n=>wr(n,r,t.x)),t},xr=t=>{(t.children||[]).reduce((t,n)=>{const[e,r]=t,i=e+n.shift,o=r+i+n.change;return n.relX+=o,[i,o]},[0,0])},br=(t,n,e)=>{const r=t.children[n-1],i=t.children[n];let o=r,a=r.relX,s=i,u=i.relX,l=!0;for(;o&&s;){o.bottom>e.lowY&&(e=e.next);const r=a+o.prelim-(u+s.prelim)+o.xSize/2+s.xSize/2+o.spacing(s);(r>0||r<0&&l)&&(u+=r,zr(i,r),kr(t,n,e.index,r)),l=!1;const c=o.bottom,h=s.bottom;c<=h&&(o=Er(o),o&&(a+=o.relX)),c>=h&&(s=Mr(s),s&&(u+=s.relX))}!o&&s?Sr(t,n,s,u):o&&!s&&Ar(t,n,o,a)},zr=(t,n)=>{t.relX+=n,t.lExtRelX+=n,t.rExtRelX+=n},kr=(t,n,e,r)=>{const i=t.children[n],o=n-e;if(o>1){const n=r/o;t.children[e+1].shift+=n,i.shift-=n,i.change-=r-n}},Mr=t=>t.hasChildren?t.firstChild:t.lThr,Er=t=>t.hasChildren?t.lastChild:t.rThr,Sr=(t,n,e,r)=>{const i=t.firstChild,o=i.lExt,a=t.children[n];o.lThr=e;const s=r-e.relX-i.lExtRelX;o.relX+=s,o.prelim-=s,i.lExt=a.lExt,i.lExtRelX=a.lExtRelX},Ar=(t,n,e,r)=>{const i=t.children[n],o=i.rExt,a=t.children[n-1];o.rThr=e;const s=r-e.relX-i.rExtRelX;o.relX+=s,o.prelim-=s,i.rExt=a.rExt,i.rExtRelX=a.rExtRelX},Nr=t=>{if(t.hasChildren){const n=t.firstChild,e=t.lastChild,r=(n.prelim+n.relX-n.xSize/2+e.relX+e.prelim+e.xSize/2)/2;Object.assign(t,{prelim:r,lExt:n.lExt,lExtRelX:n.lExtRelX,rExt:e.rExt,rExtRelX:e.rExtRelX})}},Xr=(t,n,e)=>{for(;null!==e&&t>=e.lowY;)e=e.next;return{lowY:t,index:n,next:e}},$r=Math.random().toString(36).slice(2,8);let jr=0;function Cr(){}function Tr(t,n,e="c"){const r=(t,i)=>n(t,()=>{var n;null==(n=t[e])||n.forEach(n=>{r(n,t)})},i);r(t)}function Or(t){if(Array.from)return Array.from(t);const n=[];for(let e=0;e