From 950e77e3bfdc45a8ebe83c9d95cbcd87e5471505 Mon Sep 17 00:00:00 2001 From: Kitso Mogale Date: Tue, 22 Oct 2024 18:17:56 +0200 Subject: [PATCH 001/319] error state for PD and Pgrid --- app/error.jsx | 17 +++++++++++++++++ app/recipes/[id]/error.jsx | 19 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 app/error.jsx create mode 100644 app/recipes/[id]/error.jsx diff --git a/app/error.jsx b/app/error.jsx new file mode 100644 index 0000000..c2f2aca --- /dev/null +++ b/app/error.jsx @@ -0,0 +1,17 @@ +import { Link } from "lucide-react"; + + +export default function Error() { + + return ( +
+

Something went wrong

+

An unexpected error occurred. Please try again later.

+ + Return Home + +
+ ); +} diff --git a/app/recipes/[id]/error.jsx b/app/recipes/[id]/error.jsx new file mode 100644 index 0000000..b130aba --- /dev/null +++ b/app/recipes/[id]/error.jsx @@ -0,0 +1,19 @@ +import { Link } from "lucide-react"; + + +export default function Error() { + + return ( +
+

Something went wrong

+

An unexpected error occurred. Please try again later.

+ + Return Home + +
+ ); +} + + From 558cff07cd64005740b0896e6f855de7ff9eb334 Mon Sep 17 00:00:00 2001 From: Kitso Mogale Date: Tue, 22 Oct 2024 22:16:26 +0200 Subject: [PATCH 002/319] fetched data from mongodb --- app/api/recipe/route.js | 43 ++++++-- app/components/RecipeCard.jsx | 2 +- app/components/RecipeGrid.jsx | 10 +- app/error.jsx | 5 +- app/lib/mongodb.js | 38 +++++++ app/models/Recipe.js | 20 ++++ app/recipes/[id]/error.jsx | 4 +- package-lock.json | 200 +++++++++++++++++++++++++++++++++- package.json | 1 + 9 files changed, 302 insertions(+), 21 deletions(-) create mode 100644 app/lib/mongodb.js create mode 100644 app/models/Recipe.js diff --git a/app/api/recipe/route.js b/app/api/recipe/route.js index 5bed881..0bfee5b 100644 --- a/app/api/recipe/route.js +++ b/app/api/recipe/route.js @@ -1,14 +1,37 @@ -const fetchRecipes = async () => { +import { NextResponse } from 'next/server'; +import connectToDatabase from '../../lib/mongodb'; +import Recipe from '../../models/Recipe'; +import mongoose from 'mongoose'; + +export async function GET() { try { - const res = await fetch("https://dummyjson.com/recipes", {cache : 'force-cache'}); - if (!res.ok) { - throw new Error("Fetch Products Failed"); - } - const data = await res.json(); - return data; + console.log('123') + console.log(Recipe); + + // Connect to the database + //await connectToDatabase(); + const db = await connectToDatabase(); +console.log('Connected to:', db.connection.name); + console.log(mongoose.connection.db.databaseName); + console.log(Recipe.collection.collectionName); + console.log('12345dfg') + // Fetch all recipes from the MongoDB collection + let recipes; + // try { + recipes = await Recipe.find({}).limit(50); + console.log('12345'); + + // } catch (error) { + // console.error('Error fetching recipes:', error); + // } + // console.log(recipes); + // Return the recipes in the response + return NextResponse.json({ success: true, data: recipes }); } catch (error) { - console.error("Failed to Fetch Data:", error) + console.error('Error fetching recipes:', error); + + // Return an error response + return NextResponse.json({ success: false, error: 'Failed to fetch recipes' }, { status: 500 }); } -}; +} -export default fetchRecipes; diff --git a/app/components/RecipeCard.jsx b/app/components/RecipeCard.jsx index d893f1c..1ba77da 100644 --- a/app/components/RecipeCard.jsx +++ b/app/components/RecipeCard.jsx @@ -6,7 +6,7 @@ const RecipeCard = ({ recipe }) => { return (
- {recipe.title} + {recipe.title}

{recipe.name}

Prep time: {recipe.prepTimeMinutes} mins

diff --git a/app/components/RecipeGrid.jsx b/app/components/RecipeGrid.jsx index 855950b..4a9f74c 100644 --- a/app/components/RecipeGrid.jsx +++ b/app/components/RecipeGrid.jsx @@ -1,6 +1,6 @@ // app/components/RecipeGrid.jsx "use client" -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; import RecipeCard from './RecipeCard'; // Update this import import SkeletonGrid from './SkeletonMain'; @@ -10,9 +10,11 @@ const RecipeGrid = () => { useEffect(() => { const fetchRecipes = async () => { try { - const response = await fetch('https://dummyjson.com/recipes',{cache:"no-store"}); + const response = await fetch('http://localhost:3000/api/recipe',{cache:"no-store"}); + console.log(response) const data = await response.json(); - setRecipes(data.recipes); + //console.log(data) + setRecipes(data.data); } catch (error) { console.error('Error fetching recipes:', error); } @@ -27,7 +29,7 @@ const RecipeGrid = () => { return (
{recipes.map(recipe => ( - + ))}
); diff --git a/app/error.jsx b/app/error.jsx index c2f2aca..9e7c554 100644 --- a/app/error.jsx +++ b/app/error.jsx @@ -1,4 +1,5 @@ -import { Link } from "lucide-react"; +'use client' +import Link from "next/link"; export default function Error() { @@ -7,7 +8,7 @@ export default function Error() {

Something went wrong

An unexpected error occurred. Please try again later.

- Return Home diff --git a/app/lib/mongodb.js b/app/lib/mongodb.js new file mode 100644 index 0000000..b8175bd --- /dev/null +++ b/app/lib/mongodb.js @@ -0,0 +1,38 @@ +import mongoose from 'mongoose'; + +const MONGODB_URI = 'mongodb+srv://group-c:etKnp1R6OOkmgEjA@cluster0.rfl6z.mongodb.net/'; +//console.log(process.env.MONGODB_URI) +if (!MONGODB_URI) { + throw new Error('Please define the MONGODB_URI environment variable inside .env.local'); +} + +let cached = global.mongoose; + +if (!cached) { + cached = global.mongoose = { conn: null, promise: null }; +} + +async function connectToDatabase() { + if (cached.conn) { + return cached.conn; + } + + if (!cached.promise) { + const opts = { + useNewUrlParser: true, + useUnifiedTopology: true, + dbName: 'devdb', // Ensures the correct database is used + }; + + cached.promise = mongoose.connect(MONGODB_URI, opts).then((mongoose) => { + console.log('Connected to MongoDB:', mongoose.connection.db.databaseName); // This should log 'devdb' + return mongoose; + }); + } + + cached.conn = await cached.promise; + return cached.conn; + } + + +export default connectToDatabase; diff --git a/app/models/Recipe.js b/app/models/Recipe.js new file mode 100644 index 0000000..8a1ab82 --- /dev/null +++ b/app/models/Recipe.js @@ -0,0 +1,20 @@ +import mongoose from "mongoose"; +const RecipeSchema = new mongoose.Schema({ + title: { + type: String, + required: true, + }, + description: String, + prepTime: Number, + cookTime: Number, + totalTime: Number, + servings: Number, + ingredients: [String], + instructions: [String], + image: String, + }, { collection: 'recipes' }); // Explicitly specify the collection name + + const Recipe = mongoose.models.Recipe || mongoose.model('Recipe', RecipeSchema); + + export default Recipe; + \ No newline at end of file diff --git a/app/recipes/[id]/error.jsx b/app/recipes/[id]/error.jsx index b130aba..5e4a9fd 100644 --- a/app/recipes/[id]/error.jsx +++ b/app/recipes/[id]/error.jsx @@ -1,4 +1,5 @@ -import { Link } from "lucide-react"; +'use client' +import Link from "next/link"; export default function Error() { @@ -8,6 +9,7 @@ export default function Error() {

Something went wrong

An unexpected error occurred. Please try again later.

Return Home diff --git a/package-lock.json b/package-lock.json index 4f36145..84f53dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@fortawesome/react-fontawesome": "^0.2.2", "lucide-react": "^0.453.0", + "mongoose": "^8.7.2", "next": "14.2.15", "react": "^18", "react-dom": "^18", @@ -269,6 +270,15 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@next/env": { "version": "14.2.15", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.15.tgz", @@ -525,6 +535,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz", @@ -1104,6 +1129,15 @@ "node": ">=8" } }, + "node_modules/bson": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.9.0.tgz", + "integrity": "sha512-X9hJeyeM0//Fus+0pc5dSUMhhrrmWwQUtdavaQeF3Ta6m69matZkGWV/MrBcnwUeLC8W9kwwc2hfkZgUuCX3Ig==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -1366,7 +1400,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3189,6 +3222,15 @@ "node": ">=4.0" } }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3301,6 +3343,12 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3358,11 +3406,109 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mongodb": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz", + "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.7.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.7.2.tgz", + "integrity": "sha512-Ok4VzMds9p5G3ZSUhmvBm1GdxanbzhS29jpSn02SPj+IXEVFnIdfwAlHHXWkyNscZKlcn8GuMi68FH++jo0flg==", + "license": "MIT", + "dependencies": { + "bson": "^6.7.0", + "kareem": "2.6.3", + "mongodb": "6.9.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/mz": { @@ -3982,7 +4128,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4360,6 +4505,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -4382,6 +4533,15 @@ "node": ">=0.10.0" } }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -4778,6 +4938,18 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -4968,6 +5140,28 @@ "dev": true, "license": "MIT" }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index ddb8064..efcc475 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "@fortawesome/react-fontawesome": "^0.2.2", "lucide-react": "^0.453.0", + "mongoose": "^8.7.2", "next": "14.2.15", "react": "^18", "react-dom": "^18", From d451619cb1e3d4c45712b1d70dbfea6984267722 Mon Sep 17 00:00:00 2001 From: Kitso Mogale Date: Tue, 22 Oct 2024 22:36:20 +0200 Subject: [PATCH 003/319] uri env file position fixed --- app/lib/mongodb.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/mongodb.js b/app/lib/mongodb.js index b8175bd..1aec4a1 100644 --- a/app/lib/mongodb.js +++ b/app/lib/mongodb.js @@ -1,7 +1,7 @@ import mongoose from 'mongoose'; -const MONGODB_URI = 'mongodb+srv://group-c:etKnp1R6OOkmgEjA@cluster0.rfl6z.mongodb.net/'; -//console.log(process.env.MONGODB_URI) +const MONGODB_URI = process.env.MONGODB_URI; +console.log(process.env.MONGODB_URI) if (!MONGODB_URI) { throw new Error('Please define the MONGODB_URI environment variable inside .env.local'); } From 1f7697f4c5624b99369d76bb8991f2f5e8b46499 Mon Sep 17 00:00:00 2001 From: Mateo Benzien <156769785+Mateo-Benzien@users.noreply.github.com> Date: Wed, 23 Oct 2024 07:36:18 +0200 Subject: [PATCH 004/319] Update layout.js --- app/layout.js | 99 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 82 insertions(+), 17 deletions(-) diff --git a/app/layout.js b/app/layout.js index 9800bf8..3ea98ce 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,29 +1,94 @@ -import localFont from "next/font/local"; -import "./globals.css"; +'use client'; +import { useState, useEffect } from 'react'; +import Head from 'next/head'; +import localFont from 'next/font/local'; +import Navbar from './components/Navbar'; +import Footer from './components/Footer'; +import './globals.css'; +// Font Definitions const geistSans = localFont({ - src: "./fonts/GeistVF.woff", - variable: "--font-geist-sans", - weight: "100 900", + src: './fonts/GeistVF.woff', + variable: '--font-geist-sans', + weight: '100 900', }); const geistMono = localFont({ - src: "./fonts/GeistMonoVF.woff", - variable: "--font-geist-mono", - weight: "100 900", + src: './fonts/GeistMonoVF.woff', + variable: '--font-geist-mono', + weight: '100 900', }); -export const metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; - export default function RootLayout({ children }) { + const [navbarPosition, setNavbarPosition] = useState(0); + + useEffect(() => { + const handleKeyDown = (e) => { + if (e.key === 'ArrowLeft') { + setNavbarPosition((prev) => Math.max(prev - 10, -100)); + } else if (e.key === 'ArrowRight') { + setNavbarPosition((prev) => Math.min(prev + 10, 100)); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, []); + return ( - - {children} + + {/* Meta Tags for SEO and Mobile Responsiveness */} + + + + + {/* Canonical Tag for Better SEO */} + + + {/* Open Graph Meta Tags (for social media sharing) */} + + + + + + + {/* Twitter Card Meta Tags */} + + + + + + {/* Title and Favicon */} + Recipe Rush - Your Source for Culinary Inspiration + + + + +
{/* Add padding-top to account for fixed navbar */} + {children} +
+