@reportforge/playwright-pdf 0.4.0 → 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.
- package/CHANGELOG.md +31 -0
- package/README.md +5 -1
- package/dist/demo/cli.js +16 -2
- package/dist/index.js +88 -46
- package/dist/index.mjs +88 -46
- package/dist/templates/layouts/detailed.hbs +5 -4
- package/dist/templates/layouts/minimal.hbs +2 -0
- package/dist/templates/partials/charts.hbs +30 -16
- package/dist/templates/partials/cover-page.hbs +1 -1
- package/dist/templates/partials/executive-summary.hbs +5 -1
- package/dist/templates/partials/failure-deep-dive.hbs +2 -2
- package/dist/templates/partials/requirements-matrix.hbs +1 -1
- package/dist/templates/partials/slow-tests.hbs +2 -2
- package/dist/templates/partials/suite-breakdown.hbs +2 -1
- package/dist/templates/styles/base.css +244 -6
- package/dist/templates/styles/detailed.css +6 -159
- package/dist/templates/styles/executive.css +3 -76
- package/dist/templates/styles/minimal.css +3 -3
- package/package.json +1 -1
|
@@ -149,14 +149,19 @@ tr:last-child td { border-bottom: none; }
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
/* ── Page breaks ────────────────────────────────────────────────────────── */
|
|
152
|
-
.
|
|
153
|
-
.no-break { page-break-inside: avoid; }
|
|
154
|
-
.page-group { page-break-before: always; page-break-inside: avoid; break-inside: avoid; }
|
|
155
|
-
.page-group > .section { page-break-inside: avoid; break-inside: avoid; }
|
|
156
|
-
.page-group > .section:last-child { margin-bottom: 0; }
|
|
152
|
+
.no-break { page-break-inside: avoid; }
|
|
157
153
|
|
|
158
154
|
/* ── Section wrapper ────────────────────────────────────────────────────── */
|
|
159
|
-
|
|
155
|
+
/* Large sections (suite breakdown, failures, tables) MAY flow across pages —
|
|
156
|
+
their rows carry .no-break so they never split mid-row. Only the small atomic
|
|
157
|
+
blocks below stay glued together, and headings stick to the content beneath. */
|
|
158
|
+
.section { margin-bottom: 24px; }
|
|
159
|
+
.kpi-strip, .summary-row, .charts-grid, .release-gate, .flaky-callout,
|
|
160
|
+
.trend-card, .flakiness-card, .cover-page__stats-strip, .env-grid {
|
|
161
|
+
page-break-inside: avoid; break-inside: avoid;
|
|
162
|
+
}
|
|
163
|
+
h2, h3 { page-break-after: avoid; break-after: avoid; }
|
|
164
|
+
.suite-group__header { page-break-after: avoid; break-after: avoid; }
|
|
160
165
|
|
|
161
166
|
/* ── Code / stack trace ─────────────────────────────────────────────────── */
|
|
162
167
|
pre, code {
|
|
@@ -235,3 +240,236 @@ code {
|
|
|
235
240
|
|
|
236
241
|
/* ── Failure-analysis one-liner — shared by detailed + executive templates ── */
|
|
237
242
|
.analysis-oneliner { font-size: 0.9em; opacity: 0.9; margin-top: 4px; }
|
|
243
|
+
|
|
244
|
+
/* ── Release gate — ship/hold banner, shared by all templates ────────────── */
|
|
245
|
+
.release-gate {
|
|
246
|
+
display: flex; align-items: center; gap: 16px;
|
|
247
|
+
padding: 16px 20px; border-radius: 6px; margin-bottom: 22px;
|
|
248
|
+
border: 1px solid;
|
|
249
|
+
position: relative; overflow: hidden;
|
|
250
|
+
-webkit-print-color-adjust: exact;
|
|
251
|
+
print-color-adjust: exact;
|
|
252
|
+
}
|
|
253
|
+
.release-gate--pass {
|
|
254
|
+
background: var(--pass-dim); border-color: #C5DBC9;
|
|
255
|
+
}
|
|
256
|
+
.release-gate--fail {
|
|
257
|
+
background: var(--fail-dim); border-color: #E5C9BD;
|
|
258
|
+
}
|
|
259
|
+
.release-gate__icon {
|
|
260
|
+
font-size: 22px; font-weight: 700; flex-shrink: 0; width: 32px;
|
|
261
|
+
text-align: center; line-height: 1;
|
|
262
|
+
}
|
|
263
|
+
.release-gate--pass .release-gate__icon { color: var(--pass); }
|
|
264
|
+
.release-gate--fail .release-gate__icon { color: var(--fail); }
|
|
265
|
+
.release-gate__body { flex: 1; }
|
|
266
|
+
.release-gate__label {
|
|
267
|
+
font-family: 'Inter', system-ui, sans-serif; font-size: 8px;
|
|
268
|
+
font-weight: 700; letter-spacing: 1.4px; text-transform: uppercase;
|
|
269
|
+
color: var(--text-3); margin-bottom: 4px;
|
|
270
|
+
}
|
|
271
|
+
.release-gate__verdict {
|
|
272
|
+
font-family: 'Source Serif Pro', Georgia, serif;
|
|
273
|
+
font-size: 18px; font-weight: 700; letter-spacing: -0.2px; line-height: 1.1;
|
|
274
|
+
}
|
|
275
|
+
.release-gate__verdict--pass { color: var(--pass); }
|
|
276
|
+
.release-gate__verdict--fail { color: var(--fail); }
|
|
277
|
+
.release-gate__detail {
|
|
278
|
+
font-family: 'Inter', system-ui, sans-serif; font-size: 10px;
|
|
279
|
+
color: var(--text-2); margin-top: 4px;
|
|
280
|
+
}
|
|
281
|
+
.release-gate__meta {
|
|
282
|
+
display: flex; flex-direction: column; gap: 3px; align-items: flex-end;
|
|
283
|
+
font-family: 'JetBrains Mono', monospace; font-size: 9px; color: var(--text-3);
|
|
284
|
+
flex-shrink: 0; text-align: right;
|
|
285
|
+
}
|
|
286
|
+
.release-gate__sep { color: var(--border-3); }
|
|
287
|
+
.release-gate__flaky-warn { color: var(--flaky); font-weight: 600; }
|
|
288
|
+
|
|
289
|
+
/* ── Failure severity — colour the card's left edge by triage rank ───────── */
|
|
290
|
+
/* Two-class specificity beats the per-template `.failure-item` border shorthand. */
|
|
291
|
+
.failure-item.failure-item--critical { border-left-color: var(--fail); }
|
|
292
|
+
.failure-item.failure-item--high { border-left-color: #A35E1E; }
|
|
293
|
+
.failure-item.failure-item--medium { border-left-color: var(--timeout); }
|
|
294
|
+
.failure-item.failure-item--low { border-left-color: var(--text-3); }
|
|
295
|
+
|
|
296
|
+
/* ── History trend card — shared by detailed + executive (charts.hbs) ─────── */
|
|
297
|
+
.trend-card {
|
|
298
|
+
background: var(--surface);
|
|
299
|
+
border: 1px solid var(--border-2);
|
|
300
|
+
border-radius: 6px;
|
|
301
|
+
padding: 16px 18px 14px;
|
|
302
|
+
margin-bottom: 24px;
|
|
303
|
+
page-break-inside: avoid;
|
|
304
|
+
}
|
|
305
|
+
.trend-card__header {
|
|
306
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
307
|
+
margin-bottom: 14px;
|
|
308
|
+
}
|
|
309
|
+
.trend-card__title {
|
|
310
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
311
|
+
font-size: 9px; font-weight: 700;
|
|
312
|
+
letter-spacing: 1.2px; text-transform: uppercase;
|
|
313
|
+
color: var(--text-3);
|
|
314
|
+
}
|
|
315
|
+
.delta { font-size: 11px; font-weight: 700; }
|
|
316
|
+
.delta-up { color: var(--pass); }
|
|
317
|
+
.delta-down { color: var(--fail); }
|
|
318
|
+
|
|
319
|
+
/* ── Run history table (generated by JS) ─────────────────────────────────── */
|
|
320
|
+
.trend-run-history {
|
|
321
|
+
margin-top: 10px;
|
|
322
|
+
border-top: 1px solid var(--border);
|
|
323
|
+
padding-top: 8px;
|
|
324
|
+
}
|
|
325
|
+
.rh-item {
|
|
326
|
+
display: flex; align-items: center; gap: 12px;
|
|
327
|
+
padding: 5px 8px; border-radius: 4px;
|
|
328
|
+
font-size: 9px; font-family: 'Inter', system-ui, sans-serif;
|
|
329
|
+
}
|
|
330
|
+
.rh-item:nth-child(odd) {
|
|
331
|
+
background: var(--surface-2);
|
|
332
|
+
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
|
333
|
+
}
|
|
334
|
+
.rh-dot { flex-shrink: 0; }
|
|
335
|
+
.rh-date { color: var(--text-2); flex: 1; }
|
|
336
|
+
.rh-rate { font-weight: 700; min-width: 34px; color: var(--text-1); }
|
|
337
|
+
.rh-rate--pass { color: var(--pass); }
|
|
338
|
+
.rh-rate--fail { color: var(--fail); }
|
|
339
|
+
.rh-rate--partial { color: var(--flaky); }
|
|
340
|
+
.rh-tests { color: var(--text-3); min-width: 58px; }
|
|
341
|
+
.rh-dur { color: var(--text-3); }
|
|
342
|
+
|
|
343
|
+
/* ── Verdict dots (used in run history rh-dot) ───────────────────────────── */
|
|
344
|
+
.verdict-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
|
|
345
|
+
.verdict-passed { background: var(--pass); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
346
|
+
.verdict-partial { background: var(--flaky); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
347
|
+
.verdict-failed { background: var(--fail); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
348
|
+
.verdict-unknown { background: var(--skip); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
349
|
+
|
|
350
|
+
/* ── Flakiness trend table (R8) ─────────────────────────────────────────── */
|
|
351
|
+
.flakiness-card {
|
|
352
|
+
margin: 24px 0 0;
|
|
353
|
+
border: 1px solid var(--border);
|
|
354
|
+
border-radius: 8px;
|
|
355
|
+
overflow: hidden;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.flakiness-card__header {
|
|
359
|
+
display: flex;
|
|
360
|
+
align-items: center;
|
|
361
|
+
padding: 10px 16px;
|
|
362
|
+
background: var(--surface-2);
|
|
363
|
+
border-bottom: 1px solid var(--border);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.flakiness-card__title {
|
|
367
|
+
font-size: 11px;
|
|
368
|
+
font-weight: 600;
|
|
369
|
+
text-transform: uppercase;
|
|
370
|
+
letter-spacing: 0.04em;
|
|
371
|
+
color: var(--text-3);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.flakiness-table {
|
|
375
|
+
width: 100%;
|
|
376
|
+
border-collapse: collapse;
|
|
377
|
+
font-size: 11px;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
.flakiness-table thead th {
|
|
381
|
+
padding: 8px 12px;
|
|
382
|
+
text-align: left;
|
|
383
|
+
font-weight: 600;
|
|
384
|
+
font-size: 10px;
|
|
385
|
+
text-transform: uppercase;
|
|
386
|
+
letter-spacing: 0.04em;
|
|
387
|
+
color: var(--text-3);
|
|
388
|
+
border-bottom: 1px solid var(--border);
|
|
389
|
+
background: var(--surface-2);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.flakiness-table tbody tr {
|
|
393
|
+
border-bottom: 1px solid var(--border);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.flakiness-table tbody tr:last-child {
|
|
397
|
+
border-bottom: none;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.flakiness-table tbody td {
|
|
401
|
+
padding: 8px 12px;
|
|
402
|
+
vertical-align: middle;
|
|
403
|
+
color: var(--text-1);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
.flakiness-table__test {
|
|
407
|
+
max-width: 300px;
|
|
408
|
+
overflow: hidden;
|
|
409
|
+
text-overflow: ellipsis;
|
|
410
|
+
white-space: nowrap;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.flakiness-table__rate {
|
|
414
|
+
width: 72px;
|
|
415
|
+
font-weight: 600;
|
|
416
|
+
color: var(--flaky);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.flakiness-table__count {
|
|
420
|
+
width: 72px;
|
|
421
|
+
color: var(--text-3);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.flakiness-table__spark {
|
|
425
|
+
width: 140px;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.flaky-spark {
|
|
429
|
+
display: flex;
|
|
430
|
+
gap: 3px;
|
|
431
|
+
align-items: center;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.flaky-dot {
|
|
435
|
+
flex-shrink: 0;
|
|
436
|
+
width: 7px;
|
|
437
|
+
height: 7px;
|
|
438
|
+
border-radius: 50%;
|
|
439
|
+
background: var(--border, #e5e3d8);
|
|
440
|
+
print-color-adjust: exact;
|
|
441
|
+
-webkit-print-color-adjust: exact;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.flaky-dot--hit {
|
|
445
|
+
background: #f59e0b;
|
|
446
|
+
print-color-adjust: exact;
|
|
447
|
+
-webkit-print-color-adjust: exact;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* ── Environment grid — compact ci-environment, shared by minimal + executive ─ */
|
|
451
|
+
.env-grid {
|
|
452
|
+
display: grid; grid-template-columns: 1fr 1fr;
|
|
453
|
+
gap: 0;
|
|
454
|
+
background: var(--surface);
|
|
455
|
+
border: 1px solid var(--border-2);
|
|
456
|
+
border-radius: 6px;
|
|
457
|
+
overflow: hidden;
|
|
458
|
+
}
|
|
459
|
+
.env-item {
|
|
460
|
+
display: flex; gap: 12px; font-size: 10.5px; align-items: baseline;
|
|
461
|
+
padding: 10px 18px;
|
|
462
|
+
border-bottom: 1px solid var(--border);
|
|
463
|
+
border-right: 1px solid var(--border);
|
|
464
|
+
}
|
|
465
|
+
.env-item:nth-child(even) { border-right: none; }
|
|
466
|
+
.env-item:nth-last-child(-n+2) { border-bottom: none; }
|
|
467
|
+
.env-item__key {
|
|
468
|
+
font-family: 'Inter', system-ui, sans-serif; font-weight: 600;
|
|
469
|
+
font-size: 8.5px; letter-spacing: 1px; text-transform: uppercase;
|
|
470
|
+
color: var(--text-2); min-width: 80px;
|
|
471
|
+
}
|
|
472
|
+
.env-item__val {
|
|
473
|
+
font-family: 'JetBrains Mono', monospace;
|
|
474
|
+
font-size: 9.5px; color: var(--text-1);
|
|
475
|
+
}
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
/* ── KPI strip ───────────────────────────────────────────────────────────── */
|
|
59
59
|
.kpi-strip {
|
|
60
|
-
display: grid; grid-template-columns: repeat(
|
|
60
|
+
display: grid; grid-template-columns: repeat(6, 1fr);
|
|
61
61
|
gap: 10px; margin-bottom: 22px;
|
|
62
62
|
}
|
|
63
63
|
.kpi-card {
|
|
@@ -74,6 +74,7 @@
|
|
|
74
74
|
.kpi-card--total::before { background: var(--accent); }
|
|
75
75
|
.kpi-card--pass::before { background: var(--pass); }
|
|
76
76
|
.kpi-card--fail::before { background: var(--fail); }
|
|
77
|
+
.kpi-card--timedout::before { background: var(--timeout); }
|
|
77
78
|
.kpi-card--skip::before { background: var(--skip); }
|
|
78
79
|
.kpi-card--flaky::before { background: var(--flaky); }
|
|
79
80
|
|
|
@@ -87,6 +88,7 @@
|
|
|
87
88
|
.kpi-card--total .kpi-card__value { color: var(--info); }
|
|
88
89
|
.kpi-card--pass .kpi-card__value { color: var(--pass); }
|
|
89
90
|
.kpi-card--fail .kpi-card__value { color: var(--fail); }
|
|
91
|
+
.kpi-card--timedout .kpi-card__value { color: var(--timeout); }
|
|
90
92
|
.kpi-card--skip .kpi-card__value { color: var(--skip); }
|
|
91
93
|
.kpi-card--flaky .kpi-card__value { color: var(--flaky); }
|
|
92
94
|
|
|
@@ -230,10 +232,12 @@
|
|
|
230
232
|
}
|
|
231
233
|
.coverage-bar__fill {
|
|
232
234
|
height: 100%; border-radius: 3px;
|
|
233
|
-
background: var(--pass);
|
|
234
235
|
-webkit-print-color-adjust: exact;
|
|
235
236
|
print-color-adjust: exact;
|
|
236
237
|
}
|
|
238
|
+
.coverage-bar__fill--low { background: var(--fail); }
|
|
239
|
+
.coverage-bar__fill--mid { background: var(--timeout); }
|
|
240
|
+
.coverage-bar__fill--high { background: var(--pass); }
|
|
237
241
|
|
|
238
242
|
/* ── Environment table ───────────────────────────────────────────────────── */
|
|
239
243
|
.env-table {
|
|
@@ -254,160 +258,6 @@
|
|
|
254
258
|
font-size: 9.5px; color: var(--text-1);
|
|
255
259
|
}
|
|
256
260
|
|
|
257
|
-
/* ── History trend card ──────────────────────────────────────────────────── */
|
|
258
|
-
.trend-card {
|
|
259
|
-
background: var(--surface);
|
|
260
|
-
border: 1px solid var(--border-2);
|
|
261
|
-
border-radius: 6px;
|
|
262
|
-
padding: 16px 18px 14px;
|
|
263
|
-
margin-bottom: 24px;
|
|
264
|
-
page-break-inside: avoid;
|
|
265
|
-
}
|
|
266
|
-
.trend-card__header {
|
|
267
|
-
display: flex; align-items: center; justify-content: space-between;
|
|
268
|
-
margin-bottom: 14px;
|
|
269
|
-
}
|
|
270
|
-
.trend-card__title {
|
|
271
|
-
font-family: 'Inter', system-ui, sans-serif;
|
|
272
|
-
font-size: 9px; font-weight: 700;
|
|
273
|
-
letter-spacing: 1.2px; text-transform: uppercase;
|
|
274
|
-
color: var(--text-3);
|
|
275
|
-
}
|
|
276
|
-
.delta { font-size: 11px; font-weight: 700; }
|
|
277
|
-
.delta-up { color: var(--pass); }
|
|
278
|
-
.delta-down { color: var(--fail); }
|
|
279
|
-
|
|
280
|
-
/* ── Run history table (generated by JS) ─────────────────────────────────── */
|
|
281
|
-
.trend-run-history {
|
|
282
|
-
margin-top: 10px;
|
|
283
|
-
border-top: 1px solid var(--border);
|
|
284
|
-
padding-top: 8px;
|
|
285
|
-
}
|
|
286
|
-
.rh-item {
|
|
287
|
-
display: flex; align-items: center; gap: 12px;
|
|
288
|
-
padding: 5px 8px; border-radius: 4px;
|
|
289
|
-
font-size: 9px; font-family: 'Inter', system-ui, sans-serif;
|
|
290
|
-
}
|
|
291
|
-
.rh-item:nth-child(odd) {
|
|
292
|
-
background: var(--surface-2);
|
|
293
|
-
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
|
294
|
-
}
|
|
295
|
-
.rh-dot { flex-shrink: 0; }
|
|
296
|
-
.rh-date { color: var(--text-2); flex: 1; }
|
|
297
|
-
.rh-rate { font-weight: 700; min-width: 34px; color: var(--text-1); }
|
|
298
|
-
.rh-rate--pass { color: var(--pass); }
|
|
299
|
-
.rh-rate--fail { color: var(--fail); }
|
|
300
|
-
.rh-rate--partial { color: var(--flaky); }
|
|
301
|
-
.rh-tests { color: var(--text-3); min-width: 58px; }
|
|
302
|
-
.rh-dur { color: var(--text-3); }
|
|
303
|
-
|
|
304
|
-
/* ── Verdict dots (used in run history rh-dot) ───────────────────────────── */
|
|
305
|
-
.verdict-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
|
|
306
|
-
.verdict-passed { background: var(--pass); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
307
|
-
.verdict-partial { background: var(--flaky); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
308
|
-
.verdict-failed { background: var(--fail); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
309
|
-
.verdict-unknown { background: var(--skip); -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
310
|
-
|
|
311
|
-
/* ── Flakiness trend table (R8) ─────────────────────────────────────────── */
|
|
312
|
-
.flakiness-card {
|
|
313
|
-
margin: 24px 0 0;
|
|
314
|
-
border: 1px solid var(--border);
|
|
315
|
-
border-radius: 8px;
|
|
316
|
-
overflow: hidden;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
.flakiness-card__header {
|
|
320
|
-
display: flex;
|
|
321
|
-
align-items: center;
|
|
322
|
-
padding: 10px 16px;
|
|
323
|
-
background: var(--surface-2);
|
|
324
|
-
border-bottom: 1px solid var(--border);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
.flakiness-card__title {
|
|
328
|
-
font-size: 11px;
|
|
329
|
-
font-weight: 600;
|
|
330
|
-
text-transform: uppercase;
|
|
331
|
-
letter-spacing: 0.04em;
|
|
332
|
-
color: var(--text-3);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
.flakiness-table {
|
|
336
|
-
width: 100%;
|
|
337
|
-
border-collapse: collapse;
|
|
338
|
-
font-size: 11px;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
.flakiness-table thead th {
|
|
342
|
-
padding: 8px 12px;
|
|
343
|
-
text-align: left;
|
|
344
|
-
font-weight: 600;
|
|
345
|
-
font-size: 10px;
|
|
346
|
-
text-transform: uppercase;
|
|
347
|
-
letter-spacing: 0.04em;
|
|
348
|
-
color: var(--text-3);
|
|
349
|
-
border-bottom: 1px solid var(--border);
|
|
350
|
-
background: var(--surface-2);
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
.flakiness-table tbody tr {
|
|
354
|
-
border-bottom: 1px solid var(--border);
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
.flakiness-table tbody tr:last-child {
|
|
358
|
-
border-bottom: none;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
.flakiness-table tbody td {
|
|
362
|
-
padding: 8px 12px;
|
|
363
|
-
vertical-align: middle;
|
|
364
|
-
color: var(--text-1);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
.flakiness-table__test {
|
|
368
|
-
max-width: 300px;
|
|
369
|
-
overflow: hidden;
|
|
370
|
-
text-overflow: ellipsis;
|
|
371
|
-
white-space: nowrap;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
.flakiness-table__rate {
|
|
375
|
-
width: 72px;
|
|
376
|
-
font-weight: 600;
|
|
377
|
-
color: var(--flaky);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
.flakiness-table__count {
|
|
381
|
-
width: 72px;
|
|
382
|
-
color: var(--text-3);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
.flakiness-table__spark {
|
|
386
|
-
width: 140px;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
.flaky-spark {
|
|
390
|
-
display: flex;
|
|
391
|
-
gap: 3px;
|
|
392
|
-
align-items: center;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
.flaky-dot {
|
|
396
|
-
flex-shrink: 0;
|
|
397
|
-
width: 7px;
|
|
398
|
-
height: 7px;
|
|
399
|
-
border-radius: 50%;
|
|
400
|
-
background: var(--border, #e5e3d8);
|
|
401
|
-
print-color-adjust: exact;
|
|
402
|
-
-webkit-print-color-adjust: exact;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
.flaky-dot--hit {
|
|
406
|
-
background: #f59e0b;
|
|
407
|
-
print-color-adjust: exact;
|
|
408
|
-
-webkit-print-color-adjust: exact;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
261
|
/* ── Failure Analysis ───────────────────────────────────────────────────── */
|
|
412
262
|
/* NOTE: .analysis-oneliner lives in base.css — the executive template renders it too. */
|
|
413
263
|
.failure-analysis { margin-top: 24px; }
|
|
@@ -428,6 +278,3 @@
|
|
|
428
278
|
.cluster--env-config { border-color: oklch(55% 0.15 145); }
|
|
429
279
|
.cluster--unknown { border-color: oklch(60% 0.00 0); }
|
|
430
280
|
.confidence-warning { font-size: 0.8em; opacity: 0.75; }
|
|
431
|
-
|
|
432
|
-
</content>
|
|
433
|
-
</invoke>
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
|
|
118
118
|
/* ── KPI dashboard ─────────────────────────────────────────────────────── */
|
|
119
119
|
.kpi-strip {
|
|
120
|
-
display: grid; grid-template-columns: repeat(
|
|
120
|
+
display: grid; grid-template-columns: repeat(6, 1fr);
|
|
121
121
|
gap: 10px; margin-bottom: 22px;
|
|
122
122
|
}
|
|
123
123
|
.kpi-card {
|
|
@@ -134,6 +134,7 @@
|
|
|
134
134
|
.kpi-card--total::before { background: var(--accent); }
|
|
135
135
|
.kpi-card--pass::before { background: var(--pass); }
|
|
136
136
|
.kpi-card--fail::before { background: var(--fail); }
|
|
137
|
+
.kpi-card--timedout::before { background: var(--timeout); }
|
|
137
138
|
.kpi-card--skip::before { background: var(--skip); }
|
|
138
139
|
.kpi-card--flaky::before { background: var(--flaky); }
|
|
139
140
|
|
|
@@ -147,6 +148,7 @@
|
|
|
147
148
|
.kpi-card--total .kpi-card__value { color: var(--info); }
|
|
148
149
|
.kpi-card--pass .kpi-card__value { color: var(--pass); }
|
|
149
150
|
.kpi-card--fail .kpi-card__value { color: var(--fail); }
|
|
151
|
+
.kpi-card--timedout .kpi-card__value { color: var(--timeout); }
|
|
150
152
|
.kpi-card--skip .kpi-card__value { color: var(--skip); }
|
|
151
153
|
.kpi-card--flaky .kpi-card__value { color: var(--flaky); }
|
|
152
154
|
.kpi-card__label {
|
|
@@ -257,78 +259,3 @@
|
|
|
257
259
|
font-family: 'JetBrains Mono', monospace;
|
|
258
260
|
padding-left: 6px;
|
|
259
261
|
}
|
|
260
|
-
|
|
261
|
-
/* ── Environment grid ────────────────────────────────────────────────────── */
|
|
262
|
-
.env-grid {
|
|
263
|
-
display: grid; grid-template-columns: 1fr 1fr;
|
|
264
|
-
gap: 0;
|
|
265
|
-
background: var(--surface);
|
|
266
|
-
border: 1px solid var(--border-2);
|
|
267
|
-
border-radius: 6px;
|
|
268
|
-
overflow: hidden;
|
|
269
|
-
}
|
|
270
|
-
.env-item {
|
|
271
|
-
display: flex; gap: 12px; font-size: 10.5px; align-items: baseline;
|
|
272
|
-
padding: 10px 18px;
|
|
273
|
-
border-bottom: 1px solid var(--border);
|
|
274
|
-
border-right: 1px solid var(--border);
|
|
275
|
-
}
|
|
276
|
-
.env-item:nth-child(even) { border-right: none; }
|
|
277
|
-
.env-item:nth-last-child(-n+2) { border-bottom: none; }
|
|
278
|
-
.env-item__key {
|
|
279
|
-
font-family: 'Inter', system-ui, sans-serif; font-weight: 600;
|
|
280
|
-
font-size: 8.5px; letter-spacing: 1px; text-transform: uppercase;
|
|
281
|
-
color: var(--text-2); min-width: 80px;
|
|
282
|
-
}
|
|
283
|
-
.env-item__val {
|
|
284
|
-
font-family: 'JetBrains Mono', monospace;
|
|
285
|
-
font-size: 9.5px; color: var(--text-1);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/* ── Release gate ────────────────────────────────────────────────────────── */
|
|
289
|
-
.release-gate {
|
|
290
|
-
display: flex; align-items: center; gap: 16px;
|
|
291
|
-
padding: 16px 20px; border-radius: 6px; margin-bottom: 22px;
|
|
292
|
-
border: 1px solid;
|
|
293
|
-
position: relative; overflow: hidden;
|
|
294
|
-
-webkit-print-color-adjust: exact;
|
|
295
|
-
print-color-adjust: exact;
|
|
296
|
-
}
|
|
297
|
-
.release-gate--pass {
|
|
298
|
-
background: var(--pass-dim); border-color: #C5DBC9;
|
|
299
|
-
}
|
|
300
|
-
.release-gate--fail {
|
|
301
|
-
background: var(--fail-dim); border-color: #E5C9BD;
|
|
302
|
-
}
|
|
303
|
-
.release-gate__icon {
|
|
304
|
-
font-size: 22px; font-weight: 700; flex-shrink: 0; width: 32px;
|
|
305
|
-
text-align: center; line-height: 1;
|
|
306
|
-
}
|
|
307
|
-
.release-gate--pass .release-gate__icon { color: var(--pass); }
|
|
308
|
-
.release-gate--fail .release-gate__icon { color: var(--fail); }
|
|
309
|
-
.release-gate__body { flex: 1; }
|
|
310
|
-
.release-gate__label {
|
|
311
|
-
font-family: 'Inter', system-ui, sans-serif; font-size: 8px;
|
|
312
|
-
font-weight: 700; letter-spacing: 1.4px; text-transform: uppercase;
|
|
313
|
-
color: var(--text-3); margin-bottom: 4px;
|
|
314
|
-
}
|
|
315
|
-
.release-gate__verdict {
|
|
316
|
-
font-family: 'Source Serif Pro', Georgia, serif;
|
|
317
|
-
font-size: 18px; font-weight: 700; letter-spacing: -0.2px; line-height: 1.1;
|
|
318
|
-
}
|
|
319
|
-
.release-gate__verdict--pass { color: var(--pass); }
|
|
320
|
-
.release-gate__verdict--fail { color: var(--fail); }
|
|
321
|
-
.release-gate__detail {
|
|
322
|
-
font-family: 'Inter', system-ui, sans-serif; font-size: 10px;
|
|
323
|
-
color: var(--text-2); margin-top: 4px;
|
|
324
|
-
}
|
|
325
|
-
.release-gate__meta {
|
|
326
|
-
display: flex; flex-direction: column; gap: 3px; align-items: flex-end;
|
|
327
|
-
font-family: 'JetBrains Mono', monospace; font-size: 9px; color: var(--text-3);
|
|
328
|
-
flex-shrink: 0; text-align: right;
|
|
329
|
-
}
|
|
330
|
-
.release-gate__sep { color: var(--border-3); }
|
|
331
|
-
.release-gate__flaky-warn { color: var(--flaky); font-weight: 600; }
|
|
332
|
-
|
|
333
|
-
</content>
|
|
334
|
-
</invoke>
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
/* ── KPI strip ───────────────────────────────────────────────────────────── */
|
|
62
62
|
.kpi-strip {
|
|
63
63
|
display: grid;
|
|
64
|
-
grid-template-columns: repeat(
|
|
64
|
+
grid-template-columns: repeat(6, 1fr);
|
|
65
65
|
gap: 10px; margin-bottom: 22px;
|
|
66
66
|
}
|
|
67
67
|
.kpi-card {
|
|
@@ -79,6 +79,7 @@
|
|
|
79
79
|
.kpi-card--total::before { background: var(--accent); }
|
|
80
80
|
.kpi-card--pass::before { background: var(--pass); }
|
|
81
81
|
.kpi-card--fail::before { background: var(--fail); }
|
|
82
|
+
.kpi-card--timedout::before { background: var(--timeout); }
|
|
82
83
|
.kpi-card--skip::before { background: var(--skip); }
|
|
83
84
|
.kpi-card--flaky::before { background: var(--flaky); }
|
|
84
85
|
|
|
@@ -92,6 +93,7 @@
|
|
|
92
93
|
.kpi-card--total .kpi-card__value { color: var(--info); }
|
|
93
94
|
.kpi-card--pass .kpi-card__value { color: var(--pass); }
|
|
94
95
|
.kpi-card--fail .kpi-card__value { color: var(--fail); }
|
|
96
|
+
.kpi-card--timedout .kpi-card__value { color: var(--timeout); }
|
|
95
97
|
.kpi-card--skip .kpi-card__value { color: var(--skip); }
|
|
96
98
|
.kpi-card--flaky .kpi-card__value { color: var(--flaky); }
|
|
97
99
|
|
|
@@ -204,5 +206,3 @@
|
|
|
204
206
|
}
|
|
205
207
|
.retry-attempt--failed { background: var(--fail-dim); color: var(--fail); border: 1px solid #E5C9BD; }
|
|
206
208
|
.retry-attempt--passed { background: var(--pass-dim); color: var(--pass); border: 1px solid #C5DBC9; }
|
|
207
|
-
</content>
|
|
208
|
-
</invoke>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reportforge/playwright-pdf",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Enterprise-ready PDF reports for Playwright Test — minimal, detailed, and executive templates with CI/CD integrations",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "ReportForge",
|