diff --git a/frontend/src/lib/components/AnnotateHintStrip.svelte b/frontend/src/lib/components/AnnotateHintStrip.svelte
deleted file mode 100644
index e3ea7ab6..00000000
--- a/frontend/src/lib/components/AnnotateHintStrip.svelte
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-{#if annotateMode}
-
- {m.doc_panel_annotate()}
- {m.doc_panel_annotate_hint()}
-
-{/if}
diff --git a/frontend/src/lib/components/AnnotateHintStrip.svelte.spec.ts b/frontend/src/lib/components/AnnotateHintStrip.svelte.spec.ts
deleted file mode 100644
index 80f72c13..00000000
--- a/frontend/src/lib/components/AnnotateHintStrip.svelte.spec.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { describe, it, expect, afterEach } from 'vitest';
-import { cleanup, render } from 'vitest-browser-svelte';
-import { page } from 'vitest/browser';
-import AnnotateHintStrip from './AnnotateHintStrip.svelte';
-
-afterEach(cleanup);
-
-describe('AnnotateHintStrip', () => {
- it('is absent from the DOM when annotateMode is false', async () => {
- render(AnnotateHintStrip, { annotateMode: false });
- const strip = page.getByTestId('annotate-hint-strip');
- await expect.element(strip).not.toBeInTheDocument();
- });
-
- it('is present in the DOM when annotateMode is true', async () => {
- render(AnnotateHintStrip, { annotateMode: true });
- const strip = page.getByTestId('annotate-hint-strip');
- await expect.element(strip).toBeInTheDocument();
- });
-
- it('has hidden md:flex class to hide below 768px', async () => {
- render(AnnotateHintStrip, { annotateMode: true });
- const strip = page.getByTestId('annotate-hint-strip');
- await expect.element(strip).toHaveClass('hidden');
- await expect.element(strip).toHaveClass('md:flex');
- });
-});
diff --git a/frontend/src/lib/components/AnnotationCommentPanel.svelte b/frontend/src/lib/components/AnnotationCommentPanel.svelte
deleted file mode 100644
index d863e4a1..00000000
--- a/frontend/src/lib/components/AnnotationCommentPanel.svelte
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
-
-
- {m.comment_panel_title()}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {m.comment_panel_title()}
-
-
-
-
-
-
-
-
diff --git a/frontend/src/lib/components/AnnotationSidePanel.svelte b/frontend/src/lib/components/AnnotationSidePanel.svelte
deleted file mode 100644
index 28d292e4..00000000
--- a/frontend/src/lib/components/AnnotationSidePanel.svelte
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
diff --git a/frontend/src/lib/components/AnnotationSidePanel.svelte.spec.ts b/frontend/src/lib/components/AnnotationSidePanel.svelte.spec.ts
deleted file mode 100644
index 84745470..00000000
--- a/frontend/src/lib/components/AnnotationSidePanel.svelte.spec.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { describe, it, expect, vi, afterEach } from 'vitest';
-import { cleanup, render } from 'vitest-browser-svelte';
-import { page } from 'vitest/browser';
-import AnnotationSidePanel from './AnnotationSidePanel.svelte';
-
-afterEach(() => {
- cleanup();
- vi.restoreAllMocks();
-});
-
-vi.stubGlobal(
- 'fetch',
- vi.fn().mockResolvedValue({
- ok: true,
- json: async () => []
- })
-);
-
-const baseProps = {
- documentId: 'doc-1',
- activeAnnotationPage: 1,
- canComment: true,
- currentUserId: 'user-1',
- canAdmin: false,
- onClose: vi.fn()
-};
-
-describe('AnnotationSidePanel – visibility', () => {
- it('is hidden (translated off-screen) when activeAnnotationId is null', async () => {
- render(AnnotationSidePanel, { ...baseProps, activeAnnotationId: null });
- const panel = document.querySelector('[data-testid="annotation-side-panel"]');
- expect(panel?.classList.contains('translate-x-full')).toBe(true);
- expect(panel?.classList.contains('translate-x-0')).toBe(false);
- });
-
- it('is visible when activeAnnotationId is set', async () => {
- render(AnnotationSidePanel, { ...baseProps, activeAnnotationId: 'ann-1' });
- const panel = document.querySelector('[data-testid="annotation-side-panel"]');
- expect(panel?.classList.contains('translate-x-0')).toBe(true);
- expect(panel?.classList.contains('translate-x-full')).toBe(false);
- });
-});
-
-describe('AnnotationSidePanel – close button', () => {
- it('calls onClose when the close button is clicked', async () => {
- const onClose = vi.fn();
- render(AnnotationSidePanel, { ...baseProps, activeAnnotationId: 'ann-1', onClose });
- await page.getByRole('button', { name: /schließen/i }).click();
- expect(onClose).toHaveBeenCalledOnce();
- });
-});
-
-describe('AnnotationSidePanel – targetCommentId forwarding', () => {
- it('renders CommentThread when annotation is active', async () => {
- render(AnnotationSidePanel, {
- ...baseProps,
- activeAnnotationId: 'ann-1',
- targetCommentId: 'comment-42'
- });
- // CommentThread renders inside the panel when activeAnnotationId is set
- const panel = document.querySelector('[data-testid="annotation-side-panel"]');
- expect(panel).not.toBeNull();
- expect(panel?.classList.contains('translate-x-0')).toBe(true);
- });
-
- it('does not render CommentThread when annotation is null', async () => {
- render(AnnotationSidePanel, {
- ...baseProps,
- activeAnnotationId: null,
- targetCommentId: 'comment-42'
- });
- // Panel is hidden and no fetch should have been triggered for comments
- const panel = document.querySelector('[data-testid="annotation-side-panel"]');
- expect(panel?.classList.contains('translate-x-full')).toBe(true);
- });
-});
diff --git a/frontend/src/lib/components/CommentThread.svelte b/frontend/src/lib/components/CommentThread.svelte
index 4a1a4b13..f8e5495d 100644
--- a/frontend/src/lib/components/CommentThread.svelte
+++ b/frontend/src/lib/components/CommentThread.svelte
@@ -1,7 +1,7 @@
-
-{#snippet commentEntry(comment: Comment | CommentReply, threadId: string, showReplyButton: boolean)}
- {#if editingId === comment.id}
-
-
saveEdit(comment.id)}
- />
-
-
-
-
-
- {:else}
-
-
-
- {comment.authorName}
- {#if wasEdited(comment)}
- {timeAgo(comment.updatedAt)} {m.comment_edited_label()}
- {:else}
- {timeAgo(comment.createdAt)}
- {/if}
-
-
-
- {@html renderBody(comment.content, comment.mentionDTOs ?? [])}
-
-
- {#if canModify(comment)}
-
-
-
-
- {/if}
-
- {#if showReplyButton && canComment}
-
-
-
- {/if}
- {/if}
-{/snippet}
-
-
- {#each comments as thread, ti (thread.id)}
-
0 ? 'border-t border-line pt-4' : ''}>
-
-