diff --git a/messages/de.json b/messages/de.json
index 18bf94738..9252f62a7 100644
--- a/messages/de.json
+++ b/messages/de.json
@@ -6056,6 +6056,7 @@
"colAction": "Aktion",
"colDuration": "Dauer",
"colTraceId": "Trace",
+ "viewDetails": "Details anzeigen für {action} um {timestamp}",
"showing": "{count} von bis zu {bufferMax} gepufferten Events angezeigt",
"empty": "Puffer ist leer",
"emptyDescription": "Es passen noch keine Events zu den Filtern. Nach etwas Traffic auf Aktualisieren tippen.",
diff --git a/messages/en.json b/messages/en.json
index 0c2dfff82..be96b60ab 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -6056,6 +6056,7 @@
"colAction": "Action",
"colDuration": "Duration",
"colTraceId": "Trace",
+ "viewDetails": "View details for {action} at {timestamp}",
"showing": "Showing {count} of up to {bufferMax} buffered events",
"empty": "Buffer is empty",
"emptyDescription": "No events match the current filters yet. Hit refresh after triggering some traffic.",
diff --git a/messages/es.json b/messages/es.json
index 0d6573ea1..df1777603 100644
--- a/messages/es.json
+++ b/messages/es.json
@@ -6056,6 +6056,7 @@
"colAction": "Acción",
"colDuration": "Duración",
"colTraceId": "Trace",
+ "viewDetails": "Ver detalles de {action} a las {timestamp}",
"showing": "Mostrando {count} de hasta {bufferMax} eventos en búfer",
"empty": "El búfer está vacío",
"emptyDescription": "Aún no hay eventos que coincidan con los filtros actuales. Pulsa actualizar tras generar algo de tráfico.",
diff --git a/messages/fr.json b/messages/fr.json
index ae6c28eb8..945051dc9 100644
--- a/messages/fr.json
+++ b/messages/fr.json
@@ -6056,6 +6056,7 @@
"colAction": "Action",
"colDuration": "Durée",
"colTraceId": "Trace",
+ "viewDetails": "Voir les détails de {action} à {timestamp}",
"showing": "Affichage de {count} sur jusqu'à {bufferMax} événements en mémoire tampon",
"empty": "Le tampon est vide",
"emptyDescription": "Aucun événement ne correspond encore aux filtres actuels. Cliquez sur Actualiser après avoir généré du trafic.",
diff --git a/messages/it.json b/messages/it.json
index 9feb86234..44e478b3b 100644
--- a/messages/it.json
+++ b/messages/it.json
@@ -6056,6 +6056,7 @@
"colAction": "Azione",
"colDuration": "Durata",
"colTraceId": "Trace",
+ "viewDetails": "Visualizza i dettagli di {action} alle {timestamp}",
"showing": "Visualizzati {count} di un massimo di {bufferMax} eventi nel buffer",
"empty": "Il buffer è vuoto",
"emptyDescription": "Nessun evento corrisponde ancora ai filtri attuali. Premi Aggiorna dopo aver generato un po' di traffico.",
diff --git a/messages/pl.json b/messages/pl.json
index 9f51e4099..2a51daa76 100644
--- a/messages/pl.json
+++ b/messages/pl.json
@@ -6056,6 +6056,7 @@
"colAction": "Akcja",
"colDuration": "Czas trwania",
"colTraceId": "Trace",
+ "viewDetails": "Zobacz szczegóły dla {action} o {timestamp}",
"showing": "Wyświetlono {count} z maksymalnie {bufferMax} buforowanych zdarzeń",
"empty": "Bufor jest pusty",
"emptyDescription": "Żadne zdarzenie nie pasuje jeszcze do bieżących filtrów. Kliknij Odśwież po wygenerowaniu ruchu.",
diff --git a/src/components/admin/__tests__/app-log-preview-summary-position.test.tsx b/src/components/admin/__tests__/app-log-preview-summary-position.test.tsx
index be2894fe0..356dc6068 100644
--- a/src/components/admin/__tests__/app-log-preview-summary-position.test.tsx
+++ b/src/components/admin/__tests__/app-log-preview-summary-position.test.tsx
@@ -98,3 +98,16 @@ describe("AppLogPreviewSection — summary lives outside the scroll wrapper", ()
expect(wrapper![0]).not.toContain("app-log-preview-summary");
});
});
+
+describe("AppLogPreviewSection — row detail is keyboard-reachable (2026-07-17 a11y audit H1)", () => {
+ // The row itself stays a pointer-only convenience (`onClick` on the
+ // `