diff --git a/frontend/src/lib/geschichte/GeschichteEditor.svelte b/frontend/src/lib/geschichte/GeschichteEditor.svelte
index 3a562427..e7bb7daf 100644
--- a/frontend/src/lib/geschichte/GeschichteEditor.svelte
+++ b/frontend/src/lib/geschichte/GeschichteEditor.svelte
@@ -234,7 +234,12 @@ function exec(action: () => void) {
-
+
diff --git a/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts b/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts
index 66775f72..d47490c8 100644
--- a/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts
+++ b/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts
@@ -1,6 +1,7 @@
import { afterEach, describe, expect, it, vi } from 'vitest';
import { cleanup, render } from 'vitest-browser-svelte';
import { page, userEvent } from 'vitest/browser';
+import { m } from '$lib/paraglide/messages.js';
import GeschichteEditor from './GeschichteEditor.svelte';
const personFactory = (id: string, displayName: string) => ({
@@ -171,3 +172,36 @@ describe('GeschichteEditor — onSubmit payload', () => {
expect(payload.personIds).toEqual(['p1']);
});
});
+
+describe('GeschichteEditor — story document panel (#795)', () => {
+ it('shows the document panel with the story items when editing an existing story', async () => {
+ render(GeschichteEditor, {
+ geschichte: draftFactory({
+ items: [
+ {
+ id: 'i1',
+ position: 10,
+ document: {
+ id: 'd1',
+ title: 'Brief von Eugenie',
+ datePrecision: 'DAY' as const,
+ receiverCount: 0
+ }
+ }
+ ]
+ }),
+ onSubmit: vi.fn().mockResolvedValue(undefined)
+ });
+
+ await expect
+ .element(page.getByRole('heading', { name: m.geschichte_documents_heading() }))
+ .toBeInTheDocument();
+ await expect.element(page.getByText('Brief von Eugenie')).toBeInTheDocument();
+ });
+
+ it('hides the document panel when no geschichte is set (creation flow)', async () => {
+ render(GeschichteEditor, { onSubmit: vi.fn() });
+
+ expect(document.body.textContent).not.toContain(m.geschichte_documents_heading());
+ });
+});
diff --git a/frontend/src/lib/geschichte/GeschichteSidebar.svelte b/frontend/src/lib/geschichte/GeschichteSidebar.svelte
index a468ae76..53bf1020 100644
--- a/frontend/src/lib/geschichte/GeschichteSidebar.svelte
+++ b/frontend/src/lib/geschichte/GeschichteSidebar.svelte
@@ -1,14 +1,26 @@
@@ -62,4 +74,9 @@ const isDraft = $derived(status === 'DRAFT');
+
+
+ {#if geschichteId}
+
+ {/if}
diff --git a/frontend/src/lib/geschichte/GeschichteSidebar.svelte.spec.ts b/frontend/src/lib/geschichte/GeschichteSidebar.svelte.spec.ts
new file mode 100644
index 00000000..841a0da9
--- /dev/null
+++ b/frontend/src/lib/geschichte/GeschichteSidebar.svelte.spec.ts
@@ -0,0 +1,40 @@
+import { afterEach, describe, expect, it } from 'vitest';
+import { cleanup, render } from 'vitest-browser-svelte';
+import { page } from 'vitest/browser';
+import { m } from '$lib/paraglide/messages.js';
+import GeschichteSidebar from './GeschichteSidebar.svelte';
+
+const item = {
+ id: 'i1',
+ position: 10,
+ document: {
+ id: 'd1',
+ title: 'Brief von Eugenie',
+ datePrecision: 'DAY' as const,
+ receiverCount: 0
+ }
+};
+
+afterEach(() => cleanup());
+
+describe('GeschichteSidebar — document panel contract (#795)', () => {
+ it('renders the document panel when geschichteId and items are provided', async () => {
+ render(GeschichteSidebar, {
+ status: 'DRAFT',
+ selectedPersons: [],
+ geschichteId: 'g1',
+ items: [item]
+ });
+
+ await expect
+ .element(page.getByRole('heading', { name: m.geschichte_documents_heading() }))
+ .toBeInTheDocument();
+ await expect.element(page.getByText('Brief von Eugenie')).toBeInTheDocument();
+ });
+
+ it('does not render the document panel without geschichteId', async () => {
+ render(GeschichteSidebar, { status: 'DRAFT', selectedPersons: [] });
+
+ expect(document.body.textContent).not.toContain(m.geschichte_documents_heading());
+ });
+});
diff --git a/frontend/src/routes/geschichten/new/StoryCreate.svelte.spec.ts b/frontend/src/routes/geschichten/new/StoryCreate.svelte.spec.ts
new file mode 100644
index 00000000..9c387cb6
--- /dev/null
+++ b/frontend/src/routes/geschichten/new/StoryCreate.svelte.spec.ts
@@ -0,0 +1,16 @@
+import { afterEach, describe, expect, it, vi } from 'vitest';
+import { cleanup, render } from 'vitest-browser-svelte';
+import { m } from '$lib/paraglide/messages.js';
+
+vi.mock('$app/navigation', () => ({ beforeNavigate: vi.fn(), goto: vi.fn() }));
+import StoryCreate from './StoryCreate.svelte';
+
+afterEach(() => cleanup());
+
+describe('StoryCreate — document panel guard (#795)', () => {
+ it('renders without the document panel — documents attach after the first save', async () => {
+ render(StoryCreate, { initialPersons: [] });
+
+ expect(document.body.textContent).not.toContain(m.geschichte_documents_heading());
+ });
+});