ranui
Version:
A framework-agnostic Web Components UI library built on native custom elements, with TypeScript types, light/dark theming, SSR and PWA support.
31 lines (30 loc) • 8.77 kB
JavaScript
const X=require("./mermaid-parser.core-DYumW1vq.cjs"),g=require("./chunk-Y2CYZVJY-DPaYLFFP.cjs"),$=require("./src-C9EhKhbk.cjs"),m=require("./chunk-WYO6CB5R-u4mJNOcO.cjs"),D=require("./chunk-ICXQ74PX-BbT9JaEW.cjs"),Y=require("./chunk-VAUOI2AC-DfQf5L2_.cjs"),z=require("./chunk-JWPE2WC7-D8EnWK1B.cjs"),E=require("./chunk-HOUHSVGY-BGB3dOvI.cjs"),G=require("./chunk-2Q5K7J3B-CTMy5FII.cjs");var N=/[─━│┃└┗├┣]/,S=/[└┗├┣]/,P=/[─━]/,A=/^[\s│┃]+$/,B=/^\s*(title[\t ]|accTitle[\t ]*:|accDescr[\t ]*[:{])/,T=/^\s*%%/,F=" ";function q(n){return n.some(e=>N.test(e))}g.__name(q,"isBoxDrawingFormat");function L(n){for(const e of n){const t=S.exec(e);if(t?.index&&t.index>0)return t.index}return 4}g.__name(L,"inferSegmentWidth");function M(n,e){return n.replace(/\bline\s+(\d+)\b/gi,(t,r)=>{const i=parseInt(r,10),a=e.get(i);return a?`line ${a}`:t})}g.__name(M,"remapErrorLines");function H(n){const e=n.split(`
`),t=new Map;let r=-1;for(const[s,o]of e.entries())if(o.trim()==="treeView-beta"){r=s;break}if(r===-1)return{text:n,lineMap:t};const i=[];for(let s=r+1;s<e.length;s++){const o=e[s];o.trim()===""||T.test(o)||B.test(o)||A.test(o)||i.push(o.replace(/\t/g," "))}if(!q(i))return{text:n,lineMap:t};const a=L(i),c=[];let l=0;for(let s=0;s<=r;s++)c.push(e[s]),l++,t.set(l,s+1);for(let s=r+1;s<e.length;s++){const o=e[s],d=o.trim(),h=s+1;if(d===""){c.push(o),l++,t.set(l,h);continue}if(T.test(o)){c.push(o),l++,t.set(l,h);continue}if(B.test(o)){c.push(o),l++,t.set(l,h);continue}if(A.test(o))continue;const u=o.replace(/\t/g," "),x=S.exec(u);if(x?.index!==void 0){const f=x.index,_=Math.round(f/a)+1;let p=f+1;for(;p<u.length&&P.test(u[p]);)p++;for(;p<u.length&&u[p]===" ";)p++;const b=u.slice(p).trimEnd();if(!b)throw new Error(`Line ${h}: Empty node — expected a filename or directory name after the box-drawing prefix`);const R=F.repeat(_);c.push(R+b),l++,t.set(l,h)}else{if(/^[\s─━│┃└┗├┣]+$/.test(u))continue;if(N.test(u))c.push(o),l++,t.set(l,h);else{if(/^\s+/.test(u))throw new Error(`Line ${h}: Unexpected indentation without box-drawing characters. In box-drawing format, use ├── or └── prefixes for indented nodes.`);c.push(o),l++,t.set(l,h)}}}return{text:c.join(`
`),lineMap:t}}g.__name(H,"preprocessBoxDrawing");var w=new G.ImperativeState(()=>({cnt:1,stack:[{id:0,level:-1,name:"/",nodeType:"directory",children:[]}]})),U=g.__name(()=>{w.reset(),m.clear()},"clear"),Z=g.__name(()=>w.records.stack[0],"getRoot"),j=g.__name(()=>w.records.cnt,"getCount"),J=m.defaultConfig_default.treeView,C={clear:U,addNode:g.__name((n,e,t,r,i,a)=>{for(;n<=w.records.stack[w.records.stack.length-1].level;)w.records.stack.pop();const c={id:w.records.cnt++,level:n,name:e,nodeType:t,icon:i,cssClass:r,description:a,children:[]};w.records.stack[w.records.stack.length-1].children.push(c),w.records.stack.push(c)},"addNode"),getRoot:Z,getCount:j,getConfig:g.__name(()=>D.cleanAndMerge(J,m.getConfig().treeView),"getConfig"),getAccTitle:m.getAccTitle,getAccDescription:m.getAccDescription,getDiagramTitle:m.getDiagramTitle,setAccDescription:m.setAccDescription,setAccTitle:m.setAccTitle,setDiagramTitle:m.setDiagramTitle},Q=g.__name(n=>{z.populateCommonDb(n,C);for(const e of n.nodes){const t=typeof e.indent=="number"?e.indent:0;let r=e.name;const i=r.endsWith("/");i&&(r=r.slice(0,-1));const a=i?"directory":"file",c=e.classAnnotation||void 0,l=e.iconAnnotation,s=l!==void 0?l||"none":void 0,o=e.descAnnotation||void 0,d=o?m.sanitizeText(o,m.getConfig()):void 0;C.addNode(t,r,a,c,s,d)}},"populate"),K={parse:g.__name(async n=>{const{text:e,lineMap:t}=H(n);try{const r=await X.parse("treeView",e);$.log.debug(r),Q(r)}catch(r){throw t.size>0&&r instanceof Error&&(r.message=M(r.message,t)),r}},"parse")},v={prefix:"mermaid-treeview",height:24,width:24,icons:{folder:{body:'<path fill="currentColor" d="M10.59 4.59A2 2 0 0 0 9.17 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.17z"/>'},file:{body:'<path fill="currentColor" fill-rule="evenodd" d="M6 2a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8.83a2 2 0 0 0-.59-1.42l-4.82-4.82A2 2 0 0 0 13.17 2H6Zm7.5 1.9l4.6 4.6h-3.6a1 1 0 0 1-1-1V3.9Z" clip-rule="evenodd"/>'}}};function W(n,e){const t=e?.filenameIcons?.[n];if(t)return t;const r=n.lastIndexOf(".");if(r>0){const i=n.substring(r).toLowerCase(),a=e?.extensionIcons;return a?.[i]??a?.[i.slice(1)]}}g.__name(W,"detectIcon");function I(n,e){return n.includes(":")?n:n in v.icons||!e?`${v.prefix}:${n}`:`${e}:${n}`}g.__name(I,"qualifyIcon");function k(n,e){if(n.icon!=="none"){if(n.icon)return I(n.icon,e.defaultIconPack);if(e.showIcons){if(n.nodeType==="file"){const t=W(n.name,e);if(t==="none")return;if(t)return I(t,e.defaultIconPack)}return`${v.prefix}:${n.nodeType==="directory"?"folder":"file"}`}}}g.__name(k,"getNodeIcon");E.registerIconPacks([{name:v.prefix,icons:v}]);var y=14,ee=4,te=16,O=g.__name((n,e)=>`tv-icon-${n}-${e.replace(/[^\w-]/g,"-")}`,"iconSymbolId"),ne=g.__name(async(n,e,t,r)=>{const i=new Set,a=g.__name(s=>{const o=k(s,t);o&&i.add(o),s.children.forEach(a)},"collect");if(a(e),i.size===0)return;const c=await Promise.all([...i].map(async s=>({icon:s,svg:await E.getIconSVG(s,{height:y,width:y})}))),l=n.append("defs");for(const{icon:s,svg:o}of c)l.append("g").attr("id",O(r,s)).html(o)},"injectIconDefs"),re=g.__name((n,e,t,r,i,a)=>{const c=r.append("g");let l="treeView-node-label";t.nodeType==="directory"&&(l+=" treeView-node-dir"),t.cssClass&&(l+=` ${t.cssClass}`);const s=y+ee,o=k(t,i),d=o!==void 0;o&&c.append("use").attr("xlink:href",`#${O(a,o)}`).attr("x",n+i.paddingX).attr("y",e+i.paddingY).attr("class","treeView-node-icon");const h=c.append("text").text(t.name).attr("dominant-baseline","middle").attr("class",l),{height:u,width:x}=h.node().getBBox(),f=u+i.paddingY*2,_=n+i.paddingX+(d?s:0);h.attr("x",_),h.attr("y",e+f/2);const p=_+x;return t.BBox={x:n,y:e,width:x+i.paddingX*2+(d?s:0),height:f},t.cssClass?.split(/\s+/).includes("highlight")&&c.insert("rect",":first-child").attr("x",n).attr("y",e+1).attr("width",0).attr("height",f-2).attr("rx",3).attr("class","treeView-highlight-bg"),{node:t,nodeGroup:c,labelRightEdge:p,centerY:e+f/2}},"positionLabel"),V=g.__name((n,e,t,r,i,a)=>n.append("line").attr("x1",e).attr("y1",t).attr("x2",r).attr("y2",i).attr("stroke-width",a).attr("class","treeView-node-line"),"positionLine"),ie=g.__name((n,e,t,r)=>{let i=0,a=0;const c=[],l=g.__name((d,h,u,x)=>{const f=x*(u.rowIndent+u.paddingX),_=re(f,i,h,d,u,r);c.push(_);const{height:p,width:b}=h.BBox;V(d,f-u.rowIndent,i+p/2,f,i+p/2,u.lineThickness),a=Math.max(a,f+b),i+=p},"drawNode"),s=g.__name((d,h=0)=>{l(n,d,t,h),d.children.forEach(_=>{s(_,h+1)});const{x:u,y:x,height:f}=d.BBox;if(d.children.length){const{y:_,height:p}=d.children[d.children.length-1].BBox;V(n,u+t.paddingX,x+f,u+t.paddingX,_+p/2+t.lineThickness/2,t.lineThickness)}},"processNode");s(e);const o=c.filter(d=>d.node.description);if(o.length>0){const d=Math.max(...c.map(h=>h.labelRightEdge))+te;for(const h of o){const u=h.nodeGroup.append("text").text(h.node.description).attr("dominant-baseline","middle").attr("class","treeView-node-description").attr("x",d).attr("y",h.centerY).node().getBBox();a=Math.max(a,d+u.width+t.paddingX)}}for(const d of c)if(d.node.cssClass?.split(/\s+/).includes("highlight")){const h=d.nodeGroup.select(".treeView-highlight-bg");if(!h.empty()){const u=a-d.node.BBox.x+8;h.attr("width",u),a=Math.max(a,d.node.BBox.x+u+2)}}return{totalHeight:i,totalWidth:a}},"drawTree"),oe={draw:g.__name(async(n,e,t,r)=>{$.log.debug(`Rendering treeView diagram
`+n);const i=r.db,a=i.getRoot(),c=i.getConfig(),l=Y.selectSvgElement(e);await ne(l,a,c,e);const s=l.append("g");s.attr("class","tree-view");const{totalHeight:o,totalWidth:d}=ie(s,a,c,e);l.attr("viewBox",`-${c.lineThickness/2} 0 ${d} ${o}`),m.configureSvgSize(l,o,d,c.useMaxWidth)},"draw")},se={labelFontSize:"16px",labelColor:"black",lineColor:"black",iconColor:"#546e7a",descriptionColor:"#6a9955",highlightBg:"rgba(255, 193, 7, 0.15)",highlightStroke:"#ffc107"},ae={db:C,renderer:oe,parser:K,styles:g.__name(({treeView:n})=>{const{labelFontSize:e,labelColor:t,lineColor:r,iconColor:i,descriptionColor:a,highlightBg:c,highlightStroke:l}=D.cleanAndMerge(se,n);return`
.treeView-node-label {
font-size: ${e};
fill: ${t};
white-space: pre;
}
.treeView-node-dir {
font-weight: bold;
}
.treeView-node-line {
stroke: ${r};
}
.treeView-node-icon {
color: ${i};
}
.treeView-node-description {
font-size: ${e};
fill: ${a};
font-style: italic;
white-space: pre;
}
.treeView-highlight-bg {
fill: ${c};
stroke: ${l};
stroke-width: 1;
}
`},"styles")};exports.diagram=ae;