diff --git a/frontend/src/routes/korrespondenz/CorrespondentSuggestionsDropdown.svelte b/frontend/src/routes/briefwechsel/CorrespondentSuggestionsDropdown.svelte
similarity index 100%
rename from frontend/src/routes/korrespondenz/CorrespondentSuggestionsDropdown.svelte
rename to frontend/src/routes/briefwechsel/CorrespondentSuggestionsDropdown.svelte
diff --git a/frontend/src/routes/briefwechsel/CorrespondenzFilterControls.svelte b/frontend/src/routes/briefwechsel/CorrespondenzFilterControls.svelte
new file mode 100644
index 00000000..70d2ef45
--- /dev/null
+++ b/frontend/src/routes/briefwechsel/CorrespondenzFilterControls.svelte
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+ onapplyFilters()}
+ class="block w-full rounded-md border border-line bg-surface px-3 py-2.5 text-sm text-ink shadow-sm placeholder:text-ink-3 focus:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring"
+ />
+
+
+
+
+
+ onapplyFilters()}
+ class="block w-full rounded-md border border-line bg-surface px-3 py-2.5 text-sm text-ink shadow-sm placeholder:text-ink-3 focus:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring"
+ />
+
+
diff --git a/frontend/src/routes/briefwechsel/CorrespondenzHero.svelte b/frontend/src/routes/briefwechsel/CorrespondenzHero.svelte
new file mode 100644
index 00000000..e059370d
--- /dev/null
+++ b/frontend/src/routes/briefwechsel/CorrespondenzHero.svelte
@@ -0,0 +1,92 @@
+
+
+
+
+
+ {m.conv_empty_heading()}
+
+
+
+
+ {m.conv_hero_crosslink()}
+
+
+
+
+
+
+ {#if recentPersons.length > 0}
+
+
+
{m.conv_hero_divider()}
+
+
+
+
+
+ {m.conv_empty_recent_label()}
+
+
+ {#each recentPersons as person (person.id)}
+
+ {/each}
+
+
+ {/if}
+
diff --git a/frontend/src/routes/briefwechsel/CorrespondenzHero.svelte.spec.ts b/frontend/src/routes/briefwechsel/CorrespondenzHero.svelte.spec.ts
new file mode 100644
index 00000000..b3108334
--- /dev/null
+++ b/frontend/src/routes/briefwechsel/CorrespondenzHero.svelte.spec.ts
@@ -0,0 +1,50 @@
+import { afterEach, describe, expect, it, vi } from 'vitest';
+import { cleanup, render } from 'vitest-browser-svelte';
+import { page } from 'vitest/browser';
+import CorrespondenzHero from './CorrespondenzHero.svelte';
+
+vi.mock('$app/navigation', () => ({ goto: vi.fn() }));
+
+afterEach(cleanup);
+
+const noop = () => {};
+
+describe('CorrespondenzHero — headline and cross-link', () => {
+ it('renders the discovery headline', async () => {
+ render(CorrespondenzHero, { onSelectPerson: noop });
+ await expect.element(page.getByText(/Wessen Briefe möchten Sie lesen/i)).toBeInTheDocument();
+ });
+
+ it('renders a cross-link to the document search page', async () => {
+ render(CorrespondenzHero, { onSelectPerson: noop });
+ const link = page.getByRole('link', { name: /Zur Dokumentensuche/i });
+ await expect.element(link).toBeInTheDocument();
+ await expect.element(link).toHaveAttribute('href', '/');
+ });
+
+ it('renders a person typeahead input', async () => {
+ render(CorrespondenzHero, { onSelectPerson: noop });
+ await expect.element(page.getByTestId('conv-hero').getByRole('textbox')).toBeInTheDocument();
+ });
+});
+
+describe('CorrespondenzHero — recent persons', () => {
+ it('shows recent person chips when provided', async () => {
+ render(CorrespondenzHero, {
+ onSelectPerson: noop,
+ recentPersons: [{ id: 'r1', name: 'Clara Braun' }]
+ });
+ await expect.element(page.getByText('Clara Braun')).toBeInTheDocument();
+ });
+
+ it('calls onSelectPerson when a recent person chip is clicked', async () => {
+ const spy = vi.fn();
+ render(CorrespondenzHero, {
+ onSelectPerson: spy,
+ recentPersons: [{ id: 'r1', name: 'Clara Braun' }]
+ });
+ await expect.element(page.getByText('Clara Braun')).toBeInTheDocument();
+ document.querySelector
('[data-testid="recent-person-r1"]')!.click();
+ expect(spy).toHaveBeenCalledWith('r1');
+ });
+});
diff --git a/frontend/src/routes/briefwechsel/CorrespondenzPersonBar.svelte b/frontend/src/routes/briefwechsel/CorrespondenzPersonBar.svelte
new file mode 100644
index 00000000..62d67337
--- /dev/null
+++ b/frontend/src/routes/briefwechsel/CorrespondenzPersonBar.svelte
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
{ if (id) onapplyFilters(); }}
+ />
+
+
+
+
+
+
+
+
{
+ showSuggestions = false;
+ onapplyFilters();
+ }}
+ onfocused={handleCorrespondentFocused}
+ />
+ {#if showSuggestions && senderId && !receiverId}
+ (showSuggestions = false)}
+ />
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {m.conv_letters_count({ count: documentCount })}
+
+
diff --git a/frontend/src/routes/korrespondenz/SinglePersonHintBar.svelte b/frontend/src/routes/briefwechsel/SinglePersonHintBar.svelte
similarity index 91%
rename from frontend/src/routes/korrespondenz/SinglePersonHintBar.svelte
rename to frontend/src/routes/briefwechsel/SinglePersonHintBar.svelte
index 034e0284..ab867c4f 100644
--- a/frontend/src/routes/korrespondenz/SinglePersonHintBar.svelte
+++ b/frontend/src/routes/briefwechsel/SinglePersonHintBar.svelte
@@ -19,7 +19,7 @@ let toYear = $derived(toDate ? toDate.substring(0, 4) : '');