dependency-radar 0.6.0 → 0.6.1

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.
@@ -8,11 +8,11 @@ exports.JS_CONTENT = exports.CSS_CONTENT = void 0;
8
8
  * CSS content for the dependency radar HTML report
9
9
  * Built from report-ui/style.css
10
10
  */
11
- exports.CSS_CONTENT = `*,*:before,*:after{box-sizing:border-box}:root{--bg-primary: #0c1222;--bg-secondary: #151d2e;--bg-card: rgba(21, 29, 46, .95);--bg-card-hover: rgba(30, 41, 59, .95);--text-primary: #e8edf5;--text-secondary: #8b99b0;--text-muted: #5c6b82;--border-color: rgba(99, 120, 150, .2);--border-color-strong: rgba(99, 120, 150, .35);--accent: #06b6d4;--accent-hover: #22d3ee;--accent-subtle: rgba(6, 182, 212, .15);--title-gradient: linear-gradient(135deg, #06b6d4 0%, #10b981 100%);--green: #10b981;--green-bg: rgba(16, 185, 129, .15);--amber: #f59e0b;--amber-bg: rgba(245, 158, 11, .15);--red: #ef4444;--red-bg: rgba(239, 68, 68, .15);--gray: #64748b;--gray-bg: rgba(100, 116, 139, .15);--license-permissive: #10b981;--license-weak-copyleft: #f59e0b;--license-strong-copyleft: #ef4444;--license-unknown: #64748b;--font-stack: -apple-system, "BlinkMacSystemFont", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", sans-serif;--font-mono: ui-monospace, "SFMono-Regular", "SF Mono", "Menlo", "Consolas", monospace;--transition: .2s ease;--radius: 8px;--radius-lg: 12px;--graph-direct-runtime: var(--green);--graph-direct-dev: var(--amber);--graph-transitive: var(--accent);--graph-edge: var(--border-color-strong);--graph-highlight: var(--accent-hover);--graph-muted: var(--text-muted);--graph-vuln-high: var(--red);--graph-vuln-medium: var(--amber)}:root.light{--bg-primary: #f5f7fa;--bg-secondary: #e8ecf2;--bg-card: rgba(255, 255, 255, .98);--bg-card-hover: rgba(248, 250, 252, 1);--text-primary: #0f172a;--text-secondary: #475569;--text-muted: #64748b;--border-color: rgba(100, 116, 139, .18);--border-color-strong: rgba(100, 116, 139, .3);--accent: #0891b2;--accent-hover: #06b6d4;--accent-subtle: rgba(8, 145, 178, .1);--title-gradient: linear-gradient(135deg, #0891b2 0%, #059669 100%);--graph-highlight: var(--accent);--graph-muted: var(--text-secondary)}[data-theme=light]{--graph-highlight: var(--accent);--graph-muted: var(--text-secondary)}html{scroll-behavior:smooth}@media(prefers-reduced-motion:reduce){html,*,*:before,*:after{scroll-behavior:auto;animation-duration:0s!important;animation-iteration-count:1!important;transition:none!important;transform:none!important}}body{font-family:var(--font-stack);background:var(--bg-primary);color:var(--text-primary);margin:0;padding:0;line-height:1.5;transition:background var(--transition),color var(--transition)}.top-header{padding:28px 24px 20px;max-width:1400px;margin:0 auto}.header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:24px}.header-content{display:flex;align-items:flex-start;gap:18px}.logo,.logo-wrapper{display:block;width:6rem;height:6rem;flex-shrink:0}.logo svg{width:100%;height:100%}.header-text h1{margin:0;font-size:26px;font-weight:700;background:var(--title-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.02em}.header-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;font-size:12px}.meta-item{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-secondary)}.meta-item strong{color:var(--text-primary);font-family:var(--font-mono);font-size:11px;font-weight:500}.meta-label{color:var(--text-muted);font-size:10px;text-transform:uppercase;letter-spacing:.3px}.header-disclaimer{display:block;width:100%;font-size:10px;color:var(--text-muted);margin-top:6px;padding-left:2px}.cta-section{flex-shrink:0;text-align:right;max-width:280px;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:8px}.cta-link{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;background:var(--accent);color:#fff;text-decoration:none;border-radius:var(--radius);font-size:13px;font-weight:600;transition:all var(--transition);box-shadow:0 2px 8px #06b6d440;margin-bottom:2px}.cta-link:hover{background:var(--accent-hover);transform:translateY(-1px);box-shadow:0 4px 12px #06b6d459}.cta-text{display:block;font-size:11px;color:var(--text-muted);margin:0;text-decoration:none;padding:2px 6px;border-radius:4px;border:1px solid var(--border-color);background:var(--bg-secondary)}.cta-url,.cta-url:visited{display:block;font-size:11px;color:var(--text-muted);margin:0;text-decoration:none}.cta-url:hover{text-decoration:underline}.cta-arrow{font-size:14px;transition:transform var(--transition)}.cta-link:hover .cta-arrow{transform:translate(2px)}.filter-bar{position:sticky;top:0;z-index:100;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:12px 24px 4px;transition:background var(--transition),border-color var(--transition)}.filter-bar-inner{max-width:1360px;margin:0 auto}.filter-row{display:grid;grid-template-columns:minmax(300px,400px) minmax(0,1fr);align-items:center;gap:4px 16px}.filter-top-row{display:flex;align-items:center;gap:10px;min-width:0}.filter-top-row .search-wrapper{flex:1;min-width:0;max-width:none}.view-switch{display:inline-flex;align-items:center;gap:4px;padding:2px;border:1px solid var(--border-color);border-radius:999px;background:var(--bg-primary)}.view-switch-btn{border:none;background:transparent;color:var(--text-secondary);border-radius:999px;padding:6px 12px;font-size:12px;cursor:pointer;transition:color var(--transition),background var(--transition);white-space:nowrap}.view-switch-btn:hover{color:var(--text-primary)}.view-switch-btn.active{color:var(--text-primary);background:var(--accent-subtle)}.filter-controls{display:block;min-width:0}.filter-controls-row{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.filters-toggle{display:none;padding:6px 12px;border:1px solid var(--border-color);border-radius:var(--radius);background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;align-items:center;gap:6px;transition:all var(--transition);white-space:nowrap}.filters-toggle:hover{border-color:var(--accent);color:var(--accent)}.filters-toggle .chevron{transition:transform var(--transition)}.filters-toggle.open .chevron{transform:rotate(180deg)}.filter-row>.license-filter-panel-row,.filter-row>.column-headers-section{grid-column:1 / -1;width:100%}.mobile-only,.sort-wrapper.mobile-only{display:none}.filter-group{display:flex;align-items:center;gap:6px}.filter-label{font-size:12px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.search-wrapper{position:relative;flex:1;min-width:180px;max-width:280px}.search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}input[type=search]{width:100%;padding:8px 12px 8px 32px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-primary);font-size:14px;transition:border-color var(--transition),background var(--transition)}input[type=search]:focus{outline:none;border-color:var(--accent)}input[type=search]::placeholder{color:var(--text-muted)}select{padding:8px 28px 8px 10px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-primary);font-size:13px;cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;transition:border-color var(--transition),background var(--transition)}select:focus{outline:none;border-color:var(--accent)}.sort-wrapper{display:flex;align-items:center;gap:4px}.sort-wrapper select{margin-left:auto}.sort-direction-btn{padding:8px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-secondary);cursor:pointer;font-size:14px;line-height:1;transition:all var(--transition)}.sort-direction-btn:hover{border-color:var(--accent);color:var(--accent)}.checkbox-filter{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary);cursor:pointer}.checkbox-filter input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}.theme-toggle{margin-left:auto;display:flex;align-items:center;gap:8px}.theme-toggle-label{font-size:12px;color:var(--text-muted)}.theme-switch{position:relative;width:44px;height:24px;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:12px;cursor:pointer;transition:background var(--transition),border-color var(--transition)}.theme-switch:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background:var(--text-secondary);border-radius:50%;transition:transform var(--transition),background var(--transition)}.theme-switch.light:after{transform:translate(20px);background:var(--accent)}.license-filter-toggle{padding:6px 12px;border:1px solid var(--border-color);border-radius:var(--radius);background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all var(--transition)}.license-filter-toggle:hover{border-color:var(--accent);color:var(--accent)}.license-filter-toggle .chevron{transition:transform var(--transition)}.license-filter-toggle.open .chevron{transform:rotate(180deg)}.license-filter-panel-row{min-width:0}.license-filter-panel{max-height:0;overflow:hidden;transition:max-height .3s ease-out;background:var(--bg-secondary);border-bottom:1px solid transparent}.license-filter-panel.open{max-height:220px;border-bottom-color:var(--border-color)}.license-filter-inner{max-width:100%;margin:0;padding:12px 0}.license-filter-header{display:flex;align-items:center;gap:12px;margin-bottom:8px}.license-filter-title{font-size:12px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.license-quick-actions{display:flex;gap:8px}.quick-action-btn{padding:4px 10px;font-size:11px;border:1px solid var(--border-color);border-radius:4px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all var(--transition)}.quick-action-btn:hover{border-color:var(--accent);color:var(--accent)}.license-groups{display:flex;flex-wrap:wrap;gap:16px}.license-group-checkbox{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary);cursor:pointer}.license-group-checkbox input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}.license-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.license-dot.permissive{background:var(--license-permissive)}.license-dot.weak-copyleft{background:var(--license-weak-copyleft)}.license-dot.strong-copyleft{background:var(--license-strong-copyleft)}.license-dot.unknown{background:var(--license-unknown)}.tool-errors{max-width:1400px;margin:16px auto;padding:12px 16px;background:var(--red-bg);border:1px solid var(--red);border-radius:var(--radius);color:var(--red)}.tool-errors:empty{display:none}.tool-errors strong{display:block;margin-bottom:8px}.main-content{max-width:1400px;margin:0 auto;padding:8px 24px 48px}.view-panel{display:none}.view-panel.active{display:block}.graph-mode .filter-bar,.graph-mode .top-header,.graph-mode .results-summary,.graph-mode .report-footer{display:none}.graph-mode .main-content{max-width:none;padding:24px}.graph-workspace-label{color:var(--text-muted);font-size:10px;text-transform:uppercase;letter-spacing:.4px;-webkit-user-select:none;user-select:none}.graph-workspace-select{min-width:200px;max-width:240px}select.graph-workspace-select{background-color:#ffffff0d;border:1px solid rgba(100,116,139,.25);color:var(--text-primary);transition:all var(--transition)}select.graph-workspace-select:hover{background-color:#ffffff1a;border-color:#64748b66}select.graph-workspace-select:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-subtle)}[data-theme=light] select.graph-workspace-select{background-color:#00000008;border-color:#64748b33}[data-theme=light] select.graph-workspace-select:hover{background-color:#0000000f}.graph-canvas-shell{position:relative;width:100%;height:74vh;min-height:420px;max-height:980px;border:1px solid var(--border-color);border-radius:var(--radius-lg);background:radial-gradient(circle at 15% 20%,var(--accent-subtle),transparent 35%),radial-gradient(circle at 80% 80%,var(--accent-subtle),transparent 42%),var(--bg-card);overflow:hidden}.graph-mode .graph-canvas-shell{height:calc(100dvh - 48px);min-height:520px;max-height:none}.graph-overlay{position:absolute;z-index:8;pointer-events:auto;display:flex;align-items:center;gap:8px;padding:8px;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);border-radius:12px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d}.graph-key{padding:6px 10px;display:flex;flex-direction:row;align-items:center;gap:12px;max-width:100%;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);border-radius:8px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d}.graph-key-items{display:flex;align-items:center;gap:12px;flex-wrap:wrap;min-width:0}.graph-key-item{display:inline-flex;align-items:center;gap:6px;color:var(--text-secondary);font-size:12px;line-height:1.1;white-space:nowrap}.graph-key-dot{width:10px;height:10px;border-radius:50%;display:inline-block;box-shadow:0 0 0 1px #ffffff1f}.graph-key-dot.dependency{background:var(--graph-direct-runtime)}.graph-key-dot.dev-dependency{background:var(--graph-direct-dev)}.graph-key-dot.sub-dependency{background:var(--graph-transitive)}[data-theme=light] .graph-key,[data-theme=light] .graph-overlay{background:#ffffffb3;border-color:#64748b26;box-shadow:0 4px 24px #0000000f,inset 0 1px #ffffff80}.graph-overlay.hidden,.graph-overlay-left.hidden{display:none}.graph-overlay-left{padding:4px 4px 4px 8px;flex-direction:row;align-items:center;gap:12px;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);border-radius:8px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d}[data-theme=light] .graph-overlay-left{background:#ffffffb3;border-color:#64748b26;box-shadow:0 4px 24px #0000000f,inset 0 1px #ffffff80}.graph-overlay-right{top:12px;right:12px}.graph-overlay-top{align-items:center;position:absolute;top:8px;left:8px;display:flex;flex-wrap:wrap;gap:10px;max-width:min(calc(100% - 16px),calc(100% - clamp(56px,18vw,160px)))}.graph-back-btn{gap:8px;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d;top:12px;left:12px;color:var(--text-primary);border-radius:8px;padding:7px 12px;font-size:12px;cursor:pointer;transition:transform var(--transition),background var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition);-webkit-user-select:none;user-select:none}.graph-back-btn:hover{background:#ffffff1a;border-color:#64748b66;color:var(--text-primary);transform:translateY(-1px);box-shadow:0 4px 12px #0003}[data-theme=light] .graph-back-btn:hover{background:#0000000d;box-shadow:0 4px 12px #00000014}[data-theme=light] .graph-back-btn{background:#ffffffb3;border-color:#64748b26;box-shadow:0 4px 24px #0000000f,inset 0 1px #ffffff80}.graph-controls{flex-direction:column;align-items:center;gap:8px;padding:8px}.zoom-controls{display:grid;grid-template-columns:repeat(2,52px);gap:6px}.zoom-controls>.graph-control-btn{font-size:18px;width:100%}.dpad{display:grid;grid-template-columns:34px 34px 34px;grid-template-rows:34px 34px 34px;grid-template-areas:". up ." "left . right" ". down .";gap:2px}.dpad .up{grid-area:up}.dpad .left{grid-area:left}.dpad .right{grid-area:right}.dpad .down{grid-area:down}.center-spacer{grid-column:2;grid-row:2;width:32px;height:32px;border:none;background:transparent}.graph-control-btn{border:1px solid rgba(100,116,139,.25);background:#ffffff0d;color:var(--text-primary);font-size:12px;width:34px;height:30px;border-radius:6px;cursor:pointer;line-height:1;transition:transform var(--transition),background var(--transition),border-color var(--transition),box-shadow var(--transition),color var(--transition)}.graph-control-btn:hover{background:#ffffff1f;border-color:#64748b66;transform:translateY(-1px);box-shadow:0 3px 10px #0003}[data-theme=light] .graph-control-btn{background:#00000008;border-color:#64748b26}[data-theme=light] .graph-control-btn:hover{background:#00000014;border-color:#64748b4d;box-shadow:0 3px 10px #00000014}.reset-btn{width:112px;text-transform:lowercase;letter-spacing:.2px}.graph-popover{position:absolute;z-index:9;min-width:220px;max-width:min(320px,calc(100% - 24px));padding:12px 14px;border:1px solid var(--border-color-strong);background:#0f172ad9;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-radius:12px;box-shadow:0 12px 40px #0006,inset 0 1px #ffffff1a;pointer-events:auto}[data-theme=light] .graph-popover{background:#ffffffd9;box-shadow:0 12px 40px #0000001f,inset 0 1px #fff9}.graph-popover[hidden]{display:none}.graph-popover-name{font-family:var(--font-mono);font-size:13px;color:var(--text-primary);font-weight:600;margin-bottom:4px}.graph-popover-meta{font-size:12px;color:var(--text-secondary);margin-bottom:3px}.graph-popover-action{margin-top:8px;width:100%;border:1px solid var(--border-color);border-radius:6px;background:var(--bg-primary);color:var(--text-primary);font-size:12px;padding:7px 8px;cursor:pointer}.graph-popover-action:hover{border-color:var(--accent);color:var(--accent)}#graph-canvas{width:100%;height:100%;display:block;cursor:grab}#graph-canvas.is-panning{cursor:grabbing}.dep-list-highlight{animation:dep-list-highlight 2s ease-out}@keyframes dep-list-highlight{0%{box-shadow:0 0 0 0 var(--accent-subtle);border-color:var(--accent)}to{box-shadow:0 0 0 18px transparent;border-color:var(--border-color)}}.report-footer{max-width:1400px;margin:0 auto;padding:0 24px 40px;color:var(--text-secondary);font-size:12px}.report-footer p{margin:8px 0 0}.report-footer.hidden{display:none}.column-headers-section{max-width:1376px;margin:0 auto;display:flex;align-items:center;padding:12px 0 8px 14px}.package-header-wrapper{display:flex;flex-direction:row;justify-content:space-between;gap:2px;flex:1;min-width:0;padding-right:1rem}.results-summary{font-size:12px;color:var(--text-secondary);white-space:nowrap}.results-summary strong{color:var(--text-primary)}.package-header{align-self:flex-start;padding:4px 8px 4px 0}#column-headers-container{margin-left:auto;flex-shrink:0;width:60%}.column-headers{display:grid;grid-template-columns:repeat(5,1fr);width:100%}.column-header{display:flex;align-items:center;gap:4px;border:none;background:transparent;font-size:10px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;cursor:pointer;padding:4px 8px 4px 10px;border-left:1px solid var(--border-color);transition:color var(--transition);white-space:nowrap;line-height:1.1;overflow:hidden}.column-header-no-border{border-left:none}.column-header:hover{color:var(--text-primary)}.column-header.sorted{color:var(--accent)}.column-header-label{flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.sort-indicator{font-size:9px;opacity:.8}.column-header:not(.sorted) .sort-indicator{visibility:hidden}.dependency-grid{display:flex;flex-direction:column;gap:8px}.dep-card{background:var(--bg-card);border:1px solid var(--border-color);border-radius:var(--radius-lg);overflow:hidden;transition:border-color var(--transition)}.dep-card:hover{border-color:var(--border-color-strong)}.dep-card[data-risk=red]{border-left:3px solid var(--red)}.dep-card[data-risk=amber]{border-left:3px solid var(--amber)}.dep-card[data-risk=green]{border-left:3px solid var(--green)}.dep-summary{display:flex;align-items:center;gap:10px;padding:0 0 0 12px;cursor:pointer;list-style:none;transition:background var(--transition)}.dep-summary:hover{background:var(--bg-card-hover)}.dep-summary::-webkit-details-marker{display:none}.expand-icon{width:16px;height:16px;flex-shrink:0;display:inline-block;color:var(--text-muted);transition:transform var(--transition);background:currentColor;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") no-repeat center / contain;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") no-repeat center / contain}details[open]>summary .expand-icon{transform:rotate(90deg)}.dep-name{font-family:var(--font-mono);font-size:14px;font-weight:600;color:var(--text-primary);padding:8px 0}.dep-version{font-weight:400;color:var(--text-secondary)}.dep-indicators{display:grid;grid-template-columns:repeat(5,1fr);margin-left:auto;flex-shrink:0;width:60%}.badge-card{display:flex;flex-direction:column;justify-content:center;min-height:38px;padding:4px 8px 4px 10px;background:var(--bg-primary);border-left:1px solid var(--border-color);position:relative;overflow:hidden}.badge-card:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--gray)}.badge-card.green:before{background:var(--green)}.badge-card.amber:before{background:var(--amber)}.badge-card.red:before{background:var(--red)}.badge-card.gray:before{background:var(--gray)}.badge-label{font-size:8px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;line-height:1.1;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.badge-value{font-size:11px;font-weight:500;color:var(--text-primary);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dep-details{padding:0 16px 16px;border-top:1px solid var(--border-color);animation:slideDown .2s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.package-links{display:flex;flex-wrap:wrap;gap:8px;padding:12px 0;margin-bottom:4px;border-bottom:1px solid var(--border-color)}.package-link{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--bg-hover);border:1px solid var(--border-color);border-radius:var(--radius-md);color:var(--text-primary);text-decoration:none;font-size:13px;font-weight:500;transition:all var(--transition)}.package-link:hover{background:var(--accent);border-color:var(--accent);color:#fff}.package-link svg{width:14px;height:14px;flex-shrink:0}.section,.section:first-child{margin-top:16px}.section-header{display:flex;align-items:center;gap:8px;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--border-color)}.section-title{font-size:13px;font-weight:600;color:var(--text-primary);text-transform:uppercase;letter-spacing:.5px}.section-desc{font-size:11px;color:var(--text-muted)}.kv-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.kv-grid-tight{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.kv-item{display:flex;flex-direction:column;gap:2px}.kv-label{font-size:12px;font-weight:500;color:var(--text-muted)}.kv-value{font-size:14px;color:var(--text-primary);overflow-wrap:anywhere;word-break:break-word}.kv-inline-link{color:var(--accent);text-decoration:none;font-size:12px;margin-left:6px;white-space:nowrap;display:inline-flex;align-items:center;gap:3px;text-underline-offset:2px}.kv-inline-link:hover{text-decoration:underline}.kv-inline-link-icon{width:11px;height:11px;flex-shrink:0}.kv-inline-link:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:3px}.risk-value{display:inline-flex;align-items:center;gap:6px}.risk-dot{width:8px;height:8px;border-radius:999px;background:var(--gray);flex-shrink:0}.risk-dot.green{background:var(--green)}.risk-dot.amber{background:var(--amber)}.risk-dot.red{background:var(--red)}.kv-hint{font-size:11px;color:var(--text-muted);font-style:italic}.micro-summary{display:grid;gap:6px;padding:6px 0 2px}.micro-line{font-size:13px;color:var(--text-primary)}.micro-sublist{margin-top:8px}.micro-subtitle{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:4px}.section-block{margin-top:12px}.block-title{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px}.section-note{font-size:12px;color:var(--text-secondary);margin:6px 0 12px}.subsection{padding:12px 0;border-top:1px solid var(--border-color)}.subsection:first-child{border-top:none;padding-top:0}.subsection-header{display:flex;align-items:baseline;gap:8px;margin-bottom:8px}.subsection-title{font-size:12px;font-weight:600;color:var(--text-primary);text-transform:uppercase;letter-spacing:.4px}.subsection-desc{font-size:11px;color:var(--text-muted)}.subsection.warning .subsection-title{color:var(--red)}.detail-list{margin-top:12px}.detail-title{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px}.detail-items{list-style:none;padding:0;margin:0;display:grid;gap:6px}.detail-items.mono .detail-item{font-family:var(--font-mono)}.detail-item{font-size:12px;color:var(--text-secondary);overflow-wrap:anywhere;word-break:break-word}.detail-item.muted{color:var(--text-muted)}.declared-deps{display:grid;gap:8px}.declared-summary{font-size:12px;color:var(--text-secondary);margin:4px 0 8px}.declared-group{border:1px solid var(--border-color);border-radius:8px;background:var(--bg-primary);padding:8px 10px}.declared-group-summary{font-size:12px;font-weight:600;color:var(--text-primary);cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px}.declared-group-summary::-webkit-details-marker{display:none}.declared-count{font-size:11px;color:var(--text-muted);font-weight:500}.declared-group-title{display:inline-flex;align-items:baseline;gap:6px}.declared-table{display:grid;gap:6px;margin-top:8px}.declared-row{display:grid;grid-template-columns:minmax(160px,1.3fr) minmax(120px,1fr) auto;gap:10px;align-items:center;padding:8px 10px;border:1px solid var(--border-color);border-radius:6px;background:var(--bg-primary)}.declared-name{font-size:12px;font-family:var(--font-mono);color:var(--text-primary);display:flex;align-items:center;gap:6px;overflow-wrap:anywhere}.declared-range{font-size:12px;color:var(--text-secondary);font-family:var(--font-mono);overflow-wrap:anywhere}.status-pill{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;text-decoration:none;border:1px solid transparent}.status-pill.installed{color:var(--green);border-color:var(--green);background:var(--green-bg)}.status-pill.missing{color:var(--text-muted);border-color:var(--border-color-strong);background:var(--gray-bg)}.bullet-list{margin:6px 0 0;padding-left:18px;color:var(--text-secondary)}.bullet-list li{margin-bottom:6px}.subtle-divider{height:1px;background:var(--border-color);margin:12px 0}.package-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.package-tag{padding:2px 8px;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:4px;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary)}.package-list-toggle{font-size:11px;color:var(--accent);background:none;border:none;cursor:pointer;padding:2px 4px}.package-list-toggle:hover{text-decoration:underline}.vuln-table{width:100%;border-collapse:collapse;font-size:13px}.vuln-table th,.vuln-table td{text-align:left;padding:8px 12px;border-bottom:1px solid var(--border-color);vertical-align:top;overflow-wrap:anywhere;word-break:break-word}.vuln-table th{font-weight:500;color:var(--text-muted);font-size:11px;text-transform:uppercase;letter-spacing:.5px}.vuln-table tr[data-severity=critical],.vuln-table tr[data-severity=high]{background:var(--red-bg)}.vuln-table tr[data-severity=moderate]{background:var(--amber-bg)}.vuln-table a{color:var(--accent);text-decoration:none}.vuln-table a:hover{text-decoration:underline}.no-vulns{font-size:13px;color:var(--text-secondary);padding:8px 0}.raw-data-toggle{margin-top:16px}.raw-data-toggle summary{font-size:12px;color:var(--text-muted);cursor:pointer;padding:8px 0;display:flex;align-items:center;gap:8px;list-style:none}.raw-data-toggle summary::-webkit-details-marker{display:none}.raw-data-pane{margin-top:8px;position:relative;display:flex;flex-direction:column;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:var(--radius);max-height:300px;overflow:auto}.raw-data-pane pre{margin:0;padding:12px 12px 44px;background:transparent;border:none;font-family:var(--font-mono);font-size:11px;color:var(--text-secondary);white-space:pre;overflow:visible}.copy-json-btn{position:sticky;bottom:8px;align-self:flex-end;margin:0 8px 8px;padding:6px 10px;border:1px solid var(--border-color);border-radius:4px;background:var(--bg-card);color:var(--text-primary);font-size:11px;cursor:pointer;transition:all var(--transition)}.raw-data-toggle:not([open]) .copy-json-btn{display:none}.copy-json-btn:hover{border-color:var(--accent);color:var(--accent)}.copy-json-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.copy-json-btn.copied{border-color:var(--green);color:var(--green)}.dep-loading{padding:2rem 0}.dep-loading-bar{position:relative;height:.25rem;background:var(--border-color);overflow:hidden;border-radius:999px}.dep-loading-bar:after{content:"";position:absolute;top:0;left:-40%;width:40%;height:100%;background:var(--accent);animation:dep-loading 1.2s ease-in-out infinite}@keyframes dep-loading{0%{transform:translate(0)}to{transform:translate(250%)}}.package-tag-link{text-decoration:none;color:var(--text-secondary);transition:all var(--transition)}.package-tag-link:hover{border-color:var(--accent);color:var(--accent)}.package-tag-link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.empty-state{text-align:center;padding:48px 24px;color:var(--text-muted)}.empty-state-icon{font-size:48px;margin-bottom:12px}.empty-state-text{font-size:16px}@media(max-width:1180px)and (min-width:769px){.filter-row{grid-template-columns:1fr}.filter-top-row{max-width:560px}}@media(max-width:768px){.top-header{padding:20px 16px}.header-row{flex-direction:column;align-items:flex-start;gap:16px}.header-content{gap:12px}.logo,.logo-wrapper{width:48px;height:48px}.header-text h1{font-size:22px}.header-meta{gap:6px}.meta-item{padding:3px 8px;font-size:11px}.cta-section{width:100%;max-width:none;text-align:left}.cta-benefits{display:none}.filter-bar{padding:10px 16px}.filter-row{display:block}.filter-top-row{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0;flex-wrap:wrap}.search-wrapper{max-width:none;flex:1 1 100%}.view-switch{order:2}.view-switch-btn{padding:6px 10px}.filters-toggle{display:inline-flex;flex-shrink:0}.filter-controls{max-height:0;opacity:0;overflow:hidden;transform:translateY(-8px);pointer-events:none;transition:max-height .3s ease-out,opacity .25s ease-out,transform .25s ease-out,margin-top .25s ease-out;margin-top:0}.filter-controls.open{max-height:900px;opacity:1;transform:translateY(0);pointer-events:auto;margin-top:10px}.license-filter-panel-row{max-height:0;opacity:0;overflow:hidden;transform:translateY(-8px);pointer-events:none;transition:max-height .3s ease-out,opacity .25s ease-out,transform .25s ease-out,margin-top .25s ease-out;margin-top:0}.filter-controls.open+.license-filter-panel-row{max-height:560px;opacity:1;transform:translateY(0);pointer-events:auto;margin-top:8px}.filter-controls-row{display:flex;flex-direction:column;align-items:stretch;gap:10px}.filter-group{display:flex;justify-content:space-between;align-items:center}.filter-group select{flex:1;max-width:200px}.mobile-only,.sort-wrapper.mobile-only{display:flex!important}.theme-toggle{order:100;margin-left:auto}.license-filter-toggle{display:none}.license-filter-panel,.license-filter-panel.open{max-height:none;border-bottom-color:var(--border-color)}.license-filter-inner{padding:12px 0 10px}#column-headers-container,.column-headers,.package-header{display:none}.column-headers-section{max-height:0;opacity:0;overflow:hidden;transform:translateY(-6px);pointer-events:none;transition:max-height .3s ease-out,opacity .25s ease-out,transform .25s ease-out,margin-top .25s ease-out,padding .25s ease-out;margin-top:0;padding:0 16px}.filter-controls.open+.license-filter-panel-row+.column-headers-section{max-height:120px;opacity:1;transform:translateY(0);pointer-events:auto;margin-top:8px;padding:8px 16px}.package-header-wrapper{flex-direction:row}.main-content{padding:12px 16px 32px}.graph-workspace-select{min-width:170px}.graph-overlay{padding:6px}.graph-canvas-shell{height:62vh;min-height:340px}.graph-overlay-right{right:8px;top:8px}.graph-overlay-left{left:8px;top:48px}.graph-key{padding:6px 8px;gap:8px}.graph-key-items{gap:8px}.graph-key-item{font-size:11px}.graph-back-btn{left:8px;top:8px}.graph-mode .main-content{padding:8px}.graph-mode .graph-canvas-shell{height:calc(100dvh - 16px);min-height:420px}.report-footer{padding:0 16px 32px}.vuln-table thead{display:none}.vuln-table tr{display:block;border-bottom:1px solid var(--border-color)}.vuln-table td{display:flex;justify-content:space-between;gap:12px;padding:6px 8px}.vuln-table td:before{content:attr(data-label);font-size:10px;text-transform:uppercase;letter-spacing:.4px;color:var(--text-muted);min-width:120px}.dep-summary{flex-wrap:wrap;padding:8px 12px}.dep-name{font-size:13px}.dep-indicators{display:flex;flex-wrap:wrap;min-width:auto;width:100%;margin-left:0;margin-top:6px;padding-top:6px;border-top:1px solid var(--border-color);gap:4px}.badge-card{flex:1 1 calc(50% - 4px);min-width:0}.badge-value{font-size:10px}.badge-label{clip:none;clip-path:none;height:auto;width:auto;margin:0;overflow:auto;padding:0;position:relative;font-size:7px}.declared-row{grid-template-columns:1fr;gap:6px}}@media(max-width:480px){.header-text h1{font-size:20px}.meta-item{font-size:10px;padding:2px 6px}.cta-link{width:100%;justify-content:center;padding:12px 16px}.badge-card{flex:1 1 100%}}
11
+ exports.CSS_CONTENT = `*,*:before,*:after{box-sizing:border-box}:root{--bg-primary: #0c1222;--bg-secondary: #151d2e;--bg-card: rgba(21, 29, 46, .95);--bg-card-hover: rgba(30, 41, 59, .95);--text-primary: #e8edf5;--text-secondary: #8b99b0;--text-muted: #5c6b82;--border-color: rgba(99, 120, 150, .2);--border-color-strong: rgba(99, 120, 150, .35);--accent: #06b6d4;--accent-hover: #22d3ee;--accent-subtle: rgba(6, 182, 212, .15);--title-gradient: linear-gradient(135deg, #06b6d4 0%, #10b981 100%);--green: #10b981;--green-bg: rgba(16, 185, 129, .15);--amber: #f59e0b;--amber-bg: rgba(245, 158, 11, .15);--red: #ef4444;--red-bg: rgba(239, 68, 68, .15);--gray: #64748b;--gray-bg: rgba(100, 116, 139, .15);--license-permissive: #10b981;--license-weak-copyleft: #f59e0b;--license-strong-copyleft: #ef4444;--license-unknown: #64748b;--font-stack: -apple-system, "BlinkMacSystemFont", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", sans-serif;--font-mono: ui-monospace, "SFMono-Regular", "SF Mono", "Menlo", "Consolas", monospace;--transition: .2s ease;--radius: 8px;--radius-lg: 12px;--graph-direct-runtime: var(--green);--graph-direct-dev: var(--amber);--graph-transitive: var(--accent);--graph-edge: var(--border-color-strong);--graph-highlight: var(--accent-hover);--graph-muted: var(--text-muted);--graph-vuln-high: var(--red);--graph-vuln-medium: var(--amber)}:root.light{--bg-primary: #f5f7fa;--bg-secondary: #e8ecf2;--bg-card: rgba(255, 255, 255, .98);--bg-card-hover: rgba(248, 250, 252, 1);--text-primary: #0f172a;--text-secondary: #475569;--text-muted: #64748b;--border-color: rgba(100, 116, 139, .18);--border-color-strong: rgba(100, 116, 139, .3);--accent: #0891b2;--accent-hover: #06b6d4;--accent-subtle: rgba(8, 145, 178, .1);--title-gradient: linear-gradient(135deg, #0891b2 0%, #059669 100%);--graph-highlight: var(--accent);--graph-muted: var(--text-secondary)}[data-theme=light]{--graph-highlight: var(--accent);--graph-muted: var(--text-secondary)}html{scroll-behavior:smooth}@media(prefers-reduced-motion:reduce){html,*,*:before,*:after{scroll-behavior:auto;animation-duration:0s!important;animation-iteration-count:1!important;transition:none!important;transform:none!important}}body{font-family:var(--font-stack);background:var(--bg-primary);color:var(--text-primary);margin:0;padding:0;line-height:1.5;transition:background var(--transition),color var(--transition)}.top-header{padding:28px 24px 20px;max-width:1400px;margin:0 auto}.header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:24px}.header-content{display:flex;align-items:flex-start;gap:18px}.logo,.logo-wrapper{display:block;width:6rem;height:6rem;flex-shrink:0}.logo svg{width:100%;height:100%}.header-text h1{margin:0;font-size:26px;font-weight:700;background:var(--title-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;letter-spacing:-.02em}.header-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;font-size:12px}.meta-item{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-secondary)}.meta-item strong{color:var(--text-primary);font-family:var(--font-mono);font-size:11px;font-weight:500}.meta-label{color:var(--text-muted);font-size:10px;text-transform:uppercase;letter-spacing:.3px}.header-disclaimer{display:block;width:100%;font-size:10px;color:var(--text-muted);margin-top:6px;padding-left:2px}.cta-section{flex-shrink:0;text-align:right;max-width:280px;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:8px}.cta-link{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;background:var(--accent);color:#fff;text-decoration:none;border-radius:var(--radius);font-size:13px;font-weight:600;transition:all var(--transition);box-shadow:0 2px 8px #06b6d440;margin-bottom:2px}.cta-link:hover{background:var(--accent-hover);transform:translateY(-1px);box-shadow:0 4px 12px #06b6d459}.cta-text{display:block;font-size:11px;color:var(--text-muted);margin:0;text-decoration:none;padding:2px 6px;border-radius:4px;border:1px solid var(--border-color);background:var(--bg-secondary)}.cta-url,.cta-url:visited{display:block;font-size:11px;color:var(--text-muted);margin:0;text-decoration:none}.cta-url:hover{text-decoration:underline}.cta-arrow{font-size:14px;transition:transform var(--transition)}.cta-link:hover .cta-arrow{transform:translate(2px)}.filter-bar{position:sticky;top:0;z-index:100;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:12px 24px 4px;transition:background var(--transition),border-color var(--transition)}.filter-bar-inner{max-width:1360px;margin:0 auto}.filter-row{display:grid;grid-template-columns:minmax(300px,400px) minmax(0,1fr);align-items:center;gap:4px 16px}.filter-top-row{display:flex;align-items:center;gap:10px;min-width:0}.filter-top-row .search-wrapper{flex:1;min-width:0;max-width:none}.view-switch{display:inline-flex;align-items:center;gap:4px;padding:2px;border:1px solid var(--border-color);border-radius:999px;background:var(--bg-primary)}.view-switch-btn{border:none;background:transparent;color:var(--text-secondary);border-radius:999px;padding:6px 12px;font-size:12px;cursor:pointer;transition:color var(--transition),background var(--transition);white-space:nowrap}.view-switch-btn:hover{color:var(--text-primary)}.view-switch-btn.active{color:var(--text-primary);background:var(--accent-subtle)}.filter-controls{display:block;min-width:0}.filter-controls-row{display:flex;align-items:center;flex-wrap:wrap;gap:12px}.filters-toggle{display:none;padding:6px 12px;border:1px solid var(--border-color);border-radius:var(--radius);background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;align-items:center;gap:6px;transition:all var(--transition);white-space:nowrap}.filters-toggle:hover{border-color:var(--accent);color:var(--accent)}.filters-toggle .chevron{transition:transform var(--transition)}.filters-toggle.open .chevron{transform:rotate(180deg)}.filter-row>.license-filter-panel-row,.filter-row>.column-headers-section{grid-column:1 / -1;width:100%}.mobile-only,.sort-wrapper.mobile-only{display:none}.filter-group{display:flex;align-items:center;gap:6px}.filter-label{font-size:12px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.search-wrapper{position:relative;flex:1;min-width:180px;max-width:280px}.search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}input[type=search]{width:100%;padding:8px 12px 8px 32px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-primary);font-size:14px;transition:border-color var(--transition),background var(--transition)}input[type=search]:focus{outline:none;border-color:var(--accent)}input[type=search]::placeholder{color:var(--text-muted)}select{padding:8px 28px 8px 10px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-primary);font-size:13px;cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;transition:border-color var(--transition),background var(--transition)}select:focus{outline:none;border-color:var(--accent)}.sort-wrapper{display:flex;align-items:center;gap:4px}.sort-wrapper select{margin-left:auto}.sort-direction-btn{padding:8px;border:1px solid var(--border-color);border-radius:var(--radius);background:var(--bg-primary);color:var(--text-secondary);cursor:pointer;font-size:14px;line-height:1;transition:all var(--transition)}.sort-direction-btn:hover{border-color:var(--accent);color:var(--accent)}.checkbox-filter{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary);cursor:pointer}.checkbox-filter input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}.theme-toggle{margin-left:auto;display:flex;align-items:center;gap:8px}.theme-toggle-label{font-size:12px;color:var(--text-muted)}.theme-switch{position:relative;width:44px;height:24px;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:12px;cursor:pointer;transition:background var(--transition),border-color var(--transition)}.theme-switch:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background:var(--text-secondary);border-radius:50%;transition:transform var(--transition),background var(--transition)}.theme-switch.light:after{transform:translate(20px);background:var(--accent)}.license-filter-toggle{padding:6px 12px;border:1px solid var(--border-color);border-radius:var(--radius);background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all var(--transition)}.license-filter-toggle:hover{border-color:var(--accent);color:var(--accent)}.license-filter-toggle .chevron{transition:transform var(--transition)}.license-filter-toggle.open .chevron{transform:rotate(180deg)}.license-filter-panel-row{min-width:0}.license-filter-panel{max-height:0;overflow:hidden;transition:max-height .3s ease-out;background:var(--bg-secondary);border-bottom:1px solid transparent}.license-filter-panel.open{max-height:220px;border-bottom-color:var(--border-color)}.license-filter-inner{max-width:100%;margin:0;padding:12px 0}.license-filter-header{display:flex;align-items:center;gap:12px;margin-bottom:8px}.license-filter-title{font-size:12px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.license-quick-actions{display:flex;gap:8px}.quick-action-btn{padding:4px 10px;font-size:11px;border:1px solid var(--border-color);border-radius:4px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:all var(--transition)}.quick-action-btn:hover{border-color:var(--accent);color:var(--accent)}.license-groups{display:flex;flex-wrap:wrap;gap:16px}.license-group-checkbox{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary);cursor:pointer}.license-group-checkbox input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}.license-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.license-dot.permissive{background:var(--license-permissive)}.license-dot.weak-copyleft{background:var(--license-weak-copyleft)}.license-dot.strong-copyleft{background:var(--license-strong-copyleft)}.license-dot.unknown{background:var(--license-unknown)}.tool-errors{max-width:1400px;margin:16px auto;padding:12px 16px;background:var(--red-bg);border:1px solid var(--red);border-radius:var(--radius);color:var(--red)}.tool-errors:empty{display:none}.tool-errors strong{display:block;margin-bottom:8px}.main-content{max-width:1400px;margin:0 auto;padding:8px 24px 48px}.view-panel{display:none}.view-panel.active{display:block}.graph-mode .filter-bar,.graph-mode .top-header,.graph-mode .results-summary,.graph-mode .report-footer{display:none}.graph-mode .main-content{max-width:none;padding:24px}.graph-workspace-label{color:var(--text-muted);font-size:10px;text-transform:uppercase;letter-spacing:.4px;-webkit-user-select:none;user-select:none}.graph-workspace-select{min-width:200px;max-width:240px}select.graph-workspace-select{background-color:#ffffff0d;border:1px solid rgba(100,116,139,.25);color:var(--text-primary);transition:all var(--transition)}select.graph-workspace-select:hover{background-color:#ffffff1a;border-color:#64748b66}select.graph-workspace-select:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-subtle)}[data-theme=light] select.graph-workspace-select{background-color:#00000008;border-color:#64748b33}[data-theme=light] select.graph-workspace-select:hover{background-color:#0000000f}.graph-canvas-shell{position:relative;width:100%;height:74vh;min-height:420px;max-height:980px;border:1px solid var(--border-color);border-radius:var(--radius-lg);background:radial-gradient(circle at 15% 20%,var(--accent-subtle),transparent 35%),radial-gradient(circle at 80% 80%,var(--accent-subtle),transparent 42%),var(--bg-card);overflow:hidden}.graph-mode .graph-canvas-shell{height:calc(100dvh - 48px);min-height:520px;max-height:none}.graph-overlay{position:absolute;z-index:8;pointer-events:auto;display:flex;align-items:center;gap:8px;padding:8px;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);border-radius:12px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d}.graph-key{padding:6px 10px;display:flex;flex-direction:row;align-items:center;gap:12px;max-width:100%;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);border-radius:8px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d}.graph-key-items{display:flex;align-items:center;gap:12px;flex-wrap:wrap;min-width:0}.graph-key-item{display:inline-flex;align-items:center;gap:6px;color:var(--text-secondary);font-size:12px;line-height:1.1;white-space:nowrap}.graph-key-dot{width:10px;height:10px;border-radius:50%;display:inline-block;box-shadow:0 0 0 1px #ffffff1f}.graph-key-dot.dependency{background:var(--graph-direct-runtime)}.graph-key-dot.dev-dependency{background:var(--graph-direct-dev)}.graph-key-dot.sub-dependency{background:var(--graph-transitive)}[data-theme=light] .graph-key,[data-theme=light] .graph-overlay{background:#ffffffb3;border-color:#64748b26;box-shadow:0 4px 24px #0000000f,inset 0 1px #ffffff80}.graph-overlay.hidden,.graph-overlay-left.hidden{display:none}.graph-overlay-left{padding:4px 4px 4px 8px;flex-direction:row;align-items:center;gap:12px;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);border-radius:8px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d}[data-theme=light] .graph-overlay-left{background:#ffffffb3;border-color:#64748b26;box-shadow:0 4px 24px #0000000f,inset 0 1px #ffffff80}.graph-overlay-right{top:12px;right:12px}.graph-overlay-top{align-items:center;position:absolute;top:8px;left:8px;display:flex;flex-wrap:wrap;gap:10px;max-width:min(calc(100% - 16px),calc(100% - clamp(56px,18vw,160px)))}.graph-back-btn{gap:8px;background:#0f172ab3;border:1px solid rgba(100,116,139,.25);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 24px #0003,inset 0 1px #ffffff0d;top:12px;left:12px;color:var(--text-primary);border-radius:8px;padding:7px 12px;font-size:12px;cursor:pointer;transition:transform var(--transition),background var(--transition),border-color var(--transition),color var(--transition),box-shadow var(--transition);-webkit-user-select:none;user-select:none}.graph-back-btn:hover{background:#ffffff1a;border-color:#64748b66;color:var(--text-primary);transform:translateY(-1px);box-shadow:0 4px 12px #0003}[data-theme=light] .graph-back-btn:hover{background:#0000000d;box-shadow:0 4px 12px #00000014}[data-theme=light] .graph-back-btn{background:#ffffffb3;border-color:#64748b26;box-shadow:0 4px 24px #0000000f,inset 0 1px #ffffff80}.graph-controls{flex-direction:column;align-items:center;gap:8px;padding:8px}.zoom-controls{display:grid;grid-template-columns:repeat(2,52px);gap:6px}.zoom-controls>.graph-control-btn{font-size:18px;width:100%}.dpad{display:grid;grid-template-columns:34px 34px 34px;grid-template-rows:34px 34px 34px;grid-template-areas:". up ." "left . right" ". down .";gap:2px}.dpad .up{grid-area:up}.dpad .left{grid-area:left}.dpad .right{grid-area:right}.dpad .down{grid-area:down}.center-spacer{grid-column:2;grid-row:2;width:32px;height:32px;border:none;background:transparent}.graph-control-btn{border:1px solid rgba(100,116,139,.25);background:#ffffff0d;color:var(--text-primary);font-size:12px;width:34px;height:30px;border-radius:6px;cursor:pointer;line-height:1;transition:transform var(--transition),background var(--transition),border-color var(--transition),box-shadow var(--transition),color var(--transition)}.graph-control-btn:hover{background:#ffffff1f;border-color:#64748b66;transform:translateY(-1px);box-shadow:0 3px 10px #0003}[data-theme=light] .graph-control-btn{background:#00000008;border-color:#64748b26}[data-theme=light] .graph-control-btn:hover{background:#00000014;border-color:#64748b4d;box-shadow:0 3px 10px #00000014}.reset-btn{width:112px;text-transform:lowercase;letter-spacing:.2px}.graph-popover{position:absolute;z-index:9;min-width:220px;max-width:min(320px,calc(100% - 24px));padding:12px 14px;border:1px solid var(--border-color-strong);background:#0f172ad9;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-radius:12px;box-shadow:0 12px 40px #0006,inset 0 1px #ffffff1a;pointer-events:auto}[data-theme=light] .graph-popover{background:#ffffffd9;box-shadow:0 12px 40px #0000001f,inset 0 1px #fff9}.graph-popover[hidden]{display:none}.graph-popover-name{font-family:var(--font-mono);font-size:13px;color:var(--text-primary);font-weight:600;margin-bottom:4px}.graph-popover-meta{font-size:12px;color:var(--text-secondary);margin-bottom:3px}.graph-popover-action{margin-top:8px;width:100%;border:1px solid var(--border-color);border-radius:6px;background:var(--bg-primary);color:var(--text-primary);font-size:12px;padding:7px 8px;cursor:pointer}.graph-popover-action:hover{border-color:var(--accent);color:var(--accent)}#graph-canvas{width:100%;height:100%;display:block;cursor:grab}#graph-canvas.is-clickable{cursor:pointer}#graph-canvas.is-panning{cursor:grabbing}.dep-list-highlight{animation:dep-list-highlight 2s ease-out}@keyframes dep-list-highlight{0%{box-shadow:0 0 0 0 var(--accent-subtle);border-color:var(--accent)}to{box-shadow:0 0 0 18px transparent;border-color:var(--border-color)}}.report-footer{max-width:1400px;margin:0 auto;padding:0 24px 40px;color:var(--text-secondary);font-size:12px}.report-footer p{margin:8px 0 0}.report-footer.hidden{display:none}.column-headers-section{max-width:1376px;margin:0 auto;display:flex;align-items:center;padding:12px 0 8px 14px}.package-header-wrapper{display:flex;flex-direction:row;justify-content:space-between;gap:2px;flex:1;min-width:0;padding-right:1rem}.results-summary{font-size:12px;color:var(--text-secondary);white-space:nowrap}.results-summary strong{color:var(--text-primary)}.package-header{align-self:flex-start;padding:4px 8px 4px 0}#column-headers-container{margin-left:auto;flex-shrink:0;width:60%}.column-headers{display:grid;grid-template-columns:repeat(5,1fr);width:100%}.column-header{display:flex;align-items:center;gap:4px;border:none;background:transparent;font-size:10px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;cursor:pointer;padding:4px 8px 4px 10px;border-left:1px solid var(--border-color);transition:color var(--transition);white-space:nowrap;line-height:1.1;overflow:hidden}.column-header-no-border{border-left:none}.column-header:hover{color:var(--text-primary)}.column-header.sorted{color:var(--accent)}.column-header-label{flex-shrink:1;overflow:hidden;text-overflow:ellipsis}.sort-indicator{font-size:9px;opacity:.8}.column-header:not(.sorted) .sort-indicator{visibility:hidden}.dependency-grid{display:flex;flex-direction:column;gap:8px}.dep-card{background:var(--bg-card);border:1px solid var(--border-color);border-radius:var(--radius-lg);overflow:hidden;transition:border-color var(--transition)}.dep-card:hover{border-color:var(--border-color-strong)}.dep-card[data-risk=red]{border-left:3px solid var(--red)}.dep-card[data-risk=amber]{border-left:3px solid var(--amber)}.dep-card[data-risk=green]{border-left:3px solid var(--green)}.dep-summary{display:flex;align-items:center;gap:10px;padding:0 0 0 12px;cursor:pointer;list-style:none;transition:background var(--transition)}.dep-summary:hover{background:var(--bg-card-hover)}.dep-summary::-webkit-details-marker{display:none}.expand-icon{width:16px;height:16px;flex-shrink:0;display:inline-block;color:var(--text-muted);transition:transform var(--transition);background:currentColor;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") no-repeat center / contain;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") no-repeat center / contain}details[open]>summary .expand-icon{transform:rotate(90deg)}.dep-name{font-family:var(--font-mono);font-size:14px;font-weight:600;color:var(--text-primary);padding:8px 0}.dep-version{font-weight:400;color:var(--text-secondary)}.dep-indicators{display:grid;grid-template-columns:repeat(5,1fr);margin-left:auto;flex-shrink:0;width:60%}.badge-card{display:flex;flex-direction:column;justify-content:center;min-height:38px;padding:4px 8px 4px 10px;background:var(--bg-primary);border-left:1px solid var(--border-color);position:relative;overflow:hidden}.badge-card:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--gray)}.badge-card.green:before{background:var(--green)}.badge-card.amber:before{background:var(--amber)}.badge-card.red:before{background:var(--red)}.badge-card.gray:before{background:var(--gray)}.badge-label{font-size:8px;font-weight:500;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;line-height:1.1;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}.badge-value{font-size:11px;font-weight:500;color:var(--text-primary);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dep-details{padding:0 16px 16px;border-top:1px solid var(--border-color);animation:slideDown .2s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.package-links{display:flex;flex-wrap:wrap;gap:8px;padding:12px 0;margin-bottom:4px;border-bottom:1px solid var(--border-color)}.package-link{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--bg-hover);border:1px solid var(--border-color);border-radius:var(--radius-md);color:var(--text-primary);text-decoration:none;font-size:13px;font-weight:500;transition:all var(--transition)}.package-link:hover{background:var(--accent);border-color:var(--accent);color:#fff}.package-link svg{width:14px;height:14px;flex-shrink:0}.section,.section:first-child{margin-top:16px}.section-header{display:flex;align-items:center;gap:8px;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--border-color)}.section-title{font-size:13px;font-weight:600;color:var(--text-primary);text-transform:uppercase;letter-spacing:.5px}.section-desc{font-size:11px;color:var(--text-muted)}.kv-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px}.kv-grid-tight{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px}.kv-item{display:flex;flex-direction:column;gap:2px}.kv-label{font-size:12px;font-weight:500;color:var(--text-muted)}.kv-value{font-size:14px;color:var(--text-primary);overflow-wrap:anywhere;word-break:break-word}.kv-inline-link{color:var(--accent);text-decoration:none;font-size:12px;margin-left:6px;white-space:nowrap;display:inline-flex;align-items:center;gap:3px;text-underline-offset:2px}.kv-inline-link:hover{text-decoration:underline}.kv-inline-link-icon{width:11px;height:11px;flex-shrink:0}.kv-inline-link:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:3px}.risk-value{display:inline-flex;align-items:center;gap:6px}.risk-dot{width:8px;height:8px;border-radius:999px;background:var(--gray);flex-shrink:0}.risk-dot.green{background:var(--green)}.risk-dot.amber{background:var(--amber)}.risk-dot.red{background:var(--red)}.kv-hint{font-size:11px;color:var(--text-muted);font-style:italic}.micro-summary{display:grid;gap:6px;padding:6px 0 2px}.micro-line{font-size:13px;color:var(--text-primary)}.micro-sublist{margin-top:8px}.micro-subtitle{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:4px}.section-block{margin-top:12px}.block-title{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px}.section-note{font-size:12px;color:var(--text-secondary);margin:6px 0 12px}.subsection{padding:12px 0;border-top:1px solid var(--border-color)}.subsection:first-child{border-top:none;padding-top:0}.subsection-header{display:flex;align-items:baseline;gap:8px;margin-bottom:8px}.subsection-title{font-size:12px;font-weight:600;color:var(--text-primary);text-transform:uppercase;letter-spacing:.4px}.subsection-desc{font-size:11px;color:var(--text-muted)}.subsection.warning .subsection-title{color:var(--red)}.detail-list{margin-top:12px}.detail-title{font-size:11px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.4px;margin-bottom:6px}.detail-items{list-style:none;padding:0;margin:0;display:grid;gap:6px}.detail-items.mono .detail-item{font-family:var(--font-mono)}.detail-item{font-size:12px;color:var(--text-secondary);overflow-wrap:anywhere;word-break:break-word}.detail-item.muted{color:var(--text-muted)}.declared-deps{display:grid;gap:8px}.declared-summary{font-size:12px;color:var(--text-secondary);margin:4px 0 8px}.declared-group{border:1px solid var(--border-color);border-radius:8px;background:var(--bg-primary);padding:8px 10px}.declared-group-summary{font-size:12px;font-weight:600;color:var(--text-primary);cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px}.declared-group-summary::-webkit-details-marker{display:none}.declared-count{font-size:11px;color:var(--text-muted);font-weight:500}.declared-group-title{display:inline-flex;align-items:baseline;gap:6px}.declared-table{display:grid;gap:6px;margin-top:8px}.declared-row{display:grid;grid-template-columns:minmax(160px,1.3fr) minmax(120px,1fr) auto;gap:10px;align-items:center;padding:8px 10px;border:1px solid var(--border-color);border-radius:6px;background:var(--bg-primary)}.declared-name{font-size:12px;font-family:var(--font-mono);color:var(--text-primary);display:flex;align-items:center;gap:6px;overflow-wrap:anywhere}.declared-range{font-size:12px;color:var(--text-secondary);font-family:var(--font-mono);overflow-wrap:anywhere}.status-pill{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;text-decoration:none;border:1px solid transparent}.status-pill.installed{color:var(--green);border-color:var(--green);background:var(--green-bg)}.status-pill.missing{color:var(--text-muted);border-color:var(--border-color-strong);background:var(--gray-bg)}.bullet-list{margin:6px 0 0;padding-left:18px;color:var(--text-secondary)}.bullet-list li{margin-bottom:6px}.subtle-divider{height:1px;background:var(--border-color);margin:12px 0}.package-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.package-tag{padding:2px 8px;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:4px;font-size:11px;font-family:var(--font-mono);color:var(--text-secondary)}.package-list-toggle{font-size:11px;color:var(--accent);background:none;border:none;cursor:pointer;padding:2px 4px}.package-list-toggle:hover{text-decoration:underline}.vuln-table{width:100%;border-collapse:collapse;font-size:13px}.vuln-table th,.vuln-table td{text-align:left;padding:8px 12px;border-bottom:1px solid var(--border-color);vertical-align:top;overflow-wrap:anywhere;word-break:break-word}.vuln-table th{font-weight:500;color:var(--text-muted);font-size:11px;text-transform:uppercase;letter-spacing:.5px}.vuln-table tr[data-severity=critical],.vuln-table tr[data-severity=high]{background:var(--red-bg)}.vuln-table tr[data-severity=moderate]{background:var(--amber-bg)}.vuln-table a{color:var(--accent);text-decoration:none}.vuln-table a:hover{text-decoration:underline}.no-vulns{font-size:13px;color:var(--text-secondary);padding:8px 0}.raw-data-toggle{margin-top:16px}.raw-data-toggle summary{font-size:12px;color:var(--text-muted);cursor:pointer;padding:8px 0;display:flex;align-items:center;gap:8px;list-style:none}.raw-data-toggle summary::-webkit-details-marker{display:none}.raw-data-pane{margin-top:8px;position:relative;display:flex;flex-direction:column;background:var(--bg-primary);border:1px solid var(--border-color);border-radius:var(--radius);max-height:300px;overflow:auto}.raw-data-pane pre{margin:0;padding:12px 12px 44px;background:transparent;border:none;font-family:var(--font-mono);font-size:11px;color:var(--text-secondary);white-space:pre;overflow:visible}.copy-json-btn{position:sticky;bottom:8px;align-self:flex-end;margin:0 8px 8px;padding:6px 10px;border:1px solid var(--border-color);border-radius:4px;background:var(--bg-card);color:var(--text-primary);font-size:11px;cursor:pointer;transition:all var(--transition)}.raw-data-toggle:not([open]) .copy-json-btn{display:none}.copy-json-btn:hover{border-color:var(--accent);color:var(--accent)}.copy-json-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.copy-json-btn.copied{border-color:var(--green);color:var(--green)}.dep-loading{padding:2rem 0}.dep-loading-bar{position:relative;height:.25rem;background:var(--border-color);overflow:hidden;border-radius:999px}.dep-loading-bar:after{content:"";position:absolute;top:0;left:-40%;width:40%;height:100%;background:var(--accent);animation:dep-loading 1.2s ease-in-out infinite}@keyframes dep-loading{0%{transform:translate(0)}to{transform:translate(250%)}}.package-tag-link{text-decoration:none;color:var(--text-secondary);transition:all var(--transition)}.package-tag-link:hover{border-color:var(--accent);color:var(--accent)}.package-tag-link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.empty-state{text-align:center;padding:48px 24px;color:var(--text-muted)}.empty-state-icon{font-size:48px;margin-bottom:12px}.empty-state-text{font-size:16px}@media(max-width:1180px)and (min-width:769px){.filter-row{grid-template-columns:1fr}.filter-top-row{max-width:560px}}@media(max-width:768px){.top-header{padding:20px 16px}.header-row{flex-direction:column;align-items:flex-start;gap:16px}.header-content{gap:12px}.logo,.logo-wrapper{width:48px;height:48px}.header-text h1{font-size:22px}.header-meta{gap:6px}.meta-item{padding:3px 8px;font-size:11px}.cta-section{width:100%;max-width:none;text-align:left}.cta-benefits{display:none}.filter-bar{padding:10px 16px}.filter-row{display:block}.filter-top-row{display:flex;align-items:center;gap:10px;flex:1 1 auto;min-width:0;flex-wrap:wrap}.search-wrapper{max-width:none;flex:1 1 100%}.view-switch{order:2}.view-switch-btn{padding:6px 10px}.filters-toggle{display:inline-flex;flex-shrink:0}.filter-controls{max-height:0;opacity:0;overflow:hidden;transform:translateY(-8px);pointer-events:none;transition:max-height .3s ease-out,opacity .25s ease-out,transform .25s ease-out,margin-top .25s ease-out;margin-top:0}.filter-controls.open{max-height:900px;opacity:1;transform:translateY(0);pointer-events:auto;margin-top:10px}.license-filter-panel-row{max-height:0;opacity:0;overflow:hidden;transform:translateY(-8px);pointer-events:none;transition:max-height .3s ease-out,opacity .25s ease-out,transform .25s ease-out,margin-top .25s ease-out;margin-top:0}.filter-controls.open+.license-filter-panel-row{max-height:560px;opacity:1;transform:translateY(0);pointer-events:auto;margin-top:8px}.filter-controls-row{display:flex;flex-direction:column;align-items:stretch;gap:10px}.filter-group{display:flex;justify-content:space-between;align-items:center}.filter-group select{flex:1;max-width:200px}.mobile-only,.sort-wrapper.mobile-only{display:flex!important}.theme-toggle{order:100;margin-left:auto}.license-filter-toggle{display:none}.license-filter-panel,.license-filter-panel.open{max-height:none;border-bottom-color:var(--border-color)}.license-filter-inner{padding:12px 0 10px}#column-headers-container,.column-headers,.package-header{display:none}.column-headers-section{max-height:0;opacity:0;overflow:hidden;transform:translateY(-6px);pointer-events:none;transition:max-height .3s ease-out,opacity .25s ease-out,transform .25s ease-out,margin-top .25s ease-out,padding .25s ease-out;margin-top:0;padding:0 16px}.filter-controls.open+.license-filter-panel-row+.column-headers-section{max-height:120px;opacity:1;transform:translateY(0);pointer-events:auto;margin-top:8px;padding:8px 16px}.package-header-wrapper{flex-direction:row}.main-content{padding:12px 16px 32px}.graph-workspace-select{min-width:170px}.graph-overlay{padding:6px}.graph-canvas-shell{height:62vh;min-height:340px}.graph-overlay-right{right:8px;top:8px}.graph-overlay-left{left:8px;top:48px}.graph-key{padding:6px 8px;gap:8px}.graph-key-items{gap:8px}.graph-key-item{font-size:11px}.graph-back-btn{left:8px;top:8px}.graph-mode .main-content{padding:8px}.graph-mode .graph-canvas-shell{height:calc(100dvh - 16px);min-height:420px}.report-footer{padding:0 16px 32px}.vuln-table thead{display:none}.vuln-table tr{display:block;border-bottom:1px solid var(--border-color)}.vuln-table td{display:flex;justify-content:space-between;gap:12px;padding:6px 8px}.vuln-table td:before{content:attr(data-label);font-size:10px;text-transform:uppercase;letter-spacing:.4px;color:var(--text-muted);min-width:120px}.dep-summary{flex-wrap:wrap;padding:8px 12px}.dep-name{font-size:13px}.dep-indicators{display:flex;flex-wrap:wrap;min-width:auto;width:100%;margin-left:0;margin-top:6px;padding-top:6px;border-top:1px solid var(--border-color);gap:4px}.badge-card{flex:1 1 calc(50% - 4px);min-width:0}.badge-value{font-size:10px}.badge-label{clip:none;clip-path:none;height:auto;width:auto;margin:0;overflow:auto;padding:0;position:relative;font-size:7px}.declared-row{grid-template-columns:1fr;gap:6px}}@media(max-width:480px){.header-text h1{font-size:20px}.meta-item{font-size:10px;padding:2px 6px}.cta-link{width:100%;justify-content:center;padding:12px 16px}.badge-card{flex:1 1 100%}}
12
12
  `;
13
13
  /**
14
14
  * JavaScript content for the dependency radar HTML report
15
15
  * Built from report-ui/main.ts
16
16
  */
17
- exports.JS_CONTENT = `!function(){"use strict";const e=2.8;function t(e,t,n){return Math.min(n,Math.max(t,e))}function n(e,n,r){const a=function(e){const n=e.trim(),r=n.match(/^#([0-9a-f]{3}|[0-9a-f]{6})\$/i);if(r){const e=r[1];return 3===e.length?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16)}:{r:parseInt(e.slice(0,2),16),g:parseInt(e.slice(2,4),16),b:parseInt(e.slice(4,6),16)}}const a=n.match(/^rgba?\\(([^)]+)\\)\$/i);if(!a)return null;const s=a[1].replace(/\\//g," ").split(/[\\s,]+/).filter(Boolean).slice(0,3);if(3!==s.length)return null;const i=e=>{if(e.endsWith("%")){const n=Number(e.slice(0,-1));return Number.isFinite(n)?t(Math.round(n/100*255),0,255):null}const n=Number(e);return Number.isFinite(n)?t(Math.round(n),0,255):null},o=i(s[0]),c=i(s[1]),l=i(s[2]);return null===o||null===c||null===l?null:{r:o,g:c,b:l}}(e);if(!a)return r;const s=t(n,0,1);return\`rgb(\${Math.round(a.r+(255-a.r)*s)}, \${Math.round(a.g+(255-a.g)*s)}, \${Math.round(a.b+(255-a.b)*s)})\`}function r(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}function a(e,t,n){if(0===t.length)return;if(e.moveTo(t[0].x,t[0].y),1===t.length)return;if(2===t.length)return void e.lineTo(t[1].x,t[1].y);for(let a=1;a<t.length-1;a+=1){const r=t[a-1],s=t[a],i=t[a+1],o=s.x-r.x,c=s.y-r.y,l=i.x-s.x,d=i.y-s.y,u=Math.hypot(o,c),p=Math.hypot(l,d);if(u<.001||p<.001){e.lineTo(s.x,s.y);continue}const h=Math.min(n,.45*u,.45*p),g=s.x-o/u*h,m=s.y-c/u*h,v=s.x+l/p*h,f=s.y+d/p*h;e.lineTo(g,m),e.quadraticCurveTo(s.x,s.y,v,f)}const r=t[t.length-1];e.lineTo(r.x,r.y)}function s(e,n,r,s){const i=n.renderX,o=n.renderY,c=r.renderX,l=r.renderY,d=r.depth-n.depth,u=Math.abs(d);if(0===u){const r=Math.abs(i-c)<s.sameColumnXThreshold,d=Math.abs(o-l),u=n.depth<s.maxDepth;if(r&&d>s.minDetourVerticalSpan&&u){const r=s.paddingX+n.depth*s.layerGap,u=s.paddingX+(n.depth+1)*s.layerGap,p=.5*(r+u);let h=p+s.detourInset;const g=Math.min(o,l)-12,m=Math.max(o,l)+12;(function(e,t,n,r,a){const s=e.depthNodeIndex.get(t);if(!s||0===s.length)return!1;const i=function(e,t){let n=0,r=e.length;for(;n<r;){const a=n+(r-n>>1);e[a].renderY<t?n=a+1:r=a}return n}(s,n);for(let o=i;o<s.length&&s[o].renderY<=r;o+=1)if(Math.abs(s[o].renderX-a)<e.detourNodeClearance)return!0;return!1})(s,n.depth+1,g,m,h)&&(h+=12);h=t(h,p+8,u-24);const v=Math.max(1,h-i);return void a(e,[{x:i,y:o},{x:h,y:o},{x:h,y:l},{x:c,y:l}],t(.42*Math.min(v,d),16,52))}e.moveTo(i,o);const p=i+.5*(c-i),h=o+(l-o)*s.edgeCurve;return void e.quadraticCurveTo(p,h,c,l)}if(1===u){const t=Math.min(n.depth,r.depth),a=s.paddingX+t*s.layerGap+.5*s.layerGap;return e.moveTo(i,o),void e.bezierCurveTo(a,o,a,l,c,l)}const p=Math.sign(d),h=l-o,g=[{x:i,y:o}],m=s.paddingX+n.depth*s.layerGap+p*(.5*s.layerGap);g.push({x:m,y:o});for(let t=1;t<u;t+=1){const e=n.depth+p*t,r=s.paddingX+e*s.layerGap+p*(.5*s.layerGap),a=t/u;g.push({x:r,y:o+h*a})}const v=s.paddingX+r.depth*s.layerGap-p*(.5*s.layerGap);g.push({x:v,y:l}),g.push({x:c,y:l}),a(e,g,14)}function i(e,t){return\`\${e}@\${t}\`}function o(e,t){return\`\${e}->\${t}\`}function c(e){if(!e||"object"!=typeof e)return!1;const t=e;if(!Array.isArray(t.workspaces))return!1;if(!t.dependencies||"object"!=typeof t.dependencies)return!1;const n=e=>Array.isArray(e)&&e.every(e=>"string"==typeof e);if(!t.workspaces.every(e=>(e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"string"==typeof t.name&&!!Array.isArray(t.directDependencies)&&!!Array.isArray(t.directDevDependencies)})(e)))return!1;if(!t.workspaces.every(e=>n(e.directDependencies)&&n(e.directDevDependencies)))return!1;return!!Object.entries(t.dependencies).every(([,e])=>{if(!e||"object"!=typeof e)return!1;const t=e;return!(void 0!==t.dependencies&&!Array.isArray(t.dependencies))&&!(void 0!==t.workspaceOrigins&&!Array.isArray(t.workspaceOrigins))})}function l(e){const t=e.compliance.license.declared?.valid?e.compliance.license.declared.spdxId:void 0;return t||(e.compliance.license.inferred?.spdxId||"Unknown")}function d(e){const t=e.security?.summary;return t?Number(t.critical||0)+Number(t.high||0)+Number(t.moderate||0)+Number(t.low||0):0}function u(e){const t=e.security?.summary?.highest;return"critical"===t||"high"===t?"high":"moderate"===t?"moderate":"none"}function p(e,t){const n=new Set,r=[t];for(;r.length>0;){const t=r.pop();if(!t)continue;const a=e.nodes.get(t);a&&a.parents.forEach(e=>{n.has(e)||(n.add(e),r.push(e))})}return n}function h(e,t){const n=new Set,r=[t];for(;r.length>0;){const t=r.pop();if(!t)continue;const a=e.nodes.get(t);a&&a.children.forEach(e=>{n.has(e)||(n.add(e),r.push(e))})}return n}function g(a){const g=function(e,t,n){const r=window.__DEPENDENCY_DATA__;if(c(r)){const e={};return Object.entries(r.dependencies).forEach(([t,n])=>{const r=n,a=r.vulnerabilitySeverity||r.vulnerabilityHighest||r.highestSeverity||"none",s=String(a).trim().toLowerCase();let i="none";"critical"===s||"high"===s?i="high":"moderate"!==s&&"medium"!==s||(i="moderate"),e[t]={slug:String(r.slug||t),name:String(r.name||t),version:String(r.version||""),dependencies:Array.isArray(r.dependencies)?r.dependencies.map(e=>String(e)):[],license:String(r.license||"Unknown"),vulnerabilityCount:Number(r.vulnerabilityCount||0),vulnerabilitySeverity:i,isDevOnly:Boolean(r.isDevOnly),workspaceOrigins:Array.isArray(r.workspaceOrigins)?r.workspaceOrigins.map(e=>String(e)):[]}}),{workspaces:r.workspaces,dependencies:e}}const a={},s=Object.values(e.dependencies||{});s.forEach(e=>{const t=i(e.package.name,e.package.version);a[t]={slug:t,name:e.package.name,version:e.package.version,dependencies:[],license:l(e),vulnerabilityCount:d(e),vulnerabilitySeverity:u(e),isDevOnly:"dev"===e.usage.scope,workspaceOrigins:e.usage.origins.workspaces||[]}}),s.forEach(e=>{const r=i(e.package.name,e.package.version),s=e.graph.subDeps;if(!s)return;const o=new Set;["dep","dev","opt","peer"].forEach(e=>{const i=s[e];i&&Object.values(i).forEach(e=>{const s=e[1];if(!s)return;const i=n(s);i&&t.has(i)&&a[i]&&i!==r&&o.add(i)})}),a[r].dependencies=[...o]});const o=new Map,p=e=>{const t=o.get(e);if(t)return t;const n={directDependencies:new Set,directDevDependencies:new Set};return o.set(e,n),n};return p("root"),(e.workspaces.workspacePackages||[]).forEach(e=>{p(e.name)}),s.forEach(e=>{if(!e.usage.direct)return;const t=i(e.package.name,e.package.version);(e.usage.origins.workspaces?.length?e.usage.origins.workspaces:["root"]).forEach(n=>{const r=p(n);"dev"===e.usage.scope?r.directDevDependencies.add(t):r.directDependencies.add(t)})}),{workspaces:[...o.entries()].map(([e,t])=>({name:e,directDependencies:[...t.directDependencies],directDevDependencies:[...t.directDevDependencies]})).sort((e,t)=>e.name.localeCompare(t.name)),dependencies:a}}(a.report,a.knownDepKeys,a.resolveDepKey),m=new Map(g.workspaces.map(e=>[e.name,e])),v=new Map,f=new Map;Object.values(g.dependencies).forEach(e=>{const t=(e.dependencies||[]).filter(t=>t!==e.slug&&Boolean(g.dependencies[t]));f.set(e.slug,t),t.forEach(t=>{const n=v.get(t)||[];n.push(e.slug),v.set(t,n)})});let y=null,k="",b=null,w=null,E=new Set,x=new Set,I=new Set,C=new Set,S=new Set,L=null,M=1,P=0,D=0,Y=1,X=.1,B=0,A=0,N=!1,T=!0,R=0,V=Math.max(1,Math.floor(window.devicePixelRatio||1)),H=1,O=1;const j={down:!1,moved:!1,startX:0,startY:0,startPanX:0,startPanY:0},\$={active:!1,startX1:0,startY1:0,startX2:0,startY2:0,startPanX:0,startPanY:0,startDist:0,startZoom:0,anchorX:null,anchorY:null},G=a.canvas.getContext("2d"),F=Boolean(G);let W=!1,U=!1,_=!1,q=null,z=null,K=null,J=!1,Z={runtime:"#10b981",runtimeHighlight:"#34d399",dev:"#f59e0b",devHighlight:"#fcd34d",transitive:"#06b6d4",transitiveHighlight:"#67e8f9",edge:"#64748b",highlight:"#22d3ee",muted:"#64748b",ringHigh:"#ef4444",ringModerate:"#f59e0b",label:"#e8edf5",backgroundPrimary:"#0c1222"};function Q(){const e=r("--graph-direct-runtime")||"#10b981",t=r("--graph-direct-dev")||"#f59e0b",a=r("--graph-transitive")||"#06b6d4";Z={runtime:e,runtimeHighlight:n(e,.2,"#34d399"),dev:t,devHighlight:n(t,.28,"#fcd34d"),transitive:a,transitiveHighlight:n(a,.38,"#67e8f9"),edge:r("--graph-edge")||"#64748b",highlight:r("--graph-highlight")||"#22d3ee",muted:r("--graph-muted")||"#64748b",ringHigh:r("--graph-vuln-high")||"#ef4444",ringModerate:r("--graph-vuln-medium")||"#f59e0b",label:r("--text-primary")||"#e8edf5",backgroundPrimary:r("--bg-primary")||"#0c1222"}}function ee(){if(J)return;J=!0,console.warn("Dependency Radar: unable to initialize 2D canvas; graph rendering disabled."),a.controlsRoot.classList.add("hidden"),a.workspaceWrap.classList.add("hidden"),a.canvas.style.display="none";const e=document.createElement("div");e.className="empty-state";const t=document.createElement("div");t.className="empty-state-text",t.textContent="Graph view is unavailable in this browser context.",e.appendChild(t),a.canvasHost.appendChild(e)}function te(e){return(e-P)/M}function ne(e){return(e-D)/M}function re(n,r,a){const s=t(n,X,e),i=te(r),o=ne(a);M=s,P=r-i*M,D=a-o*M,T=!0,Ee()}function ae(e,t){P+=e,D+=t,T=!0,Ee()}function se(){const e=a.canvasHost.getBoundingClientRect();H=Math.max(1,Math.floor(e.width)),O=Math.max(1,Math.floor(e.height)),V=Math.max(1,Math.floor(window.devicePixelRatio||1)),a.canvas.width=H*V,a.canvas.height=O*V,a.canvas.style.width=\`\${H}px\`,a.canvas.style.height=\`\${O}px\`,T=!0,Ee()}function ie(){if(!y)return;const n=y.bounds,r=Math.max(1,n.maxX-n.minX),a=Math.max(1,n.maxY-n.minY),s=H/r,i=O/a;Y=t(Math.min(s,i),.05,e),X=t(.86*Y,.05,e),B=.5*(H-r*Y)-n.minX*Y,A=.5*(O-a*Y)-n.minY*Y}function oe(e,t){if(!y)return null;const n=a.canvas.getBoundingClientRect(),r=te(e-n.left),s=ne(t-n.top);let i=null,o=1/0;return y.nodes.forEach(e=>{const t=r-e.renderX,n=s-e.renderY,a=Math.sqrt(t*t+n*n);a<=e.renderRadius+5&&a<o&&(o=a,i=e)}),i}function ce(e){const t=m.get(e);if(!t)return null;const n=new Set(t.directDependencies.filter(e=>Boolean(g.dependencies[e]))),r=new Set(t.directDevDependencies.filter(e=>Boolean(g.dependencies[e]))),a=new Set([...n,...r]);0===a.size&&Object.keys(g.dependencies).filter(e=>0===(v.get(e)||[]).length).slice(0,40).forEach(e=>{a.add(e)});const s=new Set,i=[...a];let o=0;for(;o<i.length;){const e=i[o++];e&&(s.has(e)||g.dependencies[e]&&(s.add(e),(f.get(e)||[]).forEach(e=>{s.has(e)||i.push(e)})))}if(0===s.size)return null;const c=new Map;s.forEach(e=>{const t=n.has(e)?"direct-runtime":r.has(e)?"direct-dev":"transitive";c.set(e,{slug:e,ref:g.dependencies[e],parents:new Set,children:new Set,depth:Number.POSITIVE_INFINITY,order:0,amplification:0,kind:t,baseX:0,baseY:0,targetX:0,targetY:0,renderX:0,renderY:0,radius:8,targetRadius:8,renderRadius:8})}),c.forEach(e=>{(v.get(e.slug)||[]).forEach(t=>{c.has(t)&&e.parents.add(t)}),(f.get(e.slug)||[]).forEach(t=>{c.has(t)&&e.children.add(t)})});const l=[];for(a.forEach(e=>{const t=c.get(e);t&&(t.depth=0,l.push(e))});l.length>0;){const e=l.shift();if(!e)continue;const t=c.get(e);t&&t.children.forEach(e=>{const n=c.get(e);if(!n)return;const r=t.depth+1;r>=n.depth||(n.depth=r,l.push(e))})}c.forEach(e=>{if(Number.isFinite(e.depth))return;let t=Number.POSITIVE_INFINITY;e.parents.forEach(e=>{const n=c.get(e);n&&Number.isFinite(n.depth)&&(t=Math.min(t,n.depth+1))}),e.depth=Number.isFinite(t)?t:0});const d=[...c.values()].reduce((e,t)=>Math.max(e,t.depth),0),u=Array.from({length:d+1},()=>[]);c.forEach(e=>{u[e.depth].push(e.slug)});const p=[];c.forEach(e=>{e.children.forEach(t=>{p.push({from:e.slug,to:t,direct:0===e.depth})})});const h={workspaceName:e,nodes:c,edges:p,layers:u,directRuntime:n,directDev:r,directAll:new Set([...n,...r]),bounds:{minX:0,maxX:1,minY:0,maxY:1}};return le(h),de(h),h}function le(e){e.nodes.forEach(e=>{e.amplification=0}),e.nodes.forEach(t=>{if(0!==t.depth)return;if(!e.directAll.has(t.slug))return;const n=new Set,r=[...t.children];for(;r.length>0;){const a=r.pop();if(!a)continue;if(a===t.slug)continue;if(n.has(a))continue;n.add(a);const s=e.nodes.get(a);s&&s.children.forEach(e=>{n.has(e)||r.push(e)})}t.amplification=n.size})}function de(e){const t=new Map;e.layers.forEach((n,r)=>{0===r?n.sort((t,n)=>{const r=e.nodes.get(t),a=e.nodes.get(n);if(!r&&!a)return 0;if(!r)return 1;if(!a)return-1;if(r.amplification!==a.amplification)return a.amplification-r.amplification;if(r.kind!==a.kind){if("direct-runtime"===r.kind)return-1;if("direct-runtime"===a.kind)return 1}return r.ref.name.localeCompare(a.ref.name)}):n.sort((n,r)=>{const a=e.nodes.get(n),s=e.nodes.get(r);if(!a&&!s)return 0;if(!a)return 1;if(!s)return-1;const i=(()=>{let e=0,n=0;return a.parents.forEach(r=>{const a=t.get(r);"number"==typeof a&&(e+=1,n+=a)}),e>0?n/e:Number.MAX_SAFE_INTEGER})(),o=(()=>{let e=0,n=0;return s.parents.forEach(r=>{const a=t.get(r);"number"==typeof a&&(e+=1,n+=a)}),e>0?n/e:Number.MAX_SAFE_INTEGER})();return i!==o?i-o:a.ref.name.localeCompare(s.ref.name)}),n.forEach((e,n)=>{t.set(e,n)})});const n=e.layers.reduce((e,t)=>Math.max(e,t.length),1);e.bounds={minX:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY},e.layers.forEach((t,r)=>{const a=Math.max(0,43*(t.length-1)),s=64+.5*(43*n-a);t.forEach((t,n)=>{const a=e.nodes.get(t);if(!a)return;a.order=n,a.baseX=96+240*r,a.baseY=s+43*n,a.targetX=a.baseX,a.targetY=a.baseY,a.renderX=a.baseX,a.renderY=a.baseY;const i=.55*Math.log(a.children.size+a.parents.size+1),o=0===a.depth&&e.directAll.has(a.slug)?1.05*Math.log(a.amplification+1):0;a.radius=6.7+i+o,a.targetRadius=a.radius,a.renderRadius=a.radius,e.bounds.minX=Math.min(e.bounds.minX,a.baseX),e.bounds.maxX=Math.max(e.bounds.maxX,a.baseX),e.bounds.minY=Math.min(e.bounds.minY,a.baseY),e.bounds.maxY=Math.max(e.bounds.maxY,a.baseY)})}),Number.isFinite(e.bounds.minX)||(e.bounds={minX:0,maxX:1,minY:0,maxY:1})}function ue(e){if(!y||!y.nodes.has(e))return;b=e;const t=p(y,e),n=h(y,e);E=new Set([e]),t.forEach(e=>{E.add(e)}),n.forEach(e=>{E.add(e)}),x=new Set;const r=[e],a=new Set([e]);for(;r.length>0;){const e=r.pop();if(!e)continue;const t=y.nodes.get(e);t&&t.parents.forEach(t=>{x.add(o(t,e)),a.has(t)||(a.add(t),r.push(t))})}const s=[e],i=new Set([e]);for(;s.length>0;){const e=s.pop();if(!e)continue;const t=y.nodes.get(e);t&&t.children.forEach(t=>{x.add(o(e,t)),i.has(t)||(i.add(t),s.push(t))})}I=new Set(E);const c=y.nodes.get(e);c.parents.forEach(e=>{I.add(e)}),c.children.forEach(e=>{I.add(e)}),T=!0,Ee()}function pe(){b=null,E=new Set,x=new Set,I=new Set,T=!0,Ee()}function he(){if(!y)return;const e=b&&y.nodes.get(b)||null;y.nodes.forEach(t=>{if(t.targetRadius=function(e){const t=b===e.slug,n=E.has(e.slug);let r=e.radius;t?r*=1.85:b&&n?r*=1.22:b&&!n?r*=.84:w&&C.has(e.slug)?r*=1.1:w&&(r*=.9);return r}(t),!e||!I.has(t.slug))return t.targetX=t.baseX,void(t.targetY=t.baseY);const n=t.baseX-e.baseX,r=t.baseY-e.baseY,a=1+120/(Math.sqrt(n*n+r*r)+1);t.targetX=e.baseX+n*a,t.targetY=e.baseY+r*a})}function ge(e){if(b)return;if(w=e,C=new Set,S=new Set,!y||!e||!y.nodes.has(e))return T=!0,void Ee();const t=p(y,e),n=h(y,e);C=new Set([e]),t.forEach(e=>{C.add(e)}),n.forEach(e=>{C.add(e)});const r=y.nodes.get(e);r&&(r.parents.forEach(e=>{C.add(e)}),r.children.forEach(e=>{C.add(e)})),y.edges.forEach(e=>{C.has(e.from)&&C.has(e.to)&&S.add(o(e.from,e.to))}),T=!0,Ee()}function me(e){if(!y)return;const t=y.nodes.get(e);if(!t)return;const n=0===t.depth&&y.directAll.has(t.slug);L=e,a.popoverName.textContent=t.ref.name,a.popoverVersion.textContent=\`Version: \${t.ref.version}\`,a.popoverLicense.textContent=\`License: \${t.ref.license||"Unknown"}\`,a.popoverVulns.textContent=\`Vulnerabilities: \${t.ref.vulnerabilityCount||0}\`,a.popoverAmplification.textContent=n?\`Amplification: \${t.amplification}\`:\`Dependencies: \${t.children.size} • Dependents: \${t.parents.size}\`,a.popover.hidden=!1,fe()}function ve(){L=null,a.popover.hidden=!0}function fe(){if(!y||!L||a.popover.hidden)return;const e=y.nodes.get(L);if(!e)return void ve();const n=e.renderX*M+P,r=e.renderY*M+D,s=a.canvasHost.getBoundingClientRect(),i=a.popover.getBoundingClientRect(),o=Math.max(8,s.width-i.width-8),c=Math.max(8,s.height-i.height-8),l=t(n+14,8,o),d=t(r+14,8,c);a.popover.style.left=\`\${l}px\`,a.popover.style.top=\`\${d}px\`}function ye(e){return b?E.has(e)?1:.14:w?C.has(e)?1:.16:.95}function ke(){if(!G)return;if(G.setTransform(V,0,0,V,0,0),G.clearRect(0,0,H,O),!y)return;const e=y,n=te(0)-80,r=te(H)+80,a=ne(0)-80,i=ne(O)+80;G.setTransform(V*M,0,0,V*M,V*P,V*D);const c=Z.runtime,l=Z.dev,d=Z.transitive,u=Z.edge,p=Z.highlight,h=Z.muted,g=Z.ringHigh,m=Z.ringModerate,v=Z.label,f=Z.backgroundPrimary,k=new Set;e.nodes.forEach(e=>{const t=Math.max(e.radius,e.renderRadius);e.renderX+t>=n&&e.renderX-t<=r&&e.renderY+t>=a&&e.renderY-t<=i&&k.add(e.slug)});const I=Math.max(0,e.layers.length-1),L=function(e){const t=new Map;return e.nodes.forEach(e=>{const n=t.get(e.depth);n?n.push(e):t.set(e.depth,[e])}),t.forEach(e=>{e.sort((e,t)=>e.renderY-t.renderY)}),t}(e),Y={depthNodeIndex:L,maxDepth:I,sameColumnXThreshold:6,minDetourVerticalSpan:80,detourInset:14,detourNodeClearance:26,paddingX:96,layerGap:240,edgeCurve:.2},X=[];e.edges.forEach(t=>{const n=e.nodes.get(t.from),r=e.nodes.get(t.to);if(!n||!r)return;if(!k.has(n.slug)&&!k.has(r.slug))return;const a=o(t.from,t.to);X.push({from:n,to:r,highlighted:x.has(a)||!b&&S.has(a),span:Math.abs(r.depth-n.depth)})}),X.sort((e,t)=>t.span-e.span),G.globalCompositeOperation="source-over",G.strokeStyle=b||w?h:u,G.lineWidth=1.05,G.globalAlpha=function(){if(b||w)return.04*t((M-.35)/.9,.75,1);return.25*t((M-.35)/.9,.2,1)}(),G.beginPath(),X.forEach(e=>{e.highlighted||s(G,e.from,e.to,Y)}),G.stroke(),G.globalCompositeOperation="lighter",G.strokeStyle=p,G.lineWidth=1.2,G.globalAlpha=.36*t((M-.35)/.9,.2,1),G.beginPath(),X.forEach(e=>{e.highlighted&&s(G,e.from,e.to,Y)}),G.stroke(),G.globalCompositeOperation="source-over",e.nodes.forEach(e=>{if(!k.has(e.slug))return;const t=b===e.slug,n=e.renderRadius;G.globalAlpha=1,G.fillStyle=f,G.beginPath(),G.arc(e.renderX,e.renderY,n,0,2*Math.PI),G.fill(),G.globalAlpha=ye(e.slug);const r=G.createRadialGradient(e.renderX-.3*n,e.renderY-.3*n,0,e.renderX,e.renderY,1.2*n);"direct-runtime"===e.kind?(r.addColorStop(0,Z.runtimeHighlight),r.addColorStop(1,c)):"direct-dev"===e.kind?(r.addColorStop(0,Z.devHighlight),r.addColorStop(1,l)):(r.addColorStop(0,Z.transitiveHighlight),r.addColorStop(1,d)),G.fillStyle=r,G.beginPath(),G.arc(e.renderX,e.renderY,n,0,2*Math.PI),G.fill(),t&&(G.globalAlpha=.95,G.strokeStyle=p,G.lineWidth=1.5,G.beginPath(),G.arc(e.renderX,e.renderY,n+4,0,2*Math.PI),G.stroke())}),y.nodes.forEach(e=>{if(!k.has(e.slug))return;if(!e.ref.vulnerabilityCount||e.ref.vulnerabilityCount<=0)return;if("none"===e.ref.vulnerabilitySeverity)return;const t=e.renderRadius,n="high"===e.ref.vulnerabilitySeverity?g:m;var r;G.save(),G.translate(e.renderX,e.renderY),G.globalAlpha=(r=e.slug,b?E.has(r)?.78:.11:w?C.has(r)?.76:.12:.8),G.strokeStyle=n;const a=t/e.radius,s=t/3*1.2/12,i=1.2*s+3*(a-1),o=Math.max(.5*s,.15),c=Math.max(1*s,.3),l=Math.max(3*s,.8),d=Math.max(1*s,.3),u=Math.max(.5*s,.15),p=t+(2+6*(a-1))+o/2,h=p+o/2+i+c/2,v=h+c/2+i+l/2,f=v+l/2+i+d/2,y=f+d/2+i+u/2;G.setLineDash([]),G.lineWidth=u,G.beginPath(),G.arc(0,0,y,0,2*Math.PI),G.stroke(),G.lineWidth=d,G.beginPath(),G.arc(0,0,f,0,2*Math.PI),G.stroke(),G.lineWidth=l,G.beginPath(),G.arc(0,0,v,0,2*Math.PI),G.stroke(),G.lineWidth=c,G.beginPath(),G.arc(0,0,h,0,2*Math.PI),G.stroke(),G.lineWidth=o,G.beginPath(),G.arc(0,0,p,0,2*Math.PI),G.stroke(),G.restore()}),G.textBaseline="middle",G.font='500 11.5px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',G.fillStyle=v,e.nodes.forEach(e=>{k.has(e.slug)&&(G.globalAlpha=ye(e.slug),G.fillText(e.ref.name,e.renderX+e.renderRadius+6,e.renderY))}),G.globalAlpha=1,fe()}function be(){if(!N)return void(R=0);he();const e=function(){if(!y)return!1;let e=!1;return y.nodes.forEach(t=>{t.renderX+=.15*(t.targetX-t.renderX),t.renderY+=.15*(t.targetY-t.renderY),t.renderRadius+=.18*(t.targetRadius-t.renderRadius),Math.abs(t.targetX-t.renderX)<.06&&Math.abs(t.targetY-t.renderY)<.06&&Math.abs(t.targetRadius-t.renderRadius)<.04||(e=!0)}),e}();if(T||e)return ke(),T=!1,void(R=N&&(T||e)?window.requestAnimationFrame(be):0);R=0}function we(){N&&!R&&T&&(R=window.requestAnimationFrame(be))}function Ee(){T=!0,N&&we()}function xe(e){const t=ce(e);t&&(k=e,y=t,pe(),ve(),w=null,C=new Set,S=new Set,y&&(ie(),M=Y,P=B,D=A),T=!0,Ee())}function Ie(e){0===e.button&&(j.down=!0,j.moved=!1,j.startX=e.clientX,j.startY=e.clientY,j.startPanX=P,j.startPanY=D,a.canvas.classList.add("is-panning"))}function Ce(e){if(!j.down){const t=oe(e.clientX,e.clientY);return void ge(t?t.slug:null)}const t=e.clientX-j.startX,n=e.clientY-j.startY;(Math.abs(t)>2||Math.abs(n)>2)&&(j.moved=!0),P=j.startPanX+t,D=j.startPanY+n,Ee()}function Se(e){if(!j.down)return;a.canvas.classList.remove("is-panning");const t=j.moved;if(j.down=!1,j.moved=!1,t)return;const n=oe(e.clientX,e.clientY);if(!n)return pe(),void ve();ue(n.slug),me(n.slug)}function Le(e){if(!a.canvasHost.contains(e.target))return;e.preventDefault();const t=a.canvas.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,s=e.ctrlKey||e.metaKey?.015*e.deltaY:.002*e.deltaY,i=Math.exp(-s);re(M*i,n,r)}function Me(e){if(0===e.touches.length)return;e.preventDefault();const t=a.canvas.getBoundingClientRect();if(1===e.touches.length)\$.active=!0,j.moved=!1,\$.startX1=e.touches[0].clientX,\$.startY1=e.touches[0].clientY,\$.startPanX=P,\$.startPanY=D,a.canvas.classList.add("is-panning");else if(2===e.touches.length){\$.active=!0,j.moved=!1,\$.startX1=e.touches[0].clientX,\$.startY1=e.touches[0].clientY,\$.startX2=e.touches[1].clientX,\$.startY2=e.touches[1].clientY;const n=\$.startX2-\$.startX1,r=\$.startY2-\$.startY1;\$.startDist=Math.sqrt(n*n+r*r),\$.startZoom=M;const a=(\$.startX1+\$.startX2)/2,s=(\$.startY1+\$.startY2)/2,i=a-t.left,o=s-t.top;\$.anchorX=i,\$.anchorY=o}}function Pe(e){if(\$.active)if(e.preventDefault(),1===e.touches.length){const t=e.touches[0].clientX-\$.startX1,n=e.touches[0].clientY-\$.startY1;(Math.abs(t)>2||Math.abs(n)>2)&&(j.moved=!0),P=\$.startPanX+t,D=\$.startPanY+n,Ee()}else if(2===e.touches.length){j.moved=!0;const t=e.touches[0].clientX,n=e.touches[0].clientY,r=e.touches[1].clientX-t,a=e.touches[1].clientY-n,s=Math.sqrt(r*r+a*a);if(\$.startDist>0){const e=s/\$.startDist;re(\$.startZoom*e,\$.anchorX??H/2,\$.anchorY??O/2)}}}function De(e){if(!\$.active)return;e.preventDefault();if("touchcancel"===e.type)return a.canvas.classList.remove("is-panning"),\$.active=!1,\$.anchorX=null,\$.anchorY=null,void(j.moved=!1);if(0===e.touches.length){if(a.canvas.classList.remove("is-panning"),\$.active=!1,\$.anchorX=null,\$.anchorY=null,!j.moved&&1===e.changedTouches.length){const t=oe(e.changedTouches[0].clientX,e.changedTouches[0].clientY);t?(ue(t.slug),me(t.slug)):(pe(),ve())}j.moved=!1}else 1===e.touches.length&&(\$.startX1=e.touches[0].clientX,\$.startY1=e.touches[0].clientY,\$.startPanX=P,\$.startPanY=D)}function Ye(){ge(null)}function Xe(e){if(!N)return;const t=e.target;a.popover.hidden||a.popover.contains(t)||a.canvasHost.contains(t)||ve()}function Be(e){const t=e.target.closest("button[data-action]");if(!t)return;const n=t.dataset.action;n&&("zoom-in"!==n?"zoom-out"!==n?"pan-left"!==n?"pan-right"!==n?"pan-up"!==n?"pan-down"!==n?"reset"===n&&(M=Y,P=B,D=A,pe(),ve(),Ee()):ae(0,52):ae(0,-52):ae(52,0):ae(-52,0):re(M/1.18,.5*H,.5*O):re(1.18*M,.5*H,.5*O))}function Ae(){L&&a.onOpenList(L)}function Ne(){xe(a.workspaceSelect.value)}function Te(){N&&(se(),H<=1||O<=1||(ie(),M=t(M,X,e),Ee()))}function Re(){_||(a.workspaceSelect.addEventListener("change",Ne),_=!0),U||(a.controlsRoot.addEventListener("click",Be),a.popoverOpenButton.addEventListener("click",Ae),U=!0)}return{initGraphView:function(){const e=g.workspaces.length?g.workspaces:[{name:"root",directDependencies:[],directDevDependencies:[]}];a.workspaceSelect.textContent="",e.forEach(e=>{const t=document.createElement("option");t.value=e.name,t.textContent=e.name,a.workspaceSelect.appendChild(t)}),a.workspaceWrap.classList.toggle("hidden",e.length<=1),m.has("root")||1!==e.length||m.set("root",e[0]),k=e[0].name,a.workspaceSelect.value=k,Q(),function(){if(q&&q.disconnect(),q=new MutationObserver(()=>{Q(),Ee()}),q.observe(document.documentElement,{attributes:!0,attributeFilter:["class","data-theme"]}),z&&(z.disconnect(),z=null),K&&(window.removeEventListener("resize",K),K=null),"undefined"!=typeof ResizeObserver)return z=new ResizeObserver(Te),void z.observe(a.canvasHost);K=Te,window.addEventListener("resize",K)}(),Re(),F?(se(),xe(k)):ee()},buildWorkspaceGraph:ce,computeAmplification:le,layoutGraph:de,renderLoop:we,applyFocus:ue,clearFocus:pe,showPopover:me,hidePopover:ve,switchWorkspace:xe,setActive:function(n){if(N=n,N)return F?(!W&&F&&(a.canvas.addEventListener("mousedown",Ie),window.addEventListener("mousemove",Ce),window.addEventListener("mouseup",Se),a.canvas.addEventListener("wheel",Le,{passive:!1}),a.canvas.addEventListener("touchstart",Me,{passive:!1}),window.addEventListener("touchmove",Pe,{passive:!1}),window.addEventListener("touchend",De,{passive:!1}),window.addEventListener("touchcancel",De,{passive:!1}),a.canvas.addEventListener("mouseleave",Ye),document.addEventListener("mousedown",Xe),W=!0),se(),H>1&&O>1&&(ie(),M=t(M,X,e)),we(),void Ee()):void ee();W&&(a.canvas.removeEventListener("mousedown",Ie),window.removeEventListener("mousemove",Ce),window.removeEventListener("mouseup",Se),a.canvas.removeEventListener("wheel",Le),a.canvas.removeEventListener("touchstart",Me),window.removeEventListener("touchmove",Pe),window.removeEventListener("touchend",De),window.removeEventListener("touchcancel",De),a.canvas.removeEventListener("mouseleave",Ye),document.removeEventListener("mousedown",Xe),a.canvas.classList.remove("is-panning"),j.down=!1,j.moved=!1,\$.active=!1,\$.anchorX=null,\$.anchorY=null,W=!1),R&&(window.cancelAnimationFrame(R),R=0)},requestRender:Ee}}const m={permissive:["MIT","ISC","BSD-2-Clause","BSD-3-Clause","Apache-2.0","Unlicense","0BSD","CC0-1.0","BSD","Apache","Apache 2.0","Apache License 2.0","MIT License","ISC License"],weakCopyleft:["LGPL-2.1","LGPL-3.0","LGPL-2.0","LGPL","MPL-2.0","MPL-1.1","MPL","EPL-1.0","EPL-2.0","EPL"],strongCopyleft:["GPL-2.0","GPL-3.0","GPL","AGPL-3.0","AGPL","GPL-2.0-only","GPL-3.0-only","GPL-2.0-or-later","GPL-3.0-or-later"]},v={"network-access":"Accesses the network during install","dynamic-exec":"Uses dynamic execution","child-process":"Spawns child processes",encoding:"Uses encoding/decoding logic",obfuscated:"Contains obfuscated/minified install logic","reads-env":"Reads environment variables","reads-home":"Reads user home directory","uses-ssh":"Uses SSH configuration/keys"};function f(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function y(e){const t=e.compliance.license,n=t.declared?.valid?t.declared.spdxId:void 0,r=t.inferred?.spdxId;return n?{value:n,isInferred:!1}:r?{value:r,isInferred:!0}:{value:"Unknown",isInferred:!1}}function k(e){const t=e.security;if(t?.summary)return{summary:t.summary,advisories:t.advisories};if(t?.vulnerabilities){const e=t.vulnerabilities;return{summary:{critical:Number(e.critical||0),high:Number(e.high||0),moderate:Number(e.moderate||0),low:Number(e.low||0),highest:e.highest||"none",risk:t.vulnRisk||t.risk||"green"},advisories:t.advisories}}return{summary:{critical:0,high:0,moderate:0,low:0,highest:"none",risk:"green"},advisories:t?.advisories}}function b(e){return e?.highest||"none"}function w(e){return e&&e.risk||"green"}const E={permissive:"green",weakCopyleft:"amber",strongCopyleft:"red",unknown:"gray"},x={none:0,low:1,moderate:2,high:3,critical:4},I=[{id:"type",label:"Type",sortKey:"type",getValue:e=>e.usage.direct?"Dependency":"Sub-Dependency",getTone:e=>e.usage.direct?"green":"amber",sortFn:(e,t)=>e.usage.direct===t.usage.direct?0:e.usage.direct?-1:1},{id:"scope",label:"Scope",sortKey:"scope",getValue:e=>{return"runtime"===(t=e.usage.scope)?"Runtime":"dev"===t?"Dev":"optional"===t?"Optional":"peer"===t?"Peer":t;var t},getTone:e=>"runtime"===e.usage.scope?"green":"dev"===e.usage.scope||"optional"===e.usage.scope?"amber":"gray",sortFn:(e,t)=>e.usage.scope.localeCompare(t.usage.scope)},{id:"license",label:"License",sortKey:"license",getValue:e=>{const t=y(e),n=t.isInferred?\`\${t.value} (inferred)\`:t.value;return"mismatch"===e.compliance.license.status?\`\${n} *\`:n},getTone:e=>{const t=function(e){if(!e)return"unknown";const t=e.toUpperCase();for(const[n,r]of Object.entries(m))if(r.some(e=>t.includes(e.toUpperCase())))return n;return"unknown"}(y(e).value);return E[t]},sortFn:(e,t)=>{const n=y(e).value,r=y(t).value;return n.localeCompare(r)}},{id:"vulns",label:"Vulnerabilities",sortKey:"severity",getValue:e=>f(b(k(e).summary)),getTone:e=>k(e).summary.risk,sortFn:(e,t)=>x[b(k(t).summary)]-x[b(k(e).summary)]},{id:"install",label:"Install",sortKey:"install",getValue:e=>{return(t=e.execution)?f(t.risk||"low"):"Low";var t},getTone:e=>w(e.execution),sortFn:(e,t)=>{const n={green:0,amber:1,red:2},r=w(e.execution),a=w(t.execution);return n[r]-n[a]}}],C=I.length;function S(e){const t=e.compliance.license,n=t.declared?.valid?t.declared.spdxId:void 0,r=t.inferred?.spdxId;return n?{value:n,isInferred:!1}:r?{value:r,isInferred:!0}:{value:"Unknown",isInferred:!1}}function L(e){switch(e){case"declared-only":return"Declared";case"inferred-only":return"Inferred";case"match":return"Declared + Inferred (match)";case"mismatch":return"Declared + Inferred (mismatch)";case"invalid-spdx":return"Invalid SPDX";default:return"Unknown"}}const M={none:0,low:1,moderate:2,high:3,critical:4};function P(e){const t=e.security;if(t?.summary)return{summary:t.summary,advisories:t.advisories};if(t?.vulnerabilities){const e=t.vulnerabilities;return{summary:{critical:Number(e.critical||0),high:Number(e.high||0),moderate:Number(e.moderate||0),low:Number(e.low||0),highest:e.highest||"none",risk:t.vulnRisk||t.risk||"green"},advisories:t.advisories}}return{summary:{critical:0,high:0,moderate:0,low:0,highest:"none",risk:"green"},advisories:t?.advisories}}function D(e){return e?String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}function Y(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function X(e){return e.split(/[\\s-_]+/).map(e=>e?Y(e):e).join(" ")}function B(e){return I.map(t=>{return n=t.label,r=t.getValue(e),'<div class="badge-card '+t.getTone(e)+'"><span class="badge-label">'+D(n)+'</span><span class="badge-value">'+D(r)+"</span></div>";var n,r}).join("")}function A(e,t){const n=I.map(n=>function(e,t,n,r){const a=n===e,s=a?r?" ▲":" ▼":"",i=a?r?" sorted-asc":" sorted-desc":"";return'<button type="button" class="column-header'+(a?" sorted":"")+i+'" data-sort="'+D(e)+'"><span class="column-header-label">'+D(t)+'</span><span class="sort-indicator">'+s+"</span></button>"}(n.sortKey,n.label,e,t)).join("");return'<div class="column-headers" style="--column-count: '+C+'">'+n+"</div>"}function N(e,t,n){let r='<div class="kv-item">';return r+='<span class="kv-label">'+D(e)+"</span>",r+='<span class="kv-value">'+D(String(t))+"</span>",n&&(r+='<span class="kv-hint">'+D(n)+"</span>"),r+="</div>",r}function T(e,t){return'<span class="kv-value risk-value"><span class="risk-dot '+t+'"></span>'+D(String(e))+"</span>"}function R(e,t,n){let r='<div class="kv-item">';return r+='<span class="kv-label">'+D(e)+"</span>",r+=t,r+="</div>",r}function V(e,t){if(!e||0===e.length)return'<span class="kv-value">None</span>';const n=e.slice(0,t),r=e.length-t;let a='<div class="package-list">';return n.forEach(e=>{a+='<span class="package-tag">'+D(e)+"</span>"}),r>0&&(a+='<span class="package-tag">+'+r+" more</span>"),a+="</div>",a}function H(e,t,n,r){if(!e||0===e.length)return'<span class="kv-value">None</span>';const a=e.slice(0,t),s=e.length-t;let i='<div class="package-list">';return a.forEach(e=>{const t=U(e,n,r);i+=t?'<a class="package-tag package-tag-link root-package-link" href="#'+D(G(t))+'" data-dep-key="'+D(t)+'" aria-label="Jump to dependency '+D(t)+'">'+D(e)+"</a>":'<span class="package-tag">'+D(e)+"</span>"}),s>0&&(i+='<span class="package-tag">+'+s+" more</span>"),i+="</div>",i}function O(e,t){return e+"@"+t}const j=new WeakMap;function \$(e){const t=e.lastIndexOf("@npm:");if(t>0)return{name:e.slice(0,t),version:e.slice(t+1)};const n=e.lastIndexOf("@");return n<=0?null:{name:e.slice(0,n),version:e.slice(n+1)}}function G(e){return\`dep-\${e}\`}function F(e){const t=j.get(e);if(t)return t;const n=new Map;return e.forEach(e=>{const t=\$(e);if(!t)return;const r=n.get(t.name)||[];r.push(e),n.set(t.name,r)}),j.set(e,n),n}function W(e,t,n){const r=((n||F(t)).get(e)||[]).filter(e=>t.has(e));return 1===r.length?r[0]:null}function U(e,t,n){if(t.has(e))return e;const r=\$(e);if(!r)return W(e,t,n);if(r.version.startsWith("npm:")){const e=r.version.slice(4),n=r.name+(e.startsWith("@")?e:"@"+e);if(t.has(n))return n}return W(r.name,t,n)}function _(e,t,n,r){if(!e||0===e.length)return'<span class="kv-value">None</span>';const a=e.slice(0,t),s=e.length-t;let i='<div class="package-list">';return a.forEach(e=>{if("string"==typeof e){const t=U(e,n,r);return t?void(i+='<a class="package-tag package-tag-link root-package-link" href="#'+D(G(t))+'" data-dep-key="'+D(t)+'" aria-label="Jump to dependency '+D(t)+'">'+D(e)+"</a>"):void(i+='<span class="package-tag">'+D(e)+"</span>")}const t=O(e.name,e.version),a=e.name+"@"+e.version,s=U(t,n,r);i+=s?'<a class="package-tag package-tag-link root-package-link" href="#'+D(G(s))+'" data-dep-key="'+D(s)+'" aria-label="Jump to dependency '+D(s)+'">'+D(a)+"</a>":'<span class="package-tag">'+D(a)+"</span>"}),s>0&&(i+='<span class="package-tag">+'+s+" more</span>"),i+="</div>",i}function q(e,t,n){const r=e.graph.subDeps;if(!r)return"";const a=[{title:"Dependencies",key:"dep"},{title:"Optional",key:"opt"},{title:"Peer",key:"peer"},{title:"Dev Dependencies",key:"dev"}];let s=0,i=0;for(const l of a){const e=r[l.key];if(e)for(const t of Object.values(e))s+=1,t[1]&&(i+=1)}if(0===s)return"";const o='<div class="declared-summary">Total: '+s+" • Installed: "+i+" • Not installed: "+(s-i)+"</div>",c=a.map(e=>{const a=r[e.key];if(!a||0===Object.keys(a).length)return"";let s=0,i=0;const o=Object.entries(a).sort(([e],[t])=>e.localeCompare(t)).map(([e,[r,a]])=>{s+=1,a&&(i+=1);const o='<div class="declared-name">'+D(e)+"</div>",c='<div class="declared-range">'+D(r)+"</div>",l=a?function(e,t,n){const r=U(e,t,n);return r?'<a class="status-pill installed root-package-link" href="#'+D(G(r))+'" data-dep-key="'+D(r)+'" aria-label="Jump to dependency '+D(r)+'">Installed</a>':'<span class="status-pill installed">Installed</span>'}(a,t,n):'<span class="status-pill missing">Not installed</span>';return'<div class="declared-row">'+o+c+l+"</div>"}),c=i+" of "+s+" installed";return['<details class="declared-group">','<summary class="declared-group-summary"><span class="expand-icon" aria-hidden="true"></span><span class="declared-group-title">'+D(e.title)+' <span class="declared-count">('+c+")</span></span></summary>",'<div class="declared-table">'+o.join("")+"</div>","</details>"].join("")}).filter(Boolean);return z("Declared Dependencies","Dependencies declared by this package",o+'<div class="declared-deps">'+c.join("")+"</div>")}function z(e,t,n){let r='<div class="section">';return r+='<div class="section-header">',r+='<span class="section-title">'+D(e)+"</span>",t&&(r+='<span class="section-desc">'+D(t)+"</span>"),r+="</div>",r+=n,r+="</div>",r}function K(e,t,n,r){let a='<div class="subsection'+(r?" "+r:"")+'">';return a+='<div class="subsection-header">',a+='<span class="subsection-title">'+D(e)+"</span>",n&&(a+='<span class="subsection-desc">'+D(n)+"</span>"),a+="</div>",a+=t,a+="</div>",a}function J(e){if(!e)return;const t=e.trim();if(!t)return;const n=e=>e.replace(/\\.git\$/i,"");if(/^https?:\\/\\//i.test(t))return n(t);if(/^git\\+https?:\\/\\//i.test(t))return n(t.replace(/^git\\+/,""));if(/^git:\\/\\/github\\.com\\//i.test(t))return n(t.replace(/^git:\\/\\//i,"https://"));if(/^github:/i.test(t)){const e=t.slice(7).replace(/^\\/+/,"");return e?\`https://github.com/\${n(e)}\`:void 0}if(/^git@github\\.com:/i.test(t)){const e=t.slice(15);return e?\`https://github.com/\${n(e)}\`:void 0}return/^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+\$/.test(t)?\`https://github.com/\${n(t)}\`:void 0}function Z(e,t){const n=J(e);if(!n)return;let r;try{r=new URL(n)}catch{return}if("github.com"!==r.hostname.toLowerCase())return;const a=r.pathname.split("/").filter(Boolean);if(a.length<2)return;const s=a[0],i=a[1].replace(/\\.git\$/i,"");return s&&i?\`https://github.com/\${s}/\${i}/blob/HEAD/\${t}\`:void 0}function Q(e,t){return t?D(e)+' <a class="kv-inline-link" href="'+D(t)+'" target="_blank" rel="noopener noreferrer">GitHub<svg class="kv-inline-link-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M7 17 17 7"/><path d="M9 7h8v8"/></svg></a>':D(e)}function ee(e){const t='<svg viewBox="0 0 24 24" fill="currentColor"><path d="M0 7.334v8h6.666v1.332H12v-1.332h12v-8H0zm6.666 6.664H5.334v-4H3.999v4H1.335V8.667h5.331v5.331zm4 0v1.336H8.001V8.667h5.334v5.332h-2.669v-.001zm12.001 0h-1.33v-4h-1.336v4h-1.335v-4h-1.33v4h-2.671V8.667h8.002v5.331zM10.665 10H12v2.667h-1.335V10z"/></svg>',n='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/></svg>',r='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',a='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>';if(!(e.npm||e.repository||e.homepage||e.issues))return"";let s='<div class="package-links">';return e.npm&&(s+='<a href="'+D(e.npm)+'" target="_blank" rel="noopener" class="package-link">'+t+"npm</a>"),e.repository&&(s+='<a href="'+D(e.repository)+'" target="_blank" rel="noopener" class="package-link">'+n+"Repository</a>"),e.homepage&&(s+='<a href="'+D(e.homepage)+'" target="_blank" rel="noopener" class="package-link">'+a+"Homepage</a>"),e.issues&&(s+='<a href="'+D(e.issues)+'" target="_blank" rel="noopener" class="package-link">'+r+"Issues</a>"),s+="</div>",s}function te(e){const t=function(e,t){const n=[e.risk,t];return n.includes("red")?"red":n.includes("amber")?"amber":"green"}(P(e).summary,e.compliance.licenseRisk),n=O(e.package.name,e.package.version),r=G(n),a=B(e),s=['<summary class="dep-summary">','<span class="expand-icon" aria-hidden="true"></span>','<span class="dep-name">'+D(e.package.name)+'<span class="dep-version">@'+D(e.package.version)+"</span></span>",'<div class="dep-indicators" style="--column-count: '+C+'">',a,"</div>","</summary>"].join("");return['<details class="dep-card" data-risk="'+t+'" data-dep-key="'+D(n)+'" id="'+D(r)+'">',s,'<div class="dep-details" data-rendered="false"></div>',"</details>"].join("")}function ne(e,t,n){const r=P(e),a=r.summary,s=S(e),i=s.isInferred?\`\${s.value} (inferred)\`:s.value,o=function(e){const t=e.package?.links||{},n=e.links||{},r=J(t.repository||n.repository||n.repo);return{npm:t.npm||n.npm,repository:r||t.repository||n.repository||n.repo,homepage:t.homepage||n.homepage,issues:t.bugs||t.issues||n.bugs||n.issues}}(e),c=JSON.stringify(e,null,2),l=[e.usage.direct?"Direct dependency":"Indirect dependency (transitive)","Scope: "+(d=e.usage.scope,"runtime"===d?"Runtime":"dev"===d?"Dev":"optional"===d?"Optional":"peer"===d?"Peer":d)];var d;e.package.description&&l.unshift("Description: "+e.package.description),e.usage.origins.workspaces?.length&&l.push("Used in "+e.usage.origins.workspaces.length+" workspaces"),e.usage.importUsage&&l.push("Imported in "+e.usage.importUsage.fileCount+" project files"),e.usage.introduction&&l.push("Introduced by: "+X(e.usage.introduction)),l.length<3&&l.push("Dependency depth: "+e.usage.depth);var u,p;const h=z("Overview","Summary and key context",'<div class="micro-summary">'+l.slice(0,5).map(e=>'<div class="micro-line">'+D(e)+"</div>").join("")+"</div>"+(e.usage.origins.workspaces?.length?'<div class="micro-sublist"><div class="micro-subtitle">Workspaces</div>'+V(e.usage.origins.workspaces,8)+"</div>":"")+('<div class="section-block"><div class="block-title">Key context</div><div class="kv-grid kv-grid-tight">'+[e.usage.runtimeImpact?N("Runtime impact",(p=e.usage.runtimeImpact,p?X(p):"")):"",N("Dependency depth",e.usage.depth),R("Introduced via root packages",_(e.usage.origins.topRootPackages,8,t,n)),N("Direct roots",e.usage.origins.rootPackageCount),R("Direct parents",H(e.usage.origins.topParentPackages,8,t,n)),N("Direct parents count",e.usage.origins.parentPackageCount??0),N("TypeScript types",(u=e.usage.tsTypes,"bundled"===u?"Bundled":"definitelyTyped"===u?"DefinitelyTyped":"none"===u?"None":"Unknown"))].filter(Boolean).join("")+"</div></div>")+function(e,t,n,r){if(!t||0===t.length)return"";const a=t.slice(0,n),s=t.length-n;let i='<div class="detail-list">';return i+='<div class="detail-title">'+D(e)+"</div>",i+='<ul class="detail-items '+r+'">',a.forEach(e=>{i+='<li class="detail-item">'+D(e)+"</li>"}),s>0&&(i+='<li class="detail-item muted">+'+s+" more</li>"),i+="</ul></div>",i}("Top import locations",e.usage.importUsage?.topFiles,5,"mono")),g=e.compliance.license,m=Z(o.repository,"package.json"),f=Z(o.repository,"LICENSE"),y=[R("Primary license",T(i,e.compliance.licenseRisk)),N("Status",L(g.status))];if(g.declared){const e=[g.declared.valid?"valid":"invalid",g.declared.expression?"expression":void 0,g.declared.deprecated?"deprecated":void 0].filter(Boolean).join(", "),t=g.exception?.id?\` WITH \${g.exception.id}\`:"";y.push(R("Declared SPDX in package.json",'<span class="kv-value">'+Q(\`\${g.declared.spdxId}\${t}\${e?\` (\${e})\`:""}\`,m)+"</span>"))}g.inferred&&y.push(R("Inferred from LICENSE file",'<span class="kv-value">'+Q(\`\${g.inferred.spdxId} (\${g.inferred.confidence})\`,f)+"</span>")),"mismatch"===g.status&&y.push(N("Mismatch","Declared SPDX and LICENSE text do not match")),"invalid-spdx"===g.status&&y.push(N("Invalid SPDX","Package.json license is not a valid SPDX identifier or expression"));const k=K("License",'<div class="kv-grid">'+y.join("")+"</div>"),b=a.critical+a.high+a.moderate+a.low,w=[R("Known vulnerabilities",T(0===b?"None":String(b),a.risk)),N("Highest severity","none"===a.highest?"None":X(a.highest))],E=b>0?'<div class="kv-grid kv-grid-tight">'+[N("Critical",a.critical),N("High",a.high),N("Moderate",a.moderate),N("Low",a.low)].join("")+"</div>":"",x=function(e){if(!e||0===e.length)return"";let t='<table class="vuln-table"><thead><tr>';return t+="<th>Title</th><th>Severity</th><th>Affected range</th><th>Fix available</th><th>Reference</th>",t+="</tr></thead><tbody>",e.forEach(e=>{const n=D(e.title),r=e.url?'<a href="'+D(e.url)+'" target="_blank" rel="noopener">Link</a>':"";t+='<tr data-severity="'+D(e.severity)+'">',t+='<td data-label="Title">'+n+"</td>",t+='<td data-label="Severity">'+D(Y(e.severity))+"</td>",t+='<td data-label="Affected range">'+D(e.vulnerableRange)+"</td>",t+='<td data-label="Fix available">'+D(e.fixAvailable?"Yes":"No")+"</td>",t+='<td data-label="Reference">'+r+"</td>",t+="</tr>"}),t+="</tbody></table>",t}(r.advisories),I=z("Risk & Compliance","License, vulnerabilities, and install-time execution signals",k+K("VULNERABILITIES",['<div class="section-note">Based on npm audit findings (known disclosed issues).</div>','<div class="kv-grid">'+w.join("")+"</div>",E?'<div class="subtle-divider"></div>'+E:"",x?'<div class="subtle-divider"></div>'+x:""].join(""),"Known security issues from npm audit","vuln-block")+(e.execution?function(e){const t=[R("Execution risk",T((n=e.risk,"red"===n?"High":"amber"===n?"Medium":"Low"),e.risk))];var n;if(e.native&&t.push(N("Native build tooling detected (native)","Yes")),e.scripts?.hooks?.length&&t.push(R("Lifecycle hooks",V(e.scripts.hooks,6))),"number"==typeof e.scripts?.complexity&&t.push(N("Heuristic complexity","Script complexity: "+e.scripts.complexity+" (complexity)")),e.scripts?.signals?.length){const n=e.scripts.signals.map(e=>\`\${v[e]} (\${e})\`);t.push(R("Install-time signals",V(n,6)))}return K("Install-time execution behaviour",'<div class="section-note">Install-time behaviour signals detected. These describe code that runs automatically during install and may warrant review in security-sensitive environments.</div><div class="kv-grid">'+t.join("")+"</div>")}(e.execution):"")),C=[N("Outdated status",(M=e.upgrade.outdatedStatus,M?"unknown"===M?"Unknown":X(M):"Not reported"))];var M;e.upgrade.latestVersion&&C.push(N("Latest version",e.upgrade.latestVersion));const B=K("Version",'<div class="section-note">Based on npm outdated findings.</div><div class="kv-grid">'+C.join("")+"</div>"),A=e.package.deprecated?K("Deprecated",'<div class="kv-grid">'+N("Deprecated","Yes","Declared by the package author.")+"</div>",void 0,"warning"):"",O=[N("Node engine constraint",e.upgrade.nodeEngine||"Any")];void 0!==e.upgrade.blocksNodeMajor&&O.push(N("Blocks Node major upgrade",e.upgrade.blocksNodeMajor?"Yes":"No"));const j=K("Constraints",'<div class="kv-grid">'+O.join("")+"</div>"),\$=K("Blast radius",'<div class="kv-grid">'+[N("Used by other packages (fanIn)",e.graph.fanIn),N("Depends on packages (fanOut)",e.graph.fanOut)].join("")+"</div>"),G={nodeEngine:"Node engine constraint",peerDependency:"Peer dependency constraints",nativeBindings:"Native bindings/build tooling",installScripts:"Install lifecycle scripts",deprecated:"Deprecated by author"},F=z("Upgrade & Change Impact","Currency, constraints, and blast radius",B+A+j+\$+(e.upgrade.blockers?.length?'<div class="subsection"><div class="subsection-header"><span class="subsection-title">Upgrade blockers</span></div><ul class="bullet-list">'+e.upgrade.blockers.map(e=>"<li>"+D(G[e]||e)+"</li>").join("")+"</ul></div>":"")),W=q(e,t,n);return[ee(o),h,I,F,W,'<details class="raw-data-toggle"><summary><span class="expand-icon" aria-hidden="true"></span>View raw data</summary><div class="raw-data-pane"><pre>'+D(c)+'</pre><button type="button" class="copy-json-btn" aria-label="Copy raw JSON">Copy JSON</button></div></details>'].join("")}async function re(){const e=await async function(){const e=document.getElementById("radar-data");return e&&e.textContent&&"{}"!==e.textContent.trim()?JSON.parse(e.textContent):(await fetch("./sample-data.json")).json()}();void 0===window.__DEPENDENCY_DATA__&&(window.__DEPENDENCY_DATA__=e);const t=document.getElementById("dependency-list"),n=document.getElementById("results-summary"),r=function(e){const t="string"==typeof e&&e.trim().length>0?e.trim():"unknown";return\`https://dependency-radar.com/next-steps?source=standalone-report&cli=\${encodeURIComponent(t)}\`}(e.dependencyRadarVersion),a=document.getElementById("project-path");a&&(a.textContent=e.project.projectDir);const s=document.getElementById("cta-primary-link"),i=document.getElementById("cta-secondary-link");s&&(s.href=r),i&&(i.href=r);const o=document.getElementById("git-branch-item"),c=document.getElementById("git-branch");e.git?.branch&&e.git.branch&&o&&c&&(c.textContent=e.git.branch,o.style.display="");const l=document.getElementById("node-item"),d=document.getElementById("node-version"),u=document.getElementById("node-disclaimer");if(e.environment&&l&&d){const t=e.environment.runtimeVersion?.replace(/^v/,"")||"unknown",n=e.environment.minRequiredMajor;d.textContent=t+(n&&n>0?\` (requires ≥\${n})\`:""),l.style.display="",n&&n>0&&u&&(u.textContent="Node requirement derived from dependency engine ranges.",u.style.display="")}const p=document.getElementById("formatted-date");if(p&&e.generatedAt)try{const t=new Date(e.generatedAt),n=new Intl.DateTimeFormat(void 0,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"}).format(t);p.textContent=n}catch{p.textContent=e.generatedAt}const h={search:document.getElementById("search"),direct:document.getElementById("direct-filter"),runtime:document.getElementById("runtime-filter"),sort:document.getElementById("sort-by"),sortDirection:document.getElementById("sort-direction"),hasVulns:document.getElementById("has-vulns"),themeSwitch:document.getElementById("theme-switch"),licenseToggle:document.getElementById("license-toggle"),licensePanel:document.getElementById("license-panel"),licensePermissive:document.getElementById("license-permissive"),licenseWeakCopyleft:document.getElementById("license-weak-copyleft"),licenseStrongCopyleft:document.getElementById("license-strong-copyleft"),licenseUnknown:document.getElementById("license-unknown"),licenseAll:document.getElementById("license-all"),licenseFriendly:document.getElementById("license-friendly"),filtersToggle:document.getElementById("filters-toggle"),filterControls:document.getElementById("filter-controls"),columnHeadersContainer:document.getElementById("column-headers-container"),packageHeader:document.getElementById("package-header"),viewGraphButton:document.getElementById("view-graph-btn"),graphBackButton:document.getElementById("graph-back-btn"),listViewPanel:document.getElementById("list-view"),graphViewPanel:document.getElementById("graph-view"),graphWorkspaceSelect:document.getElementById("graph-workspace"),graphWorkspaceWrap:document.getElementById("graph-workspace-wrap"),graphControls:document.getElementById("graph-controls"),graphCanvas:document.getElementById("graph-canvas"),graphCanvasShell:document.getElementById("graph-canvas-shell"),graphPopover:document.getElementById("graph-popover"),graphPopoverName:document.getElementById("graph-popover-name"),graphPopoverVersion:document.getElementById("graph-popover-version"),graphPopoverLicense:document.getElementById("graph-popover-license"),graphPopoverVulns:document.getElementById("graph-popover-vulns"),graphPopoverAmplification:document.getElementById("graph-popover-amplification"),graphOpenList:document.getElementById("graph-open-list"),reportFooter:document.querySelector(".report-footer")};let v="name",f=!0,y=null,k=!1;document.documentElement.setAttribute("data-theme","dark");"light"===localStorage.getItem("dependency-radar-theme")?(document.documentElement.classList.add("light"),h.themeSwitch.classList.add("light"),document.documentElement.setAttribute("data-theme","light")):(document.documentElement.classList.remove("light"),h.themeSwitch.classList.remove("light"),document.documentElement.setAttribute("data-theme","dark")),h.themeSwitch.addEventListener("click",()=>{document.documentElement.classList.toggle("light"),h.themeSwitch.classList.toggle("light");const e=document.documentElement.classList.contains("light");document.documentElement.setAttribute("data-theme",e?"light":"dark"),localStorage.setItem("dependency-radar-theme",e?"light":"dark"),y?.requestRender()});const b=window.matchMedia("(max-width: 768px)");let w=b.matches;const E=e=>{h.filterControls&&h.filtersToggle&&(h.filterControls.classList.toggle("open",e),h.filtersToggle.classList.toggle("open",e),h.filtersToggle.setAttribute("aria-expanded",String(e)))},x=()=>{if(b.matches)return E(!1),h.licensePanel.classList.add("open"),h.licenseToggle.classList.add("open"),void(w=!0);w&&(E(!1),h.licensePanel.classList.remove("open"),h.licenseToggle.classList.remove("open")),w=!1};function C(){if(h.columnHeadersContainer&&(h.columnHeadersContainer.innerHTML=A(v,f)),h.packageHeader){const e=h.packageHeader.querySelector(".sort-indicator");e&&("name"===v?(e.textContent=f?" ▲":" ▼",h.packageHeader.classList.add("sorted")):(e.textContent="",h.packageHeader.classList.remove("sorted")))}}function L(e){const t=e.target.closest(".column-header");if(!t)return;const n=t.dataset.sort;n&&(v===n?f=!f:(v=n,f=!0),h.sort&&(h.sort.value=v,h.sortDirection.textContent=f?"↑":"↓"),C(),W())}h.licenseToggle.addEventListener("click",()=>{b.matches||(h.licenseToggle.classList.toggle("open"),h.licensePanel.classList.toggle("open"))}),h.filtersToggle&&h.filterControls&&h.filtersToggle.addEventListener("click",()=>{const e=!h.filterControls.classList.contains("open");E(e)}),window.addEventListener("resize",x),x(),h.sortDirection.addEventListener("click",()=>{f=!f,h.sortDirection.textContent=f?"↑":"↓",C(),W()}),h.sort.addEventListener("change",()=>{v=h.sort.value,C(),W()}),h.columnHeadersContainer&&h.columnHeadersContainer.addEventListener("click",L),h.packageHeader&&h.packageHeader.addEventListener("click",L),C(),h.licenseAll.addEventListener("click",()=>{h.licensePermissive.checked=!0,h.licenseWeakCopyleft.checked=!0,h.licenseStrongCopyleft.checked=!0,h.licenseUnknown.checked=!0,T.clear(),W()}),h.licenseFriendly.addEventListener("click",()=>{h.licensePermissive.checked=!0,h.licenseWeakCopyleft.checked=!1,h.licenseStrongCopyleft.checked=!1,h.licenseUnknown.checked=!1,T.clear(),W()});const D=Object.values(e.dependencies||{}),Y=new Map;D.forEach(e=>{Y.set(O(e.package.name,e.package.version),e)});const X=new Set(Y.keys()),B=F(X),N=new Set,T=new Set,R=new Map,V=(()=>{const e=document.getElementById("copy-announcer");if(e)return e;const t=document.createElement("div");return t.id="copy-announcer",t.className="sr-only",t.setAttribute("aria-live","polite"),document.body.appendChild(t),t})();function H(e){const t=e.dataset.depKey;if(!t)return;const n=e.querySelector(".dep-details");if(!n||"true"===n.dataset.rendered)return;const r=Y.get(t);r&&(n.setAttribute("aria-busy","true"),n.innerHTML=['<div class="dep-loading" role="presentation">','<div class="dep-loading-bar"></div>',"</div>"].join(""),requestAnimationFrame(()=>{n.innerHTML=ne(r,X,B),n.dataset.rendered="true",n.removeAttribute("aria-busy")}))}function j(){const e=(h.search.value||"").toLowerCase(),t=h.direct.value,n=h.runtime.value,r=h.hasVulns.checked,a=h.licensePermissive.checked,s=h.licenseWeakCopyleft.checked,i=h.licenseStrongCopyleft.checked,o=h.licenseUnknown.checked;return D.filter(c=>{const l=O(c.package.name,c.package.version);if(T.has(l))return!0;const d=S(c),u=[d.value,c.compliance.license.declared?.spdxId,c.compliance.license.inferred?.spdxId].filter(Boolean).join(" ").toLowerCase();if(e&&!c.package.name.toLowerCase().includes(e)&&!u.includes(e))return!1;if("direct"===t&&!c.usage.direct)return!1;if("transitive"===t&&c.usage.direct)return!1;if("all"!==n&&c.usage.scope!==n)return!1;if(r&&0===M[(p=P(c).summary,p?.highest||"none")])return!1;var p;const h=function(e){if(!e)return"unknown";const t=e.toUpperCase();for(const[n,r]of Object.entries(m))if(r.some(e=>t.includes(e.toUpperCase())))return n;return"unknown"}(d.value);return!("permissive"===h&&!a)&&(!("weakCopyleft"===h&&!s)&&(!("strongCopyleft"===h&&!i)&&!("unknown"===h&&!o)))})}function W(){const r=function(e){const t=[...e];if("name"===v)t.sort((e,t)=>e.package.name.localeCompare(t.package.name));else if("depth"===v)t.sort((e,t)=>e.usage.depth-t.usage.depth);else{const e=I.find(e=>e.sortKey===v||e.id===v);e?.sortFn?t.sort(e.sortFn):e&&t.sort((t,n)=>e.getValue(t).localeCompare(e.getValue(n)))}return f||t.reverse(),t}(j()),a=e.summary?.dependencyCount||D.length;n.innerHTML="Showing <strong>"+r.length+"</strong> of <strong>"+a+"</strong> dependencies",0!==r.length?(t.innerHTML=r.map(te).join(""),R.clear(),t.querySelectorAll("details.dep-card").forEach(e=>{const t=e.dataset.depKey;t&&R.set(t,e)}),N.forEach(e=>{const t=R.get(e);t&&(t.open||(t.open=!0),H(t))})):t.innerHTML='<div class="empty-state"><div class="empty-state-icon">📦</div><div class="empty-state-text">No dependencies match your filters</div></div>'}function U(e){const t=B.get(e)||[];return 1===t.length?t[0]:null}function _(e){if(Y.has(e))return e;const t=\$(e);if(!t)return U(e);if(t.version.startsWith("npm:")){const e=t.version.slice(4),n=t.name+(e.startsWith("@")?e:"@"+e);if(Y.has(n))return n}return U(t.name)}function q(t){if(!h.listViewPanel||!h.graphViewPanel)return void console.warn("Dependency Radar: view panels are missing from the report DOM.");const n="list"===t;n||Boolean(h.graphWorkspaceSelect&&h.graphWorkspaceWrap&&h.graphControls&&h.graphCanvas&&h.graphCanvasShell&&h.graphPopover&&h.graphPopoverName&&h.graphPopoverVersion&&h.graphPopoverLicense&&h.graphPopoverVulns&&h.graphPopoverAmplification&&h.graphOpenList)?(h.listViewPanel.classList.toggle("active",n),h.graphViewPanel.classList.toggle("active",!n),h.listViewPanel.setAttribute("aria-hidden",String(!n)),h.graphViewPanel.setAttribute("aria-hidden",String(n)),h.viewGraphButton&&(h.viewGraphButton.style.display=n?"":"none"),h.graphBackButton&&(h.graphBackButton.style.display=n?"none":""),h.reportFooter?.classList.toggle("hidden",!n),document.body.classList.toggle("graph-mode",!n),n?y?.setActive(!1):(k||(y=g({report:e,knownDepKeys:X,resolveDepKey:_,workspaceSelect:h.graphWorkspaceSelect,workspaceWrap:h.graphWorkspaceWrap,controlsRoot:h.graphControls,canvas:h.graphCanvas,canvasHost:h.graphCanvasShell,popover:h.graphPopover,popoverName:h.graphPopoverName,popoverVersion:h.graphPopoverVersion,popoverLicense:h.graphPopoverLicense,popoverVulns:h.graphPopoverVulns,popoverAmplification:h.graphPopoverAmplification,popoverOpenButton:h.graphOpenList,onOpenList:e=>{!function(e){q("list");let t=document.getElementById(G(e));!t&&Y.has(e)&&(T.add(e),W(),t=document.getElementById(G(e)));if(!t)return;if(t instanceof HTMLDetailsElement){const e=t.dataset.depKey;e&&N.add(e),t.open||(t.open=!0),H(t)}t.classList.add("dep-list-highlight"),t.scrollIntoView({behavior:"smooth",block:"center"}),window.setTimeout(()=>{t?.classList.remove("dep-list-highlight")},2e3)}(e)}}),y.initGraphView(),k=!0),y?.setActive(!0),y?.requestRender())):console.warn("Dependency Radar: graph view DOM nodes are missing; graph view disabled.")}const z=[h.search,h.direct,h.runtime,h.sort,h.hasVulns,h.licensePermissive,h.licenseWeakCopyleft,h.licenseStrongCopyleft,h.licenseUnknown],K=()=>{T.clear(),W()};function J(e){const t=e.getAttribute("data-dep-key");if(!t)return;const n=_(t);if(!n)return;let r=R.get(n);if(r||(T.add(n),W(),r=R.get(n)),!r)return;N.add(n),r.open||(r.open=!0),H(r);const a=()=>{r.scrollIntoView({behavior:"smooth",block:"start"});const e=r.querySelector("summary");e&&e.focus({preventScroll:!0})};requestAnimationFrame(()=>{a(),window.setTimeout(a,60)})}z.forEach(e=>{e&&(e.addEventListener("input",K),e.addEventListener("change",K))}),h.viewGraphButton?.addEventListener("click",()=>{q("graph")}),h.graphBackButton?.addEventListener("click",()=>{q("list")}),t.addEventListener("toggle",e=>{const t=e.target;if(!(t instanceof HTMLDetailsElement))return;if(!t.classList.contains("dep-card"))return;const n=t.dataset.depKey;n&&(t.open?(N.add(n),H(t)):N.delete(n))},!0),t.addEventListener("click",e=>{const t=e.target,n=t.closest(".root-package-link");if(n)return e.preventDefault(),void J(n);const r=t.closest(".copy-json-btn");r&&(e.preventDefault(),async function(e){const t=e.closest(".raw-data-toggle"),n=t?.querySelector("pre"),r=n?.textContent??"";if(r)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(r);else{const e=document.createElement("textarea");e.value=r,e.setAttribute("readonly","true"),e.style.position="absolute",e.style.left="-9999px",document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}const t=e.dataset.label||e.textContent||"Copy JSON";e.dataset.label=t,e.textContent="Copied",e.classList.add("copied"),V.textContent="Copied JSON to clipboard.",window.setTimeout(()=>{e.textContent=t,e.classList.remove("copied")},1500)}catch{V.textContent="Copy failed."}}(r))}),t.addEventListener("keydown",e=>{const t=e.target.closest(".root-package-link");t&&(" "!==e.key&&"Spacebar"!==e.key||(e.preventDefault(),J(t)))}),C(),W(),q("list")}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",re):re()}();
17
+ exports.JS_CONTENT = `!function(){"use strict";const e=2.8;function t(e,t,n){return Math.min(n,Math.max(t,e))}function n(e,n,r){const a=function(e){const n=e.trim(),r=n.match(/^#([0-9a-f]{3}|[0-9a-f]{6})\$/i);if(r){const e=r[1];return 3===e.length?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16)}:{r:parseInt(e.slice(0,2),16),g:parseInt(e.slice(2,4),16),b:parseInt(e.slice(4,6),16)}}const a=n.match(/^rgba?\\(([^)]+)\\)\$/i);if(!a)return null;const s=a[1].replace(/\\//g," ").split(/[\\s,]+/).filter(Boolean).slice(0,3);if(3!==s.length)return null;const i=e=>{if(e.endsWith("%")){const n=Number(e.slice(0,-1));return Number.isFinite(n)?t(Math.round(n/100*255),0,255):null}const n=Number(e);return Number.isFinite(n)?t(Math.round(n),0,255):null},o=i(s[0]),c=i(s[1]),l=i(s[2]);return null===o||null===c||null===l?null:{r:o,g:c,b:l}}(e);if(!a)return r;const s=t(n,0,1);return\`rgb(\${Math.round(a.r+(255-a.r)*s)}, \${Math.round(a.g+(255-a.g)*s)}, \${Math.round(a.b+(255-a.b)*s)})\`}function r(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}function a(e,t,n){if(0===t.length)return;if(e.moveTo(t[0].x,t[0].y),1===t.length)return;if(2===t.length)return void e.lineTo(t[1].x,t[1].y);for(let a=1;a<t.length-1;a+=1){const r=t[a-1],s=t[a],i=t[a+1],o=s.x-r.x,c=s.y-r.y,l=i.x-s.x,d=i.y-s.y,u=Math.hypot(o,c),p=Math.hypot(l,d);if(u<.001||p<.001){e.lineTo(s.x,s.y);continue}const h=Math.min(n,.45*u,.45*p),g=s.x-o/u*h,m=s.y-c/u*h,v=s.x+l/p*h,f=s.y+d/p*h;e.lineTo(g,m),e.quadraticCurveTo(s.x,s.y,v,f)}const r=t[t.length-1];e.lineTo(r.x,r.y)}function s(e,n,r,s){const i=n.renderX,o=n.renderY,c=r.renderX,l=r.renderY,d=r.depth-n.depth,u=Math.abs(d);if(0===u){const r=Math.abs(i-c)<s.sameColumnXThreshold,d=Math.abs(o-l),u=n.depth<s.maxDepth;if(r&&d>s.minDetourVerticalSpan&&u){const r=s.paddingX+n.depth*s.layerGap,u=s.paddingX+(n.depth+1)*s.layerGap,p=.5*(r+u);let h=p+s.detourInset;const g=Math.min(o,l)-12,m=Math.max(o,l)+12;(function(e,t,n,r,a){const s=e.depthNodeIndex.get(t);if(!s||0===s.length)return!1;const i=function(e,t){let n=0,r=e.length;for(;n<r;){const a=n+(r-n>>1);e[a].renderY<t?n=a+1:r=a}return n}(s,n);for(let o=i;o<s.length&&s[o].renderY<=r;o+=1)if(Math.abs(s[o].renderX-a)<e.detourNodeClearance)return!0;return!1})(s,n.depth+1,g,m,h)&&(h+=12);h=t(h,p+8,u-24);const v=Math.max(1,h-i);return void a(e,[{x:i,y:o},{x:h,y:o},{x:h,y:l},{x:c,y:l}],t(.42*Math.min(v,d),16,52))}e.moveTo(i,o);const p=i+.5*(c-i),h=o+(l-o)*s.edgeCurve;return void e.quadraticCurveTo(p,h,c,l)}if(1===u){const t=Math.min(n.depth,r.depth),a=s.paddingX+t*s.layerGap+.5*s.layerGap;return e.moveTo(i,o),void e.bezierCurveTo(a,o,a,l,c,l)}const p=Math.sign(d),h=l-o,g=[{x:i,y:o}],m=s.paddingX+n.depth*s.layerGap+p*(.5*s.layerGap);g.push({x:m,y:o});for(let t=1;t<u;t+=1){const e=n.depth+p*t,r=s.paddingX+e*s.layerGap+p*(.5*s.layerGap),a=t/u;g.push({x:r,y:o+h*a})}const v=s.paddingX+r.depth*s.layerGap-p*(.5*s.layerGap);g.push({x:v,y:l}),g.push({x:c,y:l}),a(e,g,14)}function i(e,t){return\`\${e}@\${t}\`}function o(e,t){return\`\${e}->\${t}\`}function c(e){if(!e||"object"!=typeof e)return!1;const t=e;if(!Array.isArray(t.workspaces))return!1;if(!t.dependencies||"object"!=typeof t.dependencies)return!1;const n=e=>Array.isArray(e)&&e.every(e=>"string"==typeof e);if(!t.workspaces.every(e=>(e=>{if(!e||"object"!=typeof e)return!1;const t=e;return"string"==typeof t.name&&!!Array.isArray(t.directDependencies)&&!!Array.isArray(t.directDevDependencies)})(e)))return!1;if(!t.workspaces.every(e=>n(e.directDependencies)&&n(e.directDevDependencies)))return!1;return!!Object.entries(t.dependencies).every(([,e])=>{if(!e||"object"!=typeof e)return!1;const t=e;return!(void 0!==t.dependencies&&!Array.isArray(t.dependencies))&&!(void 0!==t.workspaceOrigins&&!Array.isArray(t.workspaceOrigins))})}function l(e){const t=e.compliance.license.declared?.valid?e.compliance.license.declared.spdxId:void 0;return t||(e.compliance.license.inferred?.spdxId||"Unknown")}function d(e){const t=e.security?.summary;return t?Number(t.critical||0)+Number(t.high||0)+Number(t.moderate||0)+Number(t.low||0):0}function u(e){const t=e.security?.summary?.highest;return"critical"===t||"high"===t?"high":"moderate"===t?"moderate":"none"}function p(e,t){const n=new Set,r=[t];for(;r.length>0;){const t=r.pop();if(!t)continue;const a=e.nodes.get(t);a&&a.parents.forEach(e=>{n.has(e)||(n.add(e),r.push(e))})}return n}function h(e,t){const n=new Set,r=[t];for(;r.length>0;){const t=r.pop();if(!t)continue;const a=e.nodes.get(t);a&&a.children.forEach(e=>{n.has(e)||(n.add(e),r.push(e))})}return n}function g(a){const g=function(e,t,n){const r=window.__DEPENDENCY_DATA__;if(c(r)){const e={};return Object.entries(r.dependencies).forEach(([t,n])=>{const r=n,a=r.vulnerabilitySeverity||r.vulnerabilityHighest||r.highestSeverity||"none",s=String(a).trim().toLowerCase();let i="none";"critical"===s||"high"===s?i="high":"moderate"!==s&&"medium"!==s||(i="moderate"),e[t]={slug:String(r.slug||t),name:String(r.name||t),version:String(r.version||""),dependencies:Array.isArray(r.dependencies)?r.dependencies.map(e=>String(e)):[],license:String(r.license||"Unknown"),vulnerabilityCount:Number(r.vulnerabilityCount||0),vulnerabilitySeverity:i,isDevOnly:Boolean(r.isDevOnly),workspaceOrigins:Array.isArray(r.workspaceOrigins)?r.workspaceOrigins.map(e=>String(e)):[]}}),{workspaces:r.workspaces,dependencies:e}}const a={},s=Object.values(e.dependencies||{});s.forEach(e=>{const t=i(e.package.name,e.package.version);a[t]={slug:t,name:e.package.name,version:e.package.version,dependencies:[],license:l(e),vulnerabilityCount:d(e),vulnerabilitySeverity:u(e),isDevOnly:"dev"===e.usage.scope,workspaceOrigins:e.usage.origins.workspaces||[]}}),s.forEach(e=>{const r=i(e.package.name,e.package.version),s=e.graph.subDeps;if(!s)return;const o=new Set;["dep","dev","opt","peer"].forEach(e=>{const i=s[e];i&&Object.values(i).forEach(e=>{const s=e[1];if(!s)return;const i=n(s);i&&t.has(i)&&a[i]&&i!==r&&o.add(i)})}),a[r].dependencies=[...o]});const o=new Map,p=e=>{const t=o.get(e);if(t)return t;const n={directDependencies:new Set,directDevDependencies:new Set};return o.set(e,n),n};return p("root"),(e.workspaces.workspacePackages||[]).forEach(e=>{p(e.name)}),s.forEach(e=>{if(!e.usage.direct)return;const t=i(e.package.name,e.package.version);(e.usage.origins.workspaces?.length?e.usage.origins.workspaces:["root"]).forEach(n=>{const r=p(n);"dev"===e.usage.scope?r.directDevDependencies.add(t):r.directDependencies.add(t)})}),{workspaces:[...o.entries()].map(([e,t])=>({name:e,directDependencies:[...t.directDependencies],directDevDependencies:[...t.directDevDependencies]})).sort((e,t)=>e.name.localeCompare(t.name)),dependencies:a}}(a.report,a.knownDepKeys,a.resolveDepKey),m=new Map(g.workspaces.map(e=>[e.name,e])),v=new Map,f=new Map;Object.values(g.dependencies).forEach(e=>{const t=(e.dependencies||[]).filter(t=>t!==e.slug&&Boolean(g.dependencies[t]));f.set(e.slug,t),t.forEach(t=>{const n=v.get(t)||[];n.push(e.slug),v.set(t,n)})});let y=null,k="",b=null,w=null,E=new Set,x=new Set,I=new Set,C=new Set,S=new Set,L=null,M=1,P=0,D=0,Y=1,X=.1,B=0,A=0,N=!1,T=!0,R=0,V=Math.max(1,Math.floor(window.devicePixelRatio||1)),H=1,O=1;const j={down:!1,moved:!1,startX:0,startY:0,startPanX:0,startPanY:0},\$={active:!1,startX1:0,startY1:0,startX2:0,startY2:0,startPanX:0,startPanY:0,startDist:0,startZoom:0,anchorX:null,anchorY:null},G=a.canvas.getContext("2d"),F=Boolean(G);let W=!1,U=!1,_=!1,q=null,z=null,K=null,J=!1,Z={runtime:"#10b981",runtimeHighlight:"#34d399",dev:"#f59e0b",devHighlight:"#fcd34d",transitive:"#06b6d4",transitiveHighlight:"#67e8f9",edge:"#64748b",highlight:"#22d3ee",muted:"#64748b",ringHigh:"#ef4444",ringModerate:"#f59e0b",label:"#e8edf5",backgroundPrimary:"#0c1222"};function Q(){const e=r("--graph-direct-runtime")||"#10b981",t=r("--graph-direct-dev")||"#f59e0b",a=r("--graph-transitive")||"#06b6d4";Z={runtime:e,runtimeHighlight:n(e,.2,"#34d399"),dev:t,devHighlight:n(t,.28,"#fcd34d"),transitive:a,transitiveHighlight:n(a,.38,"#67e8f9"),edge:r("--graph-edge")||"#64748b",highlight:r("--graph-highlight")||"#22d3ee",muted:r("--graph-muted")||"#64748b",ringHigh:r("--graph-vuln-high")||"#ef4444",ringModerate:r("--graph-vuln-medium")||"#f59e0b",label:r("--text-primary")||"#e8edf5",backgroundPrimary:r("--bg-primary")||"#0c1222"}}function ee(){if(J)return;J=!0,console.warn("Dependency Radar: unable to initialize 2D canvas; graph rendering disabled."),a.controlsRoot.classList.add("hidden"),a.workspaceWrap.classList.add("hidden"),a.canvas.style.display="none";const e=document.createElement("div");e.className="empty-state";const t=document.createElement("div");t.className="empty-state-text",t.textContent="Graph view is unavailable in this browser context.",e.appendChild(t),a.canvasHost.appendChild(e)}function te(e){return(e-P)/M}function ne(e){return(e-D)/M}function re(n,r,a){const s=t(n,X,e),i=te(r),o=ne(a);M=s,P=r-i*M,D=a-o*M,T=!0,Se()}function ae(e,t){P+=e,D+=t,T=!0,Se()}function se(){const e=a.canvasHost.getBoundingClientRect();H=Math.max(1,Math.floor(e.width)),O=Math.max(1,Math.floor(e.height)),V=Math.max(1,Math.floor(window.devicePixelRatio||1)),a.canvas.width=H*V,a.canvas.height=O*V,a.canvas.style.width=\`\${H}px\`,a.canvas.style.height=\`\${O}px\`,T=!0,Se()}function ie(){if(!y)return;const n=y.bounds,r=Math.max(1,n.maxX-n.minX),a=Math.max(1,n.maxY-n.minY),s=H/r,i=O/a;Y=t(Math.min(s,i),.05,e),X=t(.86*Y,.05,e),B=.5*(H-r*Y)-n.minX*Y,A=.5*(O-a*Y)-n.minY*Y}function oe(e,t){if(!y)return null;const n=a.canvas.getBoundingClientRect();if(e<n.left||e>n.right||t<n.top||t>n.bottom)return null;const r=te(e-n.left),s=ne(t-n.top);let i=null,o=1/0;return y.nodes.forEach(e=>{const t=r-e.renderX,n=s-e.renderY,a=Math.sqrt(t*t+n*n);a<=e.renderRadius+5&&a<o&&(o=a,i=e)}),i}function ce(e){a.canvas.classList.toggle("is-clickable",e&&!j.down&&!\$.active)}function le(e=!1){ce(!1),e&&a.canvas.classList.remove("is-panning")}function de(e,t){const n=oe(e,t);return ye(n?n.slug:null),ce(Boolean(n)),n}function ue(e){const t=m.get(e);if(!t)return null;const n=new Set(t.directDependencies.filter(e=>Boolean(g.dependencies[e]))),r=new Set(t.directDevDependencies.filter(e=>Boolean(g.dependencies[e]))),a=new Set([...n,...r]);0===a.size&&Object.keys(g.dependencies).filter(e=>0===(v.get(e)||[]).length).slice(0,40).forEach(e=>{a.add(e)});const s=new Set,i=[...a];let o=0;for(;o<i.length;){const e=i[o++];e&&(s.has(e)||g.dependencies[e]&&(s.add(e),(f.get(e)||[]).forEach(e=>{s.has(e)||i.push(e)})))}if(0===s.size)return null;const c=new Map;s.forEach(e=>{const t=n.has(e)?"direct-runtime":r.has(e)?"direct-dev":"transitive";c.set(e,{slug:e,ref:g.dependencies[e],parents:new Set,children:new Set,depth:Number.POSITIVE_INFINITY,order:0,amplification:0,kind:t,baseX:0,baseY:0,targetX:0,targetY:0,renderX:0,renderY:0,radius:8,targetRadius:8,renderRadius:8})}),c.forEach(e=>{(v.get(e.slug)||[]).forEach(t=>{c.has(t)&&e.parents.add(t)}),(f.get(e.slug)||[]).forEach(t=>{c.has(t)&&e.children.add(t)})});const l=[];for(a.forEach(e=>{const t=c.get(e);t&&(t.depth=0,l.push(e))});l.length>0;){const e=l.shift();if(!e)continue;const t=c.get(e);t&&t.children.forEach(e=>{const n=c.get(e);if(!n)return;const r=t.depth+1;r>=n.depth||(n.depth=r,l.push(e))})}c.forEach(e=>{if(Number.isFinite(e.depth))return;let t=Number.POSITIVE_INFINITY;e.parents.forEach(e=>{const n=c.get(e);n&&Number.isFinite(n.depth)&&(t=Math.min(t,n.depth+1))}),e.depth=Number.isFinite(t)?t:0});const d=[...c.values()].reduce((e,t)=>Math.max(e,t.depth),0),u=Array.from({length:d+1},()=>[]);c.forEach(e=>{u[e.depth].push(e.slug)});const p=[];c.forEach(e=>{e.children.forEach(t=>{p.push({from:e.slug,to:t,direct:0===e.depth})})});const h={workspaceName:e,nodes:c,edges:p,layers:u,directRuntime:n,directDev:r,directAll:new Set([...n,...r]),bounds:{minX:0,maxX:1,minY:0,maxY:1}};return pe(h),he(h),h}function pe(e){e.nodes.forEach(e=>{e.amplification=0}),e.nodes.forEach(t=>{if(0!==t.depth)return;if(!e.directAll.has(t.slug))return;const n=new Set,r=[...t.children];for(;r.length>0;){const a=r.pop();if(!a)continue;if(a===t.slug)continue;if(n.has(a))continue;n.add(a);const s=e.nodes.get(a);s&&s.children.forEach(e=>{n.has(e)||r.push(e)})}t.amplification=n.size})}function he(e){const t=new Map;e.layers.forEach((n,r)=>{0===r?n.sort((t,n)=>{const r=e.nodes.get(t),a=e.nodes.get(n);if(!r&&!a)return 0;if(!r)return 1;if(!a)return-1;if(r.amplification!==a.amplification)return a.amplification-r.amplification;if(r.kind!==a.kind){if("direct-runtime"===r.kind)return-1;if("direct-runtime"===a.kind)return 1}return r.ref.name.localeCompare(a.ref.name)}):n.sort((n,r)=>{const a=e.nodes.get(n),s=e.nodes.get(r);if(!a&&!s)return 0;if(!a)return 1;if(!s)return-1;const i=(()=>{let e=0,n=0;return a.parents.forEach(r=>{const a=t.get(r);"number"==typeof a&&(e+=1,n+=a)}),e>0?n/e:Number.MAX_SAFE_INTEGER})(),o=(()=>{let e=0,n=0;return s.parents.forEach(r=>{const a=t.get(r);"number"==typeof a&&(e+=1,n+=a)}),e>0?n/e:Number.MAX_SAFE_INTEGER})();return i!==o?i-o:a.ref.name.localeCompare(s.ref.name)}),n.forEach((e,n)=>{t.set(e,n)})});const n=e.layers.reduce((e,t)=>Math.max(e,t.length),1);e.bounds={minX:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY},e.layers.forEach((t,r)=>{const a=Math.max(0,43*(t.length-1)),s=64+.5*(43*n-a);t.forEach((t,n)=>{const a=e.nodes.get(t);if(!a)return;a.order=n,a.baseX=96+240*r,a.baseY=s+43*n,a.targetX=a.baseX,a.targetY=a.baseY,a.renderX=a.baseX,a.renderY=a.baseY;const i=.55*Math.log(a.children.size+a.parents.size+1),o=0===a.depth&&e.directAll.has(a.slug)?1.05*Math.log(a.amplification+1):0;a.radius=6.7+i+o,a.targetRadius=a.radius,a.renderRadius=a.radius,e.bounds.minX=Math.min(e.bounds.minX,a.baseX),e.bounds.maxX=Math.max(e.bounds.maxX,a.baseX),e.bounds.minY=Math.min(e.bounds.minY,a.baseY),e.bounds.maxY=Math.max(e.bounds.maxY,a.baseY)})}),Number.isFinite(e.bounds.minX)||(e.bounds={minX:0,maxX:1,minY:0,maxY:1})}function ge(e){if(!y||!y.nodes.has(e))return;b=e;const t=p(y,e),n=h(y,e);E=new Set([e]),t.forEach(e=>{E.add(e)}),n.forEach(e=>{E.add(e)}),x=new Set;const r=[e],a=new Set([e]);for(;r.length>0;){const e=r.pop();if(!e)continue;const t=y.nodes.get(e);t&&t.parents.forEach(t=>{x.add(o(t,e)),a.has(t)||(a.add(t),r.push(t))})}const s=[e],i=new Set([e]);for(;s.length>0;){const e=s.pop();if(!e)continue;const t=y.nodes.get(e);t&&t.children.forEach(t=>{x.add(o(e,t)),i.has(t)||(i.add(t),s.push(t))})}I=new Set(E);const c=y.nodes.get(e);c.parents.forEach(e=>{I.add(e)}),c.children.forEach(e=>{I.add(e)}),T=!0,Se()}function me(){b=null,E=new Set,x=new Set,I=new Set,T=!0,Se()}function ve(e=!0){w=null,C=new Set,S=new Set,e&&(T=!0,Se())}function fe(){if(!y)return;const e=b&&y.nodes.get(b)||null;y.nodes.forEach(t=>{if(t.targetRadius=function(e){const t=b===e.slug,n=E.has(e.slug);let r=e.radius;t?r*=1.85:b&&n?r*=1.22:b&&!n?r*=.84:w&&C.has(e.slug)?r*=1.1:w&&(r*=.9);return r}(t),!e||!I.has(t.slug))return t.targetX=t.baseX,void(t.targetY=t.baseY);const n=t.baseX-e.baseX,r=t.baseY-e.baseY,a=1+120/(Math.sqrt(n*n+r*r)+1);t.targetX=e.baseX+n*a,t.targetY=e.baseY+r*a})}function ye(e){if(b)return;if(w=e,C=new Set,S=new Set,!y||!e||!y.nodes.has(e))return T=!0,void Se();const t=p(y,e),n=h(y,e);C=new Set([e]),t.forEach(e=>{C.add(e)}),n.forEach(e=>{C.add(e)});const r=y.nodes.get(e);r&&(r.parents.forEach(e=>{C.add(e)}),r.children.forEach(e=>{C.add(e)})),y.edges.forEach(e=>{C.has(e.from)&&C.has(e.to)&&S.add(o(e.from,e.to))}),T=!0,Se()}function ke(e){if(!y)return;const t=y.nodes.get(e);if(!t)return;const n=0===t.depth&&y.directAll.has(t.slug);L=e,a.popoverName.textContent=t.ref.name,a.popoverVersion.textContent=\`Version: \${t.ref.version}\`,a.popoverLicense.textContent=\`License: \${t.ref.license||"Unknown"}\`,a.popoverVulns.textContent=\`Vulnerabilities: \${t.ref.vulnerabilityCount||0}\`,a.popoverAmplification.textContent=n?\`Amplification: \${t.amplification}\`:\`Dependencies: \${t.children.size} • Dependents: \${t.parents.size}\`,a.popover.hidden=!1,we()}function be(){L=null,a.popover.hidden=!0}function we(){if(!y||!L||a.popover.hidden)return;const e=y.nodes.get(L);if(!e)return void be();const n=e.renderX*M+P,r=e.renderY*M+D,s=a.canvasHost.getBoundingClientRect(),i=a.popover.getBoundingClientRect(),o=Math.max(8,s.width-i.width-8),c=Math.max(8,s.height-i.height-8),l=t(n+14,8,o),d=t(r+14,8,c);a.popover.style.left=\`\${l}px\`,a.popover.style.top=\`\${d}px\`}function Ee(e){return b?E.has(e)?1:.14:w?C.has(e)?1:.16:.95}function xe(){if(!G)return;if(G.setTransform(V,0,0,V,0,0),G.clearRect(0,0,H,O),!y)return;const e=y,n=te(0)-80,r=te(H)+80,a=ne(0)-80,i=ne(O)+80;G.setTransform(V*M,0,0,V*M,V*P,V*D);const c=Z.runtime,l=Z.dev,d=Z.transitive,u=Z.edge,p=Z.highlight,h=Z.muted,g=Z.ringHigh,m=Z.ringModerate,v=Z.label,f=Z.backgroundPrimary,k=new Set;e.nodes.forEach(e=>{const t=Math.max(e.radius,e.renderRadius);e.renderX+t>=n&&e.renderX-t<=r&&e.renderY+t>=a&&e.renderY-t<=i&&k.add(e.slug)});const I=Math.max(0,e.layers.length-1),L=function(e){const t=new Map;return e.nodes.forEach(e=>{const n=t.get(e.depth);n?n.push(e):t.set(e.depth,[e])}),t.forEach(e=>{e.sort((e,t)=>e.renderY-t.renderY)}),t}(e),Y={depthNodeIndex:L,maxDepth:I,sameColumnXThreshold:6,minDetourVerticalSpan:80,detourInset:14,detourNodeClearance:26,paddingX:96,layerGap:240,edgeCurve:.2},X=[];e.edges.forEach(t=>{const n=e.nodes.get(t.from),r=e.nodes.get(t.to);if(!n||!r)return;if(!k.has(n.slug)&&!k.has(r.slug))return;const a=o(t.from,t.to);X.push({from:n,to:r,highlighted:x.has(a)||!b&&S.has(a),span:Math.abs(r.depth-n.depth)})}),X.sort((e,t)=>t.span-e.span),G.globalCompositeOperation="source-over",G.strokeStyle=b||w?h:u,G.lineWidth=1.05,G.globalAlpha=function(){if(b||w)return.04*t((M-.35)/.9,.75,1);return.25*t((M-.35)/.9,.2,1)}(),G.beginPath(),X.forEach(e=>{e.highlighted||s(G,e.from,e.to,Y)}),G.stroke(),G.globalCompositeOperation="lighter",G.strokeStyle=p,G.lineWidth=1.2,G.globalAlpha=.36*t((M-.35)/.9,.2,1),G.beginPath(),X.forEach(e=>{e.highlighted&&s(G,e.from,e.to,Y)}),G.stroke(),G.globalCompositeOperation="source-over",e.nodes.forEach(e=>{if(!k.has(e.slug))return;const t=b===e.slug,n=e.renderRadius;G.globalAlpha=1,G.fillStyle=f,G.beginPath(),G.arc(e.renderX,e.renderY,n,0,2*Math.PI),G.fill(),G.globalAlpha=Ee(e.slug);const r=G.createRadialGradient(e.renderX-.3*n,e.renderY-.3*n,0,e.renderX,e.renderY,1.2*n);"direct-runtime"===e.kind?(r.addColorStop(0,Z.runtimeHighlight),r.addColorStop(1,c)):"direct-dev"===e.kind?(r.addColorStop(0,Z.devHighlight),r.addColorStop(1,l)):(r.addColorStop(0,Z.transitiveHighlight),r.addColorStop(1,d)),G.fillStyle=r,G.beginPath(),G.arc(e.renderX,e.renderY,n,0,2*Math.PI),G.fill(),t&&(G.globalAlpha=.95,G.strokeStyle=p,G.lineWidth=1.5,G.beginPath(),G.arc(e.renderX,e.renderY,n+4,0,2*Math.PI),G.stroke())}),y.nodes.forEach(e=>{if(!k.has(e.slug))return;if(!e.ref.vulnerabilityCount||e.ref.vulnerabilityCount<=0)return;if("none"===e.ref.vulnerabilitySeverity)return;const t=e.renderRadius,n="high"===e.ref.vulnerabilitySeverity?g:m;var r;G.save(),G.translate(e.renderX,e.renderY),G.globalAlpha=(r=e.slug,b?E.has(r)?.78:.11:w?C.has(r)?.76:.12:.8),G.strokeStyle=n;const a=t/e.radius,s=t/3*1.2/12,i=1.2*s+3*(a-1),o=Math.max(.5*s,.15),c=Math.max(1*s,.3),l=Math.max(3*s,.8),d=Math.max(1*s,.3),u=Math.max(.5*s,.15),p=t+(2+6*(a-1))+o/2,h=p+o/2+i+c/2,v=h+c/2+i+l/2,f=v+l/2+i+d/2,y=f+d/2+i+u/2;G.setLineDash([]),G.lineWidth=u,G.beginPath(),G.arc(0,0,y,0,2*Math.PI),G.stroke(),G.lineWidth=d,G.beginPath(),G.arc(0,0,f,0,2*Math.PI),G.stroke(),G.lineWidth=l,G.beginPath(),G.arc(0,0,v,0,2*Math.PI),G.stroke(),G.lineWidth=c,G.beginPath(),G.arc(0,0,h,0,2*Math.PI),G.stroke(),G.lineWidth=o,G.beginPath(),G.arc(0,0,p,0,2*Math.PI),G.stroke(),G.restore()}),G.textBaseline="middle",G.font='500 11.5px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',G.fillStyle=v,e.nodes.forEach(e=>{k.has(e.slug)&&(G.globalAlpha=Ee(e.slug),G.fillText(e.ref.name,e.renderX+e.renderRadius+6,e.renderY))}),G.globalAlpha=1,we()}function Ie(){if(!N)return void(R=0);fe();const e=function(){if(!y)return!1;let e=!1;return y.nodes.forEach(t=>{t.renderX+=.15*(t.targetX-t.renderX),t.renderY+=.15*(t.targetY-t.renderY),t.renderRadius+=.18*(t.targetRadius-t.renderRadius),Math.abs(t.targetX-t.renderX)<.06&&Math.abs(t.targetY-t.renderY)<.06&&Math.abs(t.targetRadius-t.renderRadius)<.04||(e=!0)}),e}();if(T||e)return xe(),T=!1,void(R=N&&(T||e)?window.requestAnimationFrame(Ie):0);R=0}function Ce(){N&&!R&&T&&(R=window.requestAnimationFrame(Ie))}function Se(){T=!0,N&&Ce()}function Le(e){const t=ue(e);t&&(k=e,y=t,me(),be(),w=null,C=new Set,S=new Set,le(!0),y&&(ie(),M=Y,P=B,D=A),T=!0,Se())}function Me(e){0===e.button&&(j.down=!0,j.moved=!1,j.startX=e.clientX,j.startY=e.clientY,j.startPanX=P,j.startPanY=D,le(),a.canvas.classList.add("is-panning"))}function Pe(e){if(!j.down)return void de(e.clientX,e.clientY);const t=e.clientX-j.startX,n=e.clientY-j.startY;(Math.abs(t)>2||Math.abs(n)>2)&&(j.moved=!0),P=j.startPanX+t,D=j.startPanY+n,Se()}function De(e){if(!j.down)return;a.canvas.classList.remove("is-panning");const t=j.moved;if(j.down=!1,j.moved=!1,t)return void de(e.clientX,e.clientY);const n=de(e.clientX,e.clientY);if(!n)return ve(!1),me(),void be();ge(n.slug),ke(n.slug)}function Ye(e){if(!a.canvasHost.contains(e.target))return;e.preventDefault();const t=a.canvas.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,s=e.ctrlKey||e.metaKey?.015*e.deltaY:.002*e.deltaY,i=Math.exp(-s);re(M*i,n,r)}function Xe(e){if(0===e.touches.length)return;e.preventDefault(),le();const t=a.canvas.getBoundingClientRect();if(1===e.touches.length)\$.active=!0,j.moved=!1,\$.startX1=e.touches[0].clientX,\$.startY1=e.touches[0].clientY,\$.startPanX=P,\$.startPanY=D,a.canvas.classList.add("is-panning");else if(2===e.touches.length){\$.active=!0,j.moved=!1,\$.startX1=e.touches[0].clientX,\$.startY1=e.touches[0].clientY,\$.startX2=e.touches[1].clientX,\$.startY2=e.touches[1].clientY;const n=\$.startX2-\$.startX1,r=\$.startY2-\$.startY1;\$.startDist=Math.sqrt(n*n+r*r),\$.startZoom=M;const a=(\$.startX1+\$.startX2)/2,s=(\$.startY1+\$.startY2)/2,i=a-t.left,o=s-t.top;\$.anchorX=i,\$.anchorY=o}}function Be(e){if(\$.active)if(e.preventDefault(),1===e.touches.length){const t=e.touches[0].clientX-\$.startX1,n=e.touches[0].clientY-\$.startY1;(Math.abs(t)>2||Math.abs(n)>2)&&(j.moved=!0),P=\$.startPanX+t,D=\$.startPanY+n,Se()}else if(2===e.touches.length){j.moved=!0;const t=e.touches[0].clientX,n=e.touches[0].clientY,r=e.touches[1].clientX-t,a=e.touches[1].clientY-n,s=Math.sqrt(r*r+a*a);if(\$.startDist>0){const e=s/\$.startDist;re(\$.startZoom*e,\$.anchorX??H/2,\$.anchorY??O/2)}}}function Ae(e){if(!\$.active)return;e.preventDefault();if("touchcancel"===e.type)return le(!0),\$.active=!1,\$.anchorX=null,\$.anchorY=null,void(j.moved=!1);if(0===e.touches.length){if(le(!0),\$.active=!1,\$.anchorX=null,\$.anchorY=null,!j.moved&&1===e.changedTouches.length){const t=oe(e.changedTouches[0].clientX,e.changedTouches[0].clientY);t?(ge(t.slug),ke(t.slug)):(ve(!1),me(),be())}j.moved=!1}else 1===e.touches.length&&(\$.startX1=e.touches[0].clientX,\$.startY1=e.touches[0].clientY,\$.startPanX=P,\$.startPanY=D)}function Ne(){ye(null),le()}function Te(e){if(!N)return;const t=e.target;a.popover.hidden||a.popover.contains(t)||a.canvasHost.contains(t)||be()}function Re(e){const t=e.target.closest("button[data-action]");if(!t)return;const n=t.dataset.action;n&&("zoom-in"!==n?"zoom-out"!==n?"pan-left"!==n?"pan-right"!==n?"pan-up"!==n?"pan-down"!==n?"reset"===n&&(M=Y,P=B,D=A,me(),be(),Se()):ae(0,52):ae(0,-52):ae(52,0):ae(-52,0):re(M/1.18,.5*H,.5*O):re(1.18*M,.5*H,.5*O))}function Ve(){L&&a.onOpenList(L)}function He(){Le(a.workspaceSelect.value)}function Oe(){N&&(se(),H<=1||O<=1||(ie(),M=t(M,X,e),Se()))}function je(){_||(a.workspaceSelect.addEventListener("change",He),_=!0),U||(a.controlsRoot.addEventListener("click",Re),a.popoverOpenButton.addEventListener("click",Ve),U=!0)}return{initGraphView:function(){const e=g.workspaces.length?g.workspaces:[{name:"root",directDependencies:[],directDevDependencies:[]}];a.workspaceSelect.textContent="",e.forEach(e=>{const t=document.createElement("option");t.value=e.name,t.textContent=e.name,a.workspaceSelect.appendChild(t)}),a.workspaceWrap.classList.toggle("hidden",e.length<=1),m.has("root")||1!==e.length||m.set("root",e[0]),k=e[0].name,a.workspaceSelect.value=k,Q(),function(){if(q&&q.disconnect(),q=new MutationObserver(()=>{Q(),Se()}),q.observe(document.documentElement,{attributes:!0,attributeFilter:["class","data-theme"]}),z&&(z.disconnect(),z=null),K&&(window.removeEventListener("resize",K),K=null),"undefined"!=typeof ResizeObserver)return z=new ResizeObserver(Oe),void z.observe(a.canvasHost);K=Oe,window.addEventListener("resize",K)}(),je(),F?(se(),Le(k)):ee()},buildWorkspaceGraph:ue,computeAmplification:pe,layoutGraph:he,renderLoop:Ce,applyFocus:ge,clearFocus:me,showPopover:ke,hidePopover:be,switchWorkspace:Le,setActive:function(n){if(N=n,N)return F?(!W&&F&&(a.canvas.addEventListener("mousedown",Me),window.addEventListener("mousemove",Pe),window.addEventListener("mouseup",De),a.canvas.addEventListener("wheel",Ye,{passive:!1}),a.canvas.addEventListener("touchstart",Xe,{passive:!1}),window.addEventListener("touchmove",Be,{passive:!1}),window.addEventListener("touchend",Ae,{passive:!1}),window.addEventListener("touchcancel",Ae,{passive:!1}),a.canvas.addEventListener("mouseleave",Ne),document.addEventListener("mousedown",Te),W=!0),se(),H>1&&O>1&&(ie(),M=t(M,X,e)),Ce(),void Se()):void ee();W&&(a.canvas.removeEventListener("mousedown",Me),window.removeEventListener("mousemove",Pe),window.removeEventListener("mouseup",De),a.canvas.removeEventListener("wheel",Ye),a.canvas.removeEventListener("touchstart",Xe),window.removeEventListener("touchmove",Be),window.removeEventListener("touchend",Ae),window.removeEventListener("touchcancel",Ae),a.canvas.removeEventListener("mouseleave",Ne),document.removeEventListener("mousedown",Te),le(!0),j.down=!1,j.moved=!1,\$.active=!1,\$.anchorX=null,\$.anchorY=null,W=!1),R&&(window.cancelAnimationFrame(R),R=0)},requestRender:Se}}const m={permissive:["MIT","ISC","BSD-2-Clause","BSD-3-Clause","Apache-2.0","Unlicense","0BSD","CC0-1.0","BSD","Apache","Apache 2.0","Apache License 2.0","MIT License","ISC License"],weakCopyleft:["LGPL-2.1","LGPL-3.0","LGPL-2.0","LGPL","MPL-2.0","MPL-1.1","MPL","EPL-1.0","EPL-2.0","EPL"],strongCopyleft:["GPL-2.0","GPL-3.0","GPL","AGPL-3.0","AGPL","GPL-2.0-only","GPL-3.0-only","GPL-2.0-or-later","GPL-3.0-or-later"]},v={"network-access":"Accesses the network during install","dynamic-exec":"Uses dynamic execution","child-process":"Spawns child processes",encoding:"Uses encoding/decoding logic",obfuscated:"Contains obfuscated/minified install logic","reads-env":"Reads environment variables","reads-home":"Reads user home directory","uses-ssh":"Uses SSH configuration/keys"};function f(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function y(e){const t=e.compliance.license,n=t.declared?.valid?t.declared.spdxId:void 0,r=t.inferred?.spdxId;return n?{value:n,isInferred:!1}:r?{value:r,isInferred:!0}:{value:"Unknown",isInferred:!1}}function k(e){const t=e.security;if(t?.summary)return{summary:t.summary,advisories:t.advisories};if(t?.vulnerabilities){const e=t.vulnerabilities;return{summary:{critical:Number(e.critical||0),high:Number(e.high||0),moderate:Number(e.moderate||0),low:Number(e.low||0),highest:e.highest||"none",risk:t.vulnRisk||t.risk||"green"},advisories:t.advisories}}return{summary:{critical:0,high:0,moderate:0,low:0,highest:"none",risk:"green"},advisories:t?.advisories}}function b(e){return e?.highest||"none"}function w(e){return e&&e.risk||"green"}const E={permissive:"green",weakCopyleft:"amber",strongCopyleft:"red",unknown:"gray"},x={none:0,low:1,moderate:2,high:3,critical:4},I=[{id:"type",label:"Type",sortKey:"type",getValue:e=>e.usage.direct?"Dependency":"Sub-Dependency",getTone:e=>e.usage.direct?"green":"amber",sortFn:(e,t)=>e.usage.direct===t.usage.direct?0:e.usage.direct?-1:1},{id:"scope",label:"Scope",sortKey:"scope",getValue:e=>{return"runtime"===(t=e.usage.scope)?"Runtime":"dev"===t?"Dev":"optional"===t?"Optional":"peer"===t?"Peer":t;var t},getTone:e=>"runtime"===e.usage.scope?"green":"dev"===e.usage.scope||"optional"===e.usage.scope?"amber":"gray",sortFn:(e,t)=>e.usage.scope.localeCompare(t.usage.scope)},{id:"license",label:"License",sortKey:"license",getValue:e=>{const t=y(e),n=t.isInferred?\`\${t.value} (inferred)\`:t.value;return"mismatch"===e.compliance.license.status?\`\${n} *\`:n},getTone:e=>{const t=function(e){if(!e)return"unknown";const t=e.toUpperCase();for(const[n,r]of Object.entries(m))if(r.some(e=>t.includes(e.toUpperCase())))return n;return"unknown"}(y(e).value);return E[t]},sortFn:(e,t)=>{const n=y(e).value,r=y(t).value;return n.localeCompare(r)}},{id:"vulns",label:"Vulnerabilities",sortKey:"severity",getValue:e=>f(b(k(e).summary)),getTone:e=>k(e).summary.risk,sortFn:(e,t)=>x[b(k(t).summary)]-x[b(k(e).summary)]},{id:"install",label:"Install",sortKey:"install",getValue:e=>{return(t=e.execution)?f(t.risk||"low"):"Low";var t},getTone:e=>w(e.execution),sortFn:(e,t)=>{const n={green:0,amber:1,red:2},r=w(e.execution),a=w(t.execution);return n[r]-n[a]}}],C=I.length;function S(e){const t=e.compliance.license,n=t.declared?.valid?t.declared.spdxId:void 0,r=t.inferred?.spdxId;return n?{value:n,isInferred:!1}:r?{value:r,isInferred:!0}:{value:"Unknown",isInferred:!1}}function L(e){switch(e){case"declared-only":return"Declared";case"inferred-only":return"Inferred";case"match":return"Declared + Inferred (match)";case"mismatch":return"Declared + Inferred (mismatch)";case"invalid-spdx":return"Invalid SPDX";default:return"Unknown"}}const M={none:0,low:1,moderate:2,high:3,critical:4};function P(e){const t=e.security;if(t?.summary)return{summary:t.summary,advisories:t.advisories};if(t?.vulnerabilities){const e=t.vulnerabilities;return{summary:{critical:Number(e.critical||0),high:Number(e.high||0),moderate:Number(e.moderate||0),low:Number(e.low||0),highest:e.highest||"none",risk:t.vulnRisk||t.risk||"green"},advisories:t.advisories}}return{summary:{critical:0,high:0,moderate:0,low:0,highest:"none",risk:"green"},advisories:t?.advisories}}function D(e){return e?String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}function Y(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function X(e){return e.split(/[\\s-_]+/).map(e=>e?Y(e):e).join(" ")}function B(e){return I.map(t=>{return n=t.label,r=t.getValue(e),'<div class="badge-card '+t.getTone(e)+'"><span class="badge-label">'+D(n)+'</span><span class="badge-value">'+D(r)+"</span></div>";var n,r}).join("")}function A(e,t){const n=I.map(n=>function(e,t,n,r){const a=n===e,s=a?r?" ▲":" ▼":"",i=a?r?" sorted-asc":" sorted-desc":"";return'<button type="button" class="column-header'+(a?" sorted":"")+i+'" data-sort="'+D(e)+'"><span class="column-header-label">'+D(t)+'</span><span class="sort-indicator">'+s+"</span></button>"}(n.sortKey,n.label,e,t)).join("");return'<div class="column-headers" style="--column-count: '+C+'">'+n+"</div>"}function N(e,t,n){let r='<div class="kv-item">';return r+='<span class="kv-label">'+D(e)+"</span>",r+='<span class="kv-value">'+D(String(t))+"</span>",n&&(r+='<span class="kv-hint">'+D(n)+"</span>"),r+="</div>",r}function T(e,t){return'<span class="kv-value risk-value"><span class="risk-dot '+t+'"></span>'+D(String(e))+"</span>"}function R(e,t,n){let r='<div class="kv-item">';return r+='<span class="kv-label">'+D(e)+"</span>",r+=t,r+="</div>",r}function V(e,t){if(!e||0===e.length)return'<span class="kv-value">None</span>';const n=e.slice(0,t),r=e.length-t;let a='<div class="package-list">';return n.forEach(e=>{a+='<span class="package-tag">'+D(e)+"</span>"}),r>0&&(a+='<span class="package-tag">+'+r+" more</span>"),a+="</div>",a}function H(e,t,n,r){if(!e||0===e.length)return'<span class="kv-value">None</span>';const a=e.slice(0,t),s=e.length-t;let i='<div class="package-list">';return a.forEach(e=>{const t=U(e,n,r);i+=t?'<a class="package-tag package-tag-link root-package-link" href="#'+D(G(t))+'" data-dep-key="'+D(t)+'" aria-label="Jump to dependency '+D(t)+'">'+D(e)+"</a>":'<span class="package-tag">'+D(e)+"</span>"}),s>0&&(i+='<span class="package-tag">+'+s+" more</span>"),i+="</div>",i}function O(e,t){return e+"@"+t}const j=new WeakMap;function \$(e){const t=e.lastIndexOf("@npm:");if(t>0)return{name:e.slice(0,t),version:e.slice(t+1)};const n=e.lastIndexOf("@");return n<=0?null:{name:e.slice(0,n),version:e.slice(n+1)}}function G(e){return\`dep-\${e}\`}function F(e){const t=j.get(e);if(t)return t;const n=new Map;return e.forEach(e=>{const t=\$(e);if(!t)return;const r=n.get(t.name)||[];r.push(e),n.set(t.name,r)}),j.set(e,n),n}function W(e,t,n){const r=((n||F(t)).get(e)||[]).filter(e=>t.has(e));return 1===r.length?r[0]:null}function U(e,t,n){if(t.has(e))return e;const r=\$(e);if(!r)return W(e,t,n);if(r.version.startsWith("npm:")){const e=r.version.slice(4),n=r.name+(e.startsWith("@")?e:"@"+e);if(t.has(n))return n}return W(r.name,t,n)}function _(e,t,n,r){if(!e||0===e.length)return'<span class="kv-value">None</span>';const a=e.slice(0,t),s=e.length-t;let i='<div class="package-list">';return a.forEach(e=>{if("string"==typeof e){const t=U(e,n,r);return t?void(i+='<a class="package-tag package-tag-link root-package-link" href="#'+D(G(t))+'" data-dep-key="'+D(t)+'" aria-label="Jump to dependency '+D(t)+'">'+D(e)+"</a>"):void(i+='<span class="package-tag">'+D(e)+"</span>")}const t=O(e.name,e.version),a=e.name+"@"+e.version,s=U(t,n,r);i+=s?'<a class="package-tag package-tag-link root-package-link" href="#'+D(G(s))+'" data-dep-key="'+D(s)+'" aria-label="Jump to dependency '+D(s)+'">'+D(a)+"</a>":'<span class="package-tag">'+D(a)+"</span>"}),s>0&&(i+='<span class="package-tag">+'+s+" more</span>"),i+="</div>",i}function q(e,t,n){const r=e.graph.subDeps;if(!r)return"";const a=[{title:"Dependencies",key:"dep"},{title:"Optional",key:"opt"},{title:"Peer",key:"peer"},{title:"Dev Dependencies",key:"dev"}];let s=0,i=0;for(const l of a){const e=r[l.key];if(e)for(const t of Object.values(e))s+=1,t[1]&&(i+=1)}if(0===s)return"";const o='<div class="declared-summary">Total: '+s+" • Installed: "+i+" • Not installed: "+(s-i)+"</div>",c=a.map(e=>{const a=r[e.key];if(!a||0===Object.keys(a).length)return"";let s=0,i=0;const o=Object.entries(a).sort(([e],[t])=>e.localeCompare(t)).map(([e,[r,a]])=>{s+=1,a&&(i+=1);const o='<div class="declared-name">'+D(e)+"</div>",c='<div class="declared-range">'+D(r)+"</div>",l=a?function(e,t,n){const r=U(e,t,n);return r?'<a class="status-pill installed root-package-link" href="#'+D(G(r))+'" data-dep-key="'+D(r)+'" aria-label="Jump to dependency '+D(r)+'">Installed</a>':'<span class="status-pill installed">Installed</span>'}(a,t,n):'<span class="status-pill missing">Not installed</span>';return'<div class="declared-row">'+o+c+l+"</div>"}),c=i+" of "+s+" installed";return['<details class="declared-group">','<summary class="declared-group-summary"><span class="expand-icon" aria-hidden="true"></span><span class="declared-group-title">'+D(e.title)+' <span class="declared-count">('+c+")</span></span></summary>",'<div class="declared-table">'+o.join("")+"</div>","</details>"].join("")}).filter(Boolean);return z("Declared Dependencies","Dependencies declared by this package",o+'<div class="declared-deps">'+c.join("")+"</div>")}function z(e,t,n){let r='<div class="section">';return r+='<div class="section-header">',r+='<span class="section-title">'+D(e)+"</span>",t&&(r+='<span class="section-desc">'+D(t)+"</span>"),r+="</div>",r+=n,r+="</div>",r}function K(e,t,n,r){let a='<div class="subsection'+(r?" "+r:"")+'">';return a+='<div class="subsection-header">',a+='<span class="subsection-title">'+D(e)+"</span>",n&&(a+='<span class="subsection-desc">'+D(n)+"</span>"),a+="</div>",a+=t,a+="</div>",a}function J(e){if(!e)return;const t=e.trim();if(!t)return;const n=e=>e.replace(/\\.git\$/i,"");if(/^https?:\\/\\//i.test(t))return n(t);if(/^git\\+https?:\\/\\//i.test(t))return n(t.replace(/^git\\+/,""));if(/^git:\\/\\/github\\.com\\//i.test(t))return n(t.replace(/^git:\\/\\//i,"https://"));if(/^github:/i.test(t)){const e=t.slice(7).replace(/^\\/+/,"");return e?\`https://github.com/\${n(e)}\`:void 0}if(/^git@github\\.com:/i.test(t)){const e=t.slice(15);return e?\`https://github.com/\${n(e)}\`:void 0}return/^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+\$/.test(t)?\`https://github.com/\${n(t)}\`:void 0}function Z(e,t){const n=J(e);if(!n)return;let r;try{r=new URL(n)}catch{return}if("github.com"!==r.hostname.toLowerCase())return;const a=r.pathname.split("/").filter(Boolean);if(a.length<2)return;const s=a[0],i=a[1].replace(/\\.git\$/i,"");return s&&i?\`https://github.com/\${s}/\${i}/blob/HEAD/\${t}\`:void 0}function Q(e,t){return t?D(e)+' <a class="kv-inline-link" href="'+D(t)+'" target="_blank" rel="noopener noreferrer">GitHub<svg class="kv-inline-link-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M7 17 17 7"/><path d="M9 7h8v8"/></svg></a>':D(e)}function ee(e){const t='<svg viewBox="0 0 24 24" fill="currentColor"><path d="M0 7.334v8h6.666v1.332H12v-1.332h12v-8H0zm6.666 6.664H5.334v-4H3.999v4H1.335V8.667h5.331v5.331zm4 0v1.336H8.001V8.667h5.334v5.332h-2.669v-.001zm12.001 0h-1.33v-4h-1.336v4h-1.335v-4h-1.33v4h-2.671V8.667h8.002v5.331zM10.665 10H12v2.667h-1.335V10z"/></svg>',n='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/></svg>',r='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>',a='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>';if(!(e.npm||e.repository||e.homepage||e.issues))return"";let s='<div class="package-links">';return e.npm&&(s+='<a href="'+D(e.npm)+'" target="_blank" rel="noopener" class="package-link">'+t+"npm</a>"),e.repository&&(s+='<a href="'+D(e.repository)+'" target="_blank" rel="noopener" class="package-link">'+n+"Repository</a>"),e.homepage&&(s+='<a href="'+D(e.homepage)+'" target="_blank" rel="noopener" class="package-link">'+a+"Homepage</a>"),e.issues&&(s+='<a href="'+D(e.issues)+'" target="_blank" rel="noopener" class="package-link">'+r+"Issues</a>"),s+="</div>",s}function te(e){const t=function(e,t){const n=[e.risk,t];return n.includes("red")?"red":n.includes("amber")?"amber":"green"}(P(e).summary,e.compliance.licenseRisk),n=O(e.package.name,e.package.version),r=G(n),a=B(e),s=['<summary class="dep-summary">','<span class="expand-icon" aria-hidden="true"></span>','<span class="dep-name">'+D(e.package.name)+'<span class="dep-version">@'+D(e.package.version)+"</span></span>",'<div class="dep-indicators" style="--column-count: '+C+'">',a,"</div>","</summary>"].join("");return['<details class="dep-card" data-risk="'+t+'" data-dep-key="'+D(n)+'" id="'+D(r)+'">',s,'<div class="dep-details" data-rendered="false"></div>',"</details>"].join("")}function ne(e,t,n){const r=P(e),a=r.summary,s=S(e),i=s.isInferred?\`\${s.value} (inferred)\`:s.value,o=function(e){const t=e.package?.links||{},n=e.links||{},r=J(t.repository||n.repository||n.repo);return{npm:t.npm||n.npm,repository:r||t.repository||n.repository||n.repo,homepage:t.homepage||n.homepage,issues:t.bugs||t.issues||n.bugs||n.issues}}(e),c=JSON.stringify(e,null,2),l=[e.usage.direct?"Direct dependency":"Indirect dependency (transitive)","Scope: "+(d=e.usage.scope,"runtime"===d?"Runtime":"dev"===d?"Dev":"optional"===d?"Optional":"peer"===d?"Peer":d)];var d;e.package.description&&l.unshift("Description: "+e.package.description),e.usage.origins.workspaces?.length&&l.push("Used in "+e.usage.origins.workspaces.length+" workspaces"),e.usage.importUsage&&l.push("Imported in "+e.usage.importUsage.fileCount+" project files"),e.usage.introduction&&l.push("Introduced by: "+X(e.usage.introduction)),l.length<3&&l.push("Dependency depth: "+e.usage.depth);var u,p;const h=z("Overview","Summary and key context",'<div class="micro-summary">'+l.slice(0,5).map(e=>'<div class="micro-line">'+D(e)+"</div>").join("")+"</div>"+(e.usage.origins.workspaces?.length?'<div class="micro-sublist"><div class="micro-subtitle">Workspaces</div>'+V(e.usage.origins.workspaces,8)+"</div>":"")+('<div class="section-block"><div class="block-title">Key context</div><div class="kv-grid kv-grid-tight">'+[e.usage.runtimeImpact?N("Runtime impact",(p=e.usage.runtimeImpact,p?X(p):"")):"",N("Dependency depth",e.usage.depth),R("Introduced via root packages",_(e.usage.origins.topRootPackages,8,t,n)),N("Direct roots",e.usage.origins.rootPackageCount),R("Direct parents",H(e.usage.origins.topParentPackages,8,t,n)),N("Direct parents count",e.usage.origins.parentPackageCount??0),N("TypeScript types",(u=e.usage.tsTypes,"bundled"===u?"Bundled":"definitelyTyped"===u?"DefinitelyTyped":"none"===u?"None":"Unknown"))].filter(Boolean).join("")+"</div></div>")+function(e,t,n,r){if(!t||0===t.length)return"";const a=t.slice(0,n),s=t.length-n;let i='<div class="detail-list">';return i+='<div class="detail-title">'+D(e)+"</div>",i+='<ul class="detail-items '+r+'">',a.forEach(e=>{i+='<li class="detail-item">'+D(e)+"</li>"}),s>0&&(i+='<li class="detail-item muted">+'+s+" more</li>"),i+="</ul></div>",i}("Top import locations",e.usage.importUsage?.topFiles,5,"mono")),g=e.compliance.license,m=Z(o.repository,"package.json"),f=Z(o.repository,"LICENSE"),y=[R("Primary license",T(i,e.compliance.licenseRisk)),N("Status",L(g.status))];if(g.declared){const e=[g.declared.valid?"valid":"invalid",g.declared.expression?"expression":void 0,g.declared.deprecated?"deprecated":void 0].filter(Boolean).join(", "),t=g.exception?.id?\` WITH \${g.exception.id}\`:"";y.push(R("Declared SPDX in package.json",'<span class="kv-value">'+Q(\`\${g.declared.spdxId}\${t}\${e?\` (\${e})\`:""}\`,m)+"</span>"))}g.inferred&&y.push(R("Inferred from LICENSE file",'<span class="kv-value">'+Q(\`\${g.inferred.spdxId} (\${g.inferred.confidence})\`,f)+"</span>")),"mismatch"===g.status&&y.push(N("Mismatch","Declared SPDX and LICENSE text do not match")),"invalid-spdx"===g.status&&y.push(N("Invalid SPDX","Package.json license is not a valid SPDX identifier or expression"));const k=K("License",'<div class="kv-grid">'+y.join("")+"</div>"),b=a.critical+a.high+a.moderate+a.low,w=[R("Known vulnerabilities",T(0===b?"None":String(b),a.risk)),N("Highest severity","none"===a.highest?"None":X(a.highest))],E=b>0?'<div class="kv-grid kv-grid-tight">'+[N("Critical",a.critical),N("High",a.high),N("Moderate",a.moderate),N("Low",a.low)].join("")+"</div>":"",x=function(e){if(!e||0===e.length)return"";let t='<table class="vuln-table"><thead><tr>';return t+="<th>Title</th><th>Severity</th><th>Affected range</th><th>Fix available</th><th>Reference</th>",t+="</tr></thead><tbody>",e.forEach(e=>{const n=D(e.title),r=e.url?'<a href="'+D(e.url)+'" target="_blank" rel="noopener">Link</a>':"";t+='<tr data-severity="'+D(e.severity)+'">',t+='<td data-label="Title">'+n+"</td>",t+='<td data-label="Severity">'+D(Y(e.severity))+"</td>",t+='<td data-label="Affected range">'+D(e.vulnerableRange)+"</td>",t+='<td data-label="Fix available">'+D(e.fixAvailable?"Yes":"No")+"</td>",t+='<td data-label="Reference">'+r+"</td>",t+="</tr>"}),t+="</tbody></table>",t}(r.advisories),I=z("Risk & Compliance","License, vulnerabilities, and install-time execution signals",k+K("VULNERABILITIES",['<div class="section-note">Based on npm audit findings (known disclosed issues).</div>','<div class="kv-grid">'+w.join("")+"</div>",E?'<div class="subtle-divider"></div>'+E:"",x?'<div class="subtle-divider"></div>'+x:""].join(""),"Known security issues from npm audit","vuln-block")+(e.execution?function(e){const t=[R("Execution risk",T((n=e.risk,"red"===n?"High":"amber"===n?"Medium":"Low"),e.risk))];var n;if(e.native&&t.push(N("Native build tooling detected (native)","Yes")),e.scripts?.hooks?.length&&t.push(R("Lifecycle hooks",V(e.scripts.hooks,6))),"number"==typeof e.scripts?.complexity&&t.push(N("Heuristic complexity","Script complexity: "+e.scripts.complexity+" (complexity)")),e.scripts?.signals?.length){const n=e.scripts.signals.map(e=>\`\${v[e]} (\${e})\`);t.push(R("Install-time signals",V(n,6)))}return K("Install-time execution behaviour",'<div class="section-note">Install-time behaviour signals detected. These describe code that runs automatically during install and may warrant review in security-sensitive environments.</div><div class="kv-grid">'+t.join("")+"</div>")}(e.execution):"")),C=[N("Outdated status",(M=e.upgrade.outdatedStatus,M?"unknown"===M?"Unknown":X(M):"Not reported"))];var M;e.upgrade.latestVersion&&C.push(N("Latest version",e.upgrade.latestVersion));const B=K("Version",'<div class="section-note">Based on npm outdated findings.</div><div class="kv-grid">'+C.join("")+"</div>"),A=e.package.deprecated?K("Deprecated",'<div class="kv-grid">'+N("Deprecated","Yes","Declared by the package author.")+"</div>",void 0,"warning"):"",O=[N("Node engine constraint",e.upgrade.nodeEngine||"Any")];void 0!==e.upgrade.blocksNodeMajor&&O.push(N("Blocks Node major upgrade",e.upgrade.blocksNodeMajor?"Yes":"No"));const j=K("Constraints",'<div class="kv-grid">'+O.join("")+"</div>"),\$=K("Blast radius",'<div class="kv-grid">'+[N("Used by other packages (fanIn)",e.graph.fanIn),N("Depends on packages (fanOut)",e.graph.fanOut)].join("")+"</div>"),G={nodeEngine:"Node engine constraint",peerDependency:"Peer dependency constraints",nativeBindings:"Native bindings/build tooling",installScripts:"Install lifecycle scripts",deprecated:"Deprecated by author"},F=z("Upgrade & Change Impact","Currency, constraints, and blast radius",B+A+j+\$+(e.upgrade.blockers?.length?'<div class="subsection"><div class="subsection-header"><span class="subsection-title">Upgrade blockers</span></div><ul class="bullet-list">'+e.upgrade.blockers.map(e=>"<li>"+D(G[e]||e)+"</li>").join("")+"</ul></div>":"")),W=q(e,t,n);return[ee(o),h,I,F,W,'<details class="raw-data-toggle"><summary><span class="expand-icon" aria-hidden="true"></span>View raw data</summary><div class="raw-data-pane"><pre>'+D(c)+'</pre><button type="button" class="copy-json-btn" aria-label="Copy raw JSON">Copy JSON</button></div></details>'].join("")}async function re(){const e=await async function(){const e=document.getElementById("radar-data");return e&&e.textContent&&"{}"!==e.textContent.trim()?JSON.parse(e.textContent):(await fetch("./sample-data.json")).json()}();void 0===window.__DEPENDENCY_DATA__&&(window.__DEPENDENCY_DATA__=e);const t=document.getElementById("dependency-list"),n=document.getElementById("results-summary"),r=function(e){const t="string"==typeof e&&e.trim().length>0?e.trim():"unknown";return\`https://dependency-radar.com/next-steps?source=standalone-report&cli=\${encodeURIComponent(t)}\`}(e.dependencyRadarVersion),a=document.getElementById("project-path");a&&(a.textContent=e.project.projectDir);const s=document.getElementById("cta-primary-link"),i=document.getElementById("cta-secondary-link");s&&(s.href=r),i&&(i.href=r);const o=document.getElementById("git-branch-item"),c=document.getElementById("git-branch");e.git?.branch&&e.git.branch&&o&&c&&(c.textContent=e.git.branch,o.style.display="");const l=document.getElementById("node-item"),d=document.getElementById("node-version"),u=document.getElementById("node-disclaimer");if(e.environment&&l&&d){const t=e.environment.runtimeVersion?.replace(/^v/,"")||"unknown",n=e.environment.minRequiredMajor;d.textContent=t+(n&&n>0?\` (requires ≥\${n})\`:""),l.style.display="",n&&n>0&&u&&(u.textContent="Node requirement derived from dependency engine ranges.",u.style.display="")}const p=document.getElementById("formatted-date");if(p&&e.generatedAt)try{const t=new Date(e.generatedAt),n=new Intl.DateTimeFormat(void 0,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"}).format(t);p.textContent=n}catch{p.textContent=e.generatedAt}const h={search:document.getElementById("search"),direct:document.getElementById("direct-filter"),runtime:document.getElementById("runtime-filter"),sort:document.getElementById("sort-by"),sortDirection:document.getElementById("sort-direction"),hasVulns:document.getElementById("has-vulns"),themeSwitch:document.getElementById("theme-switch"),licenseToggle:document.getElementById("license-toggle"),licensePanel:document.getElementById("license-panel"),licensePermissive:document.getElementById("license-permissive"),licenseWeakCopyleft:document.getElementById("license-weak-copyleft"),licenseStrongCopyleft:document.getElementById("license-strong-copyleft"),licenseUnknown:document.getElementById("license-unknown"),licenseAll:document.getElementById("license-all"),licenseFriendly:document.getElementById("license-friendly"),filtersToggle:document.getElementById("filters-toggle"),filterControls:document.getElementById("filter-controls"),columnHeadersContainer:document.getElementById("column-headers-container"),packageHeader:document.getElementById("package-header"),viewGraphButton:document.getElementById("view-graph-btn"),graphBackButton:document.getElementById("graph-back-btn"),listViewPanel:document.getElementById("list-view"),graphViewPanel:document.getElementById("graph-view"),graphWorkspaceSelect:document.getElementById("graph-workspace"),graphWorkspaceWrap:document.getElementById("graph-workspace-wrap"),graphControls:document.getElementById("graph-controls"),graphCanvas:document.getElementById("graph-canvas"),graphCanvasShell:document.getElementById("graph-canvas-shell"),graphPopover:document.getElementById("graph-popover"),graphPopoverName:document.getElementById("graph-popover-name"),graphPopoverVersion:document.getElementById("graph-popover-version"),graphPopoverLicense:document.getElementById("graph-popover-license"),graphPopoverVulns:document.getElementById("graph-popover-vulns"),graphPopoverAmplification:document.getElementById("graph-popover-amplification"),graphOpenList:document.getElementById("graph-open-list"),reportFooter:document.querySelector(".report-footer")};let v="name",f=!0,y=null,k=!1;document.documentElement.setAttribute("data-theme","dark");"light"===localStorage.getItem("dependency-radar-theme")?(document.documentElement.classList.add("light"),h.themeSwitch.classList.add("light"),document.documentElement.setAttribute("data-theme","light")):(document.documentElement.classList.remove("light"),h.themeSwitch.classList.remove("light"),document.documentElement.setAttribute("data-theme","dark")),h.themeSwitch.addEventListener("click",()=>{document.documentElement.classList.toggle("light"),h.themeSwitch.classList.toggle("light");const e=document.documentElement.classList.contains("light");document.documentElement.setAttribute("data-theme",e?"light":"dark"),localStorage.setItem("dependency-radar-theme",e?"light":"dark"),y?.requestRender()});const b=window.matchMedia("(max-width: 768px)");let w=b.matches;const E=e=>{h.filterControls&&h.filtersToggle&&(h.filterControls.classList.toggle("open",e),h.filtersToggle.classList.toggle("open",e),h.filtersToggle.setAttribute("aria-expanded",String(e)))},x=()=>{if(b.matches)return E(!1),h.licensePanel.classList.add("open"),h.licenseToggle.classList.add("open"),void(w=!0);w&&(E(!1),h.licensePanel.classList.remove("open"),h.licenseToggle.classList.remove("open")),w=!1};function C(){if(h.columnHeadersContainer&&(h.columnHeadersContainer.innerHTML=A(v,f)),h.packageHeader){const e=h.packageHeader.querySelector(".sort-indicator");e&&("name"===v?(e.textContent=f?" ▲":" ▼",h.packageHeader.classList.add("sorted")):(e.textContent="",h.packageHeader.classList.remove("sorted")))}}function L(e){const t=e.target.closest(".column-header");if(!t)return;const n=t.dataset.sort;n&&(v===n?f=!f:(v=n,f=!0),h.sort&&(h.sort.value=v,h.sortDirection.textContent=f?"↑":"↓"),C(),W())}h.licenseToggle.addEventListener("click",()=>{b.matches||(h.licenseToggle.classList.toggle("open"),h.licensePanel.classList.toggle("open"))}),h.filtersToggle&&h.filterControls&&h.filtersToggle.addEventListener("click",()=>{const e=!h.filterControls.classList.contains("open");E(e)}),window.addEventListener("resize",x),x(),h.sortDirection.addEventListener("click",()=>{f=!f,h.sortDirection.textContent=f?"↑":"↓",C(),W()}),h.sort.addEventListener("change",()=>{v=h.sort.value,C(),W()}),h.columnHeadersContainer&&h.columnHeadersContainer.addEventListener("click",L),h.packageHeader&&h.packageHeader.addEventListener("click",L),C(),h.licenseAll.addEventListener("click",()=>{h.licensePermissive.checked=!0,h.licenseWeakCopyleft.checked=!0,h.licenseStrongCopyleft.checked=!0,h.licenseUnknown.checked=!0,T.clear(),W()}),h.licenseFriendly.addEventListener("click",()=>{h.licensePermissive.checked=!0,h.licenseWeakCopyleft.checked=!1,h.licenseStrongCopyleft.checked=!1,h.licenseUnknown.checked=!1,T.clear(),W()});const D=Object.values(e.dependencies||{}),Y=new Map;D.forEach(e=>{Y.set(O(e.package.name,e.package.version),e)});const X=new Set(Y.keys()),B=F(X),N=new Set,T=new Set,R=new Map,V=(()=>{const e=document.getElementById("copy-announcer");if(e)return e;const t=document.createElement("div");return t.id="copy-announcer",t.className="sr-only",t.setAttribute("aria-live","polite"),document.body.appendChild(t),t})();function H(e){const t=e.dataset.depKey;if(!t)return;const n=e.querySelector(".dep-details");if(!n||"true"===n.dataset.rendered)return;const r=Y.get(t);r&&(n.setAttribute("aria-busy","true"),n.innerHTML=['<div class="dep-loading" role="presentation">','<div class="dep-loading-bar"></div>',"</div>"].join(""),requestAnimationFrame(()=>{n.innerHTML=ne(r,X,B),n.dataset.rendered="true",n.removeAttribute("aria-busy")}))}function j(){const e=(h.search.value||"").toLowerCase(),t=h.direct.value,n=h.runtime.value,r=h.hasVulns.checked,a=h.licensePermissive.checked,s=h.licenseWeakCopyleft.checked,i=h.licenseStrongCopyleft.checked,o=h.licenseUnknown.checked;return D.filter(c=>{const l=O(c.package.name,c.package.version);if(T.has(l))return!0;const d=S(c),u=[d.value,c.compliance.license.declared?.spdxId,c.compliance.license.inferred?.spdxId].filter(Boolean).join(" ").toLowerCase();if(e&&!c.package.name.toLowerCase().includes(e)&&!u.includes(e))return!1;if("direct"===t&&!c.usage.direct)return!1;if("transitive"===t&&c.usage.direct)return!1;if("all"!==n&&c.usage.scope!==n)return!1;if(r&&0===M[(p=P(c).summary,p?.highest||"none")])return!1;var p;const h=function(e){if(!e)return"unknown";const t=e.toUpperCase();for(const[n,r]of Object.entries(m))if(r.some(e=>t.includes(e.toUpperCase())))return n;return"unknown"}(d.value);return!("permissive"===h&&!a)&&(!("weakCopyleft"===h&&!s)&&(!("strongCopyleft"===h&&!i)&&!("unknown"===h&&!o)))})}function W(){const r=function(e){const t=[...e];if("name"===v)t.sort((e,t)=>e.package.name.localeCompare(t.package.name));else if("depth"===v)t.sort((e,t)=>e.usage.depth-t.usage.depth);else{const e=I.find(e=>e.sortKey===v||e.id===v);e?.sortFn?t.sort(e.sortFn):e&&t.sort((t,n)=>e.getValue(t).localeCompare(e.getValue(n)))}return f||t.reverse(),t}(j()),a=e.summary?.dependencyCount||D.length;n.innerHTML="Showing <strong>"+r.length+"</strong> of <strong>"+a+"</strong> dependencies",0!==r.length?(t.innerHTML=r.map(te).join(""),R.clear(),t.querySelectorAll("details.dep-card").forEach(e=>{const t=e.dataset.depKey;t&&R.set(t,e)}),N.forEach(e=>{const t=R.get(e);t&&(t.open||(t.open=!0),H(t))})):t.innerHTML='<div class="empty-state"><div class="empty-state-icon">📦</div><div class="empty-state-text">No dependencies match your filters</div></div>'}function U(e){const t=B.get(e)||[];return 1===t.length?t[0]:null}function _(e){if(Y.has(e))return e;const t=\$(e);if(!t)return U(e);if(t.version.startsWith("npm:")){const e=t.version.slice(4),n=t.name+(e.startsWith("@")?e:"@"+e);if(Y.has(n))return n}return U(t.name)}function q(t){if(!h.listViewPanel||!h.graphViewPanel)return void console.warn("Dependency Radar: view panels are missing from the report DOM.");const n="list"===t;n||Boolean(h.graphWorkspaceSelect&&h.graphWorkspaceWrap&&h.graphControls&&h.graphCanvas&&h.graphCanvasShell&&h.graphPopover&&h.graphPopoverName&&h.graphPopoverVersion&&h.graphPopoverLicense&&h.graphPopoverVulns&&h.graphPopoverAmplification&&h.graphOpenList)?(h.listViewPanel.classList.toggle("active",n),h.graphViewPanel.classList.toggle("active",!n),h.listViewPanel.setAttribute("aria-hidden",String(!n)),h.graphViewPanel.setAttribute("aria-hidden",String(n)),h.viewGraphButton&&(h.viewGraphButton.style.display=n?"":"none"),h.graphBackButton&&(h.graphBackButton.style.display=n?"none":""),h.reportFooter?.classList.toggle("hidden",!n),document.body.classList.toggle("graph-mode",!n),n?y?.setActive(!1):(k||(y=g({report:e,knownDepKeys:X,resolveDepKey:_,workspaceSelect:h.graphWorkspaceSelect,workspaceWrap:h.graphWorkspaceWrap,controlsRoot:h.graphControls,canvas:h.graphCanvas,canvasHost:h.graphCanvasShell,popover:h.graphPopover,popoverName:h.graphPopoverName,popoverVersion:h.graphPopoverVersion,popoverLicense:h.graphPopoverLicense,popoverVulns:h.graphPopoverVulns,popoverAmplification:h.graphPopoverAmplification,popoverOpenButton:h.graphOpenList,onOpenList:e=>{!function(e){q("list");let t=document.getElementById(G(e));!t&&Y.has(e)&&(T.add(e),W(),t=document.getElementById(G(e)));if(!t)return;if(t instanceof HTMLDetailsElement){const e=t.dataset.depKey;e&&N.add(e),t.open||(t.open=!0),H(t)}t.classList.add("dep-list-highlight"),t.scrollIntoView({behavior:"smooth",block:"center"}),window.setTimeout(()=>{t?.classList.remove("dep-list-highlight")},2e3)}(e)}}),y.initGraphView(),k=!0),y?.setActive(!0),y?.requestRender())):console.warn("Dependency Radar: graph view DOM nodes are missing; graph view disabled.")}const z=[h.search,h.direct,h.runtime,h.sort,h.hasVulns,h.licensePermissive,h.licenseWeakCopyleft,h.licenseStrongCopyleft,h.licenseUnknown],K=()=>{T.clear(),W()};function J(e){const t=e.getAttribute("data-dep-key");if(!t)return;const n=_(t);if(!n)return;let r=R.get(n);if(r||(T.add(n),W(),r=R.get(n)),!r)return;N.add(n),r.open||(r.open=!0),H(r);const a=()=>{r.scrollIntoView({behavior:"smooth",block:"start"});const e=r.querySelector("summary");e&&e.focus({preventScroll:!0})};requestAnimationFrame(()=>{a(),window.setTimeout(a,60)})}z.forEach(e=>{e&&(e.addEventListener("input",K),e.addEventListener("change",K))}),h.viewGraphButton?.addEventListener("click",()=>{q("graph")}),h.graphBackButton?.addEventListener("click",()=>{q("list")}),t.addEventListener("toggle",e=>{const t=e.target;if(!(t instanceof HTMLDetailsElement))return;if(!t.classList.contains("dep-card"))return;const n=t.dataset.depKey;n&&(t.open?(N.add(n),H(t)):N.delete(n))},!0),t.addEventListener("click",e=>{const t=e.target,n=t.closest(".root-package-link");if(n)return e.preventDefault(),void J(n);const r=t.closest(".copy-json-btn");r&&(e.preventDefault(),async function(e){const t=e.closest(".raw-data-toggle"),n=t?.querySelector("pre"),r=n?.textContent??"";if(r)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(r);else{const e=document.createElement("textarea");e.value=r,e.setAttribute("readonly","true"),e.style.position="absolute",e.style.left="-9999px",document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}const t=e.dataset.label||e.textContent||"Copy JSON";e.dataset.label=t,e.textContent="Copied",e.classList.add("copied"),V.textContent="Copied JSON to clipboard.",window.setTimeout(()=>{e.textContent=t,e.classList.remove("copied")},1500)}catch{V.textContent="Copy failed."}}(r))}),t.addEventListener("keydown",e=>{const t=e.target.closest(".root-package-link");t&&(" "!==e.key&&"Spacebar"!==e.key||(e.preventDefault(),J(t)))}),C(),W(),q("list")}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",re):re()}();
18
18
  `;
@@ -244,7 +244,10 @@ function buildPnpmNode(packageKey, snapshots, index, memo, installState, stack)
244
244
  dependencies: {}
245
245
  };
246
246
  stack.add(packageKey);
247
- const childRefs = mergeStringRecord(snapshot === null || snapshot === void 0 ? void 0 : snapshot.dependencies, mergeStringRecord(snapshot === null || snapshot === void 0 ? void 0 : snapshot.optionalDependencies, snapshot === null || snapshot === void 0 ? void 0 : snapshot.peerDependencies));
247
+ // pnpm snapshots already carry resolved installed deps in `dependencies`/`optionalDependencies`.
248
+ // Do not traverse `peerDependencies` ranges here: they can overwrite resolved child refs
249
+ // (for example `child: ^1.0.0` over `child: 1.0.0`) and incorrectly drop installed nodes.
250
+ const childRefs = mergeStringRecord(snapshot === null || snapshot === void 0 ? void 0 : snapshot.dependencies, snapshot === null || snapshot === void 0 ? void 0 : snapshot.optionalDependencies);
248
251
  for (const [childName, childRef] of Object.entries(childRefs)) {
249
252
  if (!childRef || isWorkspaceLikeSpecifier(childRef))
250
253
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dependency-radar",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Local-first dependency analysis tool that generates a single HTML report showing risk, size, usage, and structure of your project's dependencies.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {