');t.append(i.control_input),i.dropdown.insertBefore(t,i.dropdown.firstChild);const e=_s('
');e.placeholder=i.settings.placeholder||"",i.control.append(e)}),i.on("initialize",()=>{i.control_input.addEventListener("keydown",e=>{switch(e.keyCode){case Ep:i.isOpen&&(_p(e,!0),i.close()),i.clearActiveItems();return;case Sp:i.focus_node.tabIndex=-1;break}return i.onKeyDown.call(i,e)}),i.on("blur",()=>{i.focus_node.tabIndex=i.isDisabled?-1:i.tabIndex}),i.on("dropdown_open",()=>{i.control_input.focus()});const t=i.onBlur;i.hook("instead","onBlur",e=>{if(!(e&&e.relatedTarget==i.control_input))return t.call(i)}),kp(i.control_input,"blur",()=>i.onBlur()),i.hook("before","close",()=>{i.isOpen&&i.focus_node.focus({preventScroll:!0})})})}const gi=(i,t,e,n)=>{i.addEventListener(t,e,n)};function Pp(){var i=this;i.on("initialize",()=>{var t=document.createElement("span"),e=i.control_input;t.style.cssText="position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ",i.wrapper.appendChild(t);var n=["letterSpacing","fontSize","fontFamily","fontWeight","textTransform"];for(const s of n)t.style[s]=e.style[s];var r=()=>{t.textContent=e.value,e.style.width=t.clientWidth+"px"};r(),i.on("update item_add item_remove",r),gi(e,"input",r),gi(e,"keyup",r),gi(e,"blur",r),gi(e,"update",r)})}function Dp(){var i=this,t=i.deleteSelection;this.hook("instead","deleteSelection",e=>i.activeItems.length?t.call(i,e):!1)}function Fp(){this.hook("instead","setActiveItem",()=>{}),this.hook("instead","selectAll",()=>{})}const ks=37,zp=39,Bp=(i,t,e)=>{for(;i&&i.matches;){if(i.matches(t))return i;i=i.parentNode}},Rp=(i,t)=>{if(!i)return-1;t=t||i.nodeName;for(var e=0;i=i.previousElementSibling;)i.matches(t)&&e++;return e};function Hp(){var i=this,t=i.onKeyDown;i.hook("instead","onKeyDown",e=>{var n,r,s,o;if(!i.isOpen||!(e.keyCode===ks||e.keyCode===zp))return t.call(i,e);i.ignoreHover=!0,o=Bp(i.activeOption,"[data-group]"),n=Rp(i.activeOption,"[data-selectable]"),o&&(e.keyCode===ks?o=o.previousSibling:o=o.nextSibling,o&&(s=o.querySelectorAll("[data-selectable]"),r=s[Math.min(s.length-1,n)],r&&i.setActiveOption(r)))})}const $p=i=>(i+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Ns=(i,t=!1)=>{i&&(i.preventDefault(),t&&i.stopPropagation())},As=(i,t,e,n)=>{i.addEventListener(t,e,n)},Is=i=>{if(i.jquery)return i[0];if(i instanceof HTMLElement)return i;if(Gp(i)){var t=document.createElement("template");return t.innerHTML=i.trim(),t.content.firstChild}return document.querySelector(i)},Gp=i=>typeof i=="string"&&i.indexOf("<")>-1;function qp(i){const t=Object.assign({label:"×",title:"Remove",className:"remove",append:!0},i);var e=this;if(t.append){var n='
'+t.label+"";e.hook("after","setupTemplates",()=>{var r=e.settings.render.item;e.settings.render.item=(s,o)=>{var a=Is(r.call(e,s,o)),c=Is(n);return a.appendChild(c),As(c,"mousedown",l=>{Ns(l,!0)}),As(c,"click",l=>{e.isLocked||(Ns(l,!0),!e.isLocked&&e.shouldDelete([a],l)&&(e.removeItem(a),e.refreshOptions(!1),e.inputState()))}),a}})}}function Vp(i){const t=this,e=Object.assign({text:n=>n[t.settings.labelField]},i);t.on("item_remove",function(n){if(t.isFocused&&t.control_input.value.trim()===""){var r=t.options[n];r&&t.setTextboxValue(e.text.call(t,r))}})}const Up=(i,t)=>{if(Array.isArray(i))i.forEach(t);else for(var e in i)i.hasOwnProperty(e)&&t(i[e],e)},jp=(i,...t)=>{var e=Yp(t);i=Xp(i),i.map(n=>{e.map(r=>{n.classList.add(r)})})},Yp=i=>{var t=[];return Up(i,e=>{typeof e=="string"&&(e=e.trim().split(/[\t\n\f\r\s]/)),Array.isArray(e)&&(t=t.concat(e))}),t.filter(Boolean)},Xp=i=>(Array.isArray(i)||(i=[i]),i);function Wp(){const i=this,t=i.canLoad,e=i.clearActiveOption,n=i.loadCallback;var r={},s,o=!1,a,c=[];if(i.settings.shouldLoadMore||(i.settings.shouldLoadMore=()=>{if(s.clientHeight/(s.scrollHeight-s.scrollTop)>.9)return!0;if(i.activeOption){var u=i.selectable(),p=Array.from(u).indexOf(i.activeOption);if(p>=u.length-2)return!0}return!1}),!i.settings.firstUrl)throw"virtual_scroll plugin requires a firstUrl() method";i.settings.sortField=[{field:"$order"},{field:"$score"}];const l=d=>typeof i.settings.maxOptions=="number"&&s.children.length>=i.settings.maxOptions?!1:!!(d in r&&r[d]),h=(d,u)=>i.items.indexOf(u)>=0||c.indexOf(u)>=0;i.setNextUrl=(d,u)=>{r[d]=u},i.getUrl=d=>{if(d in r){const u=r[d];return r[d]=!1,u}return i.clearPagination(),i.settings.firstUrl.call(i,d)},i.clearPagination=()=>{r={}},i.hook("instead","clearActiveOption",()=>{if(!o)return e.call(i)}),i.hook("instead","canLoad",d=>d in r?l(d):t.call(i,d)),i.hook("instead","loadCallback",(d,u)=>{if(!o)i.clearOptions(h);else if(a){const p=d[0];p!==void 0&&(a.dataset.value=p[i.settings.valueField])}n.call(i,d,u),o=!1}),i.hook("after","refreshOptions",()=>{const d=i.lastValue;var u;l(d)?(u=i.render("loading_more",{query:d}),u&&(u.setAttribute("data-selectable",""),a=u)):d in r&&!s.querySelector(".no-results")&&(u=i.render("no_more_results",{query:d})),u&&(jp(u,i.settings.optionClass),s.append(u))}),i.on("initialize",()=>{c=Object.keys(i.options),s=i.dropdown_content,i.settings.render=Object.assign({},{loading_more:()=>'
Loading more results ...
',no_more_results:()=>'
No more results
'},i.settings.render),s.addEventListener("scroll",()=>{i.settings.shouldLoadMore.call(i)&&l(i.lastValue)&&(o||(o=!0,i.load.call(i,i.lastValue)))})})}ct.define("change_listener",Ku),ct.define("checkbox_options",ep),ct.define("clear_button",rp),ct.define("drag_drop",pp),ct.define("dropdown_header",vp),ct.define("caret_position",Mp),ct.define("dropdown_input",Op),ct.define("input_autogrow",Pp),ct.define("no_backspace_delete",Dp),ct.define("no_active_items",Fp),ct.define("optgroup_columns",Hp),ct.define("remove_button",qp),ct.define("restore_on_backspace",Vp),ct.define("virtual_scroll",Wp);class _n{static createForm(t){const e=document.createElement("form");return e.className="pvt-form",t.fields.forEach(n=>{e.appendChild(this.createField(n))}),e}static getValues(t){const e={};return t.querySelectorAll("[data-field-key]").forEach(r=>{const s=r.getAttribute("data-field-key");switch(r.getAttribute("data-field-type")){case"text":e[s]=r.value||void 0;break;case"select":{const a=r;e[s]=a.value||void 0,a.dataset.fieldValuesAreBoolean==="yes"&&e[s]!==void 0&&e[s]==="true"&&(e[s]=!0);break}case"multiselect":{const a=r;e[s]=Array.from(a.selectedOptions).map(c=>c.value),a.dataset.fieldValuesAreBoolean==="yes"&&e[s].map(c=>c!==void 0&&c==="true"?!0:c);break}case"checkbox":e[s]=r.checked;break;case"numberRange":{const a=r.querySelector(".min").value,c=r.querySelector(".max").value;e[s]={min:a?Number(a):void 0,max:c?Number(c):void 0};break}}}),e}static clear(t){t.reset(),t.querySelectorAll("select").forEach(e=>{var n;(n=e.tomselect)==null||n.sync()})}static createField(t){const e=document.createElement("div");e.className="pvt-form-element";const n=document.createElement("label");switch(n.htmlFor=`pvt-form-element-${t.key}`,n.textContent=this.niceLabelFromKey(t.label),e.appendChild(n),t.type){case"select":e.appendChild(this.createSelect(t));break;case"multiselect":e.appendChild(this.createMultiSelect(t));break;case"checkbox":e.appendChild(this.createCheckbox(t));break;case"text":e.appendChild(this.createText(t));break;case"numberRange":e.appendChild(this.createNumberRange(t));break}return e}static baseAttrs(t,e){t.id=`pvt-form-element-${e.key}`,t.setAttribute("data-field-key",e.key),t.setAttribute("data-field-type",e.type)}static buildSelect(t){var n;const e=document.createElement("select");if(this.baseAttrs(e,t),t.allowEmpty){const r=document.createElement("option");r.value="",r.textContent="",r.selected=!0,e.appendChild(r)}return t.valuesAreBoolean&&e.setAttribute("data-field-values-are-boolean","yes"),(n=t.options)==null||n.forEach(r=>{const s=document.createElement("option");s.value=r.value,s.textContent=r.label,t.defaultValue&&(Array.isArray(t.defaultValue)?t.defaultValue.includes(r.value):t.defaultValue===r.value)&&(s.selected=!0),e.appendChild(s)}),e}static createSelect(t){const e=this.buildSelect(t);return requestAnimationFrame(()=>{const n={plugins:{clear_button:{title:"Remove all selected options"}}};new ct(e,n)}),e}static createMultiSelect(t){const e=this.buildSelect(t);return e.multiple=!0,requestAnimationFrame(()=>{const n={plugins:{checkbox_options:{checkedClassNames:["pvt-ts-checked"],uncheckedClassNames:["pvt-ts-unchecked"]},clear_button:{title:"Remove all selected options"},remove_button:{title:"Remove this item"}}};new ct(e,n)}),e}static createCheckbox(t){const e=document.createElement("input");return e.type="checkbox",t.defaultValue===!0&&(e.checked=!0),this.baseAttrs(e,t),e}static createText(t){const e=document.createElement("input");return e.type="text",e.placeholder=t.placeholder??"",this.baseAttrs(e,t),t.defaultValue&&(e.value=String(t.defaultValue)),e}static createNumberRange(t){const e=document.createElement("div");e.className="pvt-number-range",this.baseAttrs(e,t);const n=document.createElement("input");n.type="number",n.placeholder="Min",n.className="min";const r=document.createElement("input");r.type="number",r.placeholder="Max",r.className="max";const s=typeof t.defaultValue=="object"&&t.defaultValue!==null?t.defaultValue:void 0;return(s==null?void 0:s.min)!=null&&(n.value=String(s.min)),(s==null?void 0:s.max)!=null&&(r.value=String(s.max)),e.append(n,r),e}static niceLabelFromKey(t){return t.replace(/([A-Z])/g," $1").replace(/[_-]+/g," ").trim().split(" ").map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join(" ")}}const Kp="Filter Graph";class Zp{constructor(t){g(this,"uiManager");g(this,"graphFilter");g(this,"formOptions");g(this,"manuallyFilteredContainer");this.uiManager=t,this.formOptions=[]}mount(t){t&&(this.build(),this.graphFilter&&t.appendChild(this.graphFilter))}destroy(){var t;(t=this.graphFilter)==null||t.remove(),this.graphFilter=void 0}afterMount(){}graphReady(){}build(){return this.graphFilter=document.createElement("div"),this.graphFilter.classList.add("pvt-graph-filter-container"),this.uiManager.graph.on("dataBatchChanged",()=>{this.rebuild()}),this.uiManager.graph.queryEngine.on("filterChange",t=>{this.updateUIFilterButtonContent(t),this.updateUIFilterHiddenNodes()}),requestAnimationFrame(()=>{this.updateUIFilterButtonContent({}),this.updateUIFilterHiddenNodes()}),this.graphFilter}rebuild(){var a;if(!this.graphFilter)return;const t=vt({variant:"secondary",text:"Reset",size:"sm",style:"align-self: end;",svgIcon:Dd,onClick:()=>{_n.clear(n);const c={};this.filterGraph(c)}}),e=this.getAvailableNodeAttributes();this.formOptions=Object.entries(e).map(([c,l])=>{let h="text",d="exact",u=!1;l.values?l.values&&l.values.every(f=>f.length<64)?l.values.length>2?(h="multiselect",d="partial"):h="select":l.values.every(f=>typeof f=="boolean")&&(h="select",l.values=["true","false"],u=!0):h="numberRange";const p={key:c,label:c,type:h,matchMode:d,valuesAreBoolean:u};return(p.type=="select"||p.type=="multiselect")&&l.values&&(p.options=l.values.map(f=>({label:f,value:f})),p.allowEmpty=!0),p});const n=_n.createForm({fields:this.formOptions}),r=vt({variant:"primary",text:"Filter Graph",size:"block",style:"margin-top: 16px;",svgIcon:Qr,onClick:()=>{const c=_n.getValues(n);this.filterGraph(c)}}),s=O("div",{class:"pvt-sidebar-separator"});this.manuallyFilteredContainer=st(`
`);const o=vt({variant:"secondary",text:"Show all nodes",size:"sm",style:"align-self: end;",svgIcon:ts,onClick:()=>{this.uiManager.graph.queryEngine.clearNodeExclusions()},title:"Restore manually hidden nodes"});(a=this.manuallyFilteredContainer.querySelector("h4"))==null||a.appendChild(o),this.graphFilter.appendChild(t),this.graphFilter.appendChild(n),this.graphFilter.appendChild(r),this.graphFilter.appendChild(s),this.graphFilter.appendChild(this.manuallyFilteredContainer)}updateUIFilterButtonContent(t){var o,a;const e=(o=this.uiManager.toolbar)==null?void 0:o.filterButton,n=e==null?void 0:e.querySelector(".action-text");if(!n)return;n.innerHTML="";let r=Object.keys(t).length;const s=(a=t.manuallyHidden)==null?void 0:a.value;if(Array.isArray(s)&&s.length==0&&r--,r>0){const c=r>1?`${r} active filters`:"1 active filter",l=this.uiManager.graph.queryEngine.getHiddenNodeCount(),h=O("span",{class:"active-filter-subtext"},[O("span",{},["·"]),O("span",{},[`${l} hidden`])]),d=ss({text:c,html:h,variant:"primary",size:"sm"});n.appendChild(d)}else n.textContent=Kp}updateUIFilterHiddenNodes(){if(!this.manuallyFilteredContainer)return;const t=this.manuallyFilteredContainer.querySelector(".pvt-hidden-nodes-container-list");t&&(this.uiManager.graph.queryEngine.getExcludedNodeCount()>0?(this.manuallyFilteredContainer.classList.remove("hidden"),t.innerHTML="",this.uiManager.graph.queryEngine.getExcludedNodes().forEach(e=>{const n=Object.keys(e.getData()).length,r=e.getEdgesIn().length+e.getEdgesOut().length,s=vt({variant:"secondary",text:"Show node",size:"sm",title:"Restore manually hidden node",svgIcon:ts,onClick:()=>{this.uiManager.graph.queryEngine.includeNode(e)}}),o=O("span",{class:"subtext"},[O("span",{class:"nodeinfo"},[n.toString(),j({svgIcon:jd})]),"·",O("span",{class:"nodeinfo"},[r.toString(),j({svgIcon:oi(24)})])]),a=O("div",{class:"hidden-node"},[Yt(e,this.uiManager.getOptions().mainHeader),o,s]);a.addEventListener("mouseenter",c=>{var l;(l=this.uiManager.tooltip)==null||l.openForNodeOnElement(c,e)}),a.addEventListener("mouseleave",()=>{var c;(c=this.uiManager.tooltip)==null||c.hide()}),t==null||t.appendChild(a)})):this.manuallyFilteredContainer.classList.add("hidden"))}getAvailableNodeAttributes(){const t=new Map;this.uiManager.graph.getMutableNodes().forEach(r=>{Object.entries(r.getData()).forEach(([s,o])=>{let a=t.get(s);a||(a={numbers:new Set,values:new Set}),Number.isInteger(o)?a.range.add(o):a.values.add(o),t.set(s,a)})});const n=new Map;return t.forEach((r,s)=>{const o={};r.values?o.values=[...new Set([...r.values,...r.numbers])]:r.number&&(o.range=[Math.min(...r.numbers),Math.max(...r.numbers)]),n.set(s,o)}),Object.fromEntries(n)}filterGraph(t){const e=this.getActiveFilters(t),n={},r=Object.fromEntries(this.formOptions.map(s=>[s.key,s]));for(const[s,o]of Object.entries(e)){const a={value:o,matchMode:r[s].matchMode};o!==void 0&&(n[s]=a)}this.uiManager.graph.queryEngine.resetFilters(),this.uiManager.graph.queryEngine.setFilters(n)}getActiveFilters(t){const e={};for(const[n,r]of Object.entries(t))this.isFilterActive(r)?e[n]=r:e[n]=void 0;return e}isFilterActive(t){return t===void 0?!1:typeof t=="string"?t.trim()!=="":typeof t=="number"||typeof t=="boolean"?!0:Array.isArray(t)?t.length>0:typeof t=="object"?t.min!==void 0||t.max!==void 0:!1}}class Qp{constructor(t){g(this,"uiManager");g(this,"toolbar");g(this,"searchBoxButton");g(this,"filterButton");g(this,"undoButton");g(this,"redoButton");g(this,"filteringSlidepanel");g(this,"searchModal");this.uiManager=t}mount(t){if(!t)return;this.toolbar=document.createElement("div"),this.toolbar.className="pvt-toolbar-elements";const e=document.createElement("template");e.innerHTML=`
-
`,this.searchBoxButton=e.content.firstElementChild,this.toolbar.appendChild(this.searchBoxButton);const n=document.createElement("template");n.innerHTML=`
-
`,this.filterButton=n.content.firstElementChild;const r=document.createElement("template");r.innerHTML=`
-
-
-
-
-
-
`;const s=r.content.firstElementChild;s.prepend(this.filterButton),this.undoButton=s.querySelector("#pvt-undo-button")??void 0,this.redoButton=s.querySelector("#pvt-redo-button")??void 0,this.toolbar.appendChild(s),t.appendChild(this.toolbar)}destroy(){var t;(t=this.toolbar)==null||t.remove(),this.toolbar=void 0}afterMount(){var e;if(!this.filterButton)return;this.uiManager.keyManager.register({key:"Ctrl+j",callback:()=>{var n;return(n=this.searchBoxButton)==null?void 0:n.click()}}),this.uiManager.keyManager.register({key:"Ctrl+k",callback:()=>{var n;return(n=this.filterButton)==null?void 0:n.click()}});const t=new Zp(this.uiManager);this.filteringSlidepanel=this.uiManager.createSlidepanel({header:"Graph Filters",body:t.build()}),this.filterButton.addEventListener("click",()=>{this.filteringSlidepanel.toggle()}),(e=this.searchBoxButton)==null||e.addEventListener("click",()=>{var n,r;this.searchModal||(this.searchModal=this.uiManager.createModal({body:"",buttons:null,position:"top",size:"xl",noBodyPadding:!0}),this.searchModal&&((n=this.searchModal.modal)==null||n.addEventListener("pvt-modal-show",()=>{var o,a,c,l;const s=new du(this.uiManager);(o=this.searchModal)==null||o.setBody(s.build()),(a=s.searchInput)==null||a.focus(),(c=s.searchBox)==null||c.addEventListener("pvt-searchbox-select",h=>{var p;const u=h.detail;this.uiManager.graph.selectElement(u),(p=this.searchModal)==null||p.destroy()}),(l=s.searchBox)==null||l.addEventListener("pvt-searchbox-close",()=>{var h;(h=this.searchModal)==null||h.destroy()})}),(r=this.searchModal.modal)==null||r.addEventListener("pvt-modal-hidden",()=>{this.searchModal=void 0})))})}graphReady(){}}class Jp{constructor(t,e){g(this,"uiManager");g(this,"options");g(this,"overlay");g(this,"modal");g(this,"header");g(this,"body");g(this,"footer");g(this,"DEFAULT_HEADER",null);g(this,"DEFAULT_BODY","");g(this,"DEFAULT_BUTTON_CONFIG",{text:"Ok",variant:"primary",onClick:(t,e)=>{e()}});this.uiManager=t,this.options=e,this.options.header||(this.options.header=this.DEFAULT_HEADER),this.options.body||(this.options.body=this.DEFAULT_BODY),!this.options.buttons&&this.options.buttons!==null&&(this.options.buttons=[this.DEFAULT_BUTTON_CONFIG]),this.options.position=e.position??"center"}mount(t){if(!t)return;this.overlay=document.createElement("div"),this.overlay.className="pvt-modal-overlay",this.overlay.classList.add(this.options.position==="center"?"pvt-modal-overlay-center":"pvt-modal-overlay-top"),this.overlay.addEventListener("click",n=>{n.target===this.overlay&&this.destroy()}),this.modal=document.createElement("div"),this.modal.className="pvt-modal";const e=this.options.size??"md";if(this.modal.classList.add(`pvt-modal-${e}`),this.options.header!=null){this.header=document.createElement("div"),this.header.className="pvt-modal__header",this.setHeader(this.options.header),this.modal.appendChild(this.header);const n=vt({text:"×",variant:"outline-primary",size:"sm",onClick:()=>{this.hide()},style:"margin-left: auto;"});this.header.appendChild(n)}this.body=document.createElement("div"),this.body.className="pvt-modal__body",this.setBody(this.options.body),this.options.noBodyPadding?this.body.style.padding="0":this.body.style.padding="",this.modal.appendChild(this.body),this.options.buttons!=null&&(this.footer=document.createElement("div"),this.footer.className="pvt-modal__footer",this.setButtons(this.options.buttons),this.modal.appendChild(this.footer)),this.overlay.appendChild(this.modal),t.appendChild(this.overlay)}destroy(){this.hide(),requestAnimationFrame(()=>{var t;(t=this.overlay)==null||t.remove(),this.overlay=void 0})}afterMount(){}graphReady(){}setButtons(t){!this.modal||!this.footer||(this.footer.innerHTML="",t.forEach(e=>{if(typeof e.onClick=="function"){const r=e.onClick;e.onClick=(s,o)=>{r&&r(s,o)},e.onClickArgs=[this.hide.bind(this)]}const n=vt(e);this.footer.appendChild(n)}))}setHeader(t){this.header&&(this.header.innerHTML="",t&&(this.options.header instanceof HTMLElement?this.header.appendChild(this.options.header):this.options.rawHeader?this.header.innerHTML=this.options.header:this.header.textContent=this.options.header))}setBody(t){this.body&&(this.body.innerHTML="",t&&(t instanceof HTMLElement?this.body.appendChild(t):this.options.rawBody?this.body.innerHTML=t:this.body.textContent=t))}show(){if(!this.modal||!this.overlay)return;this.dispatchEvent("show"),this.modal.classList.add("pvt-modal-open");const t=e=>{var n;e.target===this.modal&&((n=this.modal)==null||n.removeEventListener("animationend",t),this.dispatchEvent("shown"))};this.modal.addEventListener("animationend",t)}hide(){var t;!this.modal||!this.overlay||(this.dispatchEvent("hide"),this.modal.classList.remove("pvt-modal-open"),(t=this.overlay)==null||t.remove(),requestAnimationFrame(()=>{this.dispatchEvent("hidden")}))}dispatchEvent(t){if(!this.modal)return;const e=`pvt-modal-${t}`,n=new CustomEvent(e,{bubbles:!0,cancelable:!0});this.modal.dispatchEvent(n);const r=`on${t.charAt(0).toUpperCase()}${t.slice(1)}`,s=this.options[r];typeof s=="function"&&s()}}const tf={enabled:!0,allowPinning:!0};class ef{constructor(t){g(this,"uiManager");g(this,"options");g(this,"tooltip");g(this,"parentContainer");g(this,"shadowLinkContainer");g(this,"mouseX",0);g(this,"mouseY",0);g(this,"x",0);g(this,"y",0);g(this,"triggerX",0);g(this,"triggerY",0);g(this,"hoveredElementID",null);g(this,"hoveredElement",null);g(this,"showDelay",400);g(this,"hideDelay",200);g(this,"tooltipTimeout",null);g(this,"hideTimeout",null);g(this,"tooltipDataMap",new Map);g(this,"shadowlinkMap",new WeakMap);g(this,"shadowlinkBoundingBoxesMap",new WeakMap);this.uiManager=t,this.options=ae(tf,this.uiManager.getOptions().tooltip)}mount(t){if(!t)return;this.parentContainer=document.querySelector("body");const e=this.parentContainer.querySelector(".pvt-tooltip"),n=this.parentContainer.querySelector(".pivotick-shadowlink-container");if(e&&n){this.tooltip=e,this.shadowLinkContainer=n;return}const r=document.createElement("template");r.innerHTML='
',this.tooltip=r.content.firstElementChild,this.shadowLinkContainer=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.shadowLinkContainer.setAttribute("class","pivotick-shadowlink-container"),this.parentContainer.appendChild(this.tooltip),this.parentContainer.appendChild(this.shadowLinkContainer)}destroy(){var t;(t=this.tooltip)==null||t.remove(),this.tooltip=void 0}afterMount(){}graphReady(){this.tooltip&&(this.uiManager.graph.renderer.getGraphInteraction().on("nodeHoverIn",this.nodeHovered.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("nodeHoverOut",this.delayedHide.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("canvasMousemove",this.updateMousePosition.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("dragging",(t,e)=>{this.hoveredElementID===e.id&&this.hide(e)}),this.uiManager.graph.renderer.getGraphInteraction().on("canvasZoom",this.canvasZoomed.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("simulationSlowTick",this.simulationSlowTick.bind(this)),this.tooltip.addEventListener("mouseenter",()=>{this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null)}),this.tooltip.addEventListener("mouseleave",()=>this.hide()))}updateMousePosition(t){this.mouseX=t.pageX,this.mouseY=t.pageY}tooltipCanBeShown(){if(!this.tooltip||this.uiManager.graph.simulation.isDragging())return!1;const t=this.uiManager.graph.renderer.getSelectionBox();return!(t!==null&&t.selectionInProgress()||Math.abs(this.triggerX-this.mouseX)>=50||Math.abs(this.triggerY-this.mouseY)>=50)}openForNodeOnElement(t,e){this.triggerX=t.pageX,this.triggerY=t.pageY,this.mouseY=t.pageY,this.mouseX=t.pageX,this.hoveredElementID=e.id,this.hoveredElement=e,this.tooltipCanBeShown()&&this.show(()=>{this.createNodeTooltip(e)})}nodeHovered(t,e){this.hoveredElementID!==e.id&&(this.triggerX=t.pageX,this.triggerY=t.pageY,this.hoveredElementID=e.id,this.hoveredElement=e,this.tooltipCanBeShown()&&this.show(()=>{this.createNodeTooltip(e)}))}edgeHovered(t,e){this.hoveredElementID!==e.id&&(this.triggerX=t.pageX,this.triggerY=t.pageY,this.hoveredElementID=e.id,this.hoveredElement=e,this.tooltipCanBeShown()&&this.show(()=>{if(this.uiManager.graph.simulation.isDragging()){this.hide();return}this.createEdgeTooltip(e)}))}canvasZoomed(){this.updateShadowLinks(!0)}simulationSlowTick(){this.updateShadowLinks(!0)}buildNodeTooltip(t){var m;const r=st(`
-
`),s=r.querySelector(".pvt-mainheader-container"),o=r.querySelector(".pvt-mainheader-icon"),a=r.querySelector(".pvt-mainheader-nodeinfo-name"),c=r.querySelector(".pvt-mainheader-nodeinfo-subtitle"),l=r.querySelector(".pvt-mainheader-topright"),h=tn(t,this.uiManager.getOptions().propertiesPanel),d=t.getGraphElement();if(d&&d instanceof SVGGElement){const b=d.cloneNode(!0);(m=b.querySelector("circle.pvt-node-selected-highlight"))==null||m.remove();const y=d.getBBox(),w=32/Math.max(y.width,y.height);b.setAttribute("transform",`translate(${(32-y.width*w)/2-y.x*w}, ${(32-y.height*w)/2-y.y*w}) scale(${w})`),o.appendChild(b)}if(a.textContent=Yt(t,this.uiManager.getOptions().mainHeader),c.textContent=$r(t,this.uiManager.getOptions().mainHeader),this.options.allowPinning){const b=vt({title:"Pin Tooltip",variant:"outline-primary",size:"sm",class:"pin-button",svgIcon:oe,onClick:()=>{this.pinTooltip()}});l.appendChild(b)}const u=this.uiManager.getOptions().tooltip.render;if(u&&typeof u=="function"){const b=_t(u,t);if(b){const y=O("div",{class:"pivotick-extra-content-container"},[b]);r.appendChild(y)}return r}const p=O("div",{class:"pvt-properties-container"},[Pe(h,t)]);r.appendChild(s),r.appendChild(p);const f=this.uiManager.getOptions().tooltip.renderNodeExtra;if(f&&typeof f=="function"){const b=_t(f,t);if(b){const y=O("div",{class:"pivotick-extra-content-container"},[b]);r.appendChild(y)}}return r}createNodeTooltip(t){if(!this.tooltip)return!1;this.tooltip.innerHTML="";const e=this.buildNodeTooltip(t);this.tooltip.appendChild(e)}createEdgeTooltip(t){if(!this.tooltip)return!1;this.tooltip.innerHTML="";const n=`
-
`,r=st(n),s=r.querySelector(".pvt-mainheader-container"),o=r.querySelector(".pvt-mainheader-nodeinfo-name"),a=r.querySelector(".pvt-mainheader-nodeinfo-subtitle"),c=r.querySelector(".pvt-mainheader-topright"),l=vt({title:"Pin Tooltip",variant:"outline-primary",size:"sm",class:"pin-button",svgIcon:oe,onClick:()=>{this.pinTooltip()}});c.appendChild(l);const h=this.uiManager.getOptions().tooltip.render;if(h&&typeof h=="function"){const f=_t(h,t);if(f){const m=O("div",{class:"pivotick-extra-content-container"},[f]);r.appendChild(m)}this.tooltip.appendChild(r);return}const d=en(t,this.uiManager.getOptions().propertiesPanel);o.textContent=Ee(t,this.uiManager.getOptions().mainHeader),a.textContent=Gr(t,this.uiManager.getOptions().mainHeader);const u=O("div",{class:"pvt-properties-container"},[Pe(d,t)]);r.appendChild(s),r.appendChild(u);const p=this.uiManager.getOptions().tooltip.renderEdgeExtra;if(p&&typeof p=="function"){const f=_t(p,t);if(f){const m=O("div",{class:"pivotick-extra-content-container"},[f]);r.appendChild(m)}}this.tooltip.appendChild(r)}setPosition(){var d,u,p,f;if(!this.tooltip)return;const t=(u=(d=this.hoveredElement)==null?void 0:d.getGraphElement())==null?void 0:u.getBoundingClientRect();if(!t)return;const e=(f=(p=this.uiManager.layout)==null?void 0:p.canvas)==null?void 0:f.getBoundingClientRect();if(!e)return;const n=20,r=15,s=e.left+window.scrollX,o=e.top+window.scrollY,a=e.width,c=e.height,l=this.tooltip.offsetWidth,h=this.tooltip.offsetHeight;this.x=t.x+t.width+r,this.y=t.y,this.x+l+n>s+a&&(this.x=t.x-l-r),this.x
o+c&&(this.y-=h),this.ythis.hide(e),this.hideDelay)}hide(t){this.tooltip&&(this.hideTimeout&&clearTimeout(this.hideTimeout),(this.hoveredElement===t||t===void 0)&&(this.tooltipTimeout&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=null),this.hoveredElementID=null,this.hoveredElement=null,this.triggerX=-2e3,this.triggerY=-2e3,this.tooltip.classList.remove("shown"),this.tooltip.style.left="-10000px"))}show(t){var e;(e=this.uiManager.contextMenu)!=null&&e.visible||(this.tooltipTimeout&&clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(()=>{var n;t&&t(),(n=this.tooltip)==null||n.classList.add("shown"),requestAnimationFrame(()=>{this.setPosition()})},this.showDelay))}pinTooltip(){var a;if(!this.tooltip||!this.parentContainer||!this.hoveredElement)return;const t=this.tooltip.cloneNode(!0);this.tooltipDataMap.set(t,this.hoveredElement),t.classList.add("pvt-tooltip-floating"),(a=t.querySelector(".pin-button"))==null||a.remove();const e=vt({title:"Close Tooltip",variant:"outline-danger",size:"sm",class:["close-button"],svgIcon:qd,onClick:()=>{this.tooltipDataMap.delete(t),this.reomveShadowLink(t),t.remove()}}),n=vt({title:"Focus Element in Graph",variant:"outline-primary",size:"sm",class:["focus-element"],svgIcon:Jr,onClick:()=>{const c=this.tooltipDataMap.get(t);c&&this.uiManager.graph.focusElement(c)}}),r=vt({title:"Select Element in Graph",variant:"outline-primary",size:"sm",class:["select-element"],svgIcon:Vd,onClick:()=>{const c=this.tooltipDataMap.get(t);c&&this.uiManager.graph.selectElement(c)}}),s=O("div",{class:"pvt-tooltip-topbar"},[n,r,e]);t.prepend(s);const o=this.uiManager.getAppContainer();co(t,s,o,{onDragStart:(c,l)=>{this.shadowlinkBoundingBoxesMap.set(l,[l.getBoundingClientRect(),this.tooltipDataMap.get(l).getGraphElement().getBoundingClientRect()])},onDrag:(c,l)=>{this.updateShadowLink(l,this.tooltipDataMap.get(l))}}),this.parentContainer.appendChild(t),this.addShadowLink(t)}addShadowLink(t){var n;const e=oo("path",{class:"pivotick-shadowlink"});this.shadowlinkMap.set(t,e),(n=this.shadowLinkContainer)==null||n.appendChild(e)}updateShadowLinks(t=!1){for(const[e,n]of this.tooltipDataMap.entries())this.updateShadowLink(e,n,t)}updateShadowLink(t,e,n=!1){let r;n?r=[t.getBoundingClientRect(),e.getGraphElement().getBoundingClientRect()]:r=this.shadowlinkBoundingBoxesMap.get(t);const{width:s,height:o}=r[0],{x:a,y:c,width:l,height:h}=r[1],d=this.shadowlinkMap.get(t),u=parseFloat(t.style.left),p=parseFloat(t.style.top);d&&d.setAttribute("d",`M ${u+s/2} ${p+o/2} L ${a+l/2} ${c+h/2}`)}reomveShadowLink(t){const e=this.shadowlinkMap.get(t);e&&e.remove()}}const nf={topbar:[{title:"Pin Node",svgIcon:oe,variant:"outline-primary",visible:i=>!i.frozen,onclick(i,t){t.freeze()}},{title:"Unpin Node",svgIcon:un,variant:"outline-primary",visible:i=>i.frozen,onclick(i,t){t.unfreeze()}},{title:"Focus Node",svgIcon:Jr,variant:"outline-primary",onclick(i,t){this.uiManager.graph.focusElement(t)}},{title:"Hide Node",svgIcon:pn,variant:"outline-danger",flushRight:!0,visible:i=>i.visible,onclick(i,t){this.uiManager.graph.queryEngine.excludeNode(t)}}],menu:[{text:"Select Neighbors",title:"Select Neighbors",svgIcon:Pd,variant:"outline-primary",onclick(i,t){const e=[...t.getConnectedNodes(),...t.getConnectingNodes()].map(n=>({node:n,element:n.getGraphElement()}));this.uiManager.graph.renderer.getGraphInteraction().selectNodes(e)}},{text:"Hide Children",title:"Hide Children",svgIcon:pn,variant:"outline-primary",visible:i=>i.visible,onclick(i,t){t.hide()}},{text:"Expand Node",title:"Expand Node",svgIcon:es,variant:"outline-primary",visible:i=>!1,onclick(i,t){}},{text:"Inspect Properties",title:"Inspect Properties",svgIcon:Ud,variant:"outline-primary",visible:i=>!0,onclick(i,t){this.uiManager.graph.renderer.getGraphInteraction().selectNode(t.getGraphElement(),t)}}]},rf={topbar:[],menu:[]},sf={topbar:[{title:"Pin All",svgIcon:oe,variant:"outline-primary",visible:!0,onclick(i){(this.uiManager.graph.getMutableNodes()??[]).forEach(e=>{e.freeze()})}},{title:"Unpin All",svgIcon:un,variant:"outline-primary",visible:!0,onclick(i){var e;(this.uiManager.graph.getMutableNodes()??[]).forEach(n=>{n.unfreeze()}),(e=this.uiManager.graph.simulation)==null||e.reheat()}}],menu:[]};class of{constructor(t){g(this,"uiManager");g(this,"menu");g(this,"visible");g(this,"parentContainer");g(this,"element",null);g(this,"menuNode");g(this,"menuEdge");g(this,"menuCanvas");this.uiManager=t,this.visible=!1,this.menuNode=ae(nf,this.uiManager.getOptions().contextMenu.menuNode??{}),this.menuEdge=ae(rf,this.uiManager.getOptions().contextMenu.menuEdge??{}),this.menuCanvas=ae(sf,this.uiManager.getOptions().contextMenu.menuCanvas??{}),this.wrapOnclickActions()}mount(t){if(!t)return;this.parentContainer=document.querySelector("body");const e=this.parentContainer.querySelector(".pvt-contextmenu");if(e){this.menu=e;return}const n=document.createElement("template");n.innerHTML=`
-
- `,this.menu=n.content.firstElementChild,this.parentContainer.appendChild(this.menu)}destroy(){var t;(t=this.menu)==null||t.remove(),this.menu=void 0}afterMount(){}graphReady(){this.uiManager.graph.renderer.getGraphInteraction().on("nodeContextmenu",this.nodeClicked.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("edgeContextmenu",this.edgeClicked.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("canvasContextmenu",this.canvasClicked.bind(this)),this.uiManager.graph.renderer.getGraphInteraction().on("canvasClick",()=>{this.hide()}),this.uiManager.graph.renderer.getGraphInteraction().on("canvasZoom",()=>{this.hide()})}nodeClicked(t,e){this.menu&&(this.element=e,this.createNodeMenu(e),this.setPosition(t),this.show())}edgeClicked(t,e){this.menu&&(this.element=e,this.createEdgeMenu(e),this.setPosition(t),this.show())}canvasClicked(t){this.menu&&(this.element=null,this.createCanvasMenu(),this.setPosition(t),this.show())}wrapOnclickActions(){[this.menuNode.menu,this.menuNode.topbar,this.menuEdge.menu,this.menuEdge.topbar,this.menuCanvas.menu,this.menuCanvas.topbar].forEach(t=>{t.forEach(e=>{this.wrapOnclickAction(e)})})}wrapOnclickAction(t){if(t.onclick){const e=t.onclick,n=this;t.onclick=function(r,s){var o;e.apply(this,[r,s]),(o=n.hide)==null||o.call(n)}}}createNodeMenu(t){if(!this.menu)return;const e=this.menu.querySelector(".pvt-contextmenu-topbar"),n=this.menu.querySelector(".pvt-contextmenu-mainmenu");e.innerHTML="",n.innerHTML="",e.appendChild(De(this,this.menuNode.topbar,this.element)),n.appendChild(Fe(this,this.menuNode.menu,this.element))}createEdgeMenu(t){if(!this.menu)return;const e=this.menu.querySelector(".pvt-contextmenu-topbar"),n=this.menu.querySelector(".pvt-contextmenu-mainmenu");e.innerHTML="",n.innerHTML="",e.appendChild(De(this,this.menuEdge.topbar,this.element)),n.appendChild(Fe(this,this.menuEdge.menu,this.element))}createCanvasMenu(){if(!this.menu)return;const t=this.menu.querySelector(".pvt-contextmenu-topbar"),e=this.menu.querySelector(".pvt-contextmenu-mainmenu");t.innerHTML="",e.innerHTML="",t.appendChild(De(this,this.menuCanvas.topbar,this.element)),e.appendChild(Fe(this,this.menuCanvas.menu,this.element))}show(){var t;this.visible||this.menu&&((t=this.uiManager.tooltip)==null||t.hide(),this.menu.classList.add("shown"),this.visible=!0)}hide(){this.visible&&this.menu&&(this.element=null,this.menu.classList.remove("shown"),this.menu.style.left="-10000px",this.visible=!1)}setPosition(t){if(!this.menu)return;const e=10,n=t.pageX,r=t.pageY;this.menu.style.left=`${n+e}px`,this.menu.style.top=`${r+e}px`}}class af{constructor(){g(this,"bindings",new Map)}register(t){this.bindings.set(t.key,t.callback)}handleKeyPress(t){const e=this.getKeyCombo(t),n=this.bindings.get(e);n&&(t.preventDefault(),n(t))}getKeyCombo(t){const e=[];return t.ctrlKey&&e.push("Ctrl"),t.shiftKey&&e.push("Shift"),t.altKey&&e.push("Alt"),e.push(t.key),e.join("+")}}const Ts=i=>{const t=[];for(const[e,n]of Object.entries(i.getData()))e&&n&&t.push({name:e,value:n});return t},mi=(i,t,e="")=>{var r;const n=(r=i.getData())==null?void 0:r[t];return typeof n=="string"?n:e},lf=i=>mi(i,"label","Could not resolve title"),cf=i=>mi(i,"description"),hf=i=>mi(i,"label",""),df=i=>mi(i,"description"),Ls=i=>Ts(i),Os=i=>Ts(i),Ps={nodeHeaderMap:{title:lf,subtitle:cf},edgeHeaderMap:{title:hf,subtitle:df},render:void 0},uf={mode:"viewer",mainHeader:Ps,sidebar:{collapsed:"auto"},propertiesPanel:{nodePropertiesMap:Ls,edgePropertiesMap:Os},neighborsPanel:{},tooltip:{enabled:!0,allowPinning:!0,nodePropertiesMap:Ls,edgePropertiesMap:Os,...Ps},navigation:{enabled:!0},contextMenu:{enabled:!0,menuNode:{topbar:[],menu:[]},menuEdge:{topbar:[],menu:[]},menuCanvas:{topbar:[],menu:[]}},selectionMenu:{menuNode:{topbar:[],menu:[]}},extraPanels:[]};class pf{constructor(t,e,n){g(this,"graph");g(this,"container");g(this,"options");g(this,"layout");g(this,"slidePanel");g(this,"sidebar");g(this,"toolbar");g(this,"modal");g(this,"graphNaviation");g(this,"graphControls");g(this,"tooltip");g(this,"contextMenu");g(this,"keyManager");this.graph=t,this.container=e,this.options=se({},uf,n),this.keyManager=new af,this.setup()}setup(){switch(this.destroy(),this.options.mode){case"viewer":this.setupViewerMode();break;case"full":this.setupFullMode();break;case"light":this.setupLightMode();break;case"static":this.setupStaticMode();break;default:console.warn(`Unknown mode: ${this.options.mode}. Defaulting to 'viewer'.`),this.setupViewerMode();break}this.callAfterMount()}hasEnoughSpaceForFullMode(){const t=this.container.getBoundingClientRect();return t.width>1200&&t.height>800}hasEnoughSpaceForLightMode(){const t=this.container.getBoundingClientRect();return t.width>600&&t.height>600}setupViewerMode(){this.buildLayout(),this.buildUIGraphNavigation()}setupStaticMode(){this.buildLayout()}setupFullMode(){var t,e;((e=(t=this.options)==null?void 0:t.sidebar)==null?void 0:e.collapsed)==="auto"&&!this.hasEnoughSpaceForFullMode()&&(console.debug("Not enough space for full mode UI. Collapsing sidebar"),this.options.sidebar.collapsed=!0),this.buildLayout(),this.buildUIGraphNavigation(),this.buildUIGraphControls(),this.buildToolbar(),this.buildSidebar()}setupLightMode(){if(!this.hasEnoughSpaceForLightMode()){console.warn("Not enough space for light mode UI. Switching to viewer mode."),this.options.mode="viewer",this.setupViewerMode();return}this.buildLayout(),this.buildUIGraphNavigation(),this.buildUIGraphControls(),this.buildToolbar()}buildLayout(){this.layout=new Qd,this.layout.mount(this.container,this.options.mode)}buildUIGraphNavigation(){var t,e,n,r,s;this.options.navigation.enabled&&(this.graphNaviation=new Zd(this),this.graphNaviation.mount((t=this.layout)==null?void 0:t.graphnavigation)),(e=this.options.tooltip)!=null&&e.enabled&&(this.tooltip=new ef(this),this.tooltip.mount((n=this.layout)==null?void 0:n.canvas)),(r=this.options.contextMenu)!=null&&r.enabled&&(this.contextMenu=new of(this),this.contextMenu.mount((s=this.layout)==null?void 0:s.canvas))}buildUIGraphControls(){var t;this.graphControls=new Kd(this),this.graphControls.mount((t=this.layout)==null?void 0:t.graphcontrols)}buildToolbar(){var t;this.toolbar=new Qp(this),this.toolbar.mount((t=this.layout)==null?void 0:t.toolbar)}buildSidebar(){var t;this.sidebar=new cu(this),this.sidebar.mount((t=this.layout)==null?void 0:t.sidebar)}destroy(){this.layout&&(this.layout.destroy(),this.layout=void 0)}callAfterMount(){var t,e,n,r,s,o,a,c,l;(t=this.layout)==null||t.afterMount(),(e=this.toolbar)==null||e.afterMount(),(n=this.sidebar)==null||n.afterMount(),(r=this.graphNaviation)==null||r.afterMount(),(s=this.graphControls)==null||s.afterMount(),(o=this.options.tooltip)!=null&&o.enabled&&((a=this.tooltip)==null||a.afterMount()),(c=this.options.contextMenu)!=null&&c.enabled&&((l=this.contextMenu)==null||l.afterMount()),this.container.addEventListener("keydown",h=>this.keyManager.handleKeyPress(h)),this.container.setAttribute("tabindex","0")}getOptions(){return this.options}getAppContainer(){const t=this.graph.getAppID();return document.getElementById(t)}callGraphReady(){var t,e,n,r;(t=this.graphControls)==null||t.graphReady(),(e=this.sidebar)==null||e.graphReady(),(n=this.tooltip)==null||n.graphReady(),(r=this.contextMenu)==null||r.graphReady()}showNotification(t){var h;const{level:e,title:n,message:r}=t,s=(h=this.layout)==null?void 0:h.notification;if(!s)return;const o=document.createElement("template");o.innerHTML=`
-
-`;const a=o.content.firstElementChild,c=a.querySelector(".pivotick-toast-title"),l=a.querySelector(".pivotick-toast-body");c&&(c.textContent=n),l&&(l.textContent=r??""),s.appendChild(a),requestAnimationFrame(()=>{a.classList.add("show")}),setTimeout(()=>{a.classList.remove("show"),a.addEventListener("transitionend",()=>{a.remove()},{once:!0})},4e3)}createModal(t){var r,s;if(!((r=this.layout)==null?void 0:r.modal))return;const n=new Jp(this,t);return n.mount((s=this.layout)==null?void 0:s.modal),requestAnimationFrame(()=>{n.show()}),n}createSlidepanel(t){var r,s;if(!((r=this.layout)==null?void 0:r.slidePanel))return;const n=new hu(this,t);return n.mount((s=this.layout)==null?void 0:s.slidePanel),n}}const vi={Success:"success",Warning:"warning",Danger:"danger",Info:"info"};class ff{constructor(t){g(this,"graph");g(this,"UIManager");this.graph=t,this.UIManager=this.graph.UIManager}notify(t,e,n){const r={level:t,title:e,message:n};this.UIManager.showNotification(r)}success(t,e){this.notify(vi.Success,t,e)}warning(t,e){this.notify(vi.Warning,t,e)}error(t,e){this.notify(vi.Danger,t,e)}info(t,e){this.notify(vi.Info,t,e)}}const kn="manually_hidden";class gf{constructor(t){g(this,"graph");g(this,"listeners");g(this,"filters",{});g(this,"excludedNodeIds",new Set);g(this,"hiddenNodeCount",0);this.graph=t,this.listeners={filterAdd:[],filterRemove:[],filterReset:[],filterChange:[]}}on(t,e){this.listeners[t].push(e)}off(t,e){this.listeners[t]=this.listeners[t].filter(n=>n!==e)}emit(t,...e){for(const n of this.listeners[t])n(...e)}getFilters(){const t={value:[...this.excludedNodeIds],matchMode:"exact"};return{...this.filters,manuallyHidden:t}}setFilters(t){for(const[e,n]of Object.entries(t)){if(n===void 0){this.removeFilter(e);return}this.filters[e]=n}this.apply(),this.emit("filterChange",this.getFilters())}setFilter(t,e){if(e===void 0){this.removeFilter(t);return}this.filters[t]=e,this.apply(),this.emit("filterAdd",t,e),this.emit("filterChange",this.getFilters())}removeFilter(t){t in this.filters&&(delete this.filters[t],this.apply(),this.emit("filterRemove",t),this.emit("filterChange",this.getFilters()))}resetFilters(){this.filters={},this.apply(),this.emit("filterReset"),this.emit("filterChange",this.getFilters())}excludeNode(t){let e;if(t instanceof yt?e=t:e=this.graph.getNode(t),e===void 0)return;this.excludedNodeIds.add(e.id),this.hiddenNodeCount++;const n={value:e.id,matchMode:"exact"};this.graph.hideNode(e),this.emit("filterAdd",kn,n),this.emit("filterChange",this.getFilters())}includeNode(t){let e;t instanceof yt?e=t:e=this.graph.getNode(t),e!==void 0&&(this.excludedNodeIds.delete(e.id),this.hiddenNodeCount--,this.graph.showNode(e),this.emit("filterRemove",kn),this.emit("filterChange",this.getFilters()))}clearNodeExclusions(){this.hiddenNodeCount+=this.excludedNodeIds.size,this.excludedNodeIds.clear(),this.apply(),this.emit("filterRemove",kn),this.emit("filterChange",this.getFilters())}getExcludedNodeCount(){return this.excludedNodeIds.size}getExcludedNodes(){return[...this.excludedNodeIds].map(t=>this.graph.getMutableNode(t)).filter(t=>t!==void 0)}getHiddenNodeCount(){return this.hiddenNodeCount}apply(){const t=this.graph.getMutableNodes(),n=t.filter(r=>this.nodeMatchesFilters(r)).filter(r=>r.childrenDepth===0);this.hiddenNodeCount=t.length-n.length,this.applyFiltersOnSubgraph(),this.graph.setVisibleNodes(n)}applyFiltersOnSubgraph(){const t=this.getFilters();this.graph.getMutableNodes().filter(e=>e.childrenDepth===0).forEach(e=>{const n=e.getSubgraph();e.isParent&&n&&(n.queryEngine.resetFilters(),n.queryEngine.setFilters(t))})}nodeMatchesFilters(t){if(this.excludedNodeIds.has(t.id))return!1;for(const[e,n]of Object.entries(this.filters)){if(e==="manuallyHidden")continue;const r=t.getData()[e];if(!this.matches(r,n))return!1}return!0}matches(t,e){if(e===void 0)return!0;if(t===void 0)return!1;const n=e.value,r=(e==null?void 0:e.matchMode)??"partial";if(typeof n=="string")return r==="partial"?String(t).includes(n):t===n;if(typeof n=="number"||typeof n=="boolean")return t===n;if(Array.isArray(n))return r==="partial"?n.includes(t):t===n;if(typeof n=="object"&&n!==null){const{min:s,max:o}=n;return!(typeof t!="number"||s!==void 0&&to)}return!1}}class ft{constructor(t,e,n){g(this,"nodes",new Map);g(this,"edges",new Map);g(this,"UIManager");g(this,"notifier");g(this,"renderer");g(this,"simulation");g(this,"queryEngine");g(this,"options");g(this,"app_id");g(this,"parentGraph");g(this,"graphDepth");g(this,"listeners");var c,l,h;if(this.listeners={ready:[],nodeAdd:[],nodeRemove:[],nodeChange:[],edgeAdd:[],edgeRemove:[],edgeChange:[],dataBatchChanged:[]},this.options={isDirected:!0,...n},((c=this.options.UI)==null?void 0:c.mode)==="static"&&(this.options.simulation||(this.options.simulation={}),this.options.simulation.enabled=!1,this.options.simulation.useWorker=!1,this.options.render||(this.options.render={}),this.options.render.zoomEnabled=!1,this.options.render.zoomAnimation=!1,this.options.render.dragEnabled=!1,this.options.render.selectionBox||(this.options.render.selectionBox={}),this.options.render.selectionBox.enabled=!1,this.options.UI.tooltip||(this.options.UI.tooltip={}),this.options.UI.tooltip.enabled=!1,this.options.UI.contextMenu||(this.options.UI.contextMenu={}),this.options.UI.contextMenu.enabled=!1),this.graphDepth=0,this.options.parentGraph){this.setParentGraph(this.options.parentGraph);let d=this.parentGraph;for(;d;)d=d.parentGraph,this.graphDepth++}const r={...this.options.render},s=this.options.UI,o=document.createElement("div");this.app_id=Ai(8,"pivotick-app-"),o.id=this.app_id,o.classList.add("pivotick"),t.appendChild(o),this.queryEngine=new gf(this),this.UIManager=new pf(this,o,s),this.notifier=new ff(this),this.renderer=qh(this,o,r),this.renderer.setupRendering();const a={...this.options.simulation,layout:(l=this.options)==null?void 0:l.layout};if(this.simulation=new $t(this,a),e){const d=ft.normalizeGraphData(e);this._setData(d==null?void 0:d.nodes,d==null?void 0:d.edges),(h=this.simulation)==null||h.update(),this.renderer.init(),this.renderer.fitAndCenter(1)}this.startAndRender()}on(t,e){this.listeners[t].push(e)}off(t,e){this.listeners[t]=this.listeners[t].filter(n=>n!==e)}emit(t,...e){for(const n of this.listeners[t])n(...e)}async startAndRender(){await this.simulation.start(),await this.simulation.waitForSimulationStop(),this.renderer.nextTick(),this.renderer.fitAndCenter(),this.UIManager.callGraphReady(),this.ready()}static normalizeGraphData(t){const e=t.nodes.map(l=>ft.normalizeNode(l)),n=new Map,r=l=>{l.children.forEach(h=>{n.set(h.id,h),h.hasChildren()&&r(h)})};e.forEach(l=>{r(l)});const s=new Map(e.map(l=>[l.id,l])),o=new Map([...s,...n]),a=t.edges.map(l=>ft.normalizeEdge(l,o)).filter(l=>l!==null),c=[];for(const l of a)if(!l.from.isChild&&l.to.isChild&&l.to.parentNode){let h=l.to.parentNode;const d=new Set;for(;h&&!d.has(h.id);){d.add(h.id);const u=`synthetic-${l.from.id}-${h.id}`,p=new bt(u,l.from,h,{},{},null,l.to);if(p.to.isChild&&p.hide(),c.push(p),!h.parentNode)break;h=h.parentNode}}return a.push(...c),{nodes:e,edges:a}}static normalizeNode(t,e=0){let n=[];!(t instanceof yt)&&t.children&&(n=t.children.map(s=>ft.normalizeNode(s,e+1)));const r=t instanceof yt?t:new yt(t.id.toString(),t.data,t.style,t.domID,n);return r.children.forEach(s=>{s.markAsChild(r,e+1),s.hide()}),r.weight=t.weight,r.expanded=t.expanded,r}static normalizeEdge(t,e){var a;if(t instanceof bt)return t;const n=e,r=n.get(t.from.toString()),s=n.get(t.to.toString());if(!r||!s)return null;const o=new bt(((a=t.id)==null?void 0:a.toString())??`${t.from}-${t.to}`,r,s,t.data,t.style);return(r.isChild||s.isChild)&&o.hide(),o}ready(){this.emit("ready")}nodeAdd(t){this.emit("nodeAdd",t)}nodeRemove(t){this.emit("nodeRemove",t)}nodeChange(t,e,n){this.emit("nodeChange",t,e,n)}edgeAdd(t){this.emit("edgeAdd",t)}edgeRemove(t){this.emit("edgeRemove",t)}edgeChange(t,e,n){this.emit("edgeChange",t,e,n)}dataBatchChanged(t){t&&(this.emit("dataBatchChanged",t),t.forEach(e=>{switch(e.type){case"node:add":this.nodeAdd(e.node);break;case"node:change":this.nodeChange(e.node,e.previousData,e.nextData);break;case"node:remove":this.nodeRemove(e.node);break;case"edge:add":this.edgeAdd(e.edge);break;case"edge:change":this.edgeChange(e.edge,e.previousData,e.nextData);break;case"edge:remove":this.edgeRemove(e.edge);break}}))}getOptions(){return this.options}getCallbacks(){var t;return(t=this.options)==null?void 0:t.callbacks}onChange(){var t,e,n;(t=this.renderer)==null||t.update(!0),(e=this.simulation)==null||e.update(),(n=this.renderer)==null||n.nextTick()}updateData(t,e,n=!0){const r=[];t&&t.forEach(s=>{var o;this.nodes.has(s.id)?(r.push({type:"node:change",node:s,previousData:(o=this.nodes.get(s.id))==null?void 0:o.getData(),nextData:s.getData()}),this.nodes.set(s.id,s)):(this.addNode(s),r.push({type:"node:add",node:s}))}),e&&e.forEach(s=>{var o;this.edges.has(s.id)?(r.push({type:"edge:change",edge:s,previousData:(o=this.nodes.get(s.id))==null?void 0:o.getData(),nextData:s.getData()}),this.edges.set(s.id,s)):(this.addEdge(s),r.push({type:"edge:add",edge:s}))}),(t||e)&&this.onChange(),n&&this.dataBatchChanged(r)}setData(t=[],e=[]){this.nodes.clear(),this.edges.clear();const n=ft.normalizeGraphData({nodes:t,edges:e});this._setData(n==null?void 0:n.nodes,n==null?void 0:n.edges),this.onChange(),this.startAndRender()}_setData(t,e){const n=s=>{s.children.forEach(o=>{this.nodes.set(o.id,o),o.hasChildren()&&n(o)})},r=[];t.forEach(s=>{this.nodes.set(s.id,s),r.push({type:"node:add",node:s}),n(s)}),e.forEach(s=>{if(!this.nodes.has(s.from.id)||!this.nodes.has(s.to.id)){console.warn(`Edge is pointing a node that doesn't exist. (${this.nodes.get(s.from.id)}) -> (${this.nodes.get(s.to.id)}). It has been skipped`);return}this.edges.set(s.id,s),r.push({type:"edge:add",edge:s})}),this.dataBatchChanged(r)}addNode(t){const e=ft.normalizeNode(t);if(this.nodes.has(e.id))throw new Error(`Node with id ${e.id} already exists.`);return this.nodes.set(e.id,e),this.dataBatchChanged([{type:"node:add",node:e}]),this.onChange(),e}getNode(t){const e=this._getNode(t);return e?structuredClone(e):void 0}getMutableNode(t){return this._getNode(t)}_getNode(t){if(typeof t=="string"){const e=this.nodes.get(t);return e||void 0}else return t instanceof yt?t:void 0}removeNode(t){if(this.nodes.has(t)){this.dataBatchChanged([{type:"node:remove",node:this.nodes.get(t)}]),this.nodes.delete(t);for(const[e,n]of this.edges)(n.from.id===t||n.to.id===t)&&(this.dataBatchChanged([{type:"edge:remove",edge:this.edges.get(e)}]),this.edges.delete(e));this.onChange()}}addEdge(t){const e=ft.normalizeEdge(t,this.nodes);if(!e)throw new Error("Either of the from or to nodes do not exist");if(this.edges.has(e.id))throw new Error(`Edge with id ${e.id} already exists.`);if(!this.nodes.has(e.from.id)||!this.nodes.has(e.to.id))throw new Error("Both nodes must exist in the graph before adding an edge.");return this.edges.set(e.id,e),this.dataBatchChanged([{type:"edge:add",edge:e}]),this.onChange(),e}getEdge(t){const e=this.edges.get(t);return e?structuredClone(e):void 0}getMutableEdge(t){return this.edges.get(t)}removeEdge(t){this.edges.has(t)&&(this.dataBatchChanged([{type:"edge:remove",edge:this.edges.get(t)}]),this.edges.delete(t),this.onChange())}getNodeCount(){return this.nodes.size}getEdgeCount(){return this.edges.size}getNodes(){return Array.from(this.nodes.values()).filter(t=>!t.isChild).map(t=>t.clone())}getMutableNodes(){return Array.from(this.nodes.values())}getMutableVisibleNodes(){return this.getMutableNodes().filter(t=>t.visible)}getEdges(){return Array.from(this.edges.values()).map(t=>t.clone())}getMutableEdges(){return Array.from(this.edges.values())}getMutableVisibleEdges(){return this.getMutableEdges().filter(t=>t.visible)}getEdgesFromNode(t){const e=this._getNode(t);return e?this.getEdges().filter(n=>n.from.id===e.id):[]}getEdgesToNode(t){const e=this._getNode(t);return e?this.getEdges().filter(n=>n.to.id===e.id):[]}getConnectedNodes(t){const e=this._getNode(t);return e?this.getEdgesFromNode(e.id).map(s=>s.to):[]}setVisibleNodes(t){const e=new Set(t.map(r=>r.id));let n=!1;this.nodes.forEach(r=>{const s=e.has(r.id);r.visible!==s&&(r.toggleVisibility(s),n=!0)}),this.edges.forEach(r=>{var c,l;const s=(((c=r.getSubgraphFromNode())==null?void 0:c.visible)??r.from.visible)&&(((l=r.getSubgraphToNode())==null?void 0:l.visible)??r.to.visible),o=!r.isSynthetic||!r.to.expanded,a=s&&o;r.visible!==a&&(r.toggleVisibility(a),n=!0)}),n&&this.onChange()}hideNode(t){t.hide(),t.getEdgesOut().forEach(e=>{e.hide()}),t.getEdgesIn().forEach(e=>{e.hide()}),this.onChange()}showNode(t){t.show(),t.getEdgesOut().forEach(e=>{e.target.visible&&e.show()}),t.getEdgesIn().forEach(e=>{e.from.visible&&e.show()}),this.onChange()}toggleExpandNode(t){t.toggleExpand(),this.onChange()}toggleExpandNodes(t){t.forEach(e=>{e.toggleExpand()}),this.onChange()}nextTick(){var t;(t=this.renderer)==null||t.nextTick()}nextTickFor(t){var e;(e=this.renderer)==null||e.nextTickFor(t)}destroy(){this.UIManager.destroy()}getAppID(){return this.app_id}setParentGraph(t){this.parentGraph=t}getParentGraph(){return this.parentGraph}getGraphDepth(){return this.graphDepth}updateLayoutProgress(t,e,n){var r;(r=this.renderer)==null||r.updateLayoutProgress(t,e,n)}focusElement(t){this.renderer.focusElement(t)}selectElement(t){t instanceof bt?this.renderer.getGraphInteraction().selectEdge(t.getGraphElement(),t):t instanceof yt&&this.renderer.getGraphInteraction().selectNode(t.getGraphElement(),t)}deselectAll(){this.renderer.getGraphInteraction().unselectAll()}highlightElement(t){this.renderer.highlightElement(t)}unHighlightElement(t){this.renderer.unHighlightElement(t)}}const Nn={pivotick:{colors:["#7EA2FB","#A666F4","#85CB33","#FFB74D","#4DD0E1","#FFD54F","#BA68C8","#81C784","#00BCD4","#FFA726"],maxColors:10,colorblindSafe:!1,description:"Official Pivotick palette"},"d3-category10":{colors:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],maxColors:10,colorblindSafe:!1,description:"Classic D3 categorical palette"},"d3-tableau10":{colors:["#4E79A7","#F28E2B","#E15759","#76B7B2","#59A14F","#EDC948","#B07AA1","#FF9DA7","#9C755F","#BAB0AC"],maxColors:10,colorblindSafe:!1,description:"Modern Tableau 10 palette"},"okabe-ito":{colors:["#E69F00","#56B4E9","#009E73","#F0E442","#0072B2","#D55E00","#CC79A7","#000000"],maxColors:8,colorblindSafe:!0,description:"Colorblind-safe Okabe-Ito palette"},"brewer-set3":{colors:["#8DD3C7","#FFFFB3","#BEBADA","#FB8072","#80B1D3","#FDB462","#B3DE69","#FCCDE5","#D9D9D9","#BC80BD","#CCEBC5","#FFED6F"],maxColors:12,colorblindSafe:!1,description:"Large ColorBrewer Set3 palette"},"tol-bright":{colors:["#4477AA","#EE6677","#228833","#CCBB44","#66CCEE","#AA3377","#BBBBBB"],maxColors:7,colorblindSafe:!0,description:"Paul Tol bright palette"},"kelly-22":{colors:["#F2F3F4","#222222","#F3C300","#875692","#F38400","#A1CAF1","#BE0032","#C2B280","#848482","#008856","#E68FAC","#0067A5","#F99379","#604E97","#F6A600","#B3446C","#DCD300","#882D17","#8DB600","#654522","#E25822","#2B3D26"],maxColors:22,colorblindSafe:!1,description:"Kelly's 22 colors of maximum contrast"},"tableau-40":{colors:["#4E79A7","#A0CBE8","#F28E2B","#FFBE7D","#59A14F","#8CD17D","#B6992D","#F1CE63","#499894","#86BCB6","#E15759","#FF9D9A","#79706E","#BAB0AC","#D37295","#FABFD2","#B07AA1","#D4A6C8","#9D7660","#D7B5A6"],maxColors:40,colorblindSafe:!1,description:"Tableau extended palette, 40 colors"}};class Ds{constructor(t){g(this,"palette");g(this,"valueToColor",new Map);g(this,"nextIndex",0);this.palette=this.resolvePalette(t)}resolvePalette(t){var n;if(!t)return((n=Nn.pivotick)==null?void 0:n.colors)??Object.values(Nn)[0].colors;if(Array.isArray(t)){if(t.length===0)throw new Error("Custom palette array cannot be empty.");return t}const e=Nn[t];if(!e)throw new Error(`Palette "${t}" not found in PALETTE_REGISTRY.`);return e.colors}getColor(t){if(t==null)return this.palette[0];const e=this.valueToColor.get(t);if(e)return e;const n=this.palette[this.nextIndex%this.palette.length];return this.valueToColor.set(t,n),this.nextIndex++,n}reset(){this.valueToColor.clear(),this.nextIndex=0}getMapping(){return new Map(this.valueToColor)}}ft.Node=yt,ft.Edge=bt,ft.ColorPaletteMapper=Ds;const Fs=1e4,yi=2e4,bi=.15*yi;self.onmessage=i=>{var m,b,y,w;if(i.data.source!=="simulation-worker-wrapper")return;const{nodes:t,edges:e,options:n,canvasBCR:r}=i.data,s=t.map(M=>{const C=new yt(M.id,M.data,M.style);return C.setCircleRadius(M._circleRadius??10),C}),o=new Map(s.map(M=>[M.id,M]));(m=n.layout)==null||m.type;const{simulation:a,simulationForces:c}=$t.initSimulationForces(n,r),l=[];for(const M of e){const C=o.get(M.from.id),N=o.get(M.to.id);if(C&&N){const P=M.style??{};l.push(new bt(M.id,C,N,M.data,P,M.directed))}}a.nodes(s);const h=a.force("link");h&&h.id(M=>M.id).links(l),(((b=n.layout)==null?void 0:b.type)==="tree"||((y=n.layout)==null?void 0:y.type)==="egoTree")&<.registerForcesOnSimulation(s,l,a,c,n.layout,r,lt);let d=n.warmupTicks||yi;d=d==="auto"?yi:d,d=d-bi;let u=.3;a.alphaTarget(u);const p=new Date().getTime();let f;for(let M=0;MFs||new Date().getTime()-p>n.cooldownTime||wi(n,a,u)&&new Date().getTime()-p>n.cooldownTime*.15);++M)M%5===0&&(f=zs(M,new Date().getTime()-p,n),postMessage({type:"tick",progress:f,elapsedTime:new Date().getTime()-p})),a.tick();u=0,a.alphaTarget(u),a.alpha(1);for(let M=0;Mn.cooldownTime*.15);++M)a.tick(),M%5===0&&(f=zs(d+M,new Date().getTime()-p,n),postMessage({type:"tick",progress:f,elapsedTime:new Date().getTime()-p}));postMessage({type:"tick",progress:1,elapsedTime:new Date().getTime()-p}),((w=n.layout)==null?void 0:w.type)==="tree"&<.simulationDone(s,l,a,n.layout),postMessage({type:"done",nodes:s.map(M=>M.toDict()),edges:l.map(M=>M.toDict())})};function mf(i,t,e,n){var p,f,m,b;const r=i.map(y=>{const w=new yt(y.id,y.getData(),y.getStyle());return w.weight=y.weight||1,w.setCircleRadius(y.getCircleRadius()),w}),s=new Map(r.map(y=>[y.id,y]));(p=e.layout)==null||p.type;const{simulation:o,simulationForces:a}=$t.initSimulationForces(e,n),c=[];for(const y of t){const w=s.get(y.from.id),M=s.get(y.to.id);if(w&&M){const C=y.getStyle()??{};c.push(new bt(y.id,w,M,y.getData(),C,y.directed))}}o.nodes(r);const l=o.force("link");l&&l.id(y=>y.id).links(c),(((f=e.layout)==null?void 0:f.type)==="tree"||((m=e.layout)==null?void 0:m.type)==="egoTree")&<.registerForcesOnSimulation(r,c,o,a,e.layout,n,lt);let h;e.warmupTicks==="auto"||e.warmupTicks==null?h=yi:h=e.warmupTicks,h=h-bi;let d=.3;o.alphaTarget(d);const u=new Date().getTime();for(let y=0;yFs||new Date().getTime()-u>e.cooldownTime||wi(e,o,d)&&new Date().getTime()-u>e.cooldownTime*.15);++y)o.tick();d=0,o.alphaTarget(d),o.alpha(1);for(let y=0;ye.cooldownTime*.15);++y)o.tick();return((b=e.layout)==null?void 0:b.type)==="tree"&<.simulationDone(r,c,o,e.layout),{nodes:r,edges:c}}function zs(i,t,e){return t/e.cooldownTime}function wi(i,t,e){return i.d3AlphaMin>0&&t.alpha()-e
{% endif %}
{{ meta['protocol']['id'] }}
+ {% if meta['network'] or meta['address'] %}
+ {% if meta['network'] %}{{ meta['network'] }} {% endif %}{% if meta['address'] %}{{ meta['address'] }} {% endif %}
+
{% endif %}