@preventive/triage 1.0.0-alpha.1 → 1.0.0-alpha.3

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 CHANGED
@@ -1,4 +1,4 @@
1
- var mt=globalThis[Symbol.for("@rray/frontend")];if(!mt)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:xt,html:B,nothing:Ot,unsafeCSS:Ve,render:Se,StateElement:ao,classMap:ve,repeat:vt,styleMap:$e}=mt;var yt=`*,*: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);border-color:var(--accent)}&.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}}
1
+ var mt=globalThis[Symbol.for("@rray/frontend")];if(!mt)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:xt,html:E,nothing:Ot,unsafeCSS:Ve,render:Me,StateElement:ao,classMap:Se,repeat:vt,styleMap:$e}=mt;var yt=`*,*: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);border-color:var(--accent)}&.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
2
  `;var kt=`.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 wt=`.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}.sort-wrapper{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}}& 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}}}.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{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-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-invalid{color:var(--muted)}.triage-state-btn.active.triage-state-ignored{color:var(--accent, #2563eb)}view-mode-buttons{display:contents}.view-mode-group{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-toggle{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)}}}.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{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;&:focus-within{border-color:var(--accent)}& svg{color:var(--muted);flex-shrink:0}& 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}}}@media(width<=1200px){.toolbar-row.sev-row .search-row{flex-basis:100%}}.findings-content.with-details .toolbar{max-width:1200px}.sev-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 ce=["critical","high","medium","low","high_bug","bug","informational"],jt="node_modules";function Ue(){return jt}function Ye(e){return typeof e!="number"||!Number.isFinite(e)?null:`${e.toLocaleString()} B`}function Wt(){return{showAll:!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 ge=Wt(),S=new Proxy(ge,{get(e,t){return ge[t]},set(e,t,r){return ge[t]=r,!0},has(e,t){return t in ge},deleteProperty(e,t){return delete ge[t]},ownKeys(){return Reflect.ownKeys(ge)},getOwnPropertyDescriptor(e,t){return Object.getOwnPropertyDescriptor(ge,t)}});function Mt(){S.graphState?._cleanup&&S.graphState._cleanup(),S.graphState=null}function Gt(e){e&&(ge=e)}function Ke(e){if(!e)return null;let t=Ue()==="node_modules"?/^(?:.*\/)?node_modules\/(@[^/]+\/[^/]+|[^/]+)/u:/^(?:.*\/)?dependencies\/(@[^/]+\/[^/]+|[^/]+)/u,r=e.match(t);if(r)return r[1];let d=e.indexOf("/");return d>0?e.slice(0,d):"/"}var Vt=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],St=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function Ut(){if(typeof document>"u")return!1;let e=document.body?.classList;return!!e&&(e.contains("theme-light")||e.contains("theme-pink"))}var it=new Map;function se(e){let t=Ut()?St:Vt,d=`${t===St?"l":"d"}:${e??"__own__"}`;if(it.has(d))return it.get(d);let p=e??"__own__",m=0;for(let o of p)m=m*37+o.codePointAt(0)|0;let w=((m%t.length+t.length)%t.length*7+3)%t.length,R=t[w];return it.set(d,R),R}function $t(e){if(!e)return 0;let t=0;for(let r of ce)t+=e[r]??0;return t}function Yt(e){if(!e)return null;for(let t of ce)if((e[t]??0)>0)return t;return null}function zt(e,t,r,d,p,m,g,w={}){let R=w.pkgOf??Ke,o=new Set(t),y=new Map,b=new Map;for(let f of t){let $=(e[f].imports??[]).filter(W=>o.has(W));y.set(f,$);for(let W of $)b.has(W)||b.set(W,[]),b.get(W).push(f)}let _=t.map(f=>{let $=r.get(f),W=d?.get(f)??null,h=$t($),V=R(f)??"__own__",j=Yt($);return{id:f,file:f,pkg:V,x:0,y:0,deg:0,issue:j,totalIssues:h,own:$,subtree:W,size:typeof e[f]?.size=="number"?e[f].size:null,severitySet:p?.get(f)??null,colorSet:m?.get(f)??null,findings:g?.get(f)??null,isHub:!1,label:f.split("/").pop()??f}}),i=new Map(_.map(f=>[f.file,f])),A=new Map;for(let f of t)for(let $ of y.get(f)??[]){let[W,h]=f<$?[f,$]:[$,f],V=`${W}\0${h}`,j=A.get(V);if(!j){let D=i.get(W),H=i.get(h);if(!D||!H)continue;j={a:W,b:h,cross:D.pkg!==H.pkg,fromLo:!1,fromHi:!1},A.set(V,j),D.deg++,H.deg++}f===W?j.fromLo=!0:j.fromHi=!0}let C=[...A.values()],l=new Map;for(let f=0;f<C.length;f++){let $=C[f];l.has($.a)||l.set($.a,[]),l.has($.b)||l.set($.b,[]),l.get($.a).push(f),l.get($.b).push(f)}let v=new Map;for(let f of _)v.set(f.pkg,(v.get(f.pkg)??0)+1);let I=[...v.entries()].toSorted((f,$)=>$[1]-f[1]).map(([f])=>f),P=new Map;for(let f of _)P.has(f.pkg)||P.set(f.pkg,[]),P.get(f.pkg).push(f);let F={files:t,nodes:_,nodeByFile:i,edges:C,adj:l,importsOf:y,importedBy:b,packages:I,pkgCount:v,byPkg:P};return Kt(F),F}function Kt(e){for(let t of e.nodes)t.isHub=!1;for(let t of e.edges)t.cross&&(t.fromLo&&(e.nodeByFile.get(t.b).isHub=!0),t.fromHi&&(e.nodeByFile.get(t.a).isHub=!0));for(let t of e.nodes){let r=e.importedBy.get(t.file);(!r||r.length===0)&&(t.isHub=!0)}}function Xe(e,t){if(!t||t==="/"||t==="__own__")return e;for(let r of["node_modules","dependencies",Ue()]){let d=r+"/"+t+"/",p=e.indexOf(d);if(p>=0)return e.slice(p+d.length)}return e.startsWith(t+"/")?e.slice(t.length+1):e}function Ct(e,t){let r=t.extraTopRow,d=t.hideAllFiles??!1,p=t.triageCounts??{fixed:0,invalid:0,deleted:0},m=t.triageStates??["fixed","invalid","deleted"],g=t.shownTriage??null,w={};for(let C of ce)w[C]=0;for(let C of e.nodes)if(C.severitySet)for(let l of C.severitySet)w[l]!==void 0&&w[l]++;let R=ce.some(C=>w[C]>0||S.selectedSeverities.has(C)),o=["none","red","blue","green","gray"],y={none:0,red:0,blue:0,green:0,gray:0};for(let C of e.nodes)if(C.colorSet)for(let l of C.colorSet)y[l]!==void 0&&y[l]++;let b=o.some(C=>y[C]>0||S.selectedColors.has(C)),i=m.reduce((C,l)=>C+(p[l]??0),0)>0||g?B`<div class="triage-selector graph2-triage-selector" role="group" aria-label="Triage view">${m.map(C=>{let l=p[C]??0,v=g===C;return l===0&&!v?null:B`<button type="button" class="${ve({"triage-state-btn":!0,[`triage-state-${C}`]:!0,active:v})}" data-triage-show="${C}" title="${v?`Exit ${C} view`:`Show ${C} (${l})`}" aria-pressed="${String(v)}">${C.charAt(0).toUpperCase()+C.slice(1)} (${l})</button>`})}</div>`:null,A=d?null:B`<button type="button" class="${ve({"g2-topbar-toggle":!0,on:S.showAll})}" data-g2-show-all aria-pressed="${String(S.showAll)}"><span>All files</span><span class="g2-switch"></span></button>`;return B`<div class="graph2-topbar">${r?B`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${r} ${A}<div class="g2-spacer"></div>${i}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${R?B`<severity-chips counts="${JSON.stringify(w)}" selected="${JSON.stringify([...S.selectedSeverities])}" kind="graph"></severity-chips>`:null} ${b?B`<triage-filter counts="${JSON.stringify(y)}" selected="${JSON.stringify([...S.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="${S.pathFilter}"> <button type="button" class="g2-path-filter-clear" id="g2-path-filter-clear" title="Clear filter" aria-label="Clear filter">✕</button></div>${r?null:A}<div class="g2-spacer"></div>${r?null:i} <button type="button" class="g2-icon-btn" id="g2-fullscreen" title="Toggle fullscreen">⛶</button></div></div>`}function Xt(e,t){let r=e.split("/").filter(Boolean),d=t.split("/").filter(Boolean),p=0;for(;p<r.length&&p<d.length&&r[p]===d[p];)p++;let m=r.length-p,g=d.slice(p).join("/");return m===0?"./"+g:"../".repeat(m)+g}function Jt(e,t){if(!t&&t!=="")return e;let r=Xt(t,e);return r.length<e.length?r:e}function at(e,t,r,d){let p=r.length;if(p===0)return B`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${p})</div><div class="g2-sel-section-empty">none</div></div>`;let m=r.map(g=>({file:g,display:Jt(g,d)}));return m.sort((g,w)=>g.display.localeCompare(w.display)),B`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${p})</div><ul class="g2-sel-file-list">${m.map(({file:g,display:w})=>{let R=e.nodeByFile.get(g),o=R?se(R.pkg):"#666";return B`<li><button type="button" class="g2-sel-file-link" data-g2-select="${g}" title="${g}"><span class="g2-sel-file-dot" style="${$e({background:o})}"></span> <span class="g2-sel-file-path">${w}</span></button></li>`})}</ul></div>`}function Re(e){if(!e)return B`<div class="g2-sel-section-empty">none</div>`;let r=["critical","high","medium","low","high_bug","bug","informational"].filter(d=>(e[d]??0)>0);return r.length===0?B`<div class="g2-sel-section-empty">none</div>`:B`<div class="tree-count-chips">${r.map(d=>B`<span class="${`tree-count-chip ${d}`}">${e[d]} ${d.replaceAll("_"," ")}</span>`)}</div>`}function Pt(e){let t=0;for(let g of e.edges)g.cross&&t++;let r=e.edges.length-t,d=0;for(let g of e.nodes)d+=g.totalIssues;let p=e.nodes.length===0?"0.0":(e.edges.length*2/e.nodes.length).toFixed(1),m=S.focusedPkg==="__own__"?"own source":S.focusedPkg;return B`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${S.focusedPkg?B`<div class="g2-stage-overlay"><button type="button" class="g2-back-btn" id="g2-back-to-full" title="Back to the full graph">← ${m}</button></div>`:null}<div id="g2-focus-overlay-slot" class="g2-stage-overlay-tr"></div><div class="g2-stage-stats"><span><b>${e.nodes.length}</b> files</span> <span><b>${e.packages.length}</b> packages</span> <span><b>${e.edges.length}</b> edges (${r} intra · ${t} cross)</span> <span><b>${d}</b> issues</span> <span>avg degree <b>${p}</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 _t(e){let t=null;if(S.selected){let d=e.nodeByFile.get(S.selected);d&&(t=d.pkg)}else S.solo&&(t=S.solo);return!t||(e.pkgCount.get(t)??0)<=1||S.focusedPkg===t?null:B`<button type="button" class="g2-focus-pkg-btn" data-g2-focus-pkg="${t}" title="${`Focus on ${t==="__own__"?"own source":t}'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 Ft(){return B`<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 Lt(e){let t=S.showAll&&e.nodes.length>0&&e.nodes.every(p=>typeof p.size=="number"),r=e.nodes.some(p=>p.totalIssues>0),d=S.topPkgsTab;return d==="size"&&!t&&(d="files"),d==="issues"&&!r&&(d="files"),B`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${r?B`<button type="button" class="${ve({"g2-mini-tab":!0,on:d==="issues"})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${ve({"g2-mini-tab":!0,on:d==="files"})}" data-g2-top-pkgs="files">Files</button> ${t?B`<button type="button" class="${ve({"g2-mini-tab":!0,on:d==="size"})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${eo(e,d)}`}function It(e,t={}){let r=S.selected;if(r){let d=e.nodeByFile.get(r);return d?Zt(e,d,r,t):B`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return S.solo?Qt(e,S.solo):B`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function Zt(e,t,r,d){let p=se(t.pkg),m=t.pkg==="__own__"?"own source":t.pkg,g=Xe(r,t.pkg),w=e.importedBy.get(r)??[],R=e.importsOf.get(r)??[],o=r.lastIndexOf("/"),y=o>=0?r.slice(0,o):"";return B`<div class="g2-selection-card"><div class="g2-sel-file-head"><div class="g2-sel-path">${g}</div><div class="g2-sel-pkg-row"><span class="g2-sel-dot" style="${$e({"--dot":p,background:p})}"></span> <span class="g2-sel-pkg">${m}</span></div></div><div class="g2-sel-fullpath" title="${r}">${r}</div>${Ye(t.size)?B`<div class="g2-sel-size">${Ye(t.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${Re(t.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${Re(t.subtree)}</div><div class="g2-sel-jumps">${t.totalIssues>0?B`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${r}">Findings →</button>`:null} ${d.isBundleContext?t.origFile?B`<button type="button" class="g2-sel-jump" data-bundle-view-source="${t.origFile}">View source →</button>`:null:B`<button type="button" class="g2-sel-jump" data-g2-jump-file="${r}">Files →</button>`}</div>${at(e,"Imported by",w,y)} ${at(e,"Imports",R,y)}</div>`}function Qt(e,t){let r=e.nodes.filter(b=>b.pkg===t),d=r.length;if(d===0)return B`<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 p=se(t),m=t==="__own__"?"own source":t,g={};for(let b of ce)g[b]=0;for(let b of r)if(b.own)for(let _ of ce)g[_]+=b.own[_]??0;let w=0,R=0;for(let b of e.edges){let _=e.nodeByFile.get(b.a),i=e.nodeByFile.get(b.b);!_||!i||(_.pkg===t&&i.pkg===t?R++:(_.pkg===t||i.pkg===t)&&w++)}let o=0;for(let b of r)b.isHub&&o++;let y=new Set;for(let b of r)for(let _ of e.importedBy.get(b.file)??[]){let i=e.nodeByFile.get(_);i&&i.pkg!==t&&y.add(_)}return B`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${$e({"--dot":p,background:p})}"></span> <span class="g2-sel-id">${m}</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">${d}</span></div><div class="g2-sel-row"><span class="k">Hubs</span><span class="v">${o}</span></div><div class="g2-sel-row"><span class="k">Intra edges</span><span class="v">${R}</span></div><div class="g2-sel-row"><span class="k">Cross edges</span><span class="v">${w}</span></div></div><div class="g2-sel-section"><div class="g2-sel-section-label">Findings</div>${Re(g)}</div>${at(e,"Imported by",[...y])}</div>`}function eo(e,t){let r=e.nodes.length||1,d=t??S.topPkgsTab,p=S.selectedSeverities,m=S.selectedColors,g=p.size>0,w=m.size>0,R=g||w,o=new Map,y=new Map,b=0,_=0;for(let l of e.nodes){let v;if(R){if(v=0,l.findings)for(let I of l.findings)g&&!p.has(I.severity)||w&&!m.has(I.color)||v++}else v=l.totalIssues;o.set(l.pkg,(o.get(l.pkg)??0)+v),b+=v,typeof l.size=="number"&&(y.set(l.pkg,(y.get(l.pkg)??0)+l.size),_+=l.size)}let i;d==="issues"?i=e.packages.filter(l=>(o.get(l)??0)>0).toSorted((l,v)=>{let I=o.get(l)??0,P=o.get(v)??0;return P!==I?P-I:(e.pkgCount.get(v)??0)-(e.pkgCount.get(l)??0)}):d==="size"?i=e.packages.filter(l=>(y.get(l)??0)>0).toSorted((l,v)=>{let I=y.get(l)??0,P=y.get(v)??0;return P!==I?P-I:(e.pkgCount.get(v)??0)-(e.pkgCount.get(l)??0)}):i=[...e.packages].toSorted((l,v)=>{let I=e.pkgCount.get(l)??0,P=e.pkgCount.get(v)??0;return P!==I?P-I:(o.get(v)??0)-(o.get(l)??0)});let A=l=>d==="issues"?b>0?((o.get(l)??0)/b*100).toFixed(2):"0":d==="size"?_>0?((y.get(l)??0)/_*100).toFixed(2):"0":(e.pkgCount.get(l)/r*100).toFixed(2),C=d==="issues"?"No packages with issues":d==="size"?"No packages with size":"No packages";return B`<div class="g2-dist-bar">${e.packages.map(l=>{let v=se(l);return B`<span style="${$e({background:v,width:`${A(l)}%`})}"></span>`})}</div><div class="g2-dist-list">${i.length===0?B`<div class="g2-dist-empty">${C}</div>`:null} ${vt(i,l=>l,l=>{let v=se(l),I=e.pkgCount.get(l)??0,P=o.get(l)??0,F=y.get(l)??0,f=d==="issues"?P:d==="size"?Ye(F):I,$=d==="issues"?b>0?(P/b*100).toFixed(1):"0.0":d==="size"?_>0?(F/_*100).toFixed(1):"0.0":(I/r*100).toFixed(1),W=l==="__own__"?"own source":l,h=S.solo===l;return B`<button type="button" class="${ve({"g2-dist-item":!0,on:h})}" data-g2-pkg="${l}" title="${W}"><span class="g2-dist-dot" style="${$e({background:v})}"></span><span class="g2-dist-name">${W}</span><span class="g2-dist-count">${f}</span><span class="g2-dist-pct">${$}%</span></button>`})}</div>`}var lt=class extends xt{static properties={graph:{attribute:!1},options:{attribute:!1}};static styles=[Ve(wt),Ve(kt),Ve(yt)];constructor(){super(),this.graph=null,this.options={}}render(){return this.graph?B`<div class="graph2-layout">${Ct(this.graph,this.options)} ${Pt(this.graph)} ${Ft()}</div>`:B``}};customElements.define("graph-layout",lt);function to(e){let t=new Map;for(let[r,d]of e.importsOf){let p=e.nodeByFile.get(r);if(p)for(let m of d){let g=e.nodeByFile.get(m);g&&p.pkg!==g.pkg&&(t.set(p.pkg,(t.get(p.pkg)??0)+1),t.set(g.pkg,(t.get(g.pkg)??0)+1))}}return t}function oo(e){if(e.packages.length===0)return null;let t=new Set;for(let[r,d]of e.importedBy){let p=e.nodeByFile.get(r);if(p)for(let m of d){let g=e.nodeByFile.get(m);if(g&&g.pkg!==p.pkg){t.add(p.pkg);break}}}for(let r of e.packages)if(!t.has(r))return r;return null}var ro=5;function Rt(e,t){let r=new Map;for(let m of e.nodes)t.has(m.pkg)&&(r.has(m.pkg)||r.set(m.pkg,[]),r.get(m.pkg).push(m));for(let m of r.values())m.sort((g,w)=>g.isHub!==w.isHub?g.isHub?-1:1:w.deg-g.deg);let d=new Map,p=new Map;for(let[m,g]of t){let w=r.get(m);if(!w||w.length===0)continue;let R=w.length,o=0;for(let v of w)if(v.isHub)o++;else break;let y=o>0&&o<=ro,b=y?o:0,_=R-b,i=g.groupR,A=Array.from({length:R}),C=Array.from({length:R});for(let v=0;v<R;v++){let I=v*137.508*Math.PI/180,P;if(v<b)P=b<=1?0:Math.sqrt(v/(b-1))*.3*i;else{let F=v-b;P=_<=1?.4*i:(.4+Math.sqrt(F/(_-1))*.6)*i}A[v]=g.x+Math.cos(I)*P,C[v]=g.y+Math.sin(I)*P}let l=Array.from({length:R},()=>!1);for(let v=0;v<R;v++){let I=w[v],P,F;y&&I.isHub?(F=0,P=b):y?(F=b,P=R):(F=0,P=R);let f=0,$=0,W=0,h=e.importsOf.get(I.file);if(h)for(let H of h){let N=d.get(H);N!==void 0&&(f+=N,$+=p.get(H),W++)}let V=e.importedBy.get(I.file);if(V)for(let H of V){let N=d.get(H);N!==void 0&&(f+=N,$+=p.get(H),W++)}let j=!1;if(W>0){f/=W,$/=W;let H=f-g.x,N=$-g.y;H*H+N*N>1&&(j=!0)}let D=-1;if(j){let H=1/0;for(let N=F;N<P;N++){if(l[N])continue;let c=A[N]-f,L=C[N]-$,q=c*c+L*L;q<H&&(H=q,D=N)}}else for(let H=F;H<P;H++)if(!l[H]){D=H;break}l[D]=!0,I.x=A[D],I.y=C[D],d.set(I.file,I.x),p.set(I.file,I.y)}}}function At(e,t,r){let d=t/2,p=r/2,m=Math.min(t,r)/2;if(e.packages.length===0)return;let w=oo(e),R=to(e),o=(w?e.packages.filter(c=>c!==w):[...e.packages]).toSorted((c,L)=>{let q=(R.get(L)??0)-(R.get(c)??0);return q!==0?q:(e.pkgCount.get(L)??0)-(e.pkgCount.get(c)??0)}),y=o.length,b;y<=0?b=0:y<=6?b=.65:y<=20?b=.82:b=.95;let _=Math.max(1,Math.sqrt(50/Math.max(1,y))),i=.22,A=.12,C=.04,l=new Map,v;if(w){let c=e.pkgCount.get(w)??0,L=Math.min(i,(.012+Math.sqrt(c)*.004)*_);v=Math.max(y<=6?.4:y<=20?.36:.34,L+A+C),l.set(w,{x:d,y:p,size:c,groupR:L*m})}else y<=1?v=0:y<=6?v=.4:y<=20?v=.32:v=.3;if(y===0){Rt(e,l);return}let I=new Map;for(let c of e.edges){if(!c.cross)continue;let L=e.nodeByFile.get(c.a)?.pkg,q=e.nodeByFile.get(c.b)?.pkg;if(!L||!q||L===q)continue;I.has(L)||I.set(L,new Map),I.has(q)||I.set(q,new Map);let ee=I.get(L),Z=I.get(q);ee.set(q,(ee.get(q)??0)+1),Z.set(L,(Z.get(L)??0)+1)}let P=Math.max(1,Math.min(10,Math.round(Math.sqrt(y)/1.2))),F=Array.from({length:P+1});for(let c=0;c<=P;c++)F[c]=Math.floor(c*c/(P*P)*y);F[P]=y;let f=.2,$=Array.from({length:P}),W=Array.from({length:P});for(let c=0;c<P;c++){let L=F[c],q=F[c+1];$[c]=q-L;let ee=0;for(let Z=L;Z<q;Z++)ee+=e.pkgCount.get(o[Z])??0;W[c]=ee}let h=Array.from({length:P});for(let c=0;c<P;c++){let L=(F[c]+F[c+1]-1)/2/Math.max(1,y-1);h[c]=Math.sqrt(Math.max(0,L))}let V=Array.from({length:P});V[0]=h[0];for(let c=1;c<P;c++){let L=$[c-1],q=W[c-1],ee=L>0?q/L:1,Z=1+f*Math.sqrt(Math.max(0,ee-1));V[c]=V[c-1]+(h[c]-h[c-1])*Z}let j=Array.from({length:P});for(let c=0;c<P;c++)j[c]=V[c]-h[c];let D=Array.from({length:y}),H=Array.from({length:y}),N=0;for(let c=0;c<y;c++){for(;N<P-1&&c>=F[N+1];)N++;let L=c*137.508%360*Math.PI/180,ee=(y<=1?0:Math.sqrt(c/(y-1)))+j[N],Z=y===1?w?v:0:v+ee*(b-v);D[c]=d+Math.cos(L)*Z*m,H[c]=p+Math.sin(L)*Z*m}for(let c=0;c<P;c++){let L=F[c],q=F[c+1],ee=q-L;if(ee===0)continue;let Z=Array.from({length:ee},()=>!1);for(let Ce=L;Ce<q;Ce++){let ye=o[Ce],Ae=I.get(ye),de=0,ae=0,ie=0;if(Ae)for(let[te,oe]of Ae){let fe=l.get(te);fe&&(de+=fe.x*oe,ae+=fe.y*oe,ie+=oe)}let ke=!1;if(ie>0){de/=ie,ae/=ie;let te=de-d,oe=ae-p;te*te+oe*oe>1&&(ke=!0)}let ue=-1;if(ke){let te=1/0;for(let oe=0;oe<ee;oe++){if(Z[oe])continue;let fe=L+oe,He=D[fe]-de,Te=H[fe]-ae,Fe=He*He+Te*Te;Fe<te&&(te=Fe,ue=oe)}}else for(let te=0;te<ee;te++)if(!Z[te]){ue=te;break}Z[ue]=!0;let Pe=L+ue,_e=e.pkgCount.get(ye)??0,Be=Math.min(A,(.012+Math.sqrt(_e)*.004)*_);l.set(ye,{x:D[Pe],y:H[Pe],size:_e,groupR:Be*m})}}Rt(e,l)}function Bt(e,t,r){let d=t/2,p=r/2,m=Math.min(t,r)/2,g=e.nodes.length;if(g===0)return;let w=[...e.nodes].toSorted((R,o)=>o.deg-R.deg);for(let R=0;R<g;R++){let o=w[R],y=R*137.508%360*Math.PI/180,b=g<=1?0:Math.sqrt(R/(g-1));o.x=d+Math.cos(y)*b*.85*m,o.y=p+Math.sin(y)*b*.85*m}}function Ht(e,t,r,d){let p=e.length,m=d||760,g=r||1100,w=Math.sqrt(g*m/Math.max(p,1))*1.1,R=F=>{let f=0;for(let $ of F)f=f*31+$.codePointAt(0)|0;return f},o=Math.ceil(Math.sqrt(p*g/m)),y=Math.ceil(p/o),b=m/(y+1),_=g/(o+1),i=e.map((F,f)=>{let $=f%o,W=Math.floor(f/o),h=R(F);return{file:F,x:($+1)*_+(h%100-50)*_*.4,y:(W+1)*b+((h>>7)%100-50)*b*.4,dx:0,dy:0}}),A=new Map(i.map((F,f)=>[F.file,f])),C=[];for(let F of e)for(let f of t.get(F)??[])A.has(f)&&C.push([A.get(F),A.get(f)]);let l=new Map;for(let F=0;F<p;F++){let f=Ke(i[F].file)??"__own__";l.has(f)||l.set(f,[]),l.get(f).push(F)}let v=Math.min(500,Math.max(180,100+p*3)),I=Math.min(g,m)/6,P=.3;for(let F=0;F<v;F++){let f=I*Math.pow(P/I,F/v);for(let h of i)h.dx=0,h.dy=0;for(let h=0;h<p;h++)for(let V=h+1;V<p;V++){let j=i[h],D=i[V],H=j.x-D.x,N=j.y-D.y,c=Math.sqrt(H*H+N*N);if(c<.01){let q=R(j.file+D.file);H=(q%100-50)*.01||.5,N=((q>>7)%100-50)*.01||.5,c=Math.sqrt(H*H+N*N)}let L=w*w/c;j.dx+=H/c*L,j.dy+=N/c*L,D.dx-=H/c*L,D.dy-=N/c*L}for(let[h,V]of C){let j=i[h],D=i[V],H=j.x-D.x,N=j.y-D.y,c=Math.sqrt(H*H+N*N)||.01,L=c*c/w;j.dx-=H/c*L,j.dy-=N/c*L,D.dx+=H/c*L,D.dy+=N/c*L}let $=.055*Math.min(1,f/(I*.3));for(let[,h]of l){if(h.length<2)continue;let V=0,j=0;for(let D of h)V+=i[D].x,j+=i[D].y;V/=h.length,j/=h.length;for(let D of h)i[D].dx+=(V-i[D].x)*$,i[D].dy+=(j-i[D].y)*$}let W=50;for(let h of i){let V=Math.sqrt(h.dx*h.dx+h.dy*h.dy)||.01;h.x+=h.dx/V*Math.min(V,f),h.y+=h.dy/V*Math.min(V,f),h.x=Math.max(W,Math.min(g-W,h.x)),h.y=Math.max(W,Math.min(m-W,h.y))}}return i}var Tt={critical:"#ff5470",high:"#ff9d4a",medium:"#f4d35e",low:"#67c2ff",high_bug:"#a06c3f",bug:"#7a6d62",informational:"#218bff"},ct={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 no(){let e=document.body.classList;return e.contains("theme-pink")?ct.pink:e.contains("theme-light")?ct.light:ct.dark}function ze(e){return Math.max(0,Math.min(255,Math.round(e*255))).toString(16).padStart(2,"0")}function so(e,t,r){let p=e.querySelector("graph-layout")?.shadowRoot;if(!p)return;let m=p.querySelector("#g2-canvas"),g=p.querySelector("#g2-tooltip"),w=p.querySelector(".graph2-stage"),R=p.querySelector("#g2-zoom-pct");if(!m)return;Mt();let o=m.getContext("2d"),y=window.devicePixelRatio||1,b=0,_=0,i={tx:0,ty:0,k:1},A=null,C=0,l=0,v=!0,I=!0;function P(){if(!v)return;let s=S.layoutCache,u=S.focusedPkg;if(s&&s.files===t.files&&s.w===l&&s.h===C&&s.focused===u)for(let k of t.nodes){let n=s.pos.get(k.file);n&&(k.x=n.x,k.y=n.y)}else{if(u)if(t.nodes.length>50)Bt(t,l,C);else{let n=Ht(t.files,t.importsOf,l,C),x=new Map(n.map(z=>[z.file,z]));for(let z of t.nodes){let O=x.get(z.file);O&&(z.x=O.x,z.y=O.y)}}else At(t,l,C);let k=new Map;for(let n of t.nodes)k.set(n.file,{x:n.x,y:n.y});S.layoutCache={files:t.files,w:l,h:C,pos:k,focused:u}}v=!1}function F(){if(t.nodes.length===0)return{k:1,tx:_/2,ty:b/2};let s=-1/0,u=-1/0,k=1/0,n=1/0;for(let a of t.nodes)a.x<k&&(k=a.x),a.y<n&&(n=a.y),a.x>s&&(s=a.x),a.y>u&&(u=a.y);let x=Math.max(20,u-n),z=Math.max(20,s-k),O=(k+s)/2,G=(n+u)/2,U=Math.min(_,b)*.1,K=Math.min((_-U*2)/z,(b-U*2)/x,4),X=Math.max(.05,K);return{k:X,tx:_/2-O*X,ty:b/2-G*X}}function f(){let s=F();i.k=s.k,i.tx=s.tx,i.ty=s.ty}function $(s,u){return[s*i.k+i.tx,u*i.k+i.ty]}function W(s,u){return[(s-i.tx)/i.k,(u-i.ty)/i.k]}function h(s){return!S.hidden.has(s.pkg)}function V(s){if(S.selectedSeverities.size>0){let k=s.severitySet;if(!k)return!0;let n=!1;for(let x of S.selectedSeverities)if(k.has(x)){n=!0;break}if(!n)return!0}if(S.selectedColors.size>0){let k=s.colorSet;if(!k)return!0;let n=!1;for(let x of S.selectedColors)if(k.has(x)){n=!0;break}if(!n)return!0}if(S.solo&&s.pkg!==S.solo)return!0;let u=S.pathFilter;if(u){let k=u.toLowerCase(),n=s.file.toLowerCase().includes(k),x=s.pkg&&s.pkg.toLowerCase().includes(k);if(!n&&!x)return!0}return!1}function j(s){let u=(s.isHub?4.9:3.5)*S.nodeSize,k=Math.max(.6,Math.min(1.6,i.k));return u*k}function D(){let s=w.getBoundingClientRect(),u=b,k=_;_=Math.max(80,s.width),b=Math.max(80,s.height),y=window.devicePixelRatio||1,m.width=_*y,m.height=b*y,m.style.width=_+"px",m.style.height=b+"px",o.setTransform(y,0,0,y,0,0),(l===0||C===0)&&(l=_,C=b,v=!0),P();let n=k>0&&(Math.abs(_-k)/k>.15||Math.abs(b-u)/u>.15);(I||n)&&(f(),I=!1),q()}let H=null,N=!0,c=!1,L=!1;function q(){N=!0,!(c||L)&&(c=!0,H=requestAnimationFrame(()=>{c=!1,N&&!L&&(N=!1,ee())}))}function ee(){let s=no();o.fillStyle=s.bg,o.fillRect(0,0,_,b),Z(s);let u=S.selected,k=u?t.nodeByFile.get(u):null;if(S.focusedPkg&&t.nodes.length<=50){Ce(s,u,k);return}for(let n of t.edges){let x=t.nodeByFile.get(n.a),z=t.nodeByFile.get(n.b);if(!x||!z||!h(x)||!h(z))continue;let O=S.edgeOpacity;u?O=n.a===u||n.b===u?.85:S.edgeOpacity*.25:A&&(n.a===A||n.b===A)&&(O=Math.min(.9,O+.5)),V(x)&&V(z)&&(O=Math.min(O,.04));let[G,U]=$(x.x,x.y),[K,X]=$(z.x,z.y);if(n.cross){let a=o.createLinearGradient(G,U,K,X);a.addColorStop(0,se(x.pkg)+ze(O)),a.addColorStop(1,se(z.pkg)+ze(O)),o.strokeStyle=a,o.lineWidth=.85}else o.strokeStyle=s.edgeIntra.replace("ALPHA",String(O*.7)),o.lineWidth=.55;o.beginPath(),o.moveTo(G,U),o.lineTo(K,X),o.stroke()}for(let n of t.nodes){if(!h(n))continue;let x=n.file===A,z=n.file===u;if(!n.isHub&&!x&&!z||V(n)&&!x&&!z)continue;let[O,G]=$(n.x,n.y),K=j(n)*(z?6:x?4.5:3),X=o.createRadialGradient(O,G,0,O,G,K),a=se(n.pkg);X.addColorStop(0,a+"55"),X.addColorStop(1,a+"00"),o.fillStyle=X,o.beginPath(),o.arc(O,G,K,0,Math.PI*2),o.fill()}for(let n of t.nodes){if(!h(n))continue;let[x,z]=$(n.x,n.y),O=j(n),G=1,U=u&&n.file===u;if(u&&!U&&(G=(t.adj.get(u)??[]).some(X=>{let a=t.edges[X];return a.a===n.file||a.b===n.file})?1:.25),!U&&V(n)&&(G=Math.min(G,.1)),o.fillStyle=se(n.pkg)+ze(G),o.beginPath(),o.arc(x,z,O,0,Math.PI*2),o.fill(),n.isHub&&(o.strokeStyle=s.hubRing.replace("ALPHA",String(.55*G)),o.lineWidth=.8,o.stroke()),n.issue){let K=Tt[n.issue],X=O+(n.issue==="critical"?4.2:n.issue==="high"?3.4:2.8),a=n.issue==="critical"?1.8:n.issue==="high"?1.5:n.issue==="medium"?1.3:1.1;o.strokeStyle=K,o.globalAlpha=G,o.lineWidth=a,o.beginPath(),o.arc(x,z,X,0,Math.PI*2),o.stroke(),o.globalAlpha=1}}if(i.k>1.4){let x=0;if(i.k<9&&!S.showLabels)for(let O of t.nodes){if(!h(O))continue;let[G,U]=$(O.x,O.y);if(!(G<0||G>_||U<0||U>b)&&(x++,x>=50))break}let z=i.k>=9||x<50;if(S.showLabels||z){o.font="10px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",o.fillStyle=s.labelFill,o.textAlign="left",o.textBaseline="middle";let O=11,G=2,U=250,K=(M,E)=>M>-U&&M<_+U&&E>-U&&E<b+U,X=[];for(let M of t.nodes){if(!h(M))continue;let[E,J]=$(M.x,M.y);if(!K(E,J))continue;let Q=j(M);X.push({file:M.file,x0:E-Q,x1:E+Q,y0:J-Q,y1:J+Q})}let a=[];for(let M of t.nodes){if(!h(M)||!M.isHub&&i.k<2.4)continue;let[E,J]=$(M.x,M.y);if(!K(E,J))continue;let Q=j(M),re=E+Q+4,ne=J+1,we=o.measureText(M.label).width+G,Ee=M.file===S.selected,Oe=M.file===A,qe=Ee?3:Oe?2:M.isHub?1:0;a.push({file:M.file,n:M,tx:re,ty:ne,prio:qe,x0:re-G,x1:re+we,y0:ne-O/2,y1:ne+O/2})}a.sort((M,E)=>E.prio-M.prio);let T=[],Y=(M,E)=>M.x0<E.x1&&E.x0<M.x1&&M.y0<E.y1&&E.y0<M.y1;for(let M of a){let E=!1;for(let J of X)if(J.file!==M.file&&Y(M,J)){E=!0;break}if(!E){for(let J of T)if(Y(M,J)){E=!0;break}}E||T.push(M)}for(let M of T)o.fillText(M.n.label,M.tx,M.ty)}}if(k&&h(k)){let[n,x]=$(k.x,k.y),z=j(k);o.strokeStyle=s.selectRing,o.lineWidth=1.5,o.beginPath(),o.arc(n,x,z+5,0,Math.PI*2),o.stroke()}R&&(R.textContent=`${Math.round(i.k*100)}%`)}function Z(s){if(i.k<.4)return;let u=80,k=(i.tx%u+u)%u,n=(i.ty%u+u)%u;o.strokeStyle=s.grid,o.lineWidth=1,o.beginPath();for(let x=k;x<_;x+=u)o.moveTo(x,0),o.lineTo(x,b);for(let x=n;x<b;x+=u)o.moveTo(0,x),o.lineTo(_,x);o.stroke()}function Ce(s,u,k){let n=se(S.focusedPkg),x=new Set;if(A){x.add(A);for(let a of t.adj.get(A)??[]){let T=t.edges[a];x.add(T.a),x.add(T.b)}}let z=a=>(a.isHub?6:4)*S.nodeSize;for(let a of t.edges){let T=t.nodeByFile.get(a.a),Y=t.nodeByFile.get(a.b);if(!T||!Y||!h(T)||!h(Y))continue;let M=a.fromLo&&a.fromHi,E=!M&&a.fromHi,J=E?Y:T,Q=E?T:Y,re=A&&(a.a===A||a.b===A),ne=u&&(a.a===u||a.b===u),we=(u||A)&&!re&&!ne,Ee=z(J),Oe=z(Q),[qe,ft]=$(J.x,J.y),[pt,gt]=$(Q.x,Q.y),Je=pt-qe,Ze=gt-ft,Qe=Math.sqrt(Je*Je+Ze*Ze)||1,et=Je/Qe,tt=Ze/Qe,be=qe+et*(Ee+1.5),he=ft+tt*(Ee+1.5),me=pt-et*(Oe+3.5),xe=gt-tt*(Oe+3.5),ut=Math.min(Qe*.15,30),Le=(be+me)/2-tt*ut,Ie=(he+xe)/2+et*ut;o.beginPath(),o.moveTo(be,he),o.quadraticCurveTo(Le,Ie,me,xe);let Me;if(ne?Me=.9:re?Me=.85:we?Me=.05:Me=Math.min(.85,S.edgeOpacity*3),o.strokeStyle=n+ze(Me),o.lineWidth=ne||re?1.5:.85,o.stroke(),we)continue;let le=Math.max(5,7),pe=le*.42,Ne=.9,ot=2*(1-Ne)*(Le-be)+2*Ne*(me-Le),rt=2*(1-Ne)*(Ie-he)+2*Ne*(xe-Ie),bt=Math.sqrt(ot*ot+rt*rt)||1,De=ot/bt,je=rt/bt;if(o.beginPath(),o.moveTo(me,xe),o.lineTo(me-De*le+je*pe,xe-je*le-De*pe),o.lineTo(me-De*le-je*pe,xe-je*le+De*pe),o.closePath(),o.fillStyle=n+ze(Math.min(1,Me+.15)),o.fill(),M){let nt=1.8*(Le-be)+.2*(me-Le),st=2*(1-.1)*(Ie-he)+2*.1*(xe-Ie),ht=Math.sqrt(nt*nt+st*st)||1,We=nt/ht,Ge=st/ht;o.beginPath(),o.moveTo(be,he),o.lineTo(be+We*le-Ge*pe,he+Ge*le+We*pe),o.lineTo(be+We*le+Ge*pe,he+Ge*le-We*pe),o.closePath(),o.fill()}}for(let a of t.nodes){if(!h(a))continue;let[T,Y]=$(a.x,a.y),M=z(a),E=a.file===A,J=a.file===u,Q=(u||A)&&!x.has(a.file)&&!J?.15:1;if(o.globalAlpha=Q,J||E||a.isHub){let re=M*(J?4:E?3:2.4),ne=o.createRadialGradient(T,Y,M*.6,T,Y,re);ne.addColorStop(0,n+ze(J?.4:.25)),ne.addColorStop(1,n+"00"),o.fillStyle=ne,o.beginPath(),o.arc(T,Y,re,0,Math.PI*2),o.fill()}if(o.fillStyle=n,o.beginPath(),o.arc(T,Y,M,0,Math.PI*2),o.fill(),a.isHub&&(o.strokeStyle=s.hubRing.replace("ALPHA","0.55"),o.lineWidth=.9,o.stroke()),a.issue){let re=Tt[a.issue],ne=M+(a.issue==="critical"?4.2:a.issue==="high"?3.4:2.8),we=a.issue==="critical"?1.8:a.issue==="high"?1.5:a.issue==="medium"?1.3:1.1;o.strokeStyle=re,o.lineWidth=we,o.beginPath(),o.arc(T,Y,ne,0,Math.PI*2),o.stroke()}o.globalAlpha=1}o.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",o.textAlign="center",o.textBaseline="top",o.lineJoin="round";let O=13,G=2,U=[];for(let a of t.nodes){if(!h(a))continue;let[T,Y]=$(a.x,a.y),M=z(a),E=Y+M+4,J=o.measureText(a.label).width/2+G,Q=a.file===u,re=a.file===A,ne=Q?3:re?2:a.isHub?1:0;U.push({n:a,sx:T,ty:E,halfW:J,isSel:Q,isHov:re,prio:ne,x0:T-J,x1:T+J,y0:E,y1:E+O})}U.sort((a,T)=>T.prio-a.prio);let K=[],X=(a,T)=>a.x0<T.x1&&T.x0<a.x1&&a.y0<T.y1&&T.y0<a.y1;for(let a of U){let T=!1;for(let Y of K)if(X(a,Y)){T=!0;break}T||K.push(a)}for(let a of K){let{n:T,sx:Y,ty:M,isSel:E,isHov:J}=a,Q=(u||A)&&!x.has(T.file)&&!E?.2:1;o.globalAlpha=Q,o.shadowColor=s.labelShadow,o.shadowBlur=4,o.strokeStyle=s.labelOutline,o.lineWidth=3,o.strokeText(T.label,Y,M),o.shadowBlur=0,o.fillStyle=E?s.labelSelected:J?s.labelHover:s.labelDefault,o.fillText(T.label,Y,M),o.globalAlpha=1}if(k&&h(k)){let[a,T]=$(k.x,k.y),Y=z(k);o.strokeStyle=s.selectRing,o.lineWidth=1.8,o.beginPath(),o.arc(a,T,Y+4,0,Math.PI*2),o.stroke()}R&&(R.textContent=`${Math.round(i.k*100)}%`)}function ye(s,u){let k=null,n=1/0,x=6;for(let z of t.nodes){if(!h(z))continue;let[O,G]=$(z.x,z.y),U=O-s,K=G-u,X=U*U+K*K,a=j(z)+x;X<a*a&&X<n&&(n=X,k=z)}return k}function Ae(s,u,k){if(!g)return;let n=w.getBoundingClientRect(),x=se(s.pkg),z=s.pkg==="__own__"?"own source":s.pkg,O=Xe(s.file,s.pkg);Se(B`<div class="g2-tt-path">${O}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${x}`}"></span> <span class="g2-tt-pkg">${z}</span></div>${s.totalIssues>0?Re(s.own):null}`,g),g.classList.add("show");let G=g.offsetWidth,U=g.offsetHeight,K=u-n.left,X=k-n.top,a=n.width,T=n.height,Y=12,M=K+Y;M+G>a-4&&(M=K-G-Y),M<4&&(M=4);let E=X+Y;E+U>T-4&&(E=X-U-Y),E<4&&(E=4),g.style.left=`${M}px`,g.style.top=`${E}px`}function de(){g&&g.classList.remove("show")}let ae=!1,ie=null,ke=!1,ue=s=>{s.button===0&&(s.target.closest(".g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl")||(ae=!0,ke=!1,ie={x:s.clientX,y:s.clientY,tx:i.tx,ty:i.ty}))},Pe=s=>{let u=w.getBoundingClientRect(),k=s.clientX-u.left,n=s.clientY-u.top;if(ae){let O=s.clientX-ie.x,G=s.clientY-ie.y;Math.abs(O)+Math.abs(G)>3&&(ke=!0),i.tx=ie.tx+O,i.ty=ie.ty+G,de(),q();return}let x=ye(k,n),z=A;A=x?.file??null,m.style.cursor=x?"default":"grab",x?Ae(x,s.clientX,s.clientY):z&&de(),A!==z&&q()},_e=s=>{if(ae&&!ke){let u=w.getBoundingClientRect(),k=s.clientX-u.left,n=s.clientY-u.top,x=ye(k,n);S.selected=x?.file??null,r(),q()}ae=!1},Be=()=>{let s=A!==null;A=null,de(),s&&q()},te=s=>{s.preventDefault();let u=w.getBoundingClientRect(),k=s.clientX-u.left,n=s.clientY-u.top,x=Math.exp(-s.deltaY*.0015),z=F();if(x<1&&i.k<=z.k*1.0001){i.k=z.k;let K=Math.min(.4,(1-x)*3);i.tx+=(z.tx-i.tx)*K,i.ty+=(z.ty-i.ty)*K,q();return}let[O,G]=W(k,n),U=Math.max(z.k,Math.min(9.99,i.k*x));i.k=U,i.tx=k-O*i.k,i.ty=n-G*i.k,q()};w.addEventListener("mousedown",ue),window.addEventListener("mousemove",Pe),window.addEventListener("mouseup",_e),w.addEventListener("mouseleave",Be),w.addEventListener("wheel",te,{passive:!1});function oe(s){let u=F().k;s=Math.max(u,Math.min(9.99,s));let k=_/2,n=b/2,[x,z]=W(k,n);i.k=s,i.tx=k-x*i.k,i.ty=n-z*i.k,q()}let fe=p.querySelector("#g2-zoom-in"),He=p.querySelector("#g2-zoom-out"),Te=p.querySelector("#g2-zoom-fit");fe?.addEventListener("click",()=>oe(i.k*1.4)),He?.addEventListener("click",()=>oe(i.k/1.4)),Te?.addEventListener("click",()=>{f(),q()}),D();let Fe=new ResizeObserver(()=>D());Fe.observe(w);let dt=new MutationObserver(s=>{for(let u of s){let k=(u.oldValue||"").includes("report-fullscreen"),n=document.body.classList.contains("report-fullscreen");if(k!==n){l=0,C=0,v=!0,I=!0,S.layoutCache=null,setTimeout(()=>D(),80);return}q()}});dt.observe(document.body,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}),q(),S.graphState={requestDraw:q,_cleanup:()=>{L=!0,cancelAnimationFrame(H),Fe.disconnect(),dt.disconnect(),w.removeEventListener("mousedown",ue),window.removeEventListener("mousemove",Pe),window.removeEventListener("mouseup",_e),w.removeEventListener("mouseleave",Be),w.removeEventListener("wheel",te)}}}function Xo(e,t){let r=document.querySelector("graph-layout")?.shadowRoot;if(!r)return;let d=Et(e),p=r.querySelector("#g2-selection-area");p&&Se(It(d,t),p);let m=r.querySelector("#g2-focus-overlay-slot");m&&Se(_t(d),m)}function Jo(e){let t=document.querySelector("graph-layout")?.shadowRoot;if(!t)return;let r=t.querySelector("#g2-top-pkgs-block");r&&Se(Lt(Et(e)),r)}function Et(e){let t=zt(e.treeData,e.files,e.ownCounts,e.transitiveCounts,e.severitySets,e.colorSets,e.fileFindings,e.options);if(e.strippedToOrig)for(let r of t.nodes)r.origFile=e.strippedToOrig.get(r.file);return t}export{Gt as _swapGraph2Impl,so as attachGraph2Interaction,Et as buildGraphFromPrep,Xo as refreshSidebar,Jo as refreshTopPkgs};
3
+ `;var wt=`.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(analyzer-select,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}}& 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}}}.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-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-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)}}}.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{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;&:focus-within{border-color:var(--accent)}& svg{color:var(--muted);flex-shrink:0}& 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}}}@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 ce=["critical","high","medium","low","high_bug","bug","informational"],Nt="node_modules";function Ye(){return Nt}function Ue(e){return typeof e!="number"||!Number.isFinite(e)?null:`${e.toLocaleString()} B`}function Wt(){return{showAll:!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 ge=Wt(),M=new Proxy(ge,{get(e,t){return ge[t]},set(e,t,n){return ge[t]=n,!0},has(e,t){return t in ge},deleteProperty(e,t){return delete ge[t]},ownKeys(){return Reflect.ownKeys(ge)},getOwnPropertyDescriptor(e,t){return Object.getOwnPropertyDescriptor(ge,t)}});function Mt(){M.graphState?._cleanup&&M.graphState._cleanup(),M.graphState=null}function Gt(e){e&&(ge=e)}function Ke(e){if(!e)return null;let t=Ye()==="node_modules"?/^(?:.*\/)?node_modules\/(@[^/]+\/[^/]+|[^/]+)/u:/^(?:.*\/)?dependencies\/(@[^/]+\/[^/]+|[^/]+)/u,n=e.match(t);if(n)return n[1];let c=e.indexOf("/");return c>0?e.slice(0,c):"/"}var Vt=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],St=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function Yt(){if(typeof document>"u")return!1;let e=document.body?.classList;return!!e&&(e.contains("theme-light")||e.contains("theme-pink"))}var it=new Map;function se(e){let t=Yt()?St:Vt,c=`${t===St?"l":"d"}:${e??"__own__"}`;if(it.has(c))return it.get(c);let f=e??"__own__",x=0;for(let o of f)x=x*37+o.codePointAt(0)|0;let S=((x%t.length+t.length)%t.length*7+3)%t.length,I=t[S];return it.set(c,I),I}function $t(e){if(!e)return 0;let t=0;for(let n of ce)t+=e[n]??0;return t}function Ut(e){if(!e)return null;for(let t of ce)if((e[t]??0)>0)return t;return null}function zt(e,t,n,c,f,x,p,S={}){let I=S.pkgOf??Ke,o=new Set(t),y=new Map,b=new Map;for(let d of t){let $=(e[d].imports??[]).filter(N=>o.has(N));y.set(d,$);for(let N of $)b.has(N)||b.set(N,[]),b.get(N).push(d)}let C=t.map(d=>{let $=n.get(d),N=c?.get(d)??null,h=$t($),G=I(d)??"__own__",j=Ut($);return{id:d,file:d,pkg:G,x:0,y:0,deg:0,issue:j,totalIssues:h,own:$,subtree:N,size:typeof e[d]?.size=="number"?e[d].size:null,severitySet:f?.get(d)??null,colorSet:x?.get(d)??null,findings:p?.get(d)??null,isHub:!1,label:d.split("/").pop()??d}}),r=new Map(C.map(d=>[d.file,d])),R=new Map;for(let d of t)for(let $ of y.get(d)??[]){let[N,h]=d<$?[d,$]:[$,d],G=`${N}\0${h}`,j=R.get(G);if(!j){let D=r.get(N),A=r.get(h);if(!D||!A)continue;j={a:N,b:h,cross:D.pkg!==A.pkg,fromLo:!1,fromHi:!1},R.set(G,j),D.deg++,A.deg++}d===N?j.fromLo=!0:j.fromHi=!0}let Z=[...R.values()],g=new Map;for(let d=0;d<Z.length;d++){let $=Z[d];g.has($.a)||g.set($.a,[]),g.has($.b)||g.set($.b,[]),g.get($.a).push(d),g.get($.b).push(d)}let k=new Map;for(let d of C)k.set(d.pkg,(k.get(d.pkg)??0)+1);let L=[...k.entries()].toSorted((d,$)=>$[1]-d[1]).map(([d])=>d),P=new Map;for(let d of C)P.has(d.pkg)||P.set(d.pkg,[]),P.get(d.pkg).push(d);let _={files:t,nodes:C,nodeByFile:r,edges:Z,adj:g,importsOf:y,importedBy:b,packages:L,pkgCount:k,byPkg:P};return Kt(_),_}function Kt(e){for(let t of e.nodes)t.isHub=!1;for(let t of e.edges)t.cross&&(t.fromLo&&(e.nodeByFile.get(t.b).isHub=!0),t.fromHi&&(e.nodeByFile.get(t.a).isHub=!0));for(let t of e.nodes){let n=e.importedBy.get(t.file);(!n||n.length===0)&&(t.isHub=!0)}}function Xe(e,t){if(!t||t==="/"||t==="__own__")return e;for(let n of["node_modules","dependencies",Ye()]){let c=n+"/"+t+"/",f=e.indexOf(c);if(f>=0)return e.slice(f+c.length)}return e.startsWith(t+"/")?e.slice(t.length+1):e}function Ct(e,t){let n=t.extraTopRow,c=t.hideAllFiles??!1,f=t.triageCounts??{fixed:0,invalid:0,deleted:0},x=t.triageStates??["fixed","invalid","deleted"],p={};for(let r of ce)p[r]=0;for(let r of e.nodes)if(r.severitySet)for(let R of r.severitySet)p[R]!==void 0&&p[R]++;let S=ce.some(r=>p[r]>0||M.selectedSeverities.has(r)),I=["none","red","blue","green","gray"],o={none:0,red:0,blue:0,green:0,gray:0};for(let r of e.nodes)if(r.colorSet)for(let R of r.colorSet)o[R]!==void 0&&o[R]++;let y=I.some(r=>o[r]>0||M.selectedColors.has(r)),b=E`<triage-selector variant="graph" .counts="${f}" .states="${x}"></triage-selector>`,C=c?null:E`<button type="button" class="${Se({"g2-topbar-toggle":!0,on:M.showAll})}" data-g2-show-all aria-pressed="${String(M.showAll)}"><span>All files</span><span class="g2-switch"></span></button>`;return E`<div class="graph2-topbar">${n?E`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${n} ${C}<div class="g2-spacer"></div>${b}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${S?E`<severity-chips .counts="${p}" .selected="${[...M.selectedSeverities]}" kind="graph"></severity-chips>`:null} ${y?E`<triage-filter .counts="${o}" .selected="${[...M.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="${M.pathFilter}"> <button type="button" class="g2-path-filter-clear" id="g2-path-filter-clear" title="Clear filter" aria-label="Clear filter">✕</button></div>${n?null:C}<div class="g2-spacer"></div>${n?null:b} <button type="button" class="g2-icon-btn" id="g2-fullscreen" title="Toggle fullscreen">⛶</button></div></div>`}function Xt(e,t){let n=e.split("/").filter(Boolean),c=t.split("/").filter(Boolean),f=0;for(;f<n.length&&f<c.length&&n[f]===c[f];)f++;let x=n.length-f,p=c.slice(f).join("/");return x===0?"./"+p:"../".repeat(x)+p}function Zt(e,t){if(!t&&t!=="")return e;let n=Xt(t,e);return n.length<e.length?n:e}function at(e,t,n,c){let f=n.length;if(f===0)return E`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${f})</div><div class="g2-sel-section-empty">none</div></div>`;let x=n.map(p=>({file:p,display:Zt(p,c)}));return x.sort((p,S)=>p.display.localeCompare(S.display)),E`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${f})</div><ul class="g2-sel-file-list">${x.map(({file:p,display:S})=>{let I=e.nodeByFile.get(p),o=I?se(I.pkg):"#666";return E`<li><button type="button" class="g2-sel-file-link" data-g2-select="${p}" title="${p}"><span class="g2-sel-file-dot" style="${$e({background:o})}"></span> <span class="g2-sel-file-path">${S}</span></button></li>`})}</ul></div>`}function Re(e){if(!e)return E`<div class="g2-sel-section-empty">none</div>`;let n=["critical","high","medium","low","high_bug","bug","informational"].filter(c=>(e[c]??0)>0);return n.length===0?E`<div class="g2-sel-section-empty">none</div>`:E`<div class="tree-count-chips">${n.map(c=>E`<span class="${`tree-count-chip ${c}`}">${e[c]} ${c.replaceAll("_"," ")}</span>`)}</div>`}function Pt(e){let t=0;for(let p of e.edges)p.cross&&t++;let n=e.edges.length-t,c=0;for(let p of e.nodes)c+=p.totalIssues;let f=e.nodes.length===0?"0.0":(e.edges.length*2/e.nodes.length).toFixed(1),x=M.focusedPkg==="__own__"?"own source":M.focusedPkg;return E`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${M.focusedPkg?E`<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>${e.nodes.length}</b> files</span> <span><b>${e.packages.length}</b> packages</span> <span><b>${e.edges.length}</b> edges (${n} intra · ${t} cross)</span> <span><b>${c}</b> issues</span> <span>avg degree <b>${f}</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 _t(e){let t=null;if(M.selected){let c=e.nodeByFile.get(M.selected);c&&(t=c.pkg)}else M.solo&&(t=M.solo);return!t||(e.pkgCount.get(t)??0)<=1||M.focusedPkg===t?null:E`<button type="button" class="g2-focus-pkg-btn" data-g2-focus-pkg="${t}" title="${`Focus on ${t==="__own__"?"own source":t}'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 Ft(){return E`<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 Lt(e){let t=M.showAll&&e.nodes.length>0&&e.nodes.every(f=>typeof f.size=="number"),n=e.nodes.some(f=>f.totalIssues>0),c=M.topPkgsTab;return c==="size"&&!t&&(c="files"),c==="issues"&&!n&&(c="files"),E`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${n?E`<button type="button" class="${Se({"g2-mini-tab":!0,on:c==="issues"})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${Se({"g2-mini-tab":!0,on:c==="files"})}" data-g2-top-pkgs="files">Files</button> ${t?E`<button type="button" class="${Se({"g2-mini-tab":!0,on:c==="size"})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${eo(e,c)}`}function It(e,t={}){let n=M.selected;if(n){let c=e.nodeByFile.get(n);return c?Jt(e,c,n,t):E`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return M.solo?Qt(e,M.solo):E`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function Jt(e,t,n,c){let f=se(t.pkg),x=t.pkg==="__own__"?"own source":t.pkg,p=Xe(n,t.pkg),S=e.importedBy.get(n)??[],I=e.importsOf.get(n)??[],o=n.lastIndexOf("/"),y=o>=0?n.slice(0,o):"";return E`<div class="g2-selection-card"><div class="g2-sel-file-head"><div class="g2-sel-path">${p}</div><div class="g2-sel-pkg-row"><span class="g2-sel-dot" style="${$e({"--dot":f,background:f})}"></span> <span class="g2-sel-pkg">${x}</span></div></div><div class="g2-sel-fullpath" title="${n}">${n}</div>${Ue(t.size)?E`<div class="g2-sel-size">${Ue(t.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${Re(t.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${Re(t.subtree)}</div><div class="g2-sel-jumps">${t.totalIssues>0?E`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${n}">Findings →</button>`:null} ${c.isBundleContext?t.origFile?E`<button type="button" class="g2-sel-jump" data-bundle-view-source="${t.origFile}">View source →</button>`:null:E`<button type="button" class="g2-sel-jump" data-g2-jump-file="${n}">Files →</button>`}</div>${at(e,"Imported by",S,y)} ${at(e,"Imports",I,y)}</div>`}function Qt(e,t){let n=e.nodes.filter(b=>b.pkg===t),c=n.length;if(c===0)return E`<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 f=se(t),x=t==="__own__"?"own source":t,p={};for(let b of ce)p[b]=0;for(let b of n)if(b.own)for(let C of ce)p[C]+=b.own[C]??0;let S=0,I=0;for(let b of e.edges){let C=e.nodeByFile.get(b.a),r=e.nodeByFile.get(b.b);!C||!r||(C.pkg===t&&r.pkg===t?I++:(C.pkg===t||r.pkg===t)&&S++)}let o=0;for(let b of n)b.isHub&&o++;let y=new Set;for(let b of n)for(let C of e.importedBy.get(b.file)??[]){let r=e.nodeByFile.get(C);r&&r.pkg!==t&&y.add(C)}return E`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${$e({"--dot":f,background:f})}"></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">${c}</span></div><div class="g2-sel-row"><span class="k">Hubs</span><span class="v">${o}</span></div><div class="g2-sel-row"><span class="k">Intra edges</span><span class="v">${I}</span></div><div class="g2-sel-row"><span class="k">Cross edges</span><span class="v">${S}</span></div></div><div class="g2-sel-section"><div class="g2-sel-section-label">Findings</div>${Re(p)}</div>${at(e,"Imported by",[...y])}</div>`}function eo(e,t){let n=e.nodes.length||1,c=t??M.topPkgsTab,f=M.selectedSeverities,x=M.selectedColors,p=f.size>0,S=x.size>0,I=p||S,o=new Map,y=new Map,b=0,C=0;for(let g of e.nodes){let k;if(I){if(k=0,g.findings)for(let L of g.findings)p&&!f.has(L.severity)||S&&!x.has(L.color)||k++}else k=g.totalIssues;o.set(g.pkg,(o.get(g.pkg)??0)+k),b+=k,typeof g.size=="number"&&(y.set(g.pkg,(y.get(g.pkg)??0)+g.size),C+=g.size)}let r;c==="issues"?r=e.packages.filter(g=>(o.get(g)??0)>0).toSorted((g,k)=>{let L=o.get(g)??0,P=o.get(k)??0;return P!==L?P-L:(e.pkgCount.get(k)??0)-(e.pkgCount.get(g)??0)}):c==="size"?r=e.packages.filter(g=>(y.get(g)??0)>0).toSorted((g,k)=>{let L=y.get(g)??0,P=y.get(k)??0;return P!==L?P-L:(e.pkgCount.get(k)??0)-(e.pkgCount.get(g)??0)}):r=[...e.packages].toSorted((g,k)=>{let L=e.pkgCount.get(g)??0,P=e.pkgCount.get(k)??0;return P!==L?P-L:(o.get(k)??0)-(o.get(g)??0)});let R=g=>c==="issues"?b>0?((o.get(g)??0)/b*100).toFixed(2):"0":c==="size"?C>0?((y.get(g)??0)/C*100).toFixed(2):"0":(e.pkgCount.get(g)/n*100).toFixed(2),Z=c==="issues"?"No packages with issues":c==="size"?"No packages with size":"No packages";return E`<div class="g2-dist-bar">${e.packages.map(g=>{let k=se(g);return E`<span style="${$e({background:k,width:`${R(g)}%`})}"></span>`})}</div><div class="g2-dist-list">${r.length===0?E`<div class="g2-dist-empty">${Z}</div>`:null} ${vt(r,g=>g,g=>{let k=se(g),L=e.pkgCount.get(g)??0,P=o.get(g)??0,_=y.get(g)??0,d=c==="issues"?P:c==="size"?Ue(_):L,$=c==="issues"?b>0?(P/b*100).toFixed(1):"0.0":c==="size"?C>0?(_/C*100).toFixed(1):"0.0":(L/n*100).toFixed(1),N=g==="__own__"?"own source":g,h=M.solo===g;return E`<button type="button" class="${Se({"g2-dist-item":!0,on:h})}" data-g2-pkg="${g}" title="${N}"><span class="g2-dist-dot" style="${$e({background:k})}"></span><span class="g2-dist-name">${N}</span><span class="g2-dist-count">${d}</span><span class="g2-dist-pct">${$}%</span></button>`})}</div>`}var lt=class extends xt{static properties={graph:{attribute:!1},options:{attribute:!1}};static styles=[Ve(wt),Ve(kt),Ve(yt)];constructor(){super(),this.graph=null,this.options={}}render(){return this.graph?E`<div class="graph2-layout">${Ct(this.graph,this.options)} ${Pt(this.graph)} ${Ft()}</div>`:E``}};customElements.define("graph-layout",lt);function to(e){let t=new Map;for(let[n,c]of e.importsOf){let f=e.nodeByFile.get(n);if(f)for(let x of c){let p=e.nodeByFile.get(x);p&&f.pkg!==p.pkg&&(t.set(f.pkg,(t.get(f.pkg)??0)+1),t.set(p.pkg,(t.get(p.pkg)??0)+1))}}return t}function oo(e){if(e.packages.length===0)return null;let t=new Set;for(let[n,c]of e.importedBy){let f=e.nodeByFile.get(n);if(f)for(let x of c){let p=e.nodeByFile.get(x);if(p&&p.pkg!==f.pkg){t.add(f.pkg);break}}}for(let n of e.packages)if(!t.has(n))return n;return null}var ro=5;function Rt(e,t){let n=new Map;for(let x of e.nodes)t.has(x.pkg)&&(n.has(x.pkg)||n.set(x.pkg,[]),n.get(x.pkg).push(x));for(let x of n.values())x.sort((p,S)=>p.isHub!==S.isHub?p.isHub?-1:1:S.deg-p.deg);let c=new Map,f=new Map;for(let[x,p]of t){let S=n.get(x);if(!S||S.length===0)continue;let I=S.length,o=0;for(let k of S)if(k.isHub)o++;else break;let y=o>0&&o<=ro,b=y?o:0,C=I-b,r=p.groupR,R=Array.from({length:I}),Z=Array.from({length:I});for(let k=0;k<I;k++){let L=k*137.508*Math.PI/180,P;if(k<b)P=b<=1?0:Math.sqrt(k/(b-1))*.3*r;else{let _=k-b;P=C<=1?.4*r:(.4+Math.sqrt(_/(C-1))*.6)*r}R[k]=p.x+Math.cos(L)*P,Z[k]=p.y+Math.sin(L)*P}let g=Array.from({length:I},()=>!1);for(let k=0;k<I;k++){let L=S[k],P,_;y&&L.isHub?(_=0,P=b):y?(_=b,P=I):(_=0,P=I);let d=0,$=0,N=0,h=e.importsOf.get(L.file);if(h)for(let A of h){let q=c.get(A);q!==void 0&&(d+=q,$+=f.get(A),N++)}let G=e.importedBy.get(L.file);if(G)for(let A of G){let q=c.get(A);q!==void 0&&(d+=q,$+=f.get(A),N++)}let j=!1;if(N>0){d/=N,$/=N;let A=d-p.x,q=$-p.y;A*A+q*q>1&&(j=!0)}let D=-1;if(j){let A=1/0;for(let q=_;q<P;q++){if(g[q])continue;let l=R[q]-d,F=Z[q]-$,O=l*l+F*F;O<A&&(A=O,D=q)}}else for(let A=_;A<P;A++)if(!g[A]){D=A;break}g[D]=!0,L.x=R[D],L.y=Z[D],c.set(L.file,L.x),f.set(L.file,L.y)}}}function At(e,t,n){let c=t/2,f=n/2,x=Math.min(t,n)/2;if(e.packages.length===0)return;let S=oo(e),I=to(e),o=(S?e.packages.filter(l=>l!==S):[...e.packages]).toSorted((l,F)=>{let O=(I.get(F)??0)-(I.get(l)??0);return O!==0?O:(e.pkgCount.get(F)??0)-(e.pkgCount.get(l)??0)}),y=o.length,b;y<=0?b=0:y<=6?b=.65:y<=20?b=.82:b=.95;let C=Math.max(1,Math.sqrt(50/Math.max(1,y))),r=.22,R=.12,Z=.04,g=new Map,k;if(S){let l=e.pkgCount.get(S)??0,F=Math.min(r,(.012+Math.sqrt(l)*.004)*C);k=Math.max(y<=6?.4:y<=20?.36:.34,F+R+Z),g.set(S,{x:c,y:f,size:l,groupR:F*x})}else y<=1?k=0:y<=6?k=.4:y<=20?k=.32:k=.3;if(y===0){Rt(e,g);return}let L=new Map;for(let l of e.edges){if(!l.cross)continue;let F=e.nodeByFile.get(l.a)?.pkg,O=e.nodeByFile.get(l.b)?.pkg;if(!F||!O||F===O)continue;L.has(F)||L.set(F,new Map),L.has(O)||L.set(O,new Map);let ee=L.get(F),J=L.get(O);ee.set(O,(ee.get(O)??0)+1),J.set(F,(J.get(F)??0)+1)}let P=Math.max(1,Math.min(10,Math.round(Math.sqrt(y)/1.2))),_=Array.from({length:P+1});for(let l=0;l<=P;l++)_[l]=Math.floor(l*l/(P*P)*y);_[P]=y;let d=.2,$=Array.from({length:P}),N=Array.from({length:P});for(let l=0;l<P;l++){let F=_[l],O=_[l+1];$[l]=O-F;let ee=0;for(let J=F;J<O;J++)ee+=e.pkgCount.get(o[J])??0;N[l]=ee}let h=Array.from({length:P});for(let l=0;l<P;l++){let F=(_[l]+_[l+1]-1)/2/Math.max(1,y-1);h[l]=Math.sqrt(Math.max(0,F))}let G=Array.from({length:P});G[0]=h[0];for(let l=1;l<P;l++){let F=$[l-1],O=N[l-1],ee=F>0?O/F:1,J=1+d*Math.sqrt(Math.max(0,ee-1));G[l]=G[l-1]+(h[l]-h[l-1])*J}let j=Array.from({length:P});for(let l=0;l<P;l++)j[l]=G[l]-h[l];let D=Array.from({length:y}),A=Array.from({length:y}),q=0;for(let l=0;l<y;l++){for(;q<P-1&&l>=_[q+1];)q++;let F=l*137.508%360*Math.PI/180,ee=(y<=1?0:Math.sqrt(l/(y-1)))+j[q],J=y===1?S?k:0:k+ee*(b-k);D[l]=c+Math.cos(F)*J*x,A[l]=f+Math.sin(F)*J*x}for(let l=0;l<P;l++){let F=_[l],O=_[l+1],ee=O-F;if(ee===0)continue;let J=Array.from({length:ee},()=>!1);for(let Ce=F;Ce<O;Ce++){let ve=o[Ce],Ae=L.get(ve),de=0,ae=0,ie=0;if(Ae)for(let[te,oe]of Ae){let fe=g.get(te);fe&&(de+=fe.x*oe,ae+=fe.y*oe,ie+=oe)}let ye=!1;if(ie>0){de/=ie,ae/=ie;let te=de-c,oe=ae-f;te*te+oe*oe>1&&(ye=!0)}let ue=-1;if(ye){let te=1/0;for(let oe=0;oe<ee;oe++){if(J[oe])continue;let fe=F+oe,He=D[fe]-de,Ee=A[fe]-ae,Fe=He*He+Ee*Ee;Fe<te&&(te=Fe,ue=oe)}}else for(let te=0;te<ee;te++)if(!J[te]){ue=te;break}J[ue]=!0;let Pe=F+ue,_e=e.pkgCount.get(ve)??0,Be=Math.min(R,(.012+Math.sqrt(_e)*.004)*C);g.set(ve,{x:D[Pe],y:A[Pe],size:_e,groupR:Be*x})}}Rt(e,g)}function Bt(e,t,n){let c=t/2,f=n/2,x=Math.min(t,n)/2,p=e.nodes.length;if(p===0)return;let S=[...e.nodes].toSorted((I,o)=>o.deg-I.deg);for(let I=0;I<p;I++){let o=S[I],y=I*137.508%360*Math.PI/180,b=p<=1?0:Math.sqrt(I/(p-1));o.x=c+Math.cos(y)*b*.85*x,o.y=f+Math.sin(y)*b*.85*x}}function Ht(e,t,n,c){let f=e.length,x=c||760,p=n||1100,S=Math.sqrt(p*x/Math.max(f,1))*1.1,I=_=>{let d=0;for(let $ of _)d=d*31+$.codePointAt(0)|0;return d},o=Math.ceil(Math.sqrt(f*p/x)),y=Math.ceil(f/o),b=x/(y+1),C=p/(o+1),r=e.map((_,d)=>{let $=d%o,N=Math.floor(d/o),h=I(_);return{file:_,x:($+1)*C+(h%100-50)*C*.4,y:(N+1)*b+((h>>7)%100-50)*b*.4,dx:0,dy:0}}),R=new Map(r.map((_,d)=>[_.file,d])),Z=[];for(let _ of e)for(let d of t.get(_)??[])R.has(d)&&Z.push([R.get(_),R.get(d)]);let g=new Map;for(let _=0;_<f;_++){let d=Ke(r[_].file)??"__own__";g.has(d)||g.set(d,[]),g.get(d).push(_)}let k=Math.min(500,Math.max(180,100+f*3)),L=Math.min(p,x)/6,P=.3;for(let _=0;_<k;_++){let d=L*Math.pow(P/L,_/k);for(let h of r)h.dx=0,h.dy=0;for(let h=0;h<f;h++)for(let G=h+1;G<f;G++){let j=r[h],D=r[G],A=j.x-D.x,q=j.y-D.y,l=Math.sqrt(A*A+q*q);if(l<.01){let O=I(j.file+D.file);A=(O%100-50)*.01||.5,q=((O>>7)%100-50)*.01||.5,l=Math.sqrt(A*A+q*q)}let F=S*S/l;j.dx+=A/l*F,j.dy+=q/l*F,D.dx-=A/l*F,D.dy-=q/l*F}for(let[h,G]of Z){let j=r[h],D=r[G],A=j.x-D.x,q=j.y-D.y,l=Math.sqrt(A*A+q*q)||.01,F=l*l/S;j.dx-=A/l*F,j.dy-=q/l*F,D.dx+=A/l*F,D.dy+=q/l*F}let $=.055*Math.min(1,d/(L*.3));for(let[,h]of g){if(h.length<2)continue;let G=0,j=0;for(let D of h)G+=r[D].x,j+=r[D].y;G/=h.length,j/=h.length;for(let D of h)r[D].dx+=(G-r[D].x)*$,r[D].dy+=(j-r[D].y)*$}let N=50;for(let h of r){let G=Math.sqrt(h.dx*h.dx+h.dy*h.dy)||.01;h.x+=h.dx/G*Math.min(G,d),h.y+=h.dy/G*Math.min(G,d),h.x=Math.max(N,Math.min(p-N,h.x)),h.y=Math.max(N,Math.min(x-N,h.y))}}return r}var Et={critical:"#ff5470",high:"#ff9d4a",medium:"#f4d35e",low:"#67c2ff",high_bug:"#a06c3f",bug:"#7a6d62",informational:"#218bff"},ct={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 no(){let e=document.body.classList;return e.contains("theme-pink")?ct.pink:e.contains("theme-light")?ct.light:ct.dark}function ze(e){return Math.max(0,Math.min(255,Math.round(e*255))).toString(16).padStart(2,"0")}function so(e,t,n){let f=e.querySelector("graph-layout")?.shadowRoot;if(!f)return;let x=f.querySelector("#g2-canvas"),p=f.querySelector("#g2-tooltip"),S=f.querySelector(".graph2-stage"),I=f.querySelector("#g2-zoom-pct");if(!x)return;Mt();let o=x.getContext("2d"),y=window.devicePixelRatio||1,b=0,C=0,r={tx:0,ty:0,k:1},R=null,Z=0,g=0,k=!0,L=!0;function P(){if(!k)return;let i=M.layoutCache,u=M.focusedPkg;if(i&&i.files===t.files&&i.w===g&&i.h===Z&&i.focused===u)for(let v of t.nodes){let s=i.pos.get(v.file);s&&(v.x=s.x,v.y=s.y)}else{if(u)if(t.nodes.length>50)Bt(t,g,Z);else{let s=Ht(t.files,t.importsOf,g,Z),m=new Map(s.map(z=>[z.file,z]));for(let z of t.nodes){let T=m.get(z.file);T&&(z.x=T.x,z.y=T.y)}}else At(t,g,Z);let v=new Map;for(let s of t.nodes)v.set(s.file,{x:s.x,y:s.y});M.layoutCache={files:t.files,w:g,h:Z,pos:v,focused:u}}k=!1}function _(){if(t.nodes.length===0)return{k:1,tx:C/2,ty:b/2};let i=-1/0,u=-1/0,v=1/0,s=1/0;for(let a of t.nodes)a.x<v&&(v=a.x),a.y<s&&(s=a.y),a.x>i&&(i=a.x),a.y>u&&(u=a.y);let m=Math.max(20,u-s),z=Math.max(20,i-v),T=(v+i)/2,W=(s+u)/2,V=Math.min(C,b)*.1,U=Math.min((C-V*2)/z,(b-V*2)/m,4),K=Math.max(.05,U);return{k:K,tx:C/2-T*K,ty:b/2-W*K}}function d(){let i=_();r.k=i.k,r.tx=i.tx,r.ty=i.ty}function $(i,u){return[i*r.k+r.tx,u*r.k+r.ty]}function N(i,u){return[(i-r.tx)/r.k,(u-r.ty)/r.k]}function h(i){return!M.hidden.has(i.pkg)}function G(i){if(M.selectedSeverities.size>0){let v=i.severitySet;if(!v)return!0;let s=!1;for(let m of M.selectedSeverities)if(v.has(m)){s=!0;break}if(!s)return!0}if(M.selectedColors.size>0){let v=i.colorSet;if(!v)return!0;let s=!1;for(let m of M.selectedColors)if(v.has(m)){s=!0;break}if(!s)return!0}if(M.solo&&i.pkg!==M.solo)return!0;let u=M.pathFilter;if(u){let v=u.toLowerCase(),s=i.file.toLowerCase().includes(v),m=i.pkg&&i.pkg.toLowerCase().includes(v);if(!s&&!m)return!0}return!1}function j(i){let u=(i.isHub?4.9:3.5)*M.nodeSize,v=Math.max(.6,Math.min(1.6,r.k));return u*v}function D(){let i=S.getBoundingClientRect(),u=b,v=C;C=Math.max(80,i.width),b=Math.max(80,i.height),y=window.devicePixelRatio||1,x.width=C*y,x.height=b*y,x.style.width=C+"px",x.style.height=b+"px",o.setTransform(y,0,0,y,0,0),(g===0||Z===0)&&(g=C,Z=b,k=!0),P();let s=v>0&&(Math.abs(C-v)/v>.15||Math.abs(b-u)/u>.15);(L||s)&&(d(),L=!1),O()}let A=null,q=!0,l=!1,F=!1;function O(){q=!0,!(l||F)&&(l=!0,A=requestAnimationFrame(()=>{l=!1,q&&!F&&(q=!1,ee())}))}function ee(){let i=no();o.fillStyle=i.bg,o.fillRect(0,0,C,b),J(i);let u=M.selected,v=u?t.nodeByFile.get(u):null;if(M.focusedPkg&&t.nodes.length<=50){Ce(i,u,v);return}for(let s of t.edges){let m=t.nodeByFile.get(s.a),z=t.nodeByFile.get(s.b);if(!m||!z||!h(m)||!h(z))continue;let T=M.edgeOpacity;u?T=s.a===u||s.b===u?.85:M.edgeOpacity*.25:R&&(s.a===R||s.b===R)&&(T=Math.min(.9,T+.5)),G(m)&&G(z)&&(T=Math.min(T,.04));let[W,V]=$(m.x,m.y),[U,K]=$(z.x,z.y);if(s.cross){let a=o.createLinearGradient(W,V,U,K);a.addColorStop(0,se(m.pkg)+ze(T)),a.addColorStop(1,se(z.pkg)+ze(T)),o.strokeStyle=a,o.lineWidth=.85}else o.strokeStyle=i.edgeIntra.replace("ALPHA",String(T*.7)),o.lineWidth=.55;o.beginPath(),o.moveTo(W,V),o.lineTo(U,K),o.stroke()}for(let s of t.nodes){if(!h(s))continue;let m=s.file===R,z=s.file===u;if(!s.isHub&&!m&&!z||G(s)&&!m&&!z)continue;let[T,W]=$(s.x,s.y),U=j(s)*(z?6:m?4.5:3),K=o.createRadialGradient(T,W,0,T,W,U),a=se(s.pkg);K.addColorStop(0,a+"55"),K.addColorStop(1,a+"00"),o.fillStyle=K,o.beginPath(),o.arc(T,W,U,0,Math.PI*2),o.fill()}for(let s of t.nodes){if(!h(s))continue;let[m,z]=$(s.x,s.y),T=j(s),W=1,V=u&&s.file===u;if(u&&!V&&(W=(t.adj.get(u)??[]).some(K=>{let a=t.edges[K];return a.a===s.file||a.b===s.file})?1:.25),!V&&G(s)&&(W=Math.min(W,.1)),o.fillStyle=se(s.pkg)+ze(W),o.beginPath(),o.arc(m,z,T,0,Math.PI*2),o.fill(),s.isHub&&(o.strokeStyle=i.hubRing.replace("ALPHA",String(.55*W)),o.lineWidth=.8,o.stroke()),s.issue){let U=Et[s.issue],K=T+(s.issue==="critical"?4.2:s.issue==="high"?3.4:2.8),a=s.issue==="critical"?1.8:s.issue==="high"?1.5:s.issue==="medium"?1.3:1.1;o.strokeStyle=U,o.globalAlpha=W,o.lineWidth=a,o.beginPath(),o.arc(m,z,K,0,Math.PI*2),o.stroke(),o.globalAlpha=1}}if(r.k>1.4){let m=0;if(r.k<9&&!M.showLabels)for(let T of t.nodes){if(!h(T))continue;let[W,V]=$(T.x,T.y);if(!(W<0||W>C||V<0||V>b)&&(m++,m>=50))break}let z=r.k>=9||m<50;if(M.showLabels||z){o.font="10px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",o.fillStyle=i.labelFill,o.textAlign="left",o.textBaseline="middle";let T=11,W=2,V=250,U=(w,H)=>w>-V&&w<C+V&&H>-V&&H<b+V,K=[];for(let w of t.nodes){if(!h(w))continue;let[H,X]=$(w.x,w.y);if(!U(H,X))continue;let Q=j(w);K.push({file:w.file,x0:H-Q,x1:H+Q,y0:X-Q,y1:X+Q})}let a=[];for(let w of t.nodes){if(!h(w)||!w.isHub&&r.k<2.4)continue;let[H,X]=$(w.x,w.y);if(!U(H,X))continue;let Q=j(w),re=H+Q+4,ne=X+1,ke=o.measureText(w.label).width+W,Te=w.file===M.selected,Oe=w.file===R,qe=Te?3:Oe?2:w.isHub?1:0;a.push({file:w.file,n:w,tx:re,ty:ne,prio:qe,x0:re-W,x1:re+ke,y0:ne-T/2,y1:ne+T/2})}a.sort((w,H)=>H.prio-w.prio);let B=[],Y=(w,H)=>w.x0<H.x1&&H.x0<w.x1&&w.y0<H.y1&&H.y0<w.y1;for(let w of a){let H=!1;for(let X of K)if(X.file!==w.file&&Y(w,X)){H=!0;break}if(!H){for(let X of B)if(Y(w,X)){H=!0;break}}H||B.push(w)}for(let w of B)o.fillText(w.n.label,w.tx,w.ty)}}if(v&&h(v)){let[s,m]=$(v.x,v.y),z=j(v);o.strokeStyle=i.selectRing,o.lineWidth=1.5,o.beginPath(),o.arc(s,m,z+5,0,Math.PI*2),o.stroke()}I&&(I.textContent=`${Math.round(r.k*100)}%`)}function J(i){if(r.k<.4)return;let u=80,v=(r.tx%u+u)%u,s=(r.ty%u+u)%u;o.strokeStyle=i.grid,o.lineWidth=1,o.beginPath();for(let m=v;m<C;m+=u)o.moveTo(m,0),o.lineTo(m,b);for(let m=s;m<b;m+=u)o.moveTo(0,m),o.lineTo(C,m);o.stroke()}function Ce(i,u,v){let s=se(M.focusedPkg),m=new Set;if(R){m.add(R);for(let a of t.adj.get(R)??[]){let B=t.edges[a];m.add(B.a),m.add(B.b)}}let z=a=>(a.isHub?6:4)*M.nodeSize;for(let a of t.edges){let B=t.nodeByFile.get(a.a),Y=t.nodeByFile.get(a.b);if(!B||!Y||!h(B)||!h(Y))continue;let w=a.fromLo&&a.fromHi,H=!w&&a.fromHi,X=H?Y:B,Q=H?B:Y,re=R&&(a.a===R||a.b===R),ne=u&&(a.a===u||a.b===u),ke=(u||R)&&!re&&!ne,Te=z(X),Oe=z(Q),[qe,ft]=$(X.x,X.y),[pt,gt]=$(Q.x,Q.y),Ze=pt-qe,Je=gt-ft,Qe=Math.sqrt(Ze*Ze+Je*Je)||1,et=Ze/Qe,tt=Je/Qe,be=qe+et*(Te+1.5),he=ft+tt*(Te+1.5),me=pt-et*(Oe+3.5),xe=gt-tt*(Oe+3.5),ut=Math.min(Qe*.15,30),Le=(be+me)/2-tt*ut,Ie=(he+xe)/2+et*ut;o.beginPath(),o.moveTo(be,he),o.quadraticCurveTo(Le,Ie,me,xe);let we;if(ne?we=.9:re?we=.85:ke?we=.05:we=Math.min(.85,M.edgeOpacity*3),o.strokeStyle=s+ze(we),o.lineWidth=ne||re?1.5:.85,o.stroke(),ke)continue;let le=Math.max(5,7),pe=le*.42,De=.9,ot=2*(1-De)*(Le-be)+2*De*(me-Le),rt=2*(1-De)*(Ie-he)+2*De*(xe-Ie),bt=Math.sqrt(ot*ot+rt*rt)||1,je=ot/bt,Ne=rt/bt;if(o.beginPath(),o.moveTo(me,xe),o.lineTo(me-je*le+Ne*pe,xe-Ne*le-je*pe),o.lineTo(me-je*le-Ne*pe,xe-Ne*le+je*pe),o.closePath(),o.fillStyle=s+ze(Math.min(1,we+.15)),o.fill(),w){let nt=1.8*(Le-be)+.2*(me-Le),st=2*(1-.1)*(Ie-he)+2*.1*(xe-Ie),ht=Math.sqrt(nt*nt+st*st)||1,We=nt/ht,Ge=st/ht;o.beginPath(),o.moveTo(be,he),o.lineTo(be+We*le-Ge*pe,he+Ge*le+We*pe),o.lineTo(be+We*le+Ge*pe,he+Ge*le-We*pe),o.closePath(),o.fill()}}for(let a of t.nodes){if(!h(a))continue;let[B,Y]=$(a.x,a.y),w=z(a),H=a.file===R,X=a.file===u,Q=(u||R)&&!m.has(a.file)&&!X?.15:1;if(o.globalAlpha=Q,X||H||a.isHub){let re=w*(X?4:H?3:2.4),ne=o.createRadialGradient(B,Y,w*.6,B,Y,re);ne.addColorStop(0,s+ze(X?.4:.25)),ne.addColorStop(1,s+"00"),o.fillStyle=ne,o.beginPath(),o.arc(B,Y,re,0,Math.PI*2),o.fill()}if(o.fillStyle=s,o.beginPath(),o.arc(B,Y,w,0,Math.PI*2),o.fill(),a.isHub&&(o.strokeStyle=i.hubRing.replace("ALPHA","0.55"),o.lineWidth=.9,o.stroke()),a.issue){let re=Et[a.issue],ne=w+(a.issue==="critical"?4.2:a.issue==="high"?3.4:2.8),ke=a.issue==="critical"?1.8:a.issue==="high"?1.5:a.issue==="medium"?1.3:1.1;o.strokeStyle=re,o.lineWidth=ke,o.beginPath(),o.arc(B,Y,ne,0,Math.PI*2),o.stroke()}o.globalAlpha=1}o.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",o.textAlign="center",o.textBaseline="top",o.lineJoin="round";let T=13,W=2,V=[];for(let a of t.nodes){if(!h(a))continue;let[B,Y]=$(a.x,a.y),w=z(a),H=Y+w+4,X=o.measureText(a.label).width/2+W,Q=a.file===u,re=a.file===R,ne=Q?3:re?2:a.isHub?1:0;V.push({n:a,sx:B,ty:H,halfW:X,isSel:Q,isHov:re,prio:ne,x0:B-X,x1:B+X,y0:H,y1:H+T})}V.sort((a,B)=>B.prio-a.prio);let U=[],K=(a,B)=>a.x0<B.x1&&B.x0<a.x1&&a.y0<B.y1&&B.y0<a.y1;for(let a of V){let B=!1;for(let Y of U)if(K(a,Y)){B=!0;break}B||U.push(a)}for(let a of U){let{n:B,sx:Y,ty:w,isSel:H,isHov:X}=a,Q=(u||R)&&!m.has(B.file)&&!H?.2:1;o.globalAlpha=Q,o.shadowColor=i.labelShadow,o.shadowBlur=4,o.strokeStyle=i.labelOutline,o.lineWidth=3,o.strokeText(B.label,Y,w),o.shadowBlur=0,o.fillStyle=H?i.labelSelected:X?i.labelHover:i.labelDefault,o.fillText(B.label,Y,w),o.globalAlpha=1}if(v&&h(v)){let[a,B]=$(v.x,v.y),Y=z(v);o.strokeStyle=i.selectRing,o.lineWidth=1.8,o.beginPath(),o.arc(a,B,Y+4,0,Math.PI*2),o.stroke()}I&&(I.textContent=`${Math.round(r.k*100)}%`)}function ve(i,u){let v=null,s=1/0,m=6;for(let z of t.nodes){if(!h(z))continue;let[T,W]=$(z.x,z.y),V=T-i,U=W-u,K=V*V+U*U,a=j(z)+m;K<a*a&&K<s&&(s=K,v=z)}return v}function Ae(i,u,v){if(!p)return;let s=S.getBoundingClientRect(),m=se(i.pkg),z=i.pkg==="__own__"?"own source":i.pkg,T=Xe(i.file,i.pkg);Me(E`<div class="g2-tt-path">${T}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${m}`}"></span> <span class="g2-tt-pkg">${z}</span></div>${i.totalIssues>0?Re(i.own):null}`,p),p.classList.add("show");let W=p.offsetWidth,V=p.offsetHeight,U=u-s.left,K=v-s.top,a=s.width,B=s.height,Y=12,w=U+Y;w+W>a-4&&(w=U-W-Y),w<4&&(w=4);let H=K+Y;H+V>B-4&&(H=K-V-Y),H<4&&(H=4),p.style.left=`${w}px`,p.style.top=`${H}px`}function de(){p&&p.classList.remove("show")}let ae=!1,ie=null,ye=!1,ue=i=>{i.button===0&&(i.target.closest(".g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl")||(ae=!0,ye=!1,ie={x:i.clientX,y:i.clientY,tx:r.tx,ty:r.ty}))},Pe=i=>{let u=S.getBoundingClientRect(),v=i.clientX-u.left,s=i.clientY-u.top;if(ae){let T=i.clientX-ie.x,W=i.clientY-ie.y;Math.abs(T)+Math.abs(W)>3&&(ye=!0),r.tx=ie.tx+T,r.ty=ie.ty+W,de(),O();return}let m=ve(v,s),z=R;R=m?.file??null,x.style.cursor=m?"default":"grab",m?Ae(m,i.clientX,i.clientY):z&&de(),R!==z&&O()},_e=i=>{if(ae&&!ye){let u=S.getBoundingClientRect(),v=i.clientX-u.left,s=i.clientY-u.top,m=ve(v,s);M.selected=m?.file??null,n(),O()}ae=!1},Be=()=>{let i=R!==null;R=null,de(),i&&O()},te=i=>{i.preventDefault();let u=S.getBoundingClientRect(),v=i.clientX-u.left,s=i.clientY-u.top,m=Math.exp(-i.deltaY*.0015),z=_();if(m<1&&r.k<=z.k*1.0001){r.k=z.k;let U=Math.min(.4,(1-m)*3);r.tx+=(z.tx-r.tx)*U,r.ty+=(z.ty-r.ty)*U,O();return}let[T,W]=N(v,s),V=Math.max(z.k,Math.min(9.99,r.k*m));r.k=V,r.tx=v-T*r.k,r.ty=s-W*r.k,O()};S.addEventListener("mousedown",ue),window.addEventListener("mousemove",Pe),window.addEventListener("mouseup",_e),S.addEventListener("mouseleave",Be),S.addEventListener("wheel",te,{passive:!1});function oe(i){let u=_().k;i=Math.max(u,Math.min(9.99,i));let v=C/2,s=b/2,[m,z]=N(v,s);r.k=i,r.tx=v-m*r.k,r.ty=s-z*r.k,O()}let fe=f.querySelector("#g2-zoom-in"),He=f.querySelector("#g2-zoom-out"),Ee=f.querySelector("#g2-zoom-fit");fe?.addEventListener("click",()=>oe(r.k*1.4)),He?.addEventListener("click",()=>oe(r.k/1.4)),Ee?.addEventListener("click",()=>{d(),O()}),D();let Fe=new ResizeObserver(()=>D());Fe.observe(S);let dt=new MutationObserver(i=>{for(let u of i){let v=(u.oldValue||"").includes("report-fullscreen"),s=document.body.classList.contains("report-fullscreen");if(v!==s){g=0,Z=0,k=!0,L=!0,M.layoutCache=null,setTimeout(()=>D(),80);return}O()}});dt.observe(document.body,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}),O(),M.graphState={requestDraw:O,_cleanup:()=>{F=!0,cancelAnimationFrame(A),Fe.disconnect(),dt.disconnect(),S.removeEventListener("mousedown",ue),window.removeEventListener("mousemove",Pe),window.removeEventListener("mouseup",_e),S.removeEventListener("mouseleave",Be),S.removeEventListener("wheel",te)}}}function Xo(e,t){let n=document.querySelector("graph-layout")?.shadowRoot;if(!n)return;let c=Tt(e),f=n.querySelector("#g2-selection-area");f&&Me(It(c,t),f);let x=n.querySelector("#g2-focus-overlay-slot");x&&Me(_t(c),x)}function Zo(e){let t=document.querySelector("graph-layout")?.shadowRoot;if(!t)return;let n=t.querySelector("#g2-top-pkgs-block");n&&Me(Lt(Tt(e)),n)}function Tt(e){let t=zt(e.treeData,e.files,e.ownCounts,e.transitiveCounts,e.severitySets,e.colorSets,e.fileFindings,e.options);if(e.strippedToOrig)for(let n of t.nodes)n.origFile=e.strippedToOrig.get(n.file);return t}export{Gt as _swapGraph2Impl,so as attachGraph2Interaction,Tt as buildGraphFromPrep,Xo as refreshSidebar,Zo as refreshTopPkgs};
package/out/index.html CHANGED
@@ -7,7 +7,7 @@
7
7
  <title>DeepView</title>
8
8
  <link rel="icon" href="./icon.svg" type="image/svg+xml" />
9
9
  <link rel="apple-touch-icon" href="./icon.svg" />
10
- <link rel="manifest" href="./manifest.webmanifest" />
10
+ <link rel="manifest" href="./manifest.webmanifest" crossorigin="use-credentials" />
11
11
  <meta name="theme-color" content="#1a1a1b" />
12
12
  <meta name="mobile-web-app-capable" content="yes" />
13
13
  <meta name="apple-mobile-web-app-capable" content="yes" />
@@ -21,20 +21,8 @@
21
21
  <body>
22
22
 
23
23
  <theme-toggle></theme-toggle>
24
- <button id="print-btn" type="button" title="print this report" aria-label="print">
25
- <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
26
- <path d="M6 9V2h12v7"/>
27
- <path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/>
28
- <rect x="6" y="14" width="12" height="8"/>
29
- </svg>
30
- </button>
31
- <button id="download-btn" type="button" title="download this report" aria-label="download">
32
- <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
33
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
34
- <polyline points="7 10 12 15 17 10"/>
35
- <line x1="12" x2="12" y1="15" y2="3"/>
36
- </svg>
37
- </button>
24
+ <print-button></print-button>
25
+ <download-button></download-button>
38
26
 
39
27
  <!-- App sidebar — Lit component, owns its own shadow-DOM chrome
40
28
  (brand header, search input, file list, sync button). The