@girardelli/architect 1.2.1 → 1.3.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.
@@ -1,6 +1,7 @@
1
1
  import { AnalysisReport } from './types.js';
2
2
  /**
3
- * Gera relatórios HTML visuais premium a partir de AnalysisReport
3
+ * Generates premium visual HTML reports from AnalysisReport.
4
+ * Features: D3.js force graph, bubble charts, radar chart, animated counters.
4
5
  */
5
6
  export declare class HtmlReportGenerator {
6
7
  generateHtml(report: AnalysisReport): string;
@@ -12,12 +13,27 @@ export declare class HtmlReportGenerator {
12
13
  private groupSuggestions;
13
14
  private renderHeader;
14
15
  private renderScoreHero;
16
+ /**
17
+ * Radar chart for the 4 score components
18
+ */
19
+ private renderRadarChart;
15
20
  private renderStats;
16
21
  private renderLayers;
22
+ /**
23
+ * Interactive D3.js force-directed dependency graph
24
+ */
25
+ private renderDependencyGraph;
26
+ /**
27
+ * Bubble chart for anti-patterns — bigger = more severe
28
+ */
29
+ private renderAntiPatternBubbles;
17
30
  private renderAntiPatterns;
18
- private renderDiagram;
19
31
  private renderSuggestions;
20
32
  private renderFooter;
33
+ /**
34
+ * All JavaScript for D3.js visualizations, animated counters, and radar chart
35
+ */
36
+ private getScripts;
21
37
  private getStyles;
22
38
  }
23
39
  //# sourceMappingURL=html-reporter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-reporter.d.ts","sourceRoot":"","sources":["../src/html-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAEzD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IA+B5C,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,kBAAkB;IA+C1B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,SAAS;CA6KlB"}
1
+ {"version":3,"file":"html-reporter.d.ts","sourceRoot":"","sources":["../src/html-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAEzD;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IA+B5C,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,eAAe;IAwCvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,YAAY;IA4BpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+C7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoChC,OAAO,CAAC,kBAAkB;IAyC1B,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA4PlB,OAAO,CAAC,SAAS;CAqLlB"}
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Gera relatórios HTML visuais premium a partir de AnalysisReport
2
+ * Generates premium visual HTML reports from AnalysisReport.
3
+ * Features: D3.js force graph, bubble charts, radar chart, animated counters.
3
4
  */
4
5
  export class HtmlReportGenerator {
5
6
  generateHtml(report) {
@@ -12,22 +13,22 @@ export class HtmlReportGenerator {
12
13
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
13
14
  <title>Architect Report — ${this.escapeHtml(report.projectInfo.name)}</title>
14
15
  ${this.getStyles()}
15
- <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"><\/script>
16
+ <script src="https://cdn.jsdelivr.net/npm/d3@7"><\/script>
16
17
  </head>
17
18
  <body>
18
19
  ${this.renderHeader(report)}
19
20
  <div class="container">
20
21
  ${this.renderScoreHero(report)}
22
+ ${this.renderRadarChart(report)}
21
23
  ${this.renderStats(report)}
22
24
  ${this.renderLayers(report)}
25
+ ${this.renderDependencyGraph(report)}
26
+ ${this.renderAntiPatternBubbles(report, grouped)}
23
27
  ${this.renderAntiPatterns(report, grouped)}
24
- ${this.renderDiagram(report)}
25
28
  ${this.renderSuggestions(sugGrouped)}
26
29
  </div>
27
30
  ${this.renderFooter()}
28
- <script>
29
- mermaid.initialize({ theme: 'default', startOnLoad: true });
30
- <\/script>
31
+ ${this.getScripts(report)}
31
32
  </body>
32
33
  </html>`;
33
34
  }
@@ -132,7 +133,7 @@ ${this.renderFooter()}
132
133
  stroke-dashoffset="${offset}" />
133
134
  </svg>
134
135
  <div class="score-value">
135
- <div class="number" style="color: ${this.scoreColor(overall)}">${overall}</div>
136
+ <div class="number score-counter" data-target="${overall}" style="color: ${this.scoreColor(overall)}">0</div>
136
137
  <div class="label">/ 100</div>
137
138
  <div class="grade">${this.scoreLabel(overall)}</div>
138
139
  </div>
@@ -140,25 +141,36 @@ ${this.renderFooter()}
140
141
  <div class="score-breakdown">
141
142
  ${breakdownItems}
142
143
  </div>
144
+ </div>`;
145
+ }
146
+ /**
147
+ * Radar chart for the 4 score components
148
+ */
149
+ renderRadarChart(report) {
150
+ const entries = Object.entries(report.score.breakdown);
151
+ return `
152
+ <h2 class="section-title">🎯 Health Radar</h2>
153
+ <div class="card" style="display: flex; justify-content: center;">
154
+ <svg id="radar-chart" width="350" height="350" viewBox="0 0 350 350"></svg>
143
155
  </div>`;
144
156
  }
145
157
  renderStats(report) {
146
158
  return `
147
159
  <div class="stats-grid">
148
160
  <div class="stat-card">
149
- <div class="value">${report.projectInfo.totalFiles}</div>
161
+ <div class="value stat-counter" data-target="${report.projectInfo.totalFiles}">0</div>
150
162
  <div class="label">Files Scanned</div>
151
163
  </div>
152
164
  <div class="stat-card">
153
- <div class="value">${report.projectInfo.totalLines.toLocaleString()}</div>
165
+ <div class="value stat-counter" data-target="${report.projectInfo.totalLines}">0</div>
154
166
  <div class="label">Lines of Code</div>
155
167
  </div>
156
168
  <div class="stat-card">
157
- <div class="value">${report.antiPatterns.length}</div>
169
+ <div class="value stat-counter" data-target="${report.antiPatterns.length}">0</div>
158
170
  <div class="label">Anti-Patterns</div>
159
171
  </div>
160
172
  <div class="stat-card">
161
- <div class="value">${report.dependencyGraph.edges.length}</div>
173
+ <div class="value stat-counter" data-target="${report.dependencyGraph.edges.length}">0</div>
162
174
  <div class="label">Dependencies</div>
163
175
  </div>
164
176
  </div>`;
@@ -188,7 +200,55 @@ ${this.renderFooter()}
188
200
  <h2 class="section-title">📐 Architectural Layers</h2>
189
201
  <div class="layers-grid">${cards}</div>`;
190
202
  }
191
- renderAntiPatterns(report, grouped) {
203
+ /**
204
+ * Interactive D3.js force-directed dependency graph
205
+ */
206
+ renderDependencyGraph(report) {
207
+ if (report.dependencyGraph.edges.length === 0)
208
+ return '';
209
+ // Build node data with connection counts
210
+ const connectionCount = {};
211
+ for (const edge of report.dependencyGraph.edges) {
212
+ connectionCount[edge.from] = (connectionCount[edge.from] || 0) + 1;
213
+ connectionCount[edge.to] = (connectionCount[edge.to] || 0) + 1;
214
+ }
215
+ const layerMap = {};
216
+ for (const layer of report.layers) {
217
+ for (const file of layer.files) {
218
+ layerMap[file] = layer.name;
219
+ }
220
+ }
221
+ const nodes = report.dependencyGraph.nodes.map(n => ({
222
+ id: n,
223
+ name: n.split('/').pop() || n,
224
+ connections: connectionCount[n] || 0,
225
+ layer: layerMap[n] || 'Other',
226
+ }));
227
+ const links = report.dependencyGraph.edges.map(e => ({
228
+ source: e.from,
229
+ target: e.to,
230
+ }));
231
+ return `
232
+ <h2 class="section-title">🔗 Dependency Graph</h2>
233
+ <div class="card graph-card">
234
+ <div class="graph-legend">
235
+ <span class="legend-item"><span class="legend-dot" style="background: #ec4899"></span> API</span>
236
+ <span class="legend-item"><span class="legend-dot" style="background: #3b82f6"></span> Service</span>
237
+ <span class="legend-item"><span class="legend-dot" style="background: #10b981"></span> Data</span>
238
+ <span class="legend-item"><span class="legend-dot" style="background: #f59e0b"></span> UI</span>
239
+ <span class="legend-item"><span class="legend-dot" style="background: #8b5cf6"></span> Infra</span>
240
+ <span class="legend-item"><span class="legend-dot" style="background: #64748b"></span> Other</span>
241
+ </div>
242
+ <div id="dep-graph" style="width:100%; min-height:400px;"></div>
243
+ <div class="graph-hint">🖱️ Drag nodes to explore • Node size = number of connections</div>
244
+ </div>
245
+ <script type="application/json" id="graph-nodes">${JSON.stringify(nodes)}<\/script>
246
+ <script type="application/json" id="graph-links">${JSON.stringify(links)}<\/script>`;
247
+ }
248
+ /**
249
+ * Bubble chart for anti-patterns — bigger = more severe
250
+ */
251
+ renderAntiPatternBubbles(report, grouped) {
192
252
  if (report.antiPatterns.length === 0) {
193
253
  return `
194
254
  <h2 class="section-title">✅ Anti-Patterns</h2>
@@ -196,6 +256,29 @@ ${this.renderFooter()}
196
256
  <p>No significant anti-patterns detected. Excellent architecture!</p>
197
257
  </div>`;
198
258
  }
259
+ const severityWeight = {
260
+ CRITICAL: 80, HIGH: 60, MEDIUM: 40, LOW: 25,
261
+ };
262
+ const severityColor = {
263
+ CRITICAL: '#ef4444', HIGH: '#f59e0b', MEDIUM: '#60a5fa', LOW: '#22c55e',
264
+ };
265
+ const bubbles = Object.entries(grouped).map(([name, data]) => ({
266
+ name,
267
+ count: data.count,
268
+ severity: data.severity,
269
+ radius: (severityWeight[data.severity] || 30) + data.count * 8,
270
+ color: severityColor[data.severity] || '#64748b',
271
+ }));
272
+ return `
273
+ <h2 class="section-title">🫧 Anti-Pattern Impact Map</h2>
274
+ <div class="card" style="display:flex; justify-content:center;">
275
+ <div id="bubble-chart" style="width:100%; min-height:300px;"></div>
276
+ </div>
277
+ <script type="application/json" id="bubble-data">${JSON.stringify(bubbles)}<\/script>`;
278
+ }
279
+ renderAntiPatterns(report, grouped) {
280
+ if (report.antiPatterns.length === 0)
281
+ return '';
199
282
  const rows = Object.entries(grouped)
200
283
  .sort((a, b) => b[1].count - a[1].count)
201
284
  .map(([name, data]) => `
@@ -211,7 +294,7 @@ ${this.renderFooter()}
211
294
  </tr>`)
212
295
  .join('');
213
296
  return `
214
- <h2 class="section-title">⚠️ Anti-Patterns (${report.antiPatterns.length})</h2>
297
+ <h2 class="section-title">⚠️ Anti-Pattern Details (${report.antiPatterns.length})</h2>
215
298
  <div class="card">
216
299
  <table>
217
300
  <thead>
@@ -225,17 +308,6 @@ ${this.renderFooter()}
225
308
  </thead>
226
309
  <tbody>${rows}</tbody>
227
310
  </table>
228
- </div>`;
229
- }
230
- renderDiagram(report) {
231
- if (!report.diagram.mermaid)
232
- return '';
233
- return `
234
- <h2 class="section-title">📊 Architecture Diagram</h2>
235
- <div class="card">
236
- <div class="mermaid-container">
237
- <pre class="mermaid">${this.escapeHtml(report.diagram.mermaid)}</pre>
238
- </div>
239
311
  </div>`;
240
312
  }
241
313
  renderSuggestions(suggestions) {
@@ -273,9 +345,263 @@ ${this.renderFooter()}
273
345
  renderFooter() {
274
346
  return `
275
347
  <div class="footer">
276
- <p>Generated by <a href="https://github.com/camilogivago/architect">🏗️ Architect</a> — AI-powered architecture analysis</p>
277
- <p>By <strong>Camilo Girardelli</strong> · <a href="https://girardelli.tech">Girardelli Tecnologia</a></p>
348
+ <p>Generated by <a href="https://github.com/camilooscargbaptista/architect">🏗️ Architect</a> — AI-powered architecture analysis</p>
349
+ <p>By <strong>Camilo Girardelli</strong> · <a href="https://www.girardellitecnologia.com">Girardelli Tecnologia</a></p>
278
350
  </div>`;
351
+ }
352
+ /**
353
+ * All JavaScript for D3.js visualizations, animated counters, and radar chart
354
+ */
355
+ getScripts(report) {
356
+ const breakdown = report.score.breakdown;
357
+ return `<script>
358
+ // ── Animated Counters ──
359
+ document.addEventListener('DOMContentLoaded', () => {
360
+ const counters = document.querySelectorAll('.score-counter, .stat-counter');
361
+ const observer = new IntersectionObserver((entries) => {
362
+ entries.forEach(entry => {
363
+ if (entry.isIntersecting) {
364
+ const el = entry.target;
365
+ const target = parseInt(el.dataset.target || '0');
366
+ animateCounter(el, target);
367
+ observer.unobserve(el);
368
+ }
369
+ });
370
+ }, { threshold: 0.5 });
371
+
372
+ counters.forEach(c => observer.observe(c));
373
+ });
374
+
375
+ function animateCounter(el, target) {
376
+ const duration = 1500;
377
+ const start = performance.now();
378
+ const update = (now) => {
379
+ const elapsed = now - start;
380
+ const progress = Math.min(elapsed / duration, 1);
381
+ const ease = 1 - Math.pow(1 - progress, 3);
382
+ el.textContent = Math.round(target * ease).toLocaleString();
383
+ if (progress < 1) requestAnimationFrame(update);
384
+ };
385
+ requestAnimationFrame(update);
386
+ }
387
+
388
+ // ── Radar Chart ──
389
+ (function() {
390
+ const data = [
391
+ { axis: 'Modularity', value: ${breakdown.modularity} },
392
+ { axis: 'Coupling', value: ${breakdown.coupling} },
393
+ { axis: 'Cohesion', value: ${breakdown.cohesion} },
394
+ { axis: 'Layering', value: ${breakdown.layering} },
395
+ ];
396
+
397
+ const svg = d3.select('#radar-chart');
398
+ const w = 350, h = 350, cx = w/2, cy = h/2, maxR = 120;
399
+ const levels = 5;
400
+ const total = data.length;
401
+ const angleSlice = (Math.PI * 2) / total;
402
+
403
+ // Grid circles
404
+ for (let i = 1; i <= levels; i++) {
405
+ const r = (maxR / levels) * i;
406
+ svg.append('circle')
407
+ .attr('cx', cx).attr('cy', cy).attr('r', r)
408
+ .attr('fill', 'none').attr('stroke', '#334155').attr('stroke-width', 0.5)
409
+ .attr('stroke-dasharray', '4,4');
410
+
411
+ svg.append('text')
412
+ .attr('x', cx + 4).attr('y', cy - r + 4)
413
+ .text(Math.round(100 / levels * i))
414
+ .attr('fill', '#475569').attr('font-size', '10px');
415
+ }
416
+
417
+ // Axis lines
418
+ data.forEach((d, i) => {
419
+ const angle = angleSlice * i - Math.PI/2;
420
+ const x = cx + Math.cos(angle) * (maxR + 20);
421
+ const y = cy + Math.sin(angle) * (maxR + 20);
422
+
423
+ svg.append('line')
424
+ .attr('x1', cx).attr('y1', cy).attr('x2', cx + Math.cos(angle) * maxR).attr('y2', cy + Math.sin(angle) * maxR)
425
+ .attr('stroke', '#334155').attr('stroke-width', 1);
426
+
427
+ svg.append('text')
428
+ .attr('x', x).attr('y', y)
429
+ .attr('text-anchor', 'middle').attr('dominant-baseline', 'middle')
430
+ .attr('fill', '#94a3b8').attr('font-size', '12px').attr('font-weight', '600')
431
+ .text(d.axis);
432
+ });
433
+
434
+ // Data polygon
435
+ const points = data.map((d, i) => {
436
+ const angle = angleSlice * i - Math.PI/2;
437
+ const r = (d.value / 100) * maxR;
438
+ return [cx + Math.cos(angle) * r, cy + Math.sin(angle) * r];
439
+ });
440
+
441
+ const pointsStr = points.map(p => p.join(',')).join(' ');
442
+
443
+ svg.append('polygon')
444
+ .attr('points', pointsStr)
445
+ .attr('fill', 'rgba(129, 140, 248, 0.15)')
446
+ .attr('stroke', '#818cf8').attr('stroke-width', 2);
447
+
448
+ // Data dots
449
+ points.forEach((p, i) => {
450
+ const color = data[i].value >= 70 ? '#22c55e' : data[i].value >= 50 ? '#f59e0b' : '#ef4444';
451
+ svg.append('circle')
452
+ .attr('cx', p[0]).attr('cy', p[1]).attr('r', 5)
453
+ .attr('fill', color).attr('stroke', '#0f172a').attr('stroke-width', 2);
454
+
455
+ svg.append('text')
456
+ .attr('x', p[0]).attr('y', p[1] - 12)
457
+ .attr('text-anchor', 'middle')
458
+ .attr('fill', color).attr('font-size', '12px').attr('font-weight', '700')
459
+ .text(data[i].value);
460
+ });
461
+ })();
462
+
463
+ // ── D3 Force Dependency Graph ──
464
+ (function() {
465
+ const nodesEl = document.getElementById('graph-nodes');
466
+ const linksEl = document.getElementById('graph-links');
467
+ if (!nodesEl || !linksEl) return;
468
+
469
+ const nodes = JSON.parse(nodesEl.textContent || '[]');
470
+ const links = JSON.parse(linksEl.textContent || '[]');
471
+ if (nodes.length === 0) return;
472
+
473
+ const container = document.getElementById('dep-graph');
474
+ const width = container.clientWidth || 800;
475
+ const height = Math.max(400, nodes.length * 25);
476
+ container.style.height = height + 'px';
477
+
478
+ const layerColors = {
479
+ API: '#ec4899', Service: '#3b82f6', Data: '#10b981',
480
+ UI: '#f59e0b', Infrastructure: '#8b5cf6', Other: '#64748b',
481
+ };
482
+
483
+ const svg = d3.select('#dep-graph').append('svg')
484
+ .attr('width', width).attr('height', height)
485
+ .attr('viewBox', [0, 0, width, height]);
486
+
487
+ // Arrow marker
488
+ svg.append('defs').append('marker')
489
+ .attr('id', 'arrowhead').attr('viewBox', '-0 -5 10 10')
490
+ .attr('refX', 20).attr('refY', 0).attr('orient', 'auto')
491
+ .attr('markerWidth', 6).attr('markerHeight', 6)
492
+ .append('path').attr('d', 'M 0,-5 L 10,0 L 0,5')
493
+ .attr('fill', '#475569');
494
+
495
+ const simulation = d3.forceSimulation(nodes)
496
+ .force('link', d3.forceLink(links).id(d => d.id).distance(80))
497
+ .force('charge', d3.forceManyBody().strength(-200))
498
+ .force('center', d3.forceCenter(width / 2, height / 2))
499
+ .force('collision', d3.forceCollide().radius(d => Math.max(d.connections * 3 + 12, 15)));
500
+
501
+ const link = svg.append('g')
502
+ .selectAll('line').data(links).join('line')
503
+ .attr('stroke', '#334155').attr('stroke-width', 1.5)
504
+ .attr('stroke-opacity', 0.6).attr('marker-end', 'url(#arrowhead)');
505
+
506
+ const node = svg.append('g')
507
+ .selectAll('g').data(nodes).join('g')
508
+ .call(d3.drag()
509
+ .on('start', (e, d) => { if (!e.active) simulation.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; })
510
+ .on('drag', (e, d) => { d.fx = e.x; d.fy = e.y; })
511
+ .on('end', (e, d) => { if (!e.active) simulation.alphaTarget(0); d.fx = null; d.fy = null; })
512
+ );
513
+
514
+ // Node circles — size based on connections
515
+ node.append('circle')
516
+ .attr('r', d => Math.max(d.connections * 3 + 6, 8))
517
+ .attr('fill', d => layerColors[d.layer] || '#64748b')
518
+ .attr('stroke', '#0f172a').attr('stroke-width', 2)
519
+ .attr('opacity', 0.85);
520
+
521
+ // Node labels
522
+ node.append('text')
523
+ .text(d => d.name.replace(/\\.[^.]+$/, ''))
524
+ .attr('x', 0).attr('y', d => -(Math.max(d.connections * 3 + 6, 8) + 6))
525
+ .attr('text-anchor', 'middle')
526
+ .attr('fill', '#94a3b8').attr('font-size', '10px').attr('font-weight', '500');
527
+
528
+ // Tooltip on hover
529
+ node.append('title')
530
+ .text(d => d.id + '\\nConnections: ' + d.connections + '\\nLayer: ' + d.layer);
531
+
532
+ simulation.on('tick', () => {
533
+ link
534
+ .attr('x1', d => d.source.x).attr('y1', d => d.source.y)
535
+ .attr('x2', d => d.target.x).attr('y2', d => d.target.y);
536
+ node.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')');
537
+ });
538
+ })();
539
+
540
+ // ── Bubble Chart ──
541
+ (function() {
542
+ const dataEl = document.getElementById('bubble-data');
543
+ if (!dataEl) return;
544
+
545
+ const bubbles = JSON.parse(dataEl.textContent || '[]');
546
+ if (bubbles.length === 0) return;
547
+
548
+ const container = document.getElementById('bubble-chart');
549
+ const width = container.clientWidth || 600;
550
+ const height = 300;
551
+
552
+ const svg = d3.select('#bubble-chart').append('svg')
553
+ .attr('width', width).attr('height', height)
554
+ .attr('viewBox', [0, 0, width, height]);
555
+
556
+ const simulation = d3.forceSimulation(bubbles)
557
+ .force('charge', d3.forceManyBody().strength(5))
558
+ .force('center', d3.forceCenter(width / 2, height / 2))
559
+ .force('collision', d3.forceCollide().radius(d => d.radius + 4))
560
+ .stop();
561
+
562
+ for (let i = 0; i < 120; i++) simulation.tick();
563
+
564
+ const g = svg.selectAll('g').data(bubbles).join('g')
565
+ .attr('transform', d => 'translate(' + d.x + ',' + d.y + ')');
566
+
567
+ // Glow effect
568
+ g.append('circle')
569
+ .attr('r', d => d.radius)
570
+ .attr('fill', d => d.color + '20')
571
+ .attr('stroke', d => d.color).attr('stroke-width', 2)
572
+ .attr('opacity', 0)
573
+ .transition().duration(800).delay((d, i) => i * 200)
574
+ .attr('opacity', 1);
575
+
576
+ // Inner circle
577
+ g.append('circle')
578
+ .attr('r', d => d.radius * 0.7)
579
+ .attr('fill', d => d.color + '30')
580
+ .attr('opacity', 0)
581
+ .transition().duration(800).delay((d, i) => i * 200)
582
+ .attr('opacity', 1);
583
+
584
+ // Name
585
+ g.append('text')
586
+ .text(d => d.name)
587
+ .attr('text-anchor', 'middle').attr('dy', '-0.3em')
588
+ .attr('fill', '#e2e8f0').attr('font-size', d => Math.max(d.radius / 4, 10) + 'px')
589
+ .attr('font-weight', '700');
590
+
591
+ // Count badge
592
+ g.append('text')
593
+ .text(d => '×' + d.count)
594
+ .attr('text-anchor', 'middle').attr('dy', '1.2em')
595
+ .attr('fill', d => d.color).attr('font-size', d => Math.max(d.radius / 5, 9) + 'px')
596
+ .attr('font-weight', '600');
597
+
598
+ // Severity label
599
+ g.append('text')
600
+ .text(d => d.severity)
601
+ .attr('text-anchor', 'middle').attr('dy', '2.5em')
602
+ .attr('fill', '#64748b').attr('font-size', '9px').attr('text-transform', 'uppercase');
603
+ })();
604
+ <\/script>`;
279
605
  }
280
606
  getStyles() {
281
607
  return `<style>
@@ -377,6 +703,20 @@ ${this.renderFooter()}
377
703
  }
378
704
  .success-card { border-color: #22c55e40; color: #22c55e; text-align: center; padding: 2rem; font-size: 1.1rem; }
379
705
 
706
+ /* ── Graph ── */
707
+ .graph-card { padding: 1rem; }
708
+ .graph-legend {
709
+ display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 0.5rem;
710
+ justify-content: center;
711
+ }
712
+ .legend-item { display: flex; align-items: center; gap: 4px; font-size: 0.75rem; color: #94a3b8; }
713
+ .legend-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
714
+ .graph-hint {
715
+ text-align: center; font-size: 0.75rem; color: #475569; margin-top: 0.5rem;
716
+ font-style: italic;
717
+ }
718
+ #dep-graph svg { background: rgba(0,0,0,0.2); border-radius: 12px; }
719
+
380
720
  /* ── Layers Grid ── */
381
721
  .layers-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1rem; }
382
722
  .layer-card {
@@ -417,11 +757,6 @@ ${this.renderFooter()}
417
757
  .locations { font-size: 0.75rem; color: #64748b; }
418
758
  .locations code { background: #0f172a; padding: 1px 4px; border-radius: 3px; font-size: 0.7rem; }
419
759
 
420
- /* ── Mermaid ── */
421
- .mermaid-container {
422
- background: #f8fafc; border-radius: 12px; padding: 2rem; text-align: center; color: #0f172a;
423
- }
424
-
425
760
  /* ── Footer ── */
426
761
  .footer {
427
762
  text-align: center; padding: 2rem; color: #475569; font-size: 0.85rem;
@@ -446,7 +781,6 @@ ${this.renderFooter()}
446
781
  .card, .stat-card, .score-hero, .layer-card, .score-item {
447
782
  background: white; border-color: #e2e8f0;
448
783
  }
449
- .mermaid-container { border: 1px solid #e2e8f0; }
450
784
  }
451
785
  </style>`;
452
786
  }
@@ -1 +1 @@
1
- {"version":3,"file":"html-reporter.js","sourceRoot":"","sources":["../src/html-reporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html-reporter.js","sourceRoot":"","sources":["../src/html-reporter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IACzF,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACxG,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC,CAAC;CAC7E;AAED,cAAM,SAAU,YAAW,gBAAgB;IACnC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgE3D,OAAO,CAAC,eAAe;IA6BjB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB7C,KAAK,CACT,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAQ5D,YAAY,CAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IASpE,MAAM,CACV,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAQpD,OAAO,CAAC,mBAAmB;CAoC5B;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC;AAEzC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IACzF,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACxG,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC,CAAC;CAC7E;AAED,cAAM,SAAU,YAAW,gBAAgB;IACnC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgE3D,OAAO,CAAC,eAAe;IA6BjB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB7C,KAAK,CACT,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAQ5D,YAAY,CAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IASpE,MAAM,CACV,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAQpD,OAAO,CAAC,mBAAmB;CAiG5B;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC;AAEzC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,CAAC"}