# Visual Worksheet Editor - Architecture Documentation **Version:** 1.0 **Datum:** 2026-01-23 **Status:** Implementiert ## 1. Übersicht Der Visual Worksheet Editor ist ein Canvas-basierter Editor für die Erstellung und Bearbeitung von Arbeitsblättern. Er ermöglicht Lehrern, eingescannte Arbeitsblätter originalgetreu zu rekonstruieren oder neue Arbeitsblätter visuell zu gestalten. ### 1.1 Hauptfunktionen - **Canvas-basiertes Editieren** mit Fabric.js - **Freie Positionierung** von Text, Bildern und Formen - **Typografie-Steuerung** (Schriftarten, Größen, Stile) - **Bilder & Grafiken** hochladen und einfügen - **KI-generierte Bilder** via Ollama/Stable Diffusion - **PDF/Bild-Export** für Druck und digitale Nutzung - **Mehrseitige Dokumente** mit Seitennavigation ### 1.2 Technologie-Stack | Komponente | Technologie | Lizenz | |------------|-------------|--------| | Canvas-Bibliothek | Fabric.js 6.x | MIT | | PDF-Export | pdf-lib 1.17.x | MIT | | Frontend | Next.js / React | MIT | | Backend API | FastAPI | MIT | | KI-Bilder | Ollama + Stable Diffusion | Apache 2.0 / MIT | ## 2. Architektur ``` ┌──────────────────────────────────────────────────────────────────────┐ │ Frontend (studio-v2 / Next.js) │ │ /studio-v2/app/worksheet-editor/page.tsx │ │ │ │ ┌─────────────┐ ┌────────────────────────────┐ ┌────────────────┐ │ │ │ Toolbar │ │ Fabric.js Canvas │ │ Properties │ │ │ │ (Links) │ │ (Mitte - 60%) │ │ Panel │ │ │ │ │ │ │ │ (Rechts) │ │ │ │ - Select │ │ ┌──────────────────────┐ │ │ │ │ │ │ - Text │ │ │ │ │ │ - Schriftart │ │ │ │ - Formen │ │ │ A4 Arbeitsfläche │ │ │ - Größe │ │ │ │ - Bilder │ │ │ mit Grid │ │ │ - Farbe │ │ │ │ - KI-Bild │ │ │ │ │ │ - Position │ │ │ │ - Tabelle │ │ └──────────────────────┘ │ │ - Ebene │ │ │ └─────────────┘ └────────────────────────────┘ └────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Seiten-Navigation | Zoom | Grid | Export PDF │ │ │ └────────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────┐ │ klausur-service (FastAPI - Port 8086) │ │ POST /api/v1/worksheet/ai-image → Bild via Ollama generieren │ │ POST /api/v1/worksheet/save → Worksheet speichern │ │ GET /api/v1/worksheet/{id} → Worksheet laden │ │ POST /api/v1/worksheet/export-pdf → PDF generieren │ └──────────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────┐ │ Ollama (Port 11434) │ │ Model: stable-diffusion oder kompatibles Text-to-Image Modell │ │ Text-to-Image für KI-generierte Grafiken │ └──────────────────────────────────────────────────────────────────────┘ ``` ## 3. Dateistruktur ### 3.1 Frontend (studio-v2) ``` /studio-v2/ ├── app/ │ └── worksheet-editor/ │ ├── page.tsx # Haupt-Editor-Seite │ └── types.ts # TypeScript Interfaces │ ├── components/ │ └── worksheet-editor/ │ ├── index.ts # Exports │ ├── FabricCanvas.tsx # Fabric.js Canvas Wrapper │ ├── EditorToolbar.tsx # Werkzeugleiste (links) │ ├── PropertiesPanel.tsx # Eigenschaften-Panel (rechts) │ ├── AIImageGenerator.tsx # KI-Bild Generator Modal │ ├── CanvasControls.tsx # Zoom, Grid, Seiten │ ├── ExportPanel.tsx # PDF/Bild Export │ └── PageNavigator.tsx # Mehrseitige Dokumente │ ├── lib/ │ └── worksheet-editor/ │ ├── index.ts # Exports │ └── WorksheetContext.tsx # State Management ``` ### 3.2 Backend (klausur-service) ``` /klausur-service/backend/ ├── worksheet_editor_api.py # API Endpoints └── main.py # Router-Registrierung ``` ## 4. API Endpoints ### 4.1 KI-Bild generieren ```http POST /api/v1/worksheet/ai-image Content-Type: application/json { "prompt": "Ein freundlicher Cartoon-Hund der ein Buch liest", "style": "cartoon", "width": 512, "height": 512 } ``` **Response:** ```json { "image_base64": "data:image/png;base64,...", "prompt_used": "...", "error": null } ``` **Styles:** - `realistic` - Fotorealistisch - `cartoon` - Cartoon/Comic - `sketch` - Handgezeichnete Skizze - `clipart` - Einfache Clipart-Grafiken - `educational` - Bildungs-Illustrationen ### 4.2 Worksheet speichern ```http POST /api/v1/worksheet/save Content-Type: application/json { "id": "optional-existing-id", "title": "Englisch Vokabeln Unit 3", "pages": [ { "id": "page_1", "index": 0, "canvasJSON": "{...}" } ], "pageFormat": { "width": 210, "height": 297, "orientation": "portrait" } } ``` ### 4.3 Worksheet laden ```http GET /api/v1/worksheet/{id} ``` ### 4.4 PDF exportieren ```http POST /api/v1/worksheet/{id}/export-pdf ``` **Response:** PDF-Datei als Download ### 4.5 Worksheets auflisten ```http GET /api/v1/worksheet/list/all ``` ## 5. Komponenten ### 5.1 FabricCanvas Die Kernkomponente für den Canvas-Bereich: - **A4-Format**: 794 x 1123 Pixel (96 DPI) - **Grid-Overlay**: Optionales Raster mit Snap-Funktion - **Zoom/Pan**: Mausrad und Controls - **Selection**: Einzel- und Mehrfachauswahl - **Keyboard Shortcuts**: Del, Ctrl+C/V/Z/D ### 5.2 EditorToolbar Werkzeuge für die Bearbeitung: | Icon | Tool | Beschreibung | |------|------|--------------| | 🖱️ | Select | Elemente auswählen/verschieben | | T | Text | Text hinzufügen (IText) | | ▭ | Rechteck | Rechteck zeichnen | | ○ | Kreis | Kreis/Ellipse zeichnen | | ― | Linie | Linie zeichnen | | → | Pfeil | Pfeil zeichnen | | 🖼️ | Bild | Bild hochladen | | ✨ | KI-Bild | Bild mit KI generieren | | ⊞ | Tabelle | Tabelle einfügen | ### 5.3 PropertiesPanel Eigenschaften-Editor für ausgewählte Objekte: **Text-Eigenschaften:** - Schriftart (Arial, Times, Georgia, OpenDyslexic, Schulschrift) - Schriftgröße (8-120pt) - Schriftstil (Normal, Fett, Kursiv) - Zeilenhöhe, Zeichenabstand - Textausrichtung - Textfarbe **Form-Eigenschaften:** - Füllfarbe - Rahmenfarbe und -stärke - Eckenradius **Allgemein:** - Deckkraft - Löschen-Button ### 5.4 WorksheetContext React Context für globalen State: ```typescript interface WorksheetContextType { canvas: Canvas | null document: WorksheetDocument | null activeTool: EditorTool selectedObjects: FabricObject[] zoom: number showGrid: boolean snapToGrid: boolean currentPageIndex: number canUndo: boolean canRedo: boolean isDirty: boolean // ... Methoden } ``` ## 6. Datenmodelle ### 6.1 WorksheetDocument ```typescript interface WorksheetDocument { id: string title: string description?: string pages: WorksheetPage[] pageFormat: PageFormat createdAt: string updatedAt: string } ``` ### 6.2 WorksheetPage ```typescript interface WorksheetPage { id: string index: number canvasJSON: string // Serialisierter Fabric.js Canvas thumbnail?: string } ``` ### 6.3 PageFormat ```typescript interface PageFormat { width: number // in mm (Standard: 210) height: number // in mm (Standard: 297) orientation: 'portrait' | 'landscape' margins: { top, right, bottom, left: number } } ``` ## 7. Features ### 7.1 Undo/Redo - History-Stack mit max. 50 Einträgen - Automatische Speicherung bei jeder Änderung - Keyboard: Ctrl+Z (Undo), Ctrl+Y (Redo) ### 7.2 Grid & Snap - Konfigurierbares Raster (5mm, 10mm, 15mm, 20mm) - Snap-to-Grid beim Verschieben - Ein-/Ausblendbar ### 7.3 Export - **PDF**: Mehrseitig, A4-Format - **PNG**: Hochauflösend (2x Multiplier) - **JPG**: Mit Qualitätseinstellung ### 7.4 Speicherung - **Backend**: REST API mit JSON-Persistierung - **Fallback**: localStorage bei Offline-Betrieb ## 8. KI-Bildgenerierung ### 8.1 Ollama Integration Der Editor nutzt Ollama für die KI-Bildgenerierung: ```python OLLAMA_URL = "http://host.docker.internal:11434" ``` ### 8.2 Placeholder-System Falls Ollama nicht verfügbar ist, wird ein Placeholder-Bild generiert: - Farbcodiert nach Stil - Prompt-Text als Beschreibung - "KI-Bild (Platzhalter)"-Badge ### 8.3 Stil-Prompts Jeder Stil fügt automatisch Modifikatoren zum Prompt hinzu: ```python STYLE_PROMPTS = { "realistic": "photorealistic, high detail", "cartoon": "cartoon style, colorful, child-friendly", "sketch": "pencil sketch, hand-drawn", "clipart": "clipart style, flat design", "educational": "educational illustration, textbook style" } ``` ## 9. Glassmorphism Design Der Editor folgt dem Glassmorphism-Design des Studio v2: ```typescript // Dark Theme 'backdrop-blur-xl bg-white/10 border border-white/20' // Light Theme 'backdrop-blur-xl bg-white/70 border border-black/10 shadow-xl' ``` ## 10. Internationalisierung Unterstützte Sprachen: - 🇩🇪 Deutsch - 🇬🇧 English - 🇹🇷 Türkçe - 🇸🇦 العربية (RTL) - 🇷🇺 Русский - 🇺🇦 Українська - 🇵🇱 Polski Translation Key: `nav_worksheet_editor` ## 11. Sicherheit ### 11.1 Bild-Upload - Nur Bildformate (image/*) - Client-seitige Validierung - Base64-Konvertierung ### 11.2 CORS Aktiviert für lokale Entwicklung und Docker-Umgebung. ## 12. Deployment ### 12.1 Frontend ```bash cd studio-v2 npm install npm run dev # Port 3001 ``` ### 12.2 Backend Der klausur-service läuft auf Port 8086: ```bash cd klausur-service/backend python main.py ``` ### 12.3 Docker Der Service ist Teil des docker-compose.yml. ## 13. Zukünftige Erweiterungen - [ ] Tabellen-Tool mit Zellbearbeitung - [ ] Vorlagen-Bibliothek - [ ] Kollaboratives Editieren - [ ] Drag & Drop aus Dokumentenbibliothek - [ ] Integration mit Vocab-Worksheet