@preventive/triage 1.0.0-alpha.0 → 1.0.0-alpha.10
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/api/reap.ts +79 -0
- package/common/save-error-reason.ts +20 -7
- package/common/server-info.ts +30 -0
- package/out/brotli-fallback.js +1 -1
- package/out/client-admin.js +28 -0
- package/out/client-managed.js +1 -0
- package/out/client-sync.js +17 -10
- package/out/graph.js +5 -4
- package/out/index.html +43 -38
- package/out/prism.js +2 -2
- package/out/terminal.js +32 -28
- package/out/view.css +1 -1
- package/out/view.js +78 -51
- package/package.json +70 -49
- package/{server → server-common}/origin.ts +5 -5
- package/{server → server-e2e}/auth.ts +16 -1
- package/server-e2e/bus-receiver.ts +95 -0
- package/server-e2e/cli.js +22 -0
- package/{server → server-e2e}/config.ts +21 -8
- package/{server → server-e2e}/db-neon.ts +41 -25
- package/{server → server-e2e}/db-revision-sql.ts +15 -9
- package/{server → server-e2e}/db-stmt.ts +2 -2
- package/{server → server-e2e}/db.ts +113 -135
- package/server-e2e/http.ts +266 -0
- package/{server → server-e2e}/hub.ts +27 -8
- package/{server → server-e2e}/index.ts +185 -52
- package/{server → server-e2e}/lifecycle.ts +36 -5
- package/server-e2e/npm-proxy.ts +348 -0
- package/{server → server-e2e}/objstore/blob-fs.ts +6 -8
- package/{server → server-e2e}/objstore/blob-vercel.ts +69 -36
- package/{server → server-e2e}/objstore/blob.ts +24 -9
- package/server-e2e/objstore/fetch-mint-guard.ts +74 -0
- package/{server → server-e2e}/objstore/handlers.ts +25 -15
- package/{server → server-e2e}/objstore/init.ts +52 -12
- package/{server → server-e2e}/objstore/reaper.ts +31 -11
- package/server-e2e/objstore/rest-deny.ts +28 -0
- package/server-e2e/objstore/rest-mint.ts +224 -0
- package/{server → server-e2e}/objstore/rest.ts +119 -84
- package/{server → server-e2e}/objstore/sign.ts +105 -0
- package/{server → server-e2e}/objstore/store-neon.ts +19 -19
- package/{server → server-e2e}/objstore/store.ts +98 -118
- package/{server → server-e2e}/objstore/tokens.ts +9 -12
- package/{server → server-e2e}/peer.ts +7 -9
- package/server-e2e/pubsub.ts +394 -0
- package/{server → server-e2e}/sign.ts +12 -14
- package/server-e2e/sse-server.ts +384 -0
- package/server-e2e/sse-session.ts +216 -0
- package/{server → server-e2e}/static.ts +22 -17
- package/server-e2e/sync-handlers.ts +382 -0
- package/{server → server-e2e}/util.ts +9 -0
- package/server-e2e/ws-server.ts +276 -0
- package/strip-types-loader.js +94 -0
- package/server/http.ts +0 -142
- package/server/sync-handlers.ts +0 -311
- package/server/ws-server.ts +0 -245
- /package/{server → server-e2e}/config.example.json +0 -0
- /package/{server → server-e2e}/neon-driver.ts +0 -0
- /package/{server → server-e2e}/objstore/fs.ts +0 -0
- /package/{server → server-e2e}/validation.ts +0 -0
package/out/graph.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
var he=globalThis[Symbol.for("@rray/frontend")];if(!he)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:me,html:A,nothing:Oe,unsafeCSS:Vt,render:St,StateElement:ao,classMap:vt,repeat:xe,styleMap:$t}=he;var ve=`*,*: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
|
-
`;var
|
|
3
|
-
`;var ke=`.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:.8rem;&: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 ct=["critical","high","medium","low","high_bug","bug","informational"],Ne="node_modules";function Ut(){return Ne}function Yt(e){return typeof e!="number"||!Number.isFinite(e)?null:`${e.toLocaleString()} B`}function We(){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 gt=We(),S=new Proxy(gt,{get(e,t){return gt[t]},set(e,t,r){return gt[t]=r,!0},has(e,t){return t in gt},deleteProperty(e,t){return delete gt[t]},ownKeys(){return Reflect.ownKeys(gt)},getOwnPropertyDescriptor(e,t){return Object.getOwnPropertyDescriptor(gt,t)}});function we(){S.graphState?._cleanup&&S.graphState._cleanup(),S.graphState=null}function Ge(e){e&&(gt=e)}function Kt(e){if(!e)return null;let t=Ut()==="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 Ve=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],Me=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function Ue(){return typeof document<"u"&&document.body?.classList.contains("theme-light")}var ie=new Map;function st(e){let t=Ue()?Me:Ve,d=`${t===Me?"l":"d"}:${e??"__own__"}`;if(ie.has(d))return ie.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 ie.set(d,R),R}function Se(e){if(!e)return 0;let t=0;for(let r of ct)t+=e[r]??0;return t}function Ye(e){if(!e)return null;for(let t of ct)if((e[t]??0)>0)return t;return null}function $e(e,t,r,d,p,m,g,w={}){let R=w.pkgOf??Kt,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=Se($),V=R(f)??"__own__",N=Ye($);return{id:f,file:f,pkg:V,x:0,y:0,deg:0,issue:N,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])),B=new Map;for(let f of t)for(let $ of y.get(f)??[]){let[W,h]=f<$?[f,$]:[$,f],V=`${W}\0${h}`,N=B.get(V);if(!N){let j=i.get(W),H=i.get(h);if(!j||!H)continue;N={a:W,b:h,cross:j.pkg!==H.pkg,fromLo:!1,fromHi:!1},B.set(V,N),j.deg++,H.deg++}f===W?N.fromLo=!0:N.fromHi=!0}let C=[...B.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 Ke(F),F}function Ke(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 Xt(e,t){if(!t||t==="/"||t==="__own__")return e;for(let r of["node_modules","dependencies",Ut()]){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 ze(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 ct)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=ct.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?A`<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:A`<button type="button" class="${vt({"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,B=d?null:A`<button type="button" class="${vt({"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 A`<div class="graph2-topbar">${r?A`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${r} ${B}<div class="g2-spacer"></div>${i}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${R?A`<severity-chips counts="${JSON.stringify(w)}" selected="${JSON.stringify([...S.selectedSeverities])}" kind="graph"></severity-chips>`:null} ${b?A`<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:B}<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 Xe(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 Je(e,t){if(!t&&t!=="")return e;let r=Xe(t,e);return r.length<e.length?r:e}function ae(e,t,r,d){let p=r.length;if(p===0)return A`<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:Je(g,d)}));return m.sort((g,w)=>g.display.localeCompare(w.display)),A`<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?st(R.pkg):"#666";return A`<li><button type="button" class="g2-sel-file-link" data-g2-select="${g}" title="${g}"><span class="g2-sel-file-dot" style="${$t({background:o})}"></span> <span class="g2-sel-file-path">${w}</span></button></li>`})}</ul></div>`}function Rt(e){if(!e)return A`<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?A`<div class="g2-sel-section-empty">none</div>`:A`<div class="tree-count-chips">${r.map(d=>A`<span class="${`tree-count-chip ${d}`}">${e[d]} ${d.replaceAll("_"," ")}</span>`)}</div>`}function Ce(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 A`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${S.focusedPkg?A`<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 Pe(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:A`<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 _e(){return A`<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 Fe(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"),A`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${r?A`<button type="button" class="${vt({"g2-mini-tab":!0,on:d==="issues"})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${vt({"g2-mini-tab":!0,on:d==="files"})}" data-g2-top-pkgs="files">Files</button> ${t?A`<button type="button" class="${vt({"g2-mini-tab":!0,on:d==="size"})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${to(e,d)}`}function Le(e,t={}){let r=S.selected;if(r){let d=e.nodeByFile.get(r);return d?Ze(e,d,r,t):A`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return S.solo?Qe(e,S.solo):A`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function Ze(e,t,r,d){let p=st(t.pkg),m=t.pkg==="__own__"?"own source":t.pkg,g=Xt(r,t.pkg),w=e.importedBy.get(r)??[],R=e.importsOf.get(r)??[],o=r.lastIndexOf("/"),y=o>=0?r.slice(0,o):"";return A`<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="${$t({"--dot":p,background:p})}"></span> <span class="g2-sel-pkg">${m}</span></div></div><div class="g2-sel-fullpath" title="${r}">${r}</div>${Yt(t.size)?A`<div class="g2-sel-size">${Yt(t.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${Rt(t.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${Rt(t.subtree)}</div><div class="g2-sel-jumps">${t.totalIssues>0?A`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${r}">Findings →</button>`:null} ${d.isBundleContext?t.origFile?A`<button type="button" class="g2-sel-jump" data-bundle-view-source="${t.origFile}">View source →</button>`:null:A`<button type="button" class="g2-sel-jump" data-g2-jump-file="${r}">Files →</button>`}</div>${ae(e,"Imported by",w,y)} ${ae(e,"Imports",R,y)}</div>`}function Qe(e,t){let r=e.nodes.filter(b=>b.pkg===t),d=r.length;if(d===0)return A`<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=st(t),m=t==="__own__"?"own source":t,g={};for(let b of ct)g[b]=0;for(let b of r)if(b.own)for(let _ of ct)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 A`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${$t({"--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>${Rt(g)}</div>${ae(e,"Imported by",[...y])}</div>`}function to(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 B=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 A`<div class="g2-dist-bar">${e.packages.map(l=>{let v=st(l);return A`<span style="${$t({background:v,width:`${B(l)}%`})}"></span>`})}</div><div class="g2-dist-list">${i.length===0?A`<div class="g2-dist-empty">${C}</div>`:null} ${xe(i,l=>l,l=>{let v=st(l),I=e.pkgCount.get(l)??0,P=o.get(l)??0,F=y.get(l)??0,f=d==="issues"?P:d==="size"?Yt(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 A`<button type="button" class="${vt({"g2-dist-item":!0,on:h})}" data-g2-pkg="${l}" title="${W}"><span class="g2-dist-dot" style="${$t({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 le=class extends me{static properties={graph:{attribute:!1},options:{attribute:!1}};static styles=[Vt(ke),Vt(ye),Vt(ve)];constructor(){super(),this.graph=null,this.options={}}render(){return this.graph?A`<div class="graph2-layout">${ze(this.graph,this.options)} ${Ce(this.graph)} ${_e()}</div>`:A``}};customElements.define("graph-layout",le);function eo(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 Ie(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,B=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}B[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 D=d.get(H);D!==void 0&&(f+=D,$+=p.get(H),W++)}let V=e.importedBy.get(I.file);if(V)for(let H of V){let D=d.get(H);D!==void 0&&(f+=D,$+=p.get(H),W++)}let N=!1;if(W>0){f/=W,$/=W;let H=f-g.x,D=$-g.y;H*H+D*D>1&&(N=!0)}let j=-1;if(N){let H=1/0;for(let D=F;D<P;D++){if(l[D])continue;let c=B[D]-f,L=C[D]-$,q=c*c+L*L;q<H&&(H=q,j=D)}}else for(let H=F;H<P;H++)if(!l[H]){j=H;break}l[j]=!0,I.x=B[j],I.y=C[j],d.set(I.file,I.x),p.set(I.file,I.y)}}}function Re(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=eo(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,B=.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+B+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){Ie(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 tt=I.get(L),Z=I.get(q);tt.set(q,(tt.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 tt=0;for(let Z=L;Z<q;Z++)tt+=e.pkgCount.get(o[Z])??0;W[c]=tt}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],tt=L>0?q/L:1,Z=1+f*Math.sqrt(Math.max(0,tt-1));V[c]=V[c-1]+(h[c]-h[c-1])*Z}let N=Array.from({length:P});for(let c=0;c<P;c++)N[c]=V[c]-h[c];let j=Array.from({length:y}),H=Array.from({length:y}),D=0;for(let c=0;c<y;c++){for(;D<P-1&&c>=F[D+1];)D++;let L=c*137.508%360*Math.PI/180,tt=(y<=1?0:Math.sqrt(c/(y-1)))+N[D],Z=y===1?w?v:0:v+tt*(b-v);j[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],tt=q-L;if(tt===0)continue;let Z=Array.from({length:tt},()=>!1);for(let Ct=L;Ct<q;Ct++){let yt=o[Ct],Bt=I.get(yt),dt=0,at=0,it=0;if(Bt)for(let[et,ot]of Bt){let ft=l.get(et);ft&&(dt+=ft.x*ot,at+=ft.y*ot,it+=ot)}let kt=!1;if(it>0){dt/=it,at/=it;let et=dt-d,ot=at-p;et*et+ot*ot>1&&(kt=!0)}let ut=-1;if(kt){let et=1/0;for(let ot=0;ot<tt;ot++){if(Z[ot])continue;let ft=L+ot,Ht=j[ft]-dt,Tt=H[ft]-at,Ft=Ht*Ht+Tt*Tt;Ft<et&&(et=Ft,ut=ot)}}else for(let et=0;et<tt;et++)if(!Z[et]){ut=et;break}Z[ut]=!0;let Pt=L+ut,_t=e.pkgCount.get(yt)??0,At=Math.min(B,(.012+Math.sqrt(_t)*.004)*_);l.set(yt,{x:j[Pt],y:H[Pt],size:_t,groupR:At*m})}}Ie(e,l)}function Be(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 Ae(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}}),B=new Map(i.map((F,f)=>[F.file,f])),C=[];for(let F of e)for(let f of t.get(F)??[])B.has(f)&&C.push([B.get(F),B.get(f)]);let l=new Map;for(let F=0;F<p;F++){let f=Kt(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 N=i[h],j=i[V],H=N.x-j.x,D=N.y-j.y,c=Math.sqrt(H*H+D*D);if(c<.01){let q=R(N.file+j.file);H=(q%100-50)*.01||.5,D=((q>>7)%100-50)*.01||.5,c=Math.sqrt(H*H+D*D)}let L=w*w/c;N.dx+=H/c*L,N.dy+=D/c*L,j.dx-=H/c*L,j.dy-=D/c*L}for(let[h,V]of C){let N=i[h],j=i[V],H=N.x-j.x,D=N.y-j.y,c=Math.sqrt(H*H+D*D)||.01,L=c*c/w;N.dx-=H/c*L,N.dy-=D/c*L,j.dx+=H/c*L,j.dy+=D/c*L}let $=.055*Math.min(1,f/(I*.3));for(let[,h]of l){if(h.length<2)continue;let V=0,N=0;for(let j of h)V+=i[j].x,N+=i[j].y;V/=h.length,N/=h.length;for(let j of h)i[j].dx+=(V-i[j].x)*$,i[j].dy+=(N-i[j].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 He={critical:"#ff5470",high:"#ff9d4a",medium:"#f4d35e",low:"#67c2ff",high_bug:"#a06c3f",bug:"#7a6d62",informational:"#218bff"},Te={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"}};function no(){return document.body.classList.contains("theme-light")?Te.light:Te.dark}function zt(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;we();let o=m.getContext("2d"),y=window.devicePixelRatio||1,b=0,_=0,i={tx:0,ty:0,k:1},B=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)Be(t,l,C);else{let n=Ae(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 Re(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 N(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 j(){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,D=!0,c=!1,L=!1;function q(){D=!0,!(c||L)&&(c=!0,H=requestAnimationFrame(()=>{c=!1,D&&!L&&(D=!1,tt())}))}function tt(){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){Ct(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:B&&(n.a===B||n.b===B)&&(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,st(x.pkg)+zt(O)),a.addColorStop(1,st(z.pkg)+zt(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===B,z=n.file===u;if(!n.isHub&&!x&&!z||V(n)&&!x&&!z)continue;let[O,G]=$(n.x,n.y),K=N(n)*(z?6:x?4.5:3),X=o.createRadialGradient(O,G,0,O,G,K),a=st(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=N(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=st(n.pkg)+zt(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=He[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=N(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=N(M),rt=E+Q+4,nt=J+1,wt=o.measureText(M.label).width+G,Et=M.file===S.selected,Ot=M.file===B,qt=Et?3:Ot?2:M.isHub?1:0;a.push({file:M.file,n:M,tx:rt,ty:nt,prio:qt,x0:rt-G,x1:rt+wt,y0:nt-O/2,y1:nt+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=N(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 Ct(s,u,k){let n=st(S.focusedPkg),x=new Set;if(B){x.add(B);for(let a of t.adj.get(B)??[]){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,rt=B&&(a.a===B||a.b===B),nt=u&&(a.a===u||a.b===u),wt=(u||B)&&!rt&&!nt,Et=z(J),Ot=z(Q),[qt,de]=$(J.x,J.y),[fe,pe]=$(Q.x,Q.y),Jt=fe-qt,Zt=pe-de,Qt=Math.sqrt(Jt*Jt+Zt*Zt)||1,te=Jt/Qt,ee=Zt/Qt,bt=qt+te*(Et+1.5),ht=de+ee*(Et+1.5),mt=fe-te*(Ot+3.5),xt=pe-ee*(Ot+3.5),ge=Math.min(Qt*.15,30),Lt=(bt+mt)/2-ee*ge,It=(ht+xt)/2+te*ge;o.beginPath(),o.moveTo(bt,ht),o.quadraticCurveTo(Lt,It,mt,xt);let Mt;if(nt?Mt=.9:rt?Mt=.85:wt?Mt=.05:Mt=Math.min(.85,S.edgeOpacity*3),o.strokeStyle=n+zt(Mt),o.lineWidth=nt||rt?1.5:.85,o.stroke(),wt)continue;let lt=Math.max(5,7),pt=lt*.42,Dt=.9,oe=2*(1-Dt)*(Lt-bt)+2*Dt*(mt-Lt),re=2*(1-Dt)*(It-ht)+2*Dt*(xt-It),ue=Math.sqrt(oe*oe+re*re)||1,jt=oe/ue,Nt=re/ue;if(o.beginPath(),o.moveTo(mt,xt),o.lineTo(mt-jt*lt+Nt*pt,xt-Nt*lt-jt*pt),o.lineTo(mt-jt*lt-Nt*pt,xt-Nt*lt+jt*pt),o.closePath(),o.fillStyle=n+zt(Math.min(1,Mt+.15)),o.fill(),M){let ne=1.8*(Lt-bt)+.2*(mt-Lt),se=2*(1-.1)*(It-ht)+2*.1*(xt-It),be=Math.sqrt(ne*ne+se*se)||1,Wt=ne/be,Gt=se/be;o.beginPath(),o.moveTo(bt,ht),o.lineTo(bt+Wt*lt-Gt*pt,ht+Gt*lt+Wt*pt),o.lineTo(bt+Wt*lt+Gt*pt,ht+Gt*lt-Wt*pt),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===B,J=a.file===u,Q=(u||B)&&!x.has(a.file)&&!J?.15:1;if(o.globalAlpha=Q,J||E||a.isHub){let rt=M*(J?4:E?3:2.4),nt=o.createRadialGradient(T,Y,M*.6,T,Y,rt);nt.addColorStop(0,n+zt(J?.4:.25)),nt.addColorStop(1,n+"00"),o.fillStyle=nt,o.beginPath(),o.arc(T,Y,rt,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 rt=He[a.issue],nt=M+(a.issue==="critical"?4.2:a.issue==="high"?3.4:2.8),wt=a.issue==="critical"?1.8:a.issue==="high"?1.5:a.issue==="medium"?1.3:1.1;o.strokeStyle=rt,o.lineWidth=wt,o.beginPath(),o.arc(T,Y,nt,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,rt=a.file===B,nt=Q?3:rt?2:a.isHub?1:0;U.push({n:a,sx:T,ty:E,halfW:J,isSel:Q,isHov:rt,prio:nt,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||B)&&!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 yt(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=N(z)+x;X<a*a&&X<n&&(n=X,k=z)}return k}function Bt(s,u,k){if(!g)return;let n=w.getBoundingClientRect(),x=st(s.pkg),z=s.pkg==="__own__"?"own source":s.pkg,O=Xt(s.file,s.pkg);St(A`<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?Rt(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 dt(){g&&g.classList.remove("show")}let at=!1,it=null,kt=!1,ut=s=>{s.button===0&&(s.target.closest(".g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl")||(at=!0,kt=!1,it={x:s.clientX,y:s.clientY,tx:i.tx,ty:i.ty}))},Pt=s=>{let u=w.getBoundingClientRect(),k=s.clientX-u.left,n=s.clientY-u.top;if(at){let O=s.clientX-it.x,G=s.clientY-it.y;Math.abs(O)+Math.abs(G)>3&&(kt=!0),i.tx=it.tx+O,i.ty=it.ty+G,dt(),q();return}let x=yt(k,n),z=B;B=x?.file??null,m.style.cursor=x?"default":"grab",x?Bt(x,s.clientX,s.clientY):z&&dt(),B!==z&&q()},_t=s=>{if(at&&!kt){let u=w.getBoundingClientRect(),k=s.clientX-u.left,n=s.clientY-u.top,x=yt(k,n);S.selected=x?.file??null,r(),q()}at=!1},At=()=>{let s=B!==null;B=null,dt(),s&&q()},et=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",ut),window.addEventListener("mousemove",Pt),window.addEventListener("mouseup",_t),w.addEventListener("mouseleave",At),w.addEventListener("wheel",et,{passive:!1});function ot(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 ft=p.querySelector("#g2-zoom-in"),Ht=p.querySelector("#g2-zoom-out"),Tt=p.querySelector("#g2-zoom-fit");ft?.addEventListener("click",()=>ot(i.k*1.4)),Ht?.addEventListener("click",()=>ot(i.k/1.4)),Tt?.addEventListener("click",()=>{f(),q()}),j();let Ft=new ResizeObserver(()=>j());Ft.observe(w);let ce=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(()=>j(),80);return}q()}});ce.observe(document.body,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}),q(),S.graphState={requestDraw:q,_cleanup:()=>{L=!0,cancelAnimationFrame(H),Ft.disconnect(),ce.disconnect(),w.removeEventListener("mousedown",ut),window.removeEventListener("mousemove",Pt),window.removeEventListener("mouseup",_t),w.removeEventListener("mouseleave",At),w.removeEventListener("wheel",et)}}}function Xo(e,t){let r=document.querySelector("graph-layout")?.shadowRoot;if(!r)return;let d=Ee(e),p=r.querySelector("#g2-selection-area");p&&St(Le(d,t),p);let m=r.querySelector("#g2-focus-overlay-slot");m&&St(Pe(d),m)}function Jo(e){let t=document.querySelector("graph-layout")?.shadowRoot;if(!t)return;let r=t.querySelector("#g2-top-pkgs-block");r&&St(Fe(Ee(e)),r)}function Ee(e){let t=$e(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{Ge as _swapGraph2Impl,so as attachGraph2Interaction,Ee as buildGraphFromPrep,Xo as refreshSidebar,Jo as refreshTopPkgs};
|
|
1
|
+
var _t=globalThis[Symbol.for("@rray/frontend")];if(!_t)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:Lt,html:V,nothing:eo,unsafeCSS:ct,render:je,StateElement:ko,classMap:Ce,repeat:Ft,styleMap:Qe}=_t;var Ht=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{display:grid;grid-template-columns:1fr 300px;grid-template-rows:auto 1fr;grid-template-areas:"topbar right" "stage right";min-height:0;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:var(--graph-canvas-bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,sans-serif;font-size:12px}.graph2-layout{display:contents}.graph2-topbar{grid-area:topbar;display:flex;flex-direction:column;gap:.5rem;padding:.6rem .75rem;font-size:.825rem;background:var(--surface);backdrop-filter:var(--glass-blur);border-bottom:1px solid var(--graph-divider)}.graph2-topbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;padding:0}.graph2-topbar .g2-spacer{flex:1}.graph2-topbar triage-selector{margin-left:auto}.g2-icon-btn{width:28px;height:28px;border-radius:5px;background:var(--graph-hover-bg);border:1px solid var(--border);color:var(--muted);display:grid;place-items:center;font-family:inherit;&:hover{color:var(--accent);border-color:var(--accent)}& svg{display:block}}.g2-path-filter-wrap{position:relative;flex:0 0 14rem;padding-right:22px}.g2-path-filter-wrap .g2-path-filter-clear{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:18px;height:18px;background:transparent;border:0;border-radius:50%;color:var(--muted);font:400 10px/1 inherit;font-family:inherit;&:hover{color:var(--text);background:var(--surface-active)}}.g2-path-filter:placeholder-shown~.g2-path-filter-clear{display:none}.g2-topbar-toggle{display:inline-flex;align-items:center;height:30px;box-sizing:border-box;gap:8px;padding:5px 10px;background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:6px;color:var(--muted);font:500 11px/1 inherit;font-family:inherit;white-space:nowrap;&:hover{color:var(--text)}&.on{color:var(--text)}&.on .g2-switch{background:color-mix(in srgb,var(--accent) 22%,transparent)}&.on .g2-switch:after{transform:translate(12px);background:var(--accent)}}.g2-trash-btn.on{background:color-mix(in srgb,var(--accent) 16%,transparent);border-color:var(--accent);color:var(--accent)}.graph2-right{grid-area:right;border-left:1px solid var(--graph-divider);background:var(--surface);backdrop-filter:var(--glass-blur);display:flex;flex-direction:column;overflow:hidden;padding:14px}.g2-panel-title{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);opacity:.85;margin:14px 0 8px;display:flex;align-items:baseline;gap:6px;&:first-child{margin-top:0}}.g2-count{color:var(--muted);opacity:.6;font-weight:400;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;text-transform:none;letter-spacing:0;font-size:10px}.g2-panel-title-row{justify-content:space-between;gap:8px}#g2-top-pkgs-block{margin-top:14px;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.g2-mini-tabs{display:flex;gap:1px;background:var(--graph-divider);border-radius:4px;overflow:hidden}.g2-mini-tab{background:transparent;border:0;color:var(--muted);font-family:inherit;font-weight:500;font-size:11px;line-height:1.4;text-transform:none;letter-spacing:0;padding:2px 7px;&:hover{color:var(--text);background:var(--graph-hover-bg)}&.on{background:var(--surface-active);color:var(--accent)}}.g2-switch{width:26px;height:14px;background:var(--border);border-radius:8px;position:relative;transition:background .15s;flex-shrink:0;&:after{content:"";position:absolute;top:2px;left:2px;width:10px;height:10px;border-radius:50%;background:var(--muted);transition:transform .15s,background .15s}}.graph2-stage{grid-area:stage;position:relative;background:var(--graph-canvas-bg);overflow:hidden;cursor:grab;&:active{cursor:grabbing}& canvas{position:absolute;inset:0;width:100%;height:100%;display:block}}.g2-stage-overlay{position:absolute;top:12px;left:12px;z-index:3;display:flex;flex-direction:column;gap:4px;pointer-events:none;max-width:calc(100% - 60px)}.g2-stage-overlay>*{pointer-events:auto}.g2-stage-stats{position:absolute;bottom:10px;left:12px;z-index:2;display:flex;flex-wrap:wrap;gap:2px 14px;font:500 10px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--muted);opacity:.7;text-transform:uppercase;letter-spacing:.06em;pointer-events:none;max-width:calc(100% - 80px);& b{font-weight:600;color:var(--text);opacity:1}}.g2-stage-overlay-tr{position:absolute;top:12px;right:12px;z-index:3;pointer-events:auto}.g2-focus-pkg-btn{width:28px;height:28px;display:grid;place-items:center;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);box-shadow:var(--shadow-glass);&:hover{border-color:var(--accent);background:var(--surface-active)}& svg{display:block}}.g2-back-btn{display:inline-flex;align-items:center;gap:4px;padding:6px 11px;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);font:500 11px/1 inherit;font-family:inherit;box-shadow:var(--shadow-glass);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-self:flex-start;&:hover{border-color:var(--accent);background:var(--surface-active)}}.g2-zoom-ctrl{position:absolute;right:12px;bottom:12px;display:flex;flex-direction:column;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;overflow:hidden;z-index:3;box-shadow:var(--shadow-glass);& button{width:28px;height:28px;background:transparent;border:0;color:var(--muted);border-bottom:1px solid var(--graph-divider);display:grid;place-items:center;font-family:inherit;font-size:13px;&:last-child{border-bottom:0}&:hover{color:var(--accent);background:var(--surface-active)}}}.g2-zoom-pct{font:500 9px/1 ui-monospace,monospace;color:var(--muted);padding:5px 0;text-align:center;border-bottom:1px solid var(--graph-divider)}.g2-zoom-ctrl .g2-zoom-fit-btn{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:9px;line-height:1;letter-spacing:-.02em;text-transform:lowercase}.g2-tooltip{position:absolute;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:7px;padding:9px 11px;pointer-events:none;min-width:170px;max-width:260px;opacity:0;transition:opacity .12s;z-index:10;box-shadow:var(--shadow-glass);&.show{opacity:1}}.g2-tt-path{font:500 11px/1.3 ui-monospace,monospace;color:var(--text);word-break:break-all;margin-bottom:4px}.g2-tt-head{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.g2-tt-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-tt-pkg{font-size:10px;color:var(--muted);word-break:break-all}.g2-tt-badge{display:inline-block;font-size:8px;padding:2px 4px;background:color-mix(in srgb,var(--accent) 22%,transparent);color:var(--accent);border-radius:3px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}.g2-tooltip .tree-count-chips{margin-top:6px}:host-context(body.theme-light) .graph2-right .tree-count-chip.medium,:host-context(body.theme-light) .g2-tooltip .tree-count-chip.medium{color:#fff}.g2-selection-card{background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:8px;overflow:hidden}.g2-sel-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;align-items:center;gap:8px}.g2-sel-file-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;flex-direction:column;gap:6px}.g2-sel-path{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:12px;line-height:1.3;color:var(--text);word-break:break-all}.g2-sel-pkg-row{display:flex;align-items:center;gap:6px;min-width:0}.g2-sel-pkg{font-size:11px;color:var(--muted);word-break:break-all;min-width:0}.g2-sel-fullpath{padding:7px 13px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-sel-size{padding:5px 13px 7px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);font-variant-numeric:tabular-nums}.g2-sel-dot{width:11px;height:11px;border-radius:50%;box-shadow:0 0 0 3px color-mix(in srgb,var(--dot) 22%,transparent);flex-shrink:0}.g2-sel-id{font:600 12px/1 ui-monospace,monospace;color:var(--text);word-break:break-all;flex:1;min-width:0}.g2-sel-grp{font:500 9px/1 ui-monospace,monospace;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;flex-shrink:0}.g2-sel-body{padding:11px 13px}.g2-sel-row{display:flex;justify-content:space-between;gap:12px;font-size:11px;padding:5px 0;border-bottom:1px solid var(--graph-divider);&:last-child{border-bottom:0}.k{color:var(--muted);flex-shrink:0}.v{color:var(--text);font-family:ui-monospace,monospace;word-break:break-all;text-align:right;min-width:0}}.g2-sel-section{padding:9px 13px;border-top:1px solid var(--graph-divider)}.g2-sel-section-label{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);opacity:.85;margin-bottom:5px}.g2-sel-section-empty{color:var(--muted);opacity:.55;font-size:11px;font-style:italic}.g2-sel-jumps{padding:11px 13px;display:flex;gap:5px;flex-wrap:wrap;border-top:1px solid var(--graph-divider)}.g2-sel-jump{background:var(--surface-active);border:1px solid var(--border);color:var(--accent);border-radius:4px;padding:2px 8px;font-family:inherit;font-weight:500;font-size:11px;line-height:1.3;&:hover{border-color:var(--accent)}}.g2-sel-file-list{list-style:none;margin:0;padding:0;max-height:110px;overflow:hidden auto;-webkit-app-region:no-drag;app-region:no-drag;&::-webkit-scrollbar{width:4px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}& li{padding:0}}.g2-sel-file-link{display:flex;align-items:center;gap:6px;width:100%;background:transparent;border:0;border-radius:3px;padding:3px 6px;font:400 11px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--accent);text-align:left;&:hover{background:var(--graph-hover-bg)}.g2-sel-file-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.g2-sel-file-path{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.g2-empty-state{background:var(--graph-hover-bg);border:1px dashed var(--border);border-radius:8px;padding:18px 14px;text-align:center;color:var(--muted);font-size:11px;line-height:1.5;& strong{color:var(--text);display:block;margin-bottom:4px;font-weight:500}}.g2-dist-bar{width:100%;height:5px;border-radius:3px;overflow:hidden;display:flex;background:var(--surface-active);margin-bottom:8px;>span{display:block;height:100%}}.g2-dist-list{display:flex;flex-direction:column;gap:2px;flex:1 1 0;min-height:0;overflow-y:auto;overscroll-behavior:none;-webkit-app-region:no-drag;app-region:no-drag;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:5px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.g2-dist-empty{color:var(--muted);opacity:.55;font-size:10px;font-style:italic;padding:6px 0;text-align:center}.g2-dist-item{display:grid;grid-template-columns:8px 1fr auto auto;gap:8px;align-items:center;font-size:10px;padding:4px 6px;margin:0 -6px;background:transparent;border:0;border-radius:4px;font-family:inherit;text-align:left;width:calc(100% + 12px);&:hover{background:var(--graph-hover-bg)}&.on{background:var(--surface-active);.g2-dist-name{color:var(--accent)}}.g2-dist-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-dist-name{color:var(--muted);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-dist-count{font-family:ui-monospace,monospace;color:var(--text)}.g2-dist-pct{font-family:ui-monospace,monospace;color:var(--muted);width:36px;text-align:right;opacity:.85}}@media print{:host{display:none!important}}
|
|
2
|
+
`;var It=`.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 At=`.toolbar{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;padding:.6rem .75rem;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;box-shadow:var(--shadow-glass);font-size:.825rem;& label{color:var(--muted);margin-right:.15rem}& select{height:30px;box-sizing:border-box;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .4rem;font-size:.8rem;&:focus{border-color:var(--accent);outline:none}}& select.sort-select{padding:.3rem 1.7rem .3rem .55rem;min-width:8.5rem;font-weight:500;appearance:none;-webkit-appearance:none;background:transparent}:is(repo-filter,findings-sort){position:relative;display:inline-block;&:after{content:"";position:absolute;right:.7rem;top:50%;width:.35rem;height:.35rem;border-right:1.5px solid var(--muted);border-bottom:1.5px solid var(--muted);transform:translateY(-70%) rotate(45deg);pointer-events:none}}& analyzer-select{position:relative;display:inline-block}.analyzer-btn{display:inline-flex;align-items:center;gap:.45rem;height:30px;box-sizing:border-box;padding:.3rem .55rem;min-width:8.5rem;background:transparent;color:var(--text);border:1px solid var(--border);border-radius:4px;font-family:inherit;font-size:.8rem;font-weight:500;&:hover{border-color:var(--accent)}&:focus-visible{border-color:var(--accent);outline:none}&.active{color:var(--accent)}.analyzer-btn-label{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:18rem}& svg{color:var(--muted);flex-shrink:0}}& range-slider{color:var(--accent);margin:0 .25rem}.conf-vals{color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-variant-numeric:tabular-nums;.dash{color:var(--muted);margin:0 .15rem}}& conf-filter{display:inline-flex;align-items:center;height:30px;box-sizing:border-box;padding:0 .55rem;gap:.5rem;background:transparent;border:1px solid var(--border);border-radius:4px;.conf-range-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}& range-slider{margin:0}}& input[type=text]{background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .4rem;font-size:.8rem;flex:1;min-width:8rem;&:focus{border-color:var(--accent);outline:none}}.sep{border-left:1px solid var(--border);height:1.2rem}.result-count{color:var(--muted);margin-left:auto}.checkbox-label{display:inline-flex;align-items:center;gap:.25rem;color:var(--muted);& input{margin:0}}}.analyzer-menu[popover]{position:fixed;inset:auto;margin:0;align-items:stretch;gap:.35rem;padding:.3rem;background:var(--bg);border:1px solid var(--border);border-radius:6px;box-shadow:0 4px 12px #00000040;font-size:.825rem;-webkit-app-region:no-drag;app-region:no-drag}.analyzer-menu[popover]:not(:popover-open){display:none}.analyzer-menu[popover]:popover-open{display:flex}.analyzer-menu-sep{border-left:1px solid var(--border)}.analyzer-menu-col{display:flex;flex-direction:column;gap:1px;min-width:9rem;max-height:60vh;overflow-y:auto}.analyzer-menu-head{padding:.25rem .5rem .2rem;color:var(--muted);font-size:.68rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.analyzer-menu-item{display:flex;align-items:center;gap:.45rem;background:transparent;border:0;border-radius:3px;padding:.3rem .5rem;color:var(--text);text-align:left;font-family:inherit;font-size:.78rem;&:before{content:"";width:.8rem;flex-shrink:0}&.active:before{content:"\\2713";color:var(--accent)}&:hover{background:var(--surface)}&.zero{opacity:.45}.analyzer-menu-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:16rem}.analyzer-menu-count{color:var(--muted);font-size:.7rem;font-weight:600;font-variant-numeric:tabular-nums}}.trash-btn{height:30px;box-sizing:border-box;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.25rem .55rem;font-size:.8rem;font-family:inherit;&:hover{border-color:var(--accent)}&.active{border-color:var(--critical);color:var(--critical)}}.toolbar .trash-btn{margin-left:auto}triage-selector,slide-triage-tabs{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.toolbar triage-selector{margin-left:auto}triage-selector.is-empty{display:none}.triage-state-btn{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.8rem;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{background:var(--surface-active)}}.triage-state-btn.active.triage-state-deleted{color:var(--critical)}.triage-state-btn.active.triage-state-fixed{color:var(--green, #4ade80)}.triage-state-btn.active.triage-state-inprogress{color:var(--warning, #d97706)}.triage-state-btn.active.triage-state-invalid{color:var(--muted)}.triage-state-btn.active.triage-state-ignored{color:var(--accent, #2563eb)}entity-search{display:contents}view-mode-buttons{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.view-mode-btn{background:transparent;border:none;color:var(--muted);padding:.28rem .5rem;display:inline-flex;align-items:center;justify-content:center;transition:background .12s,color .12s;font-family:inherit;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}& svg{display:block}}}source-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.source-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}severity-mode-switch{display:inline-flex;align-items:center;gap:.4rem;height:30px;box-sizing:border-box;.severity-mode-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}.severity-mode-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.severity-mode-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;cursor:pointer;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}annotation-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden;.annotation-chip{position:relative;background:transparent;border:none;color:var(--muted);padding:0 .45rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;cursor:pointer;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.sel-with,&.sel-without{color:var(--accent);background:var(--surface-active)}&.sel-with .flag-cloth{fill:var(--accent)}&.sel-without:after{content:"";position:absolute;left:18%;right:18%;top:50%;height:1.5px;background:currentcolor;border-radius:1px;transform:rotate(-20deg);transform-origin:center;pointer-events:none}& svg{display:block}}}.toolbar-row{display:flex;gap:.75rem;flex-wrap:wrap;align-items:center}.search-row{display:inline-flex;align-items:center;gap:.65rem;flex:1 1 14rem;min-width:12rem}toolbar-search,.toolbar-search{display:inline-flex;align-items:center;gap:.5rem;flex:1;min-width:0;height:30px;box-sizing:border-box;padding:0 .65rem;background:var(--bg);border:1px solid var(--border);border-radius:6px;&:has(input:focus){border-color:var(--accent)}>svg{color:var(--muted);flex-shrink:0}&[kind] input[type=text],&.toolbar-search input[type=text]{flex:1;min-width:0;background:transparent;border:0;outline:none;color:var(--text);font:inherit;font-size:.8rem;padding:0;&:focus{border:0}&::placeholder{color:var(--muted)}&:focus::placeholder{color:transparent}&::-webkit-search-cancel-button{display:none}}}.search-negate-btn{flex-shrink:0;width:20px;height:20px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:3px;padding:0;transition:background .12s,color .12s;& svg{width:13px;height:13px}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .08)}&.active{color:var(--accent);background:rgb(from var(--text) r g b / .1)}}@media(width<=1200px){.toolbar-row.sev-row .search-row{flex-basis:100%}}.findings-content.with-details .toolbar{max-width:1200px}severity-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:4px;overflow:hidden}.sev-chip{display:inline-flex;align-items:center;gap:.4rem;background:transparent;border:0;padding:0 .6rem;color:var(--muted);font-family:inherit;font-size:.8rem;transition:background .12s,color .12s;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}.sd{width:8px;height:8px;border-radius:2px;flex-shrink:0;background:currentcolor}.n{align-self:flex-start;margin:1px -5px 0;color:var(--muted);font-variant-numeric:tabular-nums;font-size:8.5px;font-weight:600;background:var(--bg);border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px}&.active{color:var(--text);.n{color:var(--text)}}&.critical .sd{background:var(--critical)}&.high .sd{background:var(--high)}&.medium .sd{background:var(--medium)}&.low .sd{background:var(--low)}&.high_bug .sd{background:var(--high-bug)}&.bug .sd{background:var(--bug)}&.informational .sd{background:var(--info)}&.critical.active{background:rgb(from var(--critical) r g b / .25)}&.high.active{background:rgb(from var(--high) r g b / .25)}&.medium.active{background:rgb(from var(--medium) r g b / .25)}&.low.active{background:rgb(from var(--low) r g b / .25)}&.high_bug.active{background:rgb(from var(--high-bug) r g b / .25)}&.bug.active{background:rgb(from var(--bug) r g b / .25)}&.informational.active{background:rgb(from var(--info) r g b / .25)}}triage-filter{display:inline-flex;align-items:center;background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:3px;height:30px;gap:1px;& button{width:22px;height:22px;background:transparent;border:0;border-radius:4px;padding:0;display:grid;place-items:center;position:relative;transition:background .12s;&:hover{background:rgb(from var(--text) r g b / .06)}&.active{background:rgb(from var(--text) r g b / .08);box-shadow:0 0 0 1px var(--border)}}.td{width:12px;height:12px;border-radius:50%;border:1.5px solid currentcolor;background:transparent;transition:background .12s}& button.active .td{background:currentcolor}.td.none{border-style:dashed;color:var(--muted)}.td.r{color:#fc5855}.td.b{color:#30aff8}.td.g{color:#68c36d}.td.x{color:#6e7278}.count{position:absolute;top:-2px;right:-2px;background:var(--bg);color:var(--muted);font-size:8.5px;font-weight:600;border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px;font-variant-numeric:tabular-nums}}
|
|
4
|
+
`;var ke=["critical","high","medium","low","high_bug","bug","informational"];function gt(t){return new RegExp(`(^|/)${t}/`,"u")}function ro(t){return new RegExp(`^(?:.*/)?${t}/(?:@[^/]+/[^/]+|[^/]+)/(.*)$`,"u")}var Po=gt("node_modules"),Co=gt("vendor"),bt="node_modules",Ro=gt(bt),_o=ro(bt);function dt(){return bt}function et(t){return typeof t!="number"||!Number.isFinite(t)?null:`${t.toLocaleString()} B`}function so(){return{showAll:!1,splitOwnDirs:!1,packagesView:!1,selected:null,focusedPkg:null,topPkgsTab:"issues",edgeOpacity:.22,nodeSize:1,showLabels:!1,selectedSeverities:new Set,selectedColors:new Set,pathFilter:"",hidden:new Set,solo:null,graphState:null,layoutCache:null}}var Re=so(),k=new Proxy(Re,{get(t,o){return Re[o]},set(t,o,s){return Re[o]=s,!0},has(t,o){return o in Re},deleteProperty(t,o){return delete Re[o]},ownKeys(){return Reflect.ownKeys(Re)},getOwnPropertyDescriptor(t,o){return Object.getOwnPropertyDescriptor(Re,o)}});function Bt(){k.graphState?._cleanup&&k.graphState._cleanup(),k.graphState=null}function io(t){t&&(Re=t)}function pt(t){if(!t)return null;let o=dt(),s=new RegExp(`^(?:.*/)?${o}/(@[^/]+/[^/]+|[^/]+)`,"u"),l=t.match(s);if(l)return l[1];let y=t.indexOf("/");return y>0?t.slice(0,y):"/"}var ao=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],Et=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function lo(){if(typeof document>"u")return!1;let t=document.body?.classList;return!!t&&(t.contains("theme-light")||t.contains("theme-pink"))}var ht=new Map;function ne(t){let o=lo()?Et:ao,l=`${o===Et?"l":"d"}:${t??"__own__"}`;if(ht.has(l))return ht.get(l);let y=t??"__own__",x=0;for(let M of y)x=x*37+M.codePointAt(0)|0;let c=((x%o.length+o.length)%o.length*7+3)%o.length,v=o[c];return ht.set(l,v),v}function Tt(t){if(!t)return 0;let o=0;for(let s of ke)o+=t[s]??0;return o}function Ot(t){if(!t)return null;for(let o of ke)if((t[o]??0)>0)return o;return null}function Dt(t,o,s,l,y,x,b,c={}){let v=c.pkgOf??pt,M=new Set(o),e=new Map,z=new Map;for(let g of o){let R=(t[g].imports??[]).filter(Y=>M.has(Y));e.set(g,R);for(let Y of R)z.has(Y)||z.set(Y,[]),z.get(Y).push(g)}let _=o.map(g=>{let R=s.get(g),Y=l?.get(g)??null,ee=Tt(R),B=v(g)??"__own__",J=Ot(R);return{id:g,file:g,pkg:B,x:0,y:0,deg:0,issue:J,totalIssues:ee,own:R,subtree:Y,size:typeof t[g]?.size=="number"?t[g].size:null,severitySet:y?.get(g)??null,colorSet:x?.get(g)??null,findings:b?.get(g)??null,isHub:!1,label:g.split("/").pop()??g}}),L=new Map(_.map(g=>[g.file,g])),d=new Map;for(let g of o)for(let R of e.get(g)??[]){let[Y,ee]=g<R?[g,R]:[R,g],B=`${Y}\0${ee}`,J=d.get(B);if(!J){let E=L.get(Y),T=L.get(ee);if(!E||!T)continue;J={a:Y,b:ee,cross:E.pkg!==T.pkg,fromLo:!1,fromHi:!1},d.set(B,J),E.deg++,T.deg++}g===Y?J.fromLo=!0:J.fromHi=!0}let D=[...d.values()],a=new Map;for(let g=0;g<D.length;g++){let R=D[g];a.has(R.a)||a.set(R.a,[]),a.has(R.b)||a.set(R.b,[]),a.get(R.a).push(g),a.get(R.b).push(g)}let p=new Map;for(let g of _)p.set(g.pkg,(p.get(g.pkg)??0)+1);let A=[...p.entries()].toSorted((g,R)=>R[1]-g[1]).map(([g])=>g),H=new Map;for(let g of _)H.has(g.pkg)||H.set(g.pkg,[]),H.get(g.pkg).push(g);let U={files:o,nodes:_,nodeByFile:L,edges:D,adj:a,importsOf:e,importedBy:z,packages:A,pkgCount:p,byPkg:H};return co(U),U}function co(t){for(let o of t.nodes)o.isHub=!1;for(let o of t.edges)o.cross&&(o.fromLo&&(t.nodeByFile.get(o.b).isHub=!0),o.fromHi&&(t.nodeByFile.get(o.a).isHub=!0));for(let o of t.nodes){let s=t.importedBy.get(o.file);(!s||s.length===0)&&(o.isHub=!0)}}function qt(t){let o=t.packages.map(c=>{let v=t.byPkg.get(c)??[],M={};for(let a of ke)M[a]=0;let e=new Set,z=new Set,_=[],L=0,d=0,D=!1;for(let a of v){if(L+=a.totalIssues,a.own)for(let p of ke)M[p]+=a.own[p]??0;if(a.severitySet)for(let p of a.severitySet)e.add(p);if(a.colorSet)for(let p of a.colorSet)z.add(p);typeof a.size=="number"&&(d+=a.size,D=!0),_.push(a.file)}return{file:c,pkg:c,label:c==="__own__"?"own source":c,fileCount:v.length,size:D?d:null,own:M,totalIssues:L,issue:Ot(M),severitySet:e.size>0?e:null,colorSet:z.size>0?z:null,pathText:_.join(`
|
|
5
|
+
`).toLowerCase(),isHub:!0,x:0,y:0,deg:0}}),s=new Map(o.map(c=>[c.pkg,c])),l=new Map;for(let c of t.edges){if(!c.cross)continue;let v=t.nodeByFile.get(c.a)?.pkg,M=t.nodeByFile.get(c.b)?.pkg;if(!v||!M||v===M)continue;let[e,z]=v<M?[v,M]:[M,v],_=`${e}\0${z}`,L=l.get(_);L||(L={a:e,b:z,cross:!0,count:0,fromLo:!1,fromHi:!1},l.set(_,L),s.get(e).deg++,s.get(z).deg++),L.count++;let d=v===e;c.fromLo&&(d?L.fromLo=!0:L.fromHi=!0),c.fromHi&&(d?L.fromHi=!0:L.fromLo=!0)}let y=[...l.values()],x=new Map;for(let c=0;c<y.length;c++){let v=y[c];x.has(v.a)||x.set(v.a,[]),x.has(v.b)||x.set(v.b,[]),x.get(v.a).push(c),x.get(v.b).push(c)}let b=new Map(o.map(c=>[c.pkg,[]]));for(let c of y)c.fromLo&&b.get(c.a).push(c.b),c.fromHi&&b.get(c.b).push(c.a);return{nodes:o,byPkg:s,nodeByFile:s,edges:y,adj:x,importsOf:b}}function ft(t,o){if(!o||o==="/"||o==="__own__")return t;for(let s of["node_modules","dependencies",dt()]){let l=s+"/"+o+"/",y=t.indexOf(l);if(y>=0)return t.slice(y+l.length)}return t.startsWith(o+"/")?t.slice(o.length+1):t}function Nt(t,o){let s=o.extraTopRow,l=o.hideAllFiles??!1,y=o.triageCounts??{inprogress:0,fixed:0,invalid:0,deleted:0},x=o.triageStates??["inprogress","fixed","invalid","deleted"],b={};for(let p of ke)b[p]=0;for(let p of t.nodes)if(p.severitySet)for(let A of p.severitySet)b[A]!==void 0&&b[A]++;let c=ke.some(p=>b[p]>0||k.selectedSeverities.has(p)),v=["none","red","blue","green","gray"],M={none:0,red:0,blue:0,green:0,gray:0};for(let p of t.nodes)if(p.colorSet)for(let A of p.colorSet)M[A]!==void 0&&M[A]++;let e=v.some(p=>M[p]>0||k.selectedColors.has(p)),z=V`<triage-selector variant="graph" .counts="${y}" .states="${x}"></triage-selector>`,_=l?null:V`<button type="button" class="${Ce({"g2-topbar-toggle":!0,on:k.showAll})}" data-g2-show-all aria-pressed="${String(k.showAll)}"><span>All files</span><span class="g2-switch"></span></button>`,d=o.showSplitOwnDirs??!1?V`<button type="button" class="${Ce({"g2-topbar-toggle":!0,on:k.splitOwnDirs})}" data-g2-split-own aria-pressed="${String(k.splitOwnDirs)}" title="Split your own source into a group per top-level directory (off: one 'own source' group)"><span>Split dirs</span><span class="g2-switch"></span></button>`:null,a=o.showPackagesView??!1?V`<button type="button" class="${Ce({"g2-topbar-toggle":!0,on:k.packagesView})}" data-g2-packages-view aria-pressed="${String(k.packagesView)}" title="Show one node per package with aggregated import edges (off: one node per file)"><span>Packages</span><span class="g2-switch"></span></button>`:null;return V`<div class="graph2-topbar">${s?V`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${s} ${_} ${d} ${a}<div class="g2-spacer"></div>${z}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${c?V`<severity-chips .counts="${b}" .selected="${[...k.selectedSeverities]}" kind="graph"></severity-chips>`:null} ${e?V`<triage-filter .counts="${M}" .selected="${[...k.selectedColors]}" kind="graph"></triage-filter>`:null}<div class="toolbar-search g2-path-filter-wrap"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="text" class="g2-path-filter" id="g2-path-filter" placeholder="filter path/package…" .value="${k.pathFilter}"> <button type="button" class="g2-path-filter-clear" id="g2-path-filter-clear" title="Clear filter" aria-label="Clear filter">✕</button></div>${s?null:_} ${s?null:d} ${s?null:a}<div class="g2-spacer"></div>${s?null:z} <button type="button" class="g2-icon-btn" id="g2-fullscreen" title="Toggle fullscreen">⛶</button></div></div>`}function po(t,o){let s=t.split("/").filter(Boolean),l=o.split("/").filter(Boolean),y=0;for(;y<s.length&&y<l.length&&s[y]===l[y];)y++;let x=s.length-y,b=l.slice(y).join("/");return x===0?"./"+b:"../".repeat(x)+b}function fo(t,o){if(!o&&o!=="")return t;let s=po(o,t);return s.length<t.length?s:t}function mt(t,o,s,l){let y=s.length;if(y===0)return V`<div class="g2-sel-section"><div class="g2-sel-section-label">${o} (${y})</div><div class="g2-sel-section-empty">none</div></div>`;let x=s.map(b=>({file:b,display:fo(b,l)}));return x.sort((b,c)=>b.display.localeCompare(c.display)),V`<div class="g2-sel-section"><div class="g2-sel-section-label">${o} (${y})</div><ul class="g2-sel-file-list">${x.map(({file:b,display:c})=>{let v=t.nodeByFile.get(b),M=v?ne(v.pkg):"#666";return V`<li><button type="button" class="g2-sel-file-link" data-g2-select="${b}" title="${b}"><span class="g2-sel-file-dot" style="${Qe({background:M})}"></span> <span class="g2-sel-file-path">${c}</span></button></li>`})}</ul></div>`}function tt(t){if(!t)return V`<div class="g2-sel-section-empty">none</div>`;let s=["critical","high","medium","low","high_bug","bug","informational"].filter(l=>(t[l]??0)>0);return s.length===0?V`<div class="g2-sel-section-empty">none</div>`:V`<div class="tree-count-chips">${s.map(l=>V`<span class="${`tree-count-chip ${l}`}">${t[l]} ${l.replaceAll("_"," ")}</span>`)}</div>`}function Vt(t){let o=0;for(let b of t.edges)b.cross&&o++;let s=t.edges.length-o,l=0;for(let b of t.nodes)l+=b.totalIssues;let y=t.nodes.length===0?"0.0":(t.edges.length*2/t.nodes.length).toFixed(1),x=k.focusedPkg==="__own__"?"own source":k.focusedPkg;return V`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${k.focusedPkg?V`<div class="g2-stage-overlay"><button type="button" class="g2-back-btn" id="g2-back-to-full" title="Back to the full graph">← ${x}</button></div>`:null}<div id="g2-focus-overlay-slot" class="g2-stage-overlay-tr"></div><div class="g2-stage-stats"><span><b>${t.nodes.length}</b> files</span> <span><b>${t.packages.length}</b> packages</span> <span><b>${t.edges.length}</b> edges (${s} intra · ${o} cross)</span> <span><b>${l}</b> issues</span> <span>avg degree <b>${y}</b></span></div><div class="g2-zoom-ctrl"><button id="g2-zoom-in" title="Zoom in">+</button><div class="g2-zoom-pct" id="g2-zoom-pct">100%</div><button id="g2-zoom-out" title="Zoom out">−</button> <button id="g2-zoom-fit" class="g2-zoom-fit-btn" title="Fit to view">fit</button></div><div class="g2-tooltip" id="g2-tooltip"></div></main>`}function Gt(t){let o=null;if(k.selected){let l=t.nodeByFile.get(k.selected);l&&(o=l.pkg)}else k.solo&&(o=k.solo);return!o||(t.pkgCount.get(o)??0)<=1||k.focusedPkg===o?null:V`<button type="button" class="g2-focus-pkg-btn" data-g2-focus-pkg="${o}" title="${`Focus on ${o==="__own__"?"own source":o}'s graph`}"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 4.6 L4 11 M8 4.6 L12 11 M5 11.4 L11 11.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/><circle cx="8" cy="3.6" r="2" fill="currentColor"/><circle cx="3.6" cy="11.4" r="2" fill="currentColor"/><circle cx="12.4" cy="11.4" r="2" fill="currentColor"/></svg></button>`}function jt(){return V`<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 Wt(t){let o=k.showAll&&t.nodes.length>0&&t.nodes.every(y=>typeof y.size=="number"),s=t.nodes.some(y=>y.totalIssues>0),l=k.topPkgsTab;return l==="size"&&!o&&(l="files"),l==="issues"&&!s&&(l="files"),V`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${s?V`<button type="button" class="${Ce({"g2-mini-tab":!0,on:l==="issues"})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${Ce({"g2-mini-tab":!0,on:l==="files"})}" data-g2-top-pkgs="files">Files</button> ${o?V`<button type="button" class="${Ce({"g2-mini-tab":!0,on:l==="size"})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${bo(t,l)}`}function Ut(t,o={}){let s=k.selected;if(s){let l=t.nodeByFile.get(s);return l?uo(t,l,s,o):V`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return k.solo?go(t,k.solo):V`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function uo(t,o,s,l){let y=ne(o.pkg),x=o.pkg==="__own__"?"own source":o.pkg,b=ft(s,o.pkg),c=t.importedBy.get(s)??[],v=t.importsOf.get(s)??[],M=s.lastIndexOf("/"),e=M>=0?s.slice(0,M):"";return V`<div class="g2-selection-card"><div class="g2-sel-file-head"><div class="g2-sel-path">${b}</div><div class="g2-sel-pkg-row"><span class="g2-sel-dot" style="${Qe({"--dot":y,background:y})}"></span> <span class="g2-sel-pkg">${x}</span></div></div><div class="g2-sel-fullpath" title="${s}">${s}</div>${et(o.size)?V`<div class="g2-sel-size">${et(o.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${tt(o.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${tt(o.subtree)}</div><div class="g2-sel-jumps">${o.totalIssues>0?V`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${s}">Findings →</button>`:null} ${l.isBundleContext?o.origFile?V`<button type="button" class="g2-sel-jump" data-bundle-view-source="${o.origFile}">View source →</button>`:null:V`<button type="button" class="g2-sel-jump" data-g2-jump-file="${s}">Files →</button>`}</div>${mt(t,"Imported by",c,e)} ${mt(t,"Imports",v,e)}</div>`}function go(t,o){let s=t.nodes.filter(z=>z.pkg===o),l=s.length;if(l===0)return V`<div class="g2-empty-state"><strong>Package has no files in view</strong> Toggle "All files" to widen the file set, or pick another package.</div>`;let y=ne(o),x=o==="__own__"?"own source":o,b={};for(let z of ke)b[z]=0;for(let z of s)if(z.own)for(let _ of ke)b[_]+=z.own[_]??0;let c=0,v=0;for(let z of t.edges){let _=t.nodeByFile.get(z.a),L=t.nodeByFile.get(z.b);!_||!L||(_.pkg===o&&L.pkg===o?v++:(_.pkg===o||L.pkg===o)&&c++)}let M=0;for(let z of s)z.isHub&&M++;let e=new Set;for(let z of s)for(let _ of t.importedBy.get(z.file)??[]){let L=t.nodeByFile.get(_);L&&L.pkg!==o&&e.add(_)}return V`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${Qe({"--dot":y,background:y})}"></span> <span class="g2-sel-id">${x}</span> <span class="g2-sel-grp">package</span></div><div class="g2-sel-body"><div class="g2-sel-row"><span class="k">Files</span><span class="v">${l}</span></div><div class="g2-sel-row"><span class="k">Hubs</span><span class="v">${M}</span></div><div class="g2-sel-row"><span class="k">Intra edges</span><span class="v">${v}</span></div><div class="g2-sel-row"><span class="k">Cross edges</span><span class="v">${c}</span></div></div><div class="g2-sel-section"><div class="g2-sel-section-label">Findings</div>${tt(b)}</div>${mt(t,"Imported by",[...e])}</div>`}function bo(t,o){let s=t.nodes.length||1,l=o??k.topPkgsTab,y=k.selectedSeverities,x=k.selectedColors,b=y.size>0,c=x.size>0,v=b||c,M=new Map,e=new Map,z=0,_=0;for(let a of t.nodes){let p;if(v){if(p=0,a.findings)for(let A of a.findings)b&&!y.has(A.severity)||c&&!x.has(A.color)||p++}else p=a.totalIssues;M.set(a.pkg,(M.get(a.pkg)??0)+p),z+=p,typeof a.size=="number"&&(e.set(a.pkg,(e.get(a.pkg)??0)+a.size),_+=a.size)}let L;l==="issues"?L=t.packages.filter(a=>(M.get(a)??0)>0).toSorted((a,p)=>{let A=M.get(a)??0,H=M.get(p)??0;return H!==A?H-A:(t.pkgCount.get(p)??0)-(t.pkgCount.get(a)??0)}):l==="size"?L=t.packages.filter(a=>(e.get(a)??0)>0).toSorted((a,p)=>{let A=e.get(a)??0,H=e.get(p)??0;return H!==A?H-A:(t.pkgCount.get(p)??0)-(t.pkgCount.get(a)??0)}):L=[...t.packages].toSorted((a,p)=>{let A=t.pkgCount.get(a)??0,H=t.pkgCount.get(p)??0;return H!==A?H-A:(M.get(p)??0)-(M.get(a)??0)});let d=a=>l==="issues"?z>0?((M.get(a)??0)/z*100).toFixed(2):"0":l==="size"?_>0?((e.get(a)??0)/_*100).toFixed(2):"0":(t.pkgCount.get(a)/s*100).toFixed(2),D=l==="issues"?"No packages with issues":l==="size"?"No packages with size":"No packages";return V`<div class="g2-dist-bar">${t.packages.map(a=>{let p=ne(a);return V`<span style="${Qe({background:p,width:`${d(a)}%`})}"></span>`})}</div><div class="g2-dist-list">${L.length===0?V`<div class="g2-dist-empty">${D}</div>`:null} ${Ft(L,a=>a,a=>{let p=ne(a),A=t.pkgCount.get(a)??0,H=M.get(a)??0,U=e.get(a)??0,g=l==="issues"?H:l==="size"?et(U):A,R=l==="issues"?z>0?(H/z*100).toFixed(1):"0.0":l==="size"?_>0?(U/_*100).toFixed(1):"0.0":(A/s*100).toFixed(1),Y=a==="__own__"?"own source":a,ee=k.solo===a;return V`<button type="button" class="${Ce({"g2-dist-item":!0,on:ee})}" data-g2-pkg="${a}" title="${Y}"><span class="g2-dist-dot" style="${Qe({background:p})}"></span><span class="g2-dist-name">${Y}</span><span class="g2-dist-count">${g}</span><span class="g2-dist-pct">${R}%</span></button>`})}</div>`}var xt=class extends Lt{static properties={graph:{attribute:!1},options:{attribute:!1}};static styles=[ct(At),ct(It),ct(Ht)];constructor(){super(),this.graph=null,this.options={}}render(){return this.graph?V`<div class="graph2-layout">${Nt(this.graph,this.options)} ${Vt(this.graph)} ${jt()}</div>`:V``}};customElements.define("graph-layout",xt);function ho(t){let o=new Map;for(let[s,l]of t.importsOf){let y=t.nodeByFile.get(s);if(y)for(let x of l){let b=t.nodeByFile.get(x);b&&y.pkg!==b.pkg&&(o.set(y.pkg,(o.get(y.pkg)??0)+1),o.set(b.pkg,(o.get(b.pkg)??0)+1))}}return o}function mo(t){if(t.packages.length===0)return null;let o=new Set;for(let[s,l]of t.importedBy){let y=t.nodeByFile.get(s);if(y)for(let x of l){let b=t.nodeByFile.get(x);if(b&&b.pkg!==y.pkg){o.add(y.pkg);break}}}for(let s of t.packages)if(!o.has(s))return s;return null}var xo=5;function Yt(t,o){let s=new Map;for(let x of t.nodes)o.has(x.pkg)&&(s.has(x.pkg)||s.set(x.pkg,[]),s.get(x.pkg).push(x));for(let x of s.values())x.sort((b,c)=>b.isHub!==c.isHub?b.isHub?-1:1:c.deg-b.deg);let l=new Map,y=new Map;for(let[x,b]of o){let c=s.get(x);if(!c||c.length===0)continue;let v=c.length,M=0;for(let p of c)if(p.isHub)M++;else break;let e=M>0&&M<=xo,z=e?M:0,_=v-z,L=b.groupR,d=Array.from({length:v}),D=Array.from({length:v});for(let p=0;p<v;p++){let A=p*137.508*Math.PI/180,H;if(p<z)H=z<=1?0:Math.sqrt(p/(z-1))*.3*L;else{let U=p-z;H=_<=1?.4*L:(.4+Math.sqrt(U/(_-1))*.6)*L}d[p]=b.x+Math.cos(A)*H,D[p]=b.y+Math.sin(A)*H}let a=Array.from({length:v},()=>!1);for(let p=0;p<v;p++){let A=c[p],H,U;e&&A.isHub?(U=0,H=z):e?(U=z,H=v):(U=0,H=v);let g=0,R=0,Y=0,ee=t.importsOf.get(A.file);if(ee)for(let T of ee){let I=l.get(T);I!==void 0&&(g+=I,R+=y.get(T),Y++)}let B=t.importedBy.get(A.file);if(B)for(let T of B){let I=l.get(T);I!==void 0&&(g+=I,R+=y.get(T),Y++)}let J=!1;if(Y>0){g/=Y,R/=Y;let T=g-b.x,I=R-b.y;T*T+I*I>1&&(J=!0)}let E=-1;if(J){let T=1/0;for(let I=U;I<H;I++){if(a[I])continue;let f=d[I]-g,F=D[I]-R,W=f*f+F*F;W<T&&(T=W,E=I)}}else for(let T=U;T<H;T++)if(!a[T]){E=T;break}a[E]=!0,A.x=d[E],A.y=D[E],l.set(A.file,A.x),y.set(A.file,A.y)}}}function Kt(t,o,s){let l=o/2,y=s/2,x=Math.min(o,s)/2;if(t.packages.length===0)return;let c=mo(t),v=ho(t),M=(c?t.packages.filter(f=>f!==c):[...t.packages]).toSorted((f,F)=>{let W=(v.get(F)??0)-(v.get(f)??0);return W!==0?W:(t.pkgCount.get(F)??0)-(t.pkgCount.get(f)??0)}),e=M.length,z;e<=0?z=0:e<=6?z=.65:e<=20?z=.82:z=.95;let _=Math.max(1,Math.sqrt(50/Math.max(1,e))),L=.22,d=.12,D=.04,a=new Map,p;if(c){let f=t.pkgCount.get(c)??0,F=Math.min(L,(.012+Math.sqrt(f)*.004)*_);p=Math.max(e<=6?.4:e<=20?.36:.34,F+d+D),a.set(c,{x:l,y,size:f,groupR:F*x})}else e<=1?p=0:e<=6?p=.4:e<=20?p=.32:p=.3;if(e===0){Yt(t,a);return}let A=new Map;for(let f of t.edges){if(!f.cross)continue;let F=t.nodeByFile.get(f.a)?.pkg,W=t.nodeByFile.get(f.b)?.pkg;if(!F||!W||F===W)continue;A.has(F)||A.set(F,new Map),A.has(W)||A.set(W,new Map);let te=A.get(F),re=A.get(W);te.set(W,(te.get(W)??0)+1),re.set(F,(re.get(F)??0)+1)}let H=Math.max(1,Math.min(10,Math.round(Math.sqrt(e)/1.2))),U=Array.from({length:H+1});for(let f=0;f<=H;f++)U[f]=Math.floor(f*f/(H*H)*e);U[H]=e;let g=.2,R=Array.from({length:H}),Y=Array.from({length:H});for(let f=0;f<H;f++){let F=U[f],W=U[f+1];R[f]=W-F;let te=0;for(let re=F;re<W;re++)te+=t.pkgCount.get(M[re])??0;Y[f]=te}let ee=Array.from({length:H});for(let f=0;f<H;f++){let F=(U[f]+U[f+1]-1)/2/Math.max(1,e-1);ee[f]=Math.sqrt(Math.max(0,F))}let B=Array.from({length:H});B[0]=ee[0];for(let f=1;f<H;f++){let F=R[f-1],W=Y[f-1],te=F>0?W/F:1,re=1+g*Math.sqrt(Math.max(0,te-1));B[f]=B[f-1]+(ee[f]-ee[f-1])*re}let J=Array.from({length:H});for(let f=0;f<H;f++)J[f]=B[f]-ee[f];let E=Array.from({length:e}),T=Array.from({length:e}),I=0;for(let f=0;f<e;f++){for(;I<H-1&&f>=U[I+1];)I++;let F=f*137.508%360*Math.PI/180,te=(e<=1?0:Math.sqrt(f/(e-1)))+J[I],re=e===1?c?p:0:p+te*(z-p);E[f]=l+Math.cos(F)*re*x,T[f]=y+Math.sin(F)*re*x}for(let f=0;f<H;f++){let F=U[f],W=U[f+1],te=W-F;if(te===0)continue;let re=Array.from({length:te},()=>!1);for(let _e=F;_e<W;_e++){let Le=M[_e],pe=A.get(Le),We=0,Ue=0,Ye=0;if(pe)for(let[fe,ie]of pe){let me=a.get(fe);me&&(We+=me.x*ie,Ue+=me.y*ie,Ye+=ie)}let we=!1;if(Ye>0){We/=Ye,Ue/=Ye;let fe=We-l,ie=Ue-y;fe*fe+ie*ie>1&&(we=!0)}let Ke=-1;if(we){let fe=1/0;for(let ie=0;ie<te;ie++){if(re[ie])continue;let me=F+ie,ze=E[me]-We,Xe=T[me]-Ue,nt=ze*ze+Xe*Xe;nt<fe&&(fe=nt,Ke=ie)}}else for(let fe=0;fe<te;fe++)if(!re[fe]){Ke=fe;break}re[Ke]=!0;let ot=F+Ke,it=t.pkgCount.get(Le)??0,ut=Math.min(d,(.012+Math.sqrt(it)*.004)*_);a.set(Le,{x:E[ot],y:T[ot],size:it,groupR:ut*x})}}Yt(t,a)}function vt(t,o,s){let l=o/2,y=s/2,x=Math.min(o,s)/2,b=t.nodes.length;if(b===0)return;let c=[...t.nodes].toSorted((v,M)=>M.deg-v.deg);for(let v=0;v<b;v++){let M=c[v],e=v*137.508%360*Math.PI/180,z=b<=1?0:Math.sqrt(v/(b-1));M.x=l+Math.cos(e)*z*.85*x,M.y=y+Math.sin(e)*z*.85*x}}function yt(t,o,s,l,{groupOf:y=pt}={}){let x=t.length,b=l||760,c=s||1100,v=Math.sqrt(c*b/Math.max(x,1))*1.1,M=g=>{let R=0;for(let Y of g)R=R*31+Y.codePointAt(0)|0;return R},e=Math.ceil(Math.sqrt(x*c/b)),z=Math.ceil(x/e),_=b/(z+1),L=c/(e+1),d=t.map((g,R)=>{let Y=R%e,ee=Math.floor(R/e),B=M(g);return{file:g,x:(Y+1)*L+(B%100-50)*L*.4,y:(ee+1)*_+((B>>7)%100-50)*_*.4,dx:0,dy:0}}),D=new Map(d.map((g,R)=>[g.file,R])),a=[];for(let g of t)for(let R of o.get(g)??[])D.has(R)&&a.push([D.get(g),D.get(R)]);let p=new Map;for(let g=0;g<x;g++){let R=y(d[g].file)??"__own__";p.has(R)||p.set(R,[]),p.get(R).push(g)}let A=Math.min(500,Math.max(180,100+x*3)),H=Math.min(c,b)/6,U=.3;for(let g=0;g<A;g++){let R=H*Math.pow(U/H,g/A);for(let B of d)B.dx=0,B.dy=0;for(let B=0;B<x;B++)for(let J=B+1;J<x;J++){let E=d[B],T=d[J],I=E.x-T.x,f=E.y-T.y,F=Math.sqrt(I*I+f*f);if(F<.01){let te=M(E.file+T.file);I=(te%100-50)*.01||.5,f=((te>>7)%100-50)*.01||.5,F=Math.sqrt(I*I+f*f)}let W=v*v/F;E.dx+=I/F*W,E.dy+=f/F*W,T.dx-=I/F*W,T.dy-=f/F*W}for(let[B,J]of a){let E=d[B],T=d[J],I=E.x-T.x,f=E.y-T.y,F=Math.sqrt(I*I+f*f)||.01,W=F*F/v;E.dx-=I/F*W,E.dy-=f/F*W,T.dx+=I/F*W,T.dy+=f/F*W}let Y=.055*Math.min(1,R/(H*.3));for(let[,B]of p){if(B.length<2)continue;let J=0,E=0;for(let T of B)J+=d[T].x,E+=d[T].y;J/=B.length,E/=B.length;for(let T of B)d[T].dx+=(J-d[T].x)*Y,d[T].dy+=(E-d[T].y)*Y}let ee=50;for(let B of d){let J=Math.sqrt(B.dx*B.dx+B.dy*B.dy)||.01;B.x+=B.dx/J*Math.min(J,R),B.y+=B.dy/J*Math.min(J,R),B.x=Math.max(ee,Math.min(c-ee,B.x)),B.y=Math.max(ee,Math.min(b-ee,B.y))}}return d}var kt={critical:"#ff5470",high:"#ff9d4a",medium:"#f4d35e",low:"#67c2ff",high_bug:"#a06c3f",bug:"#7a6d62",informational:"#218bff"},wt={dark:{bg:"#0c0c0c",grid:"rgba(255, 255, 255, 0.022)",selectRing:"#ffffff",edgeIntra:"rgba(180, 195, 215, ALPHA)",hubRing:"rgba(255, 255, 255, ALPHA)",labelFill:"rgba(230, 233, 238, 0.78)",labelShadow:"rgba(12, 12, 12, 0.98)",labelOutline:"rgba(12, 12, 12, 0.9)",labelDefault:"rgba(200, 210, 225, 0.78)",labelHover:"rgba(230, 237, 243, 0.95)",labelSelected:"#fff"},light:{bg:"#f6f8fa",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"},pink:{bg:"#fff0f7",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"}};function vo(){let t=document.body.classList;return t.contains("theme-pink")?wt.pink:t.contains("theme-light")?wt.light:wt.dark}function he(t){return Math.max(0,Math.min(255,Math.round(t*255))).toString(16).padStart(2,"0")}function yo(t,o,s,l){let x=t.querySelector("graph-layout")?.shadowRoot;if(!x)return;let b=x.querySelector("#g2-canvas"),c=x.querySelector("#g2-tooltip"),v=x.querySelector(".graph2-stage"),M=x.querySelector("#g2-zoom-pct");if(!b)return;Bt();let e=b.getContext("2d"),z=window.devicePixelRatio||1,_=0,L=0,d={tx:0,ty:0,k:1},D=null,a=0,p=0,A=!0,H=!0,U=()=>k.packagesView&&(o.canPackagesView??!1)&&!k.focusedPkg,g=null;function R(){return g||(g=qt(o)),g}function Y(r,h,u){if(r.nodes.length>50){vt(r,h,u);return}let w=yt(r.nodes.map(S=>S.pkg),r.importsOf,h,u,{groupOf:S=>S}),m=new Map(w.map(S=>[S.file,S]));for(let S of r.nodes){let $=m.get(S.pkg);$&&(S.x=$.x,S.y=$.y)}}function ee(){if(!A)return;let r=k.layoutCache,h=k.focusedPkg,u=U(),w=u?R().nodes:o.nodes;if(r&&r.files===o.files&&r.w===p&&r.h===a&&r.focused===h&&(r.pkgView??!1)===u)for(let m of w){let S=r.pos.get(m.file);S&&(m.x=S.x,m.y=S.y)}else{if(u)Y(R(),p,a);else if(h)if(o.nodes.length>50)vt(o,p,a);else{let S=yt(o.files,o.importsOf,p,a),$=new Map(S.map(j=>[j.file,j]));for(let j of o.nodes){let G=$.get(j.file);G&&(j.x=G.x,j.y=G.y)}}else Kt(o,p,a);let m=new Map;for(let S of w)m.set(S.file,{x:S.x,y:S.y});k.layoutCache={files:o.files,w:p,h:a,pos:m,focused:h,pkgView:u}}A=!1}function B(){let r=U()?R().nodes:o.nodes;if(r.length===0)return{k:1,tx:L/2,ty:_/2};let h=-1/0,u=-1/0,w=1/0,m=1/0;for(let i of r)i.x<w&&(w=i.x),i.y<m&&(m=i.y),i.x>h&&(h=i.x),i.y>u&&(u=i.y);let S=Math.max(20,u-m),$=Math.max(20,h-w),j=(w+h)/2,G=(m+u)/2,q=Math.min(L,_)*.1,K=Math.min((L-q*2)/$,(_-q*2)/S,4),n=Math.max(.05,K);return{k:n,tx:L/2-j*n,ty:_/2-G*n}}function J(){let r=B();d.k=r.k,d.tx=r.tx,d.ty=r.ty}function E(r,h){return[r*d.k+d.tx,h*d.k+d.ty]}function T(r,h){return[(r-d.tx)/d.k,(h-d.ty)/d.k]}function I(r){return!k.hidden.has(r.pkg)}function f(r){if(k.selectedSeverities.size>0){let u=r.severitySet;if(!u)return!0;let w=!1;for(let m of k.selectedSeverities)if(u.has(m)){w=!0;break}if(!w)return!0}if(k.selectedColors.size>0){let u=r.colorSet;if(!u)return!0;let w=!1;for(let m of k.selectedColors)if(u.has(m)){w=!0;break}if(!w)return!0}if(k.solo&&r.pkg!==k.solo&&!U())return!0;let h=k.pathFilter;if(h){let u=h.toLowerCase(),w=r.pathText?r.pathText.includes(u):r.file.toLowerCase().includes(u),m=r.pkg&&r.pkg.toLowerCase().includes(u),S=r.label&&r.label.toLowerCase().includes(u);if(!w&&!m&&!S)return!0}return!1}function F(r){let h=(r.isHub?4.9:3.5)*k.nodeSize,u=Math.max(.6,Math.min(1.6,d.k));return h*u}function W(){let r=v.getBoundingClientRect(),h=_,u=L;L=Math.max(80,r.width),_=Math.max(80,r.height),z=window.devicePixelRatio||1,b.width=L*z,b.height=_*z,b.style.width=L+"px",b.style.height=_+"px",e.setTransform(z,0,0,z,0,0),(p===0||a===0)&&(p=L,a=_,A=!0),ee();let w=u>0&&(Math.abs(L-u)/u>.15||Math.abs(_-h)/h>.15);(H||w)&&(J(),H=!1),pe()}let te=null,re=!0,_e=!1,Le=!1;function pe(){re=!0,!(_e||Le)&&(_e=!0,te=requestAnimationFrame(()=>{_e=!1,re&&!Le&&(re=!1,We())}))}function We(){let r=vo();e.fillStyle=r.bg,e.fillRect(0,0,L,_),Ue(r);let h=U(),u=h?R():o,w=h?k.solo:k.selected,m=w?u.nodeByFile.get(w):null,S=m?w:null;if(h&&u.nodes.length<=50){Ke(r);return}if(k.focusedPkg&&u.nodes.length<=50){Ye(r,S,m);return}for(let $ of u.edges){let j=u.nodeByFile.get($.a),G=u.nodeByFile.get($.b);if(!j||!G||!I(j)||!I(G))continue;let q=k.edgeOpacity;S?q=$.a===S||$.b===S?.85:k.edgeOpacity*.25:D&&($.a===D||$.b===D)&&(q=Math.min(.9,q+.5)),f(j)&&f(G)&&(q=Math.min(q,.04));let[K,n]=E(j.x,j.y),[i,C]=E(G.x,G.y);if($.cross){let O=e.createLinearGradient(K,n,i,C);O.addColorStop(0,ne(j.pkg)+he(q)),O.addColorStop(1,ne(G.pkg)+he(q)),e.strokeStyle=O,e.lineWidth=.85}else e.strokeStyle=r.edgeIntra.replace("ALPHA",String(q*.7)),e.lineWidth=.55;e.beginPath(),e.moveTo(K,n),e.lineTo(i,C),e.stroke()}for(let $ of u.nodes){if(!I($))continue;let j=$.file===D,G=$.file===S;if(!$.isHub&&!j&&!G||f($)&&!j&&!G)continue;let[q,K]=E($.x,$.y),i=F($)*(G?6:j?4.5:3),C=e.createRadialGradient(q,K,0,q,K,i),O=ne($.pkg);C.addColorStop(0,O+"55"),C.addColorStop(1,O+"00"),e.fillStyle=C,e.beginPath(),e.arc(q,K,i,0,Math.PI*2),e.fill()}for(let $ of u.nodes){if(!I($))continue;let[j,G]=E($.x,$.y),q=F($),K=1,n=S&&$.file===S;if(S&&!n&&(K=(u.adj.get(S)??[]).some(C=>{let O=u.edges[C];return O.a===$.file||O.b===$.file})?1:.25),!n&&f($)&&(K=Math.min(K,.1)),e.fillStyle=ne($.pkg)+he(K),e.beginPath(),e.arc(j,G,q,0,Math.PI*2),e.fill(),$.isHub&&(e.strokeStyle=r.hubRing.replace("ALPHA",String(.55*K)),e.lineWidth=.8,e.stroke()),$.issue){let i=kt[$.issue],C=q+($.issue==="critical"?4.2:$.issue==="high"?3.4:2.8),O=$.issue==="critical"?1.8:$.issue==="high"?1.5:$.issue==="medium"?1.3:1.1;e.strokeStyle=i,e.globalAlpha=K,e.lineWidth=O,e.beginPath(),e.arc(j,G,C,0,Math.PI*2),e.stroke(),e.globalAlpha=1}}if(d.k>1.4){let j=0;if(d.k<9&&!k.showLabels)for(let q of u.nodes){if(!I(q))continue;let[K,n]=E(q.x,q.y);if(!(K<0||K>L||n<0||n>_)&&(j++,j>=50))break}let G=d.k>=9||j<50;if(k.showLabels||G){e.font="10px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.fillStyle=r.labelFill,e.textAlign="left",e.textBaseline="middle";let q=11,K=2,n=250,i=(P,N)=>P>-n&&P<L+n&&N>-n&&N<_+n,C=[];for(let P of u.nodes){if(!I(P))continue;let[N,X]=E(P.x,P.y);if(!i(N,X))continue;let oe=F(P);C.push({file:P.file,x0:N-oe,x1:N+oe,y0:X-oe,y1:X+oe})}let O=[];for(let P of u.nodes){if(!I(P)||!P.isHub&&d.k<2.4)continue;let[N,X]=E(P.x,P.y);if(!i(N,X))continue;let oe=F(P),xe=N+oe+4,Se=X+1,Fe=e.measureText(P.label).width+K,He=P.file===S,Ie=P.file===D,Ae=He?3:Ie?2:P.isHub?1:0;O.push({file:P.file,n:P,tx:xe,ty:Se,prio:Ae,x0:xe-K,x1:xe+Fe,y0:Se-q/2,y1:Se+q/2})}O.sort((P,N)=>N.prio-P.prio);let Q=[],Z=(P,N)=>P.x0<N.x1&&N.x0<P.x1&&P.y0<N.y1&&N.y0<P.y1;for(let P of O){let N=!1;for(let X of C)if(X.file!==P.file&&Z(P,X)){N=!0;break}if(!N){for(let X of Q)if(Z(P,X)){N=!0;break}}N||Q.push(P)}for(let P of Q)e.fillText(P.n.label,P.tx,P.ty)}}if(m&&I(m)){let[$,j]=E(m.x,m.y),G=F(m);e.strokeStyle=r.selectRing,e.lineWidth=1.5,e.beginPath(),e.arc($,j,G+5,0,Math.PI*2),e.stroke()}M&&(M.textContent=`${Math.round(d.k*100)}%`)}function Ue(r){if(d.k<.4)return;let h=80,u=(d.tx%h+h)%h,w=(d.ty%h+h)%h;e.strokeStyle=r.grid,e.lineWidth=1,e.beginPath();for(let m=u;m<L;m+=h)e.moveTo(m,0),e.lineTo(m,_);for(let m=w;m<_;m+=h)e.moveTo(0,m),e.lineTo(L,m);e.stroke()}function Ye(r,h,u){let w=ne(k.focusedPkg),m=new Set;if(D){m.add(D);for(let n of o.adj.get(D)??[]){let i=o.edges[n];m.add(i.a),m.add(i.b)}}let S=n=>(n.isHub?6:4)*k.nodeSize;for(let n of o.edges){let i=o.nodeByFile.get(n.a),C=o.nodeByFile.get(n.b);if(!i||!C||!I(i)||!I(C))continue;let O=n.fromLo&&n.fromHi,Q=!O&&n.fromHi,Z=Q?C:i,P=Q?i:C,N=D&&(n.a===D||n.b===D),X=h&&(n.a===h||n.b===h),oe=(h||D)&&!N&&!X,xe=S(Z),Se=S(P),[Fe,He]=E(Z.x,Z.y),[Ie,Ae]=E(P.x,P.y),Be=Ie-Fe,Ee=Ae-He,Te=Math.sqrt(Be*Be+Ee*Ee)||1,Oe=Be/Te,De=Ee/Te,ae=Fe+Oe*(xe+1.5),le=He+De*(xe+1.5),ce=Ie-Oe*(Se+3.5),de=Ae-De*(Se+3.5),rt=Math.min(Te*.15,30),ve=(ae+ce)/2-De*rt,ye=(le+de)/2+Oe*rt;e.beginPath(),e.moveTo(ae,le),e.quadraticCurveTo(ve,ye,ce,de);let ue;if(X?ue=.9:N?ue=.85:oe?ue=.05:ue=Math.min(.85,k.edgeOpacity*3),e.strokeStyle=w+he(ue),e.lineWidth=X||N?1.5:.85,e.stroke(),oe)continue;let ge=Math.max(5,7),se=ge*.42,be=.9,Pe=2*(1-be)*(ve-ae)+2*be*(ce-ve),qe=2*(1-be)*(ye-le)+2*be*(de-ye),Ze=Math.sqrt(Pe*Pe+qe*qe)||1,Ne=Pe/Ze,Me=qe/Ze;if(e.beginPath(),e.moveTo(ce,de),e.lineTo(ce-Ne*ge+Me*se,de-Me*ge-Ne*se),e.lineTo(ce-Ne*ge-Me*se,de-Me*ge+Ne*se),e.closePath(),e.fillStyle=w+he(Math.min(1,ue+.15)),e.fill(),O){let at=1.8*(ve-ae)+.2*(ce-ve),Ve=2*(1-.1)*(ye-le)+2*.1*(de-ye),Je=Math.sqrt(at*at+Ve*Ve)||1,Ge=at/Je,$e=Ve/Je;e.beginPath(),e.moveTo(ae,le),e.lineTo(ae+Ge*ge-$e*se,le+$e*ge+Ge*se),e.lineTo(ae+Ge*ge+$e*se,le+$e*ge-Ge*se),e.closePath(),e.fill()}}for(let n of o.nodes){if(!I(n))continue;let[i,C]=E(n.x,n.y),O=S(n),Q=n.file===D,Z=n.file===h,P=(h||D)&&!m.has(n.file)&&!Z?.15:1;if(e.globalAlpha=P,Z||Q||n.isHub){let N=O*(Z?4:Q?3:2.4),X=e.createRadialGradient(i,C,O*.6,i,C,N);X.addColorStop(0,w+he(Z?.4:.25)),X.addColorStop(1,w+"00"),e.fillStyle=X,e.beginPath(),e.arc(i,C,N,0,Math.PI*2),e.fill()}if(e.fillStyle=w,e.beginPath(),e.arc(i,C,O,0,Math.PI*2),e.fill(),n.isHub&&(e.strokeStyle=r.hubRing.replace("ALPHA","0.55"),e.lineWidth=.9,e.stroke()),n.issue){let N=kt[n.issue],X=O+(n.issue==="critical"?4.2:n.issue==="high"?3.4:2.8),oe=n.issue==="critical"?1.8:n.issue==="high"?1.5:n.issue==="medium"?1.3:1.1;e.strokeStyle=N,e.lineWidth=oe,e.beginPath(),e.arc(i,C,X,0,Math.PI*2),e.stroke()}e.globalAlpha=1}e.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.textAlign="center",e.textBaseline="top",e.lineJoin="round";let $=13,j=2,G=[];for(let n of o.nodes){if(!I(n))continue;let[i,C]=E(n.x,n.y),O=S(n),Q=C+O+4,Z=e.measureText(n.label).width/2+j,P=n.file===h,N=n.file===D,X=P?3:N?2:n.isHub?1:0;G.push({n,sx:i,ty:Q,halfW:Z,isSel:P,isHov:N,prio:X,x0:i-Z,x1:i+Z,y0:Q,y1:Q+$})}G.sort((n,i)=>i.prio-n.prio);let q=[],K=(n,i)=>n.x0<i.x1&&i.x0<n.x1&&n.y0<i.y1&&i.y0<n.y1;for(let n of G){let i=!1;for(let C of q)if(K(n,C)){i=!0;break}i||q.push(n)}for(let n of q){let{n:i,sx:C,ty:O,isSel:Q,isHov:Z}=n,P=(h||D)&&!m.has(i.file)&&!Q?.2:1;e.globalAlpha=P,e.shadowColor=r.labelShadow,e.shadowBlur=4,e.strokeStyle=r.labelOutline,e.lineWidth=3,e.strokeText(i.label,C,O),e.shadowBlur=0,e.fillStyle=Q?r.labelSelected:Z?r.labelHover:r.labelDefault,e.fillText(i.label,C,O),e.globalAlpha=1}if(u&&I(u)){let[n,i]=E(u.x,u.y),C=S(u);e.strokeStyle=r.selectRing,e.lineWidth=1.8,e.beginPath(),e.arc(n,i,C+4,0,Math.PI*2),e.stroke()}M&&(M.textContent=`${Math.round(d.k*100)}%`)}function we(r){return Math.min(26,5+Math.sqrt(r.fileCount)*1.7)*k.nodeSize}function Ke(r){let h=R(),u=k.solo&&h.byPkg.has(k.solo)?k.solo:null,w=D??u,m=new Set;if(w){m.add(w);for(let n of h.edges)n.a===w?m.add(n.b):n.b===w&&m.add(n.a)}let S=n=>{if(n.pkg===u||n.pkg===D)return 1;let i=1;return w&&!m.has(n.pkg)&&(i=.2),f(n)&&(i=Math.min(i,.1)),i};for(let n of h.edges){let i=h.byPkg.get(n.a),C=h.byPkg.get(n.b);if(!i||!C||!I(i)||!I(C))continue;let O=n.fromLo&&n.fromHi,Q=!O&&n.fromHi,Z=Q?C:i,P=Q?i:C,N=w!==null&&(n.a===w||n.b===w),X=f(i)&&f(C),oe=w!==null&&!N||X,xe=we(Z),Se=we(P),[Fe,He]=E(Z.x,Z.y),[Ie,Ae]=E(P.x,P.y),Be=Ie-Fe,Ee=Ae-He,Te=Math.sqrt(Be*Be+Ee*Ee)||1,Oe=Be/Te,De=Ee/Te,ae=Fe+Oe*(xe+1.5),le=He+De*(xe+1.5),ce=Ie-Oe*(Se+3.5),de=Ae-De*(Se+3.5),rt=Math.min(Te*.15,30),ve=(ae+ce)/2-De*rt,ye=(le+de)/2+Oe*rt,ue;X?ue=.05:N?ue=.9:oe?ue=.06:ue=.5;let ge=e.createLinearGradient(ae,le,ce,de);if(ge.addColorStop(0,ne(Z.pkg)+he(ue)),ge.addColorStop(1,ne(P.pkg)+he(ue)),e.beginPath(),e.moveTo(ae,le),e.quadraticCurveTo(ve,ye,ce,de),e.strokeStyle=ge,e.lineWidth=Math.min(3.5,.8+Math.sqrt(n.count)*.3)*(N?1.3:1),e.stroke(),oe)continue;let se=7,be=se*.42,Pe=.9,qe=2*(1-Pe)*(ve-ae)+2*Pe*(ce-ve),Ze=2*(1-Pe)*(ye-le)+2*Pe*(de-ye),Ne=Math.sqrt(qe*qe+Ze*Ze)||1,Me=qe/Ne,st=Ze/Ne;if(e.beginPath(),e.moveTo(ce,de),e.lineTo(ce-Me*se+st*be,de-st*se-Me*be),e.lineTo(ce-Me*se-st*be,de-st*se+Me*be),e.closePath(),e.fillStyle=ne(P.pkg)+he(Math.min(1,ue+.15)),e.fill(),O){let Ve=1.8*(ve-ae)+.2*(ce-ve),Je=2*(1-.1)*(ye-le)+2*.1*(de-ye),Ge=Math.sqrt(Ve*Ve+Je*Je)||1,$e=Ve/Ge,lt=Je/Ge;e.beginPath(),e.moveTo(ae,le),e.lineTo(ae+$e*se-lt*be,le+lt*se+$e*be),e.lineTo(ae+$e*se+lt*be,le+lt*se-$e*be),e.closePath(),e.fillStyle=ne(Z.pkg)+he(Math.min(1,ue+.15)),e.fill()}}for(let n of h.nodes){if(!I(n))continue;let[i,C]=E(n.x,n.y),O=we(n),Q=n.pkg===D,Z=n.pkg===u,P=ne(n.pkg),N=S(n);if(Z||Q){let X=O*(Z?2.6:2.2),oe=e.createRadialGradient(i,C,O*.6,i,C,X);oe.addColorStop(0,P+he(Z?.4:.25)),oe.addColorStop(1,P+"00"),e.fillStyle=oe,e.beginPath(),e.arc(i,C,X,0,Math.PI*2),e.fill()}if(e.fillStyle=P+he(N),e.beginPath(),e.arc(i,C,O,0,Math.PI*2),e.fill(),n.issue){let X=kt[n.issue],oe=O+(n.issue==="critical"?4.2:n.issue==="high"?3.4:2.8),xe=n.issue==="critical"?1.8:n.issue==="high"?1.5:n.issue==="medium"?1.3:1.1;e.strokeStyle=X,e.globalAlpha=N,e.lineWidth=xe,e.beginPath(),e.arc(i,C,oe,0,Math.PI*2),e.stroke(),e.globalAlpha=1}}e.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",e.textAlign="center",e.textBaseline="top",e.lineJoin="round";let $=13,j=2,G=[];for(let n of h.nodes){if(!I(n))continue;let[i,C]=E(n.x,n.y),O=we(n),Q=C+O+4,Z=e.measureText(n.label).width/2+j,P=n.pkg===u,N=n.pkg===D,X=P?1/0:N?1e9:n.fileCount;G.push({p:n,sx:i,ty:Q,isSel:P,isHov:N,prio:X,x0:i-Z,x1:i+Z,y0:Q,y1:Q+$})}G.sort((n,i)=>i.prio-n.prio);let q=[],K=(n,i)=>n.x0<i.x1&&i.x0<n.x1&&n.y0<i.y1&&i.y0<n.y1;for(let n of G){let i=!1;for(let C of q)if(K(n,C)){i=!0;break}i||q.push(n)}for(let n of q){let{p:i,sx:C,ty:O,isSel:Q,isHov:Z}=n;e.globalAlpha=Math.max(.25,S(i)),e.shadowColor=r.labelShadow,e.shadowBlur=4,e.strokeStyle=r.labelOutline,e.lineWidth=3,e.strokeText(i.label,C,O),e.shadowBlur=0,e.fillStyle=Q?r.labelSelected:Z?r.labelHover:r.labelDefault,e.fillText(i.label,C,O),e.globalAlpha=1}if(u){let n=h.byPkg.get(u),[i,C]=E(n.x,n.y);e.strokeStyle=r.selectRing,e.lineWidth=1.8,e.beginPath(),e.arc(i,C,we(n)+4,0,Math.PI*2),e.stroke()}M&&(M.textContent=`${Math.round(d.k*100)}%`)}function ot(r,h){let u=U(),w=u?R():o,m=u&&w.nodes.length<=50,S=null,$=1/0,j=6;for(let G of w.nodes){if(!I(G))continue;let[q,K]=E(G.x,G.y),n=q-r,i=K-h,C=n*n+i*i,O=(m?we(G):F(G))+j;C<O*O&&C<$&&($=C,S=G)}return S}function it(r,h,u){if(!c)return;let w=ne(r.pkg),m=r.pkg==="__own__"?"own source":r.pkg,S=ft(r.file,r.pkg);je(V`<div class="g2-tt-path">${S}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${w}`}"></span> <span class="g2-tt-pkg">${m}</span></div>${r.totalIssues>0?tt(r.own):null}`,c),fe(h,u)}function ut(r,h,u){if(!c)return;let w=ne(r.pkg),m=et(r.size);je(V`<div class="g2-tt-path">${r.label}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${w}`}"></span> <span class="g2-tt-pkg">${r.fileCount} ${r.fileCount===1?"file":"files"}${m?` \xB7 ${m}`:""}</span></div>${r.totalIssues>0?tt(r.own):null}`,c),fe(h,u)}function fe(r,h){let u=v.getBoundingClientRect();c.classList.add("show");let w=c.offsetWidth,m=c.offsetHeight,S=r-u.left,$=h-u.top,j=u.width,G=u.height,q=12,K=S+q;K+w>j-4&&(K=S-w-q),K<4&&(K=4);let n=$+q;n+m>G-4&&(n=$-m-q),n<4&&(n=4),c.style.left=`${K}px`,c.style.top=`${n}px`}function ie(){c&&c.classList.remove("show")}let me=!1,ze=null,Xe=!1,nt=r=>{r.button===0&&(r.target.closest(".g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl")||(me=!0,Xe=!1,ze={x:r.clientX,y:r.clientY,tx:d.tx,ty:d.ty}))},St=r=>{let h=v.getBoundingClientRect(),u=r.clientX-h.left,w=r.clientY-h.top;if(me){let $=r.clientX-ze.x,j=r.clientY-ze.y;Math.abs($)+Math.abs(j)>3&&(Xe=!0),d.tx=ze.tx+$,d.ty=ze.ty+j,ie(),pe();return}let m=ot(u,w),S=D;D=m?.file??null,b.style.cursor=m?"default":"grab",m?U()?ut(m,r.clientX,r.clientY):it(m,r.clientX,r.clientY):S&&ie(),D!==S&&pe()},Mt=r=>{if(me&&!Xe){let h=v.getBoundingClientRect(),u=r.clientX-h.left,w=r.clientY-h.top,m=ot(u,w);U()?(k.solo=m&&k.solo!==m.pkg?m.pkg:null,k.selected=null,s(),l?.()):(k.selected=m?.file??null,s()),pe()}me=!1},$t=()=>{let r=D!==null;D=null,ie(),r&&pe()},zt=r=>{r.preventDefault();let h=v.getBoundingClientRect(),u=r.clientX-h.left,w=r.clientY-h.top,m=Math.exp(-r.deltaY*.0015),S=B();if(m<1&&d.k<=S.k*1.0001){d.k=S.k;let q=Math.min(.4,(1-m)*3);d.tx+=(S.tx-d.tx)*q,d.ty+=(S.ty-d.ty)*q,pe();return}let[$,j]=T(u,w),G=Math.max(S.k,Math.min(9.99,d.k*m));d.k=G,d.tx=u-$*d.k,d.ty=w-j*d.k,pe()};v.addEventListener("mousedown",nt),window.addEventListener("mousemove",St),window.addEventListener("mouseup",Mt),v.addEventListener("mouseleave",$t),v.addEventListener("wheel",zt,{passive:!1});function Pt(r){let h=B().k;r=Math.max(h,Math.min(9.99,r));let u=L/2,w=_/2,[m,S]=T(u,w);d.k=r,d.tx=u-m*d.k,d.ty=w-S*d.k,pe()}let Zt=x.querySelector("#g2-zoom-in"),Jt=x.querySelector("#g2-zoom-out"),Qt=x.querySelector("#g2-zoom-fit");Zt?.addEventListener("click",()=>Pt(d.k*1.4)),Jt?.addEventListener("click",()=>Pt(d.k/1.4)),Qt?.addEventListener("click",()=>{J(),pe()}),W();let Ct=new ResizeObserver(()=>W());Ct.observe(v);let Rt=new MutationObserver(r=>{for(let h of r){let u=(h.oldValue||"").includes("report-fullscreen"),w=document.body.classList.contains("report-fullscreen");if(u!==w){p=0,a=0,A=!0,H=!0,k.layoutCache=null,setTimeout(()=>W(),80);return}pe()}});Rt.observe(document.body,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}),pe(),k.graphState={requestDraw:pe,_cleanup:()=>{Le=!0,cancelAnimationFrame(te),Ct.disconnect(),Rt.disconnect(),v.removeEventListener("mousedown",nt),window.removeEventListener("mousemove",St),window.removeEventListener("mouseup",Mt),v.removeEventListener("mouseleave",$t),v.removeEventListener("wheel",zt)}}}function hn(t,o){let s=document.querySelector("graph-layout")?.shadowRoot;if(!s)return;let l=Xt(t),y=s.querySelector("#g2-selection-area");y&&je(Ut(l,o),y);let x=s.querySelector("#g2-focus-overlay-slot");x&&je(Gt(l),x)}function mn(t){let o=document.querySelector("graph-layout")?.shadowRoot;if(!o)return;let s=o.querySelector("#g2-top-pkgs-block");s&&je(Wt(Xt(t)),s)}function Xt(t){let o=Dt(t.treeData,t.files,t.ownCounts,t.transitiveCounts,t.severitySets,t.colorSets,t.fileFindings,t.options);if(t.strippedToOrig)for(let s of o.nodes)s.origFile=t.strippedToOrig.get(s.file);return o.canPackagesView=t.canPackagesView??!1,o}export{io as _swapGraph2Impl,yo as attachGraph2Interaction,Xt as buildGraphFromPrep,hn as refreshSidebar,mn as refreshTopPkgs};
|
package/out/index.html
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self'; manifest-src 'self'; form-action 'none'; connect-src 'self'">
|
|
7
|
-
<title>
|
|
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,47 +21,52 @@
|
|
|
21
21
|
<body>
|
|
22
22
|
|
|
23
23
|
<theme-toggle></theme-toggle>
|
|
24
|
-
<
|
|
25
|
-
|
|
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>
|
|
38
|
-
|
|
39
|
-
<!-- WCO duplicate of the sidebar-header. Hidden by default; shown
|
|
40
|
-
via CSS only when `@media (display-mode: window-controls-overlay)`
|
|
41
|
-
matches. Lives outside #sidebar so it escapes #sidebar's stacking
|
|
42
|
-
context (which is trapped under the page-level fixed backdrops
|
|
43
|
-
by the sidebar's own backdrop-filter). Only the brand is
|
|
44
|
-
duplicated — the interactive buttons (sidebar-toggle,
|
|
45
|
-
encryption-toggle) stay single-instance in the in-sidebar
|
|
46
|
-
header. The drag-handle / OS-controls-landing strip is what
|
|
47
|
-
this duplicate exists to provide; the actual lock + hamburger
|
|
48
|
-
buttons are still functional through the regular sidebar
|
|
49
|
-
header (visible underneath since both occupy the same column
|
|
50
|
-
position). -->
|
|
51
|
-
<div class="sidebar-header sidebar-header-wco" aria-hidden="true">
|
|
52
|
-
<h2 class="brand">
|
|
53
|
-
<span class="brand-name">DeepView</span>
|
|
54
|
-
<span class="brand-tag">dev</span>
|
|
55
|
-
</h2>
|
|
56
|
-
</div>
|
|
24
|
+
<print-button></print-button>
|
|
25
|
+
<download-button></download-button>
|
|
57
26
|
|
|
27
|
+
<!-- App sidebar — Lit component, owns its own shadow-DOM chrome
|
|
28
|
+
(brand header, search input, file list, sync button). The
|
|
29
|
+
brand wordmark inside is the click target that routes to
|
|
30
|
+
`goHome` via the sidebar's own click delegate; in WCO PWA
|
|
31
|
+
mode the same brand is what the OS controls strip overlays
|
|
32
|
+
onto (no light-DOM duplicate needed). -->
|
|
58
33
|
<app-sidebar role="complementary" aria-label="Reports and workspaces"></app-sidebar>
|
|
59
34
|
|
|
60
35
|
<main id="main-content">
|
|
61
|
-
<div id="drop-zone"
|
|
36
|
+
<div id="drop-zone" aria-label="Drop reports here">
|
|
62
37
|
<div class="drop-prompt">
|
|
63
|
-
<
|
|
64
|
-
<p>Drop a
|
|
38
|
+
<p class="drop-prompt-intro">Browse, search, and triage findings from your code-security analyzers and source bundles — all locally in your browser, with optional cross-device sync.</p>
|
|
39
|
+
<p>Drop a file here, <button type="button" class="drop-prompt-action">click to browse</button>, or pick one from the sidebar.</p>
|
|
40
|
+
<!-- Supported-formats list — each row's icon placeholder is
|
|
41
|
+
filled at boot by view/drop-supported-icons.js with the
|
|
42
|
+
same SVG markup the sidebar uses for its file / bundle /
|
|
43
|
+
workspace rows (see view/file-display.js + view/icons.js
|
|
44
|
+
for the source of truth). `data-icon` keys the lookup. -->
|
|
45
|
+
<div class="drop-supported" aria-label="Supported formats">
|
|
46
|
+
<section class="drop-supported-section">
|
|
47
|
+
<h2>Reports</h2>
|
|
48
|
+
<ul>
|
|
49
|
+
<li><span class="drop-supported-icon" data-icon="default" aria-hidden="true"></span><span class="drop-supported-label">DeepView</span></li>
|
|
50
|
+
<li><span class="drop-supported-icon" data-icon="claude-security" aria-hidden="true"></span><span class="drop-supported-label">Claude Security</span></li>
|
|
51
|
+
<li><span class="drop-supported-icon" data-icon="codex-security" aria-hidden="true"></span><span class="drop-supported-label">Codex Security</span></li>
|
|
52
|
+
<li><span class="drop-supported-icon" data-icon="deepsec" aria-hidden="true"></span><span class="drop-supported-label">DeepSec</span></li>
|
|
53
|
+
<li><span class="drop-supported-icon" data-icon="piolium" aria-hidden="true"></span><span class="drop-supported-label">Piolium</span></li>
|
|
54
|
+
</ul>
|
|
55
|
+
</section>
|
|
56
|
+
<section class="drop-supported-section">
|
|
57
|
+
<h2>Bundles</h2>
|
|
58
|
+
<ul>
|
|
59
|
+
<li><span class="drop-supported-icon" data-icon="bundle" aria-hidden="true"></span><span class="drop-supported-label">Stasis</span></li>
|
|
60
|
+
<li><span class="drop-supported-icon" data-icon="bundle" aria-hidden="true"></span><span class="drop-supported-label">Sourcemaps</span></li>
|
|
61
|
+
</ul>
|
|
62
|
+
</section>
|
|
63
|
+
<section class="drop-supported-section">
|
|
64
|
+
<h2>Workspaces</h2>
|
|
65
|
+
<ul>
|
|
66
|
+
<li><span class="drop-supported-icon" data-icon="workspace" aria-hidden="true"></span><span class="drop-supported-label">Workspace exports</span></li>
|
|
67
|
+
</ul>
|
|
68
|
+
</section>
|
|
69
|
+
</div>
|
|
65
70
|
</div>
|
|
66
71
|
</div>
|
|
67
72
|
<div id="report"></div>
|