diff --git a/docs-site/docs/reporting/html-report.md b/docs-site/docs/reporting/html-report.md
index 5fd9f24..96ce397 100644
--- a/docs-site/docs/reporting/html-report.md
+++ b/docs-site/docs/reporting/html-report.md
@@ -202,6 +202,16 @@ All screenshots are Base64-encoded and embedded inline. The report is a single f
No images folder, no asset references, no server needed.
+### Share a single test
+
+The full report can run to several megabytes. To share one test, expand it and click
+**Download this test** in its detail panel. You get a standalone `.html` file with
+that test's status, error, stack trace, steps and screenshots. It opens offline in any
+browser, keeps the report's current light or dark theme, and is small enough to attach
+to a Jira ticket, GitHub issue or Slack thread.
+
+The file is built in your browser when you click, so it adds nothing to the report size.
+
---
## Step timeline
diff --git a/src/main/resources/report/report.js b/src/main/resources/report/report.js
index 12915e8..91ea442 100644
--- a/src/main/resources/report/report.js
+++ b/src/main/resources/report/report.js
@@ -455,6 +455,17 @@ function escapeHtmlForExport(str) {
.replace(/'/g, ''');
}
+// Tag pills filter the full report; the standalone export has nothing to filter,
+// so neutralise their handlers instead of shipping calls to undefined functions.
+// They still stop propagation, so clicking a pill doesn't collapse the detail row.
+function stripReportOnlyHandlers(root) {
+ root.querySelectorAll('[onclick^="filterByTag"]').forEach(function(el) {
+ el.setAttribute('onclick', 'event.stopPropagation()');
+ el.removeAttribute('title');
+ el.style.cursor = 'default';
+ });
+}
+
function buildStandaloneTestHtml(testId, testRow, panel, activeTheme) {
const styleTag = document.querySelector('style');
const css = styleTag ? styleTag.textContent : '';
@@ -484,6 +495,7 @@ function buildStandaloneTestHtml(testId, testRow, panel, activeTheme) {
if (icon) {
icon.classList.add('open');
}
+ stripReportOnlyHandlers(testRowClone);
testRowHtml = testRowClone.outerHTML;
}
@@ -498,10 +510,12 @@ function buildStandaloneTestHtml(testId, testRow, panel, activeTheme) {
if (panelClone) {
panelClone.querySelectorAll('.copy-failure-btn, .download-test-btn').forEach(function(b) { b.remove(); });
}
+ stripReportOnlyHandlers(detailRowClone);
detailRowHtml = detailRowClone.outerHTML;
} else if (panel) {
const panelClone = panel.cloneNode(true);
panelClone.querySelectorAll('.copy-failure-btn, .download-test-btn').forEach(function(b) { b.remove(); });
+ stripReportOnlyHandlers(panelClone);
detailRowHtml = '