diff --git a/frontend/src/lib/nav/TabletNavBar.svelte b/frontend/src/lib/nav/TabletNavBar.svelte
new file mode 100644
index 0000000..3e5e63f
--- /dev/null
+++ b/frontend/src/lib/nav/TabletNavBar.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/frontend/src/lib/nav/TabletNavBar.test.ts b/frontend/src/lib/nav/TabletNavBar.test.ts
new file mode 100644
index 0000000..3f20529
--- /dev/null
+++ b/frontend/src/lib/nav/TabletNavBar.test.ts
@@ -0,0 +1,38 @@
+import { describe, it, expect, vi } from 'vitest';
+import { render, screen } from '@testing-library/svelte';
+import TabletNavBar from './TabletNavBar.svelte';
+
+vi.mock('$app/stores', () => {
+ const { readable } = require('svelte/store');
+ return {
+ page: readable({ url: new URL('http://localhost/planner') })
+ };
+});
+
+describe('TabletNavBar', () => {
+ it('renders 4 nav items', () => {
+ render(TabletNavBar);
+ const links = screen.getAllByRole('link');
+ expect(links).toHaveLength(4);
+ });
+
+ it('renders correct labels', () => {
+ render(TabletNavBar);
+ expect(screen.getByText('Planer')).toBeInTheDocument();
+ expect(screen.getByText('Rezepte')).toBeInTheDocument();
+ expect(screen.getByText('Einkauf')).toBeInTheDocument();
+ expect(screen.getByText('Einstellungen')).toBeInTheDocument();
+ });
+
+ it('marks active item with aria-current="page"', () => {
+ render(TabletNavBar);
+ const plannerLink = screen.getByRole('link', { name: /planer/i });
+ expect(plannerLink).toHaveAttribute('aria-current', 'page');
+ });
+
+ it('renders as horizontal pill navigation', () => {
+ render(TabletNavBar);
+ const nav = screen.getByLabelText('Hauptnavigation');
+ expect(nav).toBeInTheDocument();
+ });
+});