diff --git a/frontend/src/lib/timeline/EventPill.svelte b/frontend/src/lib/timeline/EventPill.svelte
index b30420b2..55f274f3 100644
--- a/frontend/src/lib/timeline/EventPill.svelte
+++ b/frontend/src/lib/timeline/EventPill.svelte
@@ -21,6 +21,9 @@ const dateLabel = $derived(timelineDateLabel(entry.eventDate, entry.precision, e
const provenance = $derived(
entry.derived ? m.timeline_provenance_derived() : m.timeline_provenance_curated()
);
+// Provenance always shows; the date is an optional prefix so an undated event
+// still reads "abgeleitet"/"kuratiert" (REQ-007).
+const subtitle = $derived(dateLabel ? `${dateLabel} · ${provenance}` : provenance);
const canEdit = $derived(!entry.derived && entry.eventId != null);
@@ -46,9 +49,7 @@ const canEdit = $derived(!entry.derived && entry.eventId != null);
>{entry.title}
{/if}
- {#if dateLabel}
- {dateLabel} · {provenance}
- {/if}
+ {subtitle}
{#if canEdit}
{
expect(document.body.textContent).not.toContain('persönlich');
expect(document.body.textContent).not.toContain('SEASON');
});
+
+ it('still shows the provenance token when the event has no date label (REQ-007)', () => {
+ // An undated / UNKNOWN-precision event (e.g. in the undated bucket) yields a
+ // null dateLabel; provenance must not be gated behind the date.
+ const entry = makeEntry({
+ kind: 'EVENT',
+ derived: true,
+ derivedType: 'BIRTH',
+ title: 'Geburt: Hans',
+ senderName: '',
+ receiverName: '',
+ precision: 'UNKNOWN',
+ eventDate: undefined,
+ documentId: undefined
+ });
+ expect(timelineDateLabel(entry.eventDate, entry.precision, entry.eventDateEnd)).toBeNull();
+ render(EventPill, { entry });
+ expect(document.body.textContent).toContain(m.timeline_provenance_derived());
+ });
});