',
@@ -279,7 +279,7 @@ def _bar_chart(rows: list[dict[str, Any]], value_key: str | None) -> str:
return "\n".join(
[
- '
',
+ '
',
*chart_rows,
"
",
]
@@ -477,6 +477,7 @@ def _css() -> str:
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 12px;
+ margin: 0;
}
.metric-card {
@@ -487,16 +488,19 @@ def _css() -> str:
background: #fafafa;
}
-.metric-card span {
+.metric-card dt {
display: block;
color: var(--muted);
font-size: 0.82rem;
+ font-weight: normal;
+ margin: 0;
}
-.metric-card strong {
+.metric-card dd {
display: block;
- margin-top: 8px;
+ margin: 8px 0 0 0;
font-size: 1.45rem;
+ font-weight: bold;
overflow-wrap: anywhere;
}
@@ -574,7 +578,7 @@ def _css() -> str:
border-radius: 8px;
}
-.table-wrap:focus {
+.table-wrap:focus-visible {
outline: 3px solid #0f766e;
outline-offset: 3px;
}
@@ -615,6 +619,10 @@ def _css() -> str:
border-bottom: 0;
}
+tbody tr:hover {
+ background: #fbfcfa;
+}
+
.empty-state {
margin: 0;
padding: 14px;
diff --git a/scripts/build_benchmark_report.py b/scripts/build_benchmark_report.py
index ddd37b4..48ed07f 100644
--- a/scripts/build_benchmark_report.py
+++ b/scripts/build_benchmark_report.py
@@ -324,7 +324,7 @@ def _report_css() -> str:
border: 1px solid #d8e1e3;
border-radius: 8px;
}
-.table-wrap:focus {
+.table-wrap:focus-visible {
outline: 3px solid #0f766e;
outline-offset: 3px;
}
diff --git a/scripts/build_buyer_packet.py b/scripts/build_buyer_packet.py
index 5d0512b..d36e5d0 100644
--- a/scripts/build_buyer_packet.py
+++ b/scripts/build_buyer_packet.py
@@ -378,7 +378,7 @@ def _report_css() -> str:
border: 1px solid #d8e1e3;
border-radius: 8px;
}
-.table-wrap:focus {
+.table-wrap:focus-visible {
outline: 3px solid #0f766e;
outline-offset: 3px;
}
diff --git a/scripts/build_commercial_release.py b/scripts/build_commercial_release.py
index c21e5e3..f2fb6d8 100644
--- a/scripts/build_commercial_release.py
+++ b/scripts/build_commercial_release.py
@@ -302,7 +302,7 @@ def _report_css() -> str:
border: 1px solid #d8e1e3;
border-radius: 8px;
}
-.table-wrap:focus {
+.table-wrap:focus-visible {
outline: 3px solid #0f766e;
outline-offset: 3px;
}
diff --git a/scripts/build_figma_evidence_sync.py b/scripts/build_figma_evidence_sync.py
index ee66f91..316d7a6 100644
--- a/scripts/build_figma_evidence_sync.py
+++ b/scripts/build_figma_evidence_sync.py
@@ -132,7 +132,7 @@ def _report_css() -> str:
.metric-card span { display: block; color: #5e6f76; font-size: 0.8rem; font-weight: 700; text-transform: uppercase; }
.metric-card strong { display: block; margin-top: 8px; overflow-wrap: anywhere; }
.table-wrap { overflow-x: auto; border: 1px solid #d8e1e3; border-radius: 8px; }
-.table-wrap:focus { outline: 3px solid #0f766e; outline-offset: 3px; }
+.table-wrap:focus-visible { outline: 3px solid #0f766e; outline-offset: 3px; }
table { width: 100%; min-width: 760px; border-collapse: collapse; }
caption { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
th, td { padding: 10px 12px; border-bottom: 1px solid #e8edef; text-align: left; vertical-align: top; }
diff --git a/scripts/build_pr_queue_governance.py b/scripts/build_pr_queue_governance.py
index d9ca8fa..c352374 100644
--- a/scripts/build_pr_queue_governance.py
+++ b/scripts/build_pr_queue_governance.py
@@ -272,7 +272,7 @@ def _report_css() -> str:
.metric-card span { display: block; color: #5e6f76; font-size: 0.8rem; font-weight: 700; text-transform: uppercase; }
.metric-card strong { display: block; margin-top: 8px; overflow-wrap: anywhere; }
.table-wrap { overflow-x: auto; border: 1px solid #d8e1e3; border-radius: 8px; }
-.table-wrap:focus { outline: 3px solid #0f766e; outline-offset: 3px; }
+.table-wrap:focus-visible { outline: 3px solid #0f766e; outline-offset: 3px; }
table { width: 100%; min-width: 920px; border-collapse: collapse; }
caption { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
th, td { padding: 10px 12px; border-bottom: 1px solid #e8edef; text-align: left; vertical-align: top; }
diff --git a/scripts/build_procurement_due_diligence.py b/scripts/build_procurement_due_diligence.py
index 2caaa35..7efea1d 100644
--- a/scripts/build_procurement_due_diligence.py
+++ b/scripts/build_procurement_due_diligence.py
@@ -303,7 +303,7 @@ def _report_css() -> str:
.metric-card span { display: block; color: #5e6f76; font-size: 0.8rem; font-weight: 700; text-transform: uppercase; }
.metric-card strong { display: block; margin-top: 8px; overflow-wrap: anywhere; }
.table-wrap { overflow-x: auto; border: 1px solid #d8e1e3; border-radius: 8px; }
-.table-wrap:focus { outline: 3px solid #0f766e; outline-offset: 3px; }
+.table-wrap:focus-visible { outline: 3px solid #0f766e; outline-offset: 3px; }
table { width: 100%; min-width: 760px; border-collapse: collapse; }
caption { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
th, td { padding: 10px 12px; border-bottom: 1px solid #e8edef; text-align: left; vertical-align: top; }
diff --git a/scripts/build_release_evidence_index.py b/scripts/build_release_evidence_index.py
index e79971a..28b79ce 100644
--- a/scripts/build_release_evidence_index.py
+++ b/scripts/build_release_evidence_index.py
@@ -331,7 +331,7 @@ def _report_css() -> str:
border: 1px solid #d8e1e3;
border-radius: 8px;
}
-.table-wrap:focus {
+.table-wrap:focus-visible {
outline: 3px solid #0f766e;
outline-offset: 3px;
}
diff --git a/tests/test_report.py b/tests/test_report.py
index 0b29e0e..8104d07 100644
--- a/tests/test_report.py
+++ b/tests/test_report.py
@@ -31,6 +31,9 @@ def test_render_fit_diagnostics_report_has_sections(tmp_path):
html = out.read_text(encoding="utf-8")
assert "Example Fit" in html
assert "Model Fit" in html
+ assert '
' in html
+ assert "- Loglik
" in html
+ assert "- -3.2
" in html
assert "Item Fit" in html
assert "Diagnostics Coverage" in html
assert "No row data" in html
@@ -225,4 +228,8 @@ def test_render_table_region_has_keyboard_focus_style(tmp_path):
html = out.read_text(encoding="utf-8")
assert 'aria-label="Candidate Comparison diagnostics table"' in html
assert 'tabindex="0"' in html
- assert ".table-wrap:focus" in html
+ assert ".table-wrap:focus-visible" in html
+ assert ".table-wrap:focus {" not in html
+ assert "tbody tr:hover" in html
+ assert '' in html
+ assert '
' in html