diff --git a/frontend/src/lib/auth/BrandPanel.svelte b/frontend/src/lib/auth/BrandPanel.svelte
new file mode 100644
index 0000000..a28d8ab
--- /dev/null
+++ b/frontend/src/lib/auth/BrandPanel.svelte
@@ -0,0 +1,32 @@
+
+
+
+
🥗
+
+
+ Mealprep
+
+
+
+ Plan meals, eat well, waste less
+
+
+
+ {#each [{ emoji: '📅', label: 'Plan' }, { emoji: '🍳', label: 'Cook' }, { emoji: '🛒', label: 'Shop' }] as feature (feature.label)}
+
+ {feature.emoji}
+ {feature.label}
+
+ {/each}
+
+
diff --git a/frontend/src/lib/auth/BrandPanel.test.ts b/frontend/src/lib/auth/BrandPanel.test.ts
new file mode 100644
index 0000000..38b9dd3
--- /dev/null
+++ b/frontend/src/lib/auth/BrandPanel.test.ts
@@ -0,0 +1,34 @@
+import { describe, it, expect } from 'vitest';
+import { render, screen } from '@testing-library/svelte';
+import BrandPanel from './BrandPanel.svelte';
+
+describe('BrandPanel', () => {
+ it('renders the app name', () => {
+ render(BrandPanel);
+ expect(screen.getByText('Mealprep')).toBeInTheDocument();
+ });
+
+ it('renders the tagline', () => {
+ render(BrandPanel);
+ expect(screen.getByText('Plan meals, eat well, waste less')).toBeInTheDocument();
+ });
+
+ it('renders the logo emoji', () => {
+ render(BrandPanel);
+ expect(screen.getByText('🥗')).toBeInTheDocument();
+ });
+
+ it('renders three feature icons with labels', () => {
+ render(BrandPanel);
+ expect(screen.getByText('Plan')).toBeInTheDocument();
+ expect(screen.getByText('Cook')).toBeInTheDocument();
+ expect(screen.getByText('Shop')).toBeInTheDocument();
+ });
+
+ it('renders feature emojis', () => {
+ render(BrandPanel);
+ expect(screen.getByText('📅')).toBeInTheDocument();
+ expect(screen.getByText('🍳')).toBeInTheDocument();
+ expect(screen.getByText('🛒')).toBeInTheDocument();
+ });
+});