tech-debt-visualizer 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/reports/assets/report.css +165 -78
- package/dist/reports/html.js +19 -13
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* Technical Debt Report —
|
|
1
|
+
/* Technical Debt Report — Colorful dashboard, clean fit, scroll in sections */
|
|
2
2
|
:root {
|
|
3
3
|
--bg: #0b0c0e;
|
|
4
4
|
--bg-elevated: #111214;
|
|
@@ -9,8 +9,13 @@
|
|
|
9
9
|
--text: #e8e9ea;
|
|
10
10
|
--text-muted: #8b9199;
|
|
11
11
|
--link: #5794f2;
|
|
12
|
-
--radius:
|
|
13
|
-
--shadow: 0 1px
|
|
12
|
+
--radius: 6px;
|
|
13
|
+
--shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
|
|
14
|
+
--tier-1: #e53935;
|
|
15
|
+
--tier-2: #f57c00;
|
|
16
|
+
--tier-3: #f9a825;
|
|
17
|
+
--tier-4: #29b6f6;
|
|
18
|
+
--tier-5: #43a047;
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
[data-theme="light"] {
|
|
@@ -24,6 +29,11 @@
|
|
|
24
29
|
--text-muted: #6b7077;
|
|
25
30
|
--link: #3274d9;
|
|
26
31
|
--shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
|
|
32
|
+
--tier-1: #c62828;
|
|
33
|
+
--tier-2: #ef6c00;
|
|
34
|
+
--tier-3: #f9a825;
|
|
35
|
+
--tier-4: #0288d1;
|
|
36
|
+
--tier-5: #2e7d32;
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
* { box-sizing: border-box; }
|
|
@@ -40,7 +50,11 @@ body {
|
|
|
40
50
|
}
|
|
41
51
|
|
|
42
52
|
body.dashboard-page {
|
|
43
|
-
padding-bottom:
|
|
53
|
+
padding-bottom: 0;
|
|
54
|
+
height: 100vh;
|
|
55
|
+
overflow: hidden;
|
|
56
|
+
display: flex;
|
|
57
|
+
flex-direction: column;
|
|
44
58
|
}
|
|
45
59
|
|
|
46
60
|
/* ——— Dashboard header (Grafana top bar: title left, score right) ——— */
|
|
@@ -104,70 +118,82 @@ body.dashboard-page {
|
|
|
104
118
|
.dashboard-score-of { font-size: 0.85rem; font-weight: 500; color: var(--text-muted); }
|
|
105
119
|
.dashboard-score-label { font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.04em; margin-left: 0.35rem; opacity: 0.95; }
|
|
106
120
|
|
|
107
|
-
.dashboard-score.tier-1 { background: rgba(
|
|
108
|
-
.dashboard-score.tier-2 { background: rgba(
|
|
109
|
-
.dashboard-score.tier-3 { background: rgba(
|
|
110
|
-
.dashboard-score.tier-4 { background: rgba(
|
|
111
|
-
.dashboard-score.tier-5 { background: rgba(
|
|
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; }
|
|
112
126
|
|
|
113
127
|
.dashboard-date {
|
|
114
128
|
font-size: 12px;
|
|
115
129
|
color: var(--text-muted);
|
|
116
130
|
}
|
|
117
131
|
|
|
118
|
-
/* ——— Main content: 2×2
|
|
132
|
+
/* ——— Main content: 2×2 grid, fills viewport, scroll inside cells ——— */
|
|
119
133
|
.dashboard-main {
|
|
120
|
-
|
|
134
|
+
flex: 1;
|
|
135
|
+
min-height: 0;
|
|
136
|
+
max-width: 1600px;
|
|
121
137
|
margin: 0 auto;
|
|
122
|
-
padding: 1rem
|
|
123
|
-
|
|
138
|
+
padding: 0.75rem 1rem;
|
|
139
|
+
width: 100%;
|
|
140
|
+
overflow: hidden;
|
|
124
141
|
}
|
|
125
142
|
|
|
126
143
|
.dashboard-grid-2x2 {
|
|
127
144
|
display: grid;
|
|
128
145
|
grid-template-columns: 1fr 1fr;
|
|
129
|
-
grid-template-rows: auto
|
|
130
|
-
gap:
|
|
131
|
-
|
|
146
|
+
grid-template-rows: auto 1fr;
|
|
147
|
+
gap: 0.75rem;
|
|
148
|
+
height: 100%;
|
|
149
|
+
min-height: 0;
|
|
150
|
+
align-items: stretch;
|
|
132
151
|
}
|
|
133
152
|
|
|
134
153
|
.dashboard-cell {
|
|
135
154
|
min-height: 0;
|
|
136
155
|
min-width: 0;
|
|
156
|
+
overflow: hidden;
|
|
137
157
|
}
|
|
138
158
|
|
|
139
159
|
.dashboard-cell .panel {
|
|
140
160
|
height: 100%;
|
|
141
161
|
display: flex;
|
|
142
162
|
flex-direction: column;
|
|
163
|
+
min-height: 0;
|
|
143
164
|
}
|
|
144
165
|
|
|
145
166
|
.dashboard-cell .panel-body {
|
|
146
167
|
flex: 1;
|
|
147
168
|
min-height: 0;
|
|
148
169
|
overflow: auto;
|
|
170
|
+
-webkit-overflow-scrolling: touch;
|
|
149
171
|
}
|
|
150
172
|
|
|
151
|
-
.dashboard-cell-score .panel-body-score { flex:
|
|
173
|
+
.dashboard-cell-score .panel-body-score { flex: 0 1 auto; overflow: visible; min-height: 0; }
|
|
152
174
|
|
|
153
175
|
.dashboard-cell-heatmap .panel-body-heatmap,
|
|
154
176
|
.dashboard-cell-list .panel-body {
|
|
155
|
-
min-height:
|
|
177
|
+
min-height: 0;
|
|
156
178
|
}
|
|
157
179
|
|
|
158
180
|
@media (max-width: 900px) {
|
|
181
|
+
body.dashboard-page { height: auto; overflow: auto; }
|
|
159
182
|
.dashboard-grid-2x2 {
|
|
160
183
|
grid-template-columns: 1fr;
|
|
161
184
|
grid-template-rows: auto auto auto auto;
|
|
185
|
+
height: auto;
|
|
162
186
|
}
|
|
187
|
+
.dashboard-cell-heatmap .panel-body-heatmap { min-height: 240px; }
|
|
188
|
+
.dashboard-cell-list .panel-body { min-height: 240px; }
|
|
163
189
|
}
|
|
164
190
|
|
|
165
191
|
@media (max-width: 560px) {
|
|
166
|
-
.dashboard-header { padding: 0.
|
|
167
|
-
.dashboard-main { padding: 0.75rem
|
|
192
|
+
.dashboard-header { padding: 0.5rem 0.75rem; }
|
|
193
|
+
.dashboard-main { padding: 0.5rem 0.75rem; }
|
|
168
194
|
}
|
|
169
195
|
|
|
170
|
-
/* ——— Panels
|
|
196
|
+
/* ——— Panels: borders, colored accents ——— */
|
|
171
197
|
.panel {
|
|
172
198
|
background: var(--surface);
|
|
173
199
|
border: 1px solid var(--border);
|
|
@@ -177,94 +203,154 @@ body.dashboard-page {
|
|
|
177
203
|
}
|
|
178
204
|
|
|
179
205
|
.panel-header {
|
|
180
|
-
padding: 0.
|
|
206
|
+
padding: 0.6rem 0.85rem;
|
|
181
207
|
border-bottom: 1px solid var(--border-subtle);
|
|
182
|
-
background: rgba(0, 0, 0, 0.
|
|
208
|
+
background: rgba(0, 0, 0, 0.04);
|
|
209
|
+
flex-shrink: 0;
|
|
183
210
|
}
|
|
184
211
|
|
|
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); }
|
|
221
|
+
|
|
185
222
|
[data-theme="light"] .panel-header {
|
|
186
223
|
background: rgba(0, 0, 0, 0.02);
|
|
187
224
|
}
|
|
188
225
|
|
|
189
226
|
.panel-title {
|
|
190
227
|
margin: 0;
|
|
191
|
-
font-size:
|
|
192
|
-
font-weight:
|
|
228
|
+
font-size: 12px;
|
|
229
|
+
font-weight: 700;
|
|
193
230
|
color: var(--text);
|
|
194
|
-
letter-spacing:
|
|
231
|
+
letter-spacing: 0.02em;
|
|
232
|
+
text-transform: uppercase;
|
|
195
233
|
}
|
|
196
234
|
|
|
197
235
|
.panel-desc {
|
|
198
|
-
margin: 0.
|
|
199
|
-
font-size:
|
|
236
|
+
margin: 0.2rem 0 0;
|
|
237
|
+
font-size: 11px;
|
|
200
238
|
color: var(--text-muted);
|
|
201
|
-
line-height: 1.
|
|
239
|
+
line-height: 1.35;
|
|
202
240
|
}
|
|
203
241
|
|
|
204
242
|
.panel-body {
|
|
205
|
-
padding: 1rem;
|
|
243
|
+
padding: 0.85rem 1rem;
|
|
206
244
|
}
|
|
207
245
|
|
|
208
246
|
.panel-body-center {
|
|
209
247
|
text-align: center;
|
|
210
248
|
}
|
|
211
249
|
|
|
212
|
-
/* ——— Score panel
|
|
250
|
+
/* ——— Score panel: shield + big number + tier color ——— */
|
|
251
|
+
.panel-score {
|
|
252
|
+
border-top: 2px solid transparent;
|
|
253
|
+
}
|
|
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); }
|
|
259
|
+
|
|
213
260
|
.panel-score .panel-body-score {
|
|
214
261
|
text-align: center;
|
|
215
|
-
padding:
|
|
262
|
+
padding: 1rem 0.85rem;
|
|
216
263
|
}
|
|
217
264
|
|
|
218
|
-
.
|
|
219
|
-
display:
|
|
220
|
-
|
|
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 {
|
|
221
275
|
line-height: 0;
|
|
276
|
+
flex-shrink: 0;
|
|
222
277
|
}
|
|
223
278
|
|
|
224
279
|
.panel-score .score-badge-svg {
|
|
225
280
|
display: block;
|
|
226
|
-
width:
|
|
281
|
+
width: 72px;
|
|
227
282
|
height: auto;
|
|
228
|
-
margin: 0 auto;
|
|
229
283
|
}
|
|
230
284
|
|
|
231
285
|
.panel-score .score-badge-svg .score-badge-num {
|
|
232
|
-
font-size:
|
|
233
|
-
font-weight:
|
|
234
|
-
letter-spacing: -0.
|
|
286
|
+
font-size: 28px;
|
|
287
|
+
font-weight: 900;
|
|
288
|
+
letter-spacing: -0.03em;
|
|
289
|
+
fill: #fff;
|
|
235
290
|
}
|
|
236
291
|
|
|
237
292
|
.panel-score .score-badge-svg .score-badge-of {
|
|
238
|
-
font-size:
|
|
293
|
+
font-size: 10px;
|
|
239
294
|
font-weight: 700;
|
|
240
|
-
letter-spacing: 0.
|
|
295
|
+
letter-spacing: 0.1em;
|
|
241
296
|
text-transform: uppercase;
|
|
242
|
-
|
|
297
|
+
fill: rgba(255,255,255,0.95);
|
|
243
298
|
}
|
|
244
299
|
|
|
245
|
-
.
|
|
246
|
-
|
|
247
|
-
|
|
300
|
+
.score-numeric {
|
|
301
|
+
display: flex;
|
|
302
|
+
align-items: baseline;
|
|
303
|
+
gap: 0.2rem;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.score-num {
|
|
307
|
+
font-size: 2.25rem;
|
|
308
|
+
font-weight: 800;
|
|
309
|
+
line-height: 1;
|
|
310
|
+
letter-spacing: -0.04em;
|
|
311
|
+
}
|
|
312
|
+
|
|
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
|
+
.score-of {
|
|
320
|
+
font-size: 0.95rem;
|
|
248
321
|
font-weight: 600;
|
|
249
|
-
color: var(--text);
|
|
322
|
+
color: var(--text-muted);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.panel-score .score-label {
|
|
326
|
+
margin: 0 0 0.2rem;
|
|
327
|
+
font-size: 0.95rem;
|
|
328
|
+
font-weight: 700;
|
|
250
329
|
}
|
|
251
330
|
|
|
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
|
+
|
|
252
337
|
.panel-score .score-desc {
|
|
253
|
-
margin: 0 0 0.
|
|
254
|
-
font-size:
|
|
338
|
+
margin: 0 0 0.4rem;
|
|
339
|
+
font-size: 12px;
|
|
255
340
|
color: var(--text-muted);
|
|
256
|
-
line-height: 1.
|
|
257
|
-
max-width:
|
|
341
|
+
line-height: 1.4;
|
|
342
|
+
max-width: 260px;
|
|
258
343
|
margin-left: auto;
|
|
259
344
|
margin-right: auto;
|
|
260
345
|
}
|
|
261
346
|
|
|
262
347
|
.panel-score .score-stats {
|
|
263
348
|
margin: 0;
|
|
264
|
-
font-size:
|
|
349
|
+
font-size: 10px;
|
|
265
350
|
color: var(--text-muted);
|
|
266
351
|
text-transform: uppercase;
|
|
267
|
-
letter-spacing: 0.
|
|
352
|
+
letter-spacing: 0.04em;
|
|
353
|
+
font-weight: 600;
|
|
268
354
|
}
|
|
269
355
|
|
|
270
356
|
/* ——— Description of problems panel (top-right) ——— */
|
|
@@ -278,19 +364,19 @@ body.dashboard-page {
|
|
|
278
364
|
.priority-inline {
|
|
279
365
|
display: grid;
|
|
280
366
|
grid-template-columns: 1fr 1fr;
|
|
281
|
-
gap:
|
|
282
|
-
margin-top:
|
|
283
|
-
padding-top:
|
|
367
|
+
gap: 0.75rem;
|
|
368
|
+
margin-top: 0.75rem;
|
|
369
|
+
padding-top: 0.75rem;
|
|
284
370
|
border-top: 1px solid var(--border-subtle);
|
|
285
371
|
}
|
|
286
372
|
|
|
287
373
|
.priority-inline h4 {
|
|
288
|
-
margin: 0 0 0.
|
|
289
|
-
font-size:
|
|
290
|
-
font-weight:
|
|
374
|
+
margin: 0 0 0.35rem;
|
|
375
|
+
font-size: 10px;
|
|
376
|
+
font-weight: 700;
|
|
291
377
|
text-transform: uppercase;
|
|
292
|
-
letter-spacing: 0.
|
|
293
|
-
color: var(--
|
|
378
|
+
letter-spacing: 0.05em;
|
|
379
|
+
color: var(--tier-2);
|
|
294
380
|
}
|
|
295
381
|
|
|
296
382
|
.priority-inline .priority-list { margin: 0; }
|
|
@@ -324,10 +410,11 @@ body.dashboard-page {
|
|
|
324
410
|
border-radius: var(--radius);
|
|
325
411
|
}
|
|
326
412
|
|
|
327
|
-
/*
|
|
413
|
+
/* Problems panel: blue accent */
|
|
328
414
|
.panel-llm {
|
|
329
415
|
border-left: 3px solid var(--link);
|
|
330
416
|
}
|
|
417
|
+
.panel-llm .panel-header { border-left: none; }
|
|
331
418
|
|
|
332
419
|
/* ——— Banner ——— */
|
|
333
420
|
.no-llm-banner {
|
|
@@ -373,11 +460,11 @@ body.dashboard-page {
|
|
|
373
460
|
outline-offset: 1px;
|
|
374
461
|
}
|
|
375
462
|
|
|
376
|
-
.treemap-cell[data-severity="critical"] { background:
|
|
377
|
-
.treemap-cell[data-severity="high"] { background:
|
|
378
|
-
.treemap-cell[data-severity="medium"] { background:
|
|
379
|
-
.treemap-cell[data-severity="low"] { background:
|
|
380
|
-
.treemap-cell[data-severity="none"] { background: var(--border); color: var(--text-muted); border-color: var(--border); }
|
|
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); }
|
|
381
468
|
|
|
382
469
|
.legend {
|
|
383
470
|
display: flex;
|
|
@@ -389,12 +476,12 @@ body.dashboard-page {
|
|
|
389
476
|
color: var(--text-muted);
|
|
390
477
|
}
|
|
391
478
|
|
|
392
|
-
.legend span { display: inline-flex; align-items: center; gap: 0.
|
|
393
|
-
.legend .swatch { width:
|
|
394
|
-
.legend .swatch-crit { background:
|
|
395
|
-
.legend .swatch-high { background:
|
|
396
|
-
.legend .swatch-med { background:
|
|
397
|
-
.legend .swatch-low { background:
|
|
479
|
+
.legend span { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 11px; font-weight: 600; }
|
|
480
|
+
.legend .swatch { width: 12px; height: 12px; border-radius: 3px; }
|
|
481
|
+
.legend .swatch-crit { background: var(--tier-1); }
|
|
482
|
+
.legend .swatch-high { background: var(--tier-2); }
|
|
483
|
+
.legend .swatch-med { background: var(--tier-3); }
|
|
484
|
+
.legend .swatch-low { background: var(--tier-5); }
|
|
398
485
|
.legend .swatch-none { background: var(--border); }
|
|
399
486
|
|
|
400
487
|
/* ——— Priority lists ——— */
|
|
@@ -460,12 +547,12 @@ body.dashboard-page {
|
|
|
460
547
|
border-radius: 3px;
|
|
461
548
|
}
|
|
462
549
|
|
|
463
|
-
.badge-critical { background:
|
|
464
|
-
.badge-high { background:
|
|
465
|
-
.badge-medium { background:
|
|
466
|
-
.badge-low { background:
|
|
550
|
+
.badge-critical { background: var(--tier-1); color: #fff; font-weight: 700; }
|
|
551
|
+
.badge-high { background: var(--tier-2); color: #fff; font-weight: 700; }
|
|
552
|
+
.badge-medium { background: var(--tier-3); color: #1a1a1a; font-weight: 700; }
|
|
553
|
+
.badge-low { background: var(--tier-5); color: #fff; font-weight: 700; }
|
|
467
554
|
.badge-none { background: var(--border); color: var(--text-muted); }
|
|
468
|
-
.badge-llm { background: var(--link); color: #fff; }
|
|
555
|
+
.badge-llm { background: var(--link); color: #fff; font-weight: 700; }
|
|
469
556
|
|
|
470
557
|
/* ——— Detail modal ——— */
|
|
471
558
|
#detail {
|
package/dist/reports/html.js
CHANGED
|
@@ -14,25 +14,25 @@ export async function generateHtmlReport(run, options) {
|
|
|
14
14
|
const html = buildHtml(run, title, darkMode, css, script);
|
|
15
15
|
await writeFile(outputPath, html, "utf-8");
|
|
16
16
|
}
|
|
17
|
-
/** Inline SVG badge: shield shape with tier number and "of 5". */
|
|
17
|
+
/** Inline SVG badge: shield shape with tier number and "of 5" — clean, bold, tier-colored. */
|
|
18
18
|
function buildScoreBadgeSvg(tier, fillColor) {
|
|
19
|
-
const lighter = adjustHexBrightness(fillColor, 1.
|
|
19
|
+
const lighter = adjustHexBrightness(fillColor, 1.25);
|
|
20
20
|
const shadowId = "badge-shadow-" + tier;
|
|
21
21
|
const gradientId = "badge-shine-" + tier;
|
|
22
22
|
return `<svg class="score-badge-svg" viewBox="0 0 140 168" xmlns="http://www.w3.org/2000/svg" role="img">
|
|
23
23
|
<defs>
|
|
24
24
|
<linearGradient id="${gradientId}" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
25
|
-
<stop offset="0%" style="stop-color:${lighter};stop-opacity:0.
|
|
25
|
+
<stop offset="0%" style="stop-color:${lighter};stop-opacity:0.6" />
|
|
26
26
|
<stop offset="100%" style="stop-color:${fillColor};stop-opacity:1" />
|
|
27
27
|
</linearGradient>
|
|
28
|
-
<filter id="${shadowId}" x="-
|
|
29
|
-
<feDropShadow dx="0" dy="
|
|
28
|
+
<filter id="${shadowId}" x="-40%" y="-30%" width="180%" height="180%">
|
|
29
|
+
<feDropShadow dx="0" dy="4" stdDeviation="6" flood-color="${fillColor}" flood-opacity="0.4"/>
|
|
30
30
|
</filter>
|
|
31
31
|
</defs>
|
|
32
32
|
<path fill="url(#${gradientId})" filter="url(#${shadowId})" d="M70 12 C108 12 128 38 128 72 C128 106 70 156 70 156 C70 156 12 106 12 72 C12 38 32 12 70 12 Z"/>
|
|
33
|
-
<path fill="none" stroke="rgba(255,255,255,0.
|
|
34
|
-
<text x="70" y="
|
|
35
|
-
<text x="70" y="
|
|
33
|
+
<path fill="none" stroke="rgba(255,255,255,0.5)" stroke-width="2" stroke-linejoin="round" d="M70 12 C108 12 128 38 128 72 C128 106 70 156 70 156 C70 156 12 106 12 72 C12 38 32 12 70 12 Z"/>
|
|
34
|
+
<text x="70" y="80" text-anchor="middle" class="score-badge-num" fill="white">${tier}</text>
|
|
35
|
+
<text x="70" y="102" text-anchor="middle" class="score-badge-of" fill="rgba(255,255,255,0.95)">of 5</text>
|
|
36
36
|
</svg>`;
|
|
37
37
|
}
|
|
38
38
|
function adjustHexBrightness(hex, factor) {
|
|
@@ -113,12 +113,18 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
113
113
|
<main class="dashboard-main">
|
|
114
114
|
<div class="dashboard-grid-2x2">
|
|
115
115
|
<div class="dashboard-cell dashboard-cell-score">
|
|
116
|
-
<div class="panel panel-score tier-${cleanliness.tier}">
|
|
117
|
-
<div class="panel-header">
|
|
116
|
+
<div class="panel panel-score panel-score-tier-${cleanliness.tier}">
|
|
117
|
+
<div class="panel-header panel-header-accent">
|
|
118
118
|
<h2 class="panel-title">Technical Debt Cleanliness Score</h2>
|
|
119
119
|
</div>
|
|
120
120
|
<div class="panel-body panel-body-score">
|
|
121
|
-
<div class="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>
|
|
127
|
+
</div>
|
|
122
128
|
<p class="score-label">${escapeHtml(cleanliness.label)}</p>
|
|
123
129
|
<p class="score-desc">${escapeHtml(cleanliness.description)}</p>
|
|
124
130
|
<p class="score-stats">${statsLine}</p>
|
|
@@ -154,7 +160,7 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
154
160
|
</div>
|
|
155
161
|
|
|
156
162
|
<div class="dashboard-cell dashboard-cell-heatmap">
|
|
157
|
-
<div class="panel panel-heatmap">
|
|
163
|
+
<div class="panel panel-heatmap panel-header-accent-orange">
|
|
158
164
|
<div class="panel-header panel-header-heatmap">
|
|
159
165
|
<h2 class="panel-title">Files by debt</h2>
|
|
160
166
|
<p class="panel-desc">Size = complexity + churn. Color = severity. Click for details.</p>
|
|
@@ -173,7 +179,7 @@ function buildHtml(run, title, darkMode, css, script) {
|
|
|
173
179
|
</div>
|
|
174
180
|
|
|
175
181
|
<div class="dashboard-cell dashboard-cell-list">
|
|
176
|
-
<div class="panel">
|
|
182
|
+
<div class="panel panel-header-accent-blue">
|
|
177
183
|
<div class="panel-header">
|
|
178
184
|
<h2 class="panel-title">Ratings & files</h2>
|
|
179
185
|
<p class="panel-desc">Files rated above none by static or LLM. Click for full details.</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tech-debt-visualizer",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
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",
|