fruchtfolge-app / index.html
UnSinnlos's picture
Plan: Fruchtfolge-App (Standalone, mit eingebauten Daten) 1. Struktur der Anwendung Frontend (React oder React Native) Auswahlmenü für Gemüse (Dropdown + Suche) Button: „Fruchtfolgevorschlag“ Modal/Seite für Vorschläge (Gemüse oder Gründüngung) Bei Gründüngung: zusätzlich Dropdown für Bodenzustand Ergebnisanzeige: Vorschlag(e) + Begründung + Mischungsprozente Backend-Logik (eingebettet im Frontend oder als kleines Modul) Keine externe Datenbank Alle Gemüse-Infos + Gründüngungen + Regeln im Code als statische Listen / Objekte Einfacher Regel-Matcher: Gemüse-Vorschläge = andere Familie, anderer Nährstoffbedarf Gründüngung-Vorschläge = je nach Bodenzustand + Ziel (locker, N-Aufbau, Unkrautunterdrückung etc.) 2. Eingebaute Daten Gemüse (Beispiele für eine erste Version — ca. 25 Stück) const vegetables = [ { id: 1, name: "Tomate", family: "Solanaceae", nutrient: "stark", root: "tief" }, { id: 2, name: "Kartoffel", family: "Solanaceae", nutrient: "stark", root: "mittel" }, { id: 3, name: "Paprika", family: "Solanaceae", nutrient: "stark", root: "mittel" }, { id: 4, name: "Gurke", family: "Cucurbitaceae", nutrient: "stark", root: "flach" }, { id: 5, name: "Zucchini", family: "Cucurbitaceae", nutrient: "stark", root: "flach" }, { id: 6, name: "Karotte", family: "Apiaceae", nutrient: "mittel", root: "tief" }, { id: 7, name: "Sellerie", family: "Apiaceae", nutrient: "mittel", root: "tief" }, { id: 8, name: "Petersilie", family: "Apiaceae", nutrient: "schwach", root: "tief" }, { id: 9, name: "Kohl (Weißkohl)", family: "Brassicaceae", nutrient: "stark", root: "mittel" }, { id: 10, name: "Brokkoli", family: "Brassicaceae", nutrient: "stark", root: "mittel" }, { id: 11, name: "Radieschen", family: "Brassicaceae", nutrient: "schwach", root: "flach" }, { id: 12, name: "Salat", family: "Asteraceae", nutrient: "schwach", root: "flach" }, { id: 13, name: "Spinat", family: "Amaranthaceae", nutrient: "schwach", root: "flach" }, { id: 14, name: "Mangold", family: "Amaranthaceae", nutrient: "mittel", root: "flach" }, { id: 15, name: "Zwiebel", family: "Amaryllidaceae", nutrient: "mittel", root: "flach" }, { id: 16, name: "Lauch", family: "Amaryllidaceae", nutrient: "mittel", root: "tief" }, { id: 17, name: "Knoblauch", family: "Amaryllidaceae", nutrient: "mittel", root: "flach" }, { id: 18, name: "Bohne (Buschbohne)", family: "Fabaceae", nutrient: "schwach", root: "mittel" }, { id: 19, name: "Erbse", family: "Fabaceae", nutrient: "schwach", root: "mittel" }, { id: 20, name: "Ackerbohne", family: "Fabaceae", nutrient: "mittel", root: "tief" }, { id: 21, name: "Mais", family: "Poaceae", nutrient: "stark", root: "tief" }, { id: 22, name: "Kürbis", family: "Cucurbitaceae", nutrient: "stark", root: "flach" }, { id: 23, name: "Rote Bete", family: "Amaranthaceae", nutrient: "mittel", root: "tief" }, { id: 24, name: "Fenchel", family: "Apiaceae", nutrient: "mittel", root: "tief" }, { id: 25, name: "Kohlrabi", family: "Brassicaceae", nutrient: "mittel", root: "flach" } ]; Gründüngung (mit Eigenschaften) const greenManures = [ { id: 1, name: "Phacelia", traits: ["schnellwüchsig","unkrautunterdrückend","humusfördernd"], tolerances: ["locker","sandig","unkrautlastig"] }, { id: 2, name: "Buchweizen", traits: ["schnell","unkrautunterdrückend"], tolerances: ["locker","sandig","sauer"] }, { id: 3, name: "Ölrettich", traits: ["tiefwurzelnd","lockernd"], tolerances: ["verdichtet","lehmigtonig"] }, { id: 4, name: "Weißklee", traits: ["dauerhaft","N-Fixierer"], tolerances: ["locker","nährstoffarm"] }, { id: 5, name: "Rotklee", traits: ["N-Fixierer","humusfördernd"], tolerances: ["nährstoffarm","lehmigtonig"] }, { id: 6, name: "Perserklee", traits: ["kurzlebig","N-Fixierer"], tolerances: ["locker","sandig"] }, { id: 7, name: "Ackerbohne", traits: ["tiefwurzelnd","N-Fixierer"], tolerances: ["nährstoffarm","verdichtet"] }, { id: 8, name: "Wicke", traits: ["N-Fixierer"], tolerances: ["nährstoffarm"] }, { id: 9, name: "Hafer", traits: ["stützpflanze","biomasse"], tolerances: ["locker","sandig","unkrautlastig"] }, { id: 10, name: "Roggen", traits: ["winterhart","biomasse"], tolerances: ["lehmigtonig","sauer","nass"] }, { id: 11, name: "Lupine", traits: ["tiefwurzelnd","N-Fixierer"], tolerances: ["sandig","nährstoffarm"] }, { id: 12, name: "Senf", traits: ["schnellwüchsig","unkrautunterdrückend"], tolerances: ["unkrautlastig","locker"] } ]; Bodenzustände (fixe Liste) const soilStates = [ "Unbekannt", "locker humusreich", "stark verdichtet", "nährstoffarm", "nass", "staunässe", "sandig", "geringe Wasserhaltefähigkeit", "lehmigtonig", "sehr sauer", "unkrautlastig" ]; 3. Beispiel-Regeln (eingebaut im Code) Gemüse → Gemüse Keine gleiche Familie direkt nacheinander Starkzehrer → danach Schwach- oder Mittelzehrer Wechsel Flachwurzler ↔ Tiefwurzler bevorzugen Gemüse → Gründüngung Wenn „Gründung“ gewählt → schaue Bodenzustand: „verdichtet“ → Ölrettich + Lupine „sandig“ → Lupine + Buchweizen „unkrautlastig“ → Phacelia + Buchweizen oder Senf „nährstoffarm“ → Kleearten oder Wicke + Hafer (60/40 Mischung) „sehr sauer“ → Buchweizen oder Roggen „lehmigtonig“ → Roggen + Klee Mischung „staunässe“ → Hinweis: Gründüngung schwierig, Roggen bedingt möglich Standard („Unbekannt“) → Roggen + Klee (Allrounder) 4. Beispiel-Ablauf (in App) Nutzer wählt: Tomate Klick: Fruchtfolgevorschlag App zeigt: Gemüse: „Buschbohne (andere Familie, N-Fixierer, Schwachzehrer)“ Gründüngung: „Wicke + Hafer (60/40, N-Aufbau + Biomasse)“ Wenn Nutzer Gründung wählt → Dropdown „Bodenzustand“ → z. B. „verdichtet“ → Ergebnis: Ölrettich (20 %) + Lupine (80 %) Begründung: „Tiefwurzler lösen Verdichtungen, Lupine verbessert Nährstoffversorgung“ 5. Vorteile dieser Lösung Keine externe Datenbank nötig → läuft offline Alles (Gemüse, Gründüngung, Regeln) fix im Code eingebaut Leicht zu erweitern (nur neue Objekte in Arrays hinzufügen) - Initial Deployment
e34b0b3 verified
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fruchtfolge-App</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.fade-in {
animation: fadeIn 0.3s ease-in-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.vegetable-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}
.green-manure-tag {
transition: all 0.2s ease;
}
.green-manure-tag:hover {
transform: scale(1.05);
}
/* Custom scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
</style>
</head>
<body class="bg-green-50 min-h-screen">
<div class="container mx-auto px-4 py-8">
<!-- Header -->
<header class="mb-10 text-center">
<h1 class="text-4xl md:text-5xl font-bold text-green-800 mb-2">
<i class="fas fa-leaf text-green-600 mr-2"></i>Fruchtfolge-App
</h1>
<p class="text-lg text-gray-600 max-w-2xl mx-auto">
Finden Sie die perfekte Fruchtfolge für Ihren Garten basierend auf wissenschaftlichen Prinzipien
</p>
</header>
<!-- Main Content -->
<main class="max-w-4xl mx-auto">
<!-- Selection Section -->
<div class="bg-white rounded-xl shadow-md p-6 mb-8">
<div class="flex flex-col md:flex-row gap-4 mb-6">
<div class="flex-1">
<label for="vegetable-select" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-carrot text-orange-500 mr-1"></i> Gemüse auswählen
</label>
<div class="relative">
<select id="vegetable-select" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-green-500">
<option value="" disabled selected>Gemüse auswählen...</option>
<!-- Options will be populated by JavaScript -->
</select>
</div>
</div>
<div class="flex-1">
<label for="soil-select" class="block text-sm font-medium text-gray-700 mb-1">
<i class="fas fa-seedling text-green-600 mr-1"></i> Bodenzustand (für Gründüngung)
</label>
<div class="relative">
<select id="soil-select" class="w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-green-500">
<option value="Unbekannt" selected>Unbekannt (Standard)</option>
<!-- Options will be populated by JavaScript -->
</select>
</div>
</div>
</div>
<div class="flex flex-col sm:flex-row gap-3 justify-center">
<button id="vegetable-suggestion-btn" class="bg-green-600 hover:bg-green-700 text-white font-medium py-3 px-6 rounded-lg transition flex items-center justify-center gap-2">
<i class="fas fa-lightbulb"></i> Gemüse-Vorschlag
</button>
<button id="manure-suggestion-btn" class="bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-6 rounded-lg transition flex items-center justify-center gap-2">
<i class="fas fa-spa"></i> Gründüngungs-Vorschlag
</button>
</div>
</div>
<!-- Results Section -->
<div id="results-section" class="hidden bg-white rounded-xl shadow-md p-6 mb-8 fade-in">
<div class="flex justify-between items-center mb-4">
<h2 class="text-2xl font-bold text-gray-800">
<i class="fas fa-clipboard-list text-green-600 mr-2"></i>Vorschläge
</h2>
<button id="clear-results" class="text-gray-500 hover:text-gray-700">
<i class="fas fa-times"></i> Zurücksetzen
</button>
</div>
<div id="vegetable-results" class="mb-6 hidden">
<h3 class="text-lg font-semibold text-gray-700 mb-3 flex items-center">
<i class="fas fa-carrot text-orange-500 mr-2"></i> Empfohlene Folgegemüse
</h3>
<div id="vegetable-suggestions" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<!-- Vegetable suggestions will be populated here -->
</div>
</div>
<div id="manure-results" class="hidden">
<h3 class="text-lg font-semibold text-gray-700 mb-3 flex items-center">
<i class="fas fa-spa text-green-500 mr-2"></i> Empfohlene Gründüngung
</h3>
<div id="manure-suggestions" class="space-y-4">
<!-- Green manure suggestions will be populated here -->
</div>
</div>
</div>
<!-- Information Section -->
<div class="bg-white rounded-xl shadow-md p-6">
<h2 class="text-2xl font-bold text-gray-800 mb-4">
<i class="fas fa-info-circle text-blue-500 mr-2"></i>Informationen
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h3 class="text-lg font-semibold text-gray-700 mb-2">Warum Fruchtfolge?</h3>
<p class="text-gray-600 mb-4">
Eine gute Fruchtfolge verbessert die Bodengesundheit, reduziert Schädlinge und Krankheiten, und optimiert die Nährstoffnutzung.
</p>
<ul class="space-y-2 text-gray-600">
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>Wechsel zwischen verschiedenen Pflanzenfamilien</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>Abwechselnd starke und schwache Nährstoffzehrer</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i>
<span>Wechsel zwischen tief- und flachwurzelnden Pflanzen</span>
</li>
</ul>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-700 mb-2">Vorteile von Gründüngung</h3>
<p class="text-gray-600 mb-4">
Gründüngungspflanzen verbessern die Bodenstruktur, erhöhen den Humusgehalt und können Stickstoff binden.
</p>
<div class="grid grid-cols-2 gap-2">
<span class="green-manure-tag bg-green-100 text-green-800 text-sm px-3 py-1 rounded-full flex items-center">
<i class="fas fa-lock-open text-green-600 mr-1"></i> Bodenlockerung
</span>
<span class="green-manure-tag bg-blue-100 text-blue-800 text-sm px-3 py-1 rounded-full flex items-center">
<i class="fas fa-atom text-blue-600 mr-1"></i> N-Fixierung
</span>
<span class="green-manure-tag bg-purple-100 text-purple-800 text-sm px-3 py-1 rounded-full flex items-center">
<i class="fas fa-seedling text-purple-600 mr-1"></i> Unkrautunterdrückung
</span>
<span class="green-manure-tag bg-yellow-100 text-yellow-800 text-sm px-3 py-1 rounded-full flex items-center">
<i class="fas fa-layer-group text-yellow-600 mr-1"></i> Humusaufbau
</span>
</div>
</div>
</div>
</div>
</main>
<!-- Footer -->
<footer class="mt-12 text-center text-gray-500 text-sm">
<p>© 2023 Fruchtfolge-App | Entwickelt für nachhaltige Landwirtschaft</p>
</footer>
</div>
<script>
// Data from the plan
const vegetables = [
{ id: 1, name: "Tomate", family: "Solanaceae", nutrient: "stark", root: "tief" },
{ id: 2, name: "Kartoffel", family: "Solanaceae", nutrient: "stark", root: "mittel" },
{ id: 3, name: "Paprika", family: "Solanaceae", nutrient: "stark", root: "mittel" },
{ id: 4, name: "Gurke", family: "Cucurbitaceae", nutrient: "stark", root: "flach" },
{ id: 5, name: "Zucchini", family: "Cucurbitaceae", nutrient: "stark", root: "flach" },
{ id: 6, name: "Karotte", family: "Apiaceae", nutrient: "mittel", root: "tief" },
{ id: 7, name: "Sellerie", family: "Apiaceae", nutrient: "mittel", root: "tief" },
{ id: 8, name: "Petersilie", family: "Apiaceae", nutrient: "schwach", root: "tief" },
{ id: 9, name: "Kohl (Weißkohl)", family: "Brassicaceae", nutrient: "stark", root: "mittel" },
{ id: 10, name: "Brokkoli", family: "Brassicaceae", nutrient: "stark", root: "mittel" },
{ id: 11, name: "Radieschen", family: "Brassicaceae", nutrient: "schwach", root: "flach" },
{ id: 12, name: "Salat", family: "Asteraceae", nutrient: "schwach", root: "flach" },
{ id: 13, name: "Spinat", family: "Amaranthaceae", nutrient: "schwach", root: "flach" },
{ id: 14, name: "Mangold", family: "Amaranthaceae", nutrient: "mittel", root: "flach" },
{ id: 15, name: "Zwiebel", family: "Amaryllidaceae", nutrient: "mittel", root: "flach" },
{ id: 16, name: "Lauch", family: "Amaryllidaceae", nutrient: "mittel", root: "tief" },
{ id: 17, name: "Knoblauch", family: "Amaryllidaceae", nutrient: "mittel", root: "flach" },
{ id: 18, name: "Bohne (Buschbohne)", family: "Fabaceae", nutrient: "schwach", root: "mittel" },
{ id: 19, name: "Erbse", family: "Fabaceae", nutrient: "schwach", root: "mittel" },
{ id: 20, name: "Ackerbohne", family: "Fabaceae", nutrient: "mittel", root: "tief" },
{ id: 21, name: "Mais", family: "Poaceae", nutrient: "stark", root: "tief" },
{ id: 22, name: "Kürbis", family: "Cucurbitaceae", nutrient: "stark", root: "flach" },
{ id: 23, name: "Rote Bete", family: "Amaranthaceae", nutrient: "mittel", root: "tief" },
{ id: 24, name: "Fenchel", family: "Apiaceae", nutrient: "mittel", root: "tief" },
{ id: 25, name: "Kohlrabi", family: "Brassicaceae", nutrient: "mittel", root: "flach" }
];
const greenManures = [
{ id: 1, name: "Phacelia", traits: ["schnellwüchsig","unkrautunterdrückend","humusfördernd"], tolerances: ["locker","sandig","unkrautlastig"] },
{ id: 2, name: "Buchweizen", traits: ["schnell","unkrautunterdrückend"], tolerances: ["locker","sandig","sauer"] },
{ id: 3, name: "Ölrettich", traits: ["tiefwurzelnd","lockernd"], tolerances: ["verdichtet","lehmigtonig"] },
{ id: 4, name: "Weißklee", traits: ["dauerhaft","N-Fixierer"], tolerances: ["locker","nährstoffarm"] },
{ id: 5, name: "Rotklee", traits: ["N-Fixierer","humusfördernd"], tolerances: ["nährstoffarm","lehmigtonig"] },
{ id: 6, name: "Perserklee", traits: ["kurzlebig","N-Fixierer"], tolerances: ["locker","sandig"] },
{ id: 7, name: "Ackerbohne", traits: ["tiefwurzelnd","N-Fixierer"], tolerances: ["nährstoffarm","verdichtet"] },
{ id: 8, name: "Wicke", traits: ["N-Fixierer"], tolerances: ["nährstoffarm"] },
{ id: 9, name: "Hafer", traits: ["stützpflanze","biomasse"], tolerances: ["locker","sandig","unkrautlastig"] },
{ id: 10, name: "Roggen", traits: ["winterhart","biomasse"], tolerances: ["lehmigtonig","sauer","nass"] },
{ id: 11, name: "Lupine", traits: ["tiefwurzelnd","N-Fixierer"], tolerances: ["sandig","nährstoffarm"] },
{ id: 12, name: "Senf", traits: ["schnellwüchsig","unkrautunterdrückend"], tolerances: ["unkrautlastig","locker"] }
];
const soilStates = [
"Unbekannt", "locker humusreich", "stark verdichtet",
"nährstoffarm", "nass", "staunässe",
"sandig", "geringe Wasserhaltefähigkeit",
"lehmigtonig", "sehr sauer", "unkrautlastig"
];
// DOM Elements
const vegetableSelect = document.getElementById('vegetable-select');
const soilSelect = document.getElementById('soil-select');
const vegetableSuggestionBtn = document.getElementById('vegetable-suggestion-btn');
const manureSuggestionBtn = document.getElementById('manure-suggestion-btn');
const resultsSection = document.getElementById('results-section');
const vegetableResults = document.getElementById('vegetable-results');
const manureResults = document.getElementById('manure-results');
const vegetableSuggestions = document.getElementById('vegetable-suggestions');
const manureSuggestions = document.getElementById('manure-suggestions');
const clearResults = document.getElementById('clear-results');
// Initialize the app
function initApp() {
// Populate vegetable dropdown
vegetables.sort((a, b) => a.name.localeCompare(b.name)).forEach(veg => {
const option = document.createElement('option');
option.value = veg.id;
option.textContent = veg.name;
vegetableSelect.appendChild(option);
});
// Populate soil state dropdown
soilStates.forEach(soil => {
const option = document.createElement('option');
option.value = soil;
option.textContent = soil;
soilSelect.appendChild(option);
});
// Add event listeners
vegetableSuggestionBtn.addEventListener('click', getVegetableSuggestions);
manureSuggestionBtn.addEventListener('click', getManureSuggestions);
clearResults.addEventListener('click', resetApp);
}
// Get vegetable suggestions based on selected vegetable
function getVegetableSuggestions() {
const selectedVegId = vegetableSelect.value;
if (!selectedVegId) {
alert('Bitte wählen Sie zuerst ein Gemüse aus.');
return;
}
const selectedVegetable = vegetables.find(v => v.id == selectedVegId);
const suggestions = [];
// Rule 1: Different family
// Rule 2: After strong nutrient demand, prefer weak or medium
// Rule 3: Prefer alternating root depth
vegetables.forEach(veg => {
if (veg.id != selectedVegId) {
let score = 0;
let reasons = [];
// Different family
if (veg.family !== selectedVegetable.family) {
score += 3;
reasons.push(`andere Familie (${veg.family})`);
}
// Nutrient alternation
if (selectedVegetable.nutrient === "stark" && (veg.nutrient === "schwach" || veg.nutrient === "mittel")) {
score += 2;
reasons.push(`${veg.nutrient}zehrer`);
} else if (selectedVegetable.nutrient === "mittel" && veg.nutrient !== selectedVegetable.nutrient) {
score += 1;
reasons.push(`${veg.nutrient}zehrer`);
} else if (selectedVegetable.nutrient === "schwach" && (veg.nutrient === "stark" || veg.nutrient === "mittel")) {
score += 1;
reasons.push(`${veg.nutrient}zehrer`);
}
// Root depth alternation
if (veg.root !== selectedVegetable.root) {
score += 1;
reasons.push(`${veg.root === "tief" ? "tiefwurzelnd" : "flachwurzelnd"}`);
}
// Special case for legumes (N-Fixers)
if (veg.family === "Fabaceae") {
score += 1;
reasons.push("N-Fixierer");
}
if (score > 0) {
suggestions.push({
vegetable: veg,
score: score,
reasons: reasons
});
}
}
});
// Sort by score and take top 6
suggestions.sort((a, b) => b.score - a.score);
const topSuggestions = suggestions.slice(0, 6);
// Display results
displayVegetableSuggestions(selectedVegetable, topSuggestions);
}
// Get green manure suggestions based on soil state
function getManureSuggestions() {
const selectedVegId = vegetableSelect.value;
if (!selectedVegId) {
alert('Bitte wählen Sie zuerst ein Gemüse aus.');
return;
}
const selectedVegetable = vegetables.find(v => v.id == selectedVegId);
const soilState = soilSelect.value;
let suggestions = [];
// Apply rules based on soil state
switch(soilState) {
case "stark verdichtet":
suggestions = [
{ manure: greenManures.find(m => m.name === "Ölrettich"), percentage: 20 },
{ manure: greenManures.find(m => m.name === "Lupine"), percentage: 80 }
];
break;
case "sandig":
suggestions = [
{ manure: greenManures.find(m => m.name === "Lupine"), percentage: 70 },
{ manure: greenManures.find(m => m.name === "Buchweizen"), percentage: 30 }
];
break;
case "unkrautlastig":
suggestions = [
{ manure: greenManures.find(m => m.name === "Phacelia"), percentage: 50 },
{ manure: greenManures.find(m => m.name === "Buchweizen"), percentage: 50 }
];
break;
case "nährstoffarm":
suggestions = [
{ manure: greenManures.find(m => m.name === "Weißklee"), percentage: 60 },
{ manure: greenManures.find(m => m.name === "Hafer"), percentage: 40 }
];
break;
case "sehr sauer":
suggestions = [
{ manure: greenManures.find(m => m.name === "Buchweizen"), percentage: 100 }
];
break;
case "lehmigtonig":
suggestions = [
{ manure: greenManures.find(m => m.name === "Roggen"), percentage: 60 },
{ manure: greenManures.find(m => m.name === "Rotklee"), percentage: 40 }
];
break;
case "nass":
case "staunässe":
suggestions = [
{ manure: greenManures.find(m => m.name === "Roggen"), percentage: 100 }
];
break;
default: // "Unbekannt" or others
suggestions = [
{ manure: greenManures.find(m => m.name === "Roggen"), percentage: 60 },
{ manure: greenManures.find(m => m.name === "Weißklee"), percentage: 40 }
];
}
// Display results
displayManureSuggestions(selectedVegetable, suggestions, soilState);
}
// Display vegetable suggestions
function displayVegetableSuggestions(selectedVegetable, suggestions) {
// Show results section
resultsSection.classList.remove('hidden');
vegetableResults.classList.remove('hidden');
manureResults.classList.add('hidden');
// Clear previous suggestions
vegetableSuggestions.innerHTML = '';
// Add selected vegetable info
const selectedCard = document.createElement('div');
selectedCard.className = 'bg-gray-100 p-4 rounded-lg border-l-4 border-green-500';
selectedCard.innerHTML = `
<h4 class="font-bold text-lg text-gray-800 mb-1">Aktuelles Gemüse</h4>
<p class="text-gray-700 font-medium">${selectedVegetable.name}</p>
<div class="flex flex-wrap gap-1 mt-2">
<span class="bg-gray-200 text-gray-700 text-xs px-2 py-1 rounded">Familie: ${selectedVegetable.family}</span>
<span class="bg-gray-200 text-gray-700 text-xs px-2 py-1 rounded">${selectedVegetable.nutrient}zehrer</span>
<span class="bg-gray-200 text-gray-700 text-xs px-2 py-1 rounded">${selectedVegetable.root === "tief" ? "tiefwurzelnd" : selectedVegetable.root === "mittel" ? "mittelwurzelnd" : "flachwurzelnd"}</span>
</div>
`;
vegetableSuggestions.appendChild(selectedCard);
// Add suggestions
suggestions.forEach(suggestion => {
const veg = suggestion.vegetable;
const card = document.createElement('div');
card.className = 'vegetable-card bg-white p-4 rounded-lg shadow border border-gray-100 hover:border-green-200 transition cursor-pointer';
card.innerHTML = `
<h4 class="font-bold text-lg text-gray-800 mb-1">${veg.name}</h4>
<div class="flex flex-wrap gap-1 mb-2">
<span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded">Familie: ${veg.family}</span>
<span class="bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">${veg.nutrient}zehrer</span>
<span class="bg-purple-100 text-purple-800 text-xs px-2 py-1 rounded">${veg.root === "tief" ? "tiefwurzelnd" : veg.root === "mittel" ? "mittelwurzelnd" : "flachwurzelnd"}</span>
</div>
<p class="text-sm text-gray-600 mt-2"><span class="font-medium">Gründe:</span> ${suggestion.reasons.join(', ')}</p>
${veg.family === "Fabaceae" ? '<p class="text-xs text-green-600 mt-1"><i class="fas fa-info-circle mr-1"></i>Diese Pflanze ist ein Stickstoff-Fixierer</p>' : ''}
`;
vegetableSuggestions.appendChild(card);
});
// Scroll to results
resultsSection.scrollIntoView({ behavior: 'smooth' });
}
// Display green manure suggestions
function displayManureSuggestions(selectedVegetable, suggestions, soilState) {
// Show results section
resultsSection.classList.remove('hidden');
vegetableResults.classList.add('hidden');
manureResults.classList.remove('hidden');
// Clear previous suggestions
manureSuggestions.innerHTML = '';
// Add selected vegetable and soil info
const infoCard = document.createElement('div');
infoCard.className = 'bg-gray-100 p-4 rounded-lg mb-4';
infoCard.innerHTML = `
<div class="flex flex-col md:flex-row justify-between gap-2">
<div>
<h4 class="font-bold text-gray-800 mb-1">Aktuelles Gemüse</h4>
<p class="text-gray-700">${selectedVegetable.name}</p>
</div>
<div>
<h4 class="font-bold text-gray-800 mb-1">Bodenzustand</h4>
<p class="text-gray-700">${soilState}</p>
</div>
</div>
`;
manureSuggestions.appendChild(infoCard);
// Add explanation based on soil state
let explanation = "";
switch(soilState) {
case "stark verdichtet":
explanation = "Tiefwurzelnde Pflanzen wie Ölrettich und Lupine können helfen, verdichtete Böden aufzulockern und die Bodenstruktur zu verbessern.";
break;
case "sandig":
explanation = "Lupinen binden Stickstoff und verbessern die Bodenfruchtbarkeit, während Buchweizen schnell wächst und den Boden beschattet.";
break;
case "unkrautlastig":
explanation = "Schnellwüchsige Pflanzen wie Phacelia und Buchweizen unterdrücken Unkraut durch schnelle Bodenbedeckung und Konkurrenz.";
break;
case "nährstoffarm":
explanation = "Kleearten fixieren Stickstoff aus der Luft, während Hafer Biomasse liefert und den Humusgehalt erhöht.";
break;
case "sehr sauer":
explanation = "Buchweizen toleriert saure Böden und kann helfen, den pH-Wert zu verbessern.";
break;
case "lehmigtonig":
explanation = "Roggen durchwurzelt schwere Böden gut, während Klee Stickstoff bindet und die Bodenstruktur verbessert.";
break;
case "nass":
case "staunässe":
explanation = "Roggen ist eine der wenigen Gründüngungspflanzen, die mit nassen Bedingungen zurechtkommen.";
break;
default:
explanation = "Eine Mischung aus Roggen und Klee ist ein guter Allrounder für die meisten Böden, verbessert die Struktur und erhöht den Stickstoffgehalt.";
}
const explanationCard = document.createElement('div');
explanationCard.className = 'bg-blue-50 p-4 rounded-lg border-l-4 border-blue-500 mb-4';
explanationCard.innerHTML = `
<h4 class="font-bold text-blue-800 mb-1"><i class="fas fa-lightbulb text-blue-600 mr-1"></i>Begründung</h4>
<p class="text-blue-700">${explanation}</p>
`;
manureSuggestions.appendChild(explanationCard);
// Add suggestions
suggestions.forEach(suggestion => {
const manure = suggestion.manure;
const card = document.createElement('div');
card.className = 'bg-white p-4 rounded-lg shadow border border-gray-100 mb-2';
card.innerHTML = `
<div class="flex justify-between items-start mb-2">
<h4 class="font-bold text-lg text-gray-800">${manure.name} <span class="text-sm font-normal text-gray-500">(${suggestion.percentage}%)</span></h4>
<span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded">${suggestion.percentage}% der Mischung</span>
</div>
<div class="flex flex-wrap gap-1 mb-2">
${manure.traits.map(trait => {
let color = "gray";
let icon = "fa-seedling";
if (trait.includes("N-Fixierer")) { color = "blue"; icon = "fa-atom"; }
else if (trait.includes("unkraut")) { color = "purple"; icon = "fa-ban"; }
else if (trait.includes("tiefwurzelnd") || trait.includes("lockernd")) { color = "indigo"; icon = "fa-arrow-down"; }
else if (trait.includes("humus")) { color = "yellow"; icon = "fa-layer-group"; }
else if (trait.includes("schnell")) { color = "green"; icon = "fa-bolt"; }
return `<span class="bg-${color}-100 text-${color}-800 text-xs px-2 py-1 rounded flex items-center">
<i class="fas ${icon} text-${color}-600 mr-1"></i>${trait}
</span>`;
}).join('')}
</div>
<p class="text-sm text-gray-600 mt-2"><span class="font-medium">Geeignet für:</span> ${manure.tolerances.join(', ')}</p>
`;
manureSuggestions.appendChild(card);
});
// Scroll to results
resultsSection.scrollIntoView({ behavior: 'smooth' });
}
// Reset the app
function resetApp() {
vegetableSelect.selectedIndex = 0;
soilSelect.selectedIndex = 0;
resultsSection.classList.add('hidden');
vegetableResults.classList.add('hidden');
manureResults.classList.add('hidden');
}
// Initialize the app when DOM is loaded
document.addEventListener('DOMContentLoaded', initApp);
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=UnSinnlos/fruchtfolge-app" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>