dependency-radar 0.3.1 → 0.5.0

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.
@@ -71,6 +71,7 @@ exports.SPDX_LICENSE_IDS = new Set([
71
71
  'BlueOak-1.0.0',
72
72
  'Boehm-GC',
73
73
  'Boehm-GC-without-fee',
74
+ 'BOLA-1.1',
74
75
  'Borceux',
75
76
  'Brian-Gladman-2-Clause',
76
77
  'Brian-Gladman-3-Clause',
@@ -565,6 +566,7 @@ exports.SPDX_LICENSE_IDS = new Set([
565
566
  'OPL-1.0',
566
567
  'OPL-UK-3.0',
567
568
  'OPUBL-1.0',
569
+ 'OSC-1.0',
568
570
  'OSET-PL-2.1',
569
571
  'OSL-1.0',
570
572
  'OSL-1.1',
@@ -839,6 +841,7 @@ exports.SPDX_EXCEPTION_IDS = new Set([
839
841
  'SHL-2.0',
840
842
  'SHL-2.1',
841
843
  'Simple-Library-Usage-exception',
844
+ 'sqlitestudio-OpenSSL-exception',
842
845
  'stunnel-exception',
843
846
  'SWI-exception',
844
847
  'Swift-exception',
@@ -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}: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%)}html{scroll-behavior:smooth}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}.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}.cta-link:hover{background:var(--accent-hover);transform:translateY(-1px);box-shadow:0 4px 12px #06b6d459}.cta-benefits{margin-top:8px;font-size:11px;color:var(--text-muted);line-height:1.5;text-align:left;padding-left:2px}.cta-benefits span{display:block;padding-left:12px;position:relative}.cta-benefits span:before{content:"→";position:absolute;left:0;color:var(--accent);font-size:10px}.cta-text{display:block;font-size:11px;color:var(--text-muted);margin-top:6px}.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;transition:background var(--transition),border-color var(--transition)}.filter-bar-inner{max-width:1400px;margin:0 auto;display:flex;flex-wrap:wrap;align-items:center;gap:12px}.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;-webkit-appearance:none;-moz-appearance:none;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-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{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:200px;border-bottom-color:var(--border-color)}.license-filter-inner{max-width:1400px;margin:0 auto;padding:12px 24px}.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:16px 24px 48px}.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}.results-summary{margin-bottom:16px;font-size:14px;color:var(--text-secondary)}.results-summary strong{color:var(--text-primary)}.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}.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}.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: 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-bar-inner{flex-direction:column;align-items:stretch;gap:10px}.search-wrapper{max-width:none}.filter-group{justify-content:space-between}.theme-toggle{margin-left:0;justify-content:flex-end}.main-content{padding:12px 16px 32px}.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{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}: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%)}html{scroll-behavior:smooth}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}.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;-webkit-appearance:none;-moz-appearance:none;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}.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}.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}.search-wrapper{max-width:none}.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}.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={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"]},t={"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 n(t){if(!t)return"unknown";const n=t.toUpperCase();for(const[s,a]of Object.entries(e))if(a.some(e=>n.includes(e.toUpperCase())))return s;return"unknown"}function s(e){var t,n;const s=e.compliance.license,a=(null==(t=s.declared)?void 0:t.valid)?s.declared.spdxId:void 0,i=null==(n=s.inferred)?void 0:n.spdxId;return a?{value:a,isInferred:!1}:i?{value:i,isInferred:!0}:{value:"Unknown",isInferred:!1}}function a(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 i={none:0,low:1,moderate:2,high:3,critical:4};function r(e){const t=e.security;if(null==t?void 0:t.summary)return{summary:t.summary,advisories:t.advisories};if(null==t?void 0: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:null==t?void 0:t.advisories}}function o(e){return(null==e?void 0:e.highest)||"none"}function c(e){return e?String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}function l(e){return"runtime"===e?"Runtime":"dev"===e?"Dev":"optional"===e?"Optional":"peer"===e?"Peer":e}function d(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function u(e){return e.split(/[\\s-_]+/).map(e=>e?d(e):e).join(" ")}function p(e,t,n){return'<div class="badge-card '+n+'"><span class="badge-label">'+c(e)+'</span><span class="badge-value">'+c(t)+"</span></div>"}function g(e,t,n){let s='<div class="kv-item">';return s+='<span class="kv-label">'+c(e)+"</span>",s+='<span class="kv-value">'+c(String(t))+"</span>",n&&(s+='<span class="kv-hint">'+c(n)+"</span>"),s+="</div>",s}function v(e,t){return'<span class="kv-value risk-value"><span class="risk-dot '+t+'"></span>'+c(String(e))+"</span>"}function m(e,t,n){let s='<div class="kv-item">';return s+='<span class="kv-label">'+c(e)+"</span>",s+=t,s+="</div>",s}function h(e,t){if(!e||0===e.length)return'<span class="kv-value">None</span>';const n=e.slice(0,t),s=e.length-t;let a='<div class="package-list">';return n.forEach(e=>{a+='<span class="package-tag">'+c(e)+"</span>"}),s>0&&(a+='<span class="package-tag">+'+s+" more</span>"),a+="</div>",a}function y(e,t,n){if(!e||0===e.length)return'<span class="kv-value">None</span>';const s=e.slice(0,t),a=e.length-t;let i='<div class="package-list">';return s.forEach(e=>{n.has(e)?i+='<a class="package-tag package-tag-link root-package-link" href="#'+c(f(e))+'" data-dep-key="'+c(e)+'" aria-label="Jump to dependency '+c(e)+'">'+c(e)+"</a>":i+='<span class="package-tag">'+c(e)+"</span>"}),a>0&&(i+='<span class="package-tag">+'+a+" more</span>"),i+="</div>",i}function k(e,t){return e+"@"+t}function f(e){return"dep-"+encodeURIComponent(e).replace(/%/g,"_")}function b(e,t,n){if(!e||0===e.length)return'<span class="kv-value">None</span>';const s=e.slice(0,t),a=e.length-t;let i='<div class="package-list">';return s.forEach(e=>{if("string"==typeof e)return void(i+='<span class="package-tag">'+c(e)+"</span>");const t=k(e.name,e.version),s=e.name+"@"+e.version;n.has(t)?i+='<a class="package-tag package-tag-link root-package-link" href="#'+c(f(t))+'" data-dep-key="'+c(t)+'" aria-label="Jump to dependency '+c(s)+'">'+c(s)+"</a>":i+='<span class="package-tag">'+c(s)+"</span>"}),a>0&&(i+='<span class="package-tag">+'+a+" more</span>"),i+="</div>",i}function w(e,t){const n=e.graph.subDeps;if(!n)return"";const s=[{title:"Dependencies",key:"dep"},{title:"Optional",key:"opt"},{title:"Peer",key:"peer"},{title:"Dev Dependencies",key:"dev"}];let a=0,i=0;for(const c of s){const e=n[c.key];if(e)for(const t of Object.values(e))a+=1,t[1]&&(i+=1)}if(0===a)return"";const r='<div class="declared-summary">Total: '+a+" • Installed: "+i+" • Not installed: "+(a-i)+"</div>",o=s.map(e=>{const s=n[e.key];if(!s||0===Object.keys(s).length)return"";let a=0,i=0;const r=Object.entries(s).sort(([e],[t])=>e.localeCompare(t)).map(([e,[n,s]])=>{a+=1,s&&(i+=1);const r='<div class="declared-name">'+c(e)+"</div>",o='<div class="declared-range">'+c(n)+"</div>",l=s?function(e,t){if(!t.has(e))return'<span class="status-pill installed">Installed</span>';return'<a class="status-pill installed root-package-link" href="#'+c(f(e))+'" data-dep-key="'+c(e)+'" aria-label="Jump to dependency '+c(e)+'">Installed</a>'}(s,t):'<span class="status-pill missing">Not installed</span>';return'<div class="declared-row">'+r+o+l+"</div>"}),o=i+" of "+a+" installed";return['<details class="declared-group">','<summary class="declared-group-summary"><span class="expand-icon" aria-hidden="true"></span><span class="declared-group-title">'+c(e.title)+' <span class="declared-count">('+o+")</span></span></summary>",'<div class="declared-table">'+r.join("")+"</div>","</details>"].join("")}).filter(Boolean);return C("Declared Dependencies","Dependencies declared by this package",r+'<div class="declared-deps">'+o.join("")+"</div>")}function C(e,t,n){let s='<div class="section">';return s+='<div class="section-header">',s+='<span class="section-title">'+c(e)+"</span>",t&&(s+='<span class="section-desc">'+c(t)+"</span>"),s+="</div>",s+=n,s+="</div>",s}function I(e,t,n,s){let a='<div class="subsection'+(s?" "+s:"")+'">';return a+='<div class="subsection-header">',a+='<span class="subsection-title">'+c(e)+"</span>",n&&(a+='<span class="subsection-desc">'+c(n)+"</span>"),a+="</div>",a+=t,a+="</div>",a}function x(e){return(null==e?void 0:e.risk)??"green"}function L(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>',s='<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 i='<div class="package-links">';return e.npm&&(i+='<a href="'+c(e.npm)+'" target="_blank" rel="noopener" class="package-link">'+t+"npm</a>"),e.repository&&(i+='<a href="'+c(e.repository)+'" target="_blank" rel="noopener" class="package-link">'+n+"Repository</a>"),e.homepage&&(i+='<a href="'+c(e.homepage)+'" target="_blank" rel="noopener" class="package-link">'+a+"Homepage</a>"),e.issues&&(i+='<a href="'+c(e.issues)+'" target="_blank" rel="noopener" class="package-link">'+s+"Issues</a>"),i+="</div>",i}function E(e){const t=r(e).summary,a=s(e),i=a.isInferred?\`\${a.value} (inferred)\`:a.value,u=n(a.value),g=function(e,t){const n=[e.risk,t];return n.includes("red")?"red":n.includes("amber")?"amber":"green"}(t,e.compliance.licenseRisk),v=o(t),m=k(e.package.name,e.package.version),h=f(m),y=e.usage.direct?"Dependency":"Sub-Dependency",b=e.usage.direct?"green":"amber",w="runtime"===e.usage.scope?"green":"dev"===e.usage.scope||"optional"===e.usage.scope?"amber":"gray",C=x(e.execution),I=function(e){const t=x(e);return"red"===t?"High":"amber"===t?"Medium":"Low"}(e.execution),L=[p("Type",y,b),p("Scope",l(e.usage.scope),w),p("License",i,{permissive:{text:"Permissive",class:"green"},weakCopyleft:{text:"Weak Copyleft",class:"amber"},strongCopyleft:{text:"Strong Copyleft",class:"red"},unknown:{text:"Unknown",class:"gray"}}[u].class),p("Vulns",d(v),t.risk),p("Install",I,C)],E=['<summary class="dep-summary">','<span class="expand-icon" aria-hidden="true"></span>','<span class="dep-name">'+c(e.package.name)+'<span class="dep-version">@'+c(e.package.version)+"</span></span>",'<div class="dep-indicators">',L.join(""),"</div>","</summary>"].join("");return['<details class="dep-card" data-risk="'+g+'" data-dep-key="'+c(m)+'" id="'+c(h)+'">',E,'<div class="dep-details" data-rendered="false"></div>',"</details>"].join("")}function S(e,n){var i,o,p,k,f;const x=r(e),E=x.summary,S=s(e),D=S.isInferred?\`\${S.value} (inferred)\`:S.value,P=function(e){var t;const n=(null==(t=e.package)?void 0:t.links)||{},s=e.links||{};return{npm:n.npm||s.npm,repository:n.repository||s.repository||s.repo,homepage:n.homepage||s.homepage,issues:n.bugs||n.issues||s.bugs||s.issues}}(e),B=JSON.stringify(e,null,2),j=[e.usage.direct?"Direct dependency":"Indirect dependency (transitive)","Scope: "+l(e.usage.scope)];e.package.description&&j.unshift("Description: "+e.package.description),(null==(i=e.usage.origins.workspaces)?void 0:i.length)&&j.push("Used in "+e.usage.origins.workspaces.length+" workspaces"),e.usage.importUsage&&j.push("Imported in "+e.usage.importUsage.fileCount+" project files"),e.usage.introduction&&j.push("Introduced by: "+u(e.usage.introduction)),j.length<3&&j.push("Dependency depth: "+e.usage.depth);var N,A;const T=C("Overview","Summary and key context",'<div class="micro-summary">'+j.slice(0,5).map(e=>'<div class="micro-line">'+c(e)+"</div>").join("")+"</div>"+((null==(o=e.usage.origins.workspaces)?void 0:o.length)?'<div class="micro-sublist"><div class="micro-subtitle">Workspaces</div>'+h(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?g("Runtime impact (runtimeImpact)",(A=e.usage.runtimeImpact,A?u(A):"")):"",g("Dependency depth",e.usage.depth),m("Introduced via root packages (topRootPackages)",b(e.usage.origins.topRootPackages,8,n)),g("Direct roots (rootPackageCount)",e.usage.origins.rootPackageCount),m("Direct parents (topParentPackages)",y(e.usage.origins.topParentPackages,8,n)),g("Direct parents (parentPackageCount)",e.usage.origins.parentPackageCount??0),g("TypeScript types (tsTypes)",(N=e.usage.tsTypes,"bundled"===N?"Bundled":"definitelyTyped"===N?"DefinitelyTyped":"none"===N?"None":"Unknown"))].filter(Boolean).join("")+"</div></div>")+function(e,t,n,s){if(!t||0===t.length)return"";const a=t.slice(0,n),i=t.length-n;let r='<div class="detail-list">';return r+='<div class="detail-title">'+c(e)+"</div>",r+='<ul class="detail-items '+s+'">',a.forEach(e=>{r+='<li class="detail-item">'+c(e)+"</li>"}),i>0&&(r+='<li class="detail-item muted">+'+i+" more</li>"),r+="</ul></div>",r}("Top import locations (topFiles)",null==(p=e.usage.importUsage)?void 0:p.topFiles,5,"mono")),U=e.compliance.license,M=[m("Primary license",v(D,e.compliance.licenseRisk)),g("Status (status)",a(U.status))];if(U.declared){const e=[U.declared.valid?"valid":"invalid",U.declared.expression?"expression":void 0,U.declared.deprecated?"deprecated":void 0].filter(Boolean).join(", "),t=(null==(k=U.exception)?void 0:k.id)?\` WITH \${U.exception.id}\`:"";M.push(g("Declared SPDX (declared)",\`\${U.declared.spdxId}\${t}\${e?\` (\${e})\`:""}\`))}U.inferred&&M.push(g("Inferred from LICENSE (inferred)",\`\${U.inferred.spdxId} (\${U.inferred.confidence})\`)),"mismatch"===U.status&&M.push(g("Mismatch","Declared SPDX and LICENSE text do not match")),"invalid-spdx"===U.status&&M.push(g("Invalid SPDX","Package.json license is not a valid SPDX identifier or expression"));const H=I("License",'<div class="kv-grid">'+M.join("")+"</div>"),O=E.critical+E.high+E.moderate+E.low,V=[m("Known vulnerabilities",v(0===O?"None":String(O),E.risk)),g("Highest severity","none"===E.highest?"None":u(E.highest))],R=O>0?'<div class="kv-grid kv-grid-tight">'+[g("Critical",E.critical),g("High",E.high),g("Moderate",E.moderate),g("Low",E.low)].join("")+"</div>":"",G=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=c(e.title),s=e.url?'<a href="'+c(e.url)+'" target="_blank" rel="noopener">Link</a>':"";t+='<tr data-severity="'+c(e.severity)+'">',t+='<td data-label="Title">'+n+"</td>",t+='<td data-label="Severity">'+c(d(e.severity))+"</td>",t+='<td data-label="Affected range">'+c(e.vulnerableRange)+"</td>",t+='<td data-label="Fix available">'+c(e.fixAvailable?"Yes":"No")+"</td>",t+='<td data-label="Reference">'+s+"</td>",t+="</tr>"}),t+="</tbody></table>",t}(x.advisories),\$=I("VULNERABILITIES",['<div class="section-note">Based on npm audit findings (known disclosed issues).</div>','<div class="kv-grid">'+V.join("")+"</div>",R?'<div class="subtle-divider"></div>'+R:"",G?'<div class="subtle-divider"></div>'+G:""].join(""),"Known security issues from npm audit","vuln-block"),q=e.execution?function(e){var n,s,a,i,r;const o=[g("Execution risk (risk)",u(e.risk))];if(e.native&&o.push(g("Native build tooling detected (native)","Yes")),(null==(s=null==(n=e.scripts)?void 0:n.hooks)?void 0:s.length)&&o.push(m("Lifecycle hooks",h(e.scripts.hooks,6))),"number"==typeof(null==(a=e.scripts)?void 0:a.complexity)&&o.push(g("Heuristic complexity","Script complexity: "+e.scripts.complexity+" (complexity)")),null==(r=null==(i=e.scripts)?void 0:i.signals)?void 0:r.length){const n=e.scripts.signals.map(e=>\`\${t[e]} (\${e})\`);o.push(m("Install-time signals",h(n,6)))}return I("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">'+o.join("")+"</div>")}(e.execution):"",J=C("Risk & Compliance","License, vulnerabilities, and install-time execution signals",H+\$+q),F=[g("Outdated status (outdatedStatus)",(W=e.upgrade.outdatedStatus,W?"unknown"===W?"Unknown":u(W):"Not reported"))];var W;e.upgrade.latestVersion&&F.push(g("Latest version (latestVersion)",e.upgrade.latestVersion));const _=I("Version",'<div class="section-note">Based on npm outdated findings.</div><div class="kv-grid">'+F.join("")+"</div>"),K=e.package.deprecated?I("Deprecated",'<div class="kv-grid">'+g("Deprecated (deprecated)","Yes","Declared by the package author.")+"</div>",void 0,"warning"):"",z=[g("Node engine constraint (nodeEngine)",e.upgrade.nodeEngine||"Any")];void 0!==e.upgrade.blocksNodeMajor&&z.push(g("Blocks Node major upgrade (blocksNodeMajor)",e.upgrade.blocksNodeMajor?"Yes":"No"));const X=I("Constraints",'<div class="kv-grid">'+z.join("")+"</div>"),Y=I("Blast radius",'<div class="kv-grid">'+[g("Used by other packages (fanIn)",e.graph.fanIn),g("Depends on packages (fanOut)",e.graph.fanOut)].join("")+"</div>"),Q={nodeEngine:"Node engine constraint (nodeEngine)",peerDependency:"Peer dependency constraints (peerDependency)",nativeBindings:"Native bindings/build tooling (nativeBindings)",deprecated:"Deprecated by author (deprecated)"},Z=C("Upgrade & Change Impact","Currency, constraints, and blast radius",_+K+X+Y+((null==(f=e.upgrade.blockers)?void 0:f.length)?'<div class="subsection"><div class="subsection-header"><span class="subsection-title">Upgrade blockers (blockers)</span></div><ul class="bullet-list">'+e.upgrade.blockers.map(e=>"<li>"+c(Q[e]||e)+"</li>").join("")+"</ul></div>":"")),ee=w(e,n);return[L(P),T,J,Z,ee,'<details class="raw-data-toggle"><summary><span class="expand-icon" aria-hidden="true"></span>View raw data</summary><div class="raw-data-pane"><pre>'+c(B)+'</pre><button type="button" class="copy-json-btn" aria-label="Copy raw JSON">Copy JSON</button></div></details>'].join("")}async function D(){var e,t;const a=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()}(),c=document.getElementById("dependency-list"),l=document.getElementById("results-summary"),d=document.getElementById("project-path");d&&(d.textContent=a.project.projectDir);const u=document.getElementById("git-branch-item"),p=document.getElementById("git-branch");(null==(e=a.git)?void 0:e.branch)&&a.git.branch&&u&&p&&(p.textContent=a.git.branch,u.style.display="");const g=document.getElementById("node-item"),v=document.getElementById("node-version"),m=document.getElementById("node-disclaimer");if(a.environment&&g&&v){const e=(null==(t=a.environment.runtimeVersion)?void 0:t.replace(/^v/,""))||"unknown",n=a.environment.minRequiredMajor;v.textContent=e+(n&&n>0?\` (requires ≥\${n})\`:""),g.style.display="",n&&n>0&&m&&(m.textContent="Node requirement derived from dependency engine ranges.",m.style.display="")}const h=document.getElementById("formatted-date");if(h&&a.generatedAt)try{const e=new Date(a.generatedAt),t=new Intl.DateTimeFormat(void 0,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"}).format(e);h.textContent=t}catch{h.textContent=a.generatedAt}const y={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")};let f=!0;"light"===localStorage.getItem("dependency-radar-theme")&&(document.documentElement.classList.add("light"),y.themeSwitch.classList.add("light")),y.themeSwitch.addEventListener("click",()=>{document.documentElement.classList.toggle("light"),y.themeSwitch.classList.toggle("light");const e=document.documentElement.classList.contains("light");localStorage.setItem("dependency-radar-theme",e?"light":"dark")}),y.licenseToggle.addEventListener("click",()=>{y.licenseToggle.classList.toggle("open"),y.licensePanel.classList.toggle("open")}),y.sortDirection.addEventListener("click",()=>{f=!f,y.sortDirection.textContent=f?"↑":"↓",P()}),y.licenseAll.addEventListener("click",()=>{y.licensePermissive.checked=!0,y.licenseWeakCopyleft.checked=!0,y.licenseStrongCopyleft.checked=!0,y.licenseUnknown.checked=!0,P()}),y.licenseFriendly.addEventListener("click",()=>{y.licensePermissive.checked=!0,y.licenseWeakCopyleft.checked=!1,y.licenseStrongCopyleft.checked=!1,y.licenseUnknown.checked=!1,P()});const b=Object.values(a.dependencies||{}),w=new Map;b.forEach(e=>{w.set(k(e.package.name,e.package.version),e)});const C=new Set,I=new Map;let x=new Set;const L=(()=>{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 D(e){const t=e.dataset.depKey;if(!t)return;const n=e.querySelector(".dep-details");if(!n||"true"===n.dataset.rendered)return;const s=w.get(t);s&&(n.setAttribute("aria-busy","true"),n.innerHTML=['<div class="dep-loading" role="presentation">','<div class="dep-loading-bar"></div>',"</div>"].join(""),requestAnimationFrame(()=>{n.innerHTML=S(s,x),n.dataset.rendered="true",n.removeAttribute("aria-busy")}))}function P(){var e;const t=function(){const e=(y.search.value||"").toLowerCase(),t=y.direct.value,a=y.runtime.value,c=y.hasVulns.checked,l=y.licensePermissive.checked,d=y.licenseWeakCopyleft.checked,u=y.licenseStrongCopyleft.checked,p=y.licenseUnknown.checked;return b.filter(g=>{var v,m;const h=s(g),y=[h.value,null==(v=g.compliance.license.declared)?void 0:v.spdxId,null==(m=g.compliance.license.inferred)?void 0:m.spdxId].filter(Boolean).join(" ").toLowerCase();if(e&&!g.package.name.toLowerCase().includes(e)&&!y.includes(e))return!1;if("direct"===t&&!g.usage.direct)return!1;if("transitive"===t&&g.usage.direct)return!1;if("all"!==a&&g.usage.scope!==a)return!1;if(c&&0===i[o(r(g).summary)])return!1;const k=n(h.value);return!("permissive"===k&&!l||"weakCopyleft"===k&&!d||"strongCopyleft"===k&&!u||"unknown"===k&&!p)})}(),d=function(e){const t=y.sort.value,n=[...e];return"name"===t?n.sort((e,t)=>e.package.name.localeCompare(t.package.name)):"depth"===t?n.sort((e,t)=>e.usage.depth-t.usage.depth):"severity"===t&&n.sort((e,t)=>i[o(r(t).summary)]-i[o(r(e).summary)]),f||n.reverse(),n}(t);x=new Set(d.map(e=>k(e.package.name,e.package.version)));const u=(null==(e=a.summary)?void 0:e.dependencyCount)||b.length;l.innerHTML="Showing <strong>"+d.length+"</strong> of <strong>"+u+"</strong> dependencies",0!==d.length?(c.innerHTML=d.map(E).join(""),I.clear(),c.querySelectorAll("details.dep-card").forEach(e=>{const t=e.dataset.depKey;t&&I.set(t,e)}),C.forEach(e=>{const t=I.get(e);t&&(t.open||(t.open=!0),D(t))})):c.innerHTML='<div class="empty-state"><div class="empty-state-icon">📦</div><div class="empty-state-text">No dependencies match your filters</div></div>'}function B(e){const t=e.getAttribute("data-dep-key");if(!t)return;const n=I.get(t);if(!n)return;C.add(t),n.open||(n.open=!0),D(n),n.scrollIntoView({behavior:"smooth",block:"start"});const s=n.querySelector("summary");s&&s.focus({preventScroll:!0})}[y.search,y.direct,y.runtime,y.sort,y.hasVulns,y.licensePermissive,y.licenseWeakCopyleft,y.licenseStrongCopyleft,y.licenseUnknown].forEach(e=>{e&&(e.addEventListener("input",P),e.addEventListener("change",P))}),c.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?(C.add(n),D(t)):C.delete(n))},!0),c.addEventListener("click",e=>{const t=e.target,n=t.closest(".root-package-link");if(n)return e.preventDefault(),void B(n);const s=t.closest(".copy-json-btn");s&&(e.preventDefault(),async function(e){var t;const n=e.closest(".raw-data-toggle"),s=null==n?void 0:n.querySelector("pre"),a=(null==s?void 0:s.textContent)??"";if(a)try{if(null==(t=navigator.clipboard)?void 0:t.writeText)await navigator.clipboard.writeText(a);else{const e=document.createElement("textarea");e.value=a,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 n=e.dataset.label||e.textContent||"Copy JSON";e.dataset.label=n,e.textContent="Copied",e.classList.add("copied"),L.textContent="Copied JSON to clipboard.",window.setTimeout(()=>{e.textContent=n,e.classList.remove("copied")},1500)}catch{L.textContent="Copy failed."}}(s))}),c.addEventListener("keydown",e=>{const t=e.target.closest(".root-package-link");t&&(" "!==e.key&&"Spacebar"!==e.key||(e.preventDefault(),B(t)))}),P()}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",D):D()}();
17
+ exports.JS_CONTENT = `!function(){"use strict";const e={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"]},t={"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 n(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function s(e){var t,n;const s=e.compliance.license,a=(null==(t=s.declared)?void 0:t.valid)?s.declared.spdxId:void 0,i=null==(n=s.inferred)?void 0:n.spdxId;return a?{value:a,isInferred:!1}:i?{value:i,isInferred:!0}:{value:"Unknown",isInferred:!1}}function a(e){const t=e.security;if(null==t?void 0:t.summary)return{summary:t.summary,advisories:t.advisories};if(null==t?void 0: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:null==t?void 0:t.advisories}}function i(e){return(null==e?void 0:e.highest)||"none"}function r(e){return e&&e.risk||"green"}const o={permissive:"green",weakCopyleft:"amber",strongCopyleft:"red",unknown:"gray"},c={none:0,low:1,moderate:2,high:3,critical:4},l=[{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=s(e),n=t.isInferred?\`\${t.value} (inferred)\`:t.value;return"mismatch"===e.compliance.license.status?\`\${n} *\`:n},getTone:t=>{const n=function(t){if(!t)return"unknown";const n=t.toUpperCase();for(const[s,a]of Object.entries(e))if(a.some(e=>n.includes(e.toUpperCase())))return s;return"unknown"}(s(t).value);return o[n]},sortFn:(e,t)=>{const n=s(e).value,a=s(t).value;return n.localeCompare(a)}},{id:"vulns",label:"Vulnerabilities",sortKey:"severity",getValue:e=>n(i(a(e).summary)),getTone:e=>a(e).summary.risk,sortFn:(e,t)=>c[i(a(t).summary)]-c[i(a(e).summary)]},{id:"install",label:"Install",sortKey:"install",getValue:e=>{return(t=e.execution)?n(t.risk||"low"):"Low";var t},getTone:e=>r(e.execution),sortFn:(e,t)=>{const n={green:0,amber:1,red:2},s=r(e.execution),a=r(t.execution);return n[s]-n[a]}}],d=l.length;function u(e){var t,n;const s=e.compliance.license,a=(null==(t=s.declared)?void 0:t.valid)?s.declared.spdxId:void 0,i=null==(n=s.inferred)?void 0:n.spdxId;return a?{value:a,isInferred:!1}:i?{value:i,isInferred:!0}:{value:"Unknown",isInferred:!1}}function p(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 g={none:0,low:1,moderate:2,high:3,critical:4};function m(e){const t=e.security;if(null==t?void 0:t.summary)return{summary:t.summary,advisories:t.advisories};if(null==t?void 0: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:null==t?void 0:t.advisories}}function v(e){return e?String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}function h(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function f(e){return e.split(/[\\s-_]+/).map(e=>e?h(e):e).join(" ")}function y(e){return l.map(t=>{return n=t.label,s=t.getValue(e),'<div class="badge-card '+t.getTone(e)+'"><span class="badge-label">'+v(n)+'</span><span class="badge-value">'+v(s)+"</span></div>";var n,s}).join("")}function k(e,t){const n=l.map(n=>function(e,t,n,s){const a=n===e,i=a?s?" ▲":" ▼":"",r=a?s?" sorted-asc":" sorted-desc":"";return'<button type="button" class="column-header'+(a?" sorted":"")+r+'" data-sort="'+v(e)+'"><span class="column-header-label">'+v(t)+'</span><span class="sort-indicator">'+i+"</span></button>"}(n.sortKey,n.label,e,t)).join("");return'<div class="column-headers" style="--column-count: '+d+'">'+n+"</div>"}function b(e,t,n){let s='<div class="kv-item">';return s+='<span class="kv-label">'+v(e)+"</span>",s+='<span class="kv-value">'+v(String(t))+"</span>",n&&(s+='<span class="kv-hint">'+v(n)+"</span>"),s+="</div>",s}function w(e,t){return'<span class="kv-value risk-value"><span class="risk-dot '+t+'"></span>'+v(String(e))+"</span>"}function C(e,t,n){let s='<div class="kv-item">';return s+='<span class="kv-label">'+v(e)+"</span>",s+=t,s+="</div>",s}function I(e,t){if(!e||0===e.length)return'<span class="kv-value">None</span>';const n=e.slice(0,t),s=e.length-t;let a='<div class="package-list">';return n.forEach(e=>{a+='<span class="package-tag">'+v(e)+"</span>"}),s>0&&(a+='<span class="package-tag">+'+s+" more</span>"),a+="</div>",a}function L(e,t,n,s){if(!e||0===e.length)return'<span class="kv-value">None</span>';const a=e.slice(0,t),i=e.length-t;let r='<div class="package-list">';return a.forEach(e=>{const t=P(e,n,s);r+=t?'<a class="package-tag package-tag-link root-package-link" href="#'+v(B(t))+'" data-dep-key="'+v(t)+'" aria-label="Jump to dependency '+v(t)+'">'+v(e)+"</a>":'<span class="package-tag">'+v(e)+"</span>"}),i>0&&(r+='<span class="package-tag">+'+i+" more</span>"),r+="</div>",r}function x(e,t){return e+"@"+t}const E=new WeakMap;function S(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 B(e){return"dep-"+encodeURIComponent(e).replace(/%/g,"_")}function D(e){const t=E.get(e);if(t)return t;const n=new Map;return e.forEach(e=>{const t=S(e);if(!t)return;const s=n.get(t.name)||[];s.push(e),n.set(t.name,s)}),E.set(e,n),n}function j(e,t,n){const s=((n||D(t)).get(e)||[]).filter(e=>t.has(e));return 1===s.length?s[0]:null}function P(e,t,n){if(t.has(e))return e;const s=S(e);if(!s)return j(e,t,n);if(s.version.startsWith("npm:")){const e=s.version.slice(4),n=s.name+(e.startsWith("@")?e:"@"+e);if(t.has(n))return n}return j(s.name,t,n)}function T(e,t,n,s){if(!e||0===e.length)return'<span class="kv-value">None</span>';const a=e.slice(0,t),i=e.length-t;let r='<div class="package-list">';return a.forEach(e=>{if("string"==typeof e){const t=P(e,n,s);return t?void(r+='<a class="package-tag package-tag-link root-package-link" href="#'+v(B(t))+'" data-dep-key="'+v(t)+'" aria-label="Jump to dependency '+v(t)+'">'+v(e)+"</a>"):void(r+='<span class="package-tag">'+v(e)+"</span>")}const t=x(e.name,e.version),a=e.name+"@"+e.version,i=P(t,n,s);r+=i?'<a class="package-tag package-tag-link root-package-link" href="#'+v(B(i))+'" data-dep-key="'+v(i)+'" aria-label="Jump to dependency '+v(i)+'">'+v(a)+"</a>":'<span class="package-tag">'+v(a)+"</span>"}),i>0&&(r+='<span class="package-tag">+'+i+" more</span>"),r+="</div>",r}function N(e,t,n){const s=e.graph.subDeps;if(!s)return"";const a=[{title:"Dependencies",key:"dep"},{title:"Optional",key:"opt"},{title:"Peer",key:"peer"},{title:"Dev Dependencies",key:"dev"}];let i=0,r=0;for(const l of a){const e=s[l.key];if(e)for(const t of Object.values(e))i+=1,t[1]&&(r+=1)}if(0===i)return"";const o='<div class="declared-summary">Total: '+i+" • Installed: "+r+" • Not installed: "+(i-r)+"</div>",c=a.map(e=>{const a=s[e.key];if(!a||0===Object.keys(a).length)return"";let i=0,r=0;const o=Object.entries(a).sort(([e],[t])=>e.localeCompare(t)).map(([e,[s,a]])=>{i+=1,a&&(r+=1);const o='<div class="declared-name">'+v(e)+"</div>",c='<div class="declared-range">'+v(s)+"</div>",l=a?function(e,t,n){const s=P(e,t,n);return s?'<a class="status-pill installed root-package-link" href="#'+v(B(s))+'" data-dep-key="'+v(s)+'" aria-label="Jump to dependency '+v(s)+'">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=r+" of "+i+" installed";return['<details class="declared-group">','<summary class="declared-group-summary"><span class="expand-icon" aria-hidden="true"></span><span class="declared-group-title">'+v(e.title)+' <span class="declared-count">('+c+")</span></span></summary>",'<div class="declared-table">'+o.join("")+"</div>","</details>"].join("")}).filter(Boolean);return H("Declared Dependencies","Dependencies declared by this package",o+'<div class="declared-deps">'+c.join("")+"</div>")}function H(e,t,n){let s='<div class="section">';return s+='<div class="section-header">',s+='<span class="section-title">'+v(e)+"</span>",t&&(s+='<span class="section-desc">'+v(t)+"</span>"),s+="</div>",s+=n,s+="</div>",s}function A(e,t,n,s){let a='<div class="subsection'+(s?" "+s:"")+'">';return a+='<div class="subsection-header">',a+='<span class="subsection-title">'+v(e)+"</span>",n&&(a+='<span class="subsection-desc">'+v(n)+"</span>"),a+="</div>",a+=t,a+="</div>",a}function U(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 M(e,t){const n=U(e);if(!n)return;let s;try{s=new URL(n)}catch{return}if("github.com"!==s.hostname.toLowerCase())return;const a=s.pathname.split("/").filter(Boolean);if(a.length<2)return;const i=a[0],r=a[1].replace(/\\.git\$/i,"");return i&&r?\`https://github.com/\${i}/\${r}/blob/HEAD/\${t}\`:void 0}function V(e,t){return t?v(e)+' <a class="kv-inline-link" href="'+v(t)+'" target="_blank" rel="noopener">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>':v(e)}function \$(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>',s='<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 i='<div class="package-links">';return e.npm&&(i+='<a href="'+v(e.npm)+'" target="_blank" rel="noopener" class="package-link">'+t+"npm</a>"),e.repository&&(i+='<a href="'+v(e.repository)+'" target="_blank" rel="noopener" class="package-link">'+n+"Repository</a>"),e.homepage&&(i+='<a href="'+v(e.homepage)+'" target="_blank" rel="noopener" class="package-link">'+a+"Homepage</a>"),e.issues&&(i+='<a href="'+v(e.issues)+'" target="_blank" rel="noopener" class="package-link">'+s+"Issues</a>"),i+="</div>",i}function O(e){const t=function(e,t){const n=[e.risk,t];return n.includes("red")?"red":n.includes("amber")?"amber":"green"}(m(e).summary,e.compliance.licenseRisk),n=x(e.package.name,e.package.version),s=B(n),a=y(e),i=['<summary class="dep-summary">','<span class="expand-icon" aria-hidden="true"></span>','<span class="dep-name">'+v(e.package.name)+'<span class="dep-version">@'+v(e.package.version)+"</span></span>",'<div class="dep-indicators" style="--column-count: '+d+'">',a,"</div>","</summary>"].join("");return['<details class="dep-card" data-risk="'+t+'" data-dep-key="'+v(n)+'" id="'+v(s)+'">',i,'<div class="dep-details" data-rendered="false"></div>',"</details>"].join("")}function R(e,n,s){var a,i,r,o,c;const l=m(e),d=l.summary,g=u(e),y=g.isInferred?\`\${g.value} (inferred)\`:g.value,k=function(e){var t;const n=(null==(t=e.package)?void 0:t.links)||{},s=e.links||{},a=U(n.repository||s.repository||s.repo);return{npm:n.npm||s.npm,repository:a||n.repository||s.repository||s.repo,homepage:n.homepage||s.homepage,issues:n.bugs||n.issues||s.bugs||s.issues}}(e),x=JSON.stringify(e,null,2),E=[e.usage.direct?"Direct dependency":"Indirect dependency (transitive)","Scope: "+(S=e.usage.scope,"runtime"===S?"Runtime":"dev"===S?"Dev":"optional"===S?"Optional":"peer"===S?"Peer":S)];var S;e.package.description&&E.unshift("Description: "+e.package.description),(null==(a=e.usage.origins.workspaces)?void 0:a.length)&&E.push("Used in "+e.usage.origins.workspaces.length+" workspaces"),e.usage.importUsage&&E.push("Imported in "+e.usage.importUsage.fileCount+" project files"),e.usage.introduction&&E.push("Introduced by: "+f(e.usage.introduction)),E.length<3&&E.push("Dependency depth: "+e.usage.depth);var B,D;const j=H("Overview","Summary and key context",'<div class="micro-summary">'+E.slice(0,5).map(e=>'<div class="micro-line">'+v(e)+"</div>").join("")+"</div>"+((null==(i=e.usage.origins.workspaces)?void 0:i.length)?'<div class="micro-sublist"><div class="micro-subtitle">Workspaces</div>'+I(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?b("Runtime impact",(D=e.usage.runtimeImpact,D?f(D):"")):"",b("Dependency depth",e.usage.depth),C("Introduced via root packages",T(e.usage.origins.topRootPackages,8,n,s)),b("Direct roots",e.usage.origins.rootPackageCount),C("Direct parents",L(e.usage.origins.topParentPackages,8,n,s)),b("Direct parents count",e.usage.origins.parentPackageCount??0),b("TypeScript types",(B=e.usage.tsTypes,"bundled"===B?"Bundled":"definitelyTyped"===B?"DefinitelyTyped":"none"===B?"None":"Unknown"))].filter(Boolean).join("")+"</div></div>")+function(e,t,n,s){if(!t||0===t.length)return"";const a=t.slice(0,n),i=t.length-n;let r='<div class="detail-list">';return r+='<div class="detail-title">'+v(e)+"</div>",r+='<ul class="detail-items '+s+'">',a.forEach(e=>{r+='<li class="detail-item">'+v(e)+"</li>"}),i>0&&(r+='<li class="detail-item muted">+'+i+" more</li>"),r+="</ul></div>",r}("Top import locations",null==(r=e.usage.importUsage)?void 0:r.topFiles,5,"mono")),P=e.compliance.license,O=M(k.repository,"package.json"),R=M(k.repository,"LICENSE"),F=[C("Primary license",w(y,e.compliance.licenseRisk)),b("Status",p(P.status))];if(P.declared){const e=[P.declared.valid?"valid":"invalid",P.declared.expression?"expression":void 0,P.declared.deprecated?"deprecated":void 0].filter(Boolean).join(", "),t=(null==(o=P.exception)?void 0:o.id)?\` WITH \${P.exception.id}\`:"";F.push(C("Declared SPDX in package.json",'<span class="kv-value">'+V(\`\${P.declared.spdxId}\${t}\${e?\` (\${e})\`:""}\`,O)+"</span>"))}P.inferred&&F.push(C("Inferred from LICENSE file",'<span class="kv-value">'+V(\`\${P.inferred.spdxId} (\${P.inferred.confidence})\`,R)+"</span>")),"mismatch"===P.status&&F.push(b("Mismatch","Declared SPDX and LICENSE text do not match")),"invalid-spdx"===P.status&&F.push(b("Invalid SPDX","Package.json license is not a valid SPDX identifier or expression"));const G=A("License",'<div class="kv-grid">'+F.join("")+"</div>"),K=d.critical+d.high+d.moderate+d.low,W=[C("Known vulnerabilities",w(0===K?"None":String(K),d.risk)),b("Highest severity","none"===d.highest?"None":f(d.highest))],q=K>0?'<div class="kv-grid kv-grid-tight">'+[b("Critical",d.critical),b("High",d.high),b("Moderate",d.moderate),b("Low",d.low)].join("")+"</div>":"",J=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=v(e.title),s=e.url?'<a href="'+v(e.url)+'" target="_blank" rel="noopener">Link</a>':"";t+='<tr data-severity="'+v(e.severity)+'">',t+='<td data-label="Title">'+n+"</td>",t+='<td data-label="Severity">'+v(h(e.severity))+"</td>",t+='<td data-label="Affected range">'+v(e.vulnerableRange)+"</td>",t+='<td data-label="Fix available">'+v(e.fixAvailable?"Yes":"No")+"</td>",t+='<td data-label="Reference">'+s+"</td>",t+="</tr>"}),t+="</tbody></table>",t}(l.advisories),_=A("VULNERABILITIES",['<div class="section-note">Based on npm audit findings (known disclosed issues).</div>','<div class="kv-grid">'+W.join("")+"</div>",q?'<div class="subtle-divider"></div>'+q:"",J?'<div class="subtle-divider"></div>'+J:""].join(""),"Known security issues from npm audit","vuln-block"),z=e.execution?function(e){var n,s,a,i,r;const o=[C("Execution risk",w((c=e.risk,"red"===c?"High":"amber"===c?"Medium":"Low"),e.risk))];var c;if(e.native&&o.push(b("Native build tooling detected (native)","Yes")),(null==(s=null==(n=e.scripts)?void 0:n.hooks)?void 0:s.length)&&o.push(C("Lifecycle hooks",I(e.scripts.hooks,6))),"number"==typeof(null==(a=e.scripts)?void 0:a.complexity)&&o.push(b("Heuristic complexity","Script complexity: "+e.scripts.complexity+" (complexity)")),null==(r=null==(i=e.scripts)?void 0:i.signals)?void 0:r.length){const n=e.scripts.signals.map(e=>\`\${t[e]} (\${e})\`);o.push(C("Install-time signals",I(n,6)))}return A("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">'+o.join("")+"</div>")}(e.execution):"",X=H("Risk & Compliance","License, vulnerabilities, and install-time execution signals",G+_+z),Y=[b("Outdated status",(Z=e.upgrade.outdatedStatus,Z?"unknown"===Z?"Unknown":f(Z):"Not reported"))];var Z;e.upgrade.latestVersion&&Y.push(b("Latest version",e.upgrade.latestVersion));const Q=A("Version",'<div class="section-note">Based on npm outdated findings.</div><div class="kv-grid">'+Y.join("")+"</div>"),ee=e.package.deprecated?A("Deprecated",'<div class="kv-grid">'+b("Deprecated","Yes","Declared by the package author.")+"</div>",void 0,"warning"):"",te=[b("Node engine constraint",e.upgrade.nodeEngine||"Any")];void 0!==e.upgrade.blocksNodeMajor&&te.push(b("Blocks Node major upgrade",e.upgrade.blocksNodeMajor?"Yes":"No"));const ne=A("Constraints",'<div class="kv-grid">'+te.join("")+"</div>"),se=A("Blast radius",'<div class="kv-grid">'+[b("Used by other packages (fanIn)",e.graph.fanIn),b("Depends on packages (fanOut)",e.graph.fanOut)].join("")+"</div>"),ae={nodeEngine:"Node engine constraint",peerDependency:"Peer dependency constraints",nativeBindings:"Native bindings/build tooling",installScripts:"Install lifecycle scripts",deprecated:"Deprecated by author"},ie=H("Upgrade & Change Impact","Currency, constraints, and blast radius",Q+ee+ne+se+((null==(c=e.upgrade.blockers)?void 0:c.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>"+v(ae[e]||e)+"</li>").join("")+"</ul></div>":"")),re=N(e,n,s);return[\$(k),j,X,ie,re,'<details class="raw-data-toggle"><summary><span class="expand-icon" aria-hidden="true"></span>View raw data</summary><div class="raw-data-pane"><pre>'+v(x)+'</pre><button type="button" class="copy-json-btn" aria-label="Copy raw JSON">Copy JSON</button></div></details>'].join("")}async function F(){var t,n;const s=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()}(),a=document.getElementById("dependency-list"),i=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)}\`}(s.dependencyRadarVersion),o=document.getElementById("project-path");o&&(o.textContent=s.project.projectDir);const c=document.getElementById("cta-primary-link"),d=document.getElementById("cta-secondary-link");c&&(c.href=r),d&&(d.href=r);const p=document.getElementById("git-branch-item"),v=document.getElementById("git-branch");(null==(t=s.git)?void 0:t.branch)&&s.git.branch&&p&&v&&(v.textContent=s.git.branch,p.style.display="");const h=document.getElementById("node-item"),f=document.getElementById("node-version"),y=document.getElementById("node-disclaimer");if(s.environment&&h&&f){const e=(null==(n=s.environment.runtimeVersion)?void 0:n.replace(/^v/,""))||"unknown",t=s.environment.minRequiredMajor;f.textContent=e+(t&&t>0?\` (requires ≥\${t})\`:""),h.style.display="",t&&t>0&&y&&(y.textContent="Node requirement derived from dependency engine ranges.",y.style.display="")}const b=document.getElementById("formatted-date");if(b&&s.generatedAt)try{const e=new Date(s.generatedAt),t=new Intl.DateTimeFormat(void 0,{day:"numeric",month:"short",year:"numeric",hour:"2-digit",minute:"2-digit"}).format(e);b.textContent=t}catch{b.textContent=s.generatedAt}const w={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")};let C="name",I=!0;"light"===localStorage.getItem("dependency-radar-theme")&&(document.documentElement.classList.add("light"),w.themeSwitch.classList.add("light")),w.themeSwitch.addEventListener("click",()=>{document.documentElement.classList.toggle("light"),w.themeSwitch.classList.toggle("light");const e=document.documentElement.classList.contains("light");localStorage.setItem("dependency-radar-theme",e?"light":"dark")});const L=window.matchMedia("(max-width: 768px)");let E=L.matches;const B=e=>{w.filterControls&&w.filtersToggle&&(w.filterControls.classList.toggle("open",e),w.filtersToggle.classList.toggle("open",e),w.filtersToggle.setAttribute("aria-expanded",String(e)))},j=()=>{if(L.matches)return B(!1),w.licensePanel.classList.add("open"),w.licenseToggle.classList.add("open"),void(E=!0);E&&(B(!1),w.licensePanel.classList.remove("open"),w.licenseToggle.classList.remove("open")),E=!1};function P(){if(w.columnHeadersContainer&&(w.columnHeadersContainer.innerHTML=k(C,I)),w.packageHeader){const e=w.packageHeader.querySelector(".sort-indicator");e&&("name"===C?(e.textContent=I?" ▲":" ▼",w.packageHeader.classList.add("sorted")):(e.textContent="",w.packageHeader.classList.remove("sorted")))}}function T(e){const t=e.target.closest(".column-header");if(!t)return;const n=t.dataset.sort;n&&(C===n?I=!I:(C=n,I=!0),w.sort&&(w.sort.value=C,w.sortDirection.textContent=I?"↑":"↓"),P(),W())}w.licenseToggle.addEventListener("click",()=>{L.matches||(w.licenseToggle.classList.toggle("open"),w.licensePanel.classList.toggle("open"))}),w.filtersToggle&&w.filterControls&&w.filtersToggle.addEventListener("click",()=>{const e=!w.filterControls.classList.contains("open");B(e)}),window.addEventListener("resize",j),j(),w.sortDirection.addEventListener("click",()=>{I=!I,w.sortDirection.textContent=I?"↑":"↓",P(),W()}),w.sort.addEventListener("change",()=>{C=w.sort.value,P(),W()}),w.columnHeadersContainer&&w.columnHeadersContainer.addEventListener("click",T),w.packageHeader&&w.packageHeader.addEventListener("click",T),P(),w.licenseAll.addEventListener("click",()=>{w.licensePermissive.checked=!0,w.licenseWeakCopyleft.checked=!0,w.licenseStrongCopyleft.checked=!0,w.licenseUnknown.checked=!0,V.clear(),W()}),w.licenseFriendly.addEventListener("click",()=>{w.licensePermissive.checked=!0,w.licenseWeakCopyleft.checked=!1,w.licenseStrongCopyleft.checked=!1,w.licenseUnknown.checked=!1,V.clear(),W()});const N=Object.values(s.dependencies||{}),H=new Map;N.forEach(e=>{H.set(x(e.package.name,e.package.version),e)});const A=new Set(H.keys()),U=D(A),M=new Set,V=new Set,\$=new Map,F=(()=>{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 G(e){const t=e.dataset.depKey;if(!t)return;const n=e.querySelector(".dep-details");if(!n||"true"===n.dataset.rendered)return;const s=H.get(t);s&&(n.setAttribute("aria-busy","true"),n.innerHTML=['<div class="dep-loading" role="presentation">','<div class="dep-loading-bar"></div>',"</div>"].join(""),requestAnimationFrame(()=>{n.innerHTML=R(s,A,U),n.dataset.rendered="true",n.removeAttribute("aria-busy")}))}function K(){const t=(w.search.value||"").toLowerCase(),n=w.direct.value,s=w.runtime.value,a=w.hasVulns.checked,i=w.licensePermissive.checked,r=w.licenseWeakCopyleft.checked,o=w.licenseStrongCopyleft.checked,c=w.licenseUnknown.checked;return N.filter(l=>{var d,p;const v=x(l.package.name,l.package.version);if(V.has(v))return!0;const h=u(l),f=[h.value,null==(d=l.compliance.license.declared)?void 0:d.spdxId,null==(p=l.compliance.license.inferred)?void 0:p.spdxId].filter(Boolean).join(" ").toLowerCase();if(t&&!l.package.name.toLowerCase().includes(t)&&!f.includes(t))return!1;if("direct"===n&&!l.usage.direct)return!1;if("transitive"===n&&l.usage.direct)return!1;if("all"!==s&&l.usage.scope!==s)return!1;if(a&&0===g[(y=m(l).summary,(null==y?void 0:y.highest)||"none")])return!1;var y;const k=function(t){if(!t)return"unknown";const n=t.toUpperCase();for(const[s,a]of Object.entries(e))if(a.some(e=>n.includes(e.toUpperCase())))return s;return"unknown"}(h.value);return!("permissive"===k&&!i)&&(!("weakCopyleft"===k&&!r)&&(!("strongCopyleft"===k&&!o)&&!("unknown"===k&&!c)))})}function W(){var e;const t=function(e){const t=[...e];if("name"===C)t.sort((e,t)=>e.package.name.localeCompare(t.package.name));else if("depth"===C)t.sort((e,t)=>e.usage.depth-t.usage.depth);else{const e=l.find(e=>e.sortKey===C||e.id===C);(null==e?void 0:e.sortFn)?t.sort(e.sortFn):e&&t.sort((t,n)=>e.getValue(t).localeCompare(e.getValue(n)))}return I||t.reverse(),t}(K()),n=(null==(e=s.summary)?void 0:e.dependencyCount)||N.length;i.innerHTML="Showing <strong>"+t.length+"</strong> of <strong>"+n+"</strong> dependencies",0!==t.length?(a.innerHTML=t.map(O).join(""),\$.clear(),a.querySelectorAll("details.dep-card").forEach(e=>{const t=e.dataset.depKey;t&&\$.set(t,e)}),M.forEach(e=>{const t=\$.get(e);t&&(t.open||(t.open=!0),G(t))})):a.innerHTML='<div class="empty-state"><div class="empty-state-icon">📦</div><div class="empty-state-text">No dependencies match your filters</div></div>'}function q(e){const t=U.get(e)||[];return 1===t.length?t[0]:null}const J=[w.search,w.direct,w.runtime,w.sort,w.hasVulns,w.licensePermissive,w.licenseWeakCopyleft,w.licenseStrongCopyleft,w.licenseUnknown],_=()=>{V.clear(),W()};function z(e){const t=e.getAttribute("data-dep-key");if(!t)return;const n=function(e){if(H.has(e))return e;const t=S(e);if(!t)return q(e);if(t.version.startsWith("npm:")){const e=t.version.slice(4),n=t.name+(e.startsWith("@")?e:"@"+e);if(H.has(n))return n}return q(t.name)}(t);if(!n)return;let s=\$.get(n);if(s||(V.add(n),W(),s=\$.get(n)),!s)return;M.add(n),s.open||(s.open=!0),G(s);const a=()=>{s.scrollIntoView({behavior:"smooth",block:"start"});const e=s.querySelector("summary");e&&e.focus({preventScroll:!0})};requestAnimationFrame(()=>{a(),window.setTimeout(a,60)})}J.forEach(e=>{e&&(e.addEventListener("input",_),e.addEventListener("change",_))}),a.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?(M.add(n),G(t)):M.delete(n))},!0),a.addEventListener("click",e=>{const t=e.target,n=t.closest(".root-package-link");if(n)return e.preventDefault(),void z(n);const s=t.closest(".copy-json-btn");s&&(e.preventDefault(),async function(e){var t;const n=e.closest(".raw-data-toggle"),s=null==n?void 0:n.querySelector("pre"),a=(null==s?void 0:s.textContent)??"";if(a)try{if(null==(t=navigator.clipboard)?void 0:t.writeText)await navigator.clipboard.writeText(a);else{const e=document.createElement("textarea");e.value=a,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 n=e.dataset.label||e.textContent||"Copy JSON";e.dataset.label=n,e.textContent="Copied",e.classList.add("copied"),F.textContent="Copied JSON to clipboard.",window.setTimeout(()=>{e.textContent=n,e.classList.remove("copied")},1500)}catch{F.textContent="Copy failed."}}(s))}),a.addEventListener("keydown",e=>{const t=e.target.closest(".root-package-link");t&&(" "!==e.key&&"Spacebar"!==e.key||(e.preventDefault(),z(t)))}),P(),W()}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",F):F()}();
18
18
  `;