Add Navigation component and integrate it into multiple pages for consistent navigation

This commit is contained in:
Nils-Johan Gynther
2026-04-10 20:03:43 +02:00
parent 3dc63c0641
commit 8fce96e1ce
7 changed files with 95 additions and 4 deletions
+79
View File
@@ -0,0 +1,79 @@
import Link from 'next/link';
export default function Navigation() {
return (
<nav
style={{
background: '#f9f9f9',
borderBottom: '1px solid #ddd',
padding: '0.75rem 1rem',
display: 'flex',
gap: '0.5rem',
flexWrap: 'wrap',
marginBottom: '1.5rem',
alignItems: 'center',
}}
>
<Link
href="/"
style={{
padding: '0.5rem 0.75rem',
background: '#fff',
border: '1px solid #ddd',
borderRadius: '4px',
textDecoration: 'none',
color: '#0070f3',
fontSize: '0.9rem',
fontWeight: 500,
}}
>
🏠 Hem
</Link>
<Link
href="/inventory"
style={{
padding: '0.5rem 0.75rem',
background: '#fff',
border: '1px solid #ddd',
borderRadius: '4px',
textDecoration: 'none',
color: '#0070f3',
fontSize: '0.9rem',
fontWeight: 500,
}}
>
🛒 Varor
</Link>
<Link
href="/recipes"
style={{
padding: '0.5rem 0.75rem',
background: '#fff',
border: '1px solid #ddd',
borderRadius: '4px',
textDecoration: 'none',
color: '#0070f3',
fontSize: '0.9rem',
fontWeight: 500,
}}
>
📖 Recept
</Link>
<Link
href="/admin/products"
style={{
padding: '0.5rem 0.75rem',
background: '#fff',
border: '1px solid #ddd',
borderRadius: '4px',
textDecoration: 'none',
color: '#0070f3',
fontSize: '0.9rem',
fontWeight: 500,
}}
>
Admin
</Link>
</nav>
);
}
+3 -1
View File
@@ -2,12 +2,14 @@ import { fetchJson } from '../../../lib/api';
import type { Product } from '../../../features/inventory/types';
import MergePreviewForm from './MergePreviewForm';
import AdminProductList from './AdminProductList';
import Navigation from '../../Navigation';
export default async function AdminProductsPage() {
const products = await fetchJson<Product[]>('/api/products');
return (
<main style={{ padding: '1.5rem', maxWidth: '1100px', margin: '0 auto' }}>
<main style={{ padding: '1rem', maxWidth: '1100px', margin: '0 auto' }}>
<Navigation />
<h1 style={{ marginBottom: '1.5rem' }}>Admin: Produkter</h1>
<p>Här kan du granska och standardisera produktnamn.</p>
+3 -1
View File
@@ -4,6 +4,7 @@ import Link from 'next/link';
import { fetchJson } from '../../lib/api';
import type { InventoryItem, Product } from '../../features/inventory/types';
import InventoryList from './InventoryList';
import Navigation from '../Navigation';
function formatDate(value: string | null) {
if (!value) return null;
@@ -104,7 +105,8 @@ export default async function InventoryPage({ searchParams }: InventoryPageProps
];
return (
<main style={{ padding: '1.5rem', maxWidth: '1000px', margin: '0 auto' }}>
<main style={{ padding: '1rem', maxWidth: '1000px', margin: '0 auto' }}>
<Navigation />
<h1 style={{ marginBottom: '1.5rem' }}>Varor hemma</h1>
<ProductForm />
+3 -1
View File
@@ -1,8 +1,10 @@
import Link from 'next/link';
import Navigation from './Navigation';
export default function HomePage() {
return (
<main style={{ padding: '2rem', maxWidth: '700px', margin: '0 auto' }}>
<main style={{ padding: '1rem', maxWidth: '700px', margin: '0 auto' }}>
<Navigation />
<h1 style={{ marginBottom: '1.5rem' }}>Recipe App</h1>
<div style={{ display: 'grid', gap: '1rem' }}>
<Link href="/inventory" style={{ padding: '0.5rem', background: '#eee', borderRadius: '4px', textDecoration: 'none', color: '#222' }}>
+2
View File
@@ -5,6 +5,7 @@ import { useRouter, useParams } from 'next/navigation';
import { fetchJson } from '../../../../lib/api';
import { parseErrorResponse } from '../../../../lib/error-handler';
import type { Product, Recipe } from '../../../../features/inventory/types';
import Navigation from '../../../Navigation';
const MARKDOWN_HELP = `
**Fetstil:** **text** eller __text__
@@ -181,6 +182,7 @@ export default function EditRecipePage() {
return (
<main style={{ padding: '1rem', maxWidth: '1000px', margin: '0 auto' }}>
<Navigation />
<h1 style={{ marginBottom: '1rem' }}>Redigera recept</h1>
{error && <p style={{ color: 'crimson', backgroundColor: '#ffe5e5', padding: '0.75rem', borderRadius: '4px', marginBottom: '1rem' }}>{error}</p>}
@@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation';
import { fetchJson } from '../../../lib/api';
import { parseErrorResponse } from '../../../lib/error-handler';
import type { Product } from '../../../features/inventory/types';
import Navigation from '../../Navigation';
const MARKDOWN_HELP = `
**Fetstil:** **text** eller __text__
@@ -136,6 +137,7 @@ export default function CreateRecipePage() {
return (
<main style={{ padding: '1rem', maxWidth: '1000px', margin: '0 auto' }}>
<Navigation />
<h1 style={{ marginBottom: '1rem' }}>Lägg till nytt recept</h1>
{error && <p style={{ color: 'crimson', backgroundColor: '#ffe5e5', padding: '0.75rem', borderRadius: '4px', marginBottom: '1rem' }}>{error}</p>}
+3 -1
View File
@@ -2,12 +2,14 @@ import Link from 'next/link';
import { fetchJson } from '../../lib/api';
import type { Recipe } from '../../features/inventory/types';
import RecipePreview from './RecipePreview';
import Navigation from '../Navigation';
export default async function RecipesPage() {
const recipes = await fetchJson<Recipe[]>('/api/recipes');
return (
<main style={{ padding: '1.5rem', maxWidth: '1000px', margin: '0 auto' }}>
<main style={{ padding: '1rem', maxWidth: '1000px', margin: '0 auto' }}>
<Navigation />
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '1.5rem' }}>
<h1 style={{ margin: 0 }}>Recept</h1>
<Link