├── src ├── .prettierrc.json ├── app │ ├── favicon.ico │ ├── fonts │ │ ├── GeistVF.woff │ │ └── GeistMonoVF.woff │ ├── error.tsx │ ├── page.tsx │ ├── globals.css │ ├── layout.tsx │ ├── menu │ │ ├── page.tsx │ │ └── [category] │ │ │ └── page.tsx │ └── meal │ │ └── [idMeal] │ │ └── page.tsx ├── utils │ └── api.ts ├── components │ ├── MenuGrid.tsx │ ├── MealCard.tsx │ ├── CategoryCard.tsx │ ├── MenuCard.tsx │ ├── ScrollToTop.tsx │ ├── MobileNavBar.tsx │ ├── BackButton.tsx │ ├── Sidebar.tsx │ ├── Filter.tsx │ ├── Pagination.tsx │ ├── ImageSlider.tsx │ ├── CategoriesCarousel.tsx │ ├── MealNavigation.tsx │ ├── RandomMeals.tsx │ ├── Footer.tsx │ └── NavBar.tsx └── hooks │ ├── useFetchMeals.ts │ ├── useFetchCategories.ts │ └── useFetchMealDetails.ts ├── desk.png ├── mobile.png ├── tablet.png ├── .eslintrc.json ├── desk-article.png ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── custom.md │ ├── feature_request.md │ └── bug_report.md └── PULL_REQUEST_TEMPLATE ├── postcss.config.mjs ├── next.config.mjs ├── workflow └── github │ └── food.yml ├── .gitignore ├── tailwind.config.ts ├── tsconfig.json ├── SECURITY.md ├── package.json ├── .prettierrc.json ├── LICENSE ├── CONTRIBUTING.md ├── README.md └── CODE_OF_CONDUCT.md /src/.prettierrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /desk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frau-azadeh/Just-Food/HEAD/desk.png -------------------------------------------------------------------------------- /mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frau-azadeh/Just-Food/HEAD/mobile.png -------------------------------------------------------------------------------- /tablet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frau-azadeh/Just-Food/HEAD/tablet.png -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "next/typescript"] 3 | } 4 | -------------------------------------------------------------------------------- /desk-article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frau-azadeh/Just-Food/HEAD/desk-article.png -------------------------------------------------------------------------------- /src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frau-azadeh/Just-Food/HEAD/src/app/favicon.ico -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [frau-azadeh] 4 | -------------------------------------------------------------------------------- /src/app/fonts/GeistVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frau-azadeh/Just-Food/HEAD/src/app/fonts/GeistVF.woff -------------------------------------------------------------------------------- /src/app/fonts/GeistMonoVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frau-azadeh/Just-Food/HEAD/src/app/fonts/GeistMonoVF.woff -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | images: { 5 | domains: ["www.themealdb.com"], 6 | }, 7 | }; 8 | 9 | export default nextConfig; 10 | -------------------------------------------------------------------------------- /src/app/error.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import React from 'react' 3 | 4 | const error = () => { 5 | return ( 6 |
7 |

!Oops,Please try a gain

8 |
9 | ) 10 | } 11 | 12 | export default error -------------------------------------------------------------------------------- /src/utils/api.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | const api = axios.create({ 4 | baseURL: "https://www.themealdb.com/api/json/v1/1", // Base URL for all API requests 5 | timeout: 5000, // Optional: Set a timeout for requests 6 | }); 7 | 8 | export default api; 9 | -------------------------------------------------------------------------------- /src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import CategoriesCarousel from "@/components/CategoriesCarousel"; 3 | import ImageSlider from "@/components/ImageSlider"; 4 | import RandomMeals from "@/components/RandomMeals"; 5 | 6 | const Page: React.FC = () => { 7 | return ( 8 |
9 | 10 | 11 | 12 |
13 | ); 14 | }; 15 | 16 | export default Page; 17 | -------------------------------------------------------------------------------- /src/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --background: #ffffff; 7 | --foreground: #171717; 8 | } 9 | 10 | @media (prefers-color-scheme: dark) { 11 | :root { 12 | --background: #0a0a0a; 13 | --foreground: #ededed; 14 | } 15 | } 16 | 17 | body { 18 | color: var(--foreground); 19 | background: var(--background); 20 | font-family: Arial, Helvetica, sans-serif; 21 | } 22 | 23 | @layer utilities { 24 | .text-balance { 25 | text-wrap: balance; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /workflow/github/food.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | on: 3 | push: 4 | branches: ["master"] 5 | pull_request: 6 | workflow_dispatch: 7 | 8 | jobs: 9 | lint: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4.2.1 13 | 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 20 17 | 18 | - name: Install Dependencies 19 | run: npm i 20 | 21 | - name: Prettier 22 | run: npm run prettier:check 23 | 24 | - name: Lint 25 | run: npm run lint 26 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | Please provide a brief description of the changes you made. 4 | 5 | ## Related Issue 6 | 7 | If this pull request is related to an issue, please link it here. 8 | 9 | ## Checklist 10 | 11 | - [ ] My code follows the style guidelines of this project. 12 | - [ ] I have performed a self-review of my code. 13 | - [ ] I have commented my code, particularly in hard-to-understand areas. 14 | - [ ] I have made corresponding changes to the documentation. 15 | - [ ] My changes generate no new warnings. 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | content: [ 5 | "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", 6 | "./src/components/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./src/app/**/*.{js,ts,jsx,tsx,mdx}", 8 | ], 9 | theme: { 10 | extend: { 11 | animation: { 12 | scroll: "scrollLeft 15s linear infinite", 13 | }, 14 | keyframes: { 15 | scrollLeft: { 16 | "0%": { transform: "translateX(0%)" }, 17 | "100%": { transform: "translateX(-50%)" }, 18 | }, 19 | }, 20 | }, 21 | }, 22 | plugins: [], 23 | }; 24 | 25 | export default config; 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /src/components/MenuGrid.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import MenuCard from "./MenuCard"; 3 | 4 | type Category = { 5 | idCategory: string; 6 | strCategory: string; 7 | strCategoryThumb: string; 8 | strCategoryDescription: string; 9 | }; 10 | 11 | type MenuGridProps = { 12 | categories: Category[]; 13 | }; 14 | 15 | const MenuGrid: React.FC = ({ categories }) => { 16 | return ( 17 |
18 |
19 | {categories.map((category) => ( 20 | 21 | ))} 22 |
23 |
24 | ); 25 | }; 26 | 27 | export default MenuGrid; 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "just-food", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint", 10 | "prettier:check": "prettier --check .", 11 | "prettier:fix": "prettier --write ." 12 | }, 13 | "dependencies": { 14 | "@trivago/prettier-plugin-sort-imports": "^5.2.2", 15 | "axios": "^1.7.9", 16 | "next": "14.2.20", 17 | "react": "^18", 18 | "react-dom": "^18", 19 | "react-error-boundary": "^6.0.0", 20 | "react-icons": "^5.4.0", 21 | "swiper": "^11.1.15" 22 | }, 23 | "devDependencies": { 24 | "@types/node": "^20", 25 | "@types/react": "^18", 26 | "@types/react-dom": "^18", 27 | "@types/swiper": "^5.4.3", 28 | "eslint": "^8", 29 | "eslint-config-next": "14.2.20", 30 | "postcss": "^8", 31 | "tailwindcss": "^3.4.1", 32 | "typescript": "^5" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/hooks/useFetchMeals.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import api from "../utils/api"; 3 | 4 | type Meal = { 5 | idMeal: string; 6 | strMeal: string; 7 | strMealThumb: string; 8 | }; 9 | 10 | export const useFetchMeals = (category: string | undefined) => { 11 | const [meals, setMeals] = useState([]); 12 | const [loading, setLoading] = useState(true); 13 | const [error, setError] = useState(null); 14 | 15 | useEffect(() => { 16 | const fetchMeals = async () => { 17 | try { 18 | const response = await api.get(`/filter.php?c=${category}`); 19 | setMeals(response.data.meals); 20 | } catch (err) { 21 | setError("Failed to fetch meals"); 22 | console.error(err); 23 | } finally { 24 | setLoading(false); 25 | } 26 | }; 27 | 28 | if (category) fetchMeals(); 29 | }, [category]); 30 | 31 | return { meals, loading, error }; 32 | }; 33 | -------------------------------------------------------------------------------- /src/components/MealCard.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Link from "next/link"; 3 | import Image from "next/image"; // ایمپورت Image از next/image 4 | 5 | type MealProps = { 6 | idMeal: string; 7 | strMeal: string; 8 | strMealThumb: string; 9 | }; 10 | 11 | const MealCard: React.FC = ({ idMeal, strMeal, strMealThumb }) => { 12 | return ( 13 | 14 |
15 |
16 | {strMeal} 23 |
24 |

