@@ -46,4 +51,14 @@ const historical = $derived(m.timeline_layer_historical_suffix());
· {historical}
+ {#if canEdit}
+
+ ✎
+ {m.btn_edit()}
+
+ {/if}
diff --git a/frontend/src/lib/timeline/WorldBand.svelte.spec.ts b/frontend/src/lib/timeline/WorldBand.svelte.spec.ts
index 6af574e6..f620a44a 100644
--- a/frontend/src/lib/timeline/WorldBand.svelte.spec.ts
+++ b/frontend/src/lib/timeline/WorldBand.svelte.spec.ts
@@ -73,4 +73,35 @@ describe('WorldBand', () => {
expect(pill?.textContent).not.toContain(m.timeline_layer_historical_suffix());
expect(document.body.textContent).toContain(m.timeline_layer_historical_suffix());
});
+
+ const HIST_EVENT_ID = '44444444-4444-4444-4444-444444444444';
+
+ it('shows an edit affordance for a curated HISTORICAL event when canWrite is true (REQ-006)', () => {
+ render(WorldBand, { canWrite: true, entry: historical({ eventId: HIST_EVENT_ID }) });
+ const edit = document.querySelector('[data-testid="event-edit"]') as HTMLAnchorElement | null;
+ expect(edit).not.toBeNull();
+ expect(edit?.getAttribute('href')).toBe(`/zeitstrahl/events/${HIST_EVENT_ID}/edit`);
+ });
+
+ it('mirrors the EventPill pencil: aria-hidden ✎ glyph + sr-only Bearbeiten label (REQ-006)', () => {
+ render(WorldBand, { canWrite: true, entry: historical({ eventId: HIST_EVENT_ID }) });
+ const edit = document.querySelector('[data-testid="event-edit"]');
+ expect(edit?.querySelector('[aria-hidden="true"]')?.textContent).toBe('✎');
+ expect(edit?.querySelector('.sr-only')?.textContent).toBe(m.btn_edit());
+ });
+
+ it('renders no edit affordance for a curated HISTORICAL event when canWrite is false (REQ-007)', () => {
+ render(WorldBand, { canWrite: false, entry: historical({ eventId: HIST_EVENT_ID }) });
+ expect(document.querySelector('[data-testid="event-edit"]')).toBeNull();
+ });
+
+ it('renders no edit affordance when the canWrite prop is omitted (gate-closed default) (REQ-007)', () => {
+ render(WorldBand, { entry: historical({ eventId: HIST_EVENT_ID }) });
+ expect(document.querySelector('[data-testid="event-edit"]')).toBeNull();
+ });
+
+ it('shows no edit affordance when eventId is null even with canWrite (REQ-008)', () => {
+ render(WorldBand, { canWrite: true, entry: historical({ eventId: undefined }) });
+ expect(document.querySelector('[data-testid="event-edit"]')).toBeNull();
+ });
});
diff --git a/frontend/src/lib/timeline/YearBand.svelte b/frontend/src/lib/timeline/YearBand.svelte
index 7a62147f..fafa0b4c 100644
--- a/frontend/src/lib/timeline/YearBand.svelte
+++ b/frontend/src/lib/timeline/YearBand.svelte
@@ -59,7 +59,7 @@ const rows = $derived.by