@testivai/witness 1.7.1 → 1.9.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/dist/baselines/index.d.ts +1 -1
- package/dist/baselines/index.d.ts.map +1 -1
- package/dist/baselines/index.js +2 -1
- package/dist/baselines/index.js.map +1 -1
- package/dist/baselines/store.d.ts +15 -1
- package/dist/baselines/store.d.ts.map +1 -1
- package/dist/baselines/store.js +35 -2
- package/dist/baselines/store.js.map +1 -1
- package/dist/commands/exit-codes.d.ts +16 -5
- package/dist/commands/exit-codes.d.ts.map +1 -1
- package/dist/commands/exit-codes.js +6 -5
- package/dist/commands/exit-codes.js.map +1 -1
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +74 -2
- package/dist/commands/report.js.map +1 -1
- package/dist/config/local-config.d.ts +25 -0
- package/dist/config/local-config.d.ts.map +1 -1
- package/dist/config/local-config.js +1 -0
- package/dist/config/local-config.js.map +1 -1
- package/dist/diff/dom-diff.d.ts +14 -2
- package/dist/diff/dom-diff.d.ts.map +1 -1
- package/dist/diff/dom-diff.js +22 -19
- package/dist/diff/dom-diff.js.map +1 -1
- package/dist/report/compare.d.ts +6 -0
- package/dist/report/compare.d.ts.map +1 -1
- package/dist/report/compare.js +11 -4
- package/dist/report/compare.js.map +1 -1
- package/dist/report/generator.d.ts +27 -4
- package/dist/report/generator.d.ts.map +1 -1
- package/dist/report/generator.js +65 -6
- package/dist/report/generator.js.map +1 -1
- package/dist/report/results.d.ts +14 -0
- package/dist/report/results.d.ts.map +1 -1
- package/dist/report/template.d.ts +6 -4
- package/dist/report/template.d.ts.map +1 -1
- package/dist/report/template.js +264 -85
- package/dist/report/template.js.map +1 -1
- package/package.json +1 -1
package/dist/report/template.js
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* TestivAI Report — HTML Template
|
|
4
4
|
*
|
|
5
|
-
* Single-file HTML with inlined CSS/JS.
|
|
6
|
-
*
|
|
7
|
-
* Changed → New → Passed sections,
|
|
8
|
-
*
|
|
5
|
+
* Single-file HTML with inlined CSS/JS. Light theme by default with a
|
|
6
|
+
* persisted dark-mode toggle (CSS custom properties). Sidebar + summary
|
|
7
|
+
* cards, Changed → New → Passed sections, a per-snapshot "Layered analysis"
|
|
8
|
+
* panel (verdict + DOM/style signal + attributed regions + page-shift +
|
|
9
|
+
* masks — the same evidence agents get via @testivai/mcp explain_snapshot),
|
|
10
|
+
* 3-column diff view, approve command copy button, image zoom overlay.
|
|
9
11
|
*/
|
|
10
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
13
|
exports.renderHtml = renderHtml;
|
|
@@ -17,6 +19,7 @@ function renderHtml(data) {
|
|
|
17
19
|
const changed = snapshots.filter((s) => s.status === 'changed');
|
|
18
20
|
const newSnapshots = snapshots.filter((s) => s.status === 'new');
|
|
19
21
|
const passed = snapshots.filter((s) => s.status === 'passed');
|
|
22
|
+
const missing = data.missingBaselines ?? [];
|
|
20
23
|
return `<!DOCTYPE html>
|
|
21
24
|
<html lang="en">
|
|
22
25
|
<head>
|
|
@@ -24,62 +27,128 @@ function renderHtml(data) {
|
|
|
24
27
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
25
28
|
<title>TestivAI Visual Report</title>
|
|
26
29
|
<style>
|
|
30
|
+
/* ── Theme tokens ─────────────────────────────────────────────────────
|
|
31
|
+
Light is the default (no attribute); html[data-theme="dark"] overrides.
|
|
32
|
+
The toggle persists to localStorage("testivai-theme"). */
|
|
33
|
+
:root {
|
|
34
|
+
--bg: #f6f8fa;
|
|
35
|
+
--surface: #ffffff;
|
|
36
|
+
--surface-2: #eef1f4;
|
|
37
|
+
--border: #d0d7de;
|
|
38
|
+
--border-soft: #e4e8ec;
|
|
39
|
+
--text: #1f2328;
|
|
40
|
+
--text-muted: #59636e;
|
|
41
|
+
--accent: #0e7490;
|
|
42
|
+
--accent-contrast: #ffffff;
|
|
43
|
+
--link: #0969da;
|
|
44
|
+
--changed: #cf222e; --changed-bg: #cf222e14;
|
|
45
|
+
--new: #bc4c00; --new-bg: #bc4c0014;
|
|
46
|
+
--passed: #1a7f37; --passed-bg: #1a7f3714;
|
|
47
|
+
--info: #0969da; --info-bg: #0969da12;
|
|
48
|
+
--code-bg: #eff2f5;
|
|
49
|
+
--shadow: 0 1px 3px rgba(31,35,40,0.06), 0 8px 24px rgba(31,35,40,0.04);
|
|
50
|
+
--sidebar-bg: #ffffff;
|
|
51
|
+
--hatch-a: #eef1f4; --hatch-b: #e4e8ec;
|
|
52
|
+
}
|
|
53
|
+
html[data-theme="dark"] {
|
|
54
|
+
--bg: #0d1117;
|
|
55
|
+
--surface: #161b22;
|
|
56
|
+
--surface-2: #1c2129;
|
|
57
|
+
--border: #30363d;
|
|
58
|
+
--border-soft: #21262d;
|
|
59
|
+
--text: #e6edf3;
|
|
60
|
+
--text-muted: #8b949e;
|
|
61
|
+
--accent: #00d4ff;
|
|
62
|
+
--accent-contrast: #08111f;
|
|
63
|
+
--link: #58a6ff;
|
|
64
|
+
--changed: #f85149; --changed-bg: #f8514922;
|
|
65
|
+
--new: #f0883e; --new-bg: #f0883e22;
|
|
66
|
+
--passed: #3fb950; --passed-bg: #3fb95022;
|
|
67
|
+
--info: #79c0ff; --info-bg: #1f6feb1a;
|
|
68
|
+
--code-bg: #0d1117;
|
|
69
|
+
--shadow: none;
|
|
70
|
+
--sidebar-bg: #08111f;
|
|
71
|
+
--hatch-a: #161b22; --hatch-b: #1c2129;
|
|
72
|
+
}
|
|
73
|
+
|
|
27
74
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
28
|
-
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background:
|
|
75
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); display: flex; min-height: 100vh; }
|
|
76
|
+
code, .mono { font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace; }
|
|
29
77
|
|
|
30
78
|
/* Sidebar */
|
|
31
|
-
.sidebar { width:
|
|
32
|
-
.
|
|
33
|
-
.sidebar
|
|
34
|
-
.
|
|
79
|
+
.sidebar { width: 264px; background: var(--sidebar-bg); padding: 24px 16px; flex-shrink: 0; border-right: 1px solid var(--border-soft); position: fixed; height: 100vh; overflow-y: auto; display: flex; flex-direction: column; }
|
|
80
|
+
.brand-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
|
|
81
|
+
.sidebar h1 { font-size: 18px; color: var(--accent); letter-spacing: -0.2px; }
|
|
82
|
+
.theme-toggle { background: var(--surface-2); border: 1px solid var(--border); color: var(--text); border-radius: 999px; padding: 4px 10px; font-size: 12px; cursor: pointer; transition: all .15s; }
|
|
83
|
+
.theme-toggle:hover { border-color: var(--accent); }
|
|
84
|
+
.sidebar .version { font-size: 12px; color: var(--text-muted); margin-bottom: 2px; }
|
|
85
|
+
.sidebar .timestamp { font-size: 11px; color: var(--text-muted); margin-bottom: 20px; }
|
|
35
86
|
|
|
36
87
|
/* Summary cards */
|
|
37
|
-
.summary-cards { display:
|
|
38
|
-
.card { padding: 12px; border-radius:
|
|
39
|
-
.card .label { font-size:
|
|
40
|
-
.card .value { font-size:
|
|
41
|
-
.card.total .value { color:
|
|
42
|
-
.card.changed .value { color:
|
|
43
|
-
.card.new .value { color:
|
|
44
|
-
.card.passed .value { color:
|
|
88
|
+
.summary-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 20px; }
|
|
89
|
+
.card { padding: 12px; border-radius: 10px; background: var(--surface); border: 1px solid var(--border-soft); box-shadow: var(--shadow); }
|
|
90
|
+
.card .label { font-size: 10px; text-transform: uppercase; color: var(--text-muted); letter-spacing: 0.6px; }
|
|
91
|
+
.card .value { font-size: 22px; font-weight: 700; margin-top: 4px; }
|
|
92
|
+
.card.total .value { color: var(--text); }
|
|
93
|
+
.card.changed .value { color: var(--changed); }
|
|
94
|
+
.card.new .value { color: var(--new); }
|
|
95
|
+
.card.passed .value { color: var(--passed); }
|
|
45
96
|
|
|
46
97
|
/* Nav */
|
|
47
|
-
.nav { list-style: none; margin-bottom:
|
|
98
|
+
.nav { list-style: none; margin-bottom: 20px; }
|
|
48
99
|
.nav li { margin-bottom: 2px; }
|
|
49
|
-
.nav a { display: block; padding: 8px 12px; border-radius:
|
|
50
|
-
.nav a:hover { background:
|
|
51
|
-
.nav a .count { float: right; background:
|
|
100
|
+
.nav a { display: block; padding: 8px 12px; border-radius: 8px; color: var(--text-muted); text-decoration: none; font-size: 13px; transition: all 0.15s; }
|
|
101
|
+
.nav a:hover { background: var(--surface-2); color: var(--text); }
|
|
102
|
+
.nav a .count { float: right; background: var(--surface-2); border: 1px solid var(--border-soft); padding: 1px 8px; border-radius: 10px; font-size: 11px; }
|
|
52
103
|
|
|
53
|
-
/* CTA */
|
|
54
|
-
.cta { background:
|
|
55
|
-
.cta h3 { font-size: 13px; color:
|
|
56
|
-
.cta p { font-size: 11px; color:
|
|
57
|
-
.cta
|
|
104
|
+
/* Agent CTA */
|
|
105
|
+
.cta { background: var(--surface); border: 1px solid var(--border-soft); padding: 14px; border-radius: 10px; box-shadow: var(--shadow); }
|
|
106
|
+
.cta h3 { font-size: 13px; color: var(--text); margin-bottom: 6px; }
|
|
107
|
+
.cta p { font-size: 11px; color: var(--text-muted); line-height: 1.55; }
|
|
108
|
+
.cta code { background: var(--code-bg); border-radius: 4px; padding: 1px 4px; font-size: 10px; }
|
|
109
|
+
.cta a { display: inline-block; margin-top: 8px; padding: 6px 14px; background: var(--accent); color: var(--accent-contrast); border-radius: 6px; text-decoration: none; font-size: 12px; font-weight: 600; }
|
|
58
110
|
|
|
59
111
|
/* Main content */
|
|
60
|
-
.main { margin-left:
|
|
61
|
-
.section { margin-bottom:
|
|
62
|
-
.section-title { font-size:
|
|
63
|
-
.section-title
|
|
64
|
-
.section-title.
|
|
65
|
-
.section-title.
|
|
112
|
+
.main { margin-left: 264px; flex: 1; padding: 32px 36px; max-width: 1280px; }
|
|
113
|
+
.section { margin-bottom: 44px; }
|
|
114
|
+
.section-title { font-size: 18px; font-weight: 700; margin-bottom: 14px; display: flex; align-items: center; gap: 10px; }
|
|
115
|
+
.section-title::before { content: ''; width: 8px; height: 8px; border-radius: 50%; }
|
|
116
|
+
.section-title.changed { color: var(--changed); } .section-title.changed::before { background: var(--changed); }
|
|
117
|
+
.section-title.new { color: var(--new); } .section-title.new::before { background: var(--new); }
|
|
118
|
+
.section-title.passed { color: var(--passed); } .section-title.passed::before { background: var(--passed); }
|
|
66
119
|
|
|
67
120
|
/* Snapshot card */
|
|
68
|
-
.snapshot { background:
|
|
69
|
-
.snapshot-header { display: flex; justify-content: space-between; align-items: center; margin-bottom:
|
|
70
|
-
.snapshot-name { font-size:
|
|
71
|
-
.snapshot-badge { padding:
|
|
72
|
-
.badge-changed { background:
|
|
73
|
-
.badge-new { background:
|
|
74
|
-
.badge-passed { background:
|
|
75
|
-
.snapshot-stats { font-size: 12px; color:
|
|
121
|
+
.snapshot { background: var(--surface); border: 1px solid var(--border-soft); border-radius: 14px; padding: 20px; margin-bottom: 16px; box-shadow: var(--shadow); }
|
|
122
|
+
.snapshot-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
|
|
123
|
+
.snapshot-name { font-size: 15px; font-weight: 650; }
|
|
124
|
+
.snapshot-badge { padding: 3px 12px; border-radius: 999px; font-size: 12px; font-weight: 600; text-transform: capitalize; }
|
|
125
|
+
.badge-changed { background: var(--changed-bg); color: var(--changed); }
|
|
126
|
+
.badge-new { background: var(--new-bg); color: var(--new); }
|
|
127
|
+
.badge-passed { background: var(--passed-bg); color: var(--passed); }
|
|
128
|
+
.snapshot-stats { font-size: 12px; color: var(--text-muted); margin-bottom: 10px; }
|
|
129
|
+
|
|
130
|
+
/* Layered analysis panel — the same evidence agents get via MCP */
|
|
131
|
+
.analysis { border: 1px solid var(--border-soft); background: var(--surface-2); border-radius: 10px; padding: 12px 14px; margin-bottom: 14px; }
|
|
132
|
+
.analysis-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; }
|
|
133
|
+
.analysis-title { font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--text-muted); }
|
|
134
|
+
.analysis-mcp { font-size: 10px; color: var(--text-muted); }
|
|
135
|
+
.analysis-mcp code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; }
|
|
136
|
+
.verdict { display: flex; gap: 8px; align-items: flex-start; padding: 10px 12px; border-radius: 8px; font-size: 13px; line-height: 1.5; font-weight: 550; margin-bottom: 8px; }
|
|
137
|
+
.verdict .v-icon { flex-shrink: 0; }
|
|
138
|
+
.verdict.v-noise { background: var(--info-bg); color: var(--info); border: 1px solid var(--info); border-color: color-mix(in srgb, var(--info) 30%, transparent); }
|
|
139
|
+
.verdict.v-style { background: var(--new-bg); color: var(--new); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); }
|
|
140
|
+
.verdict.v-structural { background: var(--changed-bg); color: var(--changed); border: 1px solid color-mix(in srgb, var(--changed) 30%, transparent); }
|
|
141
|
+
.verdict.v-shift { background: var(--info-bg); color: var(--info); border: 1px solid color-mix(in srgb, var(--info) 30%, transparent); }
|
|
142
|
+
.verdict.v-new { background: var(--new-bg); color: var(--new); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); }
|
|
143
|
+
.verdict.v-pass { background: var(--passed-bg); color: var(--passed); border: 1px solid color-mix(in srgb, var(--passed) 30%, transparent); }
|
|
144
|
+
.verdict code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 12px; }
|
|
76
145
|
|
|
77
146
|
/* DOM noise hint */
|
|
78
|
-
.dom-hint { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding:
|
|
79
|
-
.dom-hint.noise { background:
|
|
80
|
-
.dom-hint.changed { background:
|
|
81
|
-
.dom-hint.style-changed { background:
|
|
82
|
-
.dom-hint.style-changed code { background:
|
|
147
|
+
.dom-hint { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding: 9px 12px; border-radius: 8px; font-size: 12px; line-height: 1.5; }
|
|
148
|
+
.dom-hint.noise { background: var(--info-bg); color: var(--info); }
|
|
149
|
+
.dom-hint.changed { background: var(--surface); border: 1px solid var(--border-soft); color: var(--text); }
|
|
150
|
+
.dom-hint.style-changed { background: var(--new-bg); color: var(--new); }
|
|
151
|
+
.dom-hint.style-changed code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 11px; }
|
|
83
152
|
.dom-hint .label { font-weight: 600; }
|
|
84
153
|
.dom-hint .summary { color: inherit; opacity: 0.85; }
|
|
85
154
|
|
|
@@ -88,52 +157,60 @@ function renderHtml(data) {
|
|
|
88
157
|
.diff-view.two-col { grid-template-columns: 1fr 1fr; }
|
|
89
158
|
.diff-view.one-col { grid-template-columns: 1fr; }
|
|
90
159
|
.diff-col { text-align: center; }
|
|
91
|
-
.diff-col label { display: block; font-size: 11px; color:
|
|
92
|
-
.diff-col img { max-width: 100%; border-radius:
|
|
160
|
+
.diff-col label { display: block; font-size: 11px; color: var(--text-muted); text-transform: uppercase; margin-bottom: 8px; letter-spacing: 0.5px; }
|
|
161
|
+
.diff-col img { max-width: 100%; border-radius: 8px; border: 1px solid var(--border); cursor: zoom-in; transition: transform 0.2s; background: #fff; }
|
|
93
162
|
.diff-col img:hover { transform: scale(1.02); }
|
|
94
163
|
|
|
95
164
|
/* Approve command */
|
|
96
|
-
.approve-cmd { margin-top: 16px; background:
|
|
97
|
-
.approve-cmd code { font-
|
|
98
|
-
.approve-cmd button { background:
|
|
99
|
-
.approve-cmd button:hover {
|
|
100
|
-
.approve-cmd button.copied { background:
|
|
165
|
+
.approve-cmd { margin-top: 16px; background: var(--surface-2); border: 1px solid var(--border-soft); border-radius: 8px; padding: 12px 16px; display: flex; justify-content: space-between; align-items: center; }
|
|
166
|
+
.approve-cmd code { font-size: 13px; color: var(--accent); }
|
|
167
|
+
.approve-cmd button { background: var(--surface); border: 1px solid var(--border); color: var(--text); padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 12px; transition: all 0.15s; }
|
|
168
|
+
.approve-cmd button:hover { border-color: var(--accent); }
|
|
169
|
+
.approve-cmd button.copied { background: var(--passed); border-color: var(--passed); color: #fff; }
|
|
101
170
|
|
|
102
171
|
/* Regions */
|
|
103
|
-
.regions { margin-top: 8px; padding: 10px 12px; background:
|
|
104
|
-
.regions .regions-title { color:
|
|
172
|
+
.regions { margin-top: 8px; padding: 10px 12px; background: var(--surface); border: 1px solid var(--border-soft); border-radius: 8px; font-size: 12px; }
|
|
173
|
+
.regions .regions-title { color: var(--text-muted); font-weight: 600; margin-bottom: 6px; }
|
|
105
174
|
.regions ul { list-style: none; display: flex; flex-wrap: wrap; gap: 6px; }
|
|
106
|
-
.regions li a { display: inline-block; padding: 3px 10px; border-radius: 10px; background:
|
|
107
|
-
.regions li a:hover {
|
|
108
|
-
.regions li a.region-shift { background:
|
|
109
|
-
.
|
|
110
|
-
.page-shift { margin-top: 8px; padding: 8px 10px; background: #1f6feb1a; border: 1px solid #1f6feb44; border-radius: 6px; font-size: 12px; color: #79c0ff; }
|
|
175
|
+
.regions li a { display: inline-block; padding: 3px 10px; border-radius: 10px; background: var(--changed-bg); color: var(--changed); text-decoration: none; font-family: 'SF Mono', 'Fira Code', ui-monospace, monospace; font-size: 11px; }
|
|
176
|
+
.regions li a:hover { filter: brightness(0.95); }
|
|
177
|
+
.regions li a.region-shift { background: var(--info-bg); color: var(--info); }
|
|
178
|
+
.page-shift { margin-top: 8px; padding: 8px 10px; background: var(--info-bg); border-radius: 6px; font-size: 12px; color: var(--info); }
|
|
111
179
|
|
|
112
180
|
/* Masks (audit trail) */
|
|
113
|
-
.masks { margin-top: 8px; padding: 10px 12px; background: repeating-linear-gradient(45deg,
|
|
114
|
-
.masks .label { font-weight: 600; color:
|
|
115
|
-
.masks code { color:
|
|
116
|
-
.mask-warning { margin-top: 8px; padding: 10px 12px; background:
|
|
181
|
+
.masks { margin-top: 8px; padding: 10px 12px; background: repeating-linear-gradient(45deg, var(--hatch-a), var(--hatch-a) 6px, var(--hatch-b) 6px, var(--hatch-b) 8px); border: 1px solid var(--border); border-radius: 8px; font-size: 12px; color: var(--text-muted); }
|
|
182
|
+
.masks .label { font-weight: 600; color: var(--text); }
|
|
183
|
+
.masks code { color: var(--link); font-size: 11px; }
|
|
184
|
+
.mask-warning { margin-top: 8px; padding: 10px 12px; background: var(--new-bg); border-radius: 8px; font-size: 12px; color: var(--new); }
|
|
117
185
|
|
|
118
186
|
/* Zoom overlay */
|
|
119
187
|
.zoom-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.9); z-index: 100; justify-content: center; align-items: center; cursor: zoom-out; }
|
|
120
188
|
.zoom-overlay.active { display: flex; }
|
|
121
189
|
.zoom-overlay img { max-width: 95%; max-height: 95%; border-radius: 8px; }
|
|
122
190
|
|
|
123
|
-
/*
|
|
124
|
-
.
|
|
125
|
-
.
|
|
191
|
+
/* Missing-baselines notice (coverage loss) */
|
|
192
|
+
.missing-notice { background: var(--new-bg); border: 1px solid color-mix(in srgb, var(--new) 30%, transparent); border-radius: 10px; padding: 14px 16px; margin-bottom: 24px; font-size: 13px; color: var(--new); }
|
|
193
|
+
.missing-notice .m-title { font-weight: 700; margin-bottom: 4px; }
|
|
194
|
+
.missing-notice code { background: var(--code-bg); border-radius: 3px; padding: 1px 5px; font-size: 12px; }
|
|
195
|
+
.missing-notice .m-hint { color: var(--text-muted); font-size: 12px; margin-top: 6px; }
|
|
196
|
+
|
|
197
|
+
/* Notices / empty state */
|
|
198
|
+
.oss-notice { margin-top: 14px; padding: 12px 14px; background: var(--surface); border: 1px solid var(--border-soft); border-radius: 8px; font-size: 11px; color: var(--text-muted); line-height: 1.6; box-shadow: var(--shadow); }
|
|
199
|
+
.oss-notice h4 { margin: 0 0 8px; font-size: 11px; color: var(--text); }
|
|
126
200
|
.oss-notice p { margin: 0 0 6px; }
|
|
127
201
|
.oss-notice p:last-child { margin-bottom: 0; }
|
|
128
|
-
.oss-notice code { background:
|
|
129
|
-
.oss-notice a { color:
|
|
130
|
-
.empty { text-align: center; padding: 48px; color:
|
|
202
|
+
.oss-notice code { background: var(--code-bg); border-radius: 3px; padding: 1px 4px; font-size: 10px; }
|
|
203
|
+
.oss-notice a { color: var(--link); }
|
|
204
|
+
.empty { text-align: center; padding: 48px; color: var(--text-muted); }
|
|
131
205
|
.empty .icon { font-size: 48px; margin-bottom: 16px; }
|
|
132
206
|
</style>
|
|
133
207
|
</head>
|
|
134
208
|
<body>
|
|
135
209
|
<aside class="sidebar">
|
|
136
|
-
<
|
|
210
|
+
<div class="brand-row">
|
|
211
|
+
<h1>TestivAI</h1>
|
|
212
|
+
<button class="theme-toggle" id="themeToggle" title="Switch between light and dark theme">🌙 Dark</button>
|
|
213
|
+
</div>
|
|
137
214
|
<div class="version">Visual Report v${escapeHtml(version)}</div>
|
|
138
215
|
<div class="timestamp">${escapeHtml(new Date(timestamp).toLocaleString())}</div>
|
|
139
216
|
|
|
@@ -168,11 +245,17 @@ function renderHtml(data) {
|
|
|
168
245
|
</aside>
|
|
169
246
|
|
|
170
247
|
<main class="main">
|
|
248
|
+
${missing.length > 0 ? `
|
|
249
|
+
<div class="missing-notice">
|
|
250
|
+
<div class="m-title">⚠️ ${missing.length} baseline${missing.length === 1 ? '' : 's'} received no capture this run</div>
|
|
251
|
+
${missing.map((n) => `<code>${escapeHtml(n)}</code>`).join(' ')}
|
|
252
|
+
<div class="m-hint">A deleted or renamed test silently stops guarding its page. If intentional, remove the baseline (and commit); if this was a filtered run (<code>--grep</code>), ignore this notice.</div>
|
|
253
|
+
</div>` : ''}
|
|
171
254
|
${summary.total === 0 ? `
|
|
172
255
|
<div class="empty">
|
|
173
256
|
<div class="icon">📸</div>
|
|
174
257
|
<h2>No snapshots found</h2>
|
|
175
|
-
<p>Run your tests to
|
|
258
|
+
<p>Run your tests to capture snapshots, then re-run the report.</p>
|
|
176
259
|
</div>` : ''}
|
|
177
260
|
|
|
178
261
|
${changed.length > 0 ? `
|
|
@@ -194,15 +277,31 @@ function renderHtml(data) {
|
|
|
194
277
|
</section>` : ''}
|
|
195
278
|
</main>
|
|
196
279
|
|
|
197
|
-
<div class="zoom-overlay" id="zoomOverlay">
|
|
198
|
-
<img id="zoomImage" src="" alt="Zoomed">
|
|
199
|
-
</div>
|
|
280
|
+
<div class="zoom-overlay" id="zoomOverlay"><img id="zoomImg" src="" alt="Zoomed"></div>
|
|
200
281
|
|
|
201
282
|
<script>
|
|
202
|
-
//
|
|
283
|
+
// Theme: light is the default; a stored preference of "dark" overrides.
|
|
284
|
+
(function () {
|
|
285
|
+
const KEY = 'testivai-theme';
|
|
286
|
+
const btn = document.getElementById('themeToggle');
|
|
287
|
+
const apply = (theme) => {
|
|
288
|
+
if (theme === 'dark') document.documentElement.setAttribute('data-theme', 'dark');
|
|
289
|
+
else document.documentElement.removeAttribute('data-theme');
|
|
290
|
+
btn.textContent = theme === 'dark' ? '☀️ Light' : '🌙 Dark';
|
|
291
|
+
};
|
|
292
|
+
let theme = 'light';
|
|
293
|
+
try { theme = localStorage.getItem(KEY) === 'dark' ? 'dark' : 'light'; } catch {}
|
|
294
|
+
apply(theme);
|
|
295
|
+
btn.addEventListener('click', () => {
|
|
296
|
+
theme = theme === 'dark' ? 'light' : 'dark';
|
|
297
|
+
try { localStorage.setItem(KEY, theme); } catch {}
|
|
298
|
+
apply(theme);
|
|
299
|
+
});
|
|
300
|
+
})();
|
|
301
|
+
|
|
203
302
|
document.querySelectorAll('.diff-col img').forEach(img => {
|
|
204
303
|
img.addEventListener('click', () => {
|
|
205
|
-
document.getElementById('
|
|
304
|
+
document.getElementById('zoomImg').src = img.src;
|
|
206
305
|
document.getElementById('zoomOverlay').classList.add('active');
|
|
207
306
|
});
|
|
208
307
|
});
|
|
@@ -210,18 +309,17 @@ function renderHtml(data) {
|
|
|
210
309
|
document.getElementById('zoomOverlay').classList.remove('active');
|
|
211
310
|
});
|
|
212
311
|
|
|
213
|
-
// Region chips zoom the diff image for inspection
|
|
214
312
|
document.querySelectorAll('.region-chip').forEach(chip => {
|
|
215
313
|
chip.addEventListener('click', (e) => {
|
|
216
314
|
e.preventDefault();
|
|
217
315
|
const diff = chip.dataset.diff;
|
|
218
|
-
if (
|
|
219
|
-
|
|
220
|
-
|
|
316
|
+
if (diff) {
|
|
317
|
+
document.getElementById('zoomImg').src = diff;
|
|
318
|
+
document.getElementById('zoomOverlay').classList.add('active');
|
|
319
|
+
}
|
|
221
320
|
});
|
|
222
321
|
});
|
|
223
322
|
|
|
224
|
-
// Copy approve command
|
|
225
323
|
document.querySelectorAll('.copy-btn').forEach(btn => {
|
|
226
324
|
btn.addEventListener('click', () => {
|
|
227
325
|
const cmd = btn.dataset.cmd;
|
|
@@ -257,10 +355,8 @@ function renderSnapshot(snapshot) {
|
|
|
257
355
|
<span class="snapshot-name">${escapeHtml(snapshot.name)}</span>
|
|
258
356
|
<span class="snapshot-badge ${badgeClass}">${snapshot.status}</span>
|
|
259
357
|
</div>
|
|
260
|
-
${
|
|
261
|
-
${
|
|
262
|
-
${renderRegions(snapshot)}
|
|
263
|
-
${renderMasks(snapshot)}
|
|
358
|
+
${renderStats(snapshot)}
|
|
359
|
+
${renderAnalysis(snapshot)}
|
|
264
360
|
<div class="${gridClass}">
|
|
265
361
|
${hasBaseline ? `<div class="diff-col"><label>Baseline</label><img src="${snapshot.baselinePath}" alt="Baseline"></div>` : ''}
|
|
266
362
|
${hasDiff ? `<div class="diff-col"><label>Diff</label><img src="${snapshot.diffPath}" alt="Diff"></div>` : ''}
|
|
@@ -273,6 +369,89 @@ function renderSnapshot(snapshot) {
|
|
|
273
369
|
</div>` : ''}
|
|
274
370
|
</div>`;
|
|
275
371
|
}
|
|
372
|
+
/**
|
|
373
|
+
* Stats line: diff numbers (for changed/auto-passed) plus baseline
|
|
374
|
+
* provenance — when the compared baseline was last approved. A months-old
|
|
375
|
+
* baseline deserves a closer look than yesterday's.
|
|
376
|
+
*/
|
|
377
|
+
function renderStats(snapshot) {
|
|
378
|
+
const parts = [];
|
|
379
|
+
if (snapshot.status === 'changed' || snapshot.autoPassed) {
|
|
380
|
+
parts.push(`Diff: ${snapshot.diffPercent.toFixed(2)}% (${snapshot.diffCount} pixels)${snapshot.autoPassed ? ` — auto-passed: ${snapshot.autoPassed === 'noise' ? 'DOM unchanged, within noise tolerance' : 'within configured diff tolerance'}` : ''}`);
|
|
381
|
+
}
|
|
382
|
+
if (snapshot.baselineApprovedAt) {
|
|
383
|
+
const d = new Date(snapshot.baselineApprovedAt);
|
|
384
|
+
if (!isNaN(d.getTime())) {
|
|
385
|
+
parts.push(`baseline approved ${d.toISOString().slice(0, 10)}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (parts.length === 0)
|
|
389
|
+
return '';
|
|
390
|
+
return `<div class="snapshot-stats">${parts.join(' · ')}</div>`;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* The "Layered analysis" panel: a synthesized verdict headline followed by
|
|
394
|
+
* the individual evidence layers (DOM/style signal, attributed regions,
|
|
395
|
+
* page shift, masks). This is the human-facing view of the same layered
|
|
396
|
+
* evidence @testivai/mcp's explain_snapshot serves to AI agents.
|
|
397
|
+
*/
|
|
398
|
+
function renderAnalysis(snapshot) {
|
|
399
|
+
const verdict = renderVerdict(snapshot);
|
|
400
|
+
const layers = [renderDomHint(snapshot), renderRegions(snapshot), renderMasks(snapshot)].filter(Boolean).join('');
|
|
401
|
+
if (!verdict && !layers)
|
|
402
|
+
return '';
|
|
403
|
+
return `
|
|
404
|
+
<div class="analysis">
|
|
405
|
+
<div class="analysis-head">
|
|
406
|
+
<span class="analysis-title">Layered analysis</span>
|
|
407
|
+
<span class="analysis-mcp">agents get this via <code>@testivai/mcp</code> · <code>explain_snapshot</code></span>
|
|
408
|
+
</div>
|
|
409
|
+
${verdict}
|
|
410
|
+
${layers}
|
|
411
|
+
</div>`;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Verdict headline: one plain-language line synthesizing the layers, in
|
|
415
|
+
* priority order — style-only change (real) > page shift (injected content)
|
|
416
|
+
* > structural DOM change > render noise > new snapshot > auto-pass.
|
|
417
|
+
*/
|
|
418
|
+
function renderVerdict(snapshot) {
|
|
419
|
+
if (snapshot.status === 'passed' && !snapshot.autoPassed)
|
|
420
|
+
return '';
|
|
421
|
+
if (snapshot.status === 'new') {
|
|
422
|
+
return `<div class="verdict v-new"><span class="v-icon">🆕</span><span>First capture — no baseline yet. Review the image, then approve to make it the baseline.</span></div>`;
|
|
423
|
+
}
|
|
424
|
+
if (snapshot.dom?.styleCheck === 'mismatch' && snapshot.dom.styleChanges) {
|
|
425
|
+
const n = snapshot.dom.styleChanges.count;
|
|
426
|
+
const first = snapshot.dom.styleChanges.elements[0];
|
|
427
|
+
const el = first ? `<code>${escapeHtml(first.split(' > ').slice(-1)[0])}</code>` : '';
|
|
428
|
+
return `<div class="verdict v-style"><span class="v-icon">🎨</span><span>Style-only change — a real change, not noise: ${n} element${n === 1 ? '' : 's'} restyled with identical DOM${el ? ` (${el}${n > 1 ? ', …' : ''})` : ''}. Confirm it's intended before approving.</span></div>`;
|
|
429
|
+
}
|
|
430
|
+
if (snapshot.pageShift) {
|
|
431
|
+
const p = snapshot.pageShift;
|
|
432
|
+
return `<div class="verdict v-shift"><span class="v-icon">↕️</span><span>Layout shift — everything below y=${p.belowY} moved ${p.dy > 0 ? 'down' : 'up'} ${Math.abs(p.dy)}px (${p.count} elements together). Look <em>above</em> that line for inserted or removed content; the moved elements themselves are unchanged.</span></div>`;
|
|
433
|
+
}
|
|
434
|
+
if (snapshot.dom?.changed && snapshot.dom.summary) {
|
|
435
|
+
const s = snapshot.dom.summary;
|
|
436
|
+
const parts = [];
|
|
437
|
+
if (s.added > 0)
|
|
438
|
+
parts.push(`${s.added} added`);
|
|
439
|
+
if (s.removed > 0)
|
|
440
|
+
parts.push(`${s.removed} removed`);
|
|
441
|
+
if (s.attributeChanges > 0)
|
|
442
|
+
parts.push(`${s.attributeChanges} attribute`);
|
|
443
|
+
if (s.textChanges)
|
|
444
|
+
parts.push(`${s.textChanges} text`);
|
|
445
|
+
return `<div class="verdict v-structural"><span class="v-icon">🧱</span><span>Structural change — the DOM differs (${escapeHtml(parts.join(', ') || 'structural difference')}). Review the diff and confirm the change is intended before approving.</span></div>`;
|
|
446
|
+
}
|
|
447
|
+
if (snapshot.dom?.noiseHint) {
|
|
448
|
+
return `<div class="verdict v-noise"><span class="v-icon">💡</span><span>Likely render noise — pixels differ but the DOM${snapshot.dom.styleCheck === 'match' ? ' and computed styles are' : ' is'} identical (anti-aliasing, font hinting). Worth a glance, not a block.</span></div>`;
|
|
449
|
+
}
|
|
450
|
+
if (snapshot.autoPassed) {
|
|
451
|
+
return `<div class="verdict v-pass"><span class="v-icon">✅</span><span>Auto-passed via the <code>${snapshot.autoPassed}</code> criterion — reported for transparency, no action needed.</span></div>`;
|
|
452
|
+
}
|
|
453
|
+
return '';
|
|
454
|
+
}
|
|
276
455
|
/**
|
|
277
456
|
* Render the DOM noise-hint badge for a snapshot.
|
|
278
457
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/report/template.ts"],"names":[],"mappings":"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"}
|