diff --git a/frontend/src/routes/(app)/recipes/[id]/+page.svelte b/frontend/src/routes/(app)/recipes/[id]/+page.svelte
new file mode 100644
index 0000000..2c19e8a
--- /dev/null
+++ b/frontend/src/routes/(app)/recipes/[id]/+page.svelte
@@ -0,0 +1,38 @@
+
+
+
+ {data.recipe.name} — Mealplan
+
+
+
diff --git a/frontend/src/routes/(app)/recipes/[id]/page.test.ts b/frontend/src/routes/(app)/recipes/[id]/page.test.ts
new file mode 100644
index 0000000..f599700
--- /dev/null
+++ b/frontend/src/routes/(app)/recipes/[id]/page.test.ts
@@ -0,0 +1,69 @@
+import { describe, it, expect } from 'vitest';
+import { render, screen } from '@testing-library/svelte';
+import Page from './+page.svelte';
+
+const mockData = {
+ recipe: {
+ id: 'r1',
+ name: 'Spaghetti Bolognese',
+ serves: 4,
+ cookTimeMin: 30,
+ effort: 'Easy',
+ heroImageUrl: undefined as string | undefined,
+ ingredients: [
+ { ingredientId: 'i1', name: 'Spaghetti', quantity: 200, unit: 'g' },
+ { ingredientId: 'i2', name: 'Hackfleisch', quantity: 400, unit: 'g' }
+ ],
+ steps: [
+ { stepNumber: 1, instruction: 'Wasser aufsetzen' },
+ { stepNumber: 2, instruction: 'Sauce zubereiten' }
+ ],
+ tags: [{ id: 't1', name: 'Pasta', tagType: 'category' }]
+ }
+};
+
+describe('recipe detail page', () => {
+ it('renders the recipe name', () => {
+ render(Page, { props: { data: mockData } });
+ expect(screen.getByText('Spaghetti Bolognese')).toBeInTheDocument();
+ });
+
+ it('renders page title', () => {
+ render(Page, { props: { data: mockData } });
+ expect(document.title).toBe('Spaghetti Bolognese — Mealplan');
+ });
+
+ it('renders back link to /recipes', () => {
+ render(Page, { props: { data: mockData } });
+ const backLink = screen.getByRole('link', { name: /zurück/i });
+ expect(backLink).toHaveAttribute('href', '/recipes');
+ });
+
+ it('renders cook now link to /cook/[id]', () => {
+ render(Page, { props: { data: mockData } });
+ const cookLink = screen.getByRole('link', { name: /jetzt kochen/i });
+ expect(cookLink).toHaveAttribute('href', '/cook/r1');
+ });
+
+ it('renders ingredients section heading', () => {
+ render(Page, { props: { data: mockData } });
+ expect(screen.getByText(/zutaten/i)).toBeInTheDocument();
+ });
+
+ it('renders steps section heading', () => {
+ render(Page, { props: { data: mockData } });
+ expect(screen.getByText(/zubereitung/i)).toBeInTheDocument();
+ });
+
+ it('renders ingredient names', () => {
+ render(Page, { props: { data: mockData } });
+ expect(screen.getByText('Spaghetti')).toBeInTheDocument();
+ expect(screen.getByText('Hackfleisch')).toBeInTheDocument();
+ });
+
+ it('renders step instructions', () => {
+ render(Page, { props: { data: mockData } });
+ expect(screen.getByText('Wasser aufsetzen')).toBeInTheDocument();
+ expect(screen.getByText('Sauce zubereiten')).toBeInTheDocument();
+ });
+});