{strMeal}

25 |
26 | 27 | ); 28 | }; 29 | 30 | export default MealCard; 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /src/hooks/useFetchCategories.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import api from "@/utils/api"; 3 | 4 | type Category = { 5 | idCategory: string; 6 | strCategory: string; 7 | strCategoryThumb: string; 8 | strCategoryDescription: string; 9 | }; 10 | 11 | export const useFetchCategories = () => { 12 | const [categories, setCategories] = useState([]); 13 | const [loading, setLoading] = useState(true); 14 | const [error, setError] = useState(null); 15 | 16 | useEffect(() => { 17 | const fetchCategories = async () => { 18 | try { 19 | const response = await api.get("/categories.php"); // Use base URL + endpoint 20 | setCategories(response.data.categories); 21 | } catch (err) { 22 | setError("Failed to fetch categories"); 23 | console.error(err); 24 | } finally { 25 | setLoading(false); 26 | } 27 | }; 28 | 29 | fetchCategories(); 30 | }, []); 31 | 32 | return { categories, loading, error }; 33 | }; 34 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["@trivago/prettier-plugin-sort-imports"], 3 | "importOrder": [ 4 | "^(vite|@vitejs)(/(.*))?$", 5 | "^(react|react-dom)(/(.*))?$", 6 | "^react-router(/(.*))?$", 7 | "^react-error-boundary(/(.*))?$", 8 | "^(immer|use-immer)(/(.*))?$", 9 | "^@tanstack(/(.*))?$", 10 | "^@dnd-kit(/(.*))?$", 11 | "^react-toastify(/(.*))?$", 12 | "^(react-hook-form|@hookform/resolvers|zod)(/(.*))?$", 13 | "^clsx(/(.*))?$", 14 | "", 15 | "^@/api", 16 | "^@/components", 17 | "^@/context", 18 | "^@/data", 19 | "^@/dto", 20 | "^@/hooks", 21 | "^@/icons", 22 | "^@/layouts", 23 | "^@/modals", 24 | "^@/pages", 25 | "^@/providers", 26 | "^@/reducers", 27 | "^@/schemas", 28 | "^@/stores", 29 | "^@/types", 30 | "^@/utils", 31 | "^@/styles", 32 | "^(\\.|\\.\\.)/(.(?!.css))*$", 33 | "\\.css$" 34 | ], 35 | "importOrderSeparation": true, 36 | "importOrderSortSpecifiers": true, 37 | "importOrderGroupNamespaceSpecifiers": true 38 | } 39 | -------------------------------------------------------------------------------- /src/hooks/useFetchMealDetails.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import api from "../utils/api"; 3 | 4 | type MealDetails = { 5 | idMeal: string; 6 | strMeal: string; 7 | strMealThumb: string; 8 | strInstructions: string; 9 | strCategory: string; 10 | strArea: string; 11 | [key: string]: string | undefined; 12 | }; 13 | 14 | export const useFetchMealDetails = (idMeal: string | undefined) => { 15 | const [meal, setMeal] = useState(null); 16 | const [loading, setLoading] = useState(true); 17 | const [error, setError] = useState(null); 18 | 19 | useEffect(() => { 20 | const fetchMealDetails = async () => { 21 | try { 22 | const response = await api.get(`/lookup.php?i=${idMeal}`); 23 | setMeal(response.data.meals[0]); 24 | } catch (err) { 25 | setError("Failed to fetch meal details"); 26 | console.error(err); 27 | } finally { 28 | setLoading(false); 29 | } 30 | }; 31 | 32 | if (idMeal) fetchMealDetails(); 33 | }, [idMeal]); 34 | 35 | return { meal, loading, error }; 36 | }; 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Azadeh Sharifi Soltani 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/CategoryCard.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import React from "react"; 4 | import Link from "next/link"; 5 | import Image from "next/image"; // ایمپورت Image از next/image 6 | 7 | type CategoryCardProps = { 8 | category: { 9 | strCategory: string; 10 | strCategoryThumb: string; 11 | strCategoryDescription: string; 12 | }; 13 | }; 14 | 15 | const CategoryCard: React.FC = ({ category }) => { 16 | return ( 17 | 21 | {category.strCategory} 28 |

29 | {category.strCategory} 30 |

31 |

32 | {category.strCategoryDescription.slice(0, 80)}... 33 |

34 | 35 | ); 36 | }; 37 | 38 | export default CategoryCard; 39 | -------------------------------------------------------------------------------- /src/components/MenuCard.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Image from "next/image"; // ایمپورت Image از next/image 3 | 4 | type Category = { 5 | idCategory: string; 6 | strCategory: string; 7 | strCategoryThumb: string; 8 | strCategoryDescription: string; 9 | }; 10 | 11 | type MenuCardProps = { 12 | category: Category; 13 | }; 14 | 15 | const MenuCard: React.FC = ({ category }) => { 16 | return ( 17 |
18 |
19 | {category.strCategory} 26 |
27 |

28 | {category.strCategory} 29 |

30 |

31 | {category.strCategoryDescription.slice(0, 80)}... 32 |

33 |
34 | ); 35 | }; 36 | 37 | export default MenuCard; 38 | -------------------------------------------------------------------------------- /src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import localFont from "next/font/local"; 3 | import "./globals.css"; 4 | import Footer from "@/components/Footer"; 5 | import Navbar from "@/components/NavBar"; 6 | import ScrollToTop from "@/components/ScrollToTop"; 7 | import MobileNavBar from "@/components/MobileNavBar"; 8 | 9 | const geistSans = localFont({ 10 | src: "./fonts/GeistVF.woff", 11 | variable: "--font-geist-sans", 12 | weight: "100 900", 13 | }); 14 | const geistMono = localFont({ 15 | src: "./fonts/GeistMonoVF.woff", 16 | variable: "--font-geist-mono", 17 | weight: "100 900", 18 | }); 19 | 20 | export const metadata: Metadata = { 21 | title: "Just Food", 22 | description: "Just Food", 23 | }; 24 | 25 | export default function RootLayout({ 26 | children, 27 | }: Readonly<{ 28 | children: React.ReactNode; 29 | }>) { 30 | return ( 31 | 32 | 35 | 36 | {children} 37 | 38 | 39 |