diff --git a/frontend/src/lib/nav/MobileTabBar.svelte b/frontend/src/lib/nav/MobileTabBar.svelte
new file mode 100644
index 0000000..27f8a39
--- /dev/null
+++ b/frontend/src/lib/nav/MobileTabBar.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/frontend/src/lib/nav/MobileTabBar.test.ts b/frontend/src/lib/nav/MobileTabBar.test.ts
new file mode 100644
index 0000000..a0f5a29
--- /dev/null
+++ b/frontend/src/lib/nav/MobileTabBar.test.ts
@@ -0,0 +1,47 @@
+import { describe, it, expect, vi } from 'vitest';
+import { render, screen } from '@testing-library/svelte';
+import MobileTabBar from './MobileTabBar.svelte';
+
+vi.mock('$app/stores', () => {
+ const { readable } = require('svelte/store');
+ return {
+ page: readable({ url: new URL('http://localhost/planner') })
+ };
+});
+
+describe('MobileTabBar', () => {
+ it('renders 4 nav items', () => {
+ render(MobileTabBar);
+ const links = screen.getAllByRole('link');
+ expect(links).toHaveLength(4);
+ });
+
+ it('renders correct labels', () => {
+ render(MobileTabBar);
+ expect(screen.getByText('Planer')).toBeInTheDocument();
+ expect(screen.getByText('Rezepte')).toBeInTheDocument();
+ expect(screen.getByText('Einkauf')).toBeInTheDocument();
+ expect(screen.getByText('Einstellungen')).toBeInTheDocument();
+ });
+
+ it('links have correct hrefs', () => {
+ render(MobileTabBar);
+ const links = screen.getAllByRole('link');
+ expect(links[0]).toHaveAttribute('href', '/planner');
+ expect(links[1]).toHaveAttribute('href', '/recipes');
+ expect(links[2]).toHaveAttribute('href', '/shopping');
+ expect(links[3]).toHaveAttribute('href', '/settings');
+ });
+
+ it('marks active item with aria-current="page"', () => {
+ render(MobileTabBar);
+ const plannerLink = screen.getByRole('link', { name: /planer/i });
+ expect(plannerLink).toHaveAttribute('aria-current', 'page');
+ });
+
+ it('non-active items do not have aria-current', () => {
+ render(MobileTabBar);
+ const recipesLink = screen.getByRole('link', { name: /rezepte/i });
+ expect(recipesLink).not.toHaveAttribute('aria-current');
+ });
+});
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
new file mode 100644
index 0000000..0b805cb
--- /dev/null
+++ b/frontend/vite.config.ts
@@ -0,0 +1,16 @@
+import { sveltekit } from '@sveltejs/kit/vite';
+import { defineConfig } from 'vitest/config';
+import tailwindcss from '@tailwindcss/vite';
+
+export default defineConfig({
+ plugins: [tailwindcss(), sveltekit()],
+ test: {
+ include: ['src/**/*.{test,spec}.{js,ts}'],
+ globals: true,
+ environment: 'jsdom',
+ setupFiles: ['src/test-setup.ts']
+ },
+ resolve: {
+ conditions: ['browser']
+ }
+});