diff --git a/frontend/messages/de.json b/frontend/messages/de.json index f1b189ce..8ef11f81 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -423,6 +423,7 @@ "person_mention_open_link": "Zur Person", "person_mention_hover_hint": "Klick öffnet Seite", "person_mention_load_error": "Person konnte nicht geladen werden.", + "person_mention_loading": "Lade Person…", "person_mention_popup_empty": "Keine Personen gefunden", "person_mention_btn_label": "Person verlinken", "person_mention_create_new": "Neue Person anlegen", diff --git a/frontend/messages/en.json b/frontend/messages/en.json index 02111802..c0909263 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -423,6 +423,7 @@ "person_mention_open_link": "Open person", "person_mention_hover_hint": "Click opens the page", "person_mention_load_error": "Could not load person.", + "person_mention_loading": "Loading person…", "person_mention_popup_empty": "No persons found", "person_mention_btn_label": "Link person", "person_mention_create_new": "Create new person", diff --git a/frontend/messages/es.json b/frontend/messages/es.json index 5d416017..4b2fcdaf 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -423,6 +423,7 @@ "person_mention_open_link": "Ir a la persona", "person_mention_hover_hint": "Clic abre la página", "person_mention_load_error": "No se pudo cargar la persona.", + "person_mention_loading": "Cargando persona…", "person_mention_popup_empty": "No se encontraron personas", "person_mention_btn_label": "Vincular persona", "person_mention_create_new": "Crear nueva persona", diff --git a/frontend/src/lib/components/PersonHoverCard.svelte b/frontend/src/lib/components/PersonHoverCard.svelte index 3374de23..74c36260 100644 --- a/frontend/src/lib/components/PersonHoverCard.svelte +++ b/frontend/src/lib/components/PersonHoverCard.svelte @@ -41,6 +41,17 @@ const notesExcerpt = $derived.by(() => { if (notes.length <= NOTES_MAX) return notes; return notes.slice(0, NOTES_MAX) + '…'; }); + +// Accessible name for the region landmark — required by WCAG 1.3.1. +// Falls back to a localised loading label so axe-core never sees an unnamed +// region (Leonie FINDING-02 / Elicit NFR concern). +const ariaLabel = $derived( + state.status === 'loaded' ? state.person.displayName : m.person_mention_loading() +); + +// aria-busy="true" while loading so SR clients know the region's contents +// will change. Cleared on loaded/error so the new content is announced. +const ariaBusy = $derived(state.status === 'loading');