tech-debt-visualizer 0.2.5 → 0.2.7

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.
@@ -57,7 +57,7 @@ body.dashboard-page {
57
57
  flex-direction: column;
58
58
  }
59
59
 
60
- /* ——— Dashboard header (Grafana top bar: title left, score right) ——— */
60
+ /* ——— Dashboard header (Grafana: bar with accent) ——— */
61
61
  .dashboard-header {
62
62
  display: flex;
63
63
  align-items: center;
@@ -67,6 +67,7 @@ body.dashboard-page {
67
67
  padding: 0.75rem 1.5rem;
68
68
  background: var(--bg-elevated);
69
69
  border-bottom: 1px solid var(--border);
70
+ border-left: 3px solid var(--link);
70
71
  position: sticky;
71
72
  top: 0;
72
73
  z-index: 10;
@@ -118,11 +119,11 @@ body.dashboard-page {
118
119
  .dashboard-score-of { font-size: 0.85rem; font-weight: 500; color: var(--text-muted); }
119
120
  .dashboard-score-label { font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.04em; margin-left: 0.35rem; opacity: 0.95; }
120
121
 
121
- .dashboard-score.tier-1 { background: rgba(229, 57, 53, 0.25); color: #ff8a80; font-weight: 700; }
122
- .dashboard-score.tier-2 { background: rgba(245, 124, 0, 0.25); color: #ffb74d; font-weight: 700; }
123
- .dashboard-score.tier-3 { background: rgba(249, 168, 37, 0.25); color: #ffd54f; font-weight: 700; }
124
- .dashboard-score.tier-4 { background: rgba(41, 182, 246, 0.25); color: #82b1ff; font-weight: 700; }
125
- .dashboard-score.tier-5 { background: rgba(67, 160, 71, 0.25); color: #81c784; font-weight: 700; }
122
+ .dashboard-score.tier-1 { background: rgba(229, 57, 53, 0.2); color: #ff8a80; font-weight: 700; }
123
+ .dashboard-score.tier-2 { background: rgba(245, 124, 0, 0.2); color: #ffb74d; font-weight: 700; }
124
+ .dashboard-score.tier-3 { background: rgba(249, 168, 37, 0.2); color: #ffd54f; font-weight: 700; }
125
+ .dashboard-score.tier-4 { background: rgba(41, 182, 246, 0.2); color: #82b1ff; font-weight: 700; }
126
+ .dashboard-score.tier-5 { background: rgba(67, 160, 71, 0.2); color: #81c784; font-weight: 700; }
126
127
 
127
128
  .dashboard-date {
128
129
  font-size: 12px;
@@ -138,15 +139,17 @@ body.dashboard-page {
138
139
  padding: 0.75rem 1rem;
139
140
  width: 100%;
140
141
  overflow: hidden;
142
+ display: flex;
143
+ flex-direction: column;
141
144
  }
142
145
 
143
146
  .dashboard-grid-2x2 {
147
+ flex: 1;
148
+ min-height: 0;
144
149
  display: grid;
145
150
  grid-template-columns: 1fr 1fr;
146
151
  grid-template-rows: auto 1fr;
147
152
  gap: 0.75rem;
148
- height: 100%;
149
- min-height: 0;
150
153
  align-items: stretch;
151
154
  }
152
155
 
@@ -170,7 +173,7 @@ body.dashboard-page {
170
173
  -webkit-overflow-scrolling: touch;
171
174
  }
172
175
 
173
- .dashboard-cell-score .panel-body-score { flex: 0 1 auto; overflow: visible; min-height: 0; }
176
+ .dashboard-cell-score .panel-body-score { flex: 1 1 auto; min-height: 0; }
174
177
 
175
178
  .dashboard-cell-heatmap .panel-body-heatmap,
176
179
  .dashboard-cell-list .panel-body {
@@ -193,6 +196,113 @@ body.dashboard-page {
193
196
  .dashboard-main { padding: 0.5rem 0.75rem; }
194
197
  }
195
198
 
199
+ /* ——— Footer: AI prompts button (Grafana-style, fits dashboard) ——— */
200
+ .dashboard-footer {
201
+ flex-shrink: 0;
202
+ padding: 0.6rem 0 0;
203
+ border-top: 1px solid var(--border);
204
+ margin-top: 0.5rem;
205
+ display: flex;
206
+ align-items: center;
207
+ }
208
+
209
+ .btn-ai-prompts {
210
+ font: inherit;
211
+ font-size: 12px;
212
+ font-weight: 600;
213
+ letter-spacing: 0.02em;
214
+ padding: 0.45rem 0.9rem;
215
+ background: var(--surface);
216
+ color: var(--link);
217
+ border: 1px solid var(--border);
218
+ border-radius: var(--radius);
219
+ cursor: pointer;
220
+ transition: background 0.15s ease, border-color 0.15s ease;
221
+ }
222
+
223
+ .btn-ai-prompts:hover {
224
+ background: rgba(87, 148, 242, 0.08);
225
+ border-color: var(--link);
226
+ }
227
+
228
+ /* ——— AI prompts overlay (blank screen) ——— */
229
+ .overlay {
230
+ position: fixed;
231
+ inset: 0;
232
+ z-index: 200;
233
+ display: none;
234
+ align-items: center;
235
+ justify-content: center;
236
+ padding: 1rem;
237
+ }
238
+
239
+ .overlay.show {
240
+ display: flex;
241
+ }
242
+
243
+ .overlay-backdrop {
244
+ position: absolute;
245
+ inset: 0;
246
+ background: rgba(0, 0, 0, 0.5);
247
+ }
248
+
249
+ .overlay-panel {
250
+ position: relative;
251
+ background: var(--surface);
252
+ border: 1px solid var(--border);
253
+ border-radius: var(--radius);
254
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
255
+ max-width: 560px;
256
+ width: 100%;
257
+ max-height: 85vh;
258
+ display: flex;
259
+ flex-direction: column;
260
+ overflow: hidden;
261
+ }
262
+
263
+ .overlay-header {
264
+ display: flex;
265
+ align-items: center;
266
+ justify-content: space-between;
267
+ padding: 0.75rem 1rem;
268
+ border-bottom: 1px solid var(--border-subtle);
269
+ flex-shrink: 0;
270
+ }
271
+
272
+ .overlay-title {
273
+ margin: 0;
274
+ font-size: 1rem;
275
+ font-weight: 600;
276
+ color: var(--text);
277
+ }
278
+
279
+ .overlay-close {
280
+ font-size: 1.5rem;
281
+ line-height: 1;
282
+ padding: 0.25rem;
283
+ background: none;
284
+ border: none;
285
+ color: var(--text-muted);
286
+ cursor: pointer;
287
+ }
288
+
289
+ .overlay-close:hover {
290
+ color: var(--text);
291
+ }
292
+
293
+ .overlay-body {
294
+ padding: 1rem;
295
+ overflow: auto;
296
+ flex: 1;
297
+ min-height: 0;
298
+ }
299
+
300
+ .overlay-placeholder {
301
+ margin: 0;
302
+ font-size: 13px;
303
+ color: var(--text-muted);
304
+ }
305
+
196
306
  /* ——— Panels: borders, colored accents ——— */
197
307
  .panel {
198
308
  background: var(--surface);
@@ -205,29 +315,22 @@ body.dashboard-page {
205
315
  .panel-header {
206
316
  padding: 0.6rem 0.85rem;
207
317
  border-bottom: 1px solid var(--border-subtle);
208
- background: rgba(0, 0, 0, 0.04);
318
+ background: rgba(0, 0, 0, 0.05);
209
319
  flex-shrink: 0;
210
320
  }
211
321
 
212
- .panel-header-accent { border-left: 3px solid var(--tier-4); }
213
- .panel-header-accent-orange { border-left: 3px solid var(--tier-2); }
214
- .panel-header-accent-blue { border-left: 3px solid var(--link); }
215
-
216
- .panel-score-tier-1 .panel-header-accent { border-left-color: var(--tier-1); }
217
- .panel-score-tier-2 .panel-header-accent { border-left-color: var(--tier-2); }
218
- .panel-score-tier-3 .panel-header-accent { border-left-color: var(--tier-3); }
219
- .panel-score-tier-4 .panel-header-accent { border-left-color: var(--tier-4); }
220
- .panel-score-tier-5 .panel-header-accent { border-left-color: var(--tier-5); }
322
+ .panel-title {
323
+ color: var(--text);
324
+ }
221
325
 
222
326
  [data-theme="light"] .panel-header {
223
- background: rgba(0, 0, 0, 0.02);
327
+ background: rgba(0, 0, 0, 0.03);
224
328
  }
225
329
 
226
330
  .panel-title {
227
331
  margin: 0;
228
332
  font-size: 12px;
229
333
  font-weight: 700;
230
- color: var(--text);
231
334
  letter-spacing: 0.02em;
232
335
  text-transform: uppercase;
233
336
  }
@@ -247,77 +350,39 @@ body.dashboard-page {
247
350
  text-align: center;
248
351
  }
249
352
 
250
- /* ——— Score panel: shield + big number + tier color ——— */
353
+ /* ——— Score panel (top-left): numeric score, tier accent ——— */
251
354
  .panel-score {
252
- border-top: 2px solid transparent;
355
+ border-left: 3px solid var(--link);
253
356
  }
254
- .panel-score-tier-1 { border-top-color: var(--tier-1); }
255
- .panel-score-tier-2 { border-top-color: var(--tier-2); }
256
- .panel-score-tier-3 { border-top-color: var(--tier-3); }
257
- .panel-score-tier-4 { border-top-color: var(--tier-4); }
258
- .panel-score-tier-5 { border-top-color: var(--tier-5); }
357
+ .panel-score[data-tier="1"] { border-left-color: var(--tier-1); }
358
+ .panel-score[data-tier="2"] { border-left-color: var(--tier-2); }
359
+ .panel-score[data-tier="3"] { border-left-color: var(--tier-3); }
360
+ .panel-score[data-tier="4"] { border-left-color: var(--tier-4); }
361
+ .panel-score[data-tier="5"] { border-left-color: var(--tier-5); }
259
362
 
260
363
  .panel-score .panel-body-score {
261
364
  text-align: center;
262
365
  padding: 1rem 0.85rem;
263
366
  }
264
367
 
265
- .score-display {
266
- display: flex;
267
- align-items: center;
268
- justify-content: center;
269
- gap: 1rem;
270
- margin-bottom: 0.6rem;
271
- flex-wrap: wrap;
272
- }
273
-
274
- .score-shield-wrap {
275
- line-height: 0;
276
- flex-shrink: 0;
277
- }
278
-
279
- .panel-score .score-badge-svg {
280
- display: block;
281
- width: 72px;
282
- height: auto;
283
- }
284
-
285
- .panel-score .score-badge-svg .score-badge-num {
286
- font-size: 28px;
287
- font-weight: 900;
288
- letter-spacing: -0.03em;
289
- fill: #fff;
290
- }
291
-
292
- .panel-score .score-badge-svg .score-badge-of {
293
- font-size: 10px;
294
- font-weight: 700;
295
- letter-spacing: 0.1em;
296
- text-transform: uppercase;
297
- fill: rgba(255,255,255,0.95);
298
- }
299
-
300
368
  .score-numeric {
301
369
  display: flex;
302
370
  align-items: baseline;
303
- gap: 0.2rem;
371
+ justify-content: center;
372
+ gap: 0.25rem;
373
+ margin-bottom: 0.5rem;
304
374
  }
305
375
 
306
376
  .score-num {
307
- font-size: 2.25rem;
377
+ font-size: 2rem;
308
378
  font-weight: 800;
309
379
  line-height: 1;
310
380
  letter-spacing: -0.04em;
381
+ color: var(--text);
311
382
  }
312
383
 
313
- .panel-score-tier-1 .score-num { color: var(--tier-1); }
314
- .panel-score-tier-2 .score-num { color: var(--tier-2); }
315
- .panel-score-tier-3 .score-num { color: var(--tier-3); }
316
- .panel-score-tier-4 .score-num { color: var(--tier-4); }
317
- .panel-score-tier-5 .score-num { color: var(--tier-5); }
318
-
319
384
  .score-of {
320
- font-size: 0.95rem;
385
+ font-size: 0.9rem;
321
386
  font-weight: 600;
322
387
  color: var(--text-muted);
323
388
  }
@@ -326,14 +391,9 @@ body.dashboard-page {
326
391
  margin: 0 0 0.2rem;
327
392
  font-size: 0.95rem;
328
393
  font-weight: 700;
394
+ color: var(--text);
329
395
  }
330
396
 
331
- .panel-score-tier-1 .score-label { color: var(--tier-1); }
332
- .panel-score-tier-2 .score-label { color: var(--tier-2); }
333
- .panel-score-tier-3 .score-label { color: var(--tier-3); }
334
- .panel-score-tier-4 .score-label { color: var(--tier-4); }
335
- .panel-score-tier-5 .score-label { color: var(--tier-5); }
336
-
337
397
  .panel-score .score-desc {
338
398
  margin: 0 0 0.4rem;
339
399
  font-size: 12px;
@@ -376,7 +436,7 @@ body.dashboard-page {
376
436
  font-weight: 700;
377
437
  text-transform: uppercase;
378
438
  letter-spacing: 0.05em;
379
- color: var(--tier-2);
439
+ color: var(--text-muted);
380
440
  }
381
441
 
382
442
  .priority-inline .priority-list { margin: 0; }
@@ -393,9 +453,16 @@ body.dashboard-page {
393
453
  gap: 0.75rem 1.25rem;
394
454
  }
395
455
 
456
+ .panel-heatmap .panel-header-heatmap {
457
+ border-left: 2px solid var(--tier-3);
458
+ }
396
459
  .panel-heatmap .panel-title { margin-right: 0.5rem; }
397
460
  .panel-heatmap .panel-desc { margin: 0.15rem 0 0; flex-basis: 100%; }
398
461
 
462
+ .panel-list .panel-header {
463
+ border-left: 2px solid var(--link);
464
+ }
465
+
399
466
  .legend-inline {
400
467
  margin: 0;
401
468
  margin-left: auto;
@@ -410,11 +477,6 @@ body.dashboard-page {
410
477
  border-radius: var(--radius);
411
478
  }
412
479
 
413
- /* Problems panel: blue accent */
414
- .panel-llm {
415
- border-left: 3px solid var(--link);
416
- }
417
- .panel-llm .panel-header { border-left: none; }
418
480
 
419
481
  /* ——— Banner ——— */
420
482
  .no-llm-banner {
@@ -432,39 +494,62 @@ body.dashboard-page {
432
494
  margin: 0;
433
495
  }
434
496
 
435
- /* ——— Treemap ——— */
497
+ /* ——— Treemap: colored block + file name visible ——— */
436
498
  #treemap {
437
499
  display: flex;
438
500
  flex-wrap: wrap;
439
- gap: 4px;
440
- min-height: 160px;
501
+ gap: 10px 12px;
502
+ min-height: 120px;
441
503
  padding: 0.25rem 0;
442
504
  }
443
505
 
444
506
  .treemap-cell {
507
+ width: 92px;
508
+ flex: none;
445
509
  display: flex;
446
- align-items: flex-end;
447
- min-width: 64px;
448
- padding: 6px 8px;
449
- font-size: 11px;
510
+ flex-direction: column;
511
+ align-items: center;
512
+ gap: 4px;
450
513
  cursor: pointer;
451
- overflow: hidden;
452
- text-overflow: ellipsis;
453
- white-space: nowrap;
514
+ padding: 0;
515
+ border: none;
516
+ background: none;
517
+ }
518
+
519
+ .treemap-cell-block {
520
+ width: 40px;
521
+ height: 40px;
522
+ flex-shrink: 0;
523
+ border-radius: 4px;
454
524
  border: 1px solid rgba(0, 0, 0, 0.15);
455
- border-radius: 2px;
456
525
  }
457
526
 
458
- .treemap-cell:hover {
527
+ .treemap-cell-name {
528
+ font-size: 10px;
529
+ line-height: 1.3;
530
+ color: var(--text);
531
+ text-align: center;
532
+ max-width: 100%;
533
+ overflow: hidden;
534
+ display: -webkit-box;
535
+ -webkit-line-clamp: 2;
536
+ -webkit-box-orient: vertical;
537
+ word-break: break-all;
538
+ }
539
+
540
+ .treemap-cell:hover .treemap-cell-block {
459
541
  outline: 2px solid var(--link);
460
542
  outline-offset: 1px;
461
543
  }
544
+ .treemap-cell:hover .treemap-cell-name {
545
+ color: var(--link);
546
+ }
462
547
 
463
- .treemap-cell[data-severity="critical"] { background: var(--tier-1); color: #fff; border-color: rgba(0,0,0,0.2); }
464
- .treemap-cell[data-severity="high"] { background: var(--tier-2); color: #fff; border-color: rgba(0,0,0,0.15); }
465
- .treemap-cell[data-severity="medium"] { background: var(--tier-3); color: #1a1a1a; border-color: rgba(0,0,0,0.1); }
466
- .treemap-cell[data-severity="low"] { background: var(--tier-5); color: #fff; border-color: rgba(0,0,0,0.1); }
467
- .treemap-cell[data-severity="none"] { background: var(--border); color: var(--text-muted); border-color: var(--border-subtle); }
548
+ .treemap-cell[data-severity="critical"] .treemap-cell-block { background: var(--tier-1); border-color: rgba(0,0,0,0.2); }
549
+ .treemap-cell[data-severity="high"] .treemap-cell-block { background: var(--tier-2); border-color: rgba(0,0,0,0.15); }
550
+ .treemap-cell[data-severity="medium"] .treemap-cell-block { background: var(--tier-3); border-color: rgba(0,0,0,0.1); }
551
+ .treemap-cell[data-severity="low"] .treemap-cell-block { background: var(--tier-5); border-color: rgba(0,0,0,0.1); }
552
+ .treemap-cell[data-severity="none"] .treemap-cell-block { background: var(--border); border-color: var(--border-subtle); }
468
553
 
469
554
  .legend {
470
555
  display: flex;
@@ -142,13 +142,14 @@ fileScores.forEach(function (_ref) {
142
142
  var llmScore =
143
143
  fileM && fileM.llmFileScore != null ? " (LLM debt: " + fileM.llmFileScore + "/100)" : "";
144
144
  var severity = (fileM && fileM.llmSeverity) ? fileM.llmSeverity : worstSeverity(items);
145
+ var basename = file.split("/").pop() || file;
145
146
  var cell = document.createElement("div");
146
147
  cell.className = "treemap-cell";
147
148
  cell.dataset.severity = severity;
148
- cell.style.flex = String((score / maxScore) * 100) + " 1 80px";
149
- cell.style.minWidth = "72px";
150
149
  cell.title = file + llmScore;
151
- cell.textContent = file.split("/").pop() || file;
150
+ cell.innerHTML =
151
+ '<span class="treemap-cell-block" aria-hidden="true"></span>' +
152
+ '<span class="treemap-cell-name">' + escapeHtml(basename) + "</span>";
152
153
  cell.addEventListener("click", function () { showDetail(file, items); });
153
154
  treemapEl.appendChild(cell);
154
155
  });
@@ -319,3 +320,22 @@ function showDetail(file, items) {
319
320
  if (e.target === panel) panel.classList.remove("show");
320
321
  };
321
322
  }
323
+
324
+ (function () {
325
+ var btn = document.getElementById("btnAiPrompts");
326
+ var overlay = document.getElementById("aiPromptsOverlay");
327
+ var closeBtn = document.getElementById("closeAiPrompts");
328
+ var backdrop = overlay && overlay.querySelector(".overlay-backdrop");
329
+ if (!btn || !overlay) return;
330
+ function open() {
331
+ overlay.classList.add("show");
332
+ overlay.setAttribute("aria-hidden", "false");
333
+ }
334
+ function close() {
335
+ overlay.classList.remove("show");
336
+ overlay.setAttribute("aria-hidden", "true");
337
+ }
338
+ btn.addEventListener("click", open);
339
+ if (closeBtn) closeBtn.addEventListener("click", close);
340
+ if (backdrop) backdrop.addEventListener("click", close);
341
+ })();
@@ -69,15 +69,6 @@ function buildHtml(run, title, darkMode, css, script) {
69
69
  });
70
70
  const highCriticalCount = run.debtItems.filter((d) => d.severity === "high" || d.severity === "critical").length;
71
71
  const hotspotCount = run.fileMetrics.filter((m) => (m.hotspotScore ?? 0) > 0.3).length;
72
- const tierColors = {
73
- 1: "#c00",
74
- 2: "#e85d00",
75
- 3: "#b8860b",
76
- 4: "#069",
77
- 5: "#0a6b0a",
78
- };
79
- const tierColor = tierColors[cleanliness.tier] ?? "#666";
80
- const scoreBadgeSvg = buildScoreBadgeSvg(cleanliness.tier, tierColor);
81
72
  const statsLine = `${run.fileMetrics.length} files · ${run.debtItems.length} items · ${highCriticalCount} high/crit · ${hotspotCount} hotspots`;
82
73
  return `<!DOCTYPE html>
83
74
  <html lang="en" data-theme="${theme}">
@@ -113,17 +104,14 @@ function buildHtml(run, title, darkMode, css, script) {
113
104
  <main class="dashboard-main">
114
105
  <div class="dashboard-grid-2x2">
115
106
  <div class="dashboard-cell dashboard-cell-score">
116
- <div class="panel panel-score panel-score-tier-${cleanliness.tier}">
117
- <div class="panel-header panel-header-accent">
107
+ <div class="panel panel-score" data-tier="${cleanliness.tier}">
108
+ <div class="panel-header">
118
109
  <h2 class="panel-title">Technical Debt Cleanliness Score</h2>
119
110
  </div>
120
111
  <div class="panel-body panel-body-score">
121
- <div class="score-display">
122
- <div class="score-shield-wrap" aria-hidden="true">${scoreBadgeSvg}</div>
123
- <div class="score-numeric">
124
- <span class="score-num">${cleanliness.tier}</span>
125
- <span class="score-of">of 5</span>
126
- </div>
112
+ <div class="score-numeric">
113
+ <span class="score-num">${cleanliness.tier}</span>
114
+ <span class="score-of">of 5</span>
127
115
  </div>
128
116
  <p class="score-label">${escapeHtml(cleanliness.label)}</p>
129
117
  <p class="score-desc">${escapeHtml(cleanliness.description)}</p>
@@ -132,8 +120,27 @@ function buildHtml(run, title, darkMode, css, script) {
132
120
  </div>
133
121
  </div>
134
122
 
123
+ <div class="dashboard-cell dashboard-cell-heatmap">
124
+ <div class="panel panel-heatmap">
125
+ <div class="panel-header panel-header-heatmap">
126
+ <h2 class="panel-title">Files by debt</h2>
127
+ <p class="panel-desc">Size = complexity + churn. Color = severity. Click for details.</p>
128
+ <div class="legend legend-inline">
129
+ <span><span class="swatch swatch-crit"></span> Critical</span>
130
+ <span><span class="swatch swatch-high"></span> High</span>
131
+ <span><span class="swatch swatch-med"></span> Medium</span>
132
+ <span><span class="swatch swatch-low"></span> Low</span>
133
+ <span><span class="swatch swatch-none"></span> None</span>
134
+ </div>
135
+ </div>
136
+ <div class="panel-body panel-body-heatmap">
137
+ <div id="treemap"></div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+
135
142
  <div class="dashboard-cell dashboard-cell-problems">
136
- <div class="panel panel-llm">
143
+ <div class="panel">
137
144
  <div class="panel-header">
138
145
  <h2 class="panel-title">Description of problems</h2>
139
146
  </div>
@@ -159,27 +166,8 @@ function buildHtml(run, title, darkMode, css, script) {
159
166
  </div>
160
167
  </div>
161
168
 
162
- <div class="dashboard-cell dashboard-cell-heatmap">
163
- <div class="panel panel-heatmap panel-header-accent-orange">
164
- <div class="panel-header panel-header-heatmap">
165
- <h2 class="panel-title">Files by debt</h2>
166
- <p class="panel-desc">Size = complexity + churn. Color = severity. Click for details.</p>
167
- <div class="legend legend-inline">
168
- <span><span class="swatch swatch-crit"></span> Critical</span>
169
- <span><span class="swatch swatch-high"></span> High</span>
170
- <span><span class="swatch swatch-med"></span> Medium</span>
171
- <span><span class="swatch swatch-low"></span> Low</span>
172
- <span><span class="swatch swatch-none"></span> None</span>
173
- </div>
174
- </div>
175
- <div class="panel-body panel-body-heatmap">
176
- <div id="treemap"></div>
177
- </div>
178
- </div>
179
- </div>
180
-
181
169
  <div class="dashboard-cell dashboard-cell-list">
182
- <div class="panel panel-header-accent-blue">
170
+ <div class="panel panel-list">
183
171
  <div class="panel-header">
184
172
  <h2 class="panel-title">Ratings & files</h2>
185
173
  <p class="panel-desc">Files rated above none by static or LLM. Click for full details.</p>
@@ -190,8 +178,25 @@ function buildHtml(run, title, darkMode, css, script) {
190
178
  </div>
191
179
  </div>
192
180
  </div>
181
+
182
+ <div class="dashboard-footer">
183
+ <button type="button" class="btn-ai-prompts" id="btnAiPrompts">AI cleanup prompts</button>
184
+ </div>
193
185
  </main>
194
186
 
187
+ <div id="aiPromptsOverlay" class="overlay" aria-hidden="true">
188
+ <div class="overlay-backdrop"></div>
189
+ <div class="overlay-panel">
190
+ <div class="overlay-header">
191
+ <h2 class="overlay-title">AI cleanup prompts</h2>
192
+ <button type="button" class="overlay-close" id="closeAiPrompts" aria-label="Close">&times;</button>
193
+ </div>
194
+ <div class="overlay-body">
195
+ <p class="overlay-placeholder">Prompts to pass into AI for cleaning up the codebase will appear here.</p>
196
+ </div>
197
+ </div>
198
+ </div>
199
+
195
200
  <div id="detail">
196
201
  <div class="panel">
197
202
  <h3 id="detailTitle"></h3>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tech-debt-visualizer",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Language-agnostic CLI that analyzes repos and generates interactive technical debt visualizations with AI-powered insights",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",