diff --git a/frontend/src/lib/components/document/ScopeCard.svelte b/frontend/src/lib/components/document/ScopeCard.svelte new file mode 100644 index 00000000..d0e7c5c7 --- /dev/null +++ b/frontend/src/lib/components/document/ScopeCard.svelte @@ -0,0 +1,35 @@ + + +
+ {#if variant === 'shared'} +
+ + Gilt für alle Dateien + + + {count} + +
+ {:else} +

Diese Datei

+ {/if} + {@render children?.()} +
diff --git a/frontend/src/lib/components/document/ScopeCard.svelte.spec.ts b/frontend/src/lib/components/document/ScopeCard.svelte.spec.ts new file mode 100644 index 00000000..51c4ae1b --- /dev/null +++ b/frontend/src/lib/components/document/ScopeCard.svelte.spec.ts @@ -0,0 +1,32 @@ +import { describe, it, expect, afterEach } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import { page } from 'vitest/browser'; +import ScopeCard from './ScopeCard.svelte'; + +afterEach(cleanup); + +describe('ScopeCard', () => { + it('per-file variant has mint background class', async () => { + const { container } = render(ScopeCard, { variant: 'per-file', count: 1 }); + const card = container.querySelector('[data-testid="scope-card"]'); + expect(card?.className).toMatch(/brand-mint/); + }); + + it('shared variant does not have mint background', async () => { + const { container } = render(ScopeCard, { variant: 'shared', count: 3 }); + const card = container.querySelector('[data-testid="scope-card"]'); + expect(card?.className).not.toMatch(/bg-brand-mint/); + }); + + it('shared variant renders count badge with file count', async () => { + render(ScopeCard, { variant: 'shared', count: 5 }); + await expect.element(page.getByText('5')).toBeInTheDocument(); + }); + + it('per-file variant renders slot content', async () => { + // ScopeCard is a container — verify it renders children + render(ScopeCard, { variant: 'per-file', count: 1 }); + const card = await page.getByTestId('scope-card'); + await expect.element(card).toBeInTheDocument(); + }); +});