@reportforge/playwright-pdf 0.5.1 → 0.6.1

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.
@@ -2,9 +2,9 @@
2
2
 
3
3
  {{> watermark}}
4
4
 
5
- {{> cover-page}}
5
+ {{#if sections.coverPage}}{{> cover-page}}{{/if}}
6
6
 
7
- {{> analysis-oneliner}}
7
+ {{#if sections.analysisOneliner}}{{> analysis-oneliner}}{{/if}}
8
8
 
9
9
  <div class="report-header">
10
10
  <div class="report-header__left">
@@ -16,17 +16,25 @@
16
16
  <div class="report-header__date">{{formatDate meta.generatedAt}}</div>
17
17
  </div>
18
18
 
19
- {{> release-gate}}
19
+ {{#if sections.releaseGate}}{{> release-gate}}{{/if}}
20
20
 
21
- {{> executive-summary options=(obj showPassRate=true) }}
21
+ {{#if sections.summary}}{{> executive-summary options=(obj showPassRate=sections.passRate) }}{{/if}}
22
22
 
23
- {{> charts options=(obj showCharts=true showTrend=options.showTrend) }}
23
+ {{#if sections.charts}}{{> charts options=(obj showCharts=true showTrend=sections.trend) }}{{/if}}
24
24
 
25
- {{> slow-tests limit=5 showProject=false}}
25
+ {{#if sections.requirementsMatrix}}{{> requirements-matrix }}{{/if}}
26
26
 
27
- {{> failure-deep-dive options=(obj showFullFailures=false showStackTraces=false) }}
27
+ {{#if sections.slowTests}}{{> slow-tests limit=5 showProject=false}}{{/if}}
28
28
 
29
- {{> ci-environment options=(obj showFullEnvironment=false) }}
29
+ {{#if sections.failureDeepDive}}{{> failure-deep-dive options=(obj showFullFailures=sections.fullFailures showStackTraces=sections.stackTraces) }}{{/if}}
30
+
31
+ {{#if sections.failureAnalysis}}{{> failure-analysis}}{{/if}}
32
+
33
+ {{#if sections.defectLog}}{{> defect-log }}{{/if}}
34
+
35
+ {{#if sections.ciEnvironment}}{{> ci-environment options=(obj showFullEnvironment=sections.fullEnvironment) }}{{/if}}
36
+
37
+ {{#if sections.suiteBreakdown}}{{> suite-breakdown options=(obj showRetries=sections.retries) }}{{/if}}
30
38
 
31
39
  <div class="report-footer">
32
40
  <span>{{meta.projectName}} &nbsp;·&nbsp; Playwright Test Report</span>
@@ -2,6 +2,8 @@
2
2
 
3
3
  {{> watermark}}
4
4
 
5
+ {{#if sections.coverPage}}{{> cover-page}}{{/if}}
6
+
5
7
  <div class="report-header">
6
8
  {{#if meta.branding.logoBase64}}
7
9
  <img class="report-header__logo" src="{{meta.branding.logoBase64}}" alt="Logo">
@@ -12,15 +14,27 @@
12
14
  </div>
13
15
  </div>
14
16
 
15
- {{> release-gate}}
17
+ {{#if sections.analysisOneliner}}{{> analysis-oneliner}}{{/if}}
18
+
19
+ {{#if sections.releaseGate}}{{> release-gate}}{{/if}}
20
+
21
+ {{#if sections.summary}}{{> executive-summary options=(obj showPassRate=sections.passRate) }}{{/if}}
22
+
23
+ {{#if sections.charts}}{{> charts options=(obj showCharts=true showTrend=sections.trend) }}{{/if}}
24
+
25
+ {{#if sections.requirementsMatrix}}{{> requirements-matrix }}{{/if}}
26
+
27
+ {{#if sections.suiteBreakdown}}{{> suite-breakdown options=(obj showRetries=sections.retries) }}{{/if}}
28
+
29
+ {{#if sections.failureDeepDive}}{{> failure-deep-dive options=(obj showFullFailures=sections.fullFailures showStackTraces=sections.stackTraces) }}{{/if}}
16
30
 
17
- {{> executive-summary options=(obj showPassRate=true showCharts=false) }}
31
+ {{#if sections.failureAnalysis}}{{> failure-analysis}}{{/if}}
18
32
 
19
- {{> suite-breakdown options=(obj showRetries=true) }}
33
+ {{#if sections.slowTests}}{{> slow-tests limit=10 showProject=true}}{{/if}}
20
34
 
21
- {{> failure-deep-dive options=(obj showFullFailures=true showStackTraces=true) }}
35
+ {{#if sections.defectLog}}{{> defect-log }}{{/if}}
22
36
 
23
- {{> ci-environment options=(obj showFullEnvironment=false) }}
37
+ {{#if sections.ciEnvironment}}{{> ci-environment options=(obj showFullEnvironment=sections.fullEnvironment) }}{{/if}}
24
38
 
25
39
  <div class="report-footer">
26
40
  <span>Generated by ReportForge</span>
@@ -157,7 +157,7 @@ tr:last-child td { border-bottom: none; }
157
157
  blocks below stay glued together, and headings stick to the content beneath. */
158
158
  .section { margin-bottom: 24px; }
159
159
  .kpi-strip, .summary-row, .charts-grid, .release-gate, .flaky-callout,
160
- .trend-card, .flakiness-card, .cover-page__stats-strip, .env-grid {
160
+ .trend-card, .flakiness-card, .env-grid {
161
161
  page-break-inside: avoid; break-inside: avoid;
162
162
  }
163
163
  h2, h3 { page-break-after: avoid; break-after: avoid; }
@@ -447,6 +447,25 @@ code {
447
447
  -webkit-print-color-adjust: exact;
448
448
  }
449
449
 
450
+ /* These section styles ship to every template so any section can be toggled in styled; ~a few KB of unused CSS in templates where the section is off is an accepted cost. */
451
+
452
+ /* Charts grid + cards (available to any template via sections.charts) */
453
+ .charts-grid {
454
+ display: grid; grid-template-columns: 210px 1fr;
455
+ gap: 12px; margin-bottom: 24px;
456
+ }
457
+ .chart-card {
458
+ background: var(--surface);
459
+ border: 1px solid var(--border-2);
460
+ border-radius: 6px; padding: 16px 14px; text-align: center;
461
+ }
462
+ .chart-card h3 {
463
+ margin: 0 0 12px;
464
+ font-family: 'Inter', system-ui, sans-serif; font-size: 9px;
465
+ font-weight: 600; letter-spacing: 1.2px; text-transform: uppercase;
466
+ color: var(--text-3);
467
+ }
468
+
450
469
  /* ── Environment grid — compact ci-environment, shared by minimal + executive ─ */
451
470
  .env-grid {
452
471
  display: grid; grid-template-columns: 1fr 1fr;
@@ -473,3 +492,181 @@ code {
473
492
  font-family: 'JetBrains Mono', monospace;
474
493
  font-size: 9.5px; color: var(--text-1);
475
494
  }
495
+
496
+ /* Cover page (executive default; available to any template via sections.coverPage) */
497
+ .cover-page {
498
+ min-height: 100vh;
499
+ display: flex; flex-direction: column;
500
+ justify-content: center; align-items: center; text-align: center;
501
+ background: var(--bg);
502
+ padding: 60px 50px;
503
+ page-break-after: always;
504
+ position: relative;
505
+ }
506
+ .cover-page__logo {
507
+ height: 64px; width: auto; margin-bottom: 44px;
508
+ }
509
+ .cover-page__title {
510
+ font-family: 'Source Serif Pro', Georgia, serif;
511
+ font-size: 42px; font-weight: 700;
512
+ letter-spacing: -0.6px; color: var(--text-1);
513
+ margin-bottom: 12px; line-height: 1.1;
514
+ }
515
+ .cover-page__subtitle {
516
+ font-family: 'Inter', system-ui, sans-serif;
517
+ font-size: 12px; color: var(--text-2);
518
+ margin-bottom: 36px; font-weight: 500;
519
+ letter-spacing: 1.6px; text-transform: uppercase;
520
+ }
521
+ .cover-page__verdict {
522
+ display: inline-block;
523
+ padding: 10px 30px; border-radius: 6px;
524
+ font-family: 'Inter', system-ui, sans-serif; font-size: 13px;
525
+ font-weight: 600; letter-spacing: 1.4px;
526
+ text-transform: uppercase; margin-bottom: 40px;
527
+ -webkit-print-color-adjust: exact;
528
+ print-color-adjust: exact;
529
+ }
530
+ .cover-page__verdict--passed {
531
+ background: var(--pass-dim); color: var(--pass);
532
+ border: 1px solid #C5DBC9;
533
+ }
534
+ .cover-page__verdict--failed {
535
+ background: var(--fail-dim); color: var(--fail);
536
+ border: 1px solid #E5C9BD;
537
+ }
538
+ .cover-page__verdict--timedout {
539
+ background: var(--timeout-dim); color: var(--timeout);
540
+ border: 1px solid #E5D2A8;
541
+ }
542
+ .cover-page__verdict--interrupted {
543
+ background: var(--surface-2); color: var(--text-2);
544
+ border: 1px solid var(--border-2);
545
+ }
546
+ .cover-page__stats-strip {
547
+ display: flex; gap: 0;
548
+ border: 1px solid var(--border-2); border-radius: 6px;
549
+ overflow: hidden; margin-bottom: 36px;
550
+ background: var(--surface);
551
+ page-break-inside: avoid; break-inside: avoid;
552
+ }
553
+ .cover-page__stat {
554
+ padding: 16px 26px; text-align: center;
555
+ border-right: 1px solid var(--border);
556
+ }
557
+ .cover-page__stat:last-child { border-right: none; }
558
+ .cover-page__stat-val {
559
+ font-family: 'Source Serif Pro', Georgia, serif; font-size: 26px;
560
+ font-weight: 700; color: var(--text-1);
561
+ letter-spacing: -0.4px;
562
+ }
563
+ .cover-page__stat-lbl {
564
+ font-family: 'Inter', system-ui, sans-serif; font-size: 8px;
565
+ font-weight: 600; letter-spacing: 1.3px;
566
+ text-transform: uppercase; color: var(--text-3);
567
+ margin-top: 6px;
568
+ }
569
+ .cover-page__meta {
570
+ font-family: 'Inter', system-ui, sans-serif;
571
+ font-size: 11px; color: var(--text-2);
572
+ line-height: 1.9; letter-spacing: 0.2px;
573
+ }
574
+ .cover-page__divider {
575
+ width: 64px; height: 2px;
576
+ background: var(--accent);
577
+ border-radius: 1px;
578
+ margin: 24px auto 28px;
579
+ -webkit-print-color-adjust: exact;
580
+ print-color-adjust: exact;
581
+ }
582
+
583
+ /* ── Suite breakdown — shared so any template (incl. executive) can toggle it on ─ */
584
+ /* Values match the detailed template; minimal.css keeps its own tuned overrides
585
+ for .suite-group (margin) and .suite-stats (gap), which win via templateCSS order. */
586
+ .suite-group {
587
+ background: var(--surface);
588
+ border: 1px solid var(--border-2);
589
+ border-radius: 6px; margin-bottom: 10px; overflow: hidden;
590
+ }
591
+ .suite-group__header {
592
+ padding: 10px 14px;
593
+ background: var(--surface-2);
594
+ border-bottom: 1px solid var(--border);
595
+ border-left: 3px solid var(--primary, #CC785C);
596
+ display: flex; justify-content: space-between; align-items: center;
597
+ }
598
+ .suite-title {
599
+ font-family: 'Inter', system-ui, sans-serif;
600
+ font-size: 11px; font-weight: 600; color: var(--text-1);
601
+ letter-spacing: 0.1px;
602
+ }
603
+ .suite-stats { display: flex; gap: 5px; }
604
+ .test-path {
605
+ font-family: 'JetBrains Mono', monospace;
606
+ font-size: 8.5px; color: var(--text-3); margin-top: 2px;
607
+ }
608
+
609
+ /* ── Defect log — shared so any template can toggle the defect-log section on ── */
610
+ .defect-id {
611
+ font-family: 'JetBrains Mono', monospace;
612
+ font-size: 9px; color: var(--accent);
613
+ background: var(--accent-soft);
614
+ padding: 2px 7px; border-radius: 3px;
615
+ border: 1px solid #E8C9BC;
616
+ font-weight: 500;
617
+ }
618
+
619
+ /* ── Coverage bar — shared so any template can toggle requirements-matrix on ── */
620
+ .coverage-bar {
621
+ height: 6px; border-radius: 3px;
622
+ background: var(--surface-3); overflow: hidden;
623
+ border: 1px solid var(--border);
624
+ }
625
+ .coverage-bar__fill {
626
+ height: 100%; border-radius: 3px;
627
+ -webkit-print-color-adjust: exact;
628
+ print-color-adjust: exact;
629
+ }
630
+ .coverage-bar__fill--low { background: var(--fail); }
631
+ .coverage-bar__fill--mid { background: var(--timeout); }
632
+ .coverage-bar__fill--high { background: var(--pass); }
633
+
634
+ /* ── Environment table — full ci-environment mode (fullEnvironment), shared ─── */
635
+ .env-table {
636
+ background: var(--surface);
637
+ border: 1px solid var(--border-2);
638
+ border-radius: 6px;
639
+ overflow: hidden;
640
+ }
641
+ .env-table td:first-child {
642
+ font-family: 'Inter', system-ui, sans-serif; font-weight: 600;
643
+ font-size: 9px; letter-spacing: 0.8px; text-transform: uppercase;
644
+ color: var(--text-2); width: 170px; white-space: nowrap;
645
+ background: var(--surface-2);
646
+ border-right: 1px solid var(--border);
647
+ }
648
+ .env-value {
649
+ font-family: 'JetBrains Mono', monospace;
650
+ font-size: 9.5px; color: var(--text-1);
651
+ }
652
+
653
+ /* ── Failure Analysis — shared so any template can toggle the section on ────── */
654
+ /* NOTE: .analysis-oneliner lives in base.css above — the executive template renders it too. */
655
+ .failure-analysis { margin-top: 24px; }
656
+ .failure-analysis .oneliner { font-weight: 600; }
657
+ .analysis-truncated { font-size: 0.85em; opacity: 0.8; }
658
+
659
+ .cluster { border-left: 3px solid; padding-left: 12px; margin-bottom: 16px; }
660
+ .cluster-header { display: flex; gap: 12px; align-items: baseline; }
661
+ .cluster-strength--strong { color: oklch(55% 0.15 145); }
662
+ .cluster-strength--moderate { color: oklch(60% 0.18 65); }
663
+ .cluster-strength--weak { color: oklch(55% 0.20 25); }
664
+ .cluster--timeout { border-color: oklch(60% 0.18 65); }
665
+ .cluster--assertion { border-color: oklch(55% 0.20 25); }
666
+ .cluster--locator-not-found { border-color: oklch(55% 0.20 25); }
667
+ .cluster--network { border-color: oklch(55% 0.15 260); }
668
+ .cluster--navigation { border-color: oklch(55% 0.15 260); }
669
+ .cluster--flaky-by-retry { border-color: oklch(55% 0.15 290); }
670
+ .cluster--env-config { border-color: oklch(55% 0.15 145); }
671
+ .cluster--unknown { border-color: oklch(60% 0.00 0); }
672
+ .confidence-warning { font-size: 0.8em; opacity: 0.75; }
@@ -128,46 +128,7 @@
128
128
  margin-top: 4px; font-size: 12px;
129
129
  }
130
130
 
131
- /* ── Charts ─────────────────────────────────────────────────────────────── */
132
- .charts-grid {
133
- display: grid; grid-template-columns: 210px 1fr;
134
- gap: 12px; margin-bottom: 24px;
135
- }
136
- .chart-card {
137
- background: var(--surface);
138
- border: 1px solid var(--border-2);
139
- border-radius: 6px; padding: 16px 14px; text-align: center;
140
- }
141
- .chart-card h3 {
142
- margin: 0 0 12px;
143
- font-family: 'Inter', system-ui, sans-serif; font-size: 9px;
144
- font-weight: 600; letter-spacing: 1.2px; text-transform: uppercase;
145
- color: var(--text-3);
146
- }
147
-
148
- /* ── Suite breakdown ────────────────────────────────────────────────────── */
149
- .suite-group {
150
- background: var(--surface);
151
- border: 1px solid var(--border-2);
152
- border-radius: 6px; margin-bottom: 10px; overflow: hidden;
153
- }
154
- .suite-group__header {
155
- padding: 10px 14px;
156
- background: var(--surface-2);
157
- border-bottom: 1px solid var(--border);
158
- border-left: 3px solid var(--primary, #CC785C);
159
- display: flex; justify-content: space-between; align-items: center;
160
- }
161
- .suite-title {
162
- font-family: 'Inter', system-ui, sans-serif;
163
- font-size: 11px; font-weight: 600; color: var(--text-1);
164
- letter-spacing: 0.1px;
165
- }
166
- .suite-stats { display: flex; gap: 5px; }
167
- .test-path {
168
- font-family: 'JetBrains Mono', monospace;
169
- font-size: 8.5px; color: var(--text-3); margin-top: 2px;
170
- }
131
+ /* ── Suite breakdown · styles live in base.css (shared across templates) ──── */
171
132
 
172
133
  /* ── Failure item ────────────────────────────────────────────────────────── */
173
134
  .failure-item {
@@ -214,67 +175,5 @@
214
175
  .retry-attempt--failed { background: var(--fail-dim); color: var(--fail); border: 1px solid #E5C9BD; }
215
176
  .retry-attempt--passed { background: var(--pass-dim); color: var(--pass); border: 1px solid #C5DBC9; }
216
177
 
217
- /* ── Defect log ─────────────────────────────────────────────────────────── */
218
- .defect-id {
219
- font-family: 'JetBrains Mono', monospace;
220
- font-size: 9px; color: var(--accent);
221
- background: var(--accent-soft);
222
- padding: 2px 7px; border-radius: 3px;
223
- border: 1px solid #E8C9BC;
224
- font-weight: 500;
225
- }
226
-
227
- /* ── Coverage bar ────────────────────────────────────────────────────────── */
228
- .coverage-bar {
229
- height: 6px; border-radius: 3px;
230
- background: var(--surface-3); overflow: hidden;
231
- border: 1px solid var(--border);
232
- }
233
- .coverage-bar__fill {
234
- height: 100%; border-radius: 3px;
235
- -webkit-print-color-adjust: exact;
236
- print-color-adjust: exact;
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); }
241
-
242
- /* ── Environment table ───────────────────────────────────────────────────── */
243
- .env-table {
244
- background: var(--surface);
245
- border: 1px solid var(--border-2);
246
- border-radius: 6px;
247
- overflow: hidden;
248
- }
249
- .env-table td:first-child {
250
- font-family: 'Inter', system-ui, sans-serif; font-weight: 600;
251
- font-size: 9px; letter-spacing: 0.8px; text-transform: uppercase;
252
- color: var(--text-2); width: 170px; white-space: nowrap;
253
- background: var(--surface-2);
254
- border-right: 1px solid var(--border);
255
- }
256
- .env-value {
257
- font-family: 'JetBrains Mono', monospace;
258
- font-size: 9.5px; color: var(--text-1);
259
- }
260
-
261
- /* ── Failure Analysis ───────────────────────────────────────────────────── */
262
- /* NOTE: .analysis-oneliner lives in base.css — the executive template renders it too. */
263
- .failure-analysis { margin-top: 24px; }
264
- .failure-analysis .oneliner { font-weight: 600; }
265
- .analysis-truncated { font-size: 0.85em; opacity: 0.8; }
266
-
267
- .cluster { border-left: 3px solid; padding-left: 12px; margin-bottom: 16px; }
268
- .cluster-header { display: flex; gap: 12px; align-items: baseline; }
269
- .cluster-strength--strong { color: oklch(55% 0.15 145); }
270
- .cluster-strength--moderate { color: oklch(60% 0.18 65); }
271
- .cluster-strength--weak { color: oklch(55% 0.20 25); }
272
- .cluster--timeout { border-color: oklch(60% 0.18 65); }
273
- .cluster--assertion { border-color: oklch(55% 0.20 25); }
274
- .cluster--locator-not-found { border-color: oklch(55% 0.20 25); }
275
- .cluster--network { border-color: oklch(55% 0.15 260); }
276
- .cluster--navigation { border-color: oklch(55% 0.15 260); }
277
- .cluster--flaky-by-retry { border-color: oklch(55% 0.15 290); }
278
- .cluster--env-config { border-color: oklch(55% 0.15 145); }
279
- .cluster--unknown { border-color: oklch(60% 0.00 0); }
280
- .confidence-warning { font-size: 0.8em; opacity: 0.75; }
178
+ /* ── Defect log, coverage bar, environment table, failure analysis ───────── */
179
+ /* All moved to base.css so executive/minimal can toggle these sections on too. */
@@ -1,92 +1,5 @@
1
1
  /* ── Executive Template · Claude Design Language ────────────────────────── */
2
2
 
3
- /* ── Cover page ─────────────────────────────────────────────────────────── */
4
- .cover-page {
5
- min-height: 100vh;
6
- display: flex; flex-direction: column;
7
- justify-content: center; align-items: center; text-align: center;
8
- background: var(--bg);
9
- padding: 60px 50px;
10
- page-break-after: always;
11
- position: relative;
12
- }
13
- .cover-page__logo {
14
- height: 64px; width: auto; margin-bottom: 44px;
15
- }
16
- .cover-page__title {
17
- font-family: 'Source Serif Pro', Georgia, serif;
18
- font-size: 42px; font-weight: 700;
19
- letter-spacing: -0.6px; color: var(--text-1);
20
- margin-bottom: 12px; line-height: 1.1;
21
- }
22
- .cover-page__subtitle {
23
- font-family: 'Inter', system-ui, sans-serif;
24
- font-size: 12px; color: var(--text-2);
25
- margin-bottom: 36px; font-weight: 500;
26
- letter-spacing: 1.6px; text-transform: uppercase;
27
- }
28
- .cover-page__verdict {
29
- display: inline-block;
30
- padding: 10px 30px; border-radius: 6px;
31
- font-family: 'Inter', system-ui, sans-serif; font-size: 13px;
32
- font-weight: 600; letter-spacing: 1.4px;
33
- text-transform: uppercase; margin-bottom: 40px;
34
- -webkit-print-color-adjust: exact;
35
- print-color-adjust: exact;
36
- }
37
- .cover-page__verdict--passed {
38
- background: var(--pass-dim); color: var(--pass);
39
- border: 1px solid #C5DBC9;
40
- }
41
- .cover-page__verdict--failed {
42
- background: var(--fail-dim); color: var(--fail);
43
- border: 1px solid #E5C9BD;
44
- }
45
- .cover-page__verdict--timedout {
46
- background: var(--timeout-dim); color: var(--timeout);
47
- border: 1px solid #E5D2A8;
48
- }
49
- .cover-page__verdict--interrupted {
50
- background: var(--surface-2); color: var(--text-2);
51
- border: 1px solid var(--border-2);
52
- }
53
-
54
- .cover-page__stats-strip {
55
- display: flex; gap: 0;
56
- border: 1px solid var(--border-2); border-radius: 6px;
57
- overflow: hidden; margin-bottom: 36px;
58
- background: var(--surface);
59
- }
60
- .cover-page__stat {
61
- padding: 16px 26px; text-align: center;
62
- border-right: 1px solid var(--border);
63
- }
64
- .cover-page__stat:last-child { border-right: none; }
65
- .cover-page__stat-val {
66
- font-family: 'Source Serif Pro', Georgia, serif; font-size: 26px;
67
- font-weight: 700; color: var(--text-1);
68
- letter-spacing: -0.4px;
69
- }
70
- .cover-page__stat-lbl {
71
- font-family: 'Inter', system-ui, sans-serif; font-size: 8px;
72
- font-weight: 600; letter-spacing: 1.3px;
73
- text-transform: uppercase; color: var(--text-3);
74
- margin-top: 6px;
75
- }
76
- .cover-page__meta {
77
- font-family: 'Inter', system-ui, sans-serif;
78
- font-size: 11px; color: var(--text-2);
79
- line-height: 1.9; letter-spacing: 0.2px;
80
- }
81
- .cover-page__divider {
82
- width: 64px; height: 2px;
83
- background: var(--accent);
84
- border-radius: 1px;
85
- margin: 24px auto 28px;
86
- -webkit-print-color-adjust: exact;
87
- print-color-adjust: exact;
88
- }
89
-
90
3
  /* ── Header bar ─────────────────────────────────────────────────────────── */
91
4
  .report-header {
92
5
  background: var(--surface);
@@ -210,21 +123,13 @@
210
123
  }
211
124
  .summary-row__value { font-weight: 600; color: var(--text-1); margin-top: 4px; font-size: 12px; }
212
125
 
213
- /* ── Charts ─────────────────────────────────────────────────────────────── */
126
+ /* Chart grid/card overrides — executive tightens the layout vs the base defaults */
214
127
  .charts-grid {
215
- display: grid; grid-template-columns: 218px 1fr;
216
- gap: 12px; margin-bottom: 22px;
217
- }
218
- .chart-card {
219
- background: var(--surface);
220
- border: 1px solid var(--border-2);
221
- border-radius: 6px; padding: 16px 14px; text-align: center;
128
+ grid-template-columns: 218px 1fr;
129
+ margin-bottom: 22px;
222
130
  }
223
131
  .chart-card h3 {
224
- margin: 0 0 12px;
225
- font-family: 'Inter', system-ui, sans-serif; font-size: 9px;
226
- font-weight: 600; letter-spacing: 1.3px; text-transform: uppercase;
227
- color: var(--text-3);
132
+ letter-spacing: 1.3px;
228
133
  }
229
134
 
230
135
  /* ── Executive failure summary ───────────────────────────────────────────── */
@@ -136,29 +136,12 @@
136
136
  }
137
137
 
138
138
  /* ── Suite breakdown ────────────────────────────────────────────────────── */
139
+ /* Shared styles live in base.css. Minimal keeps only its tuned overrides below
140
+ (tighter margin + wider stats gap); the rest is inherited from base. */
139
141
  .suite-group {
140
- background: var(--surface);
141
- border: 1px solid var(--border-2);
142
- border-radius: 6px; margin-bottom: 12px; overflow: hidden;
143
- }
144
- .suite-group__header {
145
- padding: 10px 14px;
146
- background: var(--surface-2);
147
- border-bottom: 1px solid var(--border);
148
- border-left: 3px solid var(--primary, #CC785C);
149
- display: flex; justify-content: space-between; align-items: center;
150
- }
151
- .suite-title {
152
- font-family: 'Inter', system-ui, sans-serif;
153
- font-size: 11px; font-weight: 600;
154
- color: var(--text-1);
155
- letter-spacing: 0.1px;
156
- }
157
- .suite-stats { display: flex; gap: 6px; }
158
- .test-path {
159
- font-family: 'JetBrains Mono', monospace;
160
- font-size: 8.5px; color: var(--text-3); margin-top: 2px;
142
+ margin-bottom: 12px;
161
143
  }
144
+ .suite-stats { gap: 6px; }
162
145
 
163
146
  /* ── Failure item ────────────────────────────────────────────────────────── */
164
147
  .failure-item {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reportforge/playwright-pdf",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
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",