diff --git a/README.md b/README.md
index 3ef8cac..da528ed 100644
--- a/README.md
+++ b/README.md
@@ -7,9 +7,11 @@ Ein Bild wie die Applikation aussehen soll findet man unter assets/images mit de
1. Die App soll grundsätzlich im Browser als auch auf Mobilen Endgeräten laufen. (entweder iOS oder Android)
2. Es soll möglich sein Rezepte abzuspeichern und neue anzulegen.
3. Man soll Bilder für Rezepte hochladen können.
-4. Es soll möglich sein alte handgeschriebene Texte mit Texterkennung auf Bildern zu importieren und zu formatieren.
-5. Rezepte sollen beliebig sortiert und ergänzt werden können.
-6. Falls der Umfang der App nicht umfangreich genug sein sollte dann noch die Möglichkeit von anderen Nutzern Rezepte anzuschauen.
+4. Es soll möglich sein alte handgeschriebene Texte Bildern zu importieren.
+5. Rezepte sollen gelöscht werden können.
+
+
+6. Bonus: Texterkennung wenn die Packages es auch für Web zulassen.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 0d29021..35cb8f2 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,28 +1,5 @@
-# This file configures the analyzer, which statically analyzes Dart code to
-# check for errors, warnings, and lints.
-#
-# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
-# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
-# invoked from the command line by running `flutter analyze`.
-
-# The following line activates a set of recommended lints for Flutter apps,
-# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
- # The lint rules applied to this project can be customized in the
- # section below to disable rules from the `package:flutter_lints/flutter.yaml`
- # included above or to enable additional rules. A list of all available lints
- # and their documentation is published at https://dart.dev/lints.
- #
- # Instead of disabling a lint rule for the entire project in the
- # section below, it can also be suppressed for a single line of code
- # or a specific dart file by using the `// ignore: name_of_lint` and
- # `// ignore_for_file: name_of_lint` syntax on the line or in the file
- # producing the lint.
rules:
- # avoid_print: false # Uncomment to disable the `avoid_print` rule
- # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
-# Additional information about this file can be found at
-# https://dart.dev/guides/language/analysis-options
diff --git a/android/app/build.gradle b/android/app/build.gradle
index a274f71..c77286f 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -45,7 +45,7 @@ android {
applicationId "com.example.kochkomplize"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
- minSdkVersion flutter.minSdkVersion
+ minSdkVersion 21
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
diff --git a/android/app/google-services.json b/android/app/google-services.json
new file mode 100644
index 0000000..10dcaeb
--- /dev/null
+++ b/android/app/google-services.json
@@ -0,0 +1,30 @@
+{
+ "project_info": {
+ "project_number": "460915828512",
+ "firebase_url": "https://kochkomplize-default-rtdb.europe-west1.firebasedatabase.app",
+ "project_id": "kochkomplize",
+ "storage_bucket": "kochkomplize.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:460915828512:android:73914cecf1d06ff0771945",
+ "android_client_info": {
+ "package_name": "com.example.kochkomplize"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBzHwDZscVmyTuyJx9darx_8KkhpiCcNNQ"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "2"
+}
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 402b011..913e1d9 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -30,4 +30,5 @@
android:name="flutterEmbedding"
android:value="2" />
+
diff --git a/assets/database/Kochkomplize.db b/assets/database/Kochkomplize.db
new file mode 100644
index 0000000..9e75ba6
Binary files /dev/null and b/assets/database/Kochkomplize.db differ
diff --git a/assets/images/Logo.png b/assets/images/Logo.png
new file mode 100644
index 0000000..f20637e
Binary files /dev/null and b/assets/images/Logo.png differ
diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist
new file mode 100644
index 0000000..0f83924
--- /dev/null
+++ b/ios/Runner/GoogleService-Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ API_KEY
+ AIzaSyDn1MhJq7gjUtyFJaewgC425jwJmAVCrDk
+ GCM_SENDER_ID
+ 460915828512
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.example.kochkomplize
+ PROJECT_ID
+ kochkomplize
+ STORAGE_BUCKET
+ kochkomplize.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:460915828512:ios:ec4610516aa6bb0d771945
+
+
\ No newline at end of file
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 1b420ec..00f5eb5 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -45,5 +45,9 @@
UIApplicationSupportsIndirectInputEvents
+ NSPhotoLibraryUsageDescription
+ Wir benötigen Zugriff auf Ihre Fotos, um Bilder auszuwählen.
+ NSCameraUsageDescription
+ Wir benötigen Zugriff auf Ihre Kamera, um Fotos aufzunehmen.
diff --git a/ios/firebase_app_id_file.json b/ios/firebase_app_id_file.json
new file mode 100644
index 0000000..4d1969f
--- /dev/null
+++ b/ios/firebase_app_id_file.json
@@ -0,0 +1,7 @@
+{
+ "file_generated_by": "FlutterFire CLI",
+ "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
+ "GOOGLE_APP_ID": "1:460915828512:ios:ec4610516aa6bb0d771945",
+ "FIREBASE_PROJECT_ID": "kochkomplize",
+ "GCM_SENDER_ID": "460915828512"
+}
\ No newline at end of file
diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart
new file mode 100644
index 0000000..bbbf5c1
--- /dev/null
+++ b/lib/firebase_options.dart
@@ -0,0 +1,68 @@
+// File generated by FlutterFire CLI.
+// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
+import 'package:firebase_core/firebase_core.dart';
+import 'package:flutter/foundation.dart'
+ show defaultTargetPlatform, kIsWeb, TargetPlatform;
+
+class DefaultFirebaseOptions {
+ static FirebaseOptions get currentPlatform {
+ if (kIsWeb) {
+ return web;
+ }
+ switch (defaultTargetPlatform) {
+ case TargetPlatform.android:
+ return android;
+ case TargetPlatform.iOS:
+ return ios;
+ case TargetPlatform.macOS:
+ throw UnsupportedError(
+ 'DefaultFirebaseOptions have not been configured for macos - '
+ 'you can reconfigure this by running the FlutterFire CLI again.',
+ );
+ case TargetPlatform.windows:
+ throw UnsupportedError(
+ 'DefaultFirebaseOptions have not been configured for windows - '
+ 'you can reconfigure this by running the FlutterFire CLI again.',
+ );
+ case TargetPlatform.linux:
+ throw UnsupportedError(
+ 'DefaultFirebaseOptions have not been configured for linux - '
+ 'you can reconfigure this by running the FlutterFire CLI again.',
+ );
+ default:
+ throw UnsupportedError(
+ 'DefaultFirebaseOptions are not supported for this platform.',
+ );
+ }
+ }
+
+ static const FirebaseOptions web = FirebaseOptions(
+ apiKey: 'AIzaSyAACZYqWGQre2FqeXxC5qid1E0K2yuXD5Q',
+ appId: '1:460915828512:web:4db5d6cfa1e11481771945',
+ messagingSenderId: '460915828512',
+ projectId: 'kochkomplize',
+ authDomain: 'kochkomplize.firebaseapp.com',
+ databaseURL: 'https://kochkomplize-default-rtdb.europe-west1.firebasedatabase.app',
+ storageBucket: 'kochkomplize.appspot.com',
+ measurementId: 'G-0W73YW74KY',
+ );
+
+ static const FirebaseOptions android = FirebaseOptions(
+ apiKey: 'AIzaSyBzHwDZscVmyTuyJx9darx_8KkhpiCcNNQ',
+ appId: '1:460915828512:android:73914cecf1d06ff0771945',
+ messagingSenderId: '460915828512',
+ projectId: 'kochkomplize',
+ databaseURL: 'https://kochkomplize-default-rtdb.europe-west1.firebasedatabase.app',
+ storageBucket: 'kochkomplize.appspot.com',
+ );
+
+ static const FirebaseOptions ios = FirebaseOptions(
+ apiKey: 'AIzaSyDn1MhJq7gjUtyFJaewgC425jwJmAVCrDk',
+ appId: '1:460915828512:ios:ec4610516aa6bb0d771945',
+ messagingSenderId: '460915828512',
+ projectId: 'kochkomplize',
+ databaseURL: 'https://kochkomplize-default-rtdb.europe-west1.firebasedatabase.app',
+ storageBucket: 'kochkomplize.appspot.com',
+ iosBundleId: 'com.example.kochkomplize',
+ );
+}
diff --git a/lib/import.dart b/lib/import.dart
deleted file mode 100644
index c23bbd9..0000000
--- a/lib/import.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-import 'package:flutter/material.dart';
-import 'menu_content.dart';
-
-//todo implement logik for image import
-
-class ImportContent implements MenuContent {
- @override
- Widget build(BuildContext context) {
- // Hier wird der Inhalt für Menüpunkt 2 erstellt
- return const Text('Inhalt für Menüpunkt 2 - Import');
- }
-}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index da7f8e9..27c6bb1 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,9 +1,18 @@
import 'package:flutter/material.dart';
+import 'startpage.dart';
+import 'recipeformpage.dart';
import 'menu.dart';
import 'menu_content.dart';
-import 'recipes.dart';
+import 'recipesoverview.dart';
+import 'package:firebase_core/firebase_core.dart';
+import 'firebase_options.dart';
+
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ await Firebase.initializeApp(
+ options: DefaultFirebaseOptions.currentPlatform,
+ );
-void main() {
runApp(const MyApp());
}
@@ -35,18 +44,32 @@ class MyHomePage extends StatefulWidget {
class _MyHomePageState extends State {
MenuContent? _selectedMenuContent;
+ @override
+ void initState() {
+ super.initState();
+ _selectedMenuContent = Startpage(); // Initialisiere mit Startseite
+ }
+
void _onMenuItemSelected(String menuItem) {
setState(() {
switch (menuItem) {
case 'Meine Rezepte':
- _selectedMenuContent = RecipesContent();
+ _selectedMenuContent = RecipesOverview();
break;
+ case 'Startseite':
+ _selectedMenuContent = Startpage();
+ break;
+ // case 'Texterkennung Bild':
+ // _selectedMenuContent = TextScan();
+ // break;
}
});
}
- void _importImage() {
- //todo
+ void _addRecipe() {
+ Navigator.of(context).push(
+ MaterialPageRoute(builder: (context) => const Recipeformpage()),
+ );
}
@override
@@ -58,11 +81,14 @@ class _MyHomePageState extends State {
),
drawer: Menu(onMenuItemSelected: _onMenuItemSelected),
body: _selectedMenuContent?.build(context) ?? Container(),
- floatingActionButton: FloatingActionButton(
- onPressed: _importImage,
- tooltip: 'Import',
+ floatingActionButton: _selectedMenuContent is RecipesOverview
+ ? FloatingActionButton(
+ onPressed: _addRecipe,
+ tooltip: 'Rezept hinzufügen',
child: const Icon(Icons.add),
- ),
+ )
+ : null, // Kein Button für andere Seiten
);
}
-}
\ No newline at end of file
+}
+
diff --git a/lib/menu.dart b/lib/menu.dart
index f48eafd..8d83554 100644
--- a/lib/menu.dart
+++ b/lib/menu.dart
@@ -20,11 +20,11 @@ class Menu extends StatelessWidget {
child: Text('Hauptmenü', style: TextStyle(color: Colors.black, fontSize: 20.0)),
),
),
+ _buildListTile(context, 'Startseite'),
_buildListTile(context, 'Meine Rezepte'),
- _buildListTile(context, 'Rezept importieren'),
- _buildListTile(context, 'Texterkennung Bild'),
- _buildListTile(context, '(Beta) Rezepte finden'),
- // Füge hier weitere ListTiles für zusätzliche Menüpunkte hinzu
+ //_buildListTile(context, 'Rezept importieren'),
+ //_buildListTile(context, 'Texterkennung Bild'),
+ //_buildListTile(context, '(Beta) Rezepte finden'),
],
),
);
diff --git a/lib/recipe.dart b/lib/recipe.dart
deleted file mode 100644
index 63abd46..0000000
--- a/lib/recipe.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-import 'package:flutter/material.dart';
-
-class RecipeDetailPage extends StatelessWidget {
- final Map recipe;
-
- const RecipeDetailPage({Key? key, required this.recipe}) : super(key: key);
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- title: Text(recipe["title"]),
- ),
- body: Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- Image.network(recipe["image"]),
- Text(recipe["title"]),
- // Weitere Details oder Inhalte für die Detailseite
- ],
- ),
- ),
- );
- }
-}
\ No newline at end of file
diff --git a/lib/recipedetailpage.dart b/lib/recipedetailpage.dart
new file mode 100644
index 0000000..4d729e6
--- /dev/null
+++ b/lib/recipedetailpage.dart
@@ -0,0 +1,110 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'package:flutter/material.dart';
+import 'package:firebase_database/firebase_database.dart';
+import 'package:firebase_storage/firebase_storage.dart';
+
+class RecipeDetailPage extends StatelessWidget {
+ final String recipeId;
+
+ const RecipeDetailPage({Key? key, required this.recipeId, required Map recipe}) : super(key: key);
+
+ Future _showDeleteDialog(BuildContext context) async {
+ bool confirmDelete = await showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return AlertDialog(
+ title: const Text('Rezept löschen'),
+ content: const Text('Sind Sie sicher, dass Sie dieses Rezept löschen möchten?'),
+ actions: [
+ TextButton(
+ onPressed: () => Navigator.of(context).pop(false),
+ child: const Text('Abbrechen'),
+ ),
+ TextButton(
+ onPressed: () => Navigator.of(context).pop(true),
+ child: const Text('Löschen'),
+ ),
+ ],
+ );
+ },
+ ) ?? false; // Dialog-Abbruch auch als "Nicht löschen" werten
+
+ if (confirmDelete) {
+ await _deleteRecipe(context);
+ }
+ }
+
+ Future _deleteRecipe(BuildContext context) async {
+ DatabaseReference recipeRef = FirebaseDatabase.instance.ref('rezepte/$recipeId');
+ DataSnapshot snapshot = await recipeRef.get();
+ if (snapshot.exists) {
+ Map recipe = snapshot.value as Map;
+
+ // Lösche die Bilder aus dem Storage, wenn URLs vorhanden sind
+ for (final key in ['bild1', 'bild2', 'bild3']) {
+ final String? imageUrl = recipe[key];
+ if (imageUrl != null && imageUrl.isNotEmpty) {
+ try {
+ await FirebaseStorage.instance.refFromURL(imageUrl).delete();
+ } catch (e) {
+ debugPrint("Fehler beim Löschen von $imageUrl: $e");
+ }
+ }
+ }
+
+ // Lösche den Rezepteintrag aus der Datenbank
+ await recipeRef.remove();
+ Navigator.pop(context);
+ } else {
+ ScaffoldMessenger.of(context).showSnackBar(
+ const SnackBar(content: Text('Rezept konnte nicht gefunden werden.')),
+ );
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Rezept Details'),
+ ),
+ body: FutureBuilder(
+ future: FirebaseDatabase.instance.ref('rezepte/$recipeId').get(),
+ builder: (BuildContext context, AsyncSnapshot snapshot) {
+ if (snapshot.connectionState == ConnectionState.waiting) {
+ return const Center(child: CircularProgressIndicator());
+ }
+
+ if (!snapshot.hasData || snapshot.data?.value == null) {
+ return const Center(child: Text('Rezept nicht gefunden'));
+ }
+
+ var recipeData = snapshot.data!.value as Map;
+
+ return SingleChildScrollView(
+ child: Column(
+ children: [
+ if (recipeData['bild1'] != null)
+ Image.network(recipeData['bild1']),
+ Text(recipeData['titel'] ?? 'Kein Titel', style: Theme.of(context).textTheme.titleLarge),
+ Text(recipeData['beschreibung1'] ?? 'Keine Beschreibung'),
+ Text(recipeData['beschreibung2'] ?? 'Keine Beschreibung'),
+ Text(recipeData['beschreibung3'] ?? 'Keine Beschreibung'),
+ if (recipeData['bild2'] != null && recipeData['bild2'].isNotEmpty)
+ Image.network(recipeData['bild2']),
+ if (recipeData['bild3'] != null && recipeData['bild3'].isNotEmpty)
+ Image.network(recipeData['bild3']),
+ ],
+ ),
+ );
+ },
+ ),
+ floatingActionButton: FloatingActionButton(
+ onPressed: () => _showDeleteDialog(context),
+ tooltip: 'Löschen',
+ child: const Icon(Icons.delete),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/recipeformpage.dart b/lib/recipeformpage.dart
new file mode 100644
index 0000000..6966e5f
--- /dev/null
+++ b/lib/recipeformpage.dart
@@ -0,0 +1,175 @@
+import 'dart:typed_data';
+import 'package:flutter/material.dart';
+import 'package:image_picker/image_picker.dart';
+import 'package:firebase_storage/firebase_storage.dart';
+import 'package:firebase_database/firebase_database.dart';
+import 'package:path/path.dart';
+
+class Recipeformpage extends StatefulWidget {
+ const Recipeformpage({super.key});
+
+ @override
+ RecipeformpageState createState() => RecipeformpageState();
+}
+
+class RecipeformpageState extends State {
+ final _formKey = GlobalKey();
+ String title = '';
+ String description1 = '';
+ String description2 = '';
+ String description3 = '';
+ String image1 = '';
+ String image2 = '';
+ String image3 = '';
+
+ final ImagePicker _picker = ImagePicker();
+
+ Future _pickAndUploadImage(String fieldName) async {
+ final XFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);
+ if (pickedFile != null) {
+ // Lese die Datei als Byte-Array ein
+ Uint8List fileBytes = await pickedFile.readAsBytes();
+ String fileName = basename(pickedFile.path);
+ Reference storageRef = FirebaseStorage.instance.ref().child('rezeptbilder/$fileName');
+
+ // Starte den Upload-Prozess
+ UploadTask uploadTask = storageRef.putData(fileBytes);
+
+ // Warte auf das Ende des Uploads
+ await uploadTask.whenComplete(() {});
+
+ // Erhalte die Download-URL
+ String downloadUrl = await storageRef.getDownloadURL();
+
+ setState(() {
+ // Aktualisiere den entsprechenden Bild-URL-Zustand
+ switch (fieldName) {
+ case 'image1':
+ image1 = downloadUrl;
+ break;
+ case 'image2':
+ image2 = downloadUrl;
+ break;
+ case 'image3':
+ image3 = downloadUrl;
+ break;
+ default:
+ break;
+ }
+ });
+ }
+ }
+
+ void _saveForm(BuildContext context) async {
+
+ if (_formKey.currentState!.validate()) {
+ _formKey.currentState!.save();
+
+ DatabaseReference databaseRef = FirebaseDatabase.instance.ref().child('rezepte');
+ String? rezeptId = databaseRef.push().key; // Eindeutiger Schlüssel für das neue Rezept
+
+ databaseRef.child(rezeptId!).set({
+ 'titel': title,
+ 'beschreibung1': description1,
+ 'beschreibung2': description2,
+ 'beschreibung3': description3,
+ 'bild1': image1,
+ 'bild2': image2,
+ 'bild3': image3,
+ });
+
+ Navigator.of(context).pop(); // Schließt das Formular nach dem Speichern
+
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text("Neues Rezept"),
+ ),
+ body: Stack(
+ children: [
+ Form(
+ key: _formKey,
+ child: ListView(
+ padding: const EdgeInsets.all(16),
+ children: [
+ TextFormField(
+ decoration: const InputDecoration(labelText: 'Titel'),
+ onSaved: (value) => title = value ?? '',
+ validator: (value) {
+ if (value == null || value.isEmpty) {
+ return 'Bitte einen Titel eingeben';
+ }
+ return null;
+ },
+ ),
+ TextFormField(
+ decoration: const InputDecoration(labelText: 'Zutaten: '),
+ onSaved: (value) => description1 = value ?? '',
+ ),
+ TextFormField(
+ decoration: const InputDecoration(labelText: 'Anleitung: '),
+ onSaved: (value) => description2 = value ?? '',
+ ),
+ TextFormField(
+ decoration: const InputDecoration(labelText: 'Anmerkungen: '),
+ onSaved: (value) => description3 = value ?? '',
+ ),
+ _imageField('Anzeigebild', 'image1'),
+ _imageField('Handgeschriebenes Rezept', 'image2'),
+ _imageField('Textscan', 'image3'),
+ ],
+ ),
+ ),
+ Positioned(
+ right: 16,
+ bottom: 16,
+ child: FloatingActionButton(
+ onPressed: () => _saveForm(context),
+ tooltip: 'Rezept speichern',
+ child: const Icon(Icons.save),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+ Widget _imageField(String label, String fieldName) {
+ String? imageUrl;
+ switch (fieldName) {
+ case 'image1':
+ imageUrl = image1;
+ break;
+ case 'image2':
+ imageUrl = image2;
+ break;
+ case 'image3':
+ imageUrl = image3;
+ break;
+ }
+
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ if (imageUrl != null && imageUrl.isNotEmpty)
+ Image.network(imageUrl, width: 100, height: 100),
+ Row(
+ children: [
+ Expanded(
+ child: TextFormField(
+ decoration: InputDecoration(labelText: label),
+ ),
+ ),
+ IconButton(
+ icon: const Icon(Icons.photo_camera),
+ onPressed: () => _pickAndUploadImage(fieldName),
+ ),
+ ],
+ ),
+ ],
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/recipes.dart b/lib/recipes.dart
deleted file mode 100644
index a418251..0000000
--- a/lib/recipes.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-import 'package:flutter/material.dart';
-import 'menu_content.dart';
-import 'recipe.dart';
-
-class RecipesContent implements MenuContent {
- @override
- Widget build(BuildContext context) {
- // Datenquelle exemplarisch definiert
- List