@preventive/triage 1.0.0-alpha.12 → 1.0.0-alpha.13
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/out/graph.js +5 -5
- package/out/view.css +1 -1
- package/out/view.js +107 -87
- package/package.json +1 -1
package/out/graph.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var _t=globalThis[Symbol.for("@rray/frontend")];if(!_t)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:Lt,html:j,nothing:eo,unsafeCSS:ct,render:Ue,StateElement:ko,classMap:Pe,repeat:Ft,styleMap:Qe}=_t;var At=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{display:grid;grid-template-columns:1fr 300px;grid-template-rows:auto 1fr;grid-template-areas:"topbar right" "stage right";min-height:0;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:var(--graph-canvas-bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,sans-serif;font-size:12px}.graph2-layout{display:contents}.graph2-topbar{grid-area:topbar;display:flex;flex-direction:column;gap:.5rem;padding:.6rem .75rem;font-size:.825rem;background:var(--surface);backdrop-filter:var(--glass-blur);border-bottom:1px solid var(--graph-divider)}.graph2-topbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;padding:0}.graph2-topbar .g2-spacer{flex:1}.graph2-topbar triage-selector{margin-left:auto}.g2-icon-btn{width:28px;height:28px;border-radius:5px;background:var(--graph-hover-bg);border:1px solid var(--border);color:var(--muted);display:grid;place-items:center;font-family:inherit;&:hover{color:var(--accent);border-color:var(--accent)}& svg{display:block}}.g2-path-filter-wrap{position:relative;flex:0 0 14rem;padding-right:22px}.g2-path-filter-wrap .g2-path-filter-clear{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:18px;height:18px;background:transparent;border:0;border-radius:50%;color:var(--muted);font:400 10px/1 inherit;font-family:inherit;&:hover{color:var(--text);background:var(--surface-active)}}.g2-path-filter:placeholder-shown~.g2-path-filter-clear{display:none}.g2-topbar-toggle{display:inline-flex;align-items:center;height:30px;box-sizing:border-box;gap:8px;padding:5px 10px;background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:6px;color:var(--muted);font:500 11px/1 inherit;font-family:inherit;white-space:nowrap;&:hover{color:var(--text)}&.on{color:var(--text)}&.on .g2-switch{background:color-mix(in srgb,var(--accent) 22%,transparent)}&.on .g2-switch:after{transform:translate(12px);background:var(--accent)}}.g2-trash-btn.on{background:color-mix(in srgb,var(--accent) 16%,transparent);border-color:var(--accent);color:var(--accent)}.graph2-right{grid-area:right;border-left:1px solid var(--graph-divider);background:var(--surface);backdrop-filter:var(--glass-blur);display:flex;flex-direction:column;overflow:hidden;padding:14px}.g2-panel-title{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);opacity:.85;margin:14px 0 8px;display:flex;align-items:baseline;gap:6px;&:first-child{margin-top:0}}.g2-count{color:var(--muted);opacity:.6;font-weight:400;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;text-transform:none;letter-spacing:0;font-size:10px}.g2-panel-title-row{justify-content:space-between;gap:8px}#g2-top-pkgs-block{margin-top:14px;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.g2-mini-tabs{display:flex;gap:1px;background:var(--graph-divider);border-radius:4px;overflow:hidden}.g2-mini-tab{background:transparent;border:0;color:var(--muted);font-family:inherit;font-weight:500;font-size:11px;line-height:1.4;text-transform:none;letter-spacing:0;padding:2px 7px;&:hover{color:var(--text);background:var(--graph-hover-bg)}&.on{background:var(--surface-active);color:var(--accent)}}.g2-switch{width:26px;height:14px;background:var(--border);border-radius:8px;position:relative;transition:background .15s;flex-shrink:0;&:after{content:"";position:absolute;top:2px;left:2px;width:10px;height:10px;border-radius:50%;background:var(--muted);transition:transform .15s,background .15s}}.graph2-stage{grid-area:stage;position:relative;background:var(--graph-canvas-bg);overflow:hidden;cursor:grab;&:active{cursor:grabbing}& canvas{position:absolute;inset:0;width:100%;height:100%;display:block}}.g2-stage-overlay{position:absolute;top:12px;left:12px;z-index:3;display:flex;flex-direction:column;gap:4px;pointer-events:none;max-width:calc(100% - 60px)}.g2-stage-overlay>*{pointer-events:auto}.g2-stage-stats{position:absolute;bottom:10px;left:12px;z-index:2;display:flex;flex-wrap:wrap;gap:2px 14px;font:500 10px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--muted);opacity:.7;text-transform:uppercase;letter-spacing:.06em;pointer-events:none;max-width:calc(100% - 80px);& b{font-weight:600;color:var(--text);opacity:1}}.g2-stage-overlay-tr{position:absolute;top:12px;right:12px;z-index:3;pointer-events:auto}.g2-focus-pkg-btn{width:28px;height:28px;display:grid;place-items:center;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);box-shadow:var(--shadow-glass);&:hover{border-color:var(--accent);background:var(--surface-active)}& svg{display:block}}.g2-back-btn{display:inline-flex;align-items:center;gap:4px;padding:6px 11px;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);font:500 11px/1 inherit;font-family:inherit;box-shadow:var(--shadow-glass);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-self:flex-start;&:hover{border-color:var(--accent);background:var(--surface-active)}}.g2-zoom-ctrl{position:absolute;right:12px;bottom:12px;display:flex;flex-direction:column;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;overflow:hidden;z-index:3;box-shadow:var(--shadow-glass);& button{width:28px;height:28px;background:transparent;border:0;color:var(--muted);border-bottom:1px solid var(--graph-divider);display:grid;place-items:center;font-family:inherit;font-size:13px;&:last-child{border-bottom:0}&:hover{color:var(--accent);background:var(--surface-active)}}}.g2-zoom-pct{font:500 9px/1 ui-monospace,monospace;color:var(--muted);padding:5px 0;text-align:center;border-bottom:1px solid var(--graph-divider)}.g2-zoom-ctrl .g2-zoom-fit-btn{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:9px;line-height:1;letter-spacing:-.02em;text-transform:lowercase}.g2-tooltip{position:absolute;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:7px;padding:9px 11px;pointer-events:none;min-width:170px;max-width:260px;opacity:0;transition:opacity .12s;z-index:10;box-shadow:var(--shadow-glass);&.show{opacity:1}}.g2-tt-path{font:500 11px/1.3 ui-monospace,monospace;color:var(--text);word-break:break-all;margin-bottom:4px}.g2-tt-head{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.g2-tt-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-tt-pkg{font-size:10px;color:var(--muted);word-break:break-all}.g2-tt-badge{display:inline-block;font-size:8px;padding:2px 4px;background:color-mix(in srgb,var(--accent) 22%,transparent);color:var(--accent);border-radius:3px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}.g2-tooltip .tree-count-chips{margin-top:6px}:host-context(body.theme-light) .graph2-right .tree-count-chip.medium,:host-context(body.theme-light) .g2-tooltip .tree-count-chip.medium{color:#fff}.g2-selection-card{background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:8px;overflow:hidden}.g2-sel-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;align-items:center;gap:8px}.g2-sel-file-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;flex-direction:column;gap:6px}.g2-sel-path{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:12px;line-height:1.3;color:var(--text);word-break:break-all}.g2-sel-pkg-row{display:flex;align-items:center;gap:6px;min-width:0}.g2-sel-pkg{font-size:11px;color:var(--muted);word-break:break-all;min-width:0}.g2-sel-fullpath{padding:7px 13px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-sel-size{padding:5px 13px 7px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);font-variant-numeric:tabular-nums}.g2-sel-dot{width:11px;height:11px;border-radius:50%;box-shadow:0 0 0 3px color-mix(in srgb,var(--dot) 22%,transparent);flex-shrink:0}.g2-sel-id{font:600 12px/1 ui-monospace,monospace;color:var(--text);word-break:break-all;flex:1;min-width:0}.g2-sel-grp{font:500 9px/1 ui-monospace,monospace;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;flex-shrink:0}.g2-sel-body{padding:11px 13px}.g2-sel-row{display:flex;justify-content:space-between;gap:12px;font-size:11px;padding:5px 0;border-bottom:1px solid var(--graph-divider);&:last-child{border-bottom:0}.k{color:var(--muted);flex-shrink:0}.v{color:var(--text);font-family:ui-monospace,monospace;word-break:break-all;text-align:right;min-width:0}}.g2-sel-section{padding:9px 13px;border-top:1px solid var(--graph-divider)}.g2-sel-section-label{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);opacity:.85;margin-bottom:5px}.g2-sel-section-empty{color:var(--muted);opacity:.55;font-size:11px;font-style:italic}.g2-sel-jumps{padding:11px 13px;display:flex;gap:5px;flex-wrap:wrap;border-top:1px solid var(--graph-divider)}.g2-sel-jump{background:var(--surface-active);border:1px solid var(--border);color:var(--accent);border-radius:4px;padding:2px 8px;font-family:inherit;font-weight:500;font-size:11px;line-height:1.3;&:hover{border-color:var(--accent)}}.g2-sel-file-list{list-style:none;margin:0;padding:0;max-height:110px;overflow:hidden auto;-webkit-app-region:no-drag;app-region:no-drag;&::-webkit-scrollbar{width:4px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}& li{padding:0}}.g2-sel-file-link{display:flex;align-items:center;gap:6px;width:100%;background:transparent;border:0;border-radius:3px;padding:3px 6px;font:400 11px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--accent);text-align:left;&:hover{background:var(--graph-hover-bg)}.g2-sel-file-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.g2-sel-file-path{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.g2-empty-state{background:var(--graph-hover-bg);border:1px dashed var(--border);border-radius:8px;padding:18px 14px;text-align:center;color:var(--muted);font-size:11px;line-height:1.5;& strong{color:var(--text);display:block;margin-bottom:4px;font-weight:500}}.g2-dist-bar{width:100%;height:5px;border-radius:3px;overflow:hidden;display:flex;background:var(--surface-active);margin-bottom:8px;>span{display:block;height:100%}}.g2-dist-list{display:flex;flex-direction:column;gap:2px;flex:1 1 0;min-height:0;overflow-y:auto;overscroll-behavior:none;-webkit-app-region:no-drag;app-region:no-drag;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:5px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.g2-dist-empty{color:var(--muted);opacity:.55;font-size:10px;font-style:italic;padding:6px 0;text-align:center}.g2-dist-item{display:grid;grid-template-columns:8px 1fr auto auto;gap:8px;align-items:center;font-size:10px;padding:4px 6px;margin:0 -6px;background:transparent;border:0;border-radius:4px;font-family:inherit;text-align:left;width:calc(100% + 12px);&:hover{background:var(--graph-hover-bg)}&.on{background:var(--surface-active);.g2-dist-name{color:var(--accent)}}.g2-dist-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-dist-name{color:var(--muted);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-dist-count{font-family:ui-monospace,monospace;color:var(--text)}.g2-dist-pct{font-family:ui-monospace,monospace;color:var(--muted);width:36px;text-align:right;opacity:.85}}@media print{:host{display:none!important}}
|
|
2
|
-
`;var
|
|
3
|
-
`;var Ht=`.toolbar{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;padding:.6rem .75rem;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;box-shadow:var(--shadow-glass);font-size:.825rem;& label{color:var(--muted);margin-right:.15rem}& select{height:30px;box-sizing:border-box;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .4rem;font-size:.8rem;&:focus{border-color:var(--accent);outline:none}}& select.sort-select{padding:.3rem 1.7rem .3rem .55rem;min-width:8.5rem;font-weight:500;appearance:none;-webkit-appearance:none;background:transparent}:is(repo-filter,findings-sort){position:relative;display:inline-block;&:after{content:"";position:absolute;right:.7rem;top:50%;width:.35rem;height:.35rem;border-right:1.5px solid var(--muted);border-bottom:1.5px solid var(--muted);transform:translateY(-70%) rotate(45deg);pointer-events:none}}& analyzer-select{position:relative;display:inline-block}.analyzer-btn{display:inline-flex;align-items:center;gap:.45rem;height:30px;box-sizing:border-box;padding:.3rem .55rem;min-width:8.5rem;background:transparent;color:var(--text);border:1px solid var(--border);border-radius:4px;font-family:inherit;font-size:.8rem;font-weight:500;&:hover{border-color:var(--accent)}&:focus-visible{border-color:var(--accent);outline:none}&.active{color:var(--accent)}.analyzer-btn-label{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:18rem}& svg{color:var(--muted);flex-shrink:0}}& range-slider{color:var(--accent);margin:0 .25rem}.conf-vals{color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-variant-numeric:tabular-nums;.dash{color:var(--muted);margin:0 .15rem}}& conf-filter{display:inline-flex;align-items:center;height:30px;box-sizing:border-box;padding:0 .55rem;gap:.5rem;background:transparent;border:1px solid var(--border);border-radius:4px;.conf-range-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}& range-slider{margin:0}}& input[type=text]{background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .4rem;font-size:.8rem;flex:1;min-width:8rem;&:focus{border-color:var(--accent);outline:none}}.sep{border-left:1px solid var(--border);height:1.2rem}.result-count{color:var(--muted);margin-left:auto}.checkbox-label{display:inline-flex;align-items:center;gap:.25rem;color:var(--muted);& input{margin:0}}}.analyzer-menu[popover]{position:fixed;inset:auto;margin:0;align-items:stretch;gap:.35rem;padding:.3rem;background:var(--bg);border:1px solid var(--border);border-radius:6px;box-shadow:0 4px 12px #00000040;font-size:.825rem;-webkit-app-region:no-drag;app-region:no-drag}.analyzer-menu[popover]:not(:popover-open){display:none}.analyzer-menu[popover]:popover-open{display:flex}.analyzer-menu-sep{border-left:1px solid var(--border)}.analyzer-menu-col{display:flex;flex-direction:column;gap:1px;min-width:9rem;max-height:60vh;overflow-y:auto}.analyzer-menu-head{padding:.25rem .5rem .2rem;color:var(--muted);font-size:.68rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.analyzer-menu-item{display:flex;align-items:center;gap:.45rem;background:transparent;border:0;border-radius:3px;padding:.3rem .5rem;color:var(--text);text-align:left;font-family:inherit;font-size:.78rem;&:before{content:"";width:.8rem;flex-shrink:0}&.active:before{content:"\\2713";color:var(--accent)}&:hover{background:var(--surface)}&.zero{opacity:.45}.analyzer-menu-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:16rem}.analyzer-menu-count{color:var(--muted);font-size:.7rem;font-weight:600;font-variant-numeric:tabular-nums}}.trash-btn{height:30px;box-sizing:border-box;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .55rem;font-size:.8rem;font-family:inherit;&:hover{border-color:var(--accent)}&.active{border-color:var(--critical);color:var(--critical)}}.toolbar .trash-btn{margin-left:auto}triage-selector,slide-triage-tabs{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.toolbar triage-selector{margin-left:auto}triage-selector.is-empty{display:none}.triage-state-btn{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.8rem;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{background:var(--surface-active)}}.triage-state-btn.active.triage-state-deleted{color:var(--critical)}.triage-state-btn.active.triage-state-fixed{color:var(--green, #4ade80)}.triage-state-btn.active.triage-state-inprogress{color:var(--warning, #d97706)}.triage-state-btn.active.triage-state-invalid{color:var(--muted)}.triage-state-btn.active.triage-state-ignored{color:var(--accent, #2563eb)}entity-search{display:contents}view-mode-buttons{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.view-mode-btn{background:transparent;border:none;color:var(--muted);padding:.28rem .5rem;display:inline-flex;align-items:center;justify-content:center;transition:background .12s,color .12s;font-family:inherit;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}& svg{display:block}}}source-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.source-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}severity-mode-switch{display:inline-flex;align-items:center;gap:.4rem;height:30px;box-sizing:border-box;.severity-mode-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}.severity-mode-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.severity-mode-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;cursor:pointer;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}annotation-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.annotation-chip{position:relative;background:transparent;border:none;color:var(--muted);padding:0 .45rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;cursor:pointer;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.sel-with,&.sel-without{color:var(--accent);background:var(--surface-active)}&.sel-with .flag-cloth{fill:var(--accent)}&.sel-without:after{content:"";position:absolute;left:18%;right:18%;top:50%;height:1.5px;background:currentcolor;border-radius:1px;transform:rotate(-20deg);transform-origin:center;pointer-events:none}& svg{display:block}}}.toolbar-row{display:flex;gap:.75rem;flex-wrap:wrap;align-items:center}.search-row{display:inline-flex;align-items:center;gap:.65rem;flex:1 1 14rem;min-width:12rem}toolbar-search,.toolbar-search{display:inline-flex;align-items:center;gap:.5rem;flex:1;min-width:0;height:30px;box-sizing:border-box;padding:0 .65rem;background:var(--bg);border:1px solid var(--border);border-radius:6px;&:has(input:focus){border-color:var(--accent)}>svg{color:var(--muted);flex-shrink:0}&[kind] input[type=text],&.toolbar-search input[type=text]{flex:1;min-width:0;background:transparent;border:0;outline:none;color:var(--text);font:inherit;font-size:.8rem;padding:0;&:focus{border:0}&::placeholder{color:var(--muted)}&:focus::placeholder{color:transparent}&::-webkit-search-cancel-button{display:none}}}.search-negate-btn{flex-shrink:0;width:20px;height:20px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:3px;padding:0;transition:background .12s,color .12s;& svg{width:13px;height:13px}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .08)}&.active{color:var(--accent);background:rgb(from var(--text) r g b / .1)}}@media(width<=1200px){.toolbar-row.sev-row .search-row{flex-basis:100%}}.findings-content.with-details .toolbar{max-width:1200px}severity-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.sev-chip{display:inline-flex;align-items:center;gap:.4rem;background:transparent;border:0;padding:0 .6rem;color:var(--muted);font-family:inherit;font-size:.8rem;transition:background .12s,color .12s;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}.sd{width:8px;height:8px;border-radius:2px;flex-shrink:0;background:currentcolor}.n{align-self:flex-start;margin:1px -5px 0;color:var(--muted);font-variant-numeric:tabular-nums;font-size:8.5px;font-weight:600;background:var(--bg);border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px}&.active{color:var(--text);.n{color:var(--text)}}&.critical .sd{background:var(--critical)}&.high .sd{background:var(--high)}&.medium .sd{background:var(--medium)}&.low .sd{background:var(--low)}&.high_bug .sd{background:var(--high-bug)}&.bug .sd{background:var(--bug)}&.informational .sd{background:var(--info)}&.critical.active{background:rgb(from var(--critical) r g b / .25)}&.high.active{background:rgb(from var(--high) r g b / .25)}&.medium.active{background:rgb(from var(--medium) r g b / .25)}&.low.active{background:rgb(from var(--low) r g b / .25)}&.high_bug.active{background:rgb(from var(--high-bug) r g b / .25)}&.bug.active{background:rgb(from var(--bug) r g b / .25)}&.informational.active{background:rgb(from var(--info) r g b / .25)}}triage-filter{display:inline-flex;align-items:center;background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:3px;height:30px;gap:1px;& button{width:22px;height:22px;background:transparent;border:0;border-radius:4px;padding:0;display:grid;place-items:center;position:relative;transition:background .12s;&:hover{background:rgb(from var(--text) r g b / .06)}&.active{background:rgb(from var(--text) r g b / .08);box-shadow:0 0 0 1px var(--border)}}.td{width:12px;height:12px;border-radius:50%;border:1.5px solid currentcolor;background:transparent;transition:background .12s}& button.active .td{background:currentcolor}.td.none{border-style:dashed;color:var(--muted)}.td.r{color:#fc5855}.td.b{color:#30aff8}.td.g{color:#68c36d}.td.x{color:#6e7278}.count{position:absolute;top:-2px;right:-2px;background:var(--bg);color:var(--muted);font-size:8.5px;font-weight:600;border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px;font-variant-numeric:tabular-nums}}
|
|
4
|
-
`;var Co=new TextEncoder,
|
|
5
|
-
`).toLowerCase(),isHub:!0,x:0,y:0,deg:0}}),i=new Map(o.map(c=>[c.pkg,c])),l=new Map;for(let c of t.edges){if(!c.cross)continue;let v=t.nodeByFile.get(c.a)?.pkg,$=t.nodeByFile.get(c.b)?.pkg;if(!v||!$||v===$)continue;let[e,z]=v<$?[v,$]:[$,v],_=`${e}\0${z}`,L=l.get(_);L||(L={a:e,b:z,cross:!0,count:0,fromLo:!1,fromHi:!1},l.set(_,L),i.get(e).deg++,i.get(z).deg++),L.count++;let d=v===e;c.fromLo&&(d?L.fromLo=!0:L.fromHi=!0),c.fromHi&&(d?L.fromHi=!0:L.fromLo=!0)}let y=[...l.values()],x=new Map;for(let c=0;c<y.length;c++){let v=y[c];x.has(v.a)||x.set(v.a,[]),x.has(v.b)||x.set(v.b,[]),x.get(v.a).push(c),x.get(v.b).push(c)}let h=new Map(o.map(c=>[c.pkg,[]]));for(let c of y)c.fromLo&&h.get(c.a).push(c.b),c.fromHi&&h.get(c.b).push(c.a);return{nodes:o,byPkg:i,nodeByFile:i,edges:y,adj:x,importsOf:h}}function ft(t,o){if(!o||o==="/"||o==="__own__")return t;for(let i of["node_modules","dependencies",dt()]){let l=i+"/"+o+"/",y=t.indexOf(l);if(y>=0)return t.slice(y+l.length)}return t.startsWith(o+"/")?t.slice(o.length+1):t}function qt(t,o){let i=o.extraTopRow,l=o.hideAllFiles??!1,y=o.triageCounts??{inprogress:0,fixed:0,invalid:0,deleted:0},x=o.triageStates??["inprogress","fixed","invalid","deleted"],h={};for(let u of ke)h[u]=0;for(let u of t.nodes)if(u.severitySet)for(let H of u.severitySet)h[H]!==void 0&&h[H]++;let c=ke.some(u=>h[u]>0||k.selectedSeverities.has(u)),v=["none","red","blue","green","gray"],$={none:0,red:0,blue:0,green:0,gray:0};for(let u of t.nodes)if(u.colorSet)for(let H of u.colorSet)$[H]!==void 0&&$[H]++;let e=v.some(u=>$[u]>0||k.selectedColors.has(u)),z=j`<triage-selector variant="graph" .counts="${y}" .states="${x}"></triage-selector>`,_=l?null:j`<button type="button" class="${Pe({"g2-topbar-toggle":!0,on:k.showAll})}" data-g2-show-all aria-pressed="${String(k.showAll)}"><span>All files</span><span class="g2-switch"></span></button>`,d=o.showSplitOwnDirs??!1?j`<button type="button" class="${Pe({"g2-topbar-toggle":!0,on:k.splitOwnDirs})}" data-g2-split-own aria-pressed="${String(k.splitOwnDirs)}" title="Split your own source into a group per top-level directory (off: one 'own source' group)"><span>Split dirs</span><span class="g2-switch"></span></button>`:null,a=o.showPackagesView??!1?j`<button type="button" class="${Pe({"g2-topbar-toggle":!0,on:k.packagesView})}" data-g2-packages-view aria-pressed="${String(k.packagesView)}" title="Show one node per package with aggregated import edges (off: one node per file)"><span>Packages</span><span class="g2-switch"></span></button>`:null;return j`<div class="graph2-topbar">${i?j`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${i} ${_} ${d} ${a}<div class="g2-spacer"></div>${z}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${c?j`<severity-chips .counts="${h}" .selected="${[...k.selectedSeverities]}" kind="graph"></severity-chips>`:null} ${e?j`<triage-filter .counts="${$}" .selected="${[...k.selectedColors]}" kind="graph"></triage-filter>`:null}<div class="toolbar-search g2-path-filter-wrap"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="text" class="g2-path-filter" id="g2-path-filter" placeholder="filter path/package…" .value="${k.pathFilter}"> <button type="button" class="g2-path-filter-clear" id="g2-path-filter-clear" title="Clear filter" aria-label="Clear filter">✕</button></div>${i?null:_} ${i?null:d} ${i?null:a}<div class="g2-spacer"></div>${i?null:z} <button type="button" class="g2-icon-btn" id="g2-fullscreen" title="Toggle fullscreen">⛶</button></div></div>`}function uo(t,o){let i=t.split("/").filter(Boolean),l=o.split("/").filter(Boolean),y=0;for(;y<i.length&&y<l.length&&i[y]===l[y];)y++;let x=i.length-y,h=l.slice(y).join("/");return x===0?"./"+h:"../".repeat(x)+h}function fo(t,o){if(!o&&o!=="")return t;let i=uo(o,t);return i.length<t.length?i:t}function mt(t,o,i,l){let y=i.length;if(y===0)return j`<div class="g2-sel-section"><div class="g2-sel-section-label">${o} (${y})</div><div class="g2-sel-section-empty">none</div></div>`;let x=i.map(h=>({file:h,display:fo(h,l)}));return x.sort((h,c)=>h.display.localeCompare(c.display)),j`<div class="g2-sel-section"><div class="g2-sel-section-label">${o} (${y})</div><ul class="g2-sel-file-list">${x.map(({file:h,display:c})=>{let v=t.nodeByFile.get(h),$=v?ne(v.pkg):"#666";return j`<li><button type="button" class="g2-sel-file-link" data-g2-select="${h}" title="${h}"><span class="g2-sel-file-dot" style="${Qe({background:$})}"></span> <span class="g2-sel-file-path">${c}</span></button></li>`})}</ul></div>`}function tt(t){if(!t)return j`<div class="g2-sel-section-empty">none</div>`;let i=["critical","high","medium","low","high_bug","bug","informational"].filter(l=>(t[l]??0)>0);return i.length===0?j`<div class="g2-sel-section-empty">none</div>`:j`<div class="tree-count-chips">${i.map(l=>j`<span class="${`tree-count-chip ${l}`}">${t[l]} ${l.replaceAll("_"," ")}</span>`)}</div>`}function jt(t){let o=0;for(let h of t.edges)h.cross&&o++;let i=t.edges.length-o,l=0;for(let h of t.nodes)l+=h.totalIssues;let y=t.nodes.length===0?"0.0":(t.edges.length*2/t.nodes.length).toFixed(1),x=k.focusedPkg==="__own__"?"own source":k.focusedPkg;return j`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${k.focusedPkg?j`<div class="g2-stage-overlay"><button type="button" class="g2-back-btn" id="g2-back-to-full" title="Back to the full graph">← ${x}</button></div>`:null}<div id="g2-focus-overlay-slot" class="g2-stage-overlay-tr"></div><div class="g2-stage-stats"><span><b>${t.nodes.length}</b> files</span> <span><b>${t.packages.length}</b> packages</span> <span><b>${t.edges.length}</b> edges (${i} intra · ${o} cross)</span> <span><b>${l}</b> issues</span> <span>avg degree <b>${y}</b></span></div><div class="g2-zoom-ctrl"><button id="g2-zoom-in" title="Zoom in">+</button><div class="g2-zoom-pct" id="g2-zoom-pct">100%</div><button id="g2-zoom-out" title="Zoom out">−</button> <button id="g2-zoom-fit" class="g2-zoom-fit-btn" title="Fit to view">fit</button></div><div class="g2-tooltip" id="g2-tooltip"></div></main>`}function Vt(t){let o=null;if(k.selected){let l=t.nodeByFile.get(k.selected);l&&(o=l.pkg)}else k.solo&&(o=k.solo);return!o||(t.pkgCount.get(o)??0)<=1||k.focusedPkg===o?null:j`<button type="button" class="g2-focus-pkg-btn" data-g2-focus-pkg="${o}" title="${`Focus on ${o==="__own__"?"own source":o}'s graph`}"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 4.6 L4 11 M8 4.6 L12 11 M5 11.4 L11 11.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/><circle cx="8" cy="3.6" r="2" fill="currentColor"/><circle cx="3.6" cy="11.4" r="2" fill="currentColor"/><circle cx="12.4" cy="11.4" r="2" fill="currentColor"/></svg></button>`}function Ut(){return j`<aside class="graph2-right"><div class="g2-panel-title">Selection</div><div id="g2-selection-area"></div><div id="g2-top-pkgs-block"></div></aside>`}function Gt(t){let o=k.showAll&&t.nodes.length>0&&t.nodes.every(y=>typeof y.size=="number"),i=t.nodes.some(y=>y.totalIssues>0),l=k.topPkgsTab;return l==="size"&&!o&&(l="files"),l==="issues"&&!i&&(l="files"),j`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${i?j`<button type="button" class="${Pe({"g2-mini-tab":!0,on:l==="issues"})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${Pe({"g2-mini-tab":!0,on:l==="files"})}" data-g2-top-pkgs="files">Files</button> ${o?j`<button type="button" class="${Pe({"g2-mini-tab":!0,on:l==="size"})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${ho(t,l)}`}function Wt(t,o={}){let i=k.selected;if(i){let l=t.nodeByFile.get(i);return l?po(t,l,i,o):j`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return k.solo?go(t,k.solo):j`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function po(t,o,i,l){let y=ne(o.pkg),x=o.pkg==="__own__"?"own source":o.pkg,h=ft(i,o.pkg),c=t.importedBy.get(i)??[],v=t.importsOf.get(i)??[],$=i.lastIndexOf("/"),e=$>=0?i.slice(0,$):"";return j`<div class="g2-selection-card"><div class="g2-sel-file-head"><div class="g2-sel-path">${h}</div><div class="g2-sel-pkg-row"><span class="g2-sel-dot" style="${Qe({"--dot":y,background:y})}"></span> <span class="g2-sel-pkg">${x}</span></div></div><div class="g2-sel-fullpath" title="${i}">${i}</div>${et(o.size)?j`<div class="g2-sel-size">${et(o.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${tt(o.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${tt(o.subtree)}</div><div class="g2-sel-jumps">${o.totalIssues>0?j`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${i}">Findings →</button>`:null} ${l.isBundleContext?o.origFile?j`<button type="button" class="g2-sel-jump" data-bundle-view-source="${o.origFile}">View source →</button>`:null:j`<button type="button" class="g2-sel-jump" data-g2-jump-file="${i}">Files →</button>`}</div>${mt(t,"Imported by",c,e)} ${mt(t,"Imports",v,e)}</div>`}function go(t,o){let i=t.nodes.filter(z=>z.pkg===o),l=i.length;if(l===0)return j`<div class="g2-empty-state"><strong>Package has no files in view</strong> Toggle "All files" to widen the file set, or pick another package.</div>`;let y=ne(o),x=o==="__own__"?"own source":o,h={};for(let z of ke)h[z]=0;for(let z of i)if(z.own)for(let _ of ke)h[_]+=z.own[_]??0;let c=0,v=0;for(let z of t.edges){let _=t.nodeByFile.get(z.a),L=t.nodeByFile.get(z.b);!_||!L||(_.pkg===o&&L.pkg===o?v++:(_.pkg===o||L.pkg===o)&&c++)}let $=0;for(let z of i)z.isHub&&$++;let e=new Set;for(let z of i)for(let _ of t.importedBy.get(z.file)??[]){let L=t.nodeByFile.get(_);L&&L.pkg!==o&&e.add(_)}return j`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${Qe({"--dot":y,background:y})}"></span> <span class="g2-sel-id">${x}</span> <span class="g2-sel-grp">package</span></div><div class="g2-sel-body"><div class="g2-sel-row"><span class="k">Files</span><span class="v">${l}</span></div><div class="g2-sel-row"><span class="k">Hubs</span><span class="v">${$}</span></div><div class="g2-sel-row"><span class="k">Intra edges</span><span class="v">${v}</span></div><div class="g2-sel-row"><span class="k">Cross edges</span><span class="v">${c}</span></div></div><div class="g2-sel-section"><div class="g2-sel-section-label">Findings</div>${tt(h)}</div>${mt(t,"Imported by",[...e])}</div>`}function ho(t,o){let i=t.nodes.length||1,l=o??k.topPkgsTab,y=k.selectedSeverities,x=k.selectedColors,h=y.size>0,c=x.size>0,v=h||c,$=new Map,e=new Map,z=0,_=0;for(let a of t.nodes){let u;if(v){if(u=0,a.findings)for(let H of a.findings)h&&!y.has(H.severity)||c&&!x.has(H.color)||u++}else u=a.totalIssues;$.set(a.pkg,($.get(a.pkg)??0)+u),z+=u,typeof a.size=="number"&&(e.set(a.pkg,(e.get(a.pkg)??0)+a.size),_+=a.size)}let L;l==="issues"?L=t.packages.filter(a=>($.get(a)??0)>0).toSorted((a,u)=>{let H=$.get(a)??0,A=$.get(u)??0;return A!==H?A-H:(t.pkgCount.get(u)??0)-(t.pkgCount.get(a)??0)}):l==="size"?L=t.packages.filter(a=>(e.get(a)??0)>0).toSorted((a,u)=>{let H=e.get(a)??0,A=e.get(u)??0;return A!==H?A-H:(t.pkgCount.get(u)??0)-(t.pkgCount.get(a)??0)}):L=[...t.packages].toSorted((a,u)=>{let H=t.pkgCount.get(a)??0,A=t.pkgCount.get(u)??0;return A!==H?A-H:($.get(u)??0)-($.get(a)??0)});let d=a=>l==="issues"?z>0?(($.get(a)??0)/z*100).toFixed(2):"0":l==="size"?_>0?((e.get(a)??0)/_*100).toFixed(2):"0":(t.pkgCount.get(a)/i*100).toFixed(2),N=l==="issues"?"No packages with issues":l==="size"?"No packages with size":"No packages";return j`<div class="g2-dist-bar">${t.packages.map(a=>{let u=ne(a);return j`<span style="${Qe({background:u,width:`${d(a)}%`})}"></span>`})}</div><div class="g2-dist-list">${L.length===0?j`<div class="g2-dist-empty">${N}</div>`:null} ${Ft(L,a=>a,a=>{let u=ne(a),H=t.pkgCount.get(a)??0,A=$.get(a)??0,W=e.get(a)??0,g=l==="issues"?A:l==="size"?et(W):H,R=l==="issues"?z>0?(A/z*100).toFixed(1):"0.0":l==="size"?_>0?(W/_*100).toFixed(1):"0.0":(H/i*100).toFixed(1),Y=a==="__own__"?"own source":a,ee=k.solo===a;return j`<button type="button" class="${Pe({"g2-dist-item":!0,on:ee})}" data-g2-pkg="${a}" title="${Y}"><span class="g2-dist-dot" style="${Qe({background:u})}"></span><span class="g2-dist-name">${Y}</span><span class="g2-dist-count">${g}</span><span class="g2-dist-pct">${R}%</span></button>`})}</div>`}var xt=class extends Lt{static properties={graph:{attribute:!1},options:{attribute:!1}};static styles=[ct(Ht),ct(It),ct(At)];constructor(){super(),this.graph=null,this.options={}}render(){return this.graph?j`<div class="graph2-layout">${qt(this.graph,this.options)} ${jt(this.graph)} ${Ut()}</div>`:j``}};customElements.define("graph-layout",xt);function bo(t){let o=new Map;for(let[i,l]of t.importsOf){let y=t.nodeByFile.get(i);if(y)for(let x of l){let h=t.nodeByFile.get(x);h&&y.pkg!==h.pkg&&(o.set(y.pkg,(o.get(y.pkg)??0)+1),o.set(h.pkg,(o.get(h.pkg)??0)+1))}}return o}function mo(t){if(t.packages.length===0)return null;let o=new Set;for(let[i,l]of t.importedBy){let y=t.nodeByFile.get(i);if(y)for(let x of l){let h=t.nodeByFile.get(x);if(h&&h.pkg!==y.pkg){o.add(y.pkg);break}}}for(let i of t.packages)if(!o.has(i))return i;return null}var xo=5;function Yt(t,o){let i=new Map;for(let x of t.nodes)o.has(x.pkg)&&(i.has(x.pkg)||i.set(x.pkg,[]),i.get(x.pkg).push(x));for(let x of i.values())x.sort((h,c)=>h.isHub!==c.isHub?h.isHub?-1:1:c.deg-h.deg);let l=new Map,y=new Map;for(let[x,h]of o){let c=i.get(x);if(!c||c.length===0)continue;let v=c.length,$=0;for(let u of c)if(u.isHub)$++;else break;let e=$>0&&$<=xo,z=e?$:0,_=v-z,L=h.groupR,d=Array.from({length:v}),N=Array.from({length:v});for(let u=0;u<v;u++){let H=u*137.508*Math.PI/180,A;if(u<z)A=z<=1?0:Math.sqrt(u/(z-1))*.3*L;else{let W=u-z;A=_<=1?.4*L:(.4+Math.sqrt(W/(_-1))*.6)*L}d[u]=h.x+Math.cos(H)*A,N[u]=h.y+Math.sin(H)*A}let a=Array.from({length:v},()=>!1);for(let u=0;u<v;u++){let H=c[u],A,W;e&&H.isHub?(W=0,A=z):e?(W=z,A=v):(W=0,A=v);let g=0,R=0,Y=0,ee=t.importsOf.get(H.file);if(ee)for(let T of ee){let I=l.get(T);I!==void 0&&(g+=I,R+=y.get(T),Y++)}let E=t.importedBy.get(H.file);if(E)for(let T of E){let I=l.get(T);I!==void 0&&(g+=I,R+=y.get(T),Y++)}let J=!1;if(Y>0){g/=Y,R/=Y;let T=g-h.x,I=R-h.y;T*T+I*I>1&&(J=!0)}let B=-1;if(J){let T=1/0;for(let I=W;I<A;I++){if(a[I])continue;let f=d[I]-g,F=N[I]-R,G=f*f+F*F;G<T&&(T=G,B=I)}}else for(let T=W;T<A;T++)if(!a[T]){B=T;break}a[B]=!0,H.x=d[B],H.y=N[B],l.set(H.file,H.x),y.set(H.file,H.y)}}}function Kt(t,o,i){let l=o/2,y=i/2,x=Math.min(o,i)/2;if(t.packages.length===0)return;let c=mo(t),v=bo(t),$=(c?t.packages.filter(f=>f!==c):[...t.packages]).toSorted((f,F)=>{let G=(v.get(F)??0)-(v.get(f)??0);return G!==0?G:(t.pkgCount.get(F)??0)-(t.pkgCount.get(f)??0)}),e=$.length,z;e<=0?z=0:e<=6?z=.65:e<=20?z=.82:z=.95;let _=Math.max(1,Math.sqrt(50/Math.max(1,e))),L=.22,d=.12,N=.04,a=new Map,u;if(c){let f=t.pkgCount.get(c)??0,F=Math.min(L,(.012+Math.sqrt(f)*.004)*_);u=Math.max(e<=6?.4:e<=20?.36:.34,F+d+N),a.set(c,{x:l,y,size:f,groupR:F*x})}else e<=1?u=0:e<=6?u=.4:e<=20?u=.32:u=.3;if(e===0){Yt(t,a);return}let H=new Map;for(let f of t.edges){if(!f.cross)continue;let F=t.nodeByFile.get(f.a)?.pkg,G=t.nodeByFile.get(f.b)?.pkg;if(!F||!G||F===G)continue;H.has(F)||H.set(F,new Map),H.has(G)||H.set(G,new Map);let te=H.get(F),re=H.get(G);te.set(G,(te.get(G)??0)+1),re.set(F,(re.get(F)??0)+1)}let A=Math.max(1,Math.min(10,Math.round(Math.sqrt(e)/1.2))),W=Array.from({length:A+1});for(let f=0;f<=A;f++)W[f]=Math.floor(f*f/(A*A)*e);W[A]=e;let g=.2,R=Array.from({length:A}),Y=Array.from({length:A});for(let f=0;f<A;f++){let F=W[f],G=W[f+1];R[f]=G-F;let te=0;for(let re=F;re<G;re++)te+=t.pkgCount.get($[re])??0;Y[f]=te}let ee=Array.from({length:A});for(let f=0;f<A;f++){let F=(W[f]+W[f+1]-1)/2/Math.max(1,e-1);ee[f]=Math.sqrt(Math.max(0,F))}let E=Array.from({length:A});E[0]=ee[0];for(let f=1;f<A;f++){let F=R[f-1],G=Y[f-1],te=F>0?G/F:1,re=1+g*Math.sqrt(Math.max(0,te-1));E[f]=E[f-1]+(ee[f]-ee[f-1])*re}let J=Array.from({length:A});for(let f=0;f<A;f++)J[f]=E[f]-ee[f];let B=Array.from({length:e}),T=Array.from({length:e}),I=0;for(let f=0;f<e;f++){for(;I<A-1&&f>=W[I+1];)I++;let F=f*137.508%360*Math.PI/180,te=(e<=1?0:Math.sqrt(f/(e-1)))+J[I],re=e===1?c?u:0:u+te*(z-u);B[f]=l+Math.cos(F)*re*x,T[f]=y+Math.sin(F)*re*x}for(let f=0;f<A;f++){let F=W[f],G=W[f+1],te=G-F;if(te===0)continue;let re=Array.from({length:te},()=>!1);for(let _e=F;_e<G;_e++){let Le=$[_e],ue=H.get(Le),Ge=0,We=0,Ye=0;if(ue)for(let[fe,se]of ue){let me=a.get(fe);me&&(Ge+=me.x*se,We+=me.y*se,Ye+=se)}let we=!1;if(Ye>0){Ge/=Ye,We/=Ye;let fe=Ge-l,se=We-y;fe*fe+se*se>1&&(we=!0)}let Ke=-1;if(we){let fe=1/0;for(let se=0;se<te;se++){if(re[se])continue;let me=F+se,ze=B[me]-Ge,Xe=T[me]-We,nt=ze*ze+Xe*Xe;nt<fe&&(fe=nt,Ke=se)}}else for(let fe=0;fe<te;fe++)if(!re[fe]){Ke=fe;break}re[Ke]=!0;let ot=F+Ke,st=t.pkgCount.get(Le)??0,pt=Math.min(d,(.012+Math.sqrt(st)*.004)*_);a.set(Le,{x:B[ot],y:T[ot],size:st,groupR:pt*x})}}Yt(t,a)}function vt(t,o,i){let l=o/2,y=i/2,x=Math.min(o,i)/2,h=t.nodes.length;if(h===0)return;let c=[...t.nodes].toSorted((v,$)=>$.deg-v.deg);for(let v=0;v<h;v++){let $=c[v],e=v*137.508%360*Math.PI/180,z=h<=1?0:Math.sqrt(v/(h-1));$.x=l+Math.cos(e)*z*.85*x,$.y=y+Math.sin(e)*z*.85*x}}function yt(t,o,i,l,{groupOf:y=ut}={}){let x=t.length,h=l||760,c=i||1100,v=Math.sqrt(c*h/Math.max(x,1))*1.1,$=g=>{let R=0;for(let Y of g)R=R*31+Y.codePointAt(0)|0;return R},e=Math.ceil(Math.sqrt(x*c/h)),z=Math.ceil(x/e),_=h/(z+1),L=c/(e+1),d=t.map((g,R)=>{let Y=R%e,ee=Math.floor(R/e),E=$(g);return{file:g,x:(Y+1)*L+(E%100-50)*L*.4,y:(ee+1)*_+((E>>7)%100-50)*_*.4,dx:0,dy:0}}),N=new Map(d.map((g,R)=>[g.file,R])),a=[];for(let g of t)for(let R of o.get(g)??[])N.has(R)&&a.push([N.get(g),N.get(R)]);let u=new Map;for(let g=0;g<x;g++){let R=y(d[g].file)??"__own__";u.has(R)||u.set(R,[]),u.get(R).push(g)}let H=Math.min(500,Math.max(180,100+x*3)),A=Math.min(c,h)/6,W=.3;for(let g=0;g<H;g++){let R=A*Math.pow(W/A,g/H);for(let E of d)E.dx=0,E.dy=0;for(let E=0;E<x;E++)for(let J=E+1;J<x;J++){let B=d[E],T=d[J],I=B.x-T.x,f=B.y-T.y,F=Math.sqrt(I*I+f*f);if(F<.01){let te=$(B.file+T.file);I=(te%100-50)*.01||.5,f=((te>>7)%100-50)*.01||.5,F=Math.sqrt(I*I+f*f)}let G=v*v/F;B.dx+=I/F*G,B.dy+=f/F*G,T.dx-=I/F*G,T.dy-=f/F*G}for(let[E,J]of a){let B=d[E],T=d[J],I=B.x-T.x,f=B.y-T.y,F=Math.sqrt(I*I+f*f)||.01,G=F*F/v;B.dx-=I/F*G,B.dy-=f/F*G,T.dx+=I/F*G,T.dy+=f/F*G}let Y=.055*Math.min(1,R/(A*.3));for(let[,E]of u){if(E.length<2)continue;let J=0,B=0;for(let T of E)J+=d[T].x,B+=d[T].y;J/=E.length,B/=E.length;for(let T of E)d[T].dx+=(J-d[T].x)*Y,d[T].dy+=(B-d[T].y)*Y}let ee=50;for(let E of d){let J=Math.sqrt(E.dx*E.dx+E.dy*E.dy)||.01;E.x+=E.dx/J*Math.min(J,R),E.y+=E.dy/J*Math.min(J,R),E.x=Math.max(ee,Math.min(c-ee,E.x)),E.y=Math.max(ee,Math.min(h-ee,E.y))}}return d}var kt={critical:"#ff5470",high:"#ff9d4a",medium:"#f4d35e",low:"#67c2ff",high_bug:"#a06c3f",bug:"#7a6d62",informational:"#218bff"},wt={dark:{bg:"#0c0c0c",grid:"rgba(255, 255, 255, 0.022)",selectRing:"#ffffff",edgeIntra:"rgba(180, 195, 215, ALPHA)",hubRing:"rgba(255, 255, 255, ALPHA)",labelFill:"rgba(230, 233, 238, 0.78)",labelShadow:"rgba(12, 12, 12, 0.98)",labelOutline:"rgba(12, 12, 12, 0.9)",labelDefault:"rgba(200, 210, 225, 0.78)",labelHover:"rgba(230, 237, 243, 0.95)",labelSelected:"#fff"},light:{bg:"#f6f8fa",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"},pink:{bg:"#fff0f7",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"}};function vo(){let t=document.body.classList;return t.contains("theme-pink")?wt.pink:t.contains("theme-light")?wt.light:wt.dark}function be(t){return Math.max(0,Math.min(255,Math.round(t*255))).toString(16).padStart(2,"0")}function yo(t,o,i,l){let x=t.querySelector("graph-layout")?.shadowRoot;if(!x)return;let h=x.querySelector("#g2-canvas"),c=x.querySelector("#g2-tooltip"),v=x.querySelector(".graph2-stage"),$=x.querySelector("#g2-zoom-pct");if(!h)return;Et();let e=h.getContext("2d"),z=window.devicePixelRatio||1,_=0,L=0,d={tx:0,ty:0,k:1},N=null,a=0,u=0,H=!0,A=!0,W=()=>k.packagesView&&(o.canPackagesView??!1)&&!k.focusedPkg,g=null;function R(){return g||(g=Dt(o)),g}function Y(r,b,p){if(r.nodes.length>50){vt(r,b,p);return}let w=yt(r.nodes.map(S=>S.pkg),r.importsOf,b,p,{groupOf:S=>S}),m=new Map(w.map(S=>[S.file,S]));for(let S of r.nodes){let M=m.get(S.pkg);M&&(S.x=M.x,S.y=M.y)}}function ee(){if(!H)return;let r=k.layoutCache,b=k.focusedPkg,p=W(),w=p?R().nodes:o.nodes;if(r&&r.files===o.files&&r.w===u&&r.h===a&&r.focused===b&&(r.pkgView??!1)===p)for(let m of w){let S=r.pos.get(m.file);S&&(m.x=S.x,m.y=S.y)}else{if(p)Y(R(),u,a);else if(b)if(o.nodes.length>50)vt(o,u,a);else{let S=yt(o.files,o.importsOf,u,a),M=new Map(S.map(U=>[U.file,U]));for(let U of o.nodes){let V=M.get(U.file);V&&(U.x=V.x,U.y=V.y)}}else Kt(o,u,a);let m=new Map;for(let S of w)m.set(S.file,{x:S.x,y:S.y});k.layoutCache={files:o.files,w:u,h:a,pos:m,focused:b,pkgView:p}}H=!1}function E(){let r=W()?R().nodes:o.nodes;if(r.length===0)return{k:1,tx:L/2,ty:_/2};let b=-1/0,p=-1/0,w=1/0,m=1/0;for(let s of r)s.x<w&&(w=s.x),s.y<m&&(m=s.y),s.x>b&&(b=s.x),s.y>p&&(p=s.y);let S=Math.max(20,p-m),M=Math.max(20,b-w),U=(w+b)/2,V=(m+p)/2,D=Math.min(L,_)*.1,K=Math.min((L-D*2)/M,(_-D*2)/S,4),n=Math.max(.05,K);return{k:n,tx:L/2-U*n,ty:_/2-V*n}}function J(){let r=E();d.k=r.k,d.tx=r.tx,d.ty=r.ty}function B(r,b){return[r*d.k+d.tx,b*d.k+d.ty]}function T(r,b){return[(r-d.tx)/d.k,(b-d.ty)/d.k]}function I(r){return!k.hidden.has(r.pkg)}function f(r){if(k.selectedSeverities.size>0){let p=r.severitySet;if(!p)return!0;let w=!1;for(let m of k.selectedSeverities)if(p.has(m)){w=!0;break}if(!w)return!0}if(k.selectedColors.size>0){let p=r.colorSet;if(!p)return!0;let w=!1;for(let m of k.selectedColors)if(p.has(m)){w=!0;break}if(!w)return!0}if(k.solo&&r.pkg!==k.solo&&!W())return!0;let b=k.pathFilter;if(b){let p=b.toLowerCase(),w=r.pathText?r.pathText.includes(p):r.file.toLowerCase().includes(p),m=r.pkg&&r.pkg.toLowerCase().includes(p),S=r.label&&r.label.toLowerCase().includes(p);if(!w&&!m&&!S)return!0}return!1}function F(r){let b=(r.isHub?4.9:3.5)*k.nodeSize,p=Math.max(.6,Math.min(1.6,d.k));return b*p}function G(){let r=v.getBoundingClientRect(),b=_,p=L;L=Math.max(80,r.width),_=Math.max(80,r.height),z=window.devicePixelRatio||1,h.width=L*z,h.height=_*z,h.style.width=L+"px",h.style.height=_+"px",e.setTransform(z,0,0,z,0,0),(u===0||a===0)&&(u=L,a=_,H=!0),ee();let w=p>0&&(Math.abs(L-p)/p>.15||Math.abs(_-b)/b>.15);(A||w)&&(J(),A=!1),ue()}let te=null,re=!0,_e=!1,Le=!1;function ue(){re=!0,!(_e||Le)&&(_e=!0,te=requestAnimationFrame(()=>{_e=!1,re&&!Le&&(re=!1,Ge())}))}function Ge(){let r=vo();e.fillStyle=r.bg,e.fillRect(0,0,L,_),We(r);let b=W(),p=b?R():o,w=b?k.solo:k.selected,m=w?p.nodeByFile.get(w):null,S=m?w:null;if(b&&p.nodes.length<=50){Ke(r);return}if(k.focusedPkg&&p.nodes.length<=50){Ye(r,S,m);return}for(let M of p.edges){let U=p.nodeByFile.get(M.a),V=p.nodeByFile.get(M.b);if(!U||!V||!I(U)||!I(V))continue;let D=k.edgeOpacity;S?D=M.a===S||M.b===S?.85:k.edgeOpacity*.25:N&&(M.a===N||M.b===N)&&(D=Math.min(.9,D+.5)),f(U)&&f(V)&&(D=Math.min(D,.04));let[K,n]=B(U.x,U.y),[s,P]=B(V.x,V.y);if(M.cross){let O=e.createLinearGradient(K,n,s,P);O.addColorStop(0,ne(U.pkg)+be(D)),O.addColorStop(1,ne(V.pkg)+be(D)),e.strokeStyle=O,e.lineWidth=.85}else e.strokeStyle=r.edgeIntra.replace("ALPHA",String(D*.7)),e.lineWidth=.55;e.beginPath(),e.moveTo(K,n),e.lineTo(s,P),e.stroke()}for(let M of p.nodes){if(!I(M))continue;let U=M.file===N,V=M.file===S;if(!M.isHub&&!U&&!V||f(M)&&!U&&!V)continue;let[D,K]=B(M.x,M.y),s=F(M)*(V?6:U?4.5:3),P=e.createRadialGradient(D,K,0,D,K,s),O=ne(M.pkg);P.addColorStop(0,O+"55"),P.addColorStop(1,O+"00"),e.fillStyle=P,e.beginPath(),e.arc(D,K,s,0,Math.PI*2),e.fill()}for(let M of p.nodes){if(!I(M))continue;let[U,V]=B(M.x,M.y),D=F(M),K=1,n=S&&M.file===S;if(S&&!n&&(K=(p.adj.get(S)??[]).some(P=>{let O=p.edges[P];return O.a===M.file||O.b===M.file})?1:.25),!n&&f(M)&&(K=Math.min(K,.1)),e.fillStyle=ne(M.pkg)+be(K),e.beginPath(),e.arc(U,V,D,0,Math.PI*2),e.fill(),M.isHub&&(e.strokeStyle=r.hubRing.replace("ALPHA",String(.55*K)),e.lineWidth=.8,e.stroke()),M.issue){let s=kt[M.issue],P=D+(M.issue==="critical"?4.2:M.issue==="high"?3.4:2.8),O=M.issue==="critical"?1.8:M.issue==="high"?1.5:M.issue==="medium"?1.3:1.1;e.strokeStyle=s,e.globalAlpha=K,e.lineWidth=O,e.beginPath(),e.arc(U,V,P,0,Math.PI*2),e.stroke(),e.globalAlpha=1}}if(d.k>1.4){let U=0;if(d.k<9&&!k.showLabels)for(let D of p.nodes){if(!I(D))continue;let[K,n]=B(D.x,D.y);if(!(K<0||K>L||n<0||n>_)&&(U++,U>=50))break}let V=d.k>=9||U<50;if(k.showLabels||V){e.font="10px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.fillStyle=r.labelFill,e.textAlign="left",e.textBaseline="middle";let D=11,K=2,n=250,s=(C,q)=>C>-n&&C<L+n&&q>-n&&q<_+n,P=[];for(let C of p.nodes){if(!I(C))continue;let[q,X]=B(C.x,C.y);if(!s(q,X))continue;let oe=F(C);P.push({file:C.file,x0:q-oe,x1:q+oe,y0:X-oe,y1:X+oe})}let O=[];for(let C of p.nodes){if(!I(C)||!C.isHub&&d.k<2.4)continue;let[q,X]=B(C.x,C.y);if(!s(q,X))continue;let oe=F(C),xe=q+oe+4,Se=X+1,Fe=e.measureText(C.label).width+K,Ae=C.file===S,Ie=C.file===N,He=Ae?3:Ie?2:C.isHub?1:0;O.push({file:C.file,n:C,tx:xe,ty:Se,prio:He,x0:xe-K,x1:xe+Fe,y0:Se-D/2,y1:Se+D/2})}O.sort((C,q)=>q.prio-C.prio);let Q=[],Z=(C,q)=>C.x0<q.x1&&q.x0<C.x1&&C.y0<q.y1&&q.y0<C.y1;for(let C of O){let q=!1;for(let X of P)if(X.file!==C.file&&Z(C,X)){q=!0;break}if(!q){for(let X of Q)if(Z(C,X)){q=!0;break}}q||Q.push(C)}for(let C of Q)e.fillText(C.n.label,C.tx,C.ty)}}if(m&&I(m)){let[M,U]=B(m.x,m.y),V=F(m);e.strokeStyle=r.selectRing,e.lineWidth=1.5,e.beginPath(),e.arc(M,U,V+5,0,Math.PI*2),e.stroke()}$&&($.textContent=`${Math.round(d.k*100)}%`)}function We(r){if(d.k<.4)return;let b=80,p=(d.tx%b+b)%b,w=(d.ty%b+b)%b;e.strokeStyle=r.grid,e.lineWidth=1,e.beginPath();for(let m=p;m<L;m+=b)e.moveTo(m,0),e.lineTo(m,_);for(let m=w;m<_;m+=b)e.moveTo(0,m),e.lineTo(L,m);e.stroke()}function Ye(r,b,p){let w=ne(k.focusedPkg),m=new Set;if(N){m.add(N);for(let n of o.adj.get(N)??[]){let s=o.edges[n];m.add(s.a),m.add(s.b)}}let S=n=>(n.isHub?6:4)*k.nodeSize;for(let n of o.edges){let s=o.nodeByFile.get(n.a),P=o.nodeByFile.get(n.b);if(!s||!P||!I(s)||!I(P))continue;let O=n.fromLo&&n.fromHi,Q=!O&&n.fromHi,Z=Q?P:s,C=Q?s:P,q=N&&(n.a===N||n.b===N),X=b&&(n.a===b||n.b===b),oe=(b||N)&&!q&&!X,xe=S(Z),Se=S(C),[Fe,Ae]=B(Z.x,Z.y),[Ie,He]=B(C.x,C.y),Ee=Ie-Fe,Be=He-Ae,Te=Math.sqrt(Ee*Ee+Be*Be)||1,Oe=Ee/Te,Ne=Be/Te,ae=Fe+Oe*(xe+1.5),le=Ae+Ne*(xe+1.5),ce=Ie-Oe*(Se+3.5),de=He-Ne*(Se+3.5),rt=Math.min(Te*.15,30),ve=(ae+ce)/2-Ne*rt,ye=(le+de)/2+Oe*rt;e.beginPath(),e.moveTo(ae,le),e.quadraticCurveTo(ve,ye,ce,de);let pe;if(X?pe=.9:q?pe=.85:oe?pe=.05:pe=Math.min(.85,k.edgeOpacity*3),e.strokeStyle=w+be(pe),e.lineWidth=X||q?1.5:.85,e.stroke(),oe)continue;let ge=Math.max(5,7),ie=ge*.42,he=.9,Ce=2*(1-he)*(ve-ae)+2*he*(ce-ve),De=2*(1-he)*(ye-le)+2*he*(de-ye),Ze=Math.sqrt(Ce*Ce+De*De)||1,qe=Ce/Ze,$e=De/Ze;if(e.beginPath(),e.moveTo(ce,de),e.lineTo(ce-qe*ge+$e*ie,de-$e*ge-qe*ie),e.lineTo(ce-qe*ge-$e*ie,de-$e*ge+qe*ie),e.closePath(),e.fillStyle=w+be(Math.min(1,pe+.15)),e.fill(),O){let at=1.8*(ve-ae)+.2*(ce-ve),je=2*(1-.1)*(ye-le)+2*.1*(de-ye),Je=Math.sqrt(at*at+je*je)||1,Ve=at/Je,Me=je/Je;e.beginPath(),e.moveTo(ae,le),e.lineTo(ae+Ve*ge-Me*ie,le+Me*ge+Ve*ie),e.lineTo(ae+Ve*ge+Me*ie,le+Me*ge-Ve*ie),e.closePath(),e.fill()}}for(let n of o.nodes){if(!I(n))continue;let[s,P]=B(n.x,n.y),O=S(n),Q=n.file===N,Z=n.file===b,C=(b||N)&&!m.has(n.file)&&!Z?.15:1;if(e.globalAlpha=C,Z||Q||n.isHub){let q=O*(Z?4:Q?3:2.4),X=e.createRadialGradient(s,P,O*.6,s,P,q);X.addColorStop(0,w+be(Z?.4:.25)),X.addColorStop(1,w+"00"),e.fillStyle=X,e.beginPath(),e.arc(s,P,q,0,Math.PI*2),e.fill()}if(e.fillStyle=w,e.beginPath(),e.arc(s,P,O,0,Math.PI*2),e.fill(),n.isHub&&(e.strokeStyle=r.hubRing.replace("ALPHA","0.55"),e.lineWidth=.9,e.stroke()),n.issue){let q=kt[n.issue],X=O+(n.issue==="critical"?4.2:n.issue==="high"?3.4:2.8),oe=n.issue==="critical"?1.8:n.issue==="high"?1.5:n.issue==="medium"?1.3:1.1;e.strokeStyle=q,e.lineWidth=oe,e.beginPath(),e.arc(s,P,X,0,Math.PI*2),e.stroke()}e.globalAlpha=1}e.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.textAlign="center",e.textBaseline="top",e.lineJoin="round";let M=13,U=2,V=[];for(let n of o.nodes){if(!I(n))continue;let[s,P]=B(n.x,n.y),O=S(n),Q=P+O+4,Z=e.measureText(n.label).width/2+U,C=n.file===b,q=n.file===N,X=C?3:q?2:n.isHub?1:0;V.push({n,sx:s,ty:Q,halfW:Z,isSel:C,isHov:q,prio:X,x0:s-Z,x1:s+Z,y0:Q,y1:Q+M})}V.sort((n,s)=>s.prio-n.prio);let D=[],K=(n,s)=>n.x0<s.x1&&s.x0<n.x1&&n.y0<s.y1&&s.y0<n.y1;for(let n of V){let s=!1;for(let P of D)if(K(n,P)){s=!0;break}s||D.push(n)}for(let n of D){let{n:s,sx:P,ty:O,isSel:Q,isHov:Z}=n,C=(b||N)&&!m.has(s.file)&&!Q?.2:1;e.globalAlpha=C,e.shadowColor=r.labelShadow,e.shadowBlur=4,e.strokeStyle=r.labelOutline,e.lineWidth=3,e.strokeText(s.label,P,O),e.shadowBlur=0,e.fillStyle=Q?r.labelSelected:Z?r.labelHover:r.labelDefault,e.fillText(s.label,P,O),e.globalAlpha=1}if(p&&I(p)){let[n,s]=B(p.x,p.y),P=S(p);e.strokeStyle=r.selectRing,e.lineWidth=1.8,e.beginPath(),e.arc(n,s,P+4,0,Math.PI*2),e.stroke()}$&&($.textContent=`${Math.round(d.k*100)}%`)}function we(r){return Math.min(26,5+Math.sqrt(r.fileCount)*1.7)*k.nodeSize}function Ke(r){let b=R(),p=k.solo&&b.byPkg.has(k.solo)?k.solo:null,w=N??p,m=new Set;if(w){m.add(w);for(let n of b.edges)n.a===w?m.add(n.b):n.b===w&&m.add(n.a)}let S=n=>{if(n.pkg===p||n.pkg===N)return 1;let s=1;return w&&!m.has(n.pkg)&&(s=.2),f(n)&&(s=Math.min(s,.1)),s};for(let n of b.edges){let s=b.byPkg.get(n.a),P=b.byPkg.get(n.b);if(!s||!P||!I(s)||!I(P))continue;let O=n.fromLo&&n.fromHi,Q=!O&&n.fromHi,Z=Q?P:s,C=Q?s:P,q=w!==null&&(n.a===w||n.b===w),X=f(s)&&f(P),oe=w!==null&&!q||X,xe=we(Z),Se=we(C),[Fe,Ae]=B(Z.x,Z.y),[Ie,He]=B(C.x,C.y),Ee=Ie-Fe,Be=He-Ae,Te=Math.sqrt(Ee*Ee+Be*Be)||1,Oe=Ee/Te,Ne=Be/Te,ae=Fe+Oe*(xe+1.5),le=Ae+Ne*(xe+1.5),ce=Ie-Oe*(Se+3.5),de=He-Ne*(Se+3.5),rt=Math.min(Te*.15,30),ve=(ae+ce)/2-Ne*rt,ye=(le+de)/2+Oe*rt,pe;X?pe=.05:q?pe=.9:oe?pe=.06:pe=.5;let ge=e.createLinearGradient(ae,le,ce,de);if(ge.addColorStop(0,ne(Z.pkg)+be(pe)),ge.addColorStop(1,ne(C.pkg)+be(pe)),e.beginPath(),e.moveTo(ae,le),e.quadraticCurveTo(ve,ye,ce,de),e.strokeStyle=ge,e.lineWidth=Math.min(3.5,.8+Math.sqrt(n.count)*.3)*(q?1.3:1),e.stroke(),oe)continue;let ie=7,he=ie*.42,Ce=.9,De=2*(1-Ce)*(ve-ae)+2*Ce*(ce-ve),Ze=2*(1-Ce)*(ye-le)+2*Ce*(de-ye),qe=Math.sqrt(De*De+Ze*Ze)||1,$e=De/qe,it=Ze/qe;if(e.beginPath(),e.moveTo(ce,de),e.lineTo(ce-$e*ie+it*he,de-it*ie-$e*he),e.lineTo(ce-$e*ie-it*he,de-it*ie+$e*he),e.closePath(),e.fillStyle=ne(C.pkg)+be(Math.min(1,pe+.15)),e.fill(),O){let je=1.8*(ve-ae)+.2*(ce-ve),Je=2*(1-.1)*(ye-le)+2*.1*(de-ye),Ve=Math.sqrt(je*je+Je*Je)||1,Me=je/Ve,lt=Je/Ve;e.beginPath(),e.moveTo(ae,le),e.lineTo(ae+Me*ie-lt*he,le+lt*ie+Me*he),e.lineTo(ae+Me*ie+lt*he,le+lt*ie-Me*he),e.closePath(),e.fillStyle=ne(Z.pkg)+be(Math.min(1,pe+.15)),e.fill()}}for(let n of b.nodes){if(!I(n))continue;let[s,P]=B(n.x,n.y),O=we(n),Q=n.pkg===N,Z=n.pkg===p,C=ne(n.pkg),q=S(n);if(Z||Q){let X=O*(Z?2.6:2.2),oe=e.createRadialGradient(s,P,O*.6,s,P,X);oe.addColorStop(0,C+be(Z?.4:.25)),oe.addColorStop(1,C+"00"),e.fillStyle=oe,e.beginPath(),e.arc(s,P,X,0,Math.PI*2),e.fill()}if(e.fillStyle=C+be(q),e.beginPath(),e.arc(s,P,O,0,Math.PI*2),e.fill(),n.issue){let X=kt[n.issue],oe=O+(n.issue==="critical"?4.2:n.issue==="high"?3.4:2.8),xe=n.issue==="critical"?1.8:n.issue==="high"?1.5:n.issue==="medium"?1.3:1.1;e.strokeStyle=X,e.globalAlpha=q,e.lineWidth=xe,e.beginPath(),e.arc(s,P,oe,0,Math.PI*2),e.stroke(),e.globalAlpha=1}}e.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.textAlign="center",e.textBaseline="top",e.lineJoin="round";let M=13,U=2,V=[];for(let n of b.nodes){if(!I(n))continue;let[s,P]=B(n.x,n.y),O=we(n),Q=P+O+4,Z=e.measureText(n.label).width/2+U,C=n.pkg===p,q=n.pkg===N,X=C?1/0:q?1e9:n.fileCount;V.push({p:n,sx:s,ty:Q,isSel:C,isHov:q,prio:X,x0:s-Z,x1:s+Z,y0:Q,y1:Q+M})}V.sort((n,s)=>s.prio-n.prio);let D=[],K=(n,s)=>n.x0<s.x1&&s.x0<n.x1&&n.y0<s.y1&&s.y0<n.y1;for(let n of V){let s=!1;for(let P of D)if(K(n,P)){s=!0;break}s||D.push(n)}for(let n of D){let{p:s,sx:P,ty:O,isSel:Q,isHov:Z}=n;e.globalAlpha=Math.max(.25,S(s)),e.shadowColor=r.labelShadow,e.shadowBlur=4,e.strokeStyle=r.labelOutline,e.lineWidth=3,e.strokeText(s.label,P,O),e.shadowBlur=0,e.fillStyle=Q?r.labelSelected:Z?r.labelHover:r.labelDefault,e.fillText(s.label,P,O),e.globalAlpha=1}if(p){let n=b.byPkg.get(p),[s,P]=B(n.x,n.y);e.strokeStyle=r.selectRing,e.lineWidth=1.8,e.beginPath(),e.arc(s,P,we(n)+4,0,Math.PI*2),e.stroke()}$&&($.textContent=`${Math.round(d.k*100)}%`)}function ot(r,b){let p=W(),w=p?R():o,m=p&&w.nodes.length<=50,S=null,M=1/0,U=6;for(let V of w.nodes){if(!I(V))continue;let[D,K]=B(V.x,V.y),n=D-r,s=K-b,P=n*n+s*s,O=(m?we(V):F(V))+U;P<O*O&&P<M&&(M=P,S=V)}return S}function st(r,b,p){if(!c)return;let w=ne(r.pkg),m=r.pkg==="__own__"?"own source":r.pkg,S=ft(r.file,r.pkg);Ue(j`<div class="g2-tt-path">${S}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${w}`}"></span> <span class="g2-tt-pkg">${m}</span></div>${r.totalIssues>0?tt(r.own):null}`,c),fe(b,p)}function pt(r,b,p){if(!c)return;let w=ne(r.pkg),m=et(r.size);Ue(j`<div class="g2-tt-path">${r.label}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${w}`}"></span> <span class="g2-tt-pkg">${r.fileCount} ${r.fileCount===1?"file":"files"}${m?` \xB7 ${m}`:""}</span></div>${r.totalIssues>0?tt(r.own):null}`,c),fe(b,p)}function fe(r,b){let p=v.getBoundingClientRect();c.classList.add("show");let w=c.offsetWidth,m=c.offsetHeight,S=r-p.left,M=b-p.top,U=p.width,V=p.height,D=12,K=S+D;K+w>U-4&&(K=S-w-D),K<4&&(K=4);let n=M+D;n+m>V-4&&(n=M-m-D),n<4&&(n=4),c.style.left=`${K}px`,c.style.top=`${n}px`}function se(){c&&c.classList.remove("show")}let me=!1,ze=null,Xe=!1,nt=r=>{r.button===0&&(r.target.closest(".g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl")||(me=!0,Xe=!1,ze={x:r.clientX,y:r.clientY,tx:d.tx,ty:d.ty}))},St=r=>{let b=v.getBoundingClientRect(),p=r.clientX-b.left,w=r.clientY-b.top;if(me){let M=r.clientX-ze.x,U=r.clientY-ze.y;Math.abs(M)+Math.abs(U)>3&&(Xe=!0),d.tx=ze.tx+M,d.ty=ze.ty+U,se(),ue();return}let m=ot(p,w),S=N;N=m?.file??null,h.style.cursor=m?"default":"grab",m?W()?pt(m,r.clientX,r.clientY):st(m,r.clientX,r.clientY):S&&se(),N!==S&&ue()},$t=r=>{if(me&&!Xe){let b=v.getBoundingClientRect(),p=r.clientX-b.left,w=r.clientY-b.top,m=ot(p,w);W()?(k.solo=m&&k.solo!==m.pkg?m.pkg:null,k.selected=null,i(),l?.()):(k.selected=m?.file??null,i()),ue()}me=!1},Mt=()=>{let r=N!==null;N=null,se(),r&&ue()},zt=r=>{r.preventDefault();let b=v.getBoundingClientRect(),p=r.clientX-b.left,w=r.clientY-b.top,m=Math.exp(-r.deltaY*.0015),S=E();if(m<1&&d.k<=S.k*1.0001){d.k=S.k;let D=Math.min(.4,(1-m)*3);d.tx+=(S.tx-d.tx)*D,d.ty+=(S.ty-d.ty)*D,ue();return}let[M,U]=T(p,w),V=Math.max(S.k,Math.min(9.99,d.k*m));d.k=V,d.tx=p-M*d.k,d.ty=w-U*d.k,ue()};v.addEventListener("mousedown",nt),window.addEventListener("mousemove",St),window.addEventListener("mouseup",$t),v.addEventListener("mouseleave",Mt),v.addEventListener("wheel",zt,{passive:!1});function Ct(r){let b=E().k;r=Math.max(b,Math.min(9.99,r));let p=L/2,w=_/2,[m,S]=T(p,w);d.k=r,d.tx=p-m*d.k,d.ty=w-S*d.k,ue()}let Zt=x.querySelector("#g2-zoom-in"),Jt=x.querySelector("#g2-zoom-out"),Qt=x.querySelector("#g2-zoom-fit");Zt?.addEventListener("click",()=>Ct(d.k*1.4)),Jt?.addEventListener("click",()=>Ct(d.k/1.4)),Qt?.addEventListener("click",()=>{J(),ue()}),G();let Pt=new ResizeObserver(()=>G());Pt.observe(v);let Rt=new MutationObserver(r=>{for(let b of r){let p=(b.oldValue||"").includes("report-fullscreen"),w=document.body.classList.contains("report-fullscreen");if(p!==w){u=0,a=0,H=!0,A=!0,k.layoutCache=null,setTimeout(()=>G(),80);return}ue()}});Rt.observe(document.body,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}),ue(),k.graphState={requestDraw:ue,_cleanup:()=>{Le=!0,cancelAnimationFrame(te),Pt.disconnect(),Rt.disconnect(),v.removeEventListener("mousedown",nt),window.removeEventListener("mousemove",St),window.removeEventListener("mouseup",$t),v.removeEventListener("mouseleave",Mt),v.removeEventListener("wheel",zt)}}}function Cn(t,o){let i=document.querySelector("graph-layout")?.shadowRoot;if(!i)return;let l=Xt(t),y=i.querySelector("#g2-selection-area");y&&Ue(Wt(l,o),y);let x=i.querySelector("#g2-focus-overlay-slot");x&&Ue(Vt(l),x)}function Pn(t){let o=document.querySelector("graph-layout")?.shadowRoot;if(!o)return;let i=o.querySelector("#g2-top-pkgs-block");i&&Ue(Gt(Xt(t)),i)}function Xt(t){let o=Nt(t.treeData,t.files,t.ownCounts,t.transitiveCounts,t.severitySets,t.colorSets,t.fileFindings,t.options);if(t.strippedToOrig)for(let i of o.nodes)i.origFile=t.strippedToOrig.get(i.file);return o.canPackagesView=t.canPackagesView??!1,o}export{so as _swapGraph2Impl,yo as attachGraph2Interaction,Xt as buildGraphFromPrep,Cn as refreshSidebar,Pn as refreshTopPkgs};
|
|
1
|
+
var Pt=globalThis[Symbol.for("@rray/frontend")];if(!Pt)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:Lt,html:q,nothing:eo,unsafeCSS:ct,render:Ge,StateElement:wo,classMap:Ce,repeat:Et,styleMap:Qe}=Pt;var It=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{display:grid;grid-template-columns:1fr 300px;grid-template-rows:auto 1fr;grid-template-areas:"topbar right" "stage right";min-height:0;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:var(--graph-canvas-bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,sans-serif;font-size:12px}.graph2-layout{display:contents}.graph2-topbar{grid-area:topbar;display:flex;flex-direction:column;gap:.5rem;padding:.6rem .75rem;font-size:.825rem;background:var(--surface);backdrop-filter:var(--glass-blur);border-bottom:1px solid var(--graph-divider)}.graph2-topbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;padding:0}.graph2-topbar .g2-spacer{flex:1}.graph2-topbar triage-selector{margin-left:auto}.g2-icon-btn{width:28px;height:28px;border-radius:5px;background:var(--graph-hover-bg);border:1px solid var(--border);color:var(--muted);display:grid;place-items:center;font-family:inherit;&:hover{color:var(--accent);border-color:var(--accent)}& svg{display:block}}.g2-path-filter-wrap{position:relative;flex:0 0 14rem;padding-right:22px}.g2-path-filter-wrap .g2-path-filter-clear{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:18px;height:18px;background:transparent;border:0;border-radius:50%;color:var(--muted);font:400 10px/1 inherit;font-family:inherit;&:hover{color:var(--text);background:var(--surface-active)}}.g2-path-filter:placeholder-shown~.g2-path-filter-clear{display:none}.g2-topbar-toggle{display:inline-flex;align-items:center;height:30px;box-sizing:border-box;gap:8px;padding:5px 10px;background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:6px;color:var(--muted);font:500 11px/1 inherit;font-family:inherit;white-space:nowrap;&:hover{color:var(--text)}&.on{color:var(--text)}&.on .g2-switch{background:color-mix(in srgb,var(--accent) 22%,transparent)}&.on .g2-switch:after{transform:translate(12px);background:var(--accent)}}.g2-trash-btn.on{background:color-mix(in srgb,var(--accent) 16%,transparent);border-color:var(--accent);color:var(--accent)}.graph2-right{grid-area:right;border-left:1px solid var(--graph-divider);background:var(--surface);backdrop-filter:var(--glass-blur);display:flex;flex-direction:column;overflow:hidden;padding:14px}.g2-panel-title{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);opacity:.85;margin:14px 0 8px;display:flex;align-items:baseline;gap:6px;&:first-child{margin-top:0}}.g2-count{color:var(--muted);opacity:.6;font-weight:400;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;text-transform:none;letter-spacing:0;font-size:10px}.g2-panel-title-row{justify-content:space-between;gap:8px}#g2-top-pkgs-block{margin-top:14px;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.g2-mini-tabs{display:flex;gap:1px;background:var(--graph-divider);border-radius:4px;overflow:hidden}.g2-mini-tab{background:transparent;border:0;color:var(--muted);font-family:inherit;font-weight:500;font-size:11px;line-height:1.4;text-transform:none;letter-spacing:0;padding:2px 7px;&:hover{color:var(--text);background:var(--graph-hover-bg)}&.on{background:var(--surface-active);color:var(--accent)}}.g2-switch{width:26px;height:14px;background:var(--border);border-radius:8px;position:relative;transition:background .15s;flex-shrink:0;&:after{content:"";position:absolute;top:2px;left:2px;width:10px;height:10px;border-radius:50%;background:var(--muted);transition:transform .15s,background .15s}}.graph2-stage{grid-area:stage;position:relative;background:var(--graph-canvas-bg);overflow:hidden;cursor:grab;&:active{cursor:grabbing}& canvas{position:absolute;inset:0;width:100%;height:100%;display:block}}.g2-stage-overlay{position:absolute;top:12px;left:12px;z-index:3;display:flex;flex-direction:column;gap:4px;pointer-events:none;max-width:calc(100% - 60px)}.g2-stage-overlay>*{pointer-events:auto}.g2-stage-stats{position:absolute;bottom:10px;left:12px;z-index:2;display:flex;flex-wrap:wrap;gap:2px 14px;font:500 10px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--muted);opacity:.7;text-transform:uppercase;letter-spacing:.06em;pointer-events:none;max-width:calc(100% - 80px);& b{font-weight:600;color:var(--text);opacity:1}}.g2-stage-overlay-tr{position:absolute;top:12px;right:12px;z-index:3;pointer-events:auto}.g2-focus-pkg-btn{width:28px;height:28px;display:grid;place-items:center;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);box-shadow:var(--shadow-glass);&:hover{border-color:var(--accent);background:var(--surface-active)}& svg{display:block}}.g2-back-btn{display:inline-flex;align-items:center;gap:4px;padding:6px 11px;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);font:500 11px/1 inherit;font-family:inherit;box-shadow:var(--shadow-glass);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-self:flex-start;&:hover{border-color:var(--accent);background:var(--surface-active)}}.g2-zoom-ctrl{position:absolute;right:12px;bottom:12px;display:flex;flex-direction:column;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;overflow:hidden;z-index:3;box-shadow:var(--shadow-glass);& button{width:28px;height:28px;background:transparent;border:0;color:var(--muted);border-bottom:1px solid var(--graph-divider);display:grid;place-items:center;font-family:inherit;font-size:13px;&:last-child{border-bottom:0}&:hover{color:var(--accent);background:var(--surface-active)}}}.g2-zoom-pct{font:500 9px/1 ui-monospace,monospace;color:var(--muted);padding:5px 0;text-align:center;border-bottom:1px solid var(--graph-divider)}.g2-zoom-ctrl .g2-zoom-fit-btn{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:9px;line-height:1;letter-spacing:-.02em;text-transform:lowercase}.g2-tooltip{position:absolute;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:7px;padding:9px 11px;pointer-events:none;min-width:170px;max-width:260px;opacity:0;transition:opacity .12s;z-index:10;box-shadow:var(--shadow-glass);&.show{opacity:1}}.g2-tt-path{font:500 11px/1.3 ui-monospace,monospace;color:var(--text);word-break:break-all;margin-bottom:4px}.g2-tt-head{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.g2-tt-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-tt-pkg{font-size:10px;color:var(--muted);word-break:break-all}.g2-tt-badge{display:inline-block;font-size:8px;padding:2px 4px;background:color-mix(in srgb,var(--accent) 22%,transparent);color:var(--accent);border-radius:3px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}.g2-tooltip .tree-count-chips{margin-top:6px}:host-context(body.theme-light) .graph2-right .tree-count-chip.medium,:host-context(body.theme-light) .g2-tooltip .tree-count-chip.medium{color:#fff}.g2-selection-card{background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:8px;overflow:hidden}.g2-sel-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;align-items:center;gap:8px}.g2-sel-file-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;flex-direction:column;gap:6px}.g2-sel-path{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:12px;line-height:1.3;color:var(--text);word-break:break-all}.g2-sel-pkg-row{display:flex;align-items:center;gap:6px;min-width:0}.g2-sel-pkg{font-size:11px;color:var(--muted);word-break:break-all;min-width:0}.g2-sel-fullpath{padding:7px 13px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-sel-size{padding:5px 13px 7px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);font-variant-numeric:tabular-nums}.g2-sel-dot{width:11px;height:11px;border-radius:50%;box-shadow:0 0 0 3px color-mix(in srgb,var(--dot) 22%,transparent);flex-shrink:0}.g2-sel-id{font:600 12px/1 ui-monospace,monospace;color:var(--text);word-break:break-all;flex:1;min-width:0}.g2-sel-grp{font:500 9px/1 ui-monospace,monospace;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;flex-shrink:0}.g2-sel-body{padding:11px 13px}.g2-sel-row{display:flex;justify-content:space-between;gap:12px;font-size:11px;padding:5px 0;border-bottom:1px solid var(--graph-divider);&:last-child{border-bottom:0}.k{color:var(--muted);flex-shrink:0}.v{color:var(--text);font-family:ui-monospace,monospace;word-break:break-all;text-align:right;min-width:0}}.g2-sel-section{padding:9px 13px;border-top:1px solid var(--graph-divider)}.g2-sel-section-label{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);opacity:.85;margin-bottom:5px}.g2-sel-section-empty{color:var(--muted);opacity:.55;font-size:11px;font-style:italic}.g2-sel-jumps{padding:11px 13px;display:flex;gap:5px;flex-wrap:wrap;border-top:1px solid var(--graph-divider)}.g2-sel-jump{background:var(--surface-active);border:1px solid var(--border);color:var(--accent);border-radius:4px;padding:2px 8px;font-family:inherit;font-weight:500;font-size:11px;line-height:1.3;&:hover{border-color:var(--accent)}}.g2-sel-file-list{list-style:none;margin:0;padding:0;max-height:110px;overflow:hidden auto;-webkit-app-region:no-drag;app-region:no-drag;&::-webkit-scrollbar{width:4px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}& li{padding:0}}.g2-sel-file-link{display:flex;align-items:center;gap:6px;width:100%;background:transparent;border:0;border-radius:3px;padding:3px 6px;font:400 11px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--accent);text-align:left;&:hover{background:var(--graph-hover-bg)}.g2-sel-file-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.g2-sel-file-path{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.g2-empty-state{background:var(--graph-hover-bg);border:1px dashed var(--border);border-radius:8px;padding:18px 14px;text-align:center;color:var(--muted);font-size:11px;line-height:1.5;& strong{color:var(--text);display:block;margin-bottom:4px;font-weight:500}}.g2-dist-bar{width:100%;height:5px;border-radius:3px;overflow:hidden;display:flex;background:var(--surface-active);margin-bottom:8px;>span{display:block;height:100%}}.g2-dist-list{display:flex;flex-direction:column;gap:2px;flex:1 1 0;min-height:0;overflow-y:auto;overscroll-behavior:none;-webkit-app-region:no-drag;app-region:no-drag;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:5px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.g2-dist-empty{color:var(--muted);opacity:.55;font-size:10px;font-style:italic;padding:6px 0;text-align:center}.g2-dist-item{display:grid;grid-template-columns:8px 1fr auto auto;gap:8px;align-items:center;font-size:10px;padding:4px 6px;margin:0 -6px;background:transparent;border:0;border-radius:4px;font-family:inherit;text-align:left;width:calc(100% + 12px);&:hover{background:var(--graph-hover-bg)}&.on{background:var(--surface-active);.g2-dist-name{color:var(--accent)}}.g2-dist-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-dist-name{color:var(--muted);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-dist-count{font-family:ui-monospace,monospace;color:var(--text)}.g2-dist-pct{font-family:ui-monospace,monospace;color:var(--muted);width:36px;text-align:right;opacity:.85}}@media print{:host{display:none!important}}
|
|
2
|
+
`;var At=`.tree-count-chips{display:inline-flex;gap:.25rem;flex-wrap:wrap}.tree-count-chip{display:inline-block;font-size:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;padding:.1rem .4rem;border-radius:3px;line-height:1.3;&.critical{background:var(--critical);color:#fff}&.high{background:var(--high);color:#fff}&.medium{background:var(--medium);color:#000}&.low{background:var(--low);color:#000}&.high_bug{background:var(--high-bug);color:#fff}&.bug{background:var(--bug);color:#fff}&.informational{background:var(--info);color:#fff}}
|
|
3
|
+
`;var Ft=`.toolbar{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;padding:.6rem .75rem;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;box-shadow:var(--shadow-glass);font-size:.825rem;& label{color:var(--muted);margin-right:.15rem}& select{height:30px;box-sizing:border-box;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .4rem;font-size:.8rem;&:focus{border-color:var(--accent);outline:none}}& select.sort-select{padding:.3rem 1.7rem .3rem .55rem;min-width:8.5rem;font-weight:500;appearance:none;-webkit-appearance:none;background:transparent}:is(repo-filter,revalidate-filter,findings-sort){position:relative;display:inline-block;&:after{content:"";position:absolute;right:.7rem;top:50%;width:.35rem;height:.35rem;border-right:1.5px solid var(--muted);border-bottom:1.5px solid var(--muted);transform:translateY(-70%) rotate(45deg);pointer-events:none}}& analyzer-select{position:relative;display:inline-block}.analyzer-btn{display:inline-flex;align-items:center;gap:.45rem;height:30px;box-sizing:border-box;padding:.3rem .55rem;min-width:8.5rem;background:transparent;color:var(--text);border:1px solid var(--border);border-radius:4px;font-family:inherit;font-size:.8rem;font-weight:500;&:hover{border-color:var(--accent)}&:focus-visible{border-color:var(--accent);outline:none}&.active{color:var(--accent)}.analyzer-btn-label{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:18rem}& svg{color:var(--muted);flex-shrink:0}}& range-slider{color:var(--accent);margin:0 .25rem}.conf-vals{color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-variant-numeric:tabular-nums;.dash{color:var(--muted);margin:0 .15rem}}& conf-filter{position:relative;display:inline-flex;align-items:center;height:30px;box-sizing:border-box;padding:0 .55rem;gap:.5rem;background:transparent;border:1px solid var(--border);border-radius:4px;.conf-range-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}& range-slider{margin:0}.conf-range{display:inline-flex;align-items:center;gap:.5rem}:is(.conf-range,.conf-range-label).replaced{visibility:hidden}:is(.conf-range,.conf-range-label).disabled{opacity:.35}& revalidate-filter{position:relative;display:inline-flex;align-items:center;flex:none;width:1.4rem;.sort-select{width:100%;border:0;height:auto;min-width:0;padding:0 .95rem 0 .2rem;font-size:.72rem;color:var(--muted);cursor:pointer;&:hover{color:var(--text)}}&:after{right:.25rem}&.replaces{position:static;.sort-select{position:absolute;inset:0 .55rem;width:auto;padding-left:0;color:var(--text)}&:after{right:.8rem}}.partial-cycle{position:absolute;right:1.75rem;top:50%;transform:translateY(-50%);z-index:1;padding:.1rem .3rem;border-radius:3px;font:inherit;font-size:.66rem;line-height:1.4;white-space:nowrap;cursor:pointer;--chip: var(--muted);color:var(--chip);border:1px solid rgb(from var(--chip) r g b / .45);background:rgb(from var(--chip) r g b / .1);&.included{--chip: var(--green)}&.excluded{--chip: var(--critical)}&.only{--chip: var(--yellow)}&:hover{background:rgb(from var(--chip) r g b / .22)}&:focus-visible{outline:1px solid var(--accent);outline-offset:1px}}}}& input[type=text]{background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .4rem;font-size:.8rem;flex:1;min-width:8rem;&:focus{border-color:var(--accent);outline:none}}.result-count{color:var(--muted);margin-left:auto}.checkbox-label{display:inline-flex;align-items:center;gap:.25rem;color:var(--muted);& input{margin:0}}}.analyzer-menu[popover]{position:fixed;inset:auto;margin:0;align-items:stretch;gap:.35rem;padding:.3rem;background:var(--bg);border:1px solid var(--border);border-radius:6px;box-shadow:0 4px 12px #00000040;font-size:.825rem;-webkit-app-region:no-drag;app-region:no-drag}.analyzer-menu[popover]:not(:popover-open){display:none}.analyzer-menu[popover]:popover-open{display:flex}.analyzer-menu-sep{border-left:1px solid var(--border)}.analyzer-menu-col{display:flex;flex-direction:column;gap:1px;min-width:9rem;max-height:60vh;overflow-y:auto}.analyzer-menu-head{padding:.25rem .5rem .2rem;color:var(--muted);font-size:.68rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.analyzer-menu-item{display:flex;align-items:center;gap:.45rem;background:transparent;border:0;border-radius:3px;padding:.3rem .5rem;color:var(--text);text-align:left;font-family:inherit;font-size:.78rem;&:before{content:"";width:.8rem;flex-shrink:0}&.active:before{content:"\\2713";color:var(--accent)}&:hover{background:var(--surface)}&.zero{opacity:.45}.analyzer-menu-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:16rem}.analyzer-menu-count{color:var(--muted);font-size:.7rem;font-weight:600;font-variant-numeric:tabular-nums}}.trash-btn{height:30px;box-sizing:border-box;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .55rem;font-size:.8rem;font-family:inherit;&:hover{border-color:var(--accent)}&.active{border-color:var(--critical);color:var(--critical)}}.toolbar .trash-btn{margin-left:auto}triage-selector,slide-triage-tabs{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.toolbar triage-selector{margin-left:auto}triage-selector.is-empty{display:none}.triage-state-btn{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.8rem;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{background:var(--surface-active)}}.triage-state-btn.active.triage-state-deleted{color:var(--critical)}.triage-state-btn.active.triage-state-fixed{color:var(--green, #4ade80)}.triage-state-btn.active.triage-state-inprogress{color:var(--warning, #d97706)}.triage-state-btn.active.triage-state-invalid{color:var(--muted)}.triage-state-btn.active.triage-state-ignored{color:var(--accent, #2563eb)}entity-search{display:contents}view-mode-buttons{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.view-mode-btn{background:transparent;border:none;color:var(--muted);padding:.28rem .5rem;display:inline-flex;align-items:center;justify-content:center;transition:background .12s,color .12s;font-family:inherit;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}& svg{display:block}}}source-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.source-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}severity-mode-switch{display:inline-flex;align-items:center;gap:.4rem;height:30px;box-sizing:border-box;.severity-mode-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}.severity-mode-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.severity-mode-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;cursor:pointer;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}annotation-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.annotation-chip{position:relative;background:transparent;border:none;color:var(--muted);padding:0 .45rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;cursor:pointer;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.sel-with,&.sel-without{color:var(--accent);background:var(--surface-active)}&.sel-with .flag-cloth{fill:var(--accent)}&.sel-without:after{content:"";position:absolute;left:18%;right:18%;top:50%;height:1.5px;background:currentcolor;border-radius:1px;transform:rotate(-20deg);transform-origin:center;pointer-events:none}& svg{display:block}}}.toolbar-row{display:flex;gap:.75rem;flex-wrap:wrap;align-items:center}.search-row{display:inline-flex;align-items:center;gap:.65rem;flex:1 1 14rem;min-width:12rem}toolbar-search,.toolbar-search{display:inline-flex;align-items:center;gap:.5rem;flex:1;min-width:0;height:30px;box-sizing:border-box;padding:0 .65rem;background:var(--bg);border:1px solid var(--border);border-radius:6px;&:has(input:focus){border-color:var(--accent)}>svg{color:var(--muted);flex-shrink:0}&[kind] input[type=text],&.toolbar-search input[type=text]{flex:1;min-width:0;background:transparent;border:0;outline:none;color:var(--text);font:inherit;font-size:.8rem;padding:0;&:focus{border:0}&::placeholder{color:var(--muted)}&:focus::placeholder{color:transparent}&::-webkit-search-cancel-button{display:none}}}.search-negate-btn{flex-shrink:0;width:20px;height:20px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:3px;padding:0;transition:background .12s,color .12s;& svg{width:13px;height:13px}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .08)}&.active{color:var(--accent);background:rgb(from var(--text) r g b / .1)}}@media(width<=1200px){.toolbar-row.sev-row .search-row{flex-basis:100%}}.findings-content.with-details .toolbar{max-width:1200px}severity-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.sev-chip{display:inline-flex;align-items:center;gap:.4rem;background:transparent;border:0;padding:0 .6rem;color:var(--muted);font-family:inherit;font-size:.8rem;transition:background .12s,color .12s;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}.sd{width:8px;height:8px;border-radius:2px;flex-shrink:0;background:currentcolor}.n{align-self:flex-start;margin:1px -5px 0;color:var(--muted);font-variant-numeric:tabular-nums;font-size:8.5px;font-weight:600;background:var(--bg);border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px}&.active{color:var(--text);.n{color:var(--text)}}&.critical .sd{background:var(--critical)}&.high .sd{background:var(--high)}&.medium .sd{background:var(--medium)}&.low .sd{background:var(--low)}&.high_bug .sd{background:var(--high-bug)}&.bug .sd{background:var(--bug)}&.informational .sd{background:var(--info)}&.critical.active{background:rgb(from var(--critical) r g b / .25)}&.high.active{background:rgb(from var(--high) r g b / .25)}&.medium.active{background:rgb(from var(--medium) r g b / .25)}&.low.active{background:rgb(from var(--low) r g b / .25)}&.high_bug.active{background:rgb(from var(--high-bug) r g b / .25)}&.bug.active{background:rgb(from var(--bug) r g b / .25)}&.informational.active{background:rgb(from var(--info) r g b / .25)}}triage-filter{display:inline-flex;align-items:center;background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:3px;height:30px;gap:1px;& button{width:22px;height:22px;background:transparent;border:0;border-radius:4px;padding:0;display:grid;place-items:center;position:relative;transition:background .12s;&:hover{background:rgb(from var(--text) r g b / .06)}&.active{background:rgb(from var(--text) r g b / .08);box-shadow:0 0 0 1px var(--border)}}.td{width:12px;height:12px;border-radius:50%;border:1.5px solid currentcolor;background:transparent;transition:background .12s}& button.active .td{background:currentcolor}.td.none{border-style:dashed;color:var(--muted)}.td.r{color:#fc5855}.td.b{color:#30aff8}.td.g{color:#68c36d}.td.x{color:#6e7278}.count{position:absolute;top:-2px;right:-2px;background:var(--bg);color:var(--muted);font-size:8.5px;font-weight:600;border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px;font-variant-numeric:tabular-nums}}
|
|
4
|
+
`;var Co=new TextEncoder,_o=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});var ke=["critical","high","medium","low","high_bug","bug","informational"];var ro=["revalidation","refuted","unreachable","confirmed","partial","unknown"],Do=new Set(ro);function gt(t){return new RegExp(`(^|/)${t}/`,"u")}function io(t){return new RegExp(`^(?:.*/)?${t}/(?:@[^/]+/[^/]+|[^/]+)/(.*)$`,"u")}var jo=gt("node_modules"),qo=gt("vendor"),ht="node_modules",Vo=gt(ht),Go=io(ht);function dt(){return ht}function et(t){return typeof t!="number"||!Number.isFinite(t)?null:`${t.toLocaleString()} B`}function so(){return{showAll:!1,splitOwnDirs:!1,packagesView:!1,selected:null,focusedPkg:null,topPkgsTab:"issues",edgeOpacity:.22,nodeSize:1,showLabels:!1,selectedSeverities:new Set,selectedColors:new Set,pathFilter:"",hidden:new Set,solo:null,graphState:null,layoutCache:null}}var _e=so(),k=new Proxy(_e,{get(t,o){return _e[o]},set(t,o,i){return _e[o]=i,!0},has(t,o){return o in _e},deleteProperty(t,o){return delete _e[o]},ownKeys(){return Reflect.ownKeys(_e)},getOwnPropertyDescriptor(t,o){return Object.getOwnPropertyDescriptor(_e,o)}});function Ht(){k.graphState?._cleanup&&k.graphState._cleanup(),k.graphState=null}function ao(t){t&&(_e=t)}function ut(t){if(!t)return null;let o=dt(),i=new RegExp(`^(?:.*/)?${o}/(@[^/]+/[^/]+|[^/]+)`,"u"),l=t.match(i);if(l)return l[1];let y=t.indexOf("/");return y>0?t.slice(0,y):"/"}var lo=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],Tt=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function co(){if(typeof document>"u")return!1;let t=document.body?.classList;return!!t&&(t.contains("theme-light")||t.contains("theme-pink"))}var bt=new Map;function ne(t){let o=co()?Tt:lo,l=`${o===Tt?"l":"d"}:${t??"__own__"}`;if(bt.has(l))return bt.get(l);let y=t??"__own__",x=0;for(let $ of y)x=x*37+$.codePointAt(0)|0;let c=((x%o.length+o.length)%o.length*7+3)%o.length,v=o[c];return bt.set(l,v),v}function Bt(t){if(!t)return 0;let o=0;for(let i of ke)o+=t[i]??0;return o}function Ot(t){if(!t)return null;for(let o of ke)if((t[o]??0)>0)return o;return null}function Nt(t,o,i,l,y,x,h,c={}){let v=c.pkgOf??ut,$=new Set(o),e=new Map,R=new Map;for(let g of o){let _=(t[g].imports??[]).filter(K=>$.has(K));e.set(g,_);for(let K of _)R.has(K)||R.set(K,[]),R.get(K).push(g)}let P=o.map(g=>{let _=i.get(g),K=l?.get(g)??null,ee=Bt(_),H=v(g)??"__own__",J=Ot(_);return{id:g,file:g,pkg:H,x:0,y:0,deg:0,issue:J,totalIssues:ee,own:_,subtree:K,size:typeof t[g]?.size=="number"?t[g].size:null,severitySet:y?.get(g)??null,colorSet:x?.get(g)??null,findings:h?.get(g)??null,isHub:!1,label:g.split("/").pop()??g}}),L=new Map(P.map(g=>[g.file,g])),d=new Map;for(let g of o)for(let _ of e.get(g)??[]){let[K,ee]=g<_?[g,_]:[_,g],H=`${K}\0${ee}`,J=d.get(H);if(!J){let T=L.get(K),B=L.get(ee);if(!T||!B)continue;J={a:K,b:ee,cross:T.pkg!==B.pkg,fromLo:!1,fromHi:!1},d.set(H,J),T.deg++,B.deg++}g===K?J.fromLo=!0:J.fromHi=!0}let N=[...d.values()],a=new Map;for(let g=0;g<N.length;g++){let _=N[g];a.has(_.a)||a.set(_.a,[]),a.has(_.b)||a.set(_.b,[]),a.get(_.a).push(g),a.get(_.b).push(g)}let u=new Map;for(let g of P)u.set(g.pkg,(u.get(g.pkg)??0)+1);let F=[...u.entries()].toSorted((g,_)=>_[1]-g[1]).map(([g])=>g),I=new Map;for(let g of P)I.has(g.pkg)||I.set(g.pkg,[]),I.get(g.pkg).push(g);let W={files:o,nodes:P,nodeByFile:L,edges:N,adj:a,importsOf:e,importedBy:R,packages:F,pkgCount:u,byPkg:I};return uo(W),W}function uo(t){for(let o of t.nodes)o.isHub=!1;for(let o of t.edges)o.cross&&(o.fromLo&&(t.nodeByFile.get(o.b).isHub=!0),o.fromHi&&(t.nodeByFile.get(o.a).isHub=!0));for(let o of t.nodes){let i=t.importedBy.get(o.file);(!i||i.length===0)&&(o.isHub=!0)}}function Dt(t){let o=t.packages.map(c=>{let v=t.byPkg.get(c)??[],$={};for(let a of ke)$[a]=0;let e=new Set,R=new Set,P=[],L=0,d=0,N=!1;for(let a of v){if(L+=a.totalIssues,a.own)for(let u of ke)$[u]+=a.own[u]??0;if(a.severitySet)for(let u of a.severitySet)e.add(u);if(a.colorSet)for(let u of a.colorSet)R.add(u);typeof a.size=="number"&&(d+=a.size,N=!0),P.push(a.file)}return{file:c,pkg:c,label:c==="__own__"?"own source":c,fileCount:v.length,size:N?d:null,own:$,totalIssues:L,issue:Ot($),severitySet:e.size>0?e:null,colorSet:R.size>0?R:null,pathText:P.join(`
|
|
5
|
+
`).toLowerCase(),isHub:!0,x:0,y:0,deg:0}}),i=new Map(o.map(c=>[c.pkg,c])),l=new Map;for(let c of t.edges){if(!c.cross)continue;let v=t.nodeByFile.get(c.a)?.pkg,$=t.nodeByFile.get(c.b)?.pkg;if(!v||!$||v===$)continue;let[e,R]=v<$?[v,$]:[$,v],P=`${e}\0${R}`,L=l.get(P);L||(L={a:e,b:R,cross:!0,count:0,fromLo:!1,fromHi:!1},l.set(P,L),i.get(e).deg++,i.get(R).deg++),L.count++;let d=v===e;c.fromLo&&(d?L.fromLo=!0:L.fromHi=!0),c.fromHi&&(d?L.fromHi=!0:L.fromLo=!0)}let y=[...l.values()],x=new Map;for(let c=0;c<y.length;c++){let v=y[c];x.has(v.a)||x.set(v.a,[]),x.has(v.b)||x.set(v.b,[]),x.get(v.a).push(c),x.get(v.b).push(c)}let h=new Map(o.map(c=>[c.pkg,[]]));for(let c of y)c.fromLo&&h.get(c.a).push(c.b),c.fromHi&&h.get(c.b).push(c.a);return{nodes:o,byPkg:i,nodeByFile:i,edges:y,adj:x,importsOf:h}}function ft(t,o){if(!o||o==="/"||o==="__own__")return t;for(let i of["node_modules","dependencies",dt()]){let l=i+"/"+o+"/",y=t.indexOf(l);if(y>=0)return t.slice(y+l.length)}return t.startsWith(o+"/")?t.slice(o.length+1):t}function jt(t,o){let i=o.extraTopRow,l=o.hideAllFiles??!1,y=o.triageCounts??{inprogress:0,fixed:0,invalid:0,deleted:0},x=o.triageStates??["inprogress","fixed","invalid","deleted"],h={};for(let u of ke)h[u]=0;for(let u of t.nodes)if(u.severitySet)for(let F of u.severitySet)h[F]!==void 0&&h[F]++;let c=ke.some(u=>h[u]>0||k.selectedSeverities.has(u)),v=["none","red","blue","green","gray"],$={none:0,red:0,blue:0,green:0,gray:0};for(let u of t.nodes)if(u.colorSet)for(let F of u.colorSet)$[F]!==void 0&&$[F]++;let e=v.some(u=>$[u]>0||k.selectedColors.has(u)),R=q`<triage-selector variant="graph" .counts="${y}" .states="${x}"></triage-selector>`,P=l?null:q`<button type="button" class="${Ce({"g2-topbar-toggle":!0,on:k.showAll})}" data-g2-show-all aria-pressed="${String(k.showAll)}"><span>All files</span><span class="g2-switch"></span></button>`,d=o.showSplitOwnDirs??!1?q`<button type="button" class="${Ce({"g2-topbar-toggle":!0,on:k.splitOwnDirs})}" data-g2-split-own aria-pressed="${String(k.splitOwnDirs)}" title="Split your own source into a group per top-level directory (off: one 'own source' group)"><span>Split dirs</span><span class="g2-switch"></span></button>`:null,a=o.showPackagesView??!1?q`<button type="button" class="${Ce({"g2-topbar-toggle":!0,on:k.packagesView})}" data-g2-packages-view aria-pressed="${String(k.packagesView)}" title="Show one node per package with aggregated import edges (off: one node per file)"><span>Packages</span><span class="g2-switch"></span></button>`:null;return q`<div class="graph2-topbar">${i?q`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${i} ${P} ${d} ${a}<div class="g2-spacer"></div>${R}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${c?q`<severity-chips .counts="${h}" .selected="${[...k.selectedSeverities]}" kind="graph"></severity-chips>`:null} ${e?q`<triage-filter .counts="${$}" .selected="${[...k.selectedColors]}" kind="graph"></triage-filter>`:null}<div class="toolbar-search g2-path-filter-wrap"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="text" class="g2-path-filter" id="g2-path-filter" placeholder="filter path/package…" .value="${k.pathFilter}"> <button type="button" class="g2-path-filter-clear" id="g2-path-filter-clear" title="Clear filter" aria-label="Clear filter">✕</button></div>${i?null:P} ${i?null:d} ${i?null:a}<div class="g2-spacer"></div>${i?null:R} <button type="button" class="g2-icon-btn" id="g2-fullscreen" title="Toggle fullscreen">⛶</button></div></div>`}function fo(t,o){let i=t.split("/").filter(Boolean),l=o.split("/").filter(Boolean),y=0;for(;y<i.length&&y<l.length&&i[y]===l[y];)y++;let x=i.length-y,h=l.slice(y).join("/");return x===0?"./"+h:"../".repeat(x)+h}function po(t,o){if(!o&&o!=="")return t;let i=fo(o,t);return i.length<t.length?i:t}function mt(t,o,i,l){let y=i.length;if(y===0)return q`<div class="g2-sel-section"><div class="g2-sel-section-label">${o} (${y})</div><div class="g2-sel-section-empty">none</div></div>`;let x=i.map(h=>({file:h,display:po(h,l)}));return x.sort((h,c)=>h.display.localeCompare(c.display)),q`<div class="g2-sel-section"><div class="g2-sel-section-label">${o} (${y})</div><ul class="g2-sel-file-list">${x.map(({file:h,display:c})=>{let v=t.nodeByFile.get(h),$=v?ne(v.pkg):"#666";return q`<li><button type="button" class="g2-sel-file-link" data-g2-select="${h}" title="${h}"><span class="g2-sel-file-dot" style="${Qe({background:$})}"></span> <span class="g2-sel-file-path">${c}</span></button></li>`})}</ul></div>`}function tt(t){if(!t)return q`<div class="g2-sel-section-empty">none</div>`;let i=["critical","high","medium","low","high_bug","bug","informational"].filter(l=>(t[l]??0)>0);return i.length===0?q`<div class="g2-sel-section-empty">none</div>`:q`<div class="tree-count-chips">${i.map(l=>q`<span class="${`tree-count-chip ${l}`}">${t[l]} ${l.replaceAll("_"," ")}</span>`)}</div>`}function qt(t){let o=0;for(let h of t.edges)h.cross&&o++;let i=t.edges.length-o,l=0;for(let h of t.nodes)l+=h.totalIssues;let y=t.nodes.length===0?"0.0":(t.edges.length*2/t.nodes.length).toFixed(1),x=k.focusedPkg==="__own__"?"own source":k.focusedPkg;return q`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${k.focusedPkg?q`<div class="g2-stage-overlay"><button type="button" class="g2-back-btn" id="g2-back-to-full" title="Back to the full graph">← ${x}</button></div>`:null}<div id="g2-focus-overlay-slot" class="g2-stage-overlay-tr"></div><div class="g2-stage-stats"><span><b>${t.nodes.length}</b> files</span> <span><b>${t.packages.length}</b> packages</span> <span><b>${t.edges.length}</b> edges (${i} intra · ${o} cross)</span> <span><b>${l}</b> issues</span> <span>avg degree <b>${y}</b></span></div><div class="g2-zoom-ctrl"><button id="g2-zoom-in" title="Zoom in">+</button><div class="g2-zoom-pct" id="g2-zoom-pct">100%</div><button id="g2-zoom-out" title="Zoom out">−</button> <button id="g2-zoom-fit" class="g2-zoom-fit-btn" title="Fit to view">fit</button></div><div class="g2-tooltip" id="g2-tooltip"></div></main>`}function Vt(t){let o=null;if(k.selected){let l=t.nodeByFile.get(k.selected);l&&(o=l.pkg)}else k.solo&&(o=k.solo);return!o||(t.pkgCount.get(o)??0)<=1||k.focusedPkg===o?null:q`<button type="button" class="g2-focus-pkg-btn" data-g2-focus-pkg="${o}" title="${`Focus on ${o==="__own__"?"own source":o}'s graph`}"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 4.6 L4 11 M8 4.6 L12 11 M5 11.4 L11 11.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/><circle cx="8" cy="3.6" r="2" fill="currentColor"/><circle cx="3.6" cy="11.4" r="2" fill="currentColor"/><circle cx="12.4" cy="11.4" r="2" fill="currentColor"/></svg></button>`}function Gt(){return q`<aside class="graph2-right"><div class="g2-panel-title">Selection</div><div id="g2-selection-area"></div><div id="g2-top-pkgs-block"></div></aside>`}function Ut(t){let o=k.showAll&&t.nodes.length>0&&t.nodes.every(y=>typeof y.size=="number"),i=t.nodes.some(y=>y.totalIssues>0),l=k.topPkgsTab;return l==="size"&&!o&&(l="files"),l==="issues"&&!i&&(l="files"),q`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${i?q`<button type="button" class="${Ce({"g2-mini-tab":!0,on:l==="issues"})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${Ce({"g2-mini-tab":!0,on:l==="files"})}" data-g2-top-pkgs="files">Files</button> ${o?q`<button type="button" class="${Ce({"g2-mini-tab":!0,on:l==="size"})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${bo(t,l)}`}function Wt(t,o={}){let i=k.selected;if(i){let l=t.nodeByFile.get(i);return l?go(t,l,i,o):q`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return k.solo?ho(t,k.solo):q`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function go(t,o,i,l){let y=ne(o.pkg),x=o.pkg==="__own__"?"own source":o.pkg,h=ft(i,o.pkg),c=t.importedBy.get(i)??[],v=t.importsOf.get(i)??[],$=i.lastIndexOf("/"),e=$>=0?i.slice(0,$):"";return q`<div class="g2-selection-card"><div class="g2-sel-file-head"><div class="g2-sel-path">${h}</div><div class="g2-sel-pkg-row"><span class="g2-sel-dot" style="${Qe({"--dot":y,background:y})}"></span> <span class="g2-sel-pkg">${x}</span></div></div><div class="g2-sel-fullpath" title="${i}">${i}</div>${et(o.size)?q`<div class="g2-sel-size">${et(o.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${tt(o.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${tt(o.subtree)}</div><div class="g2-sel-jumps">${o.totalIssues>0?q`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${i}">Findings →</button>`:null} ${l.isBundleContext?o.origFile?q`<button type="button" class="g2-sel-jump" data-bundle-view-source="${o.origFile}">View source →</button>`:null:q`<button type="button" class="g2-sel-jump" data-g2-jump-file="${i}">Files →</button>`}</div>${mt(t,"Imported by",c,e)} ${mt(t,"Imports",v,e)}</div>`}function ho(t,o){let i=t.nodes.filter(R=>R.pkg===o),l=i.length;if(l===0)return q`<div class="g2-empty-state"><strong>Package has no files in view</strong> Toggle "All files" to widen the file set, or pick another package.</div>`;let y=ne(o),x=o==="__own__"?"own source":o,h={};for(let R of ke)h[R]=0;for(let R of i)if(R.own)for(let P of ke)h[P]+=R.own[P]??0;let c=0,v=0;for(let R of t.edges){let P=t.nodeByFile.get(R.a),L=t.nodeByFile.get(R.b);!P||!L||(P.pkg===o&&L.pkg===o?v++:(P.pkg===o||L.pkg===o)&&c++)}let $=0;for(let R of i)R.isHub&&$++;let e=new Set;for(let R of i)for(let P of t.importedBy.get(R.file)??[]){let L=t.nodeByFile.get(P);L&&L.pkg!==o&&e.add(P)}return q`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${Qe({"--dot":y,background:y})}"></span> <span class="g2-sel-id">${x}</span> <span class="g2-sel-grp">package</span></div><div class="g2-sel-body"><div class="g2-sel-row"><span class="k">Files</span><span class="v">${l}</span></div><div class="g2-sel-row"><span class="k">Hubs</span><span class="v">${$}</span></div><div class="g2-sel-row"><span class="k">Intra edges</span><span class="v">${v}</span></div><div class="g2-sel-row"><span class="k">Cross edges</span><span class="v">${c}</span></div></div><div class="g2-sel-section"><div class="g2-sel-section-label">Findings</div>${tt(h)}</div>${mt(t,"Imported by",[...e])}</div>`}function bo(t,o){let i=t.nodes.length||1,l=o??k.topPkgsTab,y=k.selectedSeverities,x=k.selectedColors,h=y.size>0,c=x.size>0,v=h||c,$=new Map,e=new Map,R=0,P=0;for(let a of t.nodes){let u;if(v){if(u=0,a.findings)for(let F of a.findings)h&&!y.has(F.severity)||c&&!x.has(F.color)||u++}else u=a.totalIssues;$.set(a.pkg,($.get(a.pkg)??0)+u),R+=u,typeof a.size=="number"&&(e.set(a.pkg,(e.get(a.pkg)??0)+a.size),P+=a.size)}let L;l==="issues"?L=t.packages.filter(a=>($.get(a)??0)>0).toSorted((a,u)=>{let F=$.get(a)??0,I=$.get(u)??0;return I!==F?I-F:(t.pkgCount.get(u)??0)-(t.pkgCount.get(a)??0)}):l==="size"?L=t.packages.filter(a=>(e.get(a)??0)>0).toSorted((a,u)=>{let F=e.get(a)??0,I=e.get(u)??0;return I!==F?I-F:(t.pkgCount.get(u)??0)-(t.pkgCount.get(a)??0)}):L=[...t.packages].toSorted((a,u)=>{let F=t.pkgCount.get(a)??0,I=t.pkgCount.get(u)??0;return I!==F?I-F:($.get(u)??0)-($.get(a)??0)});let d=a=>l==="issues"?R>0?(($.get(a)??0)/R*100).toFixed(2):"0":l==="size"?P>0?((e.get(a)??0)/P*100).toFixed(2):"0":(t.pkgCount.get(a)/i*100).toFixed(2),N=l==="issues"?"No packages with issues":l==="size"?"No packages with size":"No packages";return q`<div class="g2-dist-bar">${t.packages.map(a=>{let u=ne(a);return q`<span style="${Qe({background:u,width:`${d(a)}%`})}"></span>`})}</div><div class="g2-dist-list">${L.length===0?q`<div class="g2-dist-empty">${N}</div>`:null} ${Et(L,a=>a,a=>{let u=ne(a),F=t.pkgCount.get(a)??0,I=$.get(a)??0,W=e.get(a)??0,g=l==="issues"?I:l==="size"?et(W):F,_=l==="issues"?R>0?(I/R*100).toFixed(1):"0.0":l==="size"?P>0?(W/P*100).toFixed(1):"0.0":(F/i*100).toFixed(1),K=a==="__own__"?"own source":a,ee=k.solo===a;return q`<button type="button" class="${Ce({"g2-dist-item":!0,on:ee})}" data-g2-pkg="${a}" title="${K}"><span class="g2-dist-dot" style="${Qe({background:u})}"></span><span class="g2-dist-name">${K}</span><span class="g2-dist-count">${g}</span><span class="g2-dist-pct">${_}%</span></button>`})}</div>`}var xt=class extends Lt{static properties={graph:{attribute:!1},options:{attribute:!1}};static styles=[ct(Ft),ct(At),ct(It)];constructor(){super(),this.graph=null,this.options={}}render(){return this.graph?q`<div class="graph2-layout">${jt(this.graph,this.options)} ${qt(this.graph)} ${Gt()}</div>`:q``}};customElements.define("graph-layout",xt);function mo(t){let o=new Map;for(let[i,l]of t.importsOf){let y=t.nodeByFile.get(i);if(y)for(let x of l){let h=t.nodeByFile.get(x);h&&y.pkg!==h.pkg&&(o.set(y.pkg,(o.get(y.pkg)??0)+1),o.set(h.pkg,(o.get(h.pkg)??0)+1))}}return o}function xo(t){if(t.packages.length===0)return null;let o=new Set;for(let[i,l]of t.importedBy){let y=t.nodeByFile.get(i);if(y)for(let x of l){let h=t.nodeByFile.get(x);if(h&&h.pkg!==y.pkg){o.add(y.pkg);break}}}for(let i of t.packages)if(!o.has(i))return i;return null}var vo=5;function Kt(t,o){let i=new Map;for(let x of t.nodes)o.has(x.pkg)&&(i.has(x.pkg)||i.set(x.pkg,[]),i.get(x.pkg).push(x));for(let x of i.values())x.sort((h,c)=>h.isHub!==c.isHub?h.isHub?-1:1:c.deg-h.deg);let l=new Map,y=new Map;for(let[x,h]of o){let c=i.get(x);if(!c||c.length===0)continue;let v=c.length,$=0;for(let u of c)if(u.isHub)$++;else break;let e=$>0&&$<=vo,R=e?$:0,P=v-R,L=h.groupR,d=Array.from({length:v}),N=Array.from({length:v});for(let u=0;u<v;u++){let F=u*137.508*Math.PI/180,I;if(u<R)I=R<=1?0:Math.sqrt(u/(R-1))*.3*L;else{let W=u-R;I=P<=1?.4*L:(.4+Math.sqrt(W/(P-1))*.6)*L}d[u]=h.x+Math.cos(F)*I,N[u]=h.y+Math.sin(F)*I}let a=Array.from({length:v},()=>!1);for(let u=0;u<v;u++){let F=c[u],I,W;e&&F.isHub?(W=0,I=R):e?(W=R,I=v):(W=0,I=v);let g=0,_=0,K=0,ee=t.importsOf.get(F.file);if(ee)for(let B of ee){let A=l.get(B);A!==void 0&&(g+=A,_+=y.get(B),K++)}let H=t.importedBy.get(F.file);if(H)for(let B of H){let A=l.get(B);A!==void 0&&(g+=A,_+=y.get(B),K++)}let J=!1;if(K>0){g/=K,_/=K;let B=g-h.x,A=_-h.y;B*B+A*A>1&&(J=!0)}let T=-1;if(J){let B=1/0;for(let A=W;A<I;A++){if(a[A])continue;let f=d[A]-g,E=N[A]-_,U=f*f+E*E;U<B&&(B=U,T=A)}}else for(let B=W;B<I;B++)if(!a[B]){T=B;break}a[T]=!0,F.x=d[T],F.y=N[T],l.set(F.file,F.x),y.set(F.file,F.y)}}}function Yt(t,o,i){let l=o/2,y=i/2,x=Math.min(o,i)/2;if(t.packages.length===0)return;let c=xo(t),v=mo(t),$=(c?t.packages.filter(f=>f!==c):[...t.packages]).toSorted((f,E)=>{let U=(v.get(E)??0)-(v.get(f)??0);return U!==0?U:(t.pkgCount.get(E)??0)-(t.pkgCount.get(f)??0)}),e=$.length,R;e<=0?R=0:e<=6?R=.65:e<=20?R=.82:R=.95;let P=Math.max(1,Math.sqrt(50/Math.max(1,e))),L=.22,d=.12,N=.04,a=new Map,u;if(c){let f=t.pkgCount.get(c)??0,E=Math.min(L,(.012+Math.sqrt(f)*.004)*P);u=Math.max(e<=6?.4:e<=20?.36:.34,E+d+N),a.set(c,{x:l,y,size:f,groupR:E*x})}else e<=1?u=0:e<=6?u=.4:e<=20?u=.32:u=.3;if(e===0){Kt(t,a);return}let F=new Map;for(let f of t.edges){if(!f.cross)continue;let E=t.nodeByFile.get(f.a)?.pkg,U=t.nodeByFile.get(f.b)?.pkg;if(!E||!U||E===U)continue;F.has(E)||F.set(E,new Map),F.has(U)||F.set(U,new Map);let te=F.get(E),re=F.get(U);te.set(U,(te.get(U)??0)+1),re.set(E,(re.get(E)??0)+1)}let I=Math.max(1,Math.min(10,Math.round(Math.sqrt(e)/1.2))),W=Array.from({length:I+1});for(let f=0;f<=I;f++)W[f]=Math.floor(f*f/(I*I)*e);W[I]=e;let g=.2,_=Array.from({length:I}),K=Array.from({length:I});for(let f=0;f<I;f++){let E=W[f],U=W[f+1];_[f]=U-E;let te=0;for(let re=E;re<U;re++)te+=t.pkgCount.get($[re])??0;K[f]=te}let ee=Array.from({length:I});for(let f=0;f<I;f++){let E=(W[f]+W[f+1]-1)/2/Math.max(1,e-1);ee[f]=Math.sqrt(Math.max(0,E))}let H=Array.from({length:I});H[0]=ee[0];for(let f=1;f<I;f++){let E=_[f-1],U=K[f-1],te=E>0?U/E:1,re=1+g*Math.sqrt(Math.max(0,te-1));H[f]=H[f-1]+(ee[f]-ee[f-1])*re}let J=Array.from({length:I});for(let f=0;f<I;f++)J[f]=H[f]-ee[f];let T=Array.from({length:e}),B=Array.from({length:e}),A=0;for(let f=0;f<e;f++){for(;A<I-1&&f>=W[A+1];)A++;let E=f*137.508%360*Math.PI/180,te=(e<=1?0:Math.sqrt(f/(e-1)))+J[A],re=e===1?c?u:0:u+te*(R-u);T[f]=l+Math.cos(E)*re*x,B[f]=y+Math.sin(E)*re*x}for(let f=0;f<I;f++){let E=W[f],U=W[f+1],te=U-E;if(te===0)continue;let re=Array.from({length:te},()=>!1);for(let Pe=E;Pe<U;Pe++){let Le=$[Pe],ue=F.get(Le),Ue=0,We=0,Ke=0;if(ue)for(let[fe,se]of ue){let me=a.get(fe);me&&(Ue+=me.x*se,We+=me.y*se,Ke+=se)}let we=!1;if(Ke>0){Ue/=Ke,We/=Ke;let fe=Ue-l,se=We-y;fe*fe+se*se>1&&(we=!0)}let Ye=-1;if(we){let fe=1/0;for(let se=0;se<te;se++){if(re[se])continue;let me=E+se,Re=T[me]-Ue,Xe=B[me]-We,nt=Re*Re+Xe*Xe;nt<fe&&(fe=nt,Ye=se)}}else for(let fe=0;fe<te;fe++)if(!re[fe]){Ye=fe;break}re[Ye]=!0;let ot=E+Ye,st=t.pkgCount.get(Le)??0,pt=Math.min(d,(.012+Math.sqrt(st)*.004)*P);a.set(Le,{x:T[ot],y:B[ot],size:st,groupR:pt*x})}}Kt(t,a)}function vt(t,o,i){let l=o/2,y=i/2,x=Math.min(o,i)/2,h=t.nodes.length;if(h===0)return;let c=[...t.nodes].toSorted((v,$)=>$.deg-v.deg);for(let v=0;v<h;v++){let $=c[v],e=v*137.508%360*Math.PI/180,R=h<=1?0:Math.sqrt(v/(h-1));$.x=l+Math.cos(e)*R*.85*x,$.y=y+Math.sin(e)*R*.85*x}}function yt(t,o,i,l,{groupOf:y=ut}={}){let x=t.length,h=l||760,c=i||1100,v=Math.sqrt(c*h/Math.max(x,1))*1.1,$=g=>{let _=0;for(let K of g)_=_*31+K.codePointAt(0)|0;return _},e=Math.ceil(Math.sqrt(x*c/h)),R=Math.ceil(x/e),P=h/(R+1),L=c/(e+1),d=t.map((g,_)=>{let K=_%e,ee=Math.floor(_/e),H=$(g);return{file:g,x:(K+1)*L+(H%100-50)*L*.4,y:(ee+1)*P+((H>>7)%100-50)*P*.4,dx:0,dy:0}}),N=new Map(d.map((g,_)=>[g.file,_])),a=[];for(let g of t)for(let _ of o.get(g)??[])N.has(_)&&a.push([N.get(g),N.get(_)]);let u=new Map;for(let g=0;g<x;g++){let _=y(d[g].file)??"__own__";u.has(_)||u.set(_,[]),u.get(_).push(g)}let F=Math.min(500,Math.max(180,100+x*3)),I=Math.min(c,h)/6,W=.3;for(let g=0;g<F;g++){let _=I*Math.pow(W/I,g/F);for(let H of d)H.dx=0,H.dy=0;for(let H=0;H<x;H++)for(let J=H+1;J<x;J++){let T=d[H],B=d[J],A=T.x-B.x,f=T.y-B.y,E=Math.sqrt(A*A+f*f);if(E<.01){let te=$(T.file+B.file);A=(te%100-50)*.01||.5,f=((te>>7)%100-50)*.01||.5,E=Math.sqrt(A*A+f*f)}let U=v*v/E;T.dx+=A/E*U,T.dy+=f/E*U,B.dx-=A/E*U,B.dy-=f/E*U}for(let[H,J]of a){let T=d[H],B=d[J],A=T.x-B.x,f=T.y-B.y,E=Math.sqrt(A*A+f*f)||.01,U=E*E/v;T.dx-=A/E*U,T.dy-=f/E*U,B.dx+=A/E*U,B.dy+=f/E*U}let K=.055*Math.min(1,_/(I*.3));for(let[,H]of u){if(H.length<2)continue;let J=0,T=0;for(let B of H)J+=d[B].x,T+=d[B].y;J/=H.length,T/=H.length;for(let B of H)d[B].dx+=(J-d[B].x)*K,d[B].dy+=(T-d[B].y)*K}let ee=50;for(let H of d){let J=Math.sqrt(H.dx*H.dx+H.dy*H.dy)||.01;H.x+=H.dx/J*Math.min(J,_),H.y+=H.dy/J*Math.min(J,_),H.x=Math.max(ee,Math.min(c-ee,H.x)),H.y=Math.max(ee,Math.min(h-ee,H.y))}}return d}var kt={critical:"#ff5470",high:"#ff9d4a",medium:"#f4d35e",low:"#67c2ff",high_bug:"#a06c3f",bug:"#7a6d62",informational:"#218bff"},wt={dark:{bg:"#0c0c0c",grid:"rgba(255, 255, 255, 0.022)",selectRing:"#ffffff",edgeIntra:"rgba(180, 195, 215, ALPHA)",hubRing:"rgba(255, 255, 255, ALPHA)",labelFill:"rgba(230, 233, 238, 0.78)",labelShadow:"rgba(12, 12, 12, 0.98)",labelOutline:"rgba(12, 12, 12, 0.9)",labelDefault:"rgba(200, 210, 225, 0.78)",labelHover:"rgba(230, 237, 243, 0.95)",labelSelected:"#fff"},light:{bg:"#f6f8fa",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"},pink:{bg:"#fff0f7",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"}};function yo(){let t=document.body.classList;return t.contains("theme-pink")?wt.pink:t.contains("theme-light")?wt.light:wt.dark}function be(t){return Math.max(0,Math.min(255,Math.round(t*255))).toString(16).padStart(2,"0")}function ko(t,o,i,l){let x=t.querySelector("graph-layout")?.shadowRoot;if(!x)return;let h=x.querySelector("#g2-canvas"),c=x.querySelector("#g2-tooltip"),v=x.querySelector(".graph2-stage"),$=x.querySelector("#g2-zoom-pct");if(!h)return;Ht();let e=h.getContext("2d"),R=window.devicePixelRatio||1,P=0,L=0,d={tx:0,ty:0,k:1},N=null,a=0,u=0,F=!0,I=!0,W=()=>k.packagesView&&(o.canPackagesView??!1)&&!k.focusedPkg,g=null;function _(){return g||(g=Dt(o)),g}function K(r,b,p){if(r.nodes.length>50){vt(r,b,p);return}let w=yt(r.nodes.map(S=>S.pkg),r.importsOf,b,p,{groupOf:S=>S}),m=new Map(w.map(S=>[S.file,S]));for(let S of r.nodes){let M=m.get(S.pkg);M&&(S.x=M.x,S.y=M.y)}}function ee(){if(!F)return;let r=k.layoutCache,b=k.focusedPkg,p=W(),w=p?_().nodes:o.nodes;if(r&&r.files===o.files&&r.w===u&&r.h===a&&r.focused===b&&(r.pkgView??!1)===p)for(let m of w){let S=r.pos.get(m.file);S&&(m.x=S.x,m.y=S.y)}else{if(p)K(_(),u,a);else if(b)if(o.nodes.length>50)vt(o,u,a);else{let S=yt(o.files,o.importsOf,u,a),M=new Map(S.map(G=>[G.file,G]));for(let G of o.nodes){let V=M.get(G.file);V&&(G.x=V.x,G.y=V.y)}}else Yt(o,u,a);let m=new Map;for(let S of w)m.set(S.file,{x:S.x,y:S.y});k.layoutCache={files:o.files,w:u,h:a,pos:m,focused:b,pkgView:p}}F=!1}function H(){let r=W()?_().nodes:o.nodes;if(r.length===0)return{k:1,tx:L/2,ty:P/2};let b=-1/0,p=-1/0,w=1/0,m=1/0;for(let s of r)s.x<w&&(w=s.x),s.y<m&&(m=s.y),s.x>b&&(b=s.x),s.y>p&&(p=s.y);let S=Math.max(20,p-m),M=Math.max(20,b-w),G=(w+b)/2,V=(m+p)/2,D=Math.min(L,P)*.1,Y=Math.min((L-D*2)/M,(P-D*2)/S,4),n=Math.max(.05,Y);return{k:n,tx:L/2-G*n,ty:P/2-V*n}}function J(){let r=H();d.k=r.k,d.tx=r.tx,d.ty=r.ty}function T(r,b){return[r*d.k+d.tx,b*d.k+d.ty]}function B(r,b){return[(r-d.tx)/d.k,(b-d.ty)/d.k]}function A(r){return!k.hidden.has(r.pkg)}function f(r){if(k.selectedSeverities.size>0){let p=r.severitySet;if(!p)return!0;let w=!1;for(let m of k.selectedSeverities)if(p.has(m)){w=!0;break}if(!w)return!0}if(k.selectedColors.size>0){let p=r.colorSet;if(!p)return!0;let w=!1;for(let m of k.selectedColors)if(p.has(m)){w=!0;break}if(!w)return!0}if(k.solo&&r.pkg!==k.solo&&!W())return!0;let b=k.pathFilter;if(b){let p=b.toLowerCase(),w=r.pathText?r.pathText.includes(p):r.file.toLowerCase().includes(p),m=r.pkg&&r.pkg.toLowerCase().includes(p),S=r.label&&r.label.toLowerCase().includes(p);if(!w&&!m&&!S)return!0}return!1}function E(r){let b=(r.isHub?4.9:3.5)*k.nodeSize,p=Math.max(.6,Math.min(1.6,d.k));return b*p}function U(){let r=v.getBoundingClientRect(),b=P,p=L;L=Math.max(80,r.width),P=Math.max(80,r.height),R=window.devicePixelRatio||1,h.width=L*R,h.height=P*R,h.style.width=L+"px",h.style.height=P+"px",e.setTransform(R,0,0,R,0,0),(u===0||a===0)&&(u=L,a=P,F=!0),ee();let w=p>0&&(Math.abs(L-p)/p>.15||Math.abs(P-b)/b>.15);(I||w)&&(J(),I=!1),ue()}let te=null,re=!0,Pe=!1,Le=!1;function ue(){re=!0,!(Pe||Le)&&(Pe=!0,te=requestAnimationFrame(()=>{Pe=!1,re&&!Le&&(re=!1,Ue())}))}function Ue(){let r=yo();e.fillStyle=r.bg,e.fillRect(0,0,L,P),We(r);let b=W(),p=b?_():o,w=b?k.solo:k.selected,m=w?p.nodeByFile.get(w):null,S=m?w:null;if(b&&p.nodes.length<=50){Ye(r);return}if(k.focusedPkg&&p.nodes.length<=50){Ke(r,S,m);return}for(let M of p.edges){let G=p.nodeByFile.get(M.a),V=p.nodeByFile.get(M.b);if(!G||!V||!A(G)||!A(V))continue;let D=k.edgeOpacity;S?D=M.a===S||M.b===S?.85:k.edgeOpacity*.25:N&&(M.a===N||M.b===N)&&(D=Math.min(.9,D+.5)),f(G)&&f(V)&&(D=Math.min(D,.04));let[Y,n]=T(G.x,G.y),[s,C]=T(V.x,V.y);if(M.cross){let O=e.createLinearGradient(Y,n,s,C);O.addColorStop(0,ne(G.pkg)+be(D)),O.addColorStop(1,ne(V.pkg)+be(D)),e.strokeStyle=O,e.lineWidth=.85}else e.strokeStyle=r.edgeIntra.replace("ALPHA",String(D*.7)),e.lineWidth=.55;e.beginPath(),e.moveTo(Y,n),e.lineTo(s,C),e.stroke()}for(let M of p.nodes){if(!A(M))continue;let G=M.file===N,V=M.file===S;if(!M.isHub&&!G&&!V||f(M)&&!G&&!V)continue;let[D,Y]=T(M.x,M.y),s=E(M)*(V?6:G?4.5:3),C=e.createRadialGradient(D,Y,0,D,Y,s),O=ne(M.pkg);C.addColorStop(0,O+"55"),C.addColorStop(1,O+"00"),e.fillStyle=C,e.beginPath(),e.arc(D,Y,s,0,Math.PI*2),e.fill()}for(let M of p.nodes){if(!A(M))continue;let[G,V]=T(M.x,M.y),D=E(M),Y=1,n=S&&M.file===S;if(S&&!n&&(Y=(p.adj.get(S)??[]).some(C=>{let O=p.edges[C];return O.a===M.file||O.b===M.file})?1:.25),!n&&f(M)&&(Y=Math.min(Y,.1)),e.fillStyle=ne(M.pkg)+be(Y),e.beginPath(),e.arc(G,V,D,0,Math.PI*2),e.fill(),M.isHub&&(e.strokeStyle=r.hubRing.replace("ALPHA",String(.55*Y)),e.lineWidth=.8,e.stroke()),M.issue){let s=kt[M.issue],C=D+(M.issue==="critical"?4.2:M.issue==="high"?3.4:2.8),O=M.issue==="critical"?1.8:M.issue==="high"?1.5:M.issue==="medium"?1.3:1.1;e.strokeStyle=s,e.globalAlpha=Y,e.lineWidth=O,e.beginPath(),e.arc(G,V,C,0,Math.PI*2),e.stroke(),e.globalAlpha=1}}if(d.k>1.4){let G=0;if(d.k<9&&!k.showLabels)for(let D of p.nodes){if(!A(D))continue;let[Y,n]=T(D.x,D.y);if(!(Y<0||Y>L||n<0||n>P)&&(G++,G>=50))break}let V=d.k>=9||G<50;if(k.showLabels||V){e.font="10px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.fillStyle=r.labelFill,e.textAlign="left",e.textBaseline="middle";let D=11,Y=2,n=250,s=(z,j)=>z>-n&&z<L+n&&j>-n&&j<P+n,C=[];for(let z of p.nodes){if(!A(z))continue;let[j,X]=T(z.x,z.y);if(!s(j,X))continue;let oe=E(z);C.push({file:z.file,x0:j-oe,x1:j+oe,y0:X-oe,y1:X+oe})}let O=[];for(let z of p.nodes){if(!A(z)||!z.isHub&&d.k<2.4)continue;let[j,X]=T(z.x,z.y);if(!s(j,X))continue;let oe=E(z),xe=j+oe+4,Se=X+1,Ee=e.measureText(z.label).width+Y,Ie=z.file===S,Ae=z.file===N,Fe=Ie?3:Ae?2:z.isHub?1:0;O.push({file:z.file,n:z,tx:xe,ty:Se,prio:Fe,x0:xe-Y,x1:xe+Ee,y0:Se-D/2,y1:Se+D/2})}O.sort((z,j)=>j.prio-z.prio);let Q=[],Z=(z,j)=>z.x0<j.x1&&j.x0<z.x1&&z.y0<j.y1&&j.y0<z.y1;for(let z of O){let j=!1;for(let X of C)if(X.file!==z.file&&Z(z,X)){j=!0;break}if(!j){for(let X of Q)if(Z(z,X)){j=!0;break}}j||Q.push(z)}for(let z of Q)e.fillText(z.n.label,z.tx,z.ty)}}if(m&&A(m)){let[M,G]=T(m.x,m.y),V=E(m);e.strokeStyle=r.selectRing,e.lineWidth=1.5,e.beginPath(),e.arc(M,G,V+5,0,Math.PI*2),e.stroke()}$&&($.textContent=`${Math.round(d.k*100)}%`)}function We(r){if(d.k<.4)return;let b=80,p=(d.tx%b+b)%b,w=(d.ty%b+b)%b;e.strokeStyle=r.grid,e.lineWidth=1,e.beginPath();for(let m=p;m<L;m+=b)e.moveTo(m,0),e.lineTo(m,P);for(let m=w;m<P;m+=b)e.moveTo(0,m),e.lineTo(L,m);e.stroke()}function Ke(r,b,p){let w=ne(k.focusedPkg),m=new Set;if(N){m.add(N);for(let n of o.adj.get(N)??[]){let s=o.edges[n];m.add(s.a),m.add(s.b)}}let S=n=>(n.isHub?6:4)*k.nodeSize;for(let n of o.edges){let s=o.nodeByFile.get(n.a),C=o.nodeByFile.get(n.b);if(!s||!C||!A(s)||!A(C))continue;let O=n.fromLo&&n.fromHi,Q=!O&&n.fromHi,Z=Q?C:s,z=Q?s:C,j=N&&(n.a===N||n.b===N),X=b&&(n.a===b||n.b===b),oe=(b||N)&&!j&&!X,xe=S(Z),Se=S(z),[Ee,Ie]=T(Z.x,Z.y),[Ae,Fe]=T(z.x,z.y),He=Ae-Ee,Te=Fe-Ie,Be=Math.sqrt(He*He+Te*Te)||1,Oe=He/Be,Ne=Te/Be,ae=Ee+Oe*(xe+1.5),le=Ie+Ne*(xe+1.5),ce=Ae-Oe*(Se+3.5),de=Fe-Ne*(Se+3.5),rt=Math.min(Be*.15,30),ve=(ae+ce)/2-Ne*rt,ye=(le+de)/2+Oe*rt;e.beginPath(),e.moveTo(ae,le),e.quadraticCurveTo(ve,ye,ce,de);let pe;if(X?pe=.9:j?pe=.85:oe?pe=.05:pe=Math.min(.85,k.edgeOpacity*3),e.strokeStyle=w+be(pe),e.lineWidth=X||j?1.5:.85,e.stroke(),oe)continue;let ge=Math.max(5,7),ie=ge*.42,he=.9,ze=2*(1-he)*(ve-ae)+2*he*(ce-ve),De=2*(1-he)*(ye-le)+2*he*(de-ye),Ze=Math.sqrt(ze*ze+De*De)||1,je=ze/Ze,$e=De/Ze;if(e.beginPath(),e.moveTo(ce,de),e.lineTo(ce-je*ge+$e*ie,de-$e*ge-je*ie),e.lineTo(ce-je*ge-$e*ie,de-$e*ge+je*ie),e.closePath(),e.fillStyle=w+be(Math.min(1,pe+.15)),e.fill(),O){let at=1.8*(ve-ae)+.2*(ce-ve),qe=2*(1-.1)*(ye-le)+2*.1*(de-ye),Je=Math.sqrt(at*at+qe*qe)||1,Ve=at/Je,Me=qe/Je;e.beginPath(),e.moveTo(ae,le),e.lineTo(ae+Ve*ge-Me*ie,le+Me*ge+Ve*ie),e.lineTo(ae+Ve*ge+Me*ie,le+Me*ge-Ve*ie),e.closePath(),e.fill()}}for(let n of o.nodes){if(!A(n))continue;let[s,C]=T(n.x,n.y),O=S(n),Q=n.file===N,Z=n.file===b,z=(b||N)&&!m.has(n.file)&&!Z?.15:1;if(e.globalAlpha=z,Z||Q||n.isHub){let j=O*(Z?4:Q?3:2.4),X=e.createRadialGradient(s,C,O*.6,s,C,j);X.addColorStop(0,w+be(Z?.4:.25)),X.addColorStop(1,w+"00"),e.fillStyle=X,e.beginPath(),e.arc(s,C,j,0,Math.PI*2),e.fill()}if(e.fillStyle=w,e.beginPath(),e.arc(s,C,O,0,Math.PI*2),e.fill(),n.isHub&&(e.strokeStyle=r.hubRing.replace("ALPHA","0.55"),e.lineWidth=.9,e.stroke()),n.issue){let j=kt[n.issue],X=O+(n.issue==="critical"?4.2:n.issue==="high"?3.4:2.8),oe=n.issue==="critical"?1.8:n.issue==="high"?1.5:n.issue==="medium"?1.3:1.1;e.strokeStyle=j,e.lineWidth=oe,e.beginPath(),e.arc(s,C,X,0,Math.PI*2),e.stroke()}e.globalAlpha=1}e.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.textAlign="center",e.textBaseline="top",e.lineJoin="round";let M=13,G=2,V=[];for(let n of o.nodes){if(!A(n))continue;let[s,C]=T(n.x,n.y),O=S(n),Q=C+O+4,Z=e.measureText(n.label).width/2+G,z=n.file===b,j=n.file===N,X=z?3:j?2:n.isHub?1:0;V.push({n,sx:s,ty:Q,halfW:Z,isSel:z,isHov:j,prio:X,x0:s-Z,x1:s+Z,y0:Q,y1:Q+M})}V.sort((n,s)=>s.prio-n.prio);let D=[],Y=(n,s)=>n.x0<s.x1&&s.x0<n.x1&&n.y0<s.y1&&s.y0<n.y1;for(let n of V){let s=!1;for(let C of D)if(Y(n,C)){s=!0;break}s||D.push(n)}for(let n of D){let{n:s,sx:C,ty:O,isSel:Q,isHov:Z}=n,z=(b||N)&&!m.has(s.file)&&!Q?.2:1;e.globalAlpha=z,e.shadowColor=r.labelShadow,e.shadowBlur=4,e.strokeStyle=r.labelOutline,e.lineWidth=3,e.strokeText(s.label,C,O),e.shadowBlur=0,e.fillStyle=Q?r.labelSelected:Z?r.labelHover:r.labelDefault,e.fillText(s.label,C,O),e.globalAlpha=1}if(p&&A(p)){let[n,s]=T(p.x,p.y),C=S(p);e.strokeStyle=r.selectRing,e.lineWidth=1.8,e.beginPath(),e.arc(n,s,C+4,0,Math.PI*2),e.stroke()}$&&($.textContent=`${Math.round(d.k*100)}%`)}function we(r){return Math.min(26,5+Math.sqrt(r.fileCount)*1.7)*k.nodeSize}function Ye(r){let b=_(),p=k.solo&&b.byPkg.has(k.solo)?k.solo:null,w=N??p,m=new Set;if(w){m.add(w);for(let n of b.edges)n.a===w?m.add(n.b):n.b===w&&m.add(n.a)}let S=n=>{if(n.pkg===p||n.pkg===N)return 1;let s=1;return w&&!m.has(n.pkg)&&(s=.2),f(n)&&(s=Math.min(s,.1)),s};for(let n of b.edges){let s=b.byPkg.get(n.a),C=b.byPkg.get(n.b);if(!s||!C||!A(s)||!A(C))continue;let O=n.fromLo&&n.fromHi,Q=!O&&n.fromHi,Z=Q?C:s,z=Q?s:C,j=w!==null&&(n.a===w||n.b===w),X=f(s)&&f(C),oe=w!==null&&!j||X,xe=we(Z),Se=we(z),[Ee,Ie]=T(Z.x,Z.y),[Ae,Fe]=T(z.x,z.y),He=Ae-Ee,Te=Fe-Ie,Be=Math.sqrt(He*He+Te*Te)||1,Oe=He/Be,Ne=Te/Be,ae=Ee+Oe*(xe+1.5),le=Ie+Ne*(xe+1.5),ce=Ae-Oe*(Se+3.5),de=Fe-Ne*(Se+3.5),rt=Math.min(Be*.15,30),ve=(ae+ce)/2-Ne*rt,ye=(le+de)/2+Oe*rt,pe;X?pe=.05:j?pe=.9:oe?pe=.06:pe=.5;let ge=e.createLinearGradient(ae,le,ce,de);if(ge.addColorStop(0,ne(Z.pkg)+be(pe)),ge.addColorStop(1,ne(z.pkg)+be(pe)),e.beginPath(),e.moveTo(ae,le),e.quadraticCurveTo(ve,ye,ce,de),e.strokeStyle=ge,e.lineWidth=Math.min(3.5,.8+Math.sqrt(n.count)*.3)*(j?1.3:1),e.stroke(),oe)continue;let ie=7,he=ie*.42,ze=.9,De=2*(1-ze)*(ve-ae)+2*ze*(ce-ve),Ze=2*(1-ze)*(ye-le)+2*ze*(de-ye),je=Math.sqrt(De*De+Ze*Ze)||1,$e=De/je,it=Ze/je;if(e.beginPath(),e.moveTo(ce,de),e.lineTo(ce-$e*ie+it*he,de-it*ie-$e*he),e.lineTo(ce-$e*ie-it*he,de-it*ie+$e*he),e.closePath(),e.fillStyle=ne(z.pkg)+be(Math.min(1,pe+.15)),e.fill(),O){let qe=1.8*(ve-ae)+.2*(ce-ve),Je=2*(1-.1)*(ye-le)+2*.1*(de-ye),Ve=Math.sqrt(qe*qe+Je*Je)||1,Me=qe/Ve,lt=Je/Ve;e.beginPath(),e.moveTo(ae,le),e.lineTo(ae+Me*ie-lt*he,le+lt*ie+Me*he),e.lineTo(ae+Me*ie+lt*he,le+lt*ie-Me*he),e.closePath(),e.fillStyle=ne(Z.pkg)+be(Math.min(1,pe+.15)),e.fill()}}for(let n of b.nodes){if(!A(n))continue;let[s,C]=T(n.x,n.y),O=we(n),Q=n.pkg===N,Z=n.pkg===p,z=ne(n.pkg),j=S(n);if(Z||Q){let X=O*(Z?2.6:2.2),oe=e.createRadialGradient(s,C,O*.6,s,C,X);oe.addColorStop(0,z+be(Z?.4:.25)),oe.addColorStop(1,z+"00"),e.fillStyle=oe,e.beginPath(),e.arc(s,C,X,0,Math.PI*2),e.fill()}if(e.fillStyle=z+be(j),e.beginPath(),e.arc(s,C,O,0,Math.PI*2),e.fill(),n.issue){let X=kt[n.issue],oe=O+(n.issue==="critical"?4.2:n.issue==="high"?3.4:2.8),xe=n.issue==="critical"?1.8:n.issue==="high"?1.5:n.issue==="medium"?1.3:1.1;e.strokeStyle=X,e.globalAlpha=j,e.lineWidth=xe,e.beginPath(),e.arc(s,C,oe,0,Math.PI*2),e.stroke(),e.globalAlpha=1}}e.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.textAlign="center",e.textBaseline="top",e.lineJoin="round";let M=13,G=2,V=[];for(let n of b.nodes){if(!A(n))continue;let[s,C]=T(n.x,n.y),O=we(n),Q=C+O+4,Z=e.measureText(n.label).width/2+G,z=n.pkg===p,j=n.pkg===N,X=z?1/0:j?1e9:n.fileCount;V.push({p:n,sx:s,ty:Q,isSel:z,isHov:j,prio:X,x0:s-Z,x1:s+Z,y0:Q,y1:Q+M})}V.sort((n,s)=>s.prio-n.prio);let D=[],Y=(n,s)=>n.x0<s.x1&&s.x0<n.x1&&n.y0<s.y1&&s.y0<n.y1;for(let n of V){let s=!1;for(let C of D)if(Y(n,C)){s=!0;break}s||D.push(n)}for(let n of D){let{p:s,sx:C,ty:O,isSel:Q,isHov:Z}=n;e.globalAlpha=Math.max(.25,S(s)),e.shadowColor=r.labelShadow,e.shadowBlur=4,e.strokeStyle=r.labelOutline,e.lineWidth=3,e.strokeText(s.label,C,O),e.shadowBlur=0,e.fillStyle=Q?r.labelSelected:Z?r.labelHover:r.labelDefault,e.fillText(s.label,C,O),e.globalAlpha=1}if(p){let n=b.byPkg.get(p),[s,C]=T(n.x,n.y);e.strokeStyle=r.selectRing,e.lineWidth=1.8,e.beginPath(),e.arc(s,C,we(n)+4,0,Math.PI*2),e.stroke()}$&&($.textContent=`${Math.round(d.k*100)}%`)}function ot(r,b){let p=W(),w=p?_():o,m=p&&w.nodes.length<=50,S=null,M=1/0,G=6;for(let V of w.nodes){if(!A(V))continue;let[D,Y]=T(V.x,V.y),n=D-r,s=Y-b,C=n*n+s*s,O=(m?we(V):E(V))+G;C<O*O&&C<M&&(M=C,S=V)}return S}function st(r,b,p){if(!c)return;let w=ne(r.pkg),m=r.pkg==="__own__"?"own source":r.pkg,S=ft(r.file,r.pkg);Ge(q`<div class="g2-tt-path">${S}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${w}`}"></span> <span class="g2-tt-pkg">${m}</span></div>${r.totalIssues>0?tt(r.own):null}`,c),fe(b,p)}function pt(r,b,p){if(!c)return;let w=ne(r.pkg),m=et(r.size);Ge(q`<div class="g2-tt-path">${r.label}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${w}`}"></span> <span class="g2-tt-pkg">${r.fileCount} ${r.fileCount===1?"file":"files"}${m?` \xB7 ${m}`:""}</span></div>${r.totalIssues>0?tt(r.own):null}`,c),fe(b,p)}function fe(r,b){let p=v.getBoundingClientRect();c.classList.add("show");let w=c.offsetWidth,m=c.offsetHeight,S=r-p.left,M=b-p.top,G=p.width,V=p.height,D=12,Y=S+D;Y+w>G-4&&(Y=S-w-D),Y<4&&(Y=4);let n=M+D;n+m>V-4&&(n=M-m-D),n<4&&(n=4),c.style.left=`${Y}px`,c.style.top=`${n}px`}function se(){c&&c.classList.remove("show")}let me=!1,Re=null,Xe=!1,nt=r=>{r.button===0&&(r.target.closest(".g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl")||(me=!0,Xe=!1,Re={x:r.clientX,y:r.clientY,tx:d.tx,ty:d.ty}))},St=r=>{let b=v.getBoundingClientRect(),p=r.clientX-b.left,w=r.clientY-b.top;if(me){let M=r.clientX-Re.x,G=r.clientY-Re.y;Math.abs(M)+Math.abs(G)>3&&(Xe=!0),d.tx=Re.tx+M,d.ty=Re.ty+G,se(),ue();return}let m=ot(p,w),S=N;N=m?.file??null,h.style.cursor=m?"default":"grab",m?W()?pt(m,r.clientX,r.clientY):st(m,r.clientX,r.clientY):S&&se(),N!==S&&ue()},$t=r=>{if(me&&!Xe){let b=v.getBoundingClientRect(),p=r.clientX-b.left,w=r.clientY-b.top,m=ot(p,w);W()?(k.solo=m&&k.solo!==m.pkg?m.pkg:null,k.selected=null,i(),l?.()):(k.selected=m?.file??null,i()),ue()}me=!1},Mt=()=>{let r=N!==null;N=null,se(),r&&ue()},Rt=r=>{r.preventDefault();let b=v.getBoundingClientRect(),p=r.clientX-b.left,w=r.clientY-b.top,m=Math.exp(-r.deltaY*.0015),S=H();if(m<1&&d.k<=S.k*1.0001){d.k=S.k;let D=Math.min(.4,(1-m)*3);d.tx+=(S.tx-d.tx)*D,d.ty+=(S.ty-d.ty)*D,ue();return}let[M,G]=B(p,w),V=Math.max(S.k,Math.min(9.99,d.k*m));d.k=V,d.tx=p-M*d.k,d.ty=w-G*d.k,ue()};v.addEventListener("mousedown",nt),window.addEventListener("mousemove",St),window.addEventListener("mouseup",$t),v.addEventListener("mouseleave",Mt),v.addEventListener("wheel",Rt,{passive:!1});function zt(r){let b=H().k;r=Math.max(b,Math.min(9.99,r));let p=L/2,w=P/2,[m,S]=B(p,w);d.k=r,d.tx=p-m*d.k,d.ty=w-S*d.k,ue()}let Zt=x.querySelector("#g2-zoom-in"),Jt=x.querySelector("#g2-zoom-out"),Qt=x.querySelector("#g2-zoom-fit");Zt?.addEventListener("click",()=>zt(d.k*1.4)),Jt?.addEventListener("click",()=>zt(d.k/1.4)),Qt?.addEventListener("click",()=>{J(),ue()}),U();let Ct=new ResizeObserver(()=>U());Ct.observe(v);let _t=new MutationObserver(r=>{for(let b of r){let p=(b.oldValue||"").includes("report-fullscreen"),w=document.body.classList.contains("report-fullscreen");if(p!==w){u=0,a=0,F=!0,I=!0,k.layoutCache=null,setTimeout(()=>U(),80);return}ue()}});_t.observe(document.body,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}),ue(),k.graphState={requestDraw:ue,_cleanup:()=>{Le=!0,cancelAnimationFrame(te),Ct.disconnect(),_t.disconnect(),v.removeEventListener("mousedown",nt),window.removeEventListener("mousemove",St),window.removeEventListener("mouseup",$t),v.removeEventListener("mouseleave",Mt),v.removeEventListener("wheel",Rt)}}}function Ln(t,o){let i=document.querySelector("graph-layout")?.shadowRoot;if(!i)return;let l=Xt(t),y=i.querySelector("#g2-selection-area");y&&Ge(Wt(l,o),y);let x=i.querySelector("#g2-focus-overlay-slot");x&&Ge(Vt(l),x)}function En(t){let o=document.querySelector("graph-layout")?.shadowRoot;if(!o)return;let i=o.querySelector("#g2-top-pkgs-block");i&&Ge(Ut(Xt(t)),i)}function Xt(t){let o=Nt(t.treeData,t.files,t.ownCounts,t.transitiveCounts,t.severitySets,t.colorSets,t.fileFindings,t.options);if(t.strippedToOrig)for(let i of o.nodes)i.origFile=t.strippedToOrig.get(i.file);return o.canPackagesView=t.canPackagesView??!1,o}export{ao as _swapGraph2Impl,ko as attachGraph2Interaction,Xt as buildGraphFromPrep,Ln as refreshSidebar,En as refreshTopPkgs};
|