diff --git a/sbas/templates/sbas/partials/exam_review_question_fragment.html b/sbas/templates/sbas/partials/exam_review_question_fragment.html
index 980cf1a9..5a47abfc 100644
--- a/sbas/templates/sbas/partials/exam_review_question_fragment.html
+++ b/sbas/templates/sbas/partials/exam_review_question_fragment.html
@@ -109,49 +109,15 @@
View full question details
- {# Aggregated summary: always shown if aggregation context is available #}
+ {# Aggregated summary: HTMX-loaded automatically on fragment load #}
Response summary
- {% if exam_response_total %}
-
Total responses: {{ exam_response_total }}
-
-
Correct:
-
- {% if exam_response_correct_count is not None %}
- {{ exam_response_correct_count }}
- {% if exam_response_correct_pct is not None %}
- ({{ exam_response_correct_pct }}%)
- {% endif %}
- {% else %}
- N/A
- {% endif %}
-
-
-
-
-
A
-
{{ exam_response_counts.a|default:0 }}{{ exam_response_pcts.a|default:0 }}%
-
-
-
B
-
{{ exam_response_counts.b|default:0 }}{{ exam_response_pcts.b|default:0 }}%
-
-
-
C
-
{{ exam_response_counts.c|default:0 }}{{ exam_response_pcts.c|default:0 }}%
-
-
-
D
-
{{ exam_response_counts.d|default:0 }}{{ exam_response_pcts.d|default:0 }}%
-
-
-
E
-
{{ exam_response_counts.e|default:0 }}{{ exam_response_pcts.e|default:0 }}%
-
-
- {% else %}
-
No responses recorded for this question in the exam yet.
- {% endif %}
+
{# Responses partial: load on demand via HTMX. Button fetches partial into #responses-container #}
diff --git a/sbas/templates/sbas/partials/exam_review_question_summary_fragment.html b/sbas/templates/sbas/partials/exam_review_question_summary_fragment.html
new file mode 100644
index 00000000..a8cff363
--- /dev/null
+++ b/sbas/templates/sbas/partials/exam_review_question_summary_fragment.html
@@ -0,0 +1,43 @@
+{# Partial: aggregated response summary for a question within an exam. HTMX-loadable. #}
+
+ {% if exam_response_total %}
+
Total responses: {{ exam_response_total }}
+
+
Correct:
+
+ {% if exam_response_correct_count is not None %}
+ {{ exam_response_correct_count }}
+ {% if exam_response_correct_pct is not None %}
+ ({{ exam_response_correct_pct }}%)
+ {% endif %}
+ {% else %}
+ N/A
+ {% endif %}
+
+
+
+
+
A
+
{{ exam_response_counts.a|default:0 }}{{ exam_response_pcts.a|default:0 }}%
+
+
+
B
+
{{ exam_response_counts.b|default:0 }}{{ exam_response_pcts.b|default:0 }}%
+
+
+
C
+
{{ exam_response_counts.c|default:0 }}{{ exam_response_pcts.c|default:0 }}%
+
+
+
D
+
{{ exam_response_counts.d|default:0 }}{{ exam_response_pcts.d|default:0 }}%
+
+
+
E
+
{{ exam_response_counts.e|default:0 }}{{ exam_response_pcts.e|default:0 }}%
+
+
+ {% else %}
+
No responses recorded for this question in the exam yet.
+ {% endif %}
+
diff --git a/sbas/urls.py b/sbas/urls.py
index fc7339bd..adcdf80e 100644
--- a/sbas/urls.py
+++ b/sbas/urls.py
@@ -122,6 +122,16 @@ urlpatterns = [
views.exam_review_question_responses,
name="exam_review_question_responses",
),
+ path(
+ "exam/