Restaurant Speisekarte

Docs & Code reference

Component Architecture

Overview

The Restaurant Speisekarte application is built using a component-based architecture with three main interactive components, each responsible for specific functionality within the menu system.

Component Hierarchy

App (index.js)
├── Header (Banner)
├── Kategorien (Category Filter)
├── SuchtLeiste (Search Bar)
└── Section (Menu Display)
    └── Karten[] (Menu Cards)

Core Components

1. Kategorien Component

Location: /src/components/kategorien/ Purpose: Category filtering interface

<Kategorien 
  griffFilter={griffFilter} 
  knopftGetippt={knopftGetippt} 
/>

Responsibilities:

Categories Supported:

2. SuchtLeiste Component

Location: /src/components/suchtleiste/ Purpose: Real-time search functionality

<SuchtLeiste 
  textSuchtGetippt={textSuchtGetippt}
  griffSucht={griffSucht} 
/>

Responsibilities:

3. Karten Component

Location: /src/components/karten/ Purpose: Individual menu item display

<Karten 
  produkt={produkt} 
/>

Responsibilities:

Component Communication Patterns

Parent-Child Communication

Index.js (Parent)
    ↓ (props)
Components (Children)
    ↑ (callbacks)
Index.js (Parent)

Data Flow Example

  1. User Action: Clicks "Getränken" category button
  2. Event Handling: griffFilter("Getränken") called
  3. State Update: setgefiltertDaten(filterProdukte("Getränken"))
  4. Re-render: Components update with filtered data

State Management Pattern

// Parent component state
const [gefiltertDaten, setgefiltertDaten] = useState(produkteVorspeise);
const [textSuchtGetippt, setTextSuchtGetippt] = useState("");
const [knopftGetippt, setKnopfGetippt] = useState("Vorspeise");

// Event handlers
const griffSucht = (textGetippt) => {
  setTextSuchtGetippt(textGetippt);
  textGetippt.length >= 3 && setgefiltertDaten(suchtProdukt(textGetippt));
  setKnopfGetippt("");
};

const griffFilter = (kategorie) => {
  setTextSuchtGetippt("");
  setgefiltertDaten(filterProdukte(kategorie));
  setKnopfGetippt(kategorie);
};

Component Styling Architecture

CSS Modules Pattern

Each component has its own CSS module file:

Style Isolation

import styles from "./karten.module.css";

<div className={styles.container}>
  <figure>
    <Image src={produkt.bild} alt={produkt.name} />
  </figure>
  <div className={styles.container_info}>
    // Component content
  </div>
</div>

Component Props Interface

Kategorien Props

interface KategorienProps {
  griffFilter: (kategorie: string) => void;
  knopftGetippt: string;
}

SuchtLeiste Props

interface SuchtLeisteProps {
  textSuchtGetippt: string;
  griffSucht: (text: string) => void;
}

Karten Props

interface KartenProps {
  produkt: {
    id: number;
    name: string;
    kategorie: string;
    preis: number;
    beschreibung: string;
    bild: StaticImageData;
  };
}

Performance Considerations

Image Optimization

Component Rendering

Component Testing Strategy

Unit Testing Approach

Integration Testing


-Related Documentation: Related Documentation: