diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 00000000..7683ef55
Binary files /dev/null and b/.DS_Store differ
diff --git a/cal_predict/cal_api.py b/cal_predict/cal_api.py
new file mode 100755
index 00000000..35251877
--- /dev/null
+++ b/cal_predict/cal_api.py
@@ -0,0 +1,37 @@
+import pickle
+import pandas as pd
+from fastapi import FastAPI
+from pydantic import BaseModel
+
+# Initialize FastAPI app
+app = FastAPI()
+
+# Load model once at startup
+def load_model():
+ path = 'calorie_model.pkl'
+ with open(path, 'rb') as f:
+ return pickle.load(f)
+
+model = load_model()
+
+# Define request model
+class InputData(BaseModel):
+ Dish_Weight: float
+ Protein: float
+ Fat: float
+ Carbohydrates: float
+ Fiber: float
+
+@app.get("/")
+def home():
+ return {"message": "Calorie Prediction API is running!"}
+
+@app.post("/predict")
+def predict_calories(data: InputData):
+ df = pd.DataFrame([data.model_dump()]) # Use model_dump() instead of .dict()
+ pred = model.predict(df)
+ return {'Predicted Calories': pred[0]}
+
+if __name__ == '__main__':
+ import uvicorn
+ uvicorn.run(app, host="0.0.0.0", port=8000)
diff --git a/cal_predict/calorie_model.pkl b/cal_predict/calorie_model.pkl
new file mode 100755
index 00000000..52808ead
Binary files /dev/null and b/cal_predict/calorie_model.pkl differ
diff --git a/cal_predict/dockerfile b/cal_predict/dockerfile
new file mode 100755
index 00000000..235c24d8
--- /dev/null
+++ b/cal_predict/dockerfile
@@ -0,0 +1,17 @@
+# Use an official Python runtime as a parent image
+FROM python:3.10.0
+
+# Set the working directory in the container
+WORKDIR /app
+
+# Copy the current directory contents into the container at /app
+COPY . /app
+
+# Install dependencies
+RUN pip install --no-cache-dir -r requirements.txt
+
+# Expose the FastAPI default port
+EXPOSE 8000
+
+# Run the FastAPI application
+CMD ["python", "cal_api.py"]
diff --git a/cal_predict/requirements.txt b/cal_predict/requirements.txt
new file mode 100755
index 00000000..c7fd83c4
--- /dev/null
+++ b/cal_predict/requirements.txt
@@ -0,0 +1,6 @@
+fastapi
+uvicorn
+numpy
+pandas
+pydantic
+scikit-learn
\ No newline at end of file
diff --git a/fit-bite-web/.eslintrc.js b/fit-bite-web/.eslintrc.js
new file mode 100644
index 00000000..620d5211
--- /dev/null
+++ b/fit-bite-web/.eslintrc.js
@@ -0,0 +1,41 @@
+module.exports = {
+ env: {
+ browser:true,
+ node: true,
+ es2021: true,
+ },
+ extends: ["eslint:recommended", "plugin:react/recommended", "next/core-web-vitals"],
+ overrides: [
+ {
+ env: {
+ node: true,
+ },
+ files: [".eslintrc.{js,cjs}"],
+ parserOptions: {
+ sourceType: "script",
+ },
+ },
+ {
+ files: ["*.mjs"],
+ parserOptions: {
+ sourceType: "module",
+ },
+ },
+ ],
+ parserOptions: {
+ ecmaVersion: "latest",
+ sourceType: "module",
+ },
+ plugins: [
+ "react"],
+ rules: {
+ "react/prop-types": "off",
+ "react/react-in-jsx-scope": "off",
+ // allow jsx syntax in js files (for next.js project)
+ "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],},
+ settings: {
+ react: {
+ version: "detect",
+ },
+ },
+};
diff --git a/fit-bite-web/.eslintrc.json b/fit-bite-web/.eslintrc.json
new file mode 100644
index 00000000..76a186db
--- /dev/null
+++ b/fit-bite-web/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["next/core-web-vitals", "plugin:react-hooks/recommended"]
+}
diff --git a/fit-bite-web/.gitignore b/fit-bite-web/.gitignore
new file mode 100644
index 00000000..45c1abce
--- /dev/null
+++ b/fit-bite-web/.gitignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+.env
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/fit-bite-web/README.md b/fit-bite-web/README.md
new file mode 100644
index 00000000..e5f733ef
--- /dev/null
+++ b/fit-bite-web/README.md
@@ -0,0 +1,34 @@
+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm run dev
+# or
+yarn dev
+# or
+pnpm dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
+
+This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
diff --git a/fit-bite-web/app/Checkout/page.jsx b/fit-bite-web/app/Checkout/page.jsx
new file mode 100644
index 00000000..8c24cf46
--- /dev/null
+++ b/fit-bite-web/app/Checkout/page.jsx
@@ -0,0 +1,285 @@
+"use client";
+import React from "react";
+
+import "../globals.css";
+import { useState, useEffect } from "react";
+import { addtoCart, removeFromCart } from "../functions/cart";
+import { SubTotal } from "../functions/subtotal";
+import Head from "next/head";
+
+import { ToastContainer, toast } from "react-toastify";
+import { useRouter } from "next/navigation";
+import getStripe from "@/lib/getStripe";
+import { UserContext } from "../Context/UserProvider";
+import Image from "next/image";
+
+function Page() {
+ const router = useRouter();
+ const [cartData, setcartData] = useState({});
+
+ const [count, setCount] = useState(0);
+ const { loggedIn, userData, contextLoading, setCountAgain, login } =
+ React.useContext(UserContext);
+
+ let userId = userData._id;
+
+ const initiatePayment = async () => {
+
+ if (contextLoading == false) {
+ login()
+ if (!loggedIn) {
+ login()
+ router.replace("/login");
+ } else {
+ toast.loading("Redirecting...");
+ const stripe = await getStripe();
+ try {
+ const response = await fetch("api/stripe", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({ cartData, userId }),
+ });
+
+ let res = await response.json();
+ // console.log(res);
+ stripe.redirectToCheckout({
+ sessionId: res.id,
+ });
+ } catch (e) {
+ console.log(e);
+ }
+ }
+ }
+ };
+
+ useEffect(() => {
+ if (contextLoading == false) {
+ login()
+ }
+ try {
+ if (localStorage.getItem("cart")) {
+ setcartData(JSON.parse(localStorage.getItem("cart")));
+ saveCart(JSON.parse(localStorage.getItem("cart")));
+ }
+ } catch (error) {
+ console.error(error);
+ localStorage.removeItem("cart");
+ }
+ }, [contextLoading, loggedIn, userData, count, login]);
+
+ const handleClick = () => {
+ setCount((prev) => prev + 1);
+ setCountAgain((prev) => prev + 1);
+ };
+
+ const saveCart = (myCart) => {
+ localStorage.setItem("cart", JSON.stringify(myCart));
+ };
+ // let Subtotal;
+ // {
+ // typeof window !== "undefined" && (Subtotal = SubTotal());
+ // }
+
+ function CartAmountToggle({ k, cartData }) {
+ return (
+
+
+
+
+
+
+
{cartData[k].qty}
+
+
+ );
+ }
+
+ return (
+
+
+ {/* {!loggedIn ? (
+
+ Loading...
+
+ ) : (
+ <> */}
+
+
+
+
+ |
+ Product
+ |
+
+ Qty
+ |
+
+ Price
+ |
+
+
+
+
+ {Object.keys(cartData).map((k) => {
+ return (
+
+ |
+
+ {" "}
+
+ {" "}
+ {cartData[k].productName}
+
+
+ |
+
+
+
+ |
+
+ ${cartData[k].price?.toFixed(2)}
+ |
+
+ );
+ })}
+
+
+
+
+
+
Subtotal
+
+ {" "}
+
+
+ {typeof window !== "undefined" && (
+
${SubTotal()}
+ )}
+
+
+
+
Order Now
+
+ {" "}
+
+
+
+
+ {/* >
+ )} */}
+
+ );
+}
+
+export default Page;
diff --git a/fit-bite-web/app/Context/ChatContext.js b/fit-bite-web/app/Context/ChatContext.js
new file mode 100644
index 00000000..bcad73f3
--- /dev/null
+++ b/fit-bite-web/app/Context/ChatContext.js
@@ -0,0 +1,22 @@
+"use client";
+import { createContext, useContext, useState } from "react";
+
+const ChatContext = createContext();
+
+export const ChatProvider = ({ children }) => {
+ const [messages, setMessages] = useState([]);
+
+ const addMessage = (text, sender) => {
+ setMessages((prev) => [...prev, { id: Date.now(), text, sender }]);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useChat = () => {
+ return useContext(ChatContext);
+};
diff --git a/fit-bite-web/app/Context/SidebarContext.js b/fit-bite-web/app/Context/SidebarContext.js
new file mode 100644
index 00000000..1f81fc34
--- /dev/null
+++ b/fit-bite-web/app/Context/SidebarContext.js
@@ -0,0 +1,84 @@
+"use client";
+import React, { createContext, useContext, useState, useEffect } from "react";
+
+// type SidebarContextType = {
+// isExpanded: boolean;
+// isMobileOpen: boolean;
+// isHovered: boolean;
+// activeItem: string | null;
+// openSubmenu: string | null;
+// toggleSidebar: () => void;
+// toggleMobileSidebar: () => void;
+// setIsHovered: (isHovered: boolean) => void;
+// setActiveItem: (item: string | null) => void;
+// toggleSubmenu: (item: string) => void;
+// };
+
+const SidebarContext = createContext(undefined);
+
+export const useSidebar = () => {
+ const context = useContext(SidebarContext);
+ if (!context) {
+ throw new Error("useSidebar must be used within a SidebarProvider");
+ }
+ return context;
+};
+
+export const SidebarProvider= ({
+ children,
+}) => {
+ const [isExpanded, setIsExpanded] = useState(true);
+ const [isMobileOpen, setIsMobileOpen] = useState(false);
+ const [isMobile, setIsMobile] = useState(false);
+ const [isHovered, setIsHovered] = useState(false);
+ const [activeItem, setActiveItem] = useState(null);
+ const [openSubmenu, setOpenSubmenu] = useState(null);
+
+ useEffect(() => {
+ const handleResize = () => {
+ const mobile = window.innerWidth < 768;
+ setIsMobile(mobile);
+ if (!mobile) {
+ setIsMobileOpen(false);
+ }
+ };
+
+ handleResize();
+ window.addEventListener("resize", handleResize);
+
+ return () => {
+ window.removeEventListener("resize", handleResize);
+ };
+ }, []);
+
+ const toggleSidebar = () => {
+ setIsExpanded((prev) => !prev);
+ };
+
+ const toggleMobileSidebar = () => {
+ setIsMobileOpen((prev) => !prev);
+ };
+
+ const toggleSubmenu = (item) => {
+ setOpenSubmenu((prev) => (prev === item ? null : item));
+ };
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/fit-bite-web/app/Context/ThemeContext.js b/fit-bite-web/app/Context/ThemeContext.js
new file mode 100644
index 00000000..42fd8ba6
--- /dev/null
+++ b/fit-bite-web/app/Context/ThemeContext.js
@@ -0,0 +1,58 @@
+"use client";
+
+
+import { createContext, useState, useContext, useEffect } from "react";
+
+// type Theme = "light" | "dark";
+
+// type ThemeContextType = {
+// theme: Theme;
+// toggleTheme: () => void;
+// };
+
+const ThemeContext = createContext(undefined);
+
+export const ThemeProvider = ({
+ children,
+}) => {
+ const [theme, setTheme] = useState("light");
+ const [isInitialized, setIsInitialized] = useState(false);
+
+ useEffect(() => {
+ // This code will only run on the client side
+ const savedTheme = localStorage.getItem("theme");
+ const initialTheme = savedTheme || "light"; // Default to light theme
+
+ setTheme(initialTheme);
+ setIsInitialized(true);
+ }, []);
+
+ useEffect(() => {
+ if (isInitialized) {
+ localStorage.setItem("theme", theme);
+ if (theme === "dark") {
+ document.documentElement.classList.add("dark");
+ } else {
+ document.documentElement.classList.remove("dark");
+ }
+ }
+ }, [theme, isInitialized]);
+
+ const toggleTheme = () => {
+ setTheme((prevTheme) => (prevTheme === "light" ? "dark" : "light"));
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useTheme = () => {
+ const context = useContext(ThemeContext);
+ if (context === undefined) {
+ throw new Error("useTheme must be used within a ThemeProvider");
+ }
+ return context;
+};
diff --git a/fit-bite-web/app/Context/UserProvider.js b/fit-bite-web/app/Context/UserProvider.js
new file mode 100644
index 00000000..edac7b3d
--- /dev/null
+++ b/fit-bite-web/app/Context/UserProvider.js
@@ -0,0 +1,200 @@
+"use client";
+import React, { useCallback, useEffect, useState } from "react";
+var jwt = require("jsonwebtoken");
+const UserContext = React.createContext({
+ loggedIn: true,
+ setLoggedIn: ()=>{},
+ adminloggedIn: true,
+ setAdminLoggedIn: ()=>{},
+ admin: null,
+ user: null,
+ contextLoading: true,
+ userData: "",
+ setCountAgain: () => {},
+ cartData: 0,
+ // cart: null,
+ login: () => {},
+ logout: () => {},
+ adminlogin: () => {},
+ adminlogout: () => {},
+});
+const UserProvider = ({ children }) => {
+ const [loggedIn, setLoggedIn] = useState(true);
+ const [adminloggedIn, setAdminLoggedIn] = useState(false);
+ const [contextLoading, setContextLoading] = useState(true);
+ const [user, setUser] = useState({ value: null });
+ const [admin, setAdmin] = useState({ value: null });
+ const [userData, setUserData] = useState({});
+ const [countAgain, setCountAgain] = useState(0);
+ const [cartData, setcartData] = useState(0);
+
+
+
+
+ const getUser = useCallback(async(token)=> {
+ // if (loggedIn) {
+ if (token) {
+ setUser({ value: token });
+ try {
+ let decodedToken = jwt.decode(token);
+ // console.log("decoded token", decodedToken);
+ return decodedToken;
+ } catch (e) {
+ console.log("token verification failed");
+ setContextLoading(false);
+ }
+ } else {
+
+ console.log("token not found");
+ logout()
+ setContextLoading(false);
+ }
+ }, [])
+ const loginUser = useCallback(async(decodedToken) => {
+ try {
+ if (decodedToken) {
+ // console.log("token found", decodedToken.Email);
+ const response = await fetch(
+ `/api/login/?userEmail=${decodedToken.Email}`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ }
+ );
+ let responseData = await response.json();
+ // console.log("response data", responseData.result[0].Email);
+ if (response.status === 200) {
+ setUserData(responseData.result[0]);
+ setLoggedIn(true);
+ setContextLoading(false);
+ // if (decodedToken.Email === responseData.result[0].Email) {
+ // console.log("User found with that token. Verified");
+ // setLoggedIn(true);
+ // // console.log("token found");
+ // setContextLoading(false);
+ // }
+ } else {
+ console.log("User not found | Login Again");
+ logout();
+
+ setContextLoading(false);
+ }
+ }
+ } catch (e) {
+ console.log("Error", e.message);
+ }
+ },[])
+ // async function verifyToken(decodedToken) {
+ // if (decodedToken) {
+ // if (decodedToken.Email) {
+ // console.log("Token seems to be correct");
+ // setLoggedIn(true);
+ // // console.log("token found");
+ // setContextLoading(false);
+ // } else {
+ // logout();
+ // setContextLoading(false);
+ // }
+ // if (decodedToken.Email === userEmail) {
+ // console.log("token verified successfully");
+ // setLoggedIn(true);
+ // // console.log("token found");
+ // setContextLoading(false);
+ // } else {
+ // // If no token in local storage, set loggedIn to false
+ // console.log("Will implement verification feature in the future");
+ // setLoggedIn(true);
+ // setContextLoading(false);
+ // }
+ // }
+ // }
+// const stableLoginUser = useCallback(loginUser, []);
+// const stableGetUser = useCallback(getUser, []);
+ useEffect(() => {
+ if (window !== undefined) {
+ const token = localStorage.getItem("token");
+
+ const adminToken = localStorage.getItem("adminToken") || null;
+
+ // console.log({ adminToken });
+ if (adminToken) {
+ setAdmin({ value: adminToken });
+ // console.log("admin logged in");
+ setAdminLoggedIn(true);
+ setContextLoading(false);
+ } else {
+ // console.log("No admin Token found");
+ setAdminLoggedIn(false);
+ setContextLoading(false);
+ }
+ getUser(token, adminToken).then((user) => {
+ loginUser(user);
+ });
+ }
+ }, [loggedIn, adminloggedIn, loginUser, getUser]);
+ useEffect(() => {
+ // console.log("cart")
+ let keys = Object.keys(JSON.parse(localStorage.getItem("cart")) || {});
+ if (keys.length > 0) {
+ setcartData(
+ Object.values(JSON.parse(localStorage.getItem("cart"))).reduce(
+ (acc, item) => acc + item.qty,
+ 0
+ )
+ );
+ }
+ // let cartDataLength = keys.length;
+ // console.log({cartDataLength});
+ // setcartData(cartDataLength);
+ }, [countAgain]);
+
+ const login = useCallback(() => {
+ if (user.value) {
+ setLoggedIn(true);
+ // console.log("Token exists, user logged in");
+ }
+ },[user.value]);
+ const adminlogin = () => {
+ if (admin.value != null) {
+ setAdminLoggedIn(true);
+ // console.log("Admin Token exists, Admin logged in");
+ } else {
+ adminlogout();
+ }
+ };
+
+ const adminlogout = () => {
+ setAdminLoggedIn(false);
+ localStorage.removeItem("adminToken");
+ };
+ const logout = () => {
+ localStorage.removeItem("token");
+ setLoggedIn(false);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+export { UserContext, UserProvider };
diff --git a/fit-bite-web/app/account/[id]/page.jsx b/fit-bite-web/app/account/[id]/page.jsx
new file mode 100644
index 00000000..85870c0c
--- /dev/null
+++ b/fit-bite-web/app/account/[id]/page.jsx
@@ -0,0 +1,371 @@
+"use client";
+import React, { useEffect, useState } from "react";
+import { UserContext } from "@/app/Context/UserProvider";
+import { menuData } from "../../dishdata";
+import Link from "next/link";
+import { addtoCart } from "@/app/functions/cart";
+import { useRouter } from "next/navigation";
+import { ToastContainer, toast } from "react-toastify";
+import Image from "next/image";
+import "react-toastify/dist/ReactToastify.css";
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+function page({ params }) {
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState({});
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ const [submitted, setSubmitted] = useState(false);
+ const [errors, setErrors] = useState({ });
+
+ const [isChecked, setIsChecked] = useState({ checked: false });
+ const [formData, setFormData] = useState({
+ name: "",
+ Description: "",
+ Price: 0,
+ Carbohydrates:0,
+ Protein:0,
+ Fat: 0,
+ Calories:0,
+ restaurantId:slug,
+ type:""
+ });
+ let router = useRouter();
+ // async function render() {
+
+ // try {
+ // const response = await fetch(`/api/item?id=${slug}&dish=desserts`, {
+ // method: "GET",
+ // });
+ // if (response) {
+ // setitemData(res.result);
+ // // console.log(res.result, "response orders");
+ // }
+ // }catch (err) {
+ // console.log(err)
+ // }
+ // }
+ const handleInputChange = (e) => {
+ let name = e.target.name;
+ let value = e.target.value;
+
+ setFormData((prevData) => ({
+ ...prevData,
+ [name]: value,
+ restaurantId: slug,
+ image: "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+
+ }));
+}
+
+
+// Handle form submission
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ // setActiveStep(2)
+ // Convert form data to JSON
+ // const jsonData = JSON.stringify(formData, null, 2);
+ setErrors({})
+ const validationErrors = {};
+
+ if (!formData.name) {
+ validationErrors.name = "Please enter product name.";
+ }
+
+ if (!formData.Description) {
+ validationErrors.Description = "Description is required.";
+ }
+
+
+ if (Object.keys(validationErrors).length > 0) {
+ setErrors(validationErrors);
+ }
+
+ // { "username": "Abhi",
+ // "ContactNumber": 679234567890,
+ // "Email": "abhi2y@email.com",
+ // "Password": "abhi",
+ // "Address": "PNT Colony"
+ // }
+ // Log the JSON data (you can send it to a server or save it as needed)
+
+ // Convert form data to JSON
+ const jsonDataFinal = JSON.stringify(formData, null, 2);
+ console.log("String form Data Final", jsonDataFinal);
+ // console.log("String form Data Final", jsonDataFinal);
+ if (Object.keys(validationErrors).length == 0) {
+ try {
+ const response = await fetch(`/api/add-product`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+
+ if (response.status === 200) {
+ setSubmitted(true);
+ // console.log("Form data submitted successfully", formData);
+ toast.success("😎 Product created successfully!", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ setTimeout(() => {
+ router.replace("/dishes");
+ }, 3000);
+ setFormData({
+ username: "",
+ ContactNumber: 0,
+ Address: "",
+ Email: "",
+ Password: "",
+ });
+ } else {
+ console.error("Form submission failed");
+ }
+ } catch (error) {
+ console.error("Error:", error);
+ }}
+
+
+ // console.log(formData);
+ };
+
+ return (
+
+
Add Product
+
+
+
+
+ {/*
+ Zomato
+
*/}
+
+
+
+
+
+ ©2023 Fit-Bite. All rights reserved.
+
+
+
+
+ );
+}
+
+export default page;
diff --git a/fit-bite-web/app/account/page.jsx b/fit-bite-web/app/account/page.jsx
new file mode 100644
index 00000000..6ec8d6bb
--- /dev/null
+++ b/fit-bite-web/app/account/page.jsx
@@ -0,0 +1,576 @@
+"use client";
+import React from "react";
+import { UserContext } from "../Context/UserProvider";
+import Image from "next/image";
+import { useState, useEffect, useCallback } from "react";
+
+import "../globals.css";
+import { ToastContainer, toast } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import { useRouter } from "next/navigation";
+
+function Page() {
+ // console.log(restaurantTypes.items[0])
+ const { loggedIn, userData, contextLoading } = React.useContext(UserContext);
+
+ let [toggleEdit, SetToggleEdit] = useState(false);
+ let [toggleRestaurants, SetToggleRestaurants] = useState(false);
+ const [errors, setErrors] = useState({ default: "default is required" });
+ const [submitted, setSubmitted] = useState(false);
+ const [restaurantData, setRestaurantData] = useState({});
+
+ const router = useRouter();
+
+ // console.log(userData?.username, "above form");
+ const [formData, setFormData] = useState({
+ username: "",
+ ContactNumber: 0,
+ Address: "",
+ Email: "",
+ Password: "",
+ });
+
+ // Handle input changes and update state
+ const handleInputChange = (e) => {
+ let name = e.target.name;
+ let value = e.target.value;
+
+ setFormData((prevData) => ({
+ ...prevData,
+ [name]: value,
+ }));
+ //Validation Logic Here
+ const validationErrors = {};
+
+ if (formData.username.length > 0 && formData.username.length < 4) {
+ validationErrors.username =
+ "Username should have more than 4 characters.";
+ }
+ if (formData.Password.length > 0 && formData.Password.length < 5) {
+ validationErrors.Password = "Password should be atleast of 5 characters.";
+ }
+ console.log(
+ formData.Password.includes(formData.username),
+ formData.Password.length > 0
+ );
+ if (
+ formData.Password.length > 0 &&
+ formData.Password.includes(formData.username)
+ ) {
+ validationErrors.Password = "Username should not be used as a password.";
+ }
+ if (formData.Email.length > 1 && formData.Email.length < 10) {
+ validationErrors.Email = "Please enter correct E-mail id";
+ }
+ if (
+ formData.ContactNumber.length > 0 &&
+ formData.ContactNumber.length < 10 &&
+ formData.ContactNumber.length > 10
+ ) {
+ validationErrors.ContactNumber = "Please enter correct Contact Number";
+ }
+
+ if (Object.keys(validationErrors).length > 0) {
+ setErrors(validationErrors);
+ } else {
+ setErrors(validationErrors);
+ }
+ };
+ const isFormValid = () => {
+ // Check if there are any errors in the errors state
+ return Object.values(errors).every((error) => error === "");
+ };
+ // Handle form submission
+ const handleSubmit = async (id, e) => {
+ e.preventDefault();
+
+ const validationErrors = {};
+
+ if (formData.username.length > 0 && formData.username.length < 4) {
+ validationErrors.username =
+ "Username should have more than 4 characters.";
+ }
+
+ if (formData.Password.length > 0 && formData.Password.length < 5) {
+ validationErrors.Password = "Password should be atleast of 5 characters.";
+ }
+
+ if (formData.Password.includes(formData.username)) {
+ validationErrors.Password = "Username should not be used as a password.";
+ }
+ if (formData.Email.length > 1 && formData.Email.length < 10) {
+ validationErrors.Email = "Please enter correct E-mail id";
+ }
+ if (
+ formData.ContactNumber.length > 0 &&
+ formData.ContactNumber.length < 10 &&
+ formData.ContactNumber.length > 10
+ ) {
+ validationErrors.ContactNumber = "Please enter correct Contact Number";
+ }
+
+ if (Object.keys(validationErrors).length > 0) {
+ setErrors(validationErrors);
+ }
+
+ // { "username": "Abhi",
+ // "ContactNumber": 679234567890,
+ // "Email": "abhi2y@email.com",
+ // "Password": "abhi",
+ // "Address": "California"
+ // }
+ // Log the JSON data (you can send it to a server or save it as needed)
+
+ // Convert form data to JSON
+ const jsonDataFinal = JSON.stringify(formData, null, 2);
+ // console.log("String form Data Final", jsonDataFinal);
+ try {
+ const response = await fetch(`/api/account/${id}`, {
+ method: "PUT",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+ let res = await response.json();
+ if (response.status === 200) {
+ toast.success("😎 AccountInfo updated successfully!", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ // console.log(res.token)
+ if (res.token) {
+ localStorage.setItem("token", res.token);
+ }
+ setSubmitted(true);
+ console.log("Account Information Successfully Updated", formData);
+ setTimeout(() => {
+ router.push("/");
+ }, 3000);
+ setFormData({
+ username: "",
+ ContactNumber: 0,
+ Address: "",
+ Email: "",
+ Password: "",
+ });
+ } else {
+ toast.error("👹 Invalid Data! Try Again.", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ console.error("Form submission failed");
+ }
+ } catch (error) {
+ console.error("Error:", error);
+ }
+ // console.log(formData);
+ };
+ // mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true });
+ // setTimeout(() => {
+ // const decoded = jwt.decode(user.value);
+
+ // if (loggedIn) {
+ // // let token = localStorage.getItem('token')
+ // console.log(decoded);
+ // }
+ // if (decoded.Email) {
+
+ // const user = User.find({
+ // Email: decoded.Email,
+ // });
+ // console.log("user", user);
+ // }
+ // }, 5000);
+ const getRestaurant = useCallback(async() =>{
+ try {
+ if (userData._id) {
+ // console.log("user ID found", userData._id);
+ const response = await fetch(
+ `/api/restaurants/?userId=${userData._id}`,
+ {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ }
+ );
+ let responseData = await response.json();
+ // console.log("response data", responseData.result[0].Email);
+ if (response.status === 200) {
+ // console.log("response status", responseData.result[0].restaurantType.items)
+ // console.log(responseData.result, "response data result");
+ // setRestaurantType(responseData.result[0].restaurantType);
+ setRestaurantData(responseData.result);
+
+ // if (decodedToken.Email === responseData.result[0].Email) {
+ // console.log("User found with that token. Verified");
+ // setLoggedIn(true);
+ // // console.log("token found");
+ // setContextLoading(false);
+ // }
+ } else {
+ console.log("No restaurants found | Login Again");
+ }
+ }
+ } catch (e) {
+ console.log("Error", e.message);
+ }
+ },[userData._id])
+ useEffect(() => {
+ if (contextLoading == false) {
+ if (loggedIn) {
+ // console.log(userData?.username);
+
+ getRestaurant();
+ }
+ if (!loggedIn) {
+ console.log("else from orders page is getting triggered");
+
+ router.push("/login");
+ }
+ }
+ }, [loggedIn, userData, submitted, contextLoading, getRestaurant, router]);
+ function editInfo() {
+ SetToggleEdit(!toggleEdit);
+ }
+ function restaurantInfo() {
+ SetToggleRestaurants(!toggleRestaurants);
+ }
+
+ return (
+
+
+
+ Loading...
+
+
+ Account Information
+
+
+
+ 🙅♂️
+
+
+
+ {userData?.username}, How are you?
+
+
+ Email: {userData?.Email}
+
+
+ Contact Number:{" "}
+ {userData?.ContactNumber}
+
+
+ Address:{" "}
+ {userData?.Address}
+
+
+
+ {toggleEdit ? (
+
+ ) : (
+ ""
+ )}
+
+ {/* RESTAURANT DATA */}
+ restaurantInfo()}
+ className={`text-gray-600 body-font cursor-pointer p-6 m-8 ml-0 w-fit ${
+ restaurantData && restaurantData.length > 0 ? "block" : "hidden"
+ }`}
+ >
+ {!toggleRestaurants ? "View" : "Hide"} Restaurants
+
+ {toggleRestaurants ? (
+
+ {restaurantData &&
+ restaurantData.map((item, index) => (
+ router.push(`/account/${item._id}`)}
+ >
+
+ Restaurant Details
+
+ {/*
+ Get ready with your menu card 🎉
+
*/}
+
+
+ Restaurant Name:{" "}
+
+ {item.restaurantName}
+ {/* {console.log(item.restaurantName, "restaurantName")} */}
+
+
+
+ Contact Number:{" "}
+
+ {item.restaurantContactNumber}
+
+
+
+ E-mail:{" "}
+
+ {item.restaurantEmail}
+
+
+
+ Restaurant Address:{" "}
+
+ {item.restaurantAddress}
+
+
+
+ Restaurant Latitude:{" "}
+ {item.restaurantLat}
+
+
+ Restaurant Longitude:{" "}
+ {item.restaurantLng}
+
+ {/*
*/}
+
+ RestaurantType
+
+ {/* //
*/}
+
+ {/* {restaurantType && restaurantType.items && restaurantType.items.map((item, index) => ( */}
+ {/*
*/}
+ {/* ))} */}
+
+ {/*
+ Our team will soon reach out to you!
+
*/}
+
+ ))}
+
+ ) : (
+ ""
+ )}
+
+
+ );
+}
+
+export default Page;
diff --git a/fit-bite-web/app/add-restaurant/page.jsx b/fit-bite-web/app/add-restaurant/page.jsx
new file mode 100644
index 00000000..6150620a
--- /dev/null
+++ b/fit-bite-web/app/add-restaurant/page.jsx
@@ -0,0 +1,348 @@
+"use client";
+import React, { useState, useEffect } from "react";
+import Tabs from "../components/Tabs";
+import RestaurantType from "../components/RestaurantType";
+import { UserContext } from "../Context/UserProvider";
+import useGeoLocation from "./useGeoLocationHook";
+import { useRouter } from "next/navigation";
+import { CldUploadWidget } from 'next-cloudinary';
+function CreateRestaurant() {
+ const location = useGeoLocation();
+ const { loggedIn, contextLoading, userData, login } =
+ React.useContext(UserContext);
+
+ let router = useRouter();
+
+ const [formData, setFormData] = useState({
+ restaurantName: "",
+ restaurantContactNumber: 0,
+ restaurantEmail: "",
+ restaurantAddress: "",
+ restaurantLat: location.coordinates?.lat || "Not Available",
+ restaurantLng: location.coordinates?.lng || "Not Available",
+ restaurantType: {
+ items: [
+ {
+ name: "",
+ description: "",
+ },
+ ],
+ },
+ });
+ useEffect(() => {
+ if (contextLoading == false) {
+ login();
+ setFormData((prevFormData) => ({
+ ...prevFormData,
+ restaurantLat: location.coordinates?.lat || "",
+ restaurantLng: location.coordinates?.lng || "",
+ }));
+ if (!loggedIn) {
+ login();
+ setTimeout(() => {
+ router.push("/login");
+ }, 2000);
+ }
+ }
+ }, [loggedIn, contextLoading, userData, location, login, router]);
+
+ const overlayStyles = {
+ // position: "absolute",
+ // top: 0,
+ // left: 0,
+ // right:0,
+ // bottom:0,
+ // marginLeft:"14px",
+ // width: "100%",
+ // height: "100%",
+ display: "none",
+ // justifyContent: "center",
+ // alignItems: "center",
+ // backgroundColor: "rgba(0, 0, 0, 0.5)",
+ // zIndex: 9999,
+ };
+
+ const [activeStep, setActiveStep] = useState(1); // Declare activeStep state
+ const [submitted, setSubmitted] = useState(false);
+ const [errors, setErrors] = useState({});
+ //Handling form data
+
+ // let lat = location.coordinates?.lat;
+ // let lng = location.coordinates?.lng;
+
+ // setFormData((prevData) => ({
+ // ...prevData,
+ // restaurantLat:lat,
+
+ // restaurantLng:lng
+ // }));
+
+ // Handle input changes and update state
+ const handleInputChange = (e) => {
+ let name = e.target.name;
+ let value = e.target.value;
+
+ setFormData((prevData) => ({
+ ...prevData,
+ [name]: value,
+ userId: userData._id,
+ }));
+ };
+
+ // Handle form submission
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ // Validation logic here
+ const validationErrors = {};
+
+ if (!formData.restaurantName) {
+ validationErrors.restaurantName = "Name is required.";
+ }
+ if (!formData.restaurantContactNumber) {
+ validationErrors.restaurantContactNumber = "Contact Number is required.";
+ }
+ if (!formData.restaurantEmail) {
+ validationErrors.restaurantEmail = "Restaurant Email is required.";
+ }
+ if (!formData.restaurantAddress) {
+ validationErrors.restaurantAddress = "Restaurant Address is required.";
+ }
+
+ if (
+ formData.restaurantEmail.length > 1 &&
+ formData.restaurantEmail.length < 10
+ ) {
+ validationErrors.restaurantEmail = "Please enter correct E-mail id";
+ }
+ if (formData.restaurantEmail.length < 1) {
+ validationErrors.restaurantEmail = "Please enter E-mail id";
+ }
+ if (formData.restaurantContactNumber.length < 9) {
+ validationErrors.restaurantContactNumber =
+ "Please enter correct Contact Number";
+ }
+
+ if (Object.keys(validationErrors).length > 0) {
+ setErrors(validationErrors);
+ } else {
+ setSubmitted(true);
+ setActiveStep(2);
+ }
+ // console.log(formData);
+ };
+ // Conditionally set the overlay to be visible
+ if (location.coordinates && location.coordinates.lat) {
+ overlayStyles.display = "none";
+ } else {
+ overlayStyles.display = "block";
+ }
+ return (
+
+
+
+
+
+ {!loggedIn ? (
+
+ Loading...
+
+ ) : (
+ <>
+
+
+
+
+
+
+
+
+ ADDRESS
+
+
+ Please place the pin accurately at your outlet’s location
+ on the map
+
+
+
+
+ EMAIL
+
+
+ example@email.com
+
+
+ PHONE
+
+
123-456-7890
+
+
+
+
+
+ Restaurant Details
+
+
+ Name, address and location
+
+
+ {submitted && (
+
+
Form submitted successfully!
+
+
+ )}
+
+
+
+
+
+ >
+ )}
+
+ );
+}
+export default CreateRestaurant;
diff --git a/fit-bite-web/app/add-restaurant/restaurantTypeData.js b/fit-bite-web/app/add-restaurant/restaurantTypeData.js
new file mode 100644
index 00000000..9741d3ed
--- /dev/null
+++ b/fit-bite-web/app/add-restaurant/restaurantTypeData.js
@@ -0,0 +1,117 @@
+const restaurantTypeData = [
+ {
+ index:0,
+ name: "Fine Dining Restaurant",
+ description:
+ "These restaurants offer high-quality cuisine and a formal dining experience. They often have an elegant ambiance, trained staff, and a wide selection of food..",
+ icon: (
+
+ ),
+ },
+ {
+ index:1,
+ name: "Casual Dining Restaurant",
+ description:
+ "Customers can enjoy a variety of dishes at affordable prices, and they typically don't require reservations.",
+ icon: (
+
+ ),
+ },
+ {
+ name: "Fast Food Restaurant",
+ description:
+ "Fast food restaurants serve quick, convenient, and affordable meals.",
+ icon: (
+
+ ),
+ },
+ {
+ name: "Café or Coffee Shop",
+ description: "Cafés are known for serving coffee, tea, and light meals.",
+ icon: (
+
+ ),
+ },
+
+ {
+ name: "Bistro",
+ description:
+ "A bistro is a small, cozy eatery that offers a mix of classic and contemporary dishes. It often has a European-inspired menu and a relaxed ambiance.",
+ icon: (
+
+ ),
+ },
+ {
+ name: "Ethnic or Specialty Restaurant",
+ description:
+ "These restaurants focus on specific cuisines or dishes from around the world. Examples include Italian, Mexican, Thai, sushi bars, and seafood restaurants.",
+ icon: (
+
+ ),
+ },
+];
+
+export default restaurantTypeData;
diff --git a/fit-bite-web/app/add-restaurant/useGeoLocationHook.jsx b/fit-bite-web/app/add-restaurant/useGeoLocationHook.jsx
new file mode 100644
index 00000000..6b9bd221
--- /dev/null
+++ b/fit-bite-web/app/add-restaurant/useGeoLocationHook.jsx
@@ -0,0 +1,43 @@
+import { useState, useEffect } from "react";
+
+const useGeoLocation = () => {
+ const [location, setLocation] = useState({
+ loaded: false,
+ coordinates: { lat: "", lng: "" },
+ });
+
+ const onSuccess = (location) => {
+ setLocation({
+ loaded: true,
+ coordinates: {
+ lat: location.coords.latitude,
+ lng: location.coords.longitude,
+ },
+ });
+ };
+
+ const onError = (error) => {
+ setLocation({
+ loaded: true,
+ error: {
+ code: error.code,
+ message: error.message,
+ },
+ });
+ };
+
+ useEffect(() => {
+ if (!("geolocation" in navigator)) {
+ onError({
+ code: 0,
+ message: "Geolocation not supported",
+ });
+ }
+
+ navigator.geolocation.getCurrentPosition(onSuccess, onError);
+ }, []);
+
+ return location;
+};
+
+export default useGeoLocation;
\ No newline at end of file
diff --git a/fit-bite-web/app/admin/page.jsx b/fit-bite-web/app/admin/page.jsx
new file mode 100644
index 00000000..9d029ad3
--- /dev/null
+++ b/fit-bite-web/app/admin/page.jsx
@@ -0,0 +1,250 @@
+"use client";
+import React from "react";
+import { useState, useEffect } from "react";
+import { useRouter } from "next/navigation";
+import { UserContext } from "../Context/UserProvider";
+import Link from "next/link";
+// var jwt = require("jsonwebtoken");
+function Page() {
+ const [orders, setOrders] = useState([]);
+ const [counter, setCounter] = useState(0);
+ const [selectedStatus, setSelectedStatus] = useState({});
+ const { contextLoading, adminloggedIn, adminlogout} =
+ React.useContext(UserContext);
+ const router = useRouter();
+ const handleChange = (event, order) => {
+ // console.log(event, order.chargeId);
+ setSelectedStatus({ chargeId: order.chargeId, status: event });
+ };
+
+ const handleUpdateStatus = async (order) => {
+ // console.log(order.chargeId);
+ // console.log(selectedStatus);
+ // console.log(order._id);
+ let jsonData = {
+ deliveryStatus: selectedStatus.status,
+ };
+ const jsonDataFinal = JSON.stringify(jsonData, null, 2);
+ const response = await fetch(`/api/orders/${order._id}`, {
+ method: "PUT",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+
+ // const data = await response.json();
+
+ if (response.status === 200) {
+ // Update UI to reflect successful update
+ console.log("Delivery status updated successfully!");
+ setCounter((prev) => prev + 1);
+ } else {
+ // Handle error
+ console.error(response.message);
+ }
+ };
+ async function render() {
+ try {
+ const response = await fetch("/api/orders", {
+ method: "GET",
+ });
+ let res = await response.json();
+ if (response.status === 200) {
+ setOrders(res.orders);
+ }
+ } catch (err) {
+ console.log(err);
+ }
+ }
+
+ useEffect(() => {
+ if (typeof window !== "undefined") {
+ if (contextLoading == false) {
+ // console.log({adminloggedIn}, "adminlogged in");
+ if (adminloggedIn) {
+ // adminlogin();
+ render();
+ // adminlogin();
+ }
+ if (!adminloggedIn) {
+
+ console.log("else from admin orders page is getting triggered");
+ // Schedule the redirect after 3 seconds
+ setTimeout(() => {
+ router.push("/adminSignin");
+ }, 1000);
+ }
+ }
+ }
+ // else {
+ // // Show the div first
+
+ // // Schedule the redirect after 3 seconds
+ // setTimeout(() => {
+ // router.push("/login");
+ // }, 3000);
+ // }
+
+ // getUser().then(()=>{
+ // console.log({decoded});
+ // })
+
+ // cs_test_a1sBkOnJyyCv9FfZt5rogyFokDMk60s6SSVyrogePJGRyVE8u8I1c1vA2Y
+ }, [adminloggedIn, contextLoading, selectedStatus, counter, router]);
+
+ return (
+
+
+ {" "}
+ {contextLoading || !adminloggedIn ? (
+
+ Loading...
+
+ ) : orders.length > 0 ? (
+ "Recent Orders"
+ ) : (
+ "No Orders Found"
+ )}
+ {/* {orders.length > 0 ? "Recent Orders" : "Orders Found: NAN"} */}
+
+
+ {adminloggedIn ? (
+
+
+
+ {orders?.map((order) => (
+ //
{order.chargeId,
+ // order.userId,
+ // order.orderStatus,
+ // order.amount,
+ // order.paymentMethod,
+ // order.billingEmail,
+ // order.cardBrand,
+ // order.last4Digits,
+ // order.receipt_url}
+
+
+ Order ID: {order.chargeId}
+
+
+ {/*
*/}
+
+ {/*
*/}
+
+
+
+ Amount:{" "}
+
+ {order.amount / 100} INR.
+
+
+
+ {order.orderStatus.toUpperCase()}
+
+
+
+ Method: {order.paymentMethod}
+
+
+ Billing Email: {order.billingEmail}
+
+
+ Card Brand: {order.cardBrand}
+
+
+ Last 4 Digits: {order.last4Digits}
+
+
+
+
+ {order?.deliveryStatus
+ ? order.deliveryStatus === "Delivered"
+ ? ""
+ : "Delivery Status: "
+ : "Awaiting approval"}
+
+ {order?.deliveryStatus}
+
+
+
+
+
+
+ {" "}
+ Invoice
+
+
+
+
+
+ ))}
+
+
+
+ ) : (
+
+ )}
+
+ );
+}
+
+export default Page;
diff --git a/fit-bite-web/app/adminSignin/page.jsx b/fit-bite-web/app/adminSignin/page.jsx
new file mode 100644
index 00000000..e1993182
--- /dev/null
+++ b/fit-bite-web/app/adminSignin/page.jsx
@@ -0,0 +1,315 @@
+"use client";
+import React from "react";
+import { useState } from "react";
+import Image from "next/image";
+import Link from "next/link";
+import "../globals.css";
+import { ToastContainer, toast } from "react-toastify";
+// import { injectStyle } from "react-toastify/dist/inject-style";
+import "react-toastify/dist/ReactToastify.css";
+import { useRouter } from "next/navigation";
+import { UserContext } from "../Context/UserProvider";
+function LoginPage() {
+ const { setAdminLoggedIn } = React.useContext(UserContext);
+ const [submitted, setSubmitted] = useState(false);
+ const [errors, setErrors] = useState({ });
+
+ const [isChecked, setIsChecked] = useState({ checked: false });
+ const [formData, setFormData] = useState({
+ Email: "",
+ Password: "",
+ });
+ let router = useRouter();
+ const handleCheckboxChange = () => {
+ // Toggle the value of isChecked when the checkbox is clicked
+ setIsChecked({ checked: !isChecked.checked });
+ };
+ // IF REMEMBER ME IS CHECKED DO THIS
+ // if(isChecked.checked === true) {
+
+ // console.log("Don't ask for password for this user again")
+ // }
+
+ // Handle input changes and update state
+ const handleInputChange = (e) => {
+ let name = e.target.name;
+ let value = e.target.value;
+
+ setFormData((prevData) => ({
+ ...prevData,
+ [name]: value,
+ }));
+ //Validation Logic Here
+ // const validationErrors = {};
+
+ // if (!formData.Email) {
+ // validationErrors.Email = "Please enter your Email for future updates.";
+ // }
+
+ // if (!formData.Password) {
+ // validationErrors.Password = "Password is required.";
+ // }
+
+ // if (formData.Password.includes(formData.username)) {
+ // validationErrors.Password = "Username should not be used as a password.";
+ // }
+ // if (formData.Email.length > 1 && formData.Email.length < 10) {
+ // validationErrors.Email = "Please enter correct E-mail id";
+ // }
+ // if (formData.Email.length < 1) {
+ // validationErrors.Email = "Please enter your Email for future updates.";
+ // }
+
+ // if (Object.keys(validationErrors).length > 0) {
+ // setErrors(validationErrors);
+
+ // // console.log(validationErrors)
+ // // setShouldSignup(false);
+ // } else {
+ // setErrors(validationErrors);
+ // }
+ };
+ // const isFormValid = () => {
+ // // Check if there are any errors in the errors state
+ // return Object.values(errors).every((error) => error === "");
+ // };
+ // Handle form submission
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ // setActiveStep(2)
+ // Convert form data to JSON
+ // const jsonData = JSON.stringify(formData, null, 2);
+ setErrors({})
+ const validationErrors = {};
+
+ if (!formData.Email) {
+ validationErrors.Email = "Please enter your Email for future updates.";
+ }
+
+ if (!formData.Password) {
+ validationErrors.Password = "Password is required.";
+ }
+
+ if (formData.Password.includes(formData.username)) {
+ validationErrors.Password = "Username should not be used as a password.";
+ }
+ if (formData.Email.length > 1 && formData.Email.length < 10) {
+ validationErrors.Email = "Please enter correct E-mail id";
+ }
+ if (formData.Email.length < 1) {
+ validationErrors.Email = "Please enter your Email for future updates.";
+ }
+
+ if (Object.keys(validationErrors).length > 0) {
+ setErrors(validationErrors);
+ }
+
+ // { "username": "Abhi",
+ // "ContactNumber": 679234567890,
+ // "Email": "abhi2y@email.com",
+ // "Password": "abhi",
+ // "Address": "PNT Colony"
+ // }
+ // Log the JSON data (you can send it to a server or save it as needed)
+
+ // Convert form data to JSON
+ const jsonDataFinal = JSON.stringify(formData, null, 2);
+ // console.log("String form Data Final", jsonDataFinal);
+ if (Object.keys(validationErrors).length == 0) {
+ try {
+ const response = await fetch("/api/admin", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+ // console.log(response.body);
+ if (response.status === 201) {
+ // Parse the JSON response and extract the token
+ const responseData = await response.json();
+ const token = responseData.token;
+
+ // Use the extracted token for further processing
+ // console.log("Token:", token);
+ // const token = response.cookies.get("token")
+ localStorage.setItem("adminToken", token);
+ setSubmitted(true);
+ // console.log("Form data submitted successfully", formData);
+ setAdminLoggedIn(true);
+ // adminlogin()
+ // setAdminEmail(formData.Email)
+
+ toast.success("🎉 Signed In successfully! Redirecting 🤗", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ setTimeout(() => {
+ router.push("/admin");
+ }, 3000);
+
+ setFormData({
+ Email: "",
+ Password: "",
+ });
+ } else {
+ console.error("Form submission failed");
+ toast.error("👹 Admin Not Found!", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ setFormData({
+ Email: "",
+ Password: "",
+ });
+ setIsChecked({ checked: false });
+ }
+ } catch (error) {
+ console.error("Error:", error);
+ }
+ }
+ // console.log(formData);
+ };
+
+ return (
+
+
+
+
+ {/*
+ Zomato
+
*/}
+
+
+
+
+
+ {`Don't`} have an account?
+ Contact Developer
+
+
+
+ ©2023 Zomato. All rights reserved.
+
+
+
+ );
+}
+
+export default LoginPage;
diff --git a/fit-bite-web/app/aiTrainer/page.jsx b/fit-bite-web/app/aiTrainer/page.jsx
new file mode 100644
index 00000000..d5a10f94
--- /dev/null
+++ b/fit-bite-web/app/aiTrainer/page.jsx
@@ -0,0 +1,233 @@
+"use client";
+import { useState, useEffect, useRef } from "react";
+import { useChat } from "../Context/ChatContext";
+import ReactMarkdown from 'react-markdown';
+const VideoRecorder = () => {
+ // const { messages, addMessage } = useChat();
+ const [messages, setMessages] = useState([]);
+ const [input, setInput] = useState("");
+ const chatEndRef = useRef(null);
+ const videoRef = useRef(null);
+ const mediaRecorderRef = useRef(null);
+ const [recording, setRecording] = useState(false);
+ const chunks = useRef([]);
+ const [selectedFile, setSelectedFile] = useState(null);
+ const [uploading, setUploading] = useState(false);
+ const [response, setResponse] = useState(null);
+ const [exercise, setExercise] = useState("");
+ const handleFileChange = (e) => {
+ console.log(e.target.files[0]);
+ setSelectedFile(e.target.files[0]);
+ };
+ const handleChange = (event) => {
+ // console.log(event, order.chargeId);
+ setExercise(event);
+ };
+ const addMessage = (text, sender) => {
+ setMessages((prevMessages) => [
+ ...prevMessages,
+ { id: prevMessages.length, text, sender },
+ ]);
+ };
+ useEffect(() => {
+ chatEndRef.current?.scrollIntoView({ behavior: "smooth" });
+ }, [messages]);
+
+ const handleSend = () => {
+ if (!input.trim()) return;
+
+ addMessage(input, "user");
+
+ // Simulate AI response
+ setTimeout(() => {
+ addMessage("Hello! How can I help you?", "ai");
+ }, 1000);
+
+ setInput("");
+ };
+ const handleUpload = async () => {
+ if (!selectedFile) {
+ alert("Please select a video file first.");
+ return;
+ }
+
+ setUploading(true);
+ const formData = new FormData();
+ formData.append("file", selectedFile, selectedFile.name);
+
+ try {
+ const res = await fetch("/api/uploadVideoML", {
+ method: "POST",
+ body: formData,
+ });
+
+ const result = await res.json();
+ console.log({ result });
+ setResponse(result);
+ let prompt = ` I am doing this ${exercise}, and my current joint angle is ${result.angles} degrees. Give me feedback on whether I am doing it correctly. Also suggest improveents if needed`;
+ try {
+ const resFinal = await fetch("/api/ai", {
+ method: "POST",
+ body: JSON.stringify({prompt}),
+ });
+ console.log({ resFinal });
+ let responseText= await resFinal.text();
+ console.log({ responseText });
+ // const = await resFinal2.text();
+ // console.log({ responseText });
+
+ const aiMessages = responseText.match(/[^.!?]+[.!?]+/g) || [];
+ const formattedText = aiMessages.replace(/\n/g, '
');
+ for (const msg of formattedText) {
+ if (msg.trim()) {
+ addMessage(msg.trim(), "ai");
+ await new Promise((resolve) => setTimeout(resolve, 500)); // Delay between messages
+ }
+ }
+ } catch (err) {
+ console.log(err, "gemini error");
+ }
+ } catch (error) {
+ console.error("Upload failed:", error);
+ }
+
+ setUploading(false);
+ };
+
+ useEffect(() => {
+ async function getCameraStream() {
+ try {
+ const stream = await navigator.mediaDevices.getUserMedia({
+ video: true,
+ audio: true,
+ });
+ if (videoRef.current) {
+ videoRef.current.srcObject = stream;
+ }
+ } catch (error) {
+ console.error("Error accessing webcam:", error);
+ }
+ }
+ getCameraStream();
+ }, []);
+
+ const startRecording = () => {
+ if (!videoRef.current || !videoRef.current.srcObject) return;
+
+ chunks.current = [];
+ const stream = videoRef.current.srcObject;
+ const mediaRecorder = new MediaRecorder(stream);
+
+ mediaRecorder.ondataavailable = (event) => {
+ if (event.data.size > 0) {
+ chunks.current.push(event.data);
+ }
+ };
+
+ mediaRecorder.onstop = async () => {
+ const blob = new Blob(chunks.current, { type: "video/webm" });
+
+ // Convert Blob to File
+ const file = new File([blob], "recorded-video.webm", {
+ type: "video/webm",
+ });
+
+ // Upload video to API for saving
+ const formData = new FormData();
+ formData.append("video", file);
+
+ try {
+ const response = await fetch("/api/uploadVideo", {
+ method: "POST",
+ body: blob, // Send raw video data
+ });
+
+ const data = await response.json();
+ // console.log(data.message, "Saved at:", data.filePath);
+ } catch (error) {
+ console.error("Error uploading video:", error);
+ }
+ };
+
+ mediaRecorderRef.current = mediaRecorder;
+ mediaRecorder.start();
+ setRecording(true);
+ };
+
+ const stopRecording = () => {
+ if (mediaRecorderRef.current) {
+ mediaRecorderRef.current.stop();
+ }
+ setRecording(false);
+ };
+
+ return (
+
+
+
+ {!recording ? (
+
+ ) : (
+
+ )}
+
+
+
+ {/* chat */}
+
+
+ {messages.map((msg) => (
+
+ ))}
+
+
+
+
+ setInput(e.target.value)}
+ onKeyDown={(e) => e.key === "Enter" && handleSend()}
+ placeholder="Type your message..."
+ />
+
+
+
+
+ );
+};
+
+export default VideoRecorder;
diff --git a/fit-bite-web/app/api/account/[account]/route.js b/fit-bite-web/app/api/account/[account]/route.js
new file mode 100644
index 00000000..5470ee79
--- /dev/null
+++ b/fit-bite-web/app/api/account/[account]/route.js
@@ -0,0 +1,135 @@
+import User from "@/app/models/UserModel";
+import mongoose from "mongoose";
+import { NextResponse } from "next/server";
+var CryptoJS = require("crypto-js");
+var jwt = require("jsonwebtoken");
+await mongoose.connect(process.env.MONGODB_URI);
+
+export async function PUT(req, content) {
+ try {
+ console.log(content);
+ let userId = content.params.account;
+ let filter = { _id: userId };
+ let payload = await req.json();
+ console.log(payload);
+
+ let modifypayload = Object.keys(payload);
+ for (var i = 0; i < modifypayload.length; i++) {
+ if (Object.values(payload)[i].length < 2) {
+ console.log("I am going to delete", modifypayload[i]);
+ delete modifypayload[i];
+ } else if (typeof Object.values(payload)[i] === "number") {
+ if (Object.values(payload)[i].toString().length < 9) {
+ console.log("I am going to delete this number", modifypayload[i]);
+ delete modifypayload[i];
+ }
+ } else {
+ console.log(modifypayload[i]);
+ }
+ }
+ const resultObject = modifypayload.reduce((obj, key) => {
+ if (key !== undefined) {
+ obj[key] = payload[key];
+ }
+ return obj;
+ }, {});
+
+ console.log(resultObject, "resultObject");
+ console.log(modifypayload, "modifyPayload");
+
+ let result;
+ if (resultObject.Password) {
+ console.log(resultObject.Password, "Password");
+ if (resultObject.Password.toString().length > 2) {
+ resultObject.Password = CryptoJS.AES.encrypt(
+ resultObject?.Password,
+ "SecretKey"
+ ).toString();
+ // let objWithPw = {
+ // username: payload?.username,
+ // ContactNumber: payload?.ContactNumber,
+ // Address: payload?.Address,
+ // Email: payload?.Email,
+ // Password: CryptoJS.AES.encrypt(
+ // payload?.Password,
+ // "SecretKey"
+ // ).toString(),
+ // };
+ // {
+ // username: 'Abhijeet',
+ // ContactNumber: '1234567789',
+ // Address: '22/3 LA, USA',
+ // Email: 'abhijeet@mail.com',
+ // Password: 'kensis-tyddAf-6qormi'
+ // }
+ }
+ }
+ result = await User.findOneAndUpdate(filter, resultObject);
+ // else {
+
+ // result = await User.findOneAndUpdate(filter,resultObject);
+ // }
+ if (result._id && resultObject.Email.length > 1) {
+ var token = jwt.sign(
+ {
+ Email: resultObject.Email,
+ },
+ process.env.JWT_SECRET,
+ { expiresIn: "3d" }
+ );
+
+ console.log("Token", token);
+ return NextResponse.json({ result, token, success: true });
+ }
+
+ /// REVERT BACK ///////////
+ // let result;
+ // if (payload.Password.length> 2) {
+ // let objWithPw = {
+ // username: payload?.username,
+ // ContactNumber: payload?.ContactNumber,
+ // Address: payload?.Address,
+ // Email: payload?.Email,
+ // Password: CryptoJS.AES.encrypt(
+ // payload?.Password,
+ // "SecretKey"
+ // ).toString(),
+ // };
+ // // {
+ // // username: 'Abhijeet',
+ // // ContactNumber: '1234567789',
+ // // Address: '22/3 LA, USA',
+ // // Email: 'abhijeet@mail.com',
+ // // Password: 'kensis-tyddAf-6qormi'
+ // // }
+ // result = await User.findOneAndUpdate(filter, objWithPw);
+ // } else {
+ // delete payload.Password
+ // result = await User.findOneAndUpdate(filter, payload);
+ // }
+ // if (result._id) {
+ // var token = jwt.sign(
+ // {
+ // Email: payload.Email,
+ // username: payload.username,
+ // ContactNumber: payload.ContactNumber,
+ // Address: payload.Address,
+ // },
+ // process.env.JWT_SECRET,
+ // { expiresIn: "3d" }
+ // );
+
+ // console.log("Token", token);
+ // return NextResponse.json({ result, token, success: true });
+ // }
+ /// REVERT BACK ///////////
+
+ // order = await Order.findOne({ chargeId });
+ // } else {
+ // order = await Order.findByIdAndUpdate(id, { deliveryStatus });
+
+ return NextResponse.json({ result, success: true });
+ } catch (err) {
+ return NextResponse.json({ success: false });
+ }
+}
diff --git a/fit-bite-web/app/api/add-product/route.js b/fit-bite-web/app/api/add-product/route.js
new file mode 100644
index 00000000..05ed11aa
--- /dev/null
+++ b/fit-bite-web/app/api/add-product/route.js
@@ -0,0 +1,14 @@
+import mongoose from "mongoose";
+import OtherProduct from "@/app/models/OtherProductModel";
+import { NextResponse } from "next/server";
+var CryptoJS = require("crypto-js");
+
+
+export async function POST(req) {
+ const payload = await req.json();
+ await mongoose.connect(process.env.MONGODB_URI);
+ const { name, Description, Price, image, Calories, Protein, Fat, Carbohydrates, restaurantId, type} = payload;
+ let user = new OtherProduct({ name, Description, Price, image, Calories, Protein, Fat, Carbohydrates, restaurantId, type});
+ const result = await user.save();
+ return NextResponse.json({ result, success: true });
+ }
\ No newline at end of file
diff --git a/fit-bite-web/app/api/admin/route.js b/fit-bite-web/app/api/admin/route.js
new file mode 100644
index 00000000..7bc23b1d
--- /dev/null
+++ b/fit-bite-web/app/api/admin/route.js
@@ -0,0 +1,63 @@
+import mongoose from "mongoose";
+import Admin from "@/app/models/AdminModel";
+import { NextResponse } from "next/server";
+var jwt = require("jsonwebtoken");
+await mongoose.connect(process.env.MONGODB_URI);
+
+// export async function POST(req, res) {
+// const payload = await req.json();
+// await mongoose.connect(process.env.MONGODB_URI);
+// const { username, Email, Password } = payload;
+// let user = new Admin({ username, Email, Password});
+// const result = await user.save();
+// return NextResponse.json({ result, success: true });
+// }
+export async function POST(req) {
+ let success = true;
+ let message = "Successfully Logged in";
+ let status = 201;
+ const payload = await req.json();
+
+ console.log(payload);
+ const user = await Admin.find({
+ Email: payload.Email,
+ });
+ console.log(user, "user found");
+
+ console.log(user.Password);
+ if (user.length !== 0) {
+ if (
+ payload.Email === user[0].Email &&
+ payload.Password === user[0].Password
+ ) {
+ console.log("Authenticated", user[0].Email, user[0].Password);
+ var token = jwt.sign(
+ {
+ Email: user[0].Email,
+ username: user[0].username,
+ },
+ process.env.JWT_SECRET,
+ { expiresIn: "3d" }
+ );
+
+ console.log("Token", token);
+ // cookies().set('adminToken', token, { secure: true })
+ return NextResponse.json(
+ { result: user, success, message, token: token },
+ { status, headers: { "content-type": "application/json" } }
+ );
+ } else {
+ console.log("Wrong password");
+ return NextResponse.json(
+ { success: false, message: "Wrong Password" },
+ { status: 401, headers: { "content-type": "application/json" } }
+ );
+ }
+ } else if (user.length === 0) {
+ console.log("User not found");
+ return NextResponse.json(
+ { result: user, success: false, message: "User not found" },
+ { status: 200, headers: { "content-type": "application/json" } }
+ );
+ }
+}
diff --git a/fit-bite-web/app/api/ai/route.js b/fit-bite-web/app/api/ai/route.js
new file mode 100644
index 00000000..38c81b81
--- /dev/null
+++ b/fit-bite-web/app/api/ai/route.js
@@ -0,0 +1,17 @@
+import { GoogleGenerativeAI } from "@google/generative-ai";
+
+export async function POST(req) {
+ try {
+ const { prompt } = await req.json();
+ console.log({prompt})
+ const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
+ const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" });
+
+ const result = await model.generateContent(prompt);
+ const responseText = result.response.text();
+console.log({responseText})
+ return Response.json({ text: responseText });
+ } catch (error) {
+ return Response.json({ error: "Failed to generate response" }, { status: 500 });
+ }
+}
diff --git a/fit-bite-web/app/api/desserts/route.js b/fit-bite-web/app/api/desserts/route.js
new file mode 100644
index 00000000..8f2a37c9
--- /dev/null
+++ b/fit-bite-web/app/api/desserts/route.js
@@ -0,0 +1,57 @@
+import mongoose from "mongoose";
+// import User from '@/models/UserModel';
+import Dessert from '@/app/models/DessertModel';
+import { NextResponse } from "next/server";
+ // const handler = async (req, res) =>{
+ // const {name, email, password} = req.body
+ // const user = await User.create({
+ // name,
+ // email,
+ // password
+ // })
+ // res.status(201).json({
+ // message: 'User Created Successfully',
+ // user
+ // })
+
+ export async function POST(req) {
+ const payload = await req.json();
+ await mongoose.connect(process.env.MONGODB_URI);
+ let d = new Dessert(payload);
+ const result = await d.save();
+ return NextResponse.json({ result, success: true });
+ }
+ export async function GET() {
+ let desserts =[]
+ let success = true
+ try{
+ await mongoose.connect(process.env.MONGODB_URI);
+ desserts= await Dessert.find();
+
+ console.log(desserts);
+ // if(user){
+ // if (req.body.Email == user.Email && req.body.Password == user.Password){
+ // // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+ // return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+ // // username:user.username, Email:user.Email
+ // // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+ // }
+
+ // }
+ }catch(e){
+ desserts={result:"error"}
+ success=false
+ // console.log(e);
+ }
+ return NextResponse.json({result:desserts, success});
+ // else {
+ // // If no user is found, send a different response (e.g., success: false)
+ // res.status(200).json({ success: false, message: "User not found" });
+ // }
+ // const payload = await req.json();
+ // await mongoose.connect(process.env.MONGODB_URI);
+ // let user = new User(payload);
+ // const result = await user.save();
+ // return NextResponse.json({ result, success: true });
+ }
+ // ex
\ No newline at end of file
diff --git a/fit-bite-web/app/api/ecommerce/route.js b/fit-bite-web/app/api/ecommerce/route.js
new file mode 100644
index 00000000..a8b3103c
--- /dev/null
+++ b/fit-bite-web/app/api/ecommerce/route.js
@@ -0,0 +1,39 @@
+import mongoose from "mongoose";
+// import User from '@/models/UserModel';
+import User from '@/app/models/UserModel';
+import { NextResponse } from "next/server";
+
+ export async function GET() {
+ let users =[]
+ let success = true
+ try{
+ await mongoose.connect(process.env.MONGODB_URI);
+ users= await User.countDocuments();
+
+ console.log(users);
+ // if(user){
+ // if (req.body.Email == user.Email && req.body.Password == user.Password){
+ // // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+ // return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+ // // username:user.username, Email:user.Email
+ // // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+ // }
+
+ // }
+ }catch(e){
+ users={result:"error"}
+ success=false
+ // console.log(e);
+ }
+ return NextResponse.json({result:users, success});
+ // else {
+ // // If no user is found, send a different response (e.g., success: false)
+ // res.status(200).json({ success: false, message: "User not found" });
+ // }
+ // const payload = await req.json();
+ // await mongoose.connect(process.env.MONGODB_URI);
+ // let user = new User(payload);
+ // const result = await user.save();
+ // return NextResponse.json({ result, success: true });
+ }
+ // ex
\ No newline at end of file
diff --git a/fit-bite-web/app/api/item/route.js b/fit-bite-web/app/api/item/route.js
new file mode 100644
index 00000000..e801bd48
--- /dev/null
+++ b/fit-bite-web/app/api/item/route.js
@@ -0,0 +1,42 @@
+import mongoose from "mongoose";
+import Pastries from "@/app/models/PastriesModel";
+import LargeCake from "@/app/models/LargeCakesModel";
+import smallCake from "@/app/models/SmallCakesModel";
+import Dessert from "@/app/models/DessertModel";
+import { NextResponse } from "next/server";
+import OtherProduct from "@/app/models/OtherProductModel";
+export async function GET(req) {
+ let dish = req.nextUrl.searchParams.get("dish") || 1;
+ console.log({dish})
+ console.log(req.nextUrl.searchParams.get("id"))
+ let pastries;
+ let success = true;
+ console.log(req.url)
+let model;
+console.log(dish=='pastries')
+ if (dish == 'pastries') {
+ model = Pastries;
+ }else if (dish == "desserts") {
+ model = Dessert;
+ }else if(dish == "largeCakes"){
+ model = LargeCake;
+ }else if(dish=="otherProducts"){
+ model=OtherProduct;
+ }
+
+ else{
+ model = smallCake;
+ }
+ try {
+ await mongoose.connect(process.env.MONGODB_URI);
+ pastries = await model.find({
+ _id: req.nextUrl.searchParams.get("id"),
+ });
+ } catch (e) {
+ pastries = { result: "error" };
+ success = false;
+ // console.log(e);
+ }
+ return NextResponse.json({ result: pastries[0], success });
+ }
+
\ No newline at end of file
diff --git a/fit-bite-web/app/api/largeCakes/route.js b/fit-bite-web/app/api/largeCakes/route.js
new file mode 100644
index 00000000..b4e3771e
--- /dev/null
+++ b/fit-bite-web/app/api/largeCakes/route.js
@@ -0,0 +1,59 @@
+import mongoose from "mongoose";
+// import User from '@/models/UserModel';
+import LargeCake from '@/app/models/LargeCakesModel';
+import { NextResponse } from "next/server";
+// import { largeCake } from '@/app/database/mongooseSchema';
+ // const handler = async (req, res) =>{
+ // const {name, email, password} = req.body
+ // const user = await User.create({
+ // name,
+ // email,
+ // password
+ // })
+ // res.status(201).json({
+ // message: 'User Created Successfully',
+ // user
+ // })
+
+ export async function POST(req) {
+ const payload = await req.json();
+ await mongoose.connect(process.env.MONGODB_URI);
+ let d = new LargeCake(payload);
+ const result = await d.save();
+ return NextResponse.json({ result, success: true });
+ }
+
+ export async function GET() {
+ let LargeCakes =[]
+ let success = true
+ try{
+ await mongoose.connect(process.env.MONGODB_URI);
+ LargeCakes= await LargeCake.find();
+
+ console.log(LargeCakes);
+ // if(user){
+ // if (req.body.Email == user.Email && req.body.Password == user.Password){
+ // // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+ // return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+ // // username:user.username, Email:user.Email
+ // // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+ // }
+
+ // }
+ }catch(e){
+ LargeCakes={result:"error"}
+ success=false
+ // console.log(e);
+ }
+ return NextResponse.json({result:LargeCakes, success});
+ // else {
+ // // If no user is found, send a different response (e.g., success: false)
+ // res.status(200).json({ success: false, message: "User not found" });
+ // }
+ // const payload = await req.json();
+ // await mongoose.connect(process.env.MONGODB_URI);
+ // let user = new User(payload);
+ // const result = await user.save();
+ // return NextResponse.json({ result, success: true });
+ }
+ // ex
\ No newline at end of file
diff --git a/fit-bite-web/app/api/login/route.js b/fit-bite-web/app/api/login/route.js
new file mode 100644
index 00000000..15b59f70
--- /dev/null
+++ b/fit-bite-web/app/api/login/route.js
@@ -0,0 +1,153 @@
+"use server"
+import mongoose from "mongoose";
+import User from "../../models/UserModel";
+import { NextResponse } from "next/server";
+var CryptoJS = require("crypto-js");
+var jwt = require("jsonwebtoken");
+import { cookies } from 'next/headers'
+
+
+// String does not match expected pattern occurs on not parsing the response to JSON or fetching the wrong URL
+
+
+// const handler = async (req, res) =>{
+// const {name, email, password} = req.body
+// const user = await User.create({
+// name,
+// email,
+// password
+// })
+// res.status(201).json({
+// message: 'User Created Successfully',
+// user
+// })
+
+// export async function POST(req, res) {
+// // let user = [];
+// const payload = await req.json();
+// await mongoose.connect(process.env.MONGODB_URI);
+// let user = await User.find({
+// Email: payload.Email,
+// });
+// console.log(user);
+// if (user) {
+// if (
+// payload.Email === user[0].Email &&
+// payload.Password === user[0].Password
+// ) {
+// console.log("Authenticated");
+// // status;
+// // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+// return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+// // username:user.username, Email:user.Email
+// // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+// } else {
+// // message = "Wrong username or Email address";
+// // success = false;
+// // status = 401;
+// return NextResponse.json({success: false, message: "Wrong username or Email address"})
+// }
+// }
+// }
+
+await mongoose.connect(process.env.MONGODB_URI);
+export async function POST(req) {
+ // let user = [];
+ let success = true;
+ let message = "Successfully Logged in";
+ let status = 201;
+ const payload = await req.json();
+
+ // console.log(payload.Email===undefined);
+
+ // if(payload.Email===undefined) {
+ // message="User not found"
+ // }
+ // hhi@mail.com
+ // console.log(payload.Password)
+ // console.log(JSON.parse(encryptedPassword))
+ console.log(payload)
+ const user = await User.find({
+ Email: payload.Email,
+ });
+ console.log(user);
+
+ console.log(payload.Password);
+ if (user.length !== 0) {
+ let decryptedPassword = CryptoJS.AES.decrypt(
+ user[0].Password,
+ process.env.CRYPTO_JS_KEY
+ ).toString(CryptoJS.enc.Utf8);
+ console.log(decryptedPassword);
+
+
+ if (
+ payload.Email === user[0].Email &&
+ payload.Password === decryptedPassword
+ ) {
+ console.log("Authenticated", user[0].Email, user[0].Password);
+ var token = jwt.sign({Email:user[0].Email, username: user[0].username, ContactNumber: user[0].ContactNumber, Address: user[0].Address}, process.env.JWT_SECRET, { expiresIn: '3d' });
+
+ console.log("Token", token)
+ // var objToken = {
+ // token: token,
+ // }
+ //Save Cookies=>
+ // const response = NextResponse.json(token, {status:201} );
+ // response.cookies.set("token", token,{
+ // httpOnly: true
+ // });
+ // return response;
+
+ cookies().set('token', token, { secure: true, httpOnly: true })
+
+ return NextResponse.json(
+ { result: user, success, message,token: token },
+ { status, headers: { "content-type": "application/json" } }
+ );
+ } else {
+ console.log("Wrong password");
+ return NextResponse.json(
+ { success: false, message: "Wrong Password" },
+ { status: 401, headers: { "content-type": "application/json" } }
+ );
+ }
+ } else if (user.length === 0) {
+ console.log("User not found");
+ return NextResponse.json(
+ { result: user, success: false, message: "User not found" },
+ { status: 200, headers: { "content-type": "application/json" } }
+ );
+ }
+
+ // user = { result: "Error" };
+ // success = false;
+ // message = "Invalid Credientials";
+ // status=200
+ // console.log("Error is", e);
+
+ // return NextResponse.json({result:user, success})
+}
+// export async function gettingUserss(userEmail) {
+// await mongoose.connect(process.env.MONGODB_URI);
+// const user = await User.find({
+// Email: userEmail,
+// });
+// console.log(user);
+// // return user
+// }
+
+export async function GET(req) {
+ try {
+
+ let userEmail= req.nextUrl.searchParams.get("userEmail");
+ console.log(userEmail);
+ const users = await User.find({Email:userEmail});
+
+ console.log(users, "from login");
+ return NextResponse.json( { result: users})
+ } catch (error) {
+ console.error('Error fetching users:', error);
+ NextResponse.json({ error: 'Internal Server Error' });
+ }
+}
\ No newline at end of file
diff --git a/fit-bite-web/app/api/orderCount/route.js b/fit-bite-web/app/api/orderCount/route.js
new file mode 100644
index 00000000..f0e62d1f
--- /dev/null
+++ b/fit-bite-web/app/api/orderCount/route.js
@@ -0,0 +1,39 @@
+import mongoose from "mongoose";
+// import User from '@/models/UserModel';
+import Order from "@/app/models/OrderModel";
+import { NextResponse } from "next/server";
+
+ export async function GET() {
+ let users =0;
+ let success = true
+ try{
+ await mongoose.connect(process.env.MONGODB_URI);
+ users= await Order.countDocuments();
+
+ console.log(users);
+ // if(user){
+ // if (req.body.Email == user.Email && req.body.Password == user.Password){
+ // // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+ // return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+ // // username:user.username, Email:user.Email
+ // // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+ // }
+
+ // }
+ }catch(e){
+ users={result:"error"}
+ success=false
+ // console.log(e);
+ }
+ return NextResponse.json({result:users, success});
+ // else {
+ // // If no user is found, send a different response (e.g., success: false)
+ // res.status(200).json({ success: false, message: "User not found" });
+ // }
+ // const payload = await req.json();
+ // await mongoose.connect(process.env.MONGODB_URI);
+ // let user = new User(payload);
+ // const result = await user.save();
+ // return NextResponse.json({ result, success: true });
+ }
+ // ex
\ No newline at end of file
diff --git a/fit-bite-web/app/api/orders/[id]/route.js b/fit-bite-web/app/api/orders/[id]/route.js
new file mode 100644
index 00000000..d2c6774f
--- /dev/null
+++ b/fit-bite-web/app/api/orders/[id]/route.js
@@ -0,0 +1,71 @@
+import Order from "@/app/models/OrderModel";
+import mongoose from "mongoose";
+import { NextResponse } from "next/server";
+
+
+await mongoose.connect(process.env.MONGODB_URI);
+
+export async function PUT(req, content)
+{
+ console.log(content)
+ let orderId = content.params.id
+ let filter = {_id:orderId};
+ let payload = await req.json()
+ console.log(payload)
+ let result = await Order.findOneAndUpdate(filter, payload)
+
+
+ // order = await Order.findOne({ chargeId });
+ // } else {
+ // order = await Order.findByIdAndUpdate(id, { deliveryStatus });
+
+
+return NextResponse.json({result, success: true})
+}
+
+// export async function POST(req, res) {
+// const payload = await req.json();
+// console.log({ payload });
+// const { chargeId, deliveryStatus, id } = payload;
+// // Establish a global connection outside the function
+
+// try {
+// let order;
+// // Find by chargeId first for better search performance
+// if (chargeId) {
+// order = await Order.findOne({ chargeId });
+// } else {
+// order = await Order.findByIdAndUpdate(id, { deliveryStatus });
+// }
+
+// if (!order) {
+// return NextResponse.json({ success: false, message: 'Order not found' });
+// }
+
+// // order.deliveryStatus = deliveryStatus;
+// // await order.save();
+// console.log('updated');
+// return NextResponse.json({ order, success: true });
+// } catch (err) {
+// console.error(err); // Log full error object
+// return NextResponse.json({ success: false, message: 'Internal server error' });
+// }
+
+// // try{
+// // let order = await Order.find({ chargeId: orderId });
+// // console.log(order);
+// // if (!order) {
+// // return res.status(404).json({ message: 'Order not found' });
+// // }
+// // if(order){
+// // order.deliveryStatus = deliveryStatus;
+// // const result = await order.save();
+// // console.log("updated")
+// // return NextResponse.json({ result, success: true });
+// // }
+
+// // }catch(err){
+// // return NextResponse.json({ success: false, message: err.message });
+
+// // }
+// }
diff --git a/fit-bite-web/app/api/orders/route.js b/fit-bite-web/app/api/orders/route.js
new file mode 100644
index 00000000..55e5e796
--- /dev/null
+++ b/fit-bite-web/app/api/orders/route.js
@@ -0,0 +1,100 @@
+import Order from "@/app/models/OrderModel";
+import mongoose from "mongoose";
+import { NextResponse } from "next/server";
+
+
+export async function GET() {
+
+ await mongoose.connect(process.env.MONGODB_URI);
+
+
+ const orders = await Order.find().sort({ createdAt: -1 });
+ if(orders.length > 0){
+ // console.log(orders);
+ return NextResponse.json({ orders, success: true });
+ }
+
+ return NextResponse.json({ success: true });
+
+
+
+}
+
+
+export async function POST(req) {
+ const payload = await req.json();
+ // console.log(payload);
+ const {
+ deliveryStatus,
+ chargeId,
+ userId,
+ orderStatus,
+ amount,
+ paymentMethod,
+ billingEmail,
+ cardBrand,
+ last4Digits,
+ receipt_url,
+ } = payload;
+ console.log(userId, "from route");
+ await mongoose.connect(process.env.MONGODB_URI);
+ // try{
+if(payload.deliveryStatus){
+ let orders = await Order.find({
+ userId
+ }).sort({ createdAt: -1 });
+ try{
+ let Orders = new Order({
+ deliveryStatus,
+ chargeId,
+ userId,
+ orderStatus,
+ amount,
+ paymentMethod,
+ billingEmail,
+ cardBrand,
+ last4Digits,
+ receipt_url,
+ });
+ const result = await Orders.save();
+ return NextResponse.json({ result, orders, success: true }, {status: 201});
+}
+catch(err){
+ console.error(err);
+ console.log(orders, "form catch")
+ return NextResponse.json({ orders, success: true }, {status: 200});
+}
+ // if(orders.length > 0){
+ // console.log(orders);
+ // }
+} else{
+
+ let orders = await Order.find({
+ userId
+ }).sort({ createdAt: -1 });
+ if(orders.length > 0){
+ console.log(orders, "from else block");
+ return NextResponse.json({ orders, success: true });
+ }
+}
+ // return NextResponse.json({ orders:result, success: true });
+// }catch(err){
+// console.log(err);
+ // if(userId){
+ // console.log(userId, "from catch");
+ // const orders1 = await Order.find({
+ // userId,
+ // });
+
+ // if(orders1.length > 0){
+ // console.log(orders1, "from route");
+ // return NextResponse.json({ orders:orders1 });
+ // }
+ // }
+
+
+// return NextResponse.json({ success: false });
+
+
+// }
+}
diff --git a/fit-bite-web/app/api/otherProducts/route.js b/fit-bite-web/app/api/otherProducts/route.js
new file mode 100644
index 00000000..37e720f8
--- /dev/null
+++ b/fit-bite-web/app/api/otherProducts/route.js
@@ -0,0 +1,28 @@
+import mongoose from "mongoose";
+import OtherProduct from "@/app/models/OtherProductModel";
+import { NextResponse } from "next/server";
+
+ export async function GET() {
+ let desserts =[]
+ let success = true
+ try{
+ await mongoose.connect(process.env.MONGODB_URI);
+ desserts= await OtherProduct.find();
+
+ console.log(desserts);
+ // if(user){
+ // if (req.body.Email == user.Email && req.body.Password == user.Password){
+ // // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+ // return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+ // // username:user.username, Email:user.Email
+ // // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+ // }
+
+ // }
+ }catch(e){
+ desserts={result:"error"}
+ success=false
+
+ }
+ return NextResponse.json({result:desserts, success});
+ }
diff --git a/fit-bite-web/app/api/pastries/route.js b/fit-bite-web/app/api/pastries/route.js
new file mode 100644
index 00000000..3f766c19
--- /dev/null
+++ b/fit-bite-web/app/api/pastries/route.js
@@ -0,0 +1,79 @@
+import mongoose from "mongoose";
+// import User from '@/models/UserModel';
+import Pastries from "@/app/models/PastriesModel";
+import { NextResponse } from "next/server";
+
+//Get pastries based on pagination
+export async function GET(req) {
+ let page = req.nextUrl.searchParams.get("page") || 1;
+ let pageSize = 3;
+ let skip = (page - 1) * pageSize;
+ let pastries = [];
+ let success = true;
+ try {
+ await mongoose.connect(process.env.MONGODB_URI);
+ pastries = await Pastries.find().skip(skip).limit(pageSize);
+
+ // console.log(pastries);
+ } catch (e) {
+ pastries = { result: "error" };
+ success = false;
+ // console.log(e);
+ }
+ return NextResponse.json({ result: pastries, success });
+}
+
+
+
+export async function POST(req) {
+ const payload = await req.json();
+ await mongoose.connect(process.env.MONGODB_URI);
+ let d = new Pastries(payload);
+ const result = await d.save();
+ return NextResponse.json({ result, success: true });
+}
+//Get all pastries
+// export async function GET() {
+// let pastries = [];
+// let success = true;
+// try {
+// await mongoose.connect(process.env.MONGODB_URI);
+// pastries = await Pastries.find();
+
+// console.log(pastries);
+// } catch (e) {
+// pastries = { result: "error" };
+// success = false;
+// }
+// return NextResponse.json({ result: pastries, success });
+// }
+
+// if(user){
+// if (req.body.Email == user.Email && req.body.Password == user.Password){
+// // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+// return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+// // username:user.username, Email:user.Email
+// // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+// }
+
+// }
+// if(user){
+// if (req.body.Email == user.Email && req.body.Password == user.Password){
+// // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+// return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+// // username:user.username, Email:user.Email
+// // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+// }
+
+// }
+// console.log(e);
+// else {
+// // If no user is found, send a different response (e.g., success: false)
+// res.status(200).json({ success: false, message: "User not found" });
+// }
+// const payload = await req.json();
+// await mongoose.connect(process.env.MONGODB_URI);
+// let user = new User(payload);
+// const result = await user.save();
+// return NextResponse.json({ result, success: true });
+// ex
diff --git a/fit-bite-web/app/api/restaurants/route.js b/fit-bite-web/app/api/restaurants/route.js
new file mode 100644
index 00000000..521e63be
--- /dev/null
+++ b/fit-bite-web/app/api/restaurants/route.js
@@ -0,0 +1,37 @@
+import Restaurant from "@/app/models/RestaurantModel";
+import mongoose from "mongoose";
+import { NextResponse } from "next/server";
+
+export async function GET(req) {
+ try {
+
+ let userId= req.nextUrl.searchParams.get("userId");
+ console.log({userId});
+ const Restaurants = await Restaurant.find({userId});
+
+ console.log(Restaurants, "from restaurants");
+ return NextResponse.json( { result: Restaurants})
+ } catch (error) {
+ console.error('Error fetching Restaurants:', error);
+ NextResponse.json({ error: 'Internal Server Error' });
+ }
+}
+// export async function GET() {
+// let data = {};
+// try {
+// await mongoose.connect(process.env.MONGODB_URI);
+// data = await Restaurant.find();
+// } catch (error) {
+// data = { success: false };
+// }
+// return NextResponse.json({ result: data, success: true });
+// }
+
+ export async function POST(req) {
+ const payload = await req.json();
+ console.log({payload})
+ await mongoose.connect(process.env.MONGODB_URI);
+ let d = new Restaurant(payload);
+ const result = await d.save();
+ return NextResponse.json({ result, success: true });
+ }
\ No newline at end of file
diff --git a/fit-bite-web/app/api/signup/route.js b/fit-bite-web/app/api/signup/route.js
new file mode 100644
index 00000000..3b6cc00a
--- /dev/null
+++ b/fit-bite-web/app/api/signup/route.js
@@ -0,0 +1,47 @@
+import mongoose from "mongoose";
+import User from "@/app/models/UserModel";
+import { NextResponse } from "next/server";
+var CryptoJS = require("crypto-js");
+// const handler = async (req, res) =>{
+// const {name, email, password} = req.body
+// const user = await User.create({
+// name,
+// email,
+// password
+// })
+// res.status(201).json({
+// message: 'User Created Successfully',
+// user
+// })
+// await mongoose.connect(process.env.MONGODB_URI);
+export async function POST(req) {
+ const payload = await req.json();
+ await mongoose.connect(process.env.MONGODB_URI);
+ const { username, ContactNumber, Address, Email } = payload;
+ let user = new User({ username, ContactNumber, Address, Email, Password: CryptoJS.AES.encrypt(payload.Password, process.env.CRYPTO_JS_KEY).toString() });
+ const result = await user.save();
+ return NextResponse.json({ result, success: true });
+}
+// export async function POST(req, res) {
+// if(req.method === 'POST'){
+// console.log(req.body)
+// let u = new User(req.body)
+// console.log(req.body);
+
+// await u.save()
+// return res.json({ success: true });
+// }else{
+// return res.json({ success: false, message:"faileddd"});
+// // return res.status(400).json({error: "Bad Request, Method not allowed"})
+// }
+// }
+// }
+// export async function POST(req, res) {
+// const payload = await req.json();
+// await mongoose.connect(process.env.MONGODB_URI);
+// let d = new Restaurant(payload);
+// const result = await d.save();
+// return NextResponse.json({ result, success: true });
+// }
+
+// export default connectDb(handler)
diff --git a/fit-bite-web/app/api/smallCakes/route.js b/fit-bite-web/app/api/smallCakes/route.js
new file mode 100644
index 00000000..a2448d36
--- /dev/null
+++ b/fit-bite-web/app/api/smallCakes/route.js
@@ -0,0 +1,58 @@
+import mongoose from "mongoose";
+// import User from '@/models/UserModel';
+import smallCake from '@/app/models/SmallCakesModel';
+import { NextResponse } from "next/server";
+ // const handler = async (req, res) =>{
+ // const {name, email, password} = req.body
+ // const user = await User.create({
+ // name,
+ // email,
+ // password
+ // })
+ // res.status(201).json({
+ // message: 'User Created Successfully',
+ // user
+ // })
+
+ export async function POST(req) {
+ const payload = await req.json();
+ await mongoose.connect(process.env.MONGODB_URI);
+ let d = new smallCake(payload);
+ const result = await d.save();
+ return NextResponse.json({ result, success: true });
+ }
+
+ export async function GET() {
+ let smallCakes =[]
+ let success = true
+ try{
+ await mongoose.connect(process.env.MONGODB_URI);
+ smallCakes= await smallCake.find();
+
+ console.log(smallCakes);
+ // if(user){
+ // if (req.body.Email == user.Email && req.body.Password == user.Password){
+ // // res.status(200).json({success: true}, {username:user.username, Email:user.Email })
+ // return NextResponse.json({success: true, message: 'Successfully Logged in', username:user.username, Email:user.Email})
+ // // username:user.username, Email:user.Email
+ // // return NextResponse.json(JSON.stringify({success: true, message: 'Successfully Loged in'}),{ status: 200, headers: { 'content-type': 'application/json' } }, {username:user.username, Email:user.Email })
+ // }
+
+ // }
+ }catch(e){
+ smallCakes={result:"error"}
+ success=false
+ // console.log(e);
+ }
+ return NextResponse.json({result:smallCakes, success});
+ // else {
+ // // If no user is found, send a different response (e.g., success: false)
+ // res.status(200).json({ success: false, message: "User not found" });
+ // }
+ // const payload = await req.json();
+ // await mongoose.connect(process.env.MONGODB_URI);
+ // let user = new User(payload);
+ // const result = await user.save();
+ // return NextResponse.json({ result, success: true });
+ }
+ // ex
\ No newline at end of file
diff --git a/fit-bite-web/app/api/stripe/route.js b/fit-bite-web/app/api/stripe/route.js
new file mode 100644
index 00000000..cac2fb6d
--- /dev/null
+++ b/fit-bite-web/app/api/stripe/route.js
@@ -0,0 +1,219 @@
+import Stripe from "stripe";
+import { NextResponse } from "next/server";
+const stripe = new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECRET);
+
+export async function POST(req, res) {
+
+ if (req.method === "POST") {
+ // let data = await req.json();
+ // console.log(req.headers);
+ let passedValue = await req.text();
+ // console.log(passedValue, "passed value");
+ let valueToJson = JSON.parse(passedValue);
+ // console.log(valueToJson);
+ const cartData = valueToJson.cartData;
+ const userId = valueToJson.userId;
+ console.log(userId);
+ try {
+ const params = {
+ submit_type: "pay",
+ // payment_method_types: ["card"],
+ billing_address_collection: "auto",
+ shipping_options: [
+ // { shipping_rate: "shr_1OKjBDSHh0F7a44U3SPgGKe2" },
+ { shipping_rate: "shr_1OKjDRSHh0F7a44U2qOkHQc0" },
+ ],
+ line_items: Object.keys(cartData).map((item) => {
+ const { price, productName, image, qty } = cartData[item];
+
+ console.log(productName);
+ console.log((price * 100).toFixed(0));
+ console.log(image);
+ console.log(qty)
+ return {
+ price_data: {
+ currency: "inr",
+ product_data: {
+ name: productName,
+ images: [image],
+ },
+ unit_amount: (price * 100).toFixed(0),
+ },
+ adjustable_quantity: {
+ enabled: true,
+ minimum: 1,
+ },
+ quantity: qty,
+ };
+ }),
+ metadata: {
+ userId,
+ },
+
+ mode: "payment",
+ success_url: `http://localhost:3000/orders?success=true&session_id={CHECKOUT_SESSION_ID}`,
+ cancel_url: `http://localhost:3000/?canceled=true`,
+ };
+
+ const session = await stripe.checkout.sessions.create(params);
+console.log({session},session.url)
+ return NextResponse.json(session);
+ } catch (err) {
+ console.log(err, "err");
+ return NextResponse.json({ message: err.message });
+ }
+ } else {
+ res.setHeader("Allow", "POST");
+ res.status(405).end("Method Not Allowed");
+ }
+}
+
+// Comments Ahead
+
+// async function storeSession(ctx){
+// try {
+// // Assuming the Checkout Session ID is sent as a parameter in the request
+// const { sessionId } = ctx;
+// const session = await stripe.checkout.sessions.retrieve(sessionId);
+// console.log("my Session", session)
+// }catch(err) {
+// console.log(err, "err");
+// }
+// }
+
+export async function GET() {
+ // console.log(sessionInfo);
+ // console.log({session})
+ const session1 = await stripe.checkout.sessions.retrieve('cs_test_a1KBcWZXjvzS0FTR7Ktns0LfelGPcualxbryd1Cu3s4YIg1FNqhtjmUwiC');
+ const paymentIntent = await stripe.paymentIntents.retrieve(
+ // "pi_3OLkg3SHh0F7a44U0iapBSkz"
+ session1.payment_intent
+
+ );
+
+ // let subtotal = paymentIntent.amount;
+ console.log("payment Intent", paymentIntent);
+ const chargeId = paymentIntent.latest_charge;
+
+ if (chargeId) {
+ const charge = await stripe.charges.retrieve(chargeId);
+ console.log("Charge", charge);
+
+ const status = charge.status; // "succeeded"
+ const amount = charge.amount; // 11999 (in the smallest currency unit, e.g., cents)
+ const paymentMethod = charge.payment_method_details.type; // "card"
+ const billingEmail = charge.billing_details.email;
+ // Accessing card details
+ const cardBrand = charge.payment_method_details.card.brand; // "visa"
+ const last4Digits = charge.payment_method_details.card.last4; // "4242"
+ const receipt_url = charge.receipt_url
+ // Example: Log the details
+ console.log("Status:", status);
+ console.log("Invoice:", receipt_url);
+ console.log("Billing Email:", billingEmail);
+ console.log("Amount:", amount/100);
+ console.log("Payment Method:", paymentMethod);
+ console.log("Card Brand:", cardBrand);
+ console.log("Last 4 Digits:", last4Digits);
+ }
+ }
+
+// const invoiceId = charge.invoice;
+
+// if (invoiceId) {
+// const invoice = await stripe.invoices.retrieve(invoiceId);
+// console.log("Invoice", invoice);
+// return NextResponse.json({ invoice: invoice });
+// }
+// return NextResponse.json({ charge: charge});
+// }
+// return NextResponse.json({ chargeid: chargeId });
+// }
+// export async function GET(req, res) {
+// // const transactions = await stripe.issuing.transactions.list({
+// // limit: 3,
+// // });
+// const transaction = await stripe.issuing.transactions.retrieve(
+// // 'pm_1OL1VfSHh0F7a44UD5SElQ6M'
+// // 'pmc_1OL1gISHh0F7a44UgurHyeae'
+// sessionInfo.id
+// );
+// return NextResponse.json({transaction});
+// }
+
+// {
+// id: 'cs_test_a1mGf6uPqe1hWjMzwVCFxbkles9LyWgvPEaV50XHhnUhijAlLnz3xFmISw',
+// object: 'checkout.session',
+// after_expiration: null,
+// allow_promotion_codes: null,
+// amount_subtotal: 1999,
+// amount_total: 11999,
+// automatic_tax: { enabled: false, status: null },
+// billing_address_collection: 'auto',
+// cancel_url: 'http://localhost:3000/?canceled=true',
+// client_reference_id: null,
+// client_secret: null,
+// consent: null,
+// consent_collection: null,
+// created: 1702036742,
+// currency: 'inr',
+// currency_conversion: null,
+// custom_fields: [],
+// custom_text: {
+// shipping_address: null,
+// submit: null,
+// terms_of_service_acceptance: null
+// },
+// customer: null,
+// customer_creation: 'if_required',
+// customer_details: null,
+// customer_email: null,
+// expires_at: 1702123141,
+// invoice: null,
+// invoice_creation: {
+// enabled: false,
+// invoice_data: {
+// account_tax_ids: null,
+// custom_fields: null,
+// description: null,
+// footer: null,
+// metadata: {},
+// rendering_options: null
+// }
+// },
+// livemode: false,
+// locale: null,
+// metadata: {},
+// mode: 'payment',
+// payment_intent: null,
+// payment_link: null,
+// payment_method_collection: 'if_required',
+// payment_method_configuration_details: { id: 'pmc_1OL1gISHh0F7a44UgurHyeae', parent: null },
+// payment_method_options: {},
+// payment_method_types: [ 'card' ],
+// payment_status: 'unpaid',
+// phone_number_collection: { enabled: false },
+// recovered_from: null,
+// setup_intent: null,
+// shipping_address_collection: null,
+// shipping_cost: {
+// amount_subtotal: 10000,
+// amount_tax: 0,
+// amount_total: 10000,
+// shipping_rate: 'shr_1OKjDRSHh0F7a44U2qOkHQc0'
+// },
+// shipping_details: null,
+// shipping_options: [
+// {
+// shipping_amount: 10000,
+// shipping_rate: 'shr_1OKjDRSHh0F7a44U2qOkHQc0'
+// }
+// ],
+// status: 'open',
+// submit_type: 'pay',
+// subscription: null,
+// success_url: 'http://localhost:3000/?success=true',
+// total_details: { amount_discount: 0, amount_shipping: 10000, amount_tax: 0 },
+// ui_mode: 'hosted',
+// url: 'https://checkout.stripe.com/c/pay/cs_test_a1mGf6uPqe1hWjMzwVCFxbkles9LyWgvPEaV50XHhnUhijAlLnz3xFmISw#fidkdWxOYHwnPyd1blpxYHZxWjA0T31QSUtWTW01QzJkMTFQNl89M1FcRHJoXWN3Z3VucmpNcnJQZHZ0TlVnXXdXNU1vaU58UFdTTkZqRHVyd3cySj1MQU1WUnF3an1uUGxXSTBGPE48bWRiNTVHfXRJbmZnaycpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl'
+// }
diff --git a/fit-bite-web/app/api/testML/route.js b/fit-bite-web/app/api/testML/route.js
new file mode 100644
index 00000000..767eb7e7
--- /dev/null
+++ b/fit-bite-web/app/api/testML/route.js
@@ -0,0 +1,58 @@
+// app/api/upload/route.js
+import { NextResponse } from 'next/server';
+import formidable from 'formidable';
+import { createReadStream } from 'fs';
+import FormData from 'form-data';
+import axios from 'axios';
+import { unlink } from 'fs/promises';
+
+export const config = {
+ api: {
+ bodyParser: false,
+ },
+};
+
+export async function POST(request) {
+ try {
+ const formData = await new Promise((resolve, reject) => {
+ const form = new formidable.IncomingForm();
+ form.parse(request, (err, fields, files) => {
+ if (err) reject(err);
+ resolve({ fields, files });
+ });
+ });
+
+ const file = formData.files.file?.[0];
+ if (!file) {
+ return NextResponse.json(
+ { error: 'No file uploaded' },
+ { status: 400 }
+ );
+ }
+
+ const forwardFormData = new FormData();
+ const fileStream = createReadStream(file.filepath);
+ forwardFormData.append('file', fileStream, file.originalFilename);
+
+ const response = await axios.post(
+ 'http://127.0.0.1:8000/upload_video',
+ forwardFormData,
+ {
+ headers: {
+ ...forwardFormData.getHeaders(),
+ },
+ }
+ );
+
+ // Clean up temporary file
+ await unlink(file.filepath);
+
+ return NextResponse.json(response.data);
+ } catch (error) {
+ console.error('Upload error:', error);
+ return NextResponse.json(
+ { error: error.message || 'Failed to upload video' },
+ { status: 500 }
+ );
+ }
+}
\ No newline at end of file
diff --git a/fit-bite-web/app/api/uploadVideo/route.js b/fit-bite-web/app/api/uploadVideo/route.js
new file mode 100644
index 00000000..0f979c5d
--- /dev/null
+++ b/fit-bite-web/app/api/uploadVideo/route.js
@@ -0,0 +1,22 @@
+import { writeFile } from "fs/promises";
+import { join } from "path";
+import { NextResponse } from "next/server";
+
+export async function POST(req) {
+ try {
+ // Read video file from request
+ const data = await req.arrayBuffer();
+ const buffer = Buffer.from(data);
+
+ // Define path to save the file
+ const videoPath = join(process.cwd(), "public", "uploads", `recorded-video-${Date.now()}.webm`);
+
+ // Save the file locally
+ await writeFile(videoPath, buffer);
+
+ return NextResponse.json({ message: "Video uploaded successfully!", path: videoPath });
+ } catch (error) {
+ console.error("Error saving video:", error);
+ return NextResponse.json({ error: "Failed to save video" }, { status: 500 });
+ }
+}
diff --git a/fit-bite-web/app/api/uploadVideoML/route.js b/fit-bite-web/app/api/uploadVideoML/route.js
new file mode 100644
index 00000000..fd2f52a0
--- /dev/null
+++ b/fit-bite-web/app/api/uploadVideoML/route.js
@@ -0,0 +1,63 @@
+import axios from "axios";
+
+export async function POST(req) {
+ try {
+ // ✅ Convert request to FormData
+ const formData = await req.formData();
+ const file = formData.get("file"); // Extract file directly
+ console.log(file, "file received");
+ if (!file) {
+ return new Response(JSON.stringify({ error: "No file provided" }), { status: 400 });
+ }
+ // const fileBlob = await req.blob();
+ // formData.append("file", fileBlob, "uploaded-video.mp4");
+
+ const backendFormData = new FormData();
+ backendFormData.append("file", file, file.name);
+
+ const newFile = backendFormData.get("file");
+
+ console.log("New file is ", newFile);
+
+ // Send to FastAPI backend
+ const backendResponse = await axios.post("http://localhost:8000/upload_video", backendFormData, {
+ "Content-Type": "multipart/form-data;"
+ });
+ // headers to pass to fetch API in post request when sending image/file in multi-form
+ // headers: {
+ // "Content-Type": "multipart/form-data",
+ // charset:'utf-8',
+ // boundary: Math.random().toString().substr(2)
+
+
+
+ const data = await backendResponse.data;
+ console.log("Backend Response:", JSON.stringify(data));
+
+ return new Response(JSON.stringify(data), { status: backendResponse.status });
+ } catch (error) {
+ console.error("Upload failed:", error);
+ return new Response(JSON.stringify({ error: "Internal server error" }), { status: 500 });
+ }
+}
+
+
+
+// export async function POST(req) {
+// const formData = await req.formData();
+// const file = formData.get("file");
+
+// if (!file) {
+// return new Response(JSON.stringify({ error: "No file provided" }), { status: 400 });
+// }
+// console.log(file)
+// const backendResponse = await fetch("http://localhost:8000/upload_video", {
+// method: "POST",
+// body: {"file":file},
+// });
+
+// const data = await backendResponse.json();
+// console.log(JSON.stringify(data))
+// return new Response(JSON.stringify(data), { status: backendResponse.status });
+// }
+
diff --git a/fit-bite-web/app/api/webhooks/stripe/route.js b/fit-bite-web/app/api/webhooks/stripe/route.js
new file mode 100644
index 00000000..933b4510
--- /dev/null
+++ b/fit-bite-web/app/api/webhooks/stripe/route.js
@@ -0,0 +1,81 @@
+// import Order from "@/models/OrderModel";
+// import { headers } from "next/headers";
+// import { NextResponse } from "next/server";
+// import mongoose from "mongoose";
+// import Stripe from "stripe";
+// const stripe = new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECRET);
+// export async function POST(req, res) {
+// let body = await req.text();
+// let valueToJson = JSON.parse(body);
+// const sig = req.headers["stripe-signature"];
+// let event;
+
+// try {
+// event = stripe.webhooks.constructEvent(
+// valueToJson,
+// sig,
+// process.env.Stripe_Webhook_Secret
+// );
+// } catch (err) {
+// return new Response(
+// `Webhook Error: ${err ? err.message : "Unknown Error"}`
+// );
+// }
+// let session = event.data.object;
+// console.log(session, "session");
+// if (!session?.metadata?.userId) {
+// return new Response(null, { status: 200 });
+// }
+
+// // Handle the event
+// switch (event.type) {
+// case "checkout.session.completed":
+// await mongoose.connect(process.env.MONGODB_URI);
+// const session1 = await stripe.checkout.sessions.retrieve(session.id);
+
+// // let session = event.data.object;
+// let paymentIntentId = session1.payment_intent;
+// const paymentIntent = await stripe.paymentIntents.retrieve(
+// paymentIntentId
+// );
+// // let subtotal = paymentIntent.amount;
+// console.log("payment Intent", paymentIntent);
+// let chargeId = paymentIntent.latest_charge;
+// if (chargeId) {
+// let charge = await stripe.charges.retrieve(chargeId);
+// console.log("Charge", charge);
+
+// let orderStatus = charge.status; // "succeeded"
+// let amount = charge.amount; // 11999 (in the smallest currency unit, e.g., cents)
+// let paymentMethod = charge.payment_method_details.type; // "card"
+// let billingEmail = charge.billing_details.email;
+// // Accessing card details
+// let cardBrand = charge.payment_method_details.card.brand; // "visa"
+// let last4Digits = charge.payment_method_details.card.last4; // "4242"
+// let receipt_url = charge.receipt_url;
+// console.log(userId,
+// orderStatus,
+// amount,
+// paymentMethod,
+// billingEmail,
+// cardBrand,
+// last4Digits,
+// receipt_url)
+// // let order = new Order({
+// // userId,
+// // orderStatus,
+// // amount,
+// // paymentMethod,
+// // billingEmail,
+// // cardBrand,
+// // last4Digits,
+// // receipt_url,
+// // });
+// // await order.save();
+// }
+// default:
+// console.log(`Unhandled event type ${event.type}`);
+// }
+
+// return new Response(null, { status: 200 });
+// }
diff --git a/fit-bite-web/app/chat/page.jsx b/fit-bite-web/app/chat/page.jsx
new file mode 100644
index 00000000..8769d7a6
--- /dev/null
+++ b/fit-bite-web/app/chat/page.jsx
@@ -0,0 +1,58 @@
+"use client";
+import { useState, useEffect, useRef } from "react";
+import { useChat } from "../Context/ChatContext";
+
+const Chat = () => {
+ const { messages, addMessage } = useChat();
+ const [input, setInput] = useState("");
+ const chatEndRef = useRef(null);
+
+ // Scroll to the latest message when new messages arrive
+ useEffect(() => {
+ chatEndRef.current?.scrollIntoView({ behavior: "smooth" });
+ }, [messages]);
+
+ const handleSend = () => {
+ if (!input.trim()) return;
+
+ addMessage(input, "user");
+
+ // Simulate AI response
+ setTimeout(() => {
+ addMessage("Hello! How can I help you?", "ai");
+ }, 1000);
+
+ setInput("");
+ };
+
+ return (
+
+
+ {messages.map((msg) => (
+
+ ))}
+
+
+
+
+ setInput(e.target.value)}
+ onKeyDown={(e) => e.key === "Enter" && handleSend()}
+ placeholder="Type your message..."
+ />
+
+
+
+ );
+};
+
+export default Chat;
diff --git a/fit-bite-web/app/components/AppHeader copy.jsx b/fit-bite-web/app/components/AppHeader copy.jsx
new file mode 100644
index 00000000..18165251
--- /dev/null
+++ b/fit-bite-web/app/components/AppHeader copy.jsx
@@ -0,0 +1,180 @@
+"use client";
+import { ThemeToggleButton } from "../components1/common/ThemeToggleButton";
+import NotificationDropdown from "../components1/header/NotificationDropdown";
+import UserDropdown from "../components1/header/UserDropdown";
+import { useSidebar } from "../Context/SidebarContext";
+import Image from "next/image";
+import Link from "next/link";
+import React, { useState ,useEffect,useRef} from "react";
+
+const AppHeader= () => {
+ const [isApplicationMenuOpen, setApplicationMenuOpen] = useState(false);
+
+ const { isMobileOpen, toggleSidebar, toggleMobileSidebar } = useSidebar();
+
+ const handleToggle = () => {
+ if (window.innerWidth >= 991) {
+ toggleSidebar();
+ } else {
+ toggleMobileSidebar();
+ }
+ };
+
+ const toggleApplicationMenu = () => {
+ setApplicationMenuOpen(!isApplicationMenuOpen);
+ };
+ const inputRef = useRef(null);
+
+ useEffect(() => {
+ const handleKeyDown = (event) => {
+ if ((event.metaKey || event.ctrlKey) && event.key === "k") {
+ event.preventDefault();
+ inputRef.current?.focus();
+ }
+ };
+
+ document.addEventListener("keydown", handleKeyDown);
+
+ return () => {
+ document.removeEventListener("keydown", handleKeyDown);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+
+ {/* */}
+
+
+ {/* */}
+
+ {/* */}
+
+
+
+
+ );
+};
+
+export default AppHeader;
diff --git a/fit-bite-web/app/components/AppHeader.jsx b/fit-bite-web/app/components/AppHeader.jsx
new file mode 100644
index 00000000..180232e4
--- /dev/null
+++ b/fit-bite-web/app/components/AppHeader.jsx
@@ -0,0 +1,180 @@
+"use client";
+import { ThemeToggleButton } from "./common/ThemeToggleButton";
+import NotificationDropdown from "./header/NotificationDropdown";
+import UserDropdown from "./header/UserDropdown";
+import { useSidebar } from "../Context/SidebarContext";
+import Image from "next/image";
+import Link from "next/link";
+import React, { useState ,useEffect,useRef} from "react";
+
+const AppHeader= () => {
+ const [isApplicationMenuOpen, setApplicationMenuOpen] = useState(false);
+
+ const { isMobileOpen, toggleSidebar, toggleMobileSidebar } = useSidebar();
+
+ const handleToggle = () => {
+ if (window.innerWidth >= 991) {
+ toggleSidebar();
+ } else {
+ toggleMobileSidebar();
+ }
+ };
+
+ const toggleApplicationMenu = () => {
+ setApplicationMenuOpen(!isApplicationMenuOpen);
+ };
+ const inputRef = useRef(null);
+
+ useEffect(() => {
+ const handleKeyDown = (event) => {
+ if ((event.metaKey || event.ctrlKey) && event.key === "k") {
+ event.preventDefault();
+ inputRef.current?.focus();
+ }
+ };
+
+ document.addEventListener("keydown", handleKeyDown);
+
+ return () => {
+ document.removeEventListener("keydown", handleKeyDown);
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+
+ {/* */}
+
+
+ {/* */}
+
+ {/* */}
+
+
+
+
+ );
+};
+
+export default AppHeader;
diff --git a/fit-bite-web/app/components/AppSidebar.jsx b/fit-bite-web/app/components/AppSidebar.jsx
new file mode 100644
index 00000000..4aa306e8
--- /dev/null
+++ b/fit-bite-web/app/components/AppSidebar.jsx
@@ -0,0 +1,365 @@
+"use client"
+import React, { useEffect, useRef, useState,useCallback } from "react";
+import Link from "next/link";
+import Image from "next/image";
+import { usePathname } from "next/navigation";
+import { useSidebar } from "../Context/SidebarContext";
+// import SidebarWidget from "./SidebarWidget";
+import { BoxCubeIcon, CalenderIcon, GridIcon, ListIcon, PageIcon, PieChartIcon, PlugInIcon, TableIcon, UserCircleIcon } from "./icons";
+function AppSidebar() {
+
+const navItems = [
+ {
+ icon: ,
+ name: "Dashboard",
+ subItems: [{ name: "Ecommerce", path: "/", pro: false }],
+ },
+ {
+ icon: ,
+ name: "Calendar",
+ path: "/calendar",
+ },
+ {
+ icon: ,
+ name: "User Profile",
+ path: "/profile",
+ },
+
+ {
+ name: "Forms",
+ icon: ,
+ subItems: [{ name: "Form Elements", path: "/form-elements", pro: false }],
+ },
+ {
+ name: "Tables",
+ icon: ,
+ subItems: [{ name: "Basic Tables", path: "/basic-tables", pro: false }],
+ },
+ {
+ name: "Pages",
+ icon: ,
+ subItems: [
+ { name: "Blank Page", path: "/blank", pro: false },
+ { name: "404 Error", path: "/error-404", pro: false },
+ ],
+ },
+];
+
+const othersItems= [
+ {
+ icon: ,
+ name: "Charts",
+ subItems: [
+ { name: "Line Chart", path: "/line-chart", pro: false },
+ { name: "Bar Chart", path: "/bar-chart", pro: false },
+ ],
+ },
+ {
+ icon: ,
+ name: "UI Elements",
+ subItems: [
+ { name: "Alerts", path: "/alerts", pro: false },
+ { name: "Avatar", path: "/avatars", pro: false },
+ { name: "Badge", path: "/badge", pro: false },
+ { name: "Buttons", path: "/buttons", pro: false },
+ { name: "Images", path: "/images", pro: false },
+ { name: "Videos", path: "/videos", pro: false },
+ ],
+ },
+ {
+ icon: ,
+ name: "Authentication",
+ subItems: [
+ { name: "Sign In", path: "/signin", pro: false },
+ { name: "Sign Up", path: "/signup", pro: false },
+ ],
+ },
+];
+
+const { isExpanded, isMobileOpen, isHovered, setIsHovered } = useSidebar();
+ const pathname = usePathname();
+// let menuType = "main" | "others"
+ const renderMenuItems = (
+ navItems,
+ menuType
+ ) => (
+
+ {console.log({navItems})}
+ {navItems && navItems.map((nav, index) => (
+ -
+ {nav.subItems ? (
+
+ ) : (
+ nav.path && (
+
+
+ {nav.icon}
+
+ {(isExpanded || isHovered || isMobileOpen) && (
+ {nav.name}
+ )}
+
+ )
+ )}
+ {nav.subItems && (isExpanded || isHovered || isMobileOpen) && (
+
{
+ subMenuRefs.current[`${menuType}-${index}`] = el;
+ }}
+ className="overflow-hidden transition-all duration-300"
+ style={{
+ height:
+ openSubmenu?.type === menuType && openSubmenu?.index === index
+ ? `${subMenuHeight[`${menuType}-${index}`]}px`
+ : "0px",
+ }}
+ >
+
+ {nav.subItems.map((subItem) => (
+ -
+
+ {subItem.name}
+
+ {subItem.new && (
+
+ new
+
+ )}
+ {subItem.pro && (
+
+ pro
+
+ )}
+
+
+
+ ))}
+
+
+ )}
+
+ ))}
+
+ );
+ const [openSubmenu, setOpenSubmenu] = useState(null);
+ const [subMenuHeight, setSubMenuHeight] = useState(
+ {}
+ );
+ const subMenuRefs = useRef({});
+
+ // const isActive = (path: string) => path === pathname;
+ const isActive = useCallback((path) => path === pathname, [pathname]);
+
+ useEffect(() => {
+ // Check if the current path matches any submenu item
+ let submenuMatched = false;
+ ["main", "others"].forEach((menuType) => {
+ const items = menuType === "main" ? navItems : othersItems;
+ items.forEach((nav, index) => {
+ if (nav.subItems) {
+ nav.subItems.forEach((subItem) => {
+ if (isActive(subItem.path)) {
+ setOpenSubmenu({
+ type: menuType,
+ index,
+ });
+ submenuMatched = true;
+ }
+ });
+ }
+ });
+ });
+
+ // If no submenu item matches, close the open submenu
+ if (!submenuMatched) {
+ setOpenSubmenu(null);
+ }
+ }, [pathname,isActive]);
+
+ useEffect(() => {
+ // Set the height of the submenu items when the submenu is opened
+ if (openSubmenu !== null) {
+ const key = `${openSubmenu.type}-${openSubmenu.index}`;
+ if (subMenuRefs.current[key]) {
+ setSubMenuHeight((prevHeights) => ({
+ ...prevHeights,
+ [key]: subMenuRefs.current[key]?.scrollHeight || 0,
+ }));
+ }
+ }
+ }, [openSubmenu]);
+// let menuType1 = "main" | "others"
+ const handleSubmenuToggle = (index, menuType1) => {
+ setOpenSubmenu((prevOpenSubmenu) => {
+ if (
+ prevOpenSubmenu &&
+ prevOpenSubmenu.type === menuType1 &&
+ prevOpenSubmenu.index === index
+ ) {
+ return null;
+ }
+ return { type: menuType1, index };
+ });
+ };
+
+ return (
+
+ )
+}
+
+export default AppSidebar
\ No newline at end of file
diff --git a/fit-bite-web/app/components/Backdrop.jsx b/fit-bite-web/app/components/Backdrop.jsx
new file mode 100644
index 00000000..ecb9e3a6
--- /dev/null
+++ b/fit-bite-web/app/components/Backdrop.jsx
@@ -0,0 +1,17 @@
+import { useSidebar } from "../Context/SidebarContext";
+import React from "react";
+
+const Backdrop= () => {
+ const { isMobileOpen, toggleMobileSidebar } = useSidebar();
+
+ if (!isMobileOpen) return null;
+
+ return (
+
+ );
+};
+
+export default Backdrop;
diff --git a/fit-bite-web/app/components/CartLayout.jsx b/fit-bite-web/app/components/CartLayout.jsx
new file mode 100644
index 00000000..14cbc56b
--- /dev/null
+++ b/fit-bite-web/app/components/CartLayout.jsx
@@ -0,0 +1,136 @@
+"use client";
+
+import Image from "next/image";
+import React from "react";
+import { useState, useEffect } from "react";
+
+function CartLayout() {
+ const [Cart, setCart] = useState({});
+ // const [subTotal, setSubTotal] = useState(0);
+
+ // const [shouldHideButtons, setShouldHideButtons] = useState(false);
+
+ // Update state based on prop
+ // if (hideButtons) {
+ // setShouldHideButtons(true);
+ // }
+ useEffect(() => {
+ // console.log("use effect from cart hi");
+
+ try {
+ if (localStorage.getItem("cart")) {
+ setCart(JSON.parse(localStorage.getItem("cart")));
+ saveCart(JSON.parse(localStorage.getItem("cart")))
+ }
+ } catch (error) {
+ console.error(error);
+ localStorage.removeItem("cart");
+ }
+ }, []);
+ const saveCart = (myCart) => {
+ localStorage.setItem("cart", JSON.stringify(myCart));
+ // let subt = 0;
+ // let keys = Object.keys(myCart);
+ // for (let i = 0; i {
+ let newCart = Cart;
+ if (itemCode in Cart) {
+ newCart[itemCode].qty = Cart[itemCode].qty + qty;
+ } else {
+ newCart[itemCode] = {
+ qty: qty,
+ price: price,
+ productName: productName,
+ image: image,
+ };
+ }
+ setCart(newCart);
+ saveCart(newCart);
+ };
+ // const clearCart = () => {
+ // setCart({});
+ // saveCart({});
+ // };
+ const removeFromCart = (itemCode, qty) => {
+ let newCart = Cart;
+ if (itemCode in Cart) {
+ newCart[itemCode].qty = Cart[itemCode].qty - qty;
+ }
+ if (newCart[itemCode].qty <= 0) {
+ delete newCart[itemCode];
+ }
+ setCart(newCart);
+ saveCart(newCart);
+ };
+ return (
+
+
+ {Object.keys(Cart).length===0 &&
No items in the cart
}
+
+ {Object.keys(Cart).map((k) => {
+ return
+
+
+
+
+
+ {Cart[k].productName}
+
+
{Cart[k].price}
+ {/*
${Cart[k].price.toFixed(2)}
*/}
+
+{/* {Cart[k].description}: image url */}
+
+
+ {Cart[k].qty}
+
+
+
+
+
+
+
;
+ })}
+
+
+{/*
${subTotal.toFixed(2)}
*/}
+{/* {!shouldHideButtons && ( */}
+{/* {!shouldHideButtons && ( */}
+{/*
+)} */}
+
+
+
+
+ )
+}
+
+export default CartLayout
\ No newline at end of file
diff --git a/fit-bite-web/app/components/Ecommerce/CountryMap.jsx b/fit-bite-web/app/components/Ecommerce/CountryMap.jsx
new file mode 100644
index 00000000..ce7c0384
--- /dev/null
+++ b/fit-bite-web/app/components/Ecommerce/CountryMap.jsx
@@ -0,0 +1,123 @@
+import React from "react";
+// import { VectorMap } from "@react-jvectormap/core";
+import { worldMill } from "@react-jvectormap/world";
+import dynamic from "next/dynamic";
+
+const VectorMap = dynamic(
+ () => import("@react-jvectormap/core").then((mod) => mod.VectorMap),
+ { ssr: false }
+);
+
+// // Define the component props
+// interface CountryMapProps {
+// mapColor?: string;
+// }
+
+// type MarkerStyle = {
+// initial: {
+// fill: string;
+// r: number; // Radius for markers
+// };
+// };
+
+// type Marker = {
+// latLng: [number, number];
+// name: string;
+// style?: {
+// fill: string;
+// borderWidth: number;
+// borderColor: string;
+// stroke?: string;
+// strokeOpacity?: number;
+// };
+// };
+
+const CountryMap= ({ mapColor }) => {
+ return (
+
+ );
+};
+
+export default CountryMap;
diff --git a/fit-bite-web/app/components/Ecommerce/DemographicCard.jsx b/fit-bite-web/app/components/Ecommerce/DemographicCard.jsx
new file mode 100644
index 00000000..5b0467a9
--- /dev/null
+++ b/fit-bite-web/app/components/Ecommerce/DemographicCard.jsx
@@ -0,0 +1,131 @@
+"use client";
+import Image from "next/image";
+
+import CountryMap from "./CountryMap";
+import { useState } from "react";
+import { MoreDotIcon } from "../icons";
+import { Dropdown } from "../ui/dropdown/Dropdown";
+import { DropdownItem } from "../ui/dropdown/DropdownItem";
+
+export default function DemographicCard() {
+ const [isOpen, setIsOpen] = useState(false);
+
+ function toggleDropdown() {
+ setIsOpen(!isOpen);
+ }
+
+ function closeDropdown() {
+ setIsOpen(false);
+ }
+
+ return (
+
+
+
+
+ Customers Demographic
+
+
+ Number of customer based on country
+
+
+
+
+
+
+
+ View More
+
+
+ Delete
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ USA
+
+
+ 2,379 Customers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ France
+
+
+ 589 Customers
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/Ecommerce/MonthlySalesChart.jsx b/fit-bite-web/app/components/Ecommerce/MonthlySalesChart.jsx
new file mode 100644
index 00000000..a9313c8b
--- /dev/null
+++ b/fit-bite-web/app/components/Ecommerce/MonthlySalesChart.jsx
@@ -0,0 +1,155 @@
+"use client";
+import { ApexOptions } from "apexcharts";
+import dynamic from "next/dynamic";
+import { MoreDotIcon } from "../icons";
+import { DropdownItem } from "../ui/dropdown/DropdownItem";
+import { useState } from "react";
+import { Dropdown } from "../ui/dropdown/Dropdown";
+import Image from "next/image";
+
+// Dynamically import the ReactApexChart component
+const ReactApexChart = dynamic(() => import("react-apexcharts"), {
+ ssr: false,
+});
+
+export default function MonthlySalesChart() {
+ const options= {
+ colors: ["#465fff"],
+ chart: {
+ fontFamily: "Outfit, sans-serif",
+ type: "bar",
+ height: 180,
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: false,
+ columnWidth: "39%",
+ borderRadius: 5,
+ borderRadiusApplication: "end",
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ show: true,
+ width: 4,
+ colors: ["transparent"],
+ },
+ xaxis: {
+ categories: [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec",
+ ],
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ },
+ legend: {
+ show: true,
+ position: "top",
+ horizontalAlign: "left",
+ fontFamily: "Outfit",
+ },
+ yaxis: {
+ title: {
+ text: undefined,
+ },
+ },
+ grid: {
+ yaxis: {
+ lines: {
+ show: true,
+ },
+ },
+ },
+ fill: {
+ opacity: 1,
+ },
+
+ tooltip: {
+ x: {
+ show: false,
+ },
+ y: {
+ formatter: (val) => `${val}`,
+ },
+ },
+ };
+ const series = [
+ {
+ name: "Sales",
+ data: [168, 385, 201, 298, 187, 195, 291, 110, 215, 390, 280, 112],
+ },
+ ];
+ const [isOpen, setIsOpen] = useState(false);
+
+ function toggleDropdown() {
+ setIsOpen(!isOpen);
+ }
+
+ function closeDropdown() {
+ setIsOpen(false);
+ }
+
+ return (
+
+
+
+ Monthly Sales
+
+
+
+
+
+
+ View More
+
+
+ Delete
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/Ecommerce/MonthlyTarget.jsx b/fit-bite-web/app/components/Ecommerce/MonthlyTarget.jsx
new file mode 100644
index 00000000..5ecf6711
--- /dev/null
+++ b/fit-bite-web/app/components/Ecommerce/MonthlyTarget.jsx
@@ -0,0 +1,210 @@
+"use client";
+// import Chart from "react-apexcharts";
+import { ApexOptions } from "apexcharts";
+
+import dynamic from "next/dynamic";
+import { Dropdown } from "../ui/dropdown/Dropdown";
+import { MoreDotIcon } from "../icons";
+import { useState } from "react";
+import { DropdownItem } from "../ui/dropdown/DropdownItem";
+import Image from "next/image";
+// Dynamically import the ReactApexChart component
+const ReactApexChart = dynamic(() => import("react-apexcharts"), {
+ ssr: false,
+});
+
+export default function MonthlyTarget() {
+ const series = [75.55];
+ const options = {
+ colors: ["#465FFF"],
+ chart: {
+ fontFamily: "Outfit, sans-serif",
+ type: "radialBar",
+ height: 330,
+ sparkline: {
+ enabled: true,
+ },
+ },
+ plotOptions: {
+ radialBar: {
+ startAngle: -85,
+ endAngle: 85,
+ hollow: {
+ size: "80%",
+ },
+ track: {
+ background: "#E4E7EC",
+ strokeWidth: "100%",
+ margin: 5, // margin is in pixels
+ },
+ dataLabels: {
+ name: {
+ show: false,
+ },
+ value: {
+ fontSize: "36px",
+ fontWeight: "600",
+ offsetY: -40,
+ color: "#1D2939",
+ formatter: function (val) {
+ return val + "%";
+ },
+ },
+ },
+ },
+ },
+ fill: {
+ type: "solid",
+ colors: ["#465FFF"],
+ },
+ stroke: {
+ lineCap: "round",
+ },
+ labels: ["Progress"],
+ };
+
+ const [isOpen, setIsOpen] = useState(false);
+
+ function toggleDropdown() {
+ setIsOpen(!isOpen);
+ }
+
+ function closeDropdown() {
+ setIsOpen(false);
+ }
+
+ return (
+
+
+
+
+
+ Monthly Target
+
+
+ Target you’ve set for each month
+
+
+
+
+
+
+ View More
+
+
+ Delete
+
+
+
+
+
+
+ You earn $3287 today, it's higher than last month. Keep up your
+ good work!
+
+
+
+
+
+
+ Target
+
+
+ $20K
+
+
+
+
+
+
+
+
+ Revenue
+
+
+ $20K
+
+
+
+
+
+
+
+
+ Today
+
+
+ $20K
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/Ecommerce/RecentOrders.jsx b/fit-bite-web/app/components/Ecommerce/RecentOrders.jsx
new file mode 100644
index 00000000..f7ec6538
--- /dev/null
+++ b/fit-bite-web/app/components/Ecommerce/RecentOrders.jsx
@@ -0,0 +1,211 @@
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHeader,
+ TableRow,
+} from "../ui/table";
+import Badge from "../ui/badge/Badge";
+import Image from "next/image";
+
+// Define the TypeScript interface for the table rows
+// interface Product {
+// id: number; // Unique identifier for each product
+// name: string; // Product name
+// variants: string; // Number of variants (e.g., "1 Variant", "2 Variants")
+// category: string; // Category of the product
+// price: string; // Price of the product (as a string with currency symbol)
+// // status: string; // Status of the product
+// image: string; // URL or path to the product image
+// status: "Delivered" | "Pending" | "Canceled"; // Status of the product
+// }
+
+// Define the table data using the interface
+const tableData = [
+ {
+ id: 1,
+ name: "MacBook Pro 13”",
+ variants: "2 Variants",
+ category: "Laptop",
+ price: "$2399.00",
+ status: "Delivered",
+ image: "/images/product/product-01.jpg", // Replace with actual image URL
+ },
+ {
+ id: 2,
+ name: "Apple Watch Ultra",
+ variants: "1 Variant",
+ category: "Watch",
+ price: "$879.00",
+ status: "Pending",
+ image: "/images/product/product-02.jpg", // Replace with actual image URL
+ },
+ {
+ id: 3,
+ name: "iPhone 15 Pro Max",
+ variants: "2 Variants",
+ category: "SmartPhone",
+ price: "$1869.00",
+ status: "Delivered",
+ image: "/images/product/product-03.jpg", // Replace with actual image URL
+ },
+ {
+ id: 4,
+ name: "iPad Pro 3rd Gen",
+ variants: "2 Variants",
+ category: "Electronics",
+ price: "$1699.00",
+ status: "Canceled",
+ image: "/images/product/product-04.jpg", // Replace with actual image URL
+ },
+ {
+ id: 5,
+ name: "AirPods Pro 2nd Gen",
+ variants: "1 Variant",
+ category: "Accessories",
+ price: "$240.00",
+ status: "Delivered",
+ image: "/images/product/product-05.jpg", // Replace with actual image URL
+ },
+];
+
+export default function RecentOrders() {
+ return (
+
+
+
+
+ Recent Orders
+
+
+
+
+
+
+
+
+
+
+ {/* Table Header */}
+
+
+
+ Products
+
+
+ Category
+
+
+ Price
+
+
+ Status
+
+
+
+
+ {/* Table Body */}
+
+
+ {tableData.map((product) => (
+
+
+
+
+
+
+
+
+ {product.name}
+
+
+ {product.variants}
+
+
+
+
+
+ {product.price}
+
+
+ {product.category}
+
+
+
+ {product.status}
+
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/Ecommerce/StatisticsChart.jsx b/fit-bite-web/app/components/Ecommerce/StatisticsChart.jsx
new file mode 100644
index 00000000..a2b38d30
--- /dev/null
+++ b/fit-bite-web/app/components/Ecommerce/StatisticsChart.jsx
@@ -0,0 +1,150 @@
+"use client";
+import React from "react";
+// import Chart from "react-apexcharts";
+import { ApexOptions } from "apexcharts";
+import ChartTab from "../common/ChartTab";
+import dynamic from "next/dynamic";
+
+// Dynamically import the ReactApexChart component
+const ReactApexChart = dynamic(() => import("react-apexcharts"), {
+ ssr: false,
+});
+
+export default function StatisticsChart() {
+ const options= {
+ legend: {
+ show: false, // Hide legend
+ position: "top",
+ horizontalAlign: "left",
+ },
+ colors: ["#465FFF", "#9CB9FF"], // Define line colors
+ chart: {
+ fontFamily: "Outfit, sans-serif",
+ height: 310,
+ type: "line", // Set the chart type to 'line'
+ toolbar: {
+ show: false, // Hide chart toolbar
+ },
+ },
+ stroke: {
+ curve: "straight", // Define the line style (straight, smooth, or step)
+ width: [2, 2], // Line width for each dataset
+ },
+
+ fill: {
+ type: "gradient",
+ gradient: {
+ opacityFrom: 0.55,
+ opacityTo: 0,
+ },
+ },
+ markers: {
+ size: 0, // Size of the marker points
+ strokeColors: "#fff", // Marker border color
+ strokeWidth: 2,
+ hover: {
+ size: 6, // Marker size on hover
+ },
+ },
+ grid: {
+ xaxis: {
+ lines: {
+ show: false, // Hide grid lines on x-axis
+ },
+ },
+ yaxis: {
+ lines: {
+ show: true, // Show grid lines on y-axis
+ },
+ },
+ },
+ dataLabels: {
+ enabled: false, // Disable data labels
+ },
+ tooltip: {
+ enabled: true, // Enable tooltip
+ x: {
+ format: "dd MMM yyyy", // Format for x-axis tooltip
+ },
+ },
+ xaxis: {
+ type: "category", // Category-based x-axis
+ categories: [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec",
+ ],
+ axisBorder: {
+ show: false, // Hide x-axis border
+ },
+ axisTicks: {
+ show: false, // Hide x-axis ticks
+ },
+ tooltip: {
+ enabled: false, // Disable tooltip for x-axis points
+ },
+ },
+ yaxis: {
+ labels: {
+ style: {
+ fontSize: "12px", // Adjust font size for y-axis labels
+ colors: ["#6B7280"], // Color of the labels
+ },
+ },
+ title: {
+ text: "", // Remove y-axis title
+ style: {
+ fontSize: "0px",
+ },
+ },
+ },
+ };
+
+ const series = [
+ {
+ name: "Sales",
+ data: [180, 190, 170, 160, 175, 165, 170, 205, 230, 210, 240, 235],
+ },
+ {
+ name: "Revenue",
+ data: [40, 30, 50, 40, 55, 40, 70, 100, 110, 120, 150, 140],
+ },
+ ];
+ return (
+
+
+
+
+ Statistics
+
+
+ Target you’ve set for each month
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/Ecommerce/page.jsx b/fit-bite-web/app/components/Ecommerce/page.jsx
new file mode 100644
index 00000000..56800b81
--- /dev/null
+++ b/fit-bite-web/app/components/Ecommerce/page.jsx
@@ -0,0 +1,43 @@
+"use client"
+
+import React from "react";
+import EcommerceMetrics from "../components/EcommerceMetrics";
+import MonthlyTarget from "../components/Ecommerce/MonthlyTarget";
+import MonthlySalesChart from "../components/Ecommerce/MonthlySalesChart";
+import StatisticsChart from "../components/Ecommerce/StatisticsChart";
+import RecentOrders from "../components/Ecommerce/RecentOrders";
+import DemographicCard from "../components/Ecommerce/DemographicCard";
+
+// export const metadata = {
+// title:
+// "Next.js E-commerce Dashboard | TailAdmin - Next.js Dashboard Template",
+// description: "This is Next.js Home for TailAdmin Dashboard Template",
+// };
+
+export default function Ecommerce() {
+ return (
+
+
+
+
+ {/* */}
+
+
+
+ {/* */}
+
+
+
+ {/* */}
+
+
+
+ {/* */}
+
+
+
+ {/* */}
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/EcommerceMetrics.jsx b/fit-bite-web/app/components/EcommerceMetrics.jsx
new file mode 100644
index 00000000..c6f987ef
--- /dev/null
+++ b/fit-bite-web/app/components/EcommerceMetrics.jsx
@@ -0,0 +1,98 @@
+"use client"
+import React, { useState, useEffect } from 'react'
+// import { GroupIcon } from './icons'
+import Image from 'next/image'
+import { ArrowDownIcon } from './icons'
+import Badge from './ui/badge/Badge'
+import { useRouter } from 'next/navigation'
+function EcommerceMetrics() {
+ const [dessertData, setDessertData] = useState(0);
+ const [orderData, setorderData] = useState(0);
+ const router = useRouter();
+ async function render() {
+ try {
+ const response = await fetch("/api/ecommerce", {
+ method: "GET",
+ });
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ setDessertData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+ async function render2() {
+ try {
+ const response = await fetch("/api/orderCount", {
+ method: "GET",
+ });
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ setorderData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ render2()
+ }, []);
+ return (
+
+ {/* */}
+
+
+ {/* */}
+
+
+
+
+
+
+ Customers
+
+
+ {dessertData}
+
+
+
+
+ 11.01%
+
+
+
+ {/* */}
+
+ {/* */}
+
+
+
+
+
+
+
+ Orders
+
+
+ {orderData}
+
+
+
+
+ 9.05%
+
+
+
+ {/* */}
+
+ )
+}
+
+export default EcommerceMetrics
\ No newline at end of file
diff --git a/fit-bite-web/app/components/Filter.jsx b/fit-bite-web/app/components/Filter.jsx
new file mode 100644
index 00000000..419c2b16
--- /dev/null
+++ b/fit-bite-web/app/components/Filter.jsx
@@ -0,0 +1,65 @@
+"use client"
+import { useState } from "react";
+
+
+
+const Filters = ({ onFilterChange }) => {
+ const [filters, setFilters] = useState({
+ minCalories: "",
+ maxCalories: "",
+ minCarbs: "",
+ maxCarbs: "",
+ minFat: "",
+ maxFat: "",
+ minProtein: "",
+ maxProtein: "",
+ });
+
+ const handleChange = (e) => {
+ const { name, value } = e.target;
+ setFilters((prev) => ({
+ ...prev,
+ [name]: value,
+ }));
+ };
+
+ const applyFilters = () => {
+ onFilterChange(filters);
+ };
+
+ return (
+
+
Filters
+
+
+
+ );
+};
+
+export default Filters;
diff --git a/fit-bite-web/app/components/FinalRestaurantCreation.jsx b/fit-bite-web/app/components/FinalRestaurantCreation.jsx
new file mode 100644
index 00000000..750033ad
--- /dev/null
+++ b/fit-bite-web/app/components/FinalRestaurantCreation.jsx
@@ -0,0 +1,110 @@
+import React from "react";
+
+function FinalRestaurantCreation({
+ jsonData,
+ filteredItems,
+ activeStep,
+ setActiveStep,
+ setFormData0,
+}) {
+ // const jsonDataObj = JSON.parse(jsonData);
+ // console.log(activeStep);
+
+ const handleSubmit = () => {
+ // console.log("Hello", jsonData);
+ // console.log(filteredItems);
+ // console.log(activeStep);
+ setFormData0({
+ restaurantName: "",
+ restaurantContactNumber: 0,
+ restaurantEmail: "",
+ restaurantAddress: "",
+ restaurantLat: 0,
+ restaurantLng: 0,
+ });
+ setActiveStep(1);
+ // console.log(jsonDataObj.restaurantName)
+ };
+
+ return (
+
+
+
+
+ Get ready with your menu card 🎉
+
+
+ Submitted Successfully ❤
+
+
+
+ Restaurant Name:{" "}
+ {jsonData.restaurantName}
+
+
+ Restaurant Contact Number:{" "}
+
+ {jsonData.restaurantContactNumber}
+
+
+
+ Restaurant E-mail:{" "}
+ {jsonData.restaurantEmail}
+
+
+ Restaurant Address:{" "}
+ {jsonData.restaurantAddress}
+
+
+ Restaurant Latitude:{" "}
+ {jsonData.restaurantLat}
+
+
+ Restaurant Longitude:{" "}
+ {jsonData.restaurantLng}
+
+ {/*
*/}
+
RestaurantType
+ {filteredItems.map((item, index) => (
+
+ {/* // */}
+
-
+
+ Name: {item.name}
+
+
+ Description:{" "}
+ {item.description}
+
+ {/* */}
+
+
+ ))}
+
+
+ Our team will soon reach out to you!
+
+
+
+
+ );
+}
+
+export default FinalRestaurantCreation;
diff --git a/fit-bite-web/app/components/Footer.jsx b/fit-bite-web/app/components/Footer.jsx
new file mode 100644
index 00000000..7318c663
--- /dev/null
+++ b/fit-bite-web/app/components/Footer.jsx
@@ -0,0 +1,97 @@
+import Image from "next/image";
+import Link from "next/link";
+import React from "react";
+
+function Footer() {
+ return (
+
+ );
+}
+
+export default Footer;
diff --git a/fit-bite-web/app/components/Navbar.jsx b/fit-bite-web/app/components/Navbar.jsx
new file mode 100644
index 00000000..31150a46
--- /dev/null
+++ b/fit-bite-web/app/components/Navbar.jsx
@@ -0,0 +1,379 @@
+"use client";
+import Image from "next/image";
+import Link from "next/link";
+import React from "react";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "./ui/popover";
+// import { cartLength } from "../functions/cart";
+import { UserContext } from "../Context/UserProvider";
+import { useEffect, useState } from "react";
+function Navbar() {
+ const { loggedIn, login, logout, contextLoading, cartData } =
+ React.useContext(UserContext);
+ // if (!user.value) {
+ // // Render loading indicator or alternative content while user data is fetching
+ // return ;
+ // }
+ const [dropdown, setDropdown] = useState(false);
+ // const [userExists, setuserExists] = useState();
+
+ useEffect(() => {
+ // const token = localStorage.getItem("token");
+ // console.log("token", token);
+ // if (token) {
+ // setuserExists({ value: token });
+ // }
+ if (!contextLoading) {
+ login()
+ if (loggedIn) {
+ login();
+ // console.log(user);
+ } else {
+ console.log("User is not logged in");
+ // console.log(user);
+ }
+ }
+ }, [contextLoading, loggedIn, login]);
+ // console.log(userExists);
+ const toggleDropdown = () => {
+ // console.log(dropdown)
+ setDropdown(!dropdown);
+ };
+ // // login()
+ // console.log('User:', user);
+ // console.log('Logged In:', loggedIn);
+ // console.log("User", user);
+ // console.log(loggedIn, login, logout, user)
+ // console.log(loggedIn, login, logout, user);
+
+ return (
+
+
+
+
+
+
FitBite
+
+
+
+
+ {/*
+
+
+
+
+ -
+ Category 1=
+
+ -
+ Category 2
+
+ -
+ Category 3
+
+
+
+ Home
+
*/}
+ {/*
Dishes */}
+
+ {/* {user?.value ? (
+
+ ) : (
+ <>
+
+
+
+ >
+ )}
+ */}
+ {/* {user.value ? (
+
+
+ ) : (
+
+ <>
+
+
+ >
+
+ )} */}
+ {/*
items: {item.length}
+
{item.name} */}
+
+
+
+
+
+
+
+
+
+ Dishes
+
+
+ Add Restaurant
+
+ {/* Login */}
+
+ Create Account
+
+
+
+
+
+
+
+
+
+
+
+ {/* {user?.value ? (
+
+ ) : (
+ <>
+
+
+
+ >
+ )} */}
+
+ {/* */}
+
+ {/* */}
+
+ {loggedIn ? (
+ <>
+
+ Account
+
+
+
+
+ Orders
+
+
+
+
+ Logout
+
+
+ >
+ ) : (
+
+
+
+ )}
+
+
+
+
+
+
+ {cartData}
+
+
+ {/*
+ {}
+ */}
+
+
+
+
+ );
+}
+
+export default Navbar;
diff --git a/fit-bite-web/app/components/RestaurantType.jsx b/fit-bite-web/app/components/RestaurantType.jsx
new file mode 100644
index 00000000..99169efe
--- /dev/null
+++ b/fit-bite-web/app/components/RestaurantType.jsx
@@ -0,0 +1,95 @@
+"use client";
+import React, { useState } from "react";
+import restaurantTypeData from "../add-restaurant/restaurantTypeData";
+import RestaurantVerification from "./RestaurantVerification";
+
+function RestaurantType({ activeStep , formData, setActiveStep, setFormData}) {
+ // Create an array of states to track the clicked state for each container
+
+ const [containerStates, setContainerStates] = useState(
+ new Array(6).fill(false) // Assuming you have 6 containers, initialize all to false
+ );
+ const jsonData = JSON.stringify(formData, null, 2);
+
+ // Function to handle the click event for a specific container
+ const handleContainerClick = (index) => {
+ // Create a copy of the containerStates array and toggle the state of the clicked container
+ const updatedStates = [...containerStates];
+ updatedStates[index] = !updatedStates[index];//WIll set that thing to true
+ setContainerStates(updatedStates);
+ };
+ // const [submitted, setSubmitted] = useState(false);
+ const trueIndices = containerStates
+ .map((value, index) => (value ? index : null))
+ .filter((index) => index !== null);
+ // console.log(trueIndices);
+
+ const filteredItems = trueIndices.map((index) => restaurantTypeData[index]);
+// console.log(filteredItems)
+const handleSubmit=()=>{
+ setActiveStep(3)
+ // setSubmitted(true);
+ // setContainerStates(Array(6).fill(false))
+ // console.log(filteredItems);
+ // console.log(jsonData)
+}
+ return (
+
+ {/* Restaurant Type */}
+
+
+
+
+
+ Restaurant Type
+
+
+ Please select from following types of restaurants.
+
+
+
+ {restaurantTypeData.map((restaurantType, index) => (
+
handleContainerClick(index)}
+ >
+
+
+ {restaurantType.icon}
+
+
+ {restaurantType.name}
+
+
+ {restaurantType.description}
+
+
+
+ ))}
+
+
+ {/* {submitted && (
+
+
Submitted successfully!
+
+
+ )} */}
+
+
+
+
+
+ );
+}
+export default RestaurantType;
diff --git a/fit-bite-web/app/components/RestaurantVerification.jsx b/fit-bite-web/app/components/RestaurantVerification.jsx
new file mode 100644
index 00000000..5e65aa0e
--- /dev/null
+++ b/fit-bite-web/app/components/RestaurantVerification.jsx
@@ -0,0 +1,345 @@
+ "use client"
+import React, { useState } from "react";
+import FinalRestaurantCreation from "./FinalRestaurantCreation";
+import { ToastContainer, toast } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import { CldUploadWidget } from 'next-cloudinary';
+function RestaurantVerification({
+ jsonData,
+ filteredItems,
+ activeStep,
+ setActiveStep,
+ setFormData0,
+}) {
+ const jsonDataObj = JSON.parse(jsonData);
+ const [submitted, setSubmitted] = useState(false);
+ const [isClicked, setIsClicked] = useState(false);
+ const [fileUploaded, setFileUploaded] = useState(false);
+ const [file, setFile] = useState("");
+ //Find filtered items
+
+ const mappedItems = filteredItems.map((item) => {
+ // Here, you can access and manipulate each item as needed
+ // const itemName = item.name;
+ // const itemDescription = item.description;
+
+ // Perform your desired operations on the item
+ // console.log(
+ // `Item ${index + 1}: Name - ${itemName}, Description - ${itemDescription}`
+ // );
+
+ // You can also return a modified version of the item
+ return {
+ ...item,
+ // Add or modify properties here
+ };
+ });
+// console.log({mappedItems})
+ // Output the mapped items
+ // console.log("Mapped items:", mappedItems);
+ // console.log(jsonDataObj);
+ const [formData, setFormData] = useState({
+ restaurantName: "",
+ restaurantContactNumber: 0,
+ restaurantEmail: "",
+ restaurantAddress: "",
+ restaurantLat: 0,
+ restaurantLng: 0,
+ file:"",
+ restaurantType: {
+ items: [
+ {
+ name: "",
+ description: "",
+ },
+ {
+ name: "",
+ description: "",
+ },
+ {
+ name: "",
+ description: "",
+ },
+ {
+ name: "",
+ description: "",
+ },
+ {
+ name: "",
+ description: "",
+ },
+ {
+ name: "",
+ description: "",
+ },
+ ],
+ },
+ });
+
+ // console.log("filtereditems", filteredItems);
+ // console.log("Mapped items:", mappedItems[0]?.name);
+ // console.log(jsonDataObj.restaurantName);
+
+ const set = () => {
+ console.log("set called")
+ console.log({file})
+ setIsClicked(true);
+ setFormData({
+ userId: jsonDataObj.userId,
+ restaurantName: jsonDataObj.restaurantName,
+ restaurantContactNumber: jsonDataObj.restaurantContactNumber,
+ restaurantEmail: jsonDataObj.restaurantEmail,
+ restaurantAddress: jsonDataObj.restaurantAddress,
+ restaurantLat: jsonDataObj.restaurantLat,
+ restaurantLng: jsonDataObj.restaurantLng,
+ restaurantImage:file,
+ restaurantType: {
+ items: mappedItems,
+ },
+ });
+ };
+ const handleSubmit = async () => {
+ // console.log("Hello", jsonData);
+ // console.log(filteredItems);
+ // console.log(activeStep);
+ // console.log("Form Data original", formData);
+ // console.log(jsonDataObj.restaurantName);
+
+ // setFormData1((prevData)=>({
+ // // ...prevData,
+ // restaurantName: jsonDataObj.restaurantName,
+ // restaurantContactNumber: jsonDataObj.restaurantContactNumber,
+ // restaurantEmail: jsonDataObj.restaurantEmail,
+ // restaurantAddress: jsonDataObj.restaurantAddress,
+ // restaurantLat: jsonDataObj.restaurantLat,
+ // restaurantLng: jsonDataObj.restaurantLng,
+ // restaurantType: {
+ // items: [
+ // {
+ // name: mappedItems[0]?.name,
+ // description: mappedItems[0]?.description,
+ // },
+ // {
+ // name: mappedItems[1]?.name,
+ // description: mappedItems[1]?.description,
+ // },
+ // {
+ // name: mappedItems[2]?.name,
+ // description: mappedItems[2]?.description,
+ // },
+ // {
+ // name: mappedItems[3]?.name,
+ // description: mappedItems[3]?.description,
+ // },
+ // {
+ // name: mappedItems[4]?.name,
+ // description: mappedItems[4]?.description,
+ // },
+ // {
+ // name: mappedItems[5]?.name,
+ // description: mappedItems[5]?.description,
+ // },
+ // ],
+ // },
+ // }));
+
+ //Submit Form Data
+ // Convert form data to JSON
+ const jsonDataFinal = JSON.stringify(formData, null, 2);
+ console.log({jsonDataFinal}, jsonDataObj)
+ // console.log("String form Data Final", jsonDataFinal);
+ try {
+ const response = await fetch("/api/restaurants", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+
+ if (response.status === 200) {
+ console.log("Form data submitted successfully");
+ toast.success("😎 Where is your menu card?🎉", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ setSubmitted(true);
+ setActiveStep(4);
+ } else {
+ toast.error("👹 Invalid Data!", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ console.error("Form submission failed");
+ }
+ } catch (error) {
+ console.error("Error:", error);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ {/*
{
+ // console.log("File added:", file);
+ console.log({results}, 'Results from callback func');//this works
+ console.log('Public ID', results.info.public_id);
+ results && results.info.public_id ? setFile(results.info.public_id):console.log('No file uploaded');
+ setFileUploaded(true);
+
+ className="text-gray-400 text-md mt-5"
+ }} >
+
+ {({ open, results }) => {
+ console.log({results}, 'Results from render prop');//data.event.files[0].uploadInfo.public_id
+ return ;
+ }}
+ */}
+
RestaurantVerification:
+
+
+
+
+
+ Verify Restaurant Details
+
+
+ Restaurant Name:{" "}
+ {jsonDataObj.restaurantName}
+
+
+ Restaurant Contact Number:{" "}
+
+ {" "}
+ {jsonDataObj.restaurantContactNumber}
+
+
+
+ Restaurant E-mail:{" "}
+ {jsonDataObj.restaurantEmail}
+
+
+ Restaurant Address:{" "}
+
+ {jsonDataObj.restaurantAddress}
+
+
+
+ Restaurant Latitude:{" "}
+ {jsonDataObj.restaurantLat}
+
+
+ Restaurant Longitude:{" "}
+ {jsonDataObj.restaurantLng}
+
+ {/*
*/}
+
RestaurantType
+
{
+ // console.log("File added:", file);
+ setFileUploaded(true);
+ console.log({results}, 'Results from callback func');//this works
+ console.log('Public ID', results.info.public_id);
+ let public_id = results.info.public_id;
+ results && results.info.public_id ? setFile(results.info.public_id):console.log('No file uploaded');
+ setFile(public_id);
+
+
+ }} >
+ {/* UPLOAD */}
+ {({ open, results }) => {
+ console.log({results}, 'Results from render prop');//data.event.files[0].uploadInfo.public_id
+
+ return ;
+ }}
+
+ {filteredItems.map((item, index) => (
+
+ ))}
+
+
+ {submitted && (
+
+
Form submitted successfully!
+
+
+ )}
+
+
+
+ );
+}
+
+export default RestaurantVerification;
diff --git a/fit-bite-web/app/components/SidebarWidget.jsx b/fit-bite-web/app/components/SidebarWidget.jsx
new file mode 100644
index 00000000..917908c9
--- /dev/null
+++ b/fit-bite-web/app/components/SidebarWidget.jsx
@@ -0,0 +1,25 @@
+import React from "react";
+
+export default function SidebarWidget() {
+ return (
+
+
+ #1 Tailwind CSS Dashboard
+
+
+ Leading Tailwind CSS Admin Template with 400+ UI Component and Pages.
+
+
+ Upgrade To Pro
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/Tabs.jsx b/fit-bite-web/app/components/Tabs.jsx
new file mode 100644
index 00000000..f3b4ba1c
--- /dev/null
+++ b/fit-bite-web/app/components/Tabs.jsx
@@ -0,0 +1,111 @@
+import React from "react";
+function Tabs({ activeStep, setActiveStep }) {
+ const handleStepClick = (step) => {
+ setActiveStep(step);
+ };
+ return (
+
+
+
+
+
+
handleStepClick(1)}
+ >
+
+ STEP 1
+
+
+
handleStepClick(2)}
+ >
+
+ STEP 2
+
+
+
+
+
+ STEP 3
+
+
+
+
+
+
+ STEP 4
+
+
+ {/*

+
+
+ Master Cleanse Reliac Heirloom
+
+
+ Whatever cardigan tote bag tumblr hexagon brooklyn asymmetrical
+ gentrify, subway tile poke farm-to-table. Franzen you probably
+ haven't heard of them man bun deep jianbing selfies heirloom prism
+ food truck ugh squid celiac humblebrag.
+
+
*/}
+
+
+
+ );
+}
+
+export default Tabs;
diff --git a/fit-bite-web/app/components/common/ChartTab.jsx b/fit-bite-web/app/components/common/ChartTab.jsx
new file mode 100644
index 00000000..c456e620
--- /dev/null
+++ b/fit-bite-web/app/components/common/ChartTab.jsx
@@ -0,0 +1,43 @@
+import React, { useState } from "react";
+
+const ChartTab = () => {
+ const [selected, setSelected] = useState("optionOne");
+
+ const getButtonClass = (option) =>
+ selected === option
+ ? "shadow-theme-xs text-gray-900 dark:text-white bg-white dark:bg-gray-800"
+ : "text-gray-500 dark:text-gray-400";
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export default ChartTab;
diff --git a/fit-bite-web/app/components/common/ComponentCard.jsx b/fit-bite-web/app/components/common/ComponentCard.jsx
new file mode 100644
index 00000000..6b2705f2
--- /dev/null
+++ b/fit-bite-web/app/components/common/ComponentCard.jsx
@@ -0,0 +1,40 @@
+import React from "react";
+
+// interface ComponentCardProps {
+// title: string;
+// children: React.ReactNode;
+// className?: string; // Additional custom classes for styling
+// desc?: string; // Description text
+// }
+
+const ComponentCard = ({
+ title,
+ children,
+ className = "",
+ desc = "",
+}) => {
+ return (
+
+ {/* Card Header */}
+
+
+ {title}
+
+ {desc && (
+
+ {desc}
+
+ )}
+
+
+ {/* Card Body */}
+
+
+ );
+};
+
+export default ComponentCard;
diff --git a/fit-bite-web/app/components/common/GridShape.jsx b/fit-bite-web/app/components/common/GridShape.jsx
new file mode 100644
index 00000000..47a3c1e5
--- /dev/null
+++ b/fit-bite-web/app/components/common/GridShape.jsx
@@ -0,0 +1,25 @@
+import Image from "next/image";
+import React from "react";
+
+export default function GridShape() {
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/fit-bite-web/app/components/common/PageBreadCrumb.jsx b/fit-bite-web/app/components/common/PageBreadCrumb.jsx
new file mode 100644
index 00000000..6ec84d89
--- /dev/null
+++ b/fit-bite-web/app/components/common/PageBreadCrumb.jsx
@@ -0,0 +1,52 @@
+import Link from "next/link";
+import React from "react";
+
+// interface BreadcrumbProps {
+// pageTitle: string;
+// }
+
+const PageBreadcrumb = ({ pageTitle }) => {
+ return (
+
+
+ {pageTitle}
+
+
+
+ );
+};
+
+export default PageBreadcrumb;
diff --git a/fit-bite-web/app/components/common/ThemeToggleButton.jsx b/fit-bite-web/app/components/common/ThemeToggleButton.jsx
new file mode 100644
index 00000000..c08dfde6
--- /dev/null
+++ b/fit-bite-web/app/components/common/ThemeToggleButton.jsx
@@ -0,0 +1,42 @@
+import React from "react";
+import { useTheme } from "../../Context/ThemeContext";
+
+export const ThemeToggleButton = () => {
+ const { toggleTheme } = useTheme();
+
+ return (
+
+ );
+};
diff --git a/fit-bite-web/app/components/form/Form.jsx b/fit-bite-web/app/components/form/Form.jsx
new file mode 100644
index 00000000..f523a512
--- /dev/null
+++ b/fit-bite-web/app/components/form/Form.jsx
@@ -0,0 +1,23 @@
+import React, { FC, ReactNode, FormEvent } from "react";
+
+// interface FormProps {
+// onSubmit: (event: FormEvent) => void;
+// children: ReactNode;
+// className?: string;
+// }
+
+const Form = ({ onSubmit, children, className }) => {
+ return (
+
+ );
+};
+
+export default Form;
diff --git a/fit-bite-web/app/components/form/Label.jsx b/fit-bite-web/app/components/form/Label.jsx
new file mode 100644
index 00000000..52a96ad1
--- /dev/null
+++ b/fit-bite-web/app/components/form/Label.jsx
@@ -0,0 +1,27 @@
+import React, { FC, ReactNode } from "react";
+import { twMerge } from "tailwind-merge";
+
+// interface LabelProps {
+// htmlFor?: string;
+// children: ReactNode;
+// className?: string;
+// }
+
+const Label = ({ htmlFor, children, className }) => {
+ return (
+
+ );
+};
+
+export default Label;
diff --git a/fit-bite-web/app/components/form/MultiSelect.jsx b/fit-bite-web/app/components/form/MultiSelect.jsx
new file mode 100644
index 00000000..c55fa1b1
--- /dev/null
+++ b/fit-bite-web/app/components/form/MultiSelect.jsx
@@ -0,0 +1,166 @@
+import React, { useState } from "react";
+
+// interface Option {
+// value: string;
+// text: string;
+// selected: boolean;
+// }
+
+// interface MultiSelectProps {
+// label: string;
+// options: Option[];
+// defaultSelected?: string[];
+// onChange?: (selected: string[]) => void;
+// disabled?: boolean;
+// }
+
+const MultiSelect = ({
+ label,
+ options,
+ defaultSelected = [],
+ onChange,
+ disabled = false,
+}) => {
+ const [selectedOptions, setSelectedOptions] =
+ useState(defaultSelected);
+ const [isOpen, setIsOpen] = useState(false);
+
+ const toggleDropdown = () => {
+ if (disabled) return;
+ setIsOpen((prev) => !prev);
+ };
+
+ const handleSelect = (optionValue) => {
+ const newSelectedOptions = selectedOptions.includes(optionValue)
+ ? selectedOptions.filter((value) => value !== optionValue)
+ : [...selectedOptions, optionValue];
+
+ setSelectedOptions(newSelectedOptions);
+ if (onChange) onChange(newSelectedOptions);
+ };
+
+ const removeOption = (index, value) => {
+ const newSelectedOptions = selectedOptions.filter((opt) => opt !== value);
+ setSelectedOptions(newSelectedOptions);
+ if (onChange) onChange(newSelectedOptions);
+ };
+
+ const selectedValuesText = selectedOptions.map(
+ (value) => options.find((option) => option.value === value)?.text || ""
+ );
+
+ return (
+
+
+
+
+
+
+
+
+ {selectedValuesText.length > 0 ? (
+ selectedValuesText.map((text, index) => (
+
+
{text}
+
+
+ removeOption(index, selectedOptions[index])
+ }
+ className="pl-2 text-gray-500 cursor-pointer group-hover:text-gray-400 dark:text-gray-400"
+ >
+
+
+
+
+ ))
+ ) : (
+
+ )}
+
+
+
+
+
+ {isOpen && (
+
e.stopPropagation()}
+ >
+
+ {options.map((option, index) => (
+
+
handleSelect(option.value)}
+ >
+
+
+
+ ))}
+
+
+ )}
+
+
+
+ );
+};
+
+export default MultiSelect;
diff --git a/fit-bite-web/app/components/form/Select.jsx b/fit-bite-web/app/components/form/Select.jsx
new file mode 100644
index 00000000..bd1b5d43
--- /dev/null
+++ b/fit-bite-web/app/components/form/Select.jsx
@@ -0,0 +1,64 @@
+import React, { useState } from "react";
+
+// interface Option {
+// value: string;
+// label: string;
+// }
+
+// interface SelectProps {
+// options: Option[];
+// placeholder?: string;
+// onChange: (value: string) => void;
+// className?: string;
+// defaultValue?: string;
+// }
+
+const Select= ({
+ options,
+ placeholder = "Select an option",
+ onChange,
+ className = "",
+ defaultValue = "",
+}) => {
+ // Manage the selected value
+ const [selectedValue, setSelectedValue] = useState(defaultValue);
+
+ const handleChange = (e) => {
+ const value = e.target.value;
+ setSelectedValue(value);
+ onChange(value); // Trigger parent handler
+ };
+
+ return (
+
+ );
+};
+
+export default Select;
diff --git a/fit-bite-web/app/components/form/example-form/BasicForm.jsx b/fit-bite-web/app/components/form/example-form/BasicForm.jsx
new file mode 100644
index 00000000..a3bcf346
--- /dev/null
+++ b/fit-bite-web/app/components/form/example-form/BasicForm.jsx
@@ -0,0 +1,38 @@
+"use client";
+import React from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Form from "../Form";
+import Input from "../input/InputField";
+import Button from "../../ui/button/Button";
+
+export default function BasicForm() {
+ const handleSubmit = (e) => {
+ e.preventDefault();
+ console.log("Form submitted:");
+ };
+ return (
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/example-form/ExampleFormOne.jsx b/fit-bite-web/app/components/form/example-form/ExampleFormOne.jsx
new file mode 100644
index 00000000..5224c8c4
--- /dev/null
+++ b/fit-bite-web/app/components/form/example-form/ExampleFormOne.jsx
@@ -0,0 +1,81 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Form from "../Form";
+import Label from "../Label";
+import Input from "../input/InputField";
+import Select from "../Select";
+import TextArea from "../input/TextArea";
+import Button from "../../ui/button/Button";
+import { PaperPlaneIcon } from "../../../icons";
+
+export default function ExampleFormOne() {
+ const [message, setMessage] = useState("");
+ const handleSubmit = (e) => {
+ e.preventDefault();
+ console.log("Form submitted:");
+ };
+ const options = [
+ { value: "marketing", label: "Option 1" },
+ { value: "template", label: "Option 2" },
+ { value: "development", label: "Option 3" },
+ ];
+ const handleSelectChange = (value) => {
+ console.log("Selected value:", value);
+ };
+
+ const handleTextareaChange = (value) => {
+ setMessage(value);
+ console.log("Message:", value);
+ };
+ return (
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/example-form/ExampleFormTwo.jsx b/fit-bite-web/app/components/form/example-form/ExampleFormTwo.jsx
new file mode 100644
index 00000000..3dfe4fb5
--- /dev/null
+++ b/fit-bite-web/app/components/form/example-form/ExampleFormTwo.jsx
@@ -0,0 +1,166 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Label from "../Label";
+import Input from "../input/InputField";
+import Select from "../Select";
+import Radio from "../input/Radio";
+import Form from "../Form";
+import { CalenderIcon } from "../../../icons";
+import Button from "../../ui/button/Button";
+import Flatpickr from "react-flatpickr";
+import "flatpickr/dist/themes/light.css";
+
+export default function ExampleFormTwo() {
+ const [selectedOption, setSelectedOption] = useState("Free");
+ const [dateOfBirth, setDateOfBirth] = useState("");
+
+ const handleDateChange = (date) => {
+ setDateOfBirth(date[0].toLocaleDateString()); // Handle selected date and format it
+ };
+
+ const handleSubmit = (e) => {
+ e.preventDefault();
+ console.log("Form submitted:");
+ };
+
+ const optionsGender = [
+ { value: "male", label: "Male" },
+ { value: "female", label: "Female" },
+ { value: "other", label: "Others" },
+ ];
+ const categoryOptions = [
+ { value: "cate1", label: "Category 1" },
+ { value: "cate2", label: "Category 2" },
+ { value: "cate3", label: "Category 3" },
+ ];
+ const country = [
+ { value: "bd", label: "Bangladesh" },
+ { value: "usa", label: "United States" },
+ { value: "canada", label: "Canada" },
+ ];
+ const handleSelectGender = (value) => {
+ console.log("Selected value:", value);
+ };
+
+ const handleRadioChange = (value) => {
+ setSelectedOption(value);
+ console.log("Selected:", value);
+ };
+ return (
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/example-form/ExampleFormWithIcon.jsx b/fit-bite-web/app/components/form/example-form/ExampleFormWithIcon.jsx
new file mode 100644
index 00000000..b16698ca
--- /dev/null
+++ b/fit-bite-web/app/components/form/example-form/ExampleFormWithIcon.jsx
@@ -0,0 +1,86 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Form from "../Form";
+import Input from "../input/InputField";
+import {
+ ArrowRightIcon,
+ EnvelopeIcon,
+ LockIcon,
+ UserIcon,
+} from "../../../icons";
+import Checkbox from "../input/Checkbox";
+import Label from "../Label";
+import Button from "../../ui/button/Button";
+
+export default function ExampleFormWithIcon() {
+ const handleSubmit = (e) => {
+ e.preventDefault();
+ console.log("Form submitted:");
+ };
+
+ const [isChecked, setIsChecked] = useState(false);
+ return (
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/CheckboxComponents.jsx b/fit-bite-web/app/components/form/form-elements/CheckboxComponents.jsx
new file mode 100644
index 00000000..7fda30d2
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/CheckboxComponents.jsx
@@ -0,0 +1,37 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Checkbox from "../input/Checkbox";
+
+export default function CheckboxComponents() {
+ const [isChecked, setIsChecked] = useState(false);
+ const [isCheckedTwo, setIsCheckedTwo] = useState(true);
+ const [isCheckedDisabled, setIsCheckedDisabled] = useState(true);
+ return (
+
+
+
+
+
+ Default
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/DefaultInputs.jsx b/fit-bite-web/app/components/form/form-elements/DefaultInputs.jsx
new file mode 100644
index 00000000..6b79105f
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/DefaultInputs.jsx
@@ -0,0 +1,115 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Label from "../Label";
+import Input from "../input/InputField";
+import Select from "../Select";
+import { CalenderIcon, EyeCloseIcon, EyeIcon, TimeIcon } from "../../../icons";
+
+export default function DefaultInputs() {
+ const [showPassword, setShowPassword] = useState(false);
+ const options = [
+ { value: "marketing", label: "Marketing" },
+ { value: "template", label: "Template" },
+ { value: "development", label: "Development" },
+ ];
+ const handleSelectChange = (value) => {
+ console.log("Selected value:", value);
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ console.log(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+ console.log(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/DropZone.jsx b/fit-bite-web/app/components/form/form-elements/DropZone.jsx
new file mode 100644
index 00000000..07a68ef6
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/DropZone.jsx
@@ -0,0 +1,77 @@
+"use client";
+import React from "react";
+import ComponentCard from "../../common/ComponentCard";
+import { useDropzone } from "react-dropzone";
+
+const DropzoneComponent= () => {
+ const onDrop = (acceptedFiles) => {
+ console.log("Files dropped:", acceptedFiles);
+ // Handle file uploads here
+ };
+
+ const { getRootProps, getInputProps, isDragActive } = useDropzone({
+ onDrop,
+ accept: {
+ "image/png": [],
+ "image/jpeg": [],
+ "image/webp": [],
+ "image/svg+xml": [],
+ },
+ });
+ return (
+
+
+
+
+
+ );
+};
+
+export default DropzoneComponent;
diff --git a/fit-bite-web/app/components/form/form-elements/FileInputExample.jsx b/fit-bite-web/app/components/form/form-elements/FileInputExample.jsx
new file mode 100644
index 00000000..09be7d75
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/FileInputExample.jsx
@@ -0,0 +1,23 @@
+"use client";
+import React from "react";
+import ComponentCard from "../../common/ComponentCard";
+import FileInput from "../input/FileInput";
+import Label from "../Label";
+
+export default function FileInputExample() {
+ const handleFileChange = (event) => {
+ const file = event.target.files?.[0];
+ if (file) {
+ console.log("Selected file:", file.name);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/InputGroup.jsx b/fit-bite-web/app/components/form/form-elements/InputGroup.jsx
new file mode 100644
index 00000000..10e78e75
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/InputGroup.jsx
@@ -0,0 +1,57 @@
+"use client";
+import React from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Label from "../Label";
+import Input from "../input/InputField";
+import { EnvelopeIcon } from "../../../icons";
+import PhoneInput from "../group-input/PhoneInput";
+import Image from "next/image";
+
+export default function InputGroup() {
+ const countries = [
+ { code: "US", label: "+1" },
+ { code: "GB", label: "+44" },
+ { code: "CA", label: "+1" },
+ { code: "AU", label: "+61" },
+ ];
+ const handlePhoneNumberChange = (phoneNumber) => {
+ console.log("Updated phone number:", phoneNumber);
+ };
+ return (
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/InputStates.jsx b/fit-bite-web/app/components/form/form-elements/InputStates.jsx
new file mode 100644
index 00000000..dfc2fae9
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/InputStates.jsx
@@ -0,0 +1,70 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Input from "../input/InputField";
+import Label from "../Label";
+
+export default function InputStates() {
+ const [email, setEmail] = useState("");
+ const [error, setError] = useState(false);
+
+ // Simulate a validation check
+ const validateEmail = (value) => {
+ const isValidEmail =
+ /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value);
+ setError(!isValidEmail);
+ return isValidEmail;
+ };
+
+ const handleEmailChange = (e) => {
+ const value = e.target.value;
+ setEmail(value);
+ validateEmail(value);
+ };
+ return (
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/RadioButtons.jsx b/fit-bite-web/app/components/form/form-elements/RadioButtons.jsx
new file mode 100644
index 00000000..9ea27db8
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/RadioButtons.jsx
@@ -0,0 +1,43 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Radio from "../input/Radio";
+
+export default function RadioButtons() {
+ const [selectedValue, setSelectedValue] = useState("option2");
+
+ const handleRadioChange = (value) => {
+ setSelectedValue(value);
+ };
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/SelectInputs.jsx b/fit-bite-web/app/components/form/form-elements/SelectInputs.jsx
new file mode 100644
index 00000000..78c7a86a
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/SelectInputs.jsx
@@ -0,0 +1,55 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Label from "../Label";
+import Select from "../Select";
+import MultiSelect from "../MultiSelect";
+
+export default function SelectInputs() {
+ const options = [
+ { value: "marketing", label: "Marketing" },
+ { value: "template", label: "Template" },
+ { value: "development", label: "Development" },
+ ];
+
+ const [selectedValues, setSelectedValues] = useState([]);
+
+ const handleSelectChange = (value) => {
+ console.log("Selected value:", value);
+ };
+
+ const multiOptions = [
+ { value: "1", text: "Option 1", selected: false },
+ { value: "2", text: "Option 2", selected: false },
+ { value: "3", text: "Option 3", selected: false },
+ { value: "4", text: "Option 4", selected: false },
+ { value: "5", text: "Option 5", selected: false },
+ ];
+
+ return (
+
+
+
+
+
+
+
+
setSelectedValues(values)}
+ />
+
+ Selected Values: {selectedValues.join(", ")}
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/TextAreaInput.jsx b/fit-bite-web/app/components/form/form-elements/TextAreaInput.jsx
new file mode 100644
index 00000000..692e4bf2
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/TextAreaInput.jsx
@@ -0,0 +1,43 @@
+"use client";
+import React, { useState } from "react";
+import ComponentCard from "../../common/ComponentCard";
+import TextArea from "../input/TextArea";
+import Label from "../Label";
+
+export default function TextAreaInput() {
+ const [message, setMessage] = useState("");
+ const [messageTwo, setMessageTwo] = useState("");
+ return (
+
+
+ {/* Default TextArea */}
+
+
+
+
+ {/* Disabled TextArea */}
+
+
+
+
+
+ {/* Error TextArea */}
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/form-elements/ToggleSwitch.jsx b/fit-bite-web/app/components/form/form-elements/ToggleSwitch.jsx
new file mode 100644
index 00000000..40807996
--- /dev/null
+++ b/fit-bite-web/app/components/form/form-elements/ToggleSwitch.jsx
@@ -0,0 +1,42 @@
+"use client";
+import React from "react";
+import ComponentCard from "../../common/ComponentCard";
+import Switch from "../switch/Switch";
+
+export default function ToggleSwitch() {
+ const handleSwitchChange = (checked) => {
+ console.log("Switch is now:", checked ? "ON" : "OFF");
+ };
+ return (
+
+
+
+
+
+
{" "}
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/form/group-input/PhoneInput.jsx b/fit-bite-web/app/components/form/group-input/PhoneInput.jsx
new file mode 100644
index 00000000..ca51817c
--- /dev/null
+++ b/fit-bite-web/app/components/form/group-input/PhoneInput.jsx
@@ -0,0 +1,141 @@
+"use client";
+import React, { useState } from "react";
+
+// interface CountryCode {
+// code: string;
+// label: string;
+// }
+
+// interface PhoneInputProps {
+// countries: CountryCode[];
+// placeholder?: string;
+// onChange?: (phoneNumber: string) => void;
+// selectPosition?: "start" | "end"; // New prop for dropdown position
+// }
+
+const PhoneInput= ({
+ countries,
+ placeholder = "+1 (555) 000-0000",
+ onChange,
+ selectPosition = "start", // Default position is 'start'
+}) => {
+ const [selectedCountry, setSelectedCountry] = useState("US");
+ const [phoneNumber, setPhoneNumber] = useState("+1");
+
+ const countryCodes = countries.reduce(
+ (acc, { code, label }) => ({ ...acc, [code]: label }),
+ {}
+ );
+
+ const handleCountryChange = (e) => {
+ const newCountry = e.target.value;
+ setSelectedCountry(newCountry);
+ setPhoneNumber(countryCodes[newCountry]);
+ if (onChange) {
+ onChange(countryCodes[newCountry]);
+ }
+ };
+
+ const handlePhoneNumberChange = (e) => {
+ const newPhoneNumber = e.target.value;
+ setPhoneNumber(newPhoneNumber);
+ if (onChange) {
+ onChange(newPhoneNumber);
+ }
+ };
+
+ return (
+
+ {/* Dropdown position: Start */}
+ {selectPosition === "start" && (
+
+
+
+
+ )}
+
+ {/* Input field */}
+
+
+ {/* Dropdown position: End */}
+ {selectPosition === "end" && (
+
+
+
+
+ )}
+
+ );
+};
+
+export default PhoneInput;
diff --git a/fit-bite-web/app/components/form/input/Checkbox.jsx b/fit-bite-web/app/components/form/input/Checkbox.jsx
new file mode 100644
index 00000000..0bf0298d
--- /dev/null
+++ b/fit-bite-web/app/components/form/input/Checkbox.jsx
@@ -0,0 +1,43 @@
+import React from "react";
+
+// interface CheckboxProps {
+// label?: string; // Optional label for the checkbox
+// checked: boolean; // Checked state
+// className?: string;
+// id?: string; // Unique ID for the checkbox
+// onChange: (checked: boolean) => void; // Change handler
+// disabled?: boolean; // Disabled state
+// }
+
+const Checkbox= ({
+ label,
+ checked,
+ id,
+ onChange,
+ className = "",
+ disabled = false,
+}) => {
+ return (
+
+ );
+};
+
+export default Checkbox;
diff --git a/fit-bite-web/app/components/form/input/FileInput.jsx b/fit-bite-web/app/components/form/input/FileInput.jsx
new file mode 100644
index 00000000..ced2eabd
--- /dev/null
+++ b/fit-bite-web/app/components/form/input/FileInput.jsx
@@ -0,0 +1,18 @@
+import React, { FC } from "react";
+
+// interface FileInputProps {
+// className?: string;
+// onChange?: (event: React.ChangeEvent) => void;
+// }
+
+const FileInput = ({ className, onChange }) => {
+ return (
+
+ );
+};
+
+export default FileInput;
diff --git a/fit-bite-web/app/components/form/input/InputField.jsx b/fit-bite-web/app/components/form/input/InputField.jsx
new file mode 100644
index 00000000..7936afa6
--- /dev/null
+++ b/fit-bite-web/app/components/form/input/InputField.jsx
@@ -0,0 +1,84 @@
+import React, { FC } from "react";
+
+// interface InputProps {
+// type?: "text" | "number" | "email" | "password" | "date" | "time" | string;
+// id?: string;
+// name?: string;
+// placeholder?: string;
+// defaultValue?: string | number;
+// onChange?: (e: React.ChangeEvent) => void;
+// className?: string;
+// min?: string;
+// max?: string;
+// step?: number;
+// disabled?: boolean;
+// success?: boolean;
+// error?: boolean;
+// hint?: string; // Optional hint text
+// }
+
+const Input = ({
+ type = "text",
+ id,
+ name,
+ placeholder,
+ defaultValue,
+ onChange,
+ className = "",
+ min,
+ max,
+ step,
+ disabled = false,
+ success = false,
+ error = false,
+ hint,
+}) => {
+ // Determine input styles based on state (disabled, success, error)
+ let inputClasses = `h-11 w-full rounded-lg border appearance-none px-4 py-2.5 text-sm shadow-theme-xs placeholder:text-gray-400 focus:outline-none focus:ring dark:bg-gray-900 dark:text-white/90 dark:placeholder:text-white/30 dark:focus:border-brand-800 ${className}`;
+
+ // Add styles for the different states
+ if (disabled) {
+ inputClasses += ` text-gray-500 border-gray-300 cursor-not-allowed dark:bg-gray-800 dark:text-gray-400 dark:border-gray-700`;
+ } else if (error) {
+ inputClasses += ` text-error-800 border-error-500 focus:ring focus:ring-error-500/10 dark:text-error-400 dark:border-error-500`;
+ } else if (success) {
+ inputClasses += ` text-success-500 border-success-400 focus:ring-success-500/10 focus:border-success-300 dark:text-success-400 dark:border-success-500`;
+ } else {
+ inputClasses += ` bg-transparent text-gray-800 border-gray-300 focus:border-brand-300 focus:ring focus:ring-brand-500/10 dark:border-gray-700 dark:bg-gray-900 dark:text-white/90 dark:focus:border-brand-800`;
+ }
+
+ return (
+
+
+
+ {/* Optional Hint Text */}
+ {hint && (
+
+ {hint}
+
+ )}
+
+ );
+};
+
+export default Input;
diff --git a/fit-bite-web/app/components/form/input/Radio.jsx b/fit-bite-web/app/components/form/input/Radio.jsx
new file mode 100644
index 00000000..4948068a
--- /dev/null
+++ b/fit-bite-web/app/components/form/input/Radio.jsx
@@ -0,0 +1,65 @@
+import React from "react";
+
+// interface RadioProps {
+// id: string; // Unique ID for the radio button
+// name: string; // Radio group name
+// value: string; // Value of the radio button
+// checked: boolean; // Whether the radio button is checked
+// label: string; // Label for the radio button
+// onChange: (value: string) => void; // Handler for value change
+// className?: string; // Optional additional classes
+// disabled?: boolean; // Optional disabled state for the radio button
+// }
+
+const Radio = ({
+ id,
+ name,
+ value,
+ checked,
+ label,
+ onChange,
+ className = "",
+ disabled = false,
+}) => {
+ return (
+
+ );
+};
+
+export default Radio;
diff --git a/fit-bite-web/app/components/form/input/RadioSm.jsx b/fit-bite-web/app/components/form/input/RadioSm.jsx
new file mode 100644
index 00000000..76cf7518
--- /dev/null
+++ b/fit-bite-web/app/components/form/input/RadioSm.jsx
@@ -0,0 +1,59 @@
+import React from "react";
+
+// interface RadioProps {
+// id: string; // Unique ID for the radio button
+// name: string; // Group name for the radio button
+// value: string; // Value of the radio button
+// checked: boolean; // Whether the radio button is checked
+// label: string; // Label text for the radio button
+// onChange: (value: string) => void; // Handler for when the radio button is toggled
+// className?: string; // Optional custom classes for styling
+// }
+
+const RadioSm= ({
+ id,
+ name,
+ value,
+ checked,
+ label,
+ onChange,
+ className = "",
+}) => {
+ return (
+
+ );
+};
+
+export default RadioSm;
diff --git a/fit-bite-web/app/components/form/input/TextArea.jsx b/fit-bite-web/app/components/form/input/TextArea.jsx
new file mode 100644
index 00000000..0f8b74e8
--- /dev/null
+++ b/fit-bite-web/app/components/form/input/TextArea.jsx
@@ -0,0 +1,63 @@
+import React from "react";
+
+// interface TextareaProps {
+// placeholder?: string; // Placeholder text
+// rows?: number; // Number of rows
+// value?: string; // Current value
+// onChange?: (value: string) => void; // Change handler
+// className?: string; // Additional CSS classes
+// disabled?: boolean; // Disabled state
+// error?: boolean; // Error state
+// hint?: string; // Hint text to display
+// }
+
+const TextArea= ({
+ placeholder = "Enter your message", // Default placeholder
+ rows = 3, // Default number of rows
+ value = "", // Default value
+ onChange, // Callback for changes
+ className = "", // Additional custom styles
+ disabled = false, // Disabled state
+ error = false, // Error state
+ hint = "", // Default hint text
+}) => {
+ const handleChange = (e) => {
+ if (onChange) {
+ onChange(e.target.value);
+ }
+ };
+
+ let textareaClasses = `w-full rounded-lg border px-4 py-2.5 text-sm shadow-theme-xs focus:outline-none ${className}`;
+
+ if (disabled) {
+ textareaClasses += ` bg-gray-100 opacity-50 text-gray-500 border-gray-300 cursor-not-allowed dark:bg-gray-800 dark:text-gray-400 dark:border-gray-700`;
+ } else if (error) {
+ textareaClasses += ` bg-transparent text-gray-400 border-gray-300 focus:border-error-300 focus:ring focus:ring-error-500/10 dark:border-gray-700 dark:bg-gray-900 dark:text-white/90 dark:focus:border-error-800`;
+ } else {
+ textareaClasses += ` bg-transparent text-gray-400 border-gray-300 focus:border-brand-300 focus:ring focus:ring-brand-500/10 dark:border-gray-700 dark:bg-gray-900 dark:text-white/90 dark:focus:border-brand-800`;
+ }
+
+ return (
+
+
+ {hint && (
+
+ {hint}
+
+ )}
+
+ );
+};
+
+export default TextArea;
diff --git a/fit-bite-web/app/components/form/switch/Switch.jsx b/fit-bite-web/app/components/form/switch/Switch.jsx
new file mode 100644
index 00000000..31dbf4e2
--- /dev/null
+++ b/fit-bite-web/app/components/form/switch/Switch.jsx
@@ -0,0 +1,73 @@
+"use client";
+import React, { useState } from "react";
+
+// interface SwitchProps {
+// label: string;
+// defaultChecked?: boolean;
+// disabled?: boolean;
+// onChange?: (checked: boolean) => void;
+// color?: "blue" | "gray"; // Added prop to toggle color theme
+// }
+
+const Switch= ({
+ label,
+ defaultChecked = false,
+ disabled = false,
+ onChange,
+ color = "blue", // Default to blue color
+}) => {
+ const [isChecked, setIsChecked] = useState(defaultChecked);
+
+ const handleToggle = () => {
+ if (disabled) return;
+ const newCheckedState = !isChecked;
+ setIsChecked(newCheckedState);
+ if (onChange) {
+ onChange(newCheckedState);
+ }
+ };
+
+ const switchColors =
+ color === "blue"
+ ? {
+ background: isChecked
+ ? "bg-brand-500 "
+ : "bg-gray-200 dark:bg-white/10", // Blue version
+ knob: isChecked
+ ? "translate-x-full bg-white"
+ : "translate-x-0 bg-white",
+ }
+ : {
+ background: isChecked
+ ? "bg-gray-800 dark:bg-white/10"
+ : "bg-gray-200 dark:bg-white/10", // Gray version
+ knob: isChecked
+ ? "translate-x-full bg-white"
+ : "translate-x-0 bg-white",
+ };
+
+ return (
+
+ );
+};
+
+export default Switch;
diff --git a/fit-bite-web/app/components/header/NotificationDropdown.jsx b/fit-bite-web/app/components/header/NotificationDropdown.jsx
new file mode 100644
index 00000000..3a8df831
--- /dev/null
+++ b/fit-bite-web/app/components/header/NotificationDropdown.jsx
@@ -0,0 +1,384 @@
+"use client";
+import Image from "next/image";
+import Link from "next/link";
+import React, { useState } from "react";
+import { Dropdown } from "../ui/dropdown/Dropdown";
+import { DropdownItem } from "../ui/dropdown/DropdownItem";
+
+export default function NotificationDropdown() {
+ const [isOpen, setIsOpen] = useState(false);
+ const [notifying, setNotifying] = useState(true);
+
+ function toggleDropdown() {
+ setIsOpen(!isOpen);
+ }
+
+ function closeDropdown() {
+ setIsOpen(false);
+ }
+
+ const handleClick = () => {
+ toggleDropdown();
+ setNotifying(false);
+ };
+ return (
+
+
+
+
+
+ Notification
+
+
+
+
+ {/* Example notification items */}
+ -
+
+
+
+
+
+
+
+
+
+ Terry Franci
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 5 min ago
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ Alena Franci
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 8 min ago
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ Jocelyn Kenter
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 15 min ago
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ Brandon Philips
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 1 hr ago
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ Terry Franci
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 5 min ago
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ Alena Franci
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 8 min ago
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ Jocelyn Kenter
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 15 min ago
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ Brandon Philips
+
+ requests permission to change
+
+ Project - Nganter App
+
+
+
+
+ Project
+
+ 1 hr ago
+
+
+
+
+ {/* Add more items as needed */}
+
+
+ View All Notifications
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/header/UserDropdown.jsx b/fit-bite-web/app/components/header/UserDropdown.jsx
new file mode 100644
index 00000000..0530b96b
--- /dev/null
+++ b/fit-bite-web/app/components/header/UserDropdown.jsx
@@ -0,0 +1,172 @@
+"use client";
+import Image from "next/image";
+import Link from "next/link";
+import React, { useState } from "react";
+import { Dropdown } from "../ui/dropdown/Dropdown";
+import { DropdownItem } from "../ui/dropdown/DropdownItem";
+
+export default function UserDropdown() {
+ const [isOpen, setIsOpen] = useState(false);
+
+ function toggleDropdown() {
+ setIsOpen(!isOpen);
+ }
+
+ function closeDropdown() {
+ setIsOpen(false);
+ }
+ return (
+
+
+
+
+
+
+ User
+
+
+ randomuser@pimjo.com
+
+
+
+
+ -
+
+
+ Edit profile
+
+
+ -
+
+
+ Account settings
+
+
+ -
+
+
+ Support
+
+
+
+
+
+ Sign out
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/icons/alert.svg b/fit-bite-web/app/components/icons/alert.svg
new file mode 100644
index 00000000..f4b9c4e5
--- /dev/null
+++ b/fit-bite-web/app/components/icons/alert.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/angle-down.svg b/fit-bite-web/app/components/icons/angle-down.svg
new file mode 100644
index 00000000..32e95573
--- /dev/null
+++ b/fit-bite-web/app/components/icons/angle-down.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/angle-left.svg b/fit-bite-web/app/components/icons/angle-left.svg
new file mode 100644
index 00000000..e69de29b
diff --git a/fit-bite-web/app/components/icons/angle-right.svg b/fit-bite-web/app/components/icons/angle-right.svg
new file mode 100644
index 00000000..e69de29b
diff --git a/fit-bite-web/app/components/icons/angle-up.svg b/fit-bite-web/app/components/icons/angle-up.svg
new file mode 100644
index 00000000..71f074af
--- /dev/null
+++ b/fit-bite-web/app/components/icons/angle-up.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/arrow-down.svg b/fit-bite-web/app/components/icons/arrow-down.svg
new file mode 100644
index 00000000..92b036c7
--- /dev/null
+++ b/fit-bite-web/app/components/icons/arrow-down.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/arrow-right.svg b/fit-bite-web/app/components/icons/arrow-right.svg
new file mode 100644
index 00000000..593bd553
--- /dev/null
+++ b/fit-bite-web/app/components/icons/arrow-right.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/arrow-up.svg b/fit-bite-web/app/components/icons/arrow-up.svg
new file mode 100644
index 00000000..c0ef6427
--- /dev/null
+++ b/fit-bite-web/app/components/icons/arrow-up.svg
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/audio.svg b/fit-bite-web/app/components/icons/audio.svg
new file mode 100644
index 00000000..18e60ad0
--- /dev/null
+++ b/fit-bite-web/app/components/icons/audio.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/bell.svg b/fit-bite-web/app/components/icons/bell.svg
new file mode 100644
index 00000000..a6c6ee85
--- /dev/null
+++ b/fit-bite-web/app/components/icons/bell.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/bolt.svg b/fit-bite-web/app/components/icons/bolt.svg
new file mode 100644
index 00000000..ecb02a3f
--- /dev/null
+++ b/fit-bite-web/app/components/icons/bolt.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/box-cube.svg b/fit-bite-web/app/components/icons/box-cube.svg
new file mode 100644
index 00000000..5a36ea46
--- /dev/null
+++ b/fit-bite-web/app/components/icons/box-cube.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/box-line.svg b/fit-bite-web/app/components/icons/box-line.svg
new file mode 100644
index 00000000..57432fec
--- /dev/null
+++ b/fit-bite-web/app/components/icons/box-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/box.svg b/fit-bite-web/app/components/icons/box.svg
new file mode 100644
index 00000000..0fa3c19f
--- /dev/null
+++ b/fit-bite-web/app/components/icons/box.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/calendar.svg b/fit-bite-web/app/components/icons/calendar.svg
new file mode 100644
index 00000000..b424736b
--- /dev/null
+++ b/fit-bite-web/app/components/icons/calendar.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/calender-line.svg b/fit-bite-web/app/components/icons/calender-line.svg
new file mode 100644
index 00000000..227b0fe1
--- /dev/null
+++ b/fit-bite-web/app/components/icons/calender-line.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/chat.svg b/fit-bite-web/app/components/icons/chat.svg
new file mode 100644
index 00000000..678886a3
--- /dev/null
+++ b/fit-bite-web/app/components/icons/chat.svg
@@ -0,0 +1,3 @@
+
diff --git a/fit-bite-web/app/components/icons/check-circle.svg b/fit-bite-web/app/components/icons/check-circle.svg
new file mode 100644
index 00000000..a77bb7af
--- /dev/null
+++ b/fit-bite-web/app/components/icons/check-circle.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/check-line.svg b/fit-bite-web/app/components/icons/check-line.svg
new file mode 100644
index 00000000..17b47864
--- /dev/null
+++ b/fit-bite-web/app/components/icons/check-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/chevron-down.svg b/fit-bite-web/app/components/icons/chevron-down.svg
new file mode 100644
index 00000000..88775fda
--- /dev/null
+++ b/fit-bite-web/app/components/icons/chevron-down.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/fit-bite-web/app/components/icons/chevron-left.svg b/fit-bite-web/app/components/icons/chevron-left.svg
new file mode 100644
index 00000000..9409d16a
--- /dev/null
+++ b/fit-bite-web/app/components/icons/chevron-left.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/chevron-up.svg b/fit-bite-web/app/components/icons/chevron-up.svg
new file mode 100644
index 00000000..9bb13b96
--- /dev/null
+++ b/fit-bite-web/app/components/icons/chevron-up.svg
@@ -0,0 +1,3 @@
+
diff --git a/fit-bite-web/app/components/icons/close-line.svg b/fit-bite-web/app/components/icons/close-line.svg
new file mode 100644
index 00000000..8ed1b2e9
--- /dev/null
+++ b/fit-bite-web/app/components/icons/close-line.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/close.svg b/fit-bite-web/app/components/icons/close.svg
new file mode 100644
index 00000000..6692f849
--- /dev/null
+++ b/fit-bite-web/app/components/icons/close.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/copy.svg b/fit-bite-web/app/components/icons/copy.svg
new file mode 100644
index 00000000..951dde49
--- /dev/null
+++ b/fit-bite-web/app/components/icons/copy.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/docs.svg b/fit-bite-web/app/components/icons/docs.svg
new file mode 100644
index 00000000..316264ab
--- /dev/null
+++ b/fit-bite-web/app/components/icons/docs.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/dollar-line.svg b/fit-bite-web/app/components/icons/dollar-line.svg
new file mode 100644
index 00000000..843955f8
--- /dev/null
+++ b/fit-bite-web/app/components/icons/dollar-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/download.svg b/fit-bite-web/app/components/icons/download.svg
new file mode 100644
index 00000000..a5889356
--- /dev/null
+++ b/fit-bite-web/app/components/icons/download.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/envelope.svg b/fit-bite-web/app/components/icons/envelope.svg
new file mode 100644
index 00000000..128cb87f
--- /dev/null
+++ b/fit-bite-web/app/components/icons/envelope.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/eye-close.svg b/fit-bite-web/app/components/icons/eye-close.svg
new file mode 100644
index 00000000..761523c1
--- /dev/null
+++ b/fit-bite-web/app/components/icons/eye-close.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/eye.svg b/fit-bite-web/app/components/icons/eye.svg
new file mode 100644
index 00000000..f9ff4204
--- /dev/null
+++ b/fit-bite-web/app/components/icons/eye.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/file.svg b/fit-bite-web/app/components/icons/file.svg
new file mode 100644
index 00000000..840edf26
--- /dev/null
+++ b/fit-bite-web/app/components/icons/file.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/folder.svg b/fit-bite-web/app/components/icons/folder.svg
new file mode 100644
index 00000000..ba7056d0
--- /dev/null
+++ b/fit-bite-web/app/components/icons/folder.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/grid.svg b/fit-bite-web/app/components/icons/grid.svg
new file mode 100644
index 00000000..a66ab76f
--- /dev/null
+++ b/fit-bite-web/app/components/icons/grid.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/group.svg b/fit-bite-web/app/components/icons/group.svg
new file mode 100644
index 00000000..5d2898b6
--- /dev/null
+++ b/fit-bite-web/app/components/icons/group.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/horizontal-dots.svg b/fit-bite-web/app/components/icons/horizontal-dots.svg
new file mode 100644
index 00000000..d5234595
--- /dev/null
+++ b/fit-bite-web/app/components/icons/horizontal-dots.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/index copy.jsx b/fit-bite-web/app/components/icons/index copy.jsx
new file mode 100644
index 00000000..ddb7b93b
--- /dev/null
+++ b/fit-bite-web/app/components/icons/index copy.jsx
@@ -0,0 +1,110 @@
+"use client"
+import PlusIcon from "./plus.svg";
+import CloseIcon from "./close.svg";
+import BoxIcon from "./box.svg";
+import CheckCircleIcon from "./check-circle.svg";
+import AlertIcon from "./alert.svg";
+import InfoIcon from "./info.svg";
+import ErrorIcon from "./info-hexa.svg";
+import BoltIcon from "./bolt.svg";
+import ArrowUpIcon from "./arrow-up.svg";
+import ArrowDownIcon from "./arrow-down.svg";
+import FolderIcon from "./folder.svg";
+import VideoIcon from "./videos.svg";
+import AudioIcon from "./audio.svg";
+import GridIcon from "./grid.svg";
+import FileIcon from "./file.svg";
+import DownloadIcon from "./download.svg";
+import ArrowRightIcon from "./arrow-right.svg";
+import GroupIcon from "./group.svg";
+import BoxIconLine from "./box-line.svg";
+import ShootingStarIcon from "./shooting-star.svg";
+import DollarLineIcon from "./dollar-line.svg";
+import TrashBinIcon from "./trash.svg";
+import AngleUpIcon from "./angle-up.svg";
+import AngleDownIcon from "./angle-down.svg";
+import PencilIcon from "./pencil.svg";
+import CheckLineIcon from "./check-line.svg";
+import CloseLineIcon from "./close-line.svg";
+import ChevronDownIcon from "./chevron-down.svg";
+import ChevronUpIcon from "./chevron-up.svg";
+import PaperPlaneIcon from "./paper-plane.svg";
+import LockIcon from "./lock.svg";
+import EnvelopeIcon from "./envelope.svg";
+import UserIcon from "./user-line.svg";
+import CalenderIcon from "./calender-line.svg";
+import EyeIcon from "./eye.svg";
+import EyeCloseIcon from "./eye-close.svg";
+import TimeIcon from "./time.svg";
+import CopyIcon from "./copy.svg";
+import ChevronLeftIcon from "./chevron-left.svg";
+import UserCircleIcon from "./user-circle.svg";
+import TaskIcon from "./task-icon.svg";
+import ListIcon from "./list.svg";
+import TableIcon from "./table.svg";
+import PageIcon from "./page.svg";
+import PieChartIcon from "./pie-chart.svg";
+import BoxCubeIcon from "./box-cube.svg";
+import PlugInIcon from "./plug-in.svg";
+import DocsIcon from "./docs.svg";
+import MailIcon from "./mail-line.svg";
+import HorizontaLDots from "./horizontal-dots.svg";
+import ChatIcon from "./chat.svg";
+import MoreDotIcon from "./more-dot.svg";
+import BellIcon from "./bell.svg";
+
+export {
+ DownloadIcon,
+ BellIcon,
+ MoreDotIcon,
+ FileIcon,
+ GridIcon,
+ AudioIcon,
+ VideoIcon,
+ BoltIcon,
+ PlusIcon,
+ BoxIcon,
+ CloseIcon,
+ CheckCircleIcon,
+ AlertIcon,
+ InfoIcon,
+ ErrorIcon,
+ ArrowUpIcon,
+ FolderIcon,
+ ArrowDownIcon,
+ ArrowRightIcon,
+ GroupIcon,
+ BoxIconLine,
+ ShootingStarIcon,
+ DollarLineIcon,
+ TrashBinIcon,
+ AngleUpIcon,
+ AngleDownIcon,
+ PencilIcon,
+ CheckLineIcon,
+ CloseLineIcon,
+ ChevronDownIcon,
+ PaperPlaneIcon,
+ EnvelopeIcon,
+ LockIcon,
+ UserIcon,
+ CalenderIcon,
+ EyeIcon,
+ EyeCloseIcon,
+ TimeIcon,
+ CopyIcon,
+ ChevronLeftIcon,
+ UserCircleIcon,
+ ListIcon,
+ TableIcon,
+ PageIcon,
+ TaskIcon,
+ PieChartIcon,
+ BoxCubeIcon,
+ PlugInIcon,
+ DocsIcon,
+ MailIcon,
+ HorizontaLDots,
+ ChevronUpIcon,
+ ChatIcon,
+};
diff --git a/fit-bite-web/app/components/icons/index.jsx b/fit-bite-web/app/components/icons/index.jsx
new file mode 100644
index 00000000..ddb7b93b
--- /dev/null
+++ b/fit-bite-web/app/components/icons/index.jsx
@@ -0,0 +1,110 @@
+"use client"
+import PlusIcon from "./plus.svg";
+import CloseIcon from "./close.svg";
+import BoxIcon from "./box.svg";
+import CheckCircleIcon from "./check-circle.svg";
+import AlertIcon from "./alert.svg";
+import InfoIcon from "./info.svg";
+import ErrorIcon from "./info-hexa.svg";
+import BoltIcon from "./bolt.svg";
+import ArrowUpIcon from "./arrow-up.svg";
+import ArrowDownIcon from "./arrow-down.svg";
+import FolderIcon from "./folder.svg";
+import VideoIcon from "./videos.svg";
+import AudioIcon from "./audio.svg";
+import GridIcon from "./grid.svg";
+import FileIcon from "./file.svg";
+import DownloadIcon from "./download.svg";
+import ArrowRightIcon from "./arrow-right.svg";
+import GroupIcon from "./group.svg";
+import BoxIconLine from "./box-line.svg";
+import ShootingStarIcon from "./shooting-star.svg";
+import DollarLineIcon from "./dollar-line.svg";
+import TrashBinIcon from "./trash.svg";
+import AngleUpIcon from "./angle-up.svg";
+import AngleDownIcon from "./angle-down.svg";
+import PencilIcon from "./pencil.svg";
+import CheckLineIcon from "./check-line.svg";
+import CloseLineIcon from "./close-line.svg";
+import ChevronDownIcon from "./chevron-down.svg";
+import ChevronUpIcon from "./chevron-up.svg";
+import PaperPlaneIcon from "./paper-plane.svg";
+import LockIcon from "./lock.svg";
+import EnvelopeIcon from "./envelope.svg";
+import UserIcon from "./user-line.svg";
+import CalenderIcon from "./calender-line.svg";
+import EyeIcon from "./eye.svg";
+import EyeCloseIcon from "./eye-close.svg";
+import TimeIcon from "./time.svg";
+import CopyIcon from "./copy.svg";
+import ChevronLeftIcon from "./chevron-left.svg";
+import UserCircleIcon from "./user-circle.svg";
+import TaskIcon from "./task-icon.svg";
+import ListIcon from "./list.svg";
+import TableIcon from "./table.svg";
+import PageIcon from "./page.svg";
+import PieChartIcon from "./pie-chart.svg";
+import BoxCubeIcon from "./box-cube.svg";
+import PlugInIcon from "./plug-in.svg";
+import DocsIcon from "./docs.svg";
+import MailIcon from "./mail-line.svg";
+import HorizontaLDots from "./horizontal-dots.svg";
+import ChatIcon from "./chat.svg";
+import MoreDotIcon from "./more-dot.svg";
+import BellIcon from "./bell.svg";
+
+export {
+ DownloadIcon,
+ BellIcon,
+ MoreDotIcon,
+ FileIcon,
+ GridIcon,
+ AudioIcon,
+ VideoIcon,
+ BoltIcon,
+ PlusIcon,
+ BoxIcon,
+ CloseIcon,
+ CheckCircleIcon,
+ AlertIcon,
+ InfoIcon,
+ ErrorIcon,
+ ArrowUpIcon,
+ FolderIcon,
+ ArrowDownIcon,
+ ArrowRightIcon,
+ GroupIcon,
+ BoxIconLine,
+ ShootingStarIcon,
+ DollarLineIcon,
+ TrashBinIcon,
+ AngleUpIcon,
+ AngleDownIcon,
+ PencilIcon,
+ CheckLineIcon,
+ CloseLineIcon,
+ ChevronDownIcon,
+ PaperPlaneIcon,
+ EnvelopeIcon,
+ LockIcon,
+ UserIcon,
+ CalenderIcon,
+ EyeIcon,
+ EyeCloseIcon,
+ TimeIcon,
+ CopyIcon,
+ ChevronLeftIcon,
+ UserCircleIcon,
+ ListIcon,
+ TableIcon,
+ PageIcon,
+ TaskIcon,
+ PieChartIcon,
+ BoxCubeIcon,
+ PlugInIcon,
+ DocsIcon,
+ MailIcon,
+ HorizontaLDots,
+ ChevronUpIcon,
+ ChatIcon,
+};
diff --git a/fit-bite-web/app/components/icons/info-hexa.svg b/fit-bite-web/app/components/icons/info-hexa.svg
new file mode 100644
index 00000000..59ea9328
--- /dev/null
+++ b/fit-bite-web/app/components/icons/info-hexa.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/info.svg b/fit-bite-web/app/components/icons/info.svg
new file mode 100644
index 00000000..6ef176e7
--- /dev/null
+++ b/fit-bite-web/app/components/icons/info.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/list.svg b/fit-bite-web/app/components/icons/list.svg
new file mode 100644
index 00000000..93060bdf
--- /dev/null
+++ b/fit-bite-web/app/components/icons/list.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/lock.svg b/fit-bite-web/app/components/icons/lock.svg
new file mode 100644
index 00000000..a9afbe61
--- /dev/null
+++ b/fit-bite-web/app/components/icons/lock.svg
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/mail-line.svg b/fit-bite-web/app/components/icons/mail-line.svg
new file mode 100644
index 00000000..2e8a46bd
--- /dev/null
+++ b/fit-bite-web/app/components/icons/mail-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/more-dot.svg b/fit-bite-web/app/components/icons/more-dot.svg
new file mode 100644
index 00000000..d99c76be
--- /dev/null
+++ b/fit-bite-web/app/components/icons/more-dot.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/page.svg b/fit-bite-web/app/components/icons/page.svg
new file mode 100644
index 00000000..862c68a7
--- /dev/null
+++ b/fit-bite-web/app/components/icons/page.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/paper-plane.svg b/fit-bite-web/app/components/icons/paper-plane.svg
new file mode 100644
index 00000000..1e001964
--- /dev/null
+++ b/fit-bite-web/app/components/icons/paper-plane.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/pencil.svg b/fit-bite-web/app/components/icons/pencil.svg
new file mode 100644
index 00000000..6b94796b
--- /dev/null
+++ b/fit-bite-web/app/components/icons/pencil.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/pie-chart.svg b/fit-bite-web/app/components/icons/pie-chart.svg
new file mode 100644
index 00000000..8917ca9c
--- /dev/null
+++ b/fit-bite-web/app/components/icons/pie-chart.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/plug-in.svg b/fit-bite-web/app/components/icons/plug-in.svg
new file mode 100644
index 00000000..958e3e9a
--- /dev/null
+++ b/fit-bite-web/app/components/icons/plug-in.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/plus.svg b/fit-bite-web/app/components/icons/plus.svg
new file mode 100644
index 00000000..9241f555
--- /dev/null
+++ b/fit-bite-web/app/components/icons/plus.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/shooting-star.svg b/fit-bite-web/app/components/icons/shooting-star.svg
new file mode 100644
index 00000000..519f5d28
--- /dev/null
+++ b/fit-bite-web/app/components/icons/shooting-star.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/table.svg b/fit-bite-web/app/components/icons/table.svg
new file mode 100644
index 00000000..889bd896
--- /dev/null
+++ b/fit-bite-web/app/components/icons/table.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/task-icon.svg b/fit-bite-web/app/components/icons/task-icon.svg
new file mode 100644
index 00000000..9f1d0922
--- /dev/null
+++ b/fit-bite-web/app/components/icons/task-icon.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/task.svg b/fit-bite-web/app/components/icons/task.svg
new file mode 100644
index 00000000..52d9f4dc
--- /dev/null
+++ b/fit-bite-web/app/components/icons/task.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/time.svg b/fit-bite-web/app/components/icons/time.svg
new file mode 100644
index 00000000..e8df4208
--- /dev/null
+++ b/fit-bite-web/app/components/icons/time.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/trash.svg b/fit-bite-web/app/components/icons/trash.svg
new file mode 100644
index 00000000..e42ce25b
--- /dev/null
+++ b/fit-bite-web/app/components/icons/trash.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/user-circle.svg b/fit-bite-web/app/components/icons/user-circle.svg
new file mode 100644
index 00000000..fa6c14ae
--- /dev/null
+++ b/fit-bite-web/app/components/icons/user-circle.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/fit-bite-web/app/components/icons/user-line.svg b/fit-bite-web/app/components/icons/user-line.svg
new file mode 100644
index 00000000..28280ae6
--- /dev/null
+++ b/fit-bite-web/app/components/icons/user-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/icons/videos.svg b/fit-bite-web/app/components/icons/videos.svg
new file mode 100644
index 00000000..b8d69f17
--- /dev/null
+++ b/fit-bite-web/app/components/icons/videos.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/app/components/ui/UserAddressCard.jsx b/fit-bite-web/app/components/ui/UserAddressCard.jsx
new file mode 100644
index 00000000..e7430e35
--- /dev/null
+++ b/fit-bite-web/app/components/ui/UserAddressCard.jsx
@@ -0,0 +1,134 @@
+"use client";
+import React from "react";
+import { useModal } from "../../hooks/useModal";
+import { Modal } from "../ui/modal";
+import Button from "../ui/button/Button";
+import Input from "../form/input/InputField";
+import Label from "../form/Label";
+
+export default function UserAddressCard() {
+ const { isOpen, openModal, closeModal } = useModal();
+ const handleSave = () => {
+ // Handle save logic here
+ console.log("Saving changes...");
+ closeModal();
+ };
+ return (
+ <>
+
+
+
+
+ Address
+
+
+
+
+
+ Country
+
+
+ United States
+
+
+
+
+
+ City/State
+
+
+ Phoenix, Arizona, United States.
+
+
+
+
+
+ Postal Code
+
+
+ ERT 2489
+
+
+
+
+
+ TAX ID
+
+
+ AS4568384
+
+
+
+
+
+
+
+
+
+
+
+
+ Edit Address
+
+
+ Update your details to keep your profile up-to-date.
+
+
+
+
+
+ >
+ );
+}
diff --git a/fit-bite-web/app/components/ui/badge/Badge.jsx b/fit-bite-web/app/components/ui/badge/Badge.jsx
new file mode 100644
index 00000000..d84b906a
--- /dev/null
+++ b/fit-bite-web/app/components/ui/badge/Badge.jsx
@@ -0,0 +1,62 @@
+import React from "react";
+
+
+
+
+const Badge = ({
+ variant = "light",
+ color = "primary",
+ size = "md",
+ startIcon,
+ endIcon,
+ children,
+}) => {
+ const baseStyles =
+ "inline-flex items-center px-2.5 py-0.5 justify-center gap-1 rounded-full font-medium";
+
+ // Define size styles
+ const sizeStyles = {
+ sm: "text-theme-xs", // Smaller padding and font size
+ md: "text-sm", // Default padding and font size
+ };
+
+ // Define color styles for variants
+ const variants = {
+ light: {
+ primary:
+ "bg-brand-50 text-brand-500 dark:bg-brand-500/15 dark:text-brand-400",
+ success:
+ "bg-success-50 text-success-600 dark:bg-success-500/15 dark:text-success-500",
+ error:
+ "bg-error-50 text-error-600 dark:bg-error-500/15 dark:text-error-500",
+ warning:
+ "bg-warning-50 text-warning-600 dark:bg-warning-500/15 dark:text-orange-400",
+ info: "bg-blue-light-50 text-blue-light-500 dark:bg-blue-light-500/15 dark:text-blue-light-500",
+ light: "bg-gray-100 text-gray-700 dark:bg-white/5 dark:text-white/80",
+ dark: "bg-gray-500 text-white dark:bg-white/5 dark:text-white",
+ },
+ solid: {
+ primary: "bg-brand-500 text-white dark:text-white",
+ success: "bg-success-500 text-white dark:text-white",
+ error: "bg-error-500 text-white dark:text-white",
+ warning: "bg-warning-500 text-white dark:text-white",
+ info: "bg-blue-light-500 text-white dark:text-white",
+ light: "bg-gray-400 dark:bg-white/5 text-white dark:text-white/80",
+ dark: "bg-gray-700 text-white dark:text-white",
+ },
+ };
+
+ // Get styles based on size and color variant
+ const sizeClass = sizeStyles[size];
+ const colorStyles = variants[variant][color];
+
+ return (
+
+ {startIcon && {startIcon}}
+ {children}
+ {endIcon && {endIcon}}
+
+ );
+};
+
+export default Badge;
diff --git a/fit-bite-web/app/components/ui/button/Button.jsx b/fit-bite-web/app/components/ui/button/Button.jsx
new file mode 100644
index 00000000..e102e11c
--- /dev/null
+++ b/fit-bite-web/app/components/ui/button/Button.jsx
@@ -0,0 +1,55 @@
+import React, { ReactNode } from "react";
+
+// interface ButtonProps {
+// children: ReactNode; // Button text or content
+// size?: "sm" | "md"; // Button size
+// variant?: "primary" | "outline"; // Button variant
+// startIcon?: ReactNode; // Icon before the text
+// endIcon?: ReactNode; // Icon after the text
+// onClick?: () => void; // Click handler
+// disabled?: boolean; // Disabled state
+// className?: string; // Disabled state
+// }
+
+const Button= ({
+ children,
+ size = "md",
+ variant = "primary",
+ startIcon,
+ endIcon,
+ onClick,
+ className = "",
+ disabled = false,
+}) => {
+ // Size Classes
+ const sizeClasses = {
+ sm: "px-4 py-3 text-sm",
+ md: "px-5 py-3.5 text-sm",
+ };
+
+ // Variant Classes
+ const variantClasses = {
+ primary:
+ "bg-brand-500 text-white shadow-theme-xs hover:bg-brand-600 disabled:bg-brand-300",
+ outline:
+ "bg-white text-gray-700 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-400 dark:ring-gray-700 dark:hover:bg-white/[0.03] dark:hover:text-gray-300",
+ };
+
+ return (
+
+ );
+};
+
+export default Button;
diff --git a/fit-bite-web/app/components/ui/dropdown/Dropdown.jsx b/fit-bite-web/app/components/ui/dropdown/Dropdown.jsx
new file mode 100644
index 00000000..02f5590f
--- /dev/null
+++ b/fit-bite-web/app/components/ui/dropdown/Dropdown.jsx
@@ -0,0 +1,46 @@
+"use client";
+// import type React from "react";
+import { useEffect, useRef } from "react";
+
+// interface DropdownProps {
+// isOpen: boolean;
+// onClose: () => void;
+// children: React.ReactNode;
+// className?: string;
+// }
+
+export const Dropdown = ({
+ isOpen,
+ onClose,
+ children,
+ className = "",
+}) => {
+ const dropdownRef = useRef(null);
+
+ useEffect(() => {
+ const handleClickOutside = (event) => {
+ if (
+ dropdownRef.current &&
+ !dropdownRef.current.contains(event.target )
+ ) {
+ onClose();
+ }
+ };
+
+ document.addEventListener("mousedown", handleClickOutside);
+ return () => {
+ document.removeEventListener("mousedown", handleClickOutside);
+ };
+ }, [onClose]);
+
+ if (!isOpen) return null;
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/fit-bite-web/app/components/ui/dropdown/DropdownItem.jsx b/fit-bite-web/app/components/ui/dropdown/DropdownItem.jsx
new file mode 100644
index 00000000..cea0d9aa
--- /dev/null
+++ b/fit-bite-web/app/components/ui/dropdown/DropdownItem.jsx
@@ -0,0 +1,46 @@
+// import type React from "react";
+import Link from "next/link";
+
+// interface DropdownItemProps {
+// tag?: "a" | "button";
+// href?: string;
+// onClick?: () => void;
+// onItemClick?: () => void;
+// baseClassName?: string;
+// className?: string;
+// children: React.ReactNode;
+// }
+
+export const DropdownItem = ({
+ tag = "button",
+ href,
+ onClick,
+ onItemClick,
+ baseClassName = "block w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900",
+ className = "",
+ children,
+}) => {
+ const combinedClasses = `${baseClassName} ${className}`.trim();
+
+ const handleClick = (event) => {
+ if (tag === "button") {
+ event.preventDefault();
+ }
+ if (onClick) onClick();
+ if (onItemClick) onItemClick();
+ };
+
+ if (tag === "a" && href) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ return (
+
+ );
+};
diff --git a/fit-bite-web/app/components/ui/modal/index.jsx b/fit-bite-web/app/components/ui/modal/index.jsx
new file mode 100644
index 00000000..64155fb6
--- /dev/null
+++ b/fit-bite-web/app/components/ui/modal/index.jsx
@@ -0,0 +1,95 @@
+"use client";
+import React, { useRef, useEffect } from "react";
+
+// interface ModalProps {
+// isOpen: boolean;
+// onClose: () => void;
+// className?: string;
+// children: React.ReactNode;
+// showCloseButton?: boolean; // New prop to control close button visibility
+// isFullscreen?: boolean; // Default to false for backwards compatibility
+// }
+
+export const Modal = ({
+ isOpen,
+ onClose,
+ children,
+ className,
+ showCloseButton = true, // Default to true for backwards compatibility
+ isFullscreen = false,
+}) => {
+ const modalRef = useRef(null);
+
+ useEffect(() => {
+ const handleEscape = (event) => {
+ if (event.key === "Escape") {
+ onClose();
+ }
+ };
+
+ if (isOpen) {
+ document.addEventListener("keydown", handleEscape);
+ }
+
+ return () => {
+ document.removeEventListener("keydown", handleEscape);
+ };
+ }, [isOpen, onClose]);
+
+ useEffect(() => {
+ if (isOpen) {
+ document.body.style.overflow = "hidden";
+ } else {
+ document.body.style.overflow = "unset";
+ }
+
+ return () => {
+ document.body.style.overflow = "unset";
+ };
+ }, [isOpen]);
+
+ if (!isOpen) return null;
+
+ const contentClasses = isFullscreen
+ ? "w-full h-full"
+ : "relative w-full rounded-3xl bg-white dark:bg-gray-900";
+
+ return (
+
+ {!isFullscreen && (
+
+ )}
+
e.stopPropagation()}
+ >
+ {showCloseButton && (
+
+ )}
+
{children}
+
+
+ );
+};
diff --git a/fit-bite-web/app/components/ui/popover.jsx b/fit-bite-web/app/components/ui/popover.jsx
new file mode 100644
index 00000000..62e68143
--- /dev/null
+++ b/fit-bite-web/app/components/ui/popover.jsx
@@ -0,0 +1,27 @@
+"use client"
+
+import * as React from "react"
+import * as PopoverPrimitive from "@radix-ui/react-popover"
+
+import {cn} from "../../../lib/utils"
+
+const Popover = PopoverPrimitive.Root
+
+const PopoverTrigger = PopoverPrimitive.Trigger
+
+const PopoverContent = React.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+PopoverContent.displayName = PopoverPrimitive.Content.displayName
+
+export { Popover, PopoverTrigger, PopoverContent }
diff --git a/fit-bite-web/app/components/ui/table/index.jsx b/fit-bite-web/app/components/ui/table/index.jsx
new file mode 100644
index 00000000..3763195a
--- /dev/null
+++ b/fit-bite-web/app/components/ui/table/index.jsx
@@ -0,0 +1,64 @@
+import React, { ReactNode } from "react";
+
+// // Props for Table
+// interface TableProps {
+// children: ReactNode; // Table content (thead, tbody, etc.)
+// className?: string; // Optional className for styling
+// }
+
+// // Props for TableHeader
+// interface TableHeaderProps {
+// children: ReactNode; // Header row(s)
+// className?: string; // Optional className for styling
+// }
+
+// // Props for TableBody
+// interface TableBodyProps {
+// children: ReactNode; // Body row(s)
+// className?: string; // Optional className for styling
+// }
+
+// // Props for TableRow
+// interface TableRowProps {
+// children: ReactNode; // Cells (th or td)
+// className?: string; // Optional className for styling
+// }
+
+// // Props for TableCell
+// interface TableCellProps {
+// children: ReactNode; // Cell content
+// isHeader?: boolean; // If true, renders as , otherwise |
+// className?: string; // Optional className for styling
+// }
+
+// Table Component
+const Table = ({ children, className }) => {
+ return ;
+};
+
+// TableHeader Component
+const TableHeader = ({ children, className }) => {
+ return {children};
+};
+
+// TableBody Component
+const TableBody= ({ children, className }) => {
+ return | {children};
+};
+
+// TableRow Component
+const TableRow= ({ children, className }) => {
+ return {children}
;
+};
+
+// TableCell Component
+const TableCell = ({
+ children,
+ isHeader = false,
+ className,
+}) => {
+ const CellTag = isHeader ? "th" : "td";
+ return {children};
+};
+
+export { Table, TableHeader, TableBody, TableRow, TableCell };
diff --git a/fit-bite-web/app/components/user-profile/UserAddressCard.jsx b/fit-bite-web/app/components/user-profile/UserAddressCard.jsx
new file mode 100644
index 00000000..e7430e35
--- /dev/null
+++ b/fit-bite-web/app/components/user-profile/UserAddressCard.jsx
@@ -0,0 +1,134 @@
+"use client";
+import React from "react";
+import { useModal } from "../../hooks/useModal";
+import { Modal } from "../ui/modal";
+import Button from "../ui/button/Button";
+import Input from "../form/input/InputField";
+import Label from "../form/Label";
+
+export default function UserAddressCard() {
+ const { isOpen, openModal, closeModal } = useModal();
+ const handleSave = () => {
+ // Handle save logic here
+ console.log("Saving changes...");
+ closeModal();
+ };
+ return (
+ <>
+
+
+
+
+ Address
+
+
+
+
+
+ Country
+
+
+ United States
+
+
+
+
+
+ City/State
+
+
+ Phoenix, Arizona, United States.
+
+
+
+
+
+ Postal Code
+
+
+ ERT 2489
+
+
+
+
+
+ TAX ID
+
+
+ AS4568384
+
+
+
+
+
+
+
+
+
+
+
+
+ Edit Address
+
+
+ Update your details to keep your profile up-to-date.
+
+
+
+
+
+ >
+ );
+}
diff --git a/fit-bite-web/app/components/user-profile/UserInfoCard.jsx b/fit-bite-web/app/components/user-profile/UserInfoCard.jsx
new file mode 100644
index 00000000..aa00eeed
--- /dev/null
+++ b/fit-bite-web/app/components/user-profile/UserInfoCard.jsx
@@ -0,0 +1,189 @@
+"use client";
+import React from "react";
+import { useModal } from "../../hooks/useModal";
+import { Modal } from "../ui/modal";
+import Button from "../ui/button/Button";
+import Input from "../form/input/InputField";
+import Label from "../form/Label";
+
+export default function UserInfoCard() {
+ const { isOpen, openModal, closeModal } = useModal();
+ const handleSave = () => {
+ // Handle save logic here
+ console.log("Saving changes...");
+ closeModal();
+ };
+ return (
+
+
+
+
+ Personal Information
+
+
+
+
+
+ First Name
+
+
+ Usern
+
+
+
+
+
+ Last Name
+
+
+ Shukla
+
+
+
+
+
+ Email address
+
+
+ randomuser@pimjo.com
+
+
+
+
+
+ Phone
+
+
+ +09 363 398 46
+
+
+
+
+
+ Bio
+
+
+ Team Manager
+
+
+
+
+
+
+
+
+
+
+
+
+ Edit Personal Information
+
+
+ Update your details to keep your profile up-to-date.
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/components/user-profile/UserMetaCard.jsx b/fit-bite-web/app/components/user-profile/UserMetaCard.jsx
new file mode 100644
index 00000000..95379138
--- /dev/null
+++ b/fit-bite-web/app/components/user-profile/UserMetaCard.jsx
@@ -0,0 +1,227 @@
+"use client";
+import React from "react";
+import { useModal } from "../../hooks/useModal";
+import { Modal } from "../ui/modal";
+import Button from "../ui/button/Button";
+import Input from "../form/input/InputField";
+import Label from "../form/Label";
+import Image from "next/image";
+
+export default function UserMetaCard() {
+ const { isOpen, openModal, closeModal } = useModal();
+ const handleSave = () => {
+ // Handle save logic here
+ console.log("Saving changes...");
+ closeModal();
+ };
+ return (
+ <>
+
+
+
+
+
+
+
+
+ Abhijeet Shukla
+
+
+
+ Team Manager
+
+
+
+ Arizona, United St
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Edit Personal Information
+
+
+ Update your details to keep your profile up-to-date.
+
+
+
+
+
+ >
+ );
+}
diff --git a/fit-bite-web/app/dashboard/layout.jsx b/fit-bite-web/app/dashboard/layout.jsx
new file mode 100644
index 00000000..8a066234
--- /dev/null
+++ b/fit-bite-web/app/dashboard/layout.jsx
@@ -0,0 +1,37 @@
+"use client";
+
+import { useSidebar } from "../Context/SidebarContext";
+import AppHeader from "../components/AppHeader";
+import AppSidebar from "../components/AppSidebar";
+import Backdrop from "../components/Backdrop";
+import React from "react";
+
+export default function AdminLayout({
+ children,
+}) {
+ const { isExpanded, isHovered, isMobileOpen } = useSidebar();
+ console.log({AppSidebar});
+ // Dynamic class for main content margin based on sidebar state
+ const mainContentMargin = isMobileOpen
+ ? "ml-0"
+ : isExpanded || isHovered
+ ? "lg:ml-[290px]"
+ : "lg:ml-[90px]";
+
+ return (
+
+ {/* Sidebar and Backdrop */}
+
+
+ {/* Main Content Area */}
+
+ {/* Header */}
+
+ {/* Page Content */}
+
{children}
+
+
+ );
+}
diff --git a/fit-bite-web/app/dashboard/page.jsx b/fit-bite-web/app/dashboard/page.jsx
new file mode 100644
index 00000000..8222c7fb
--- /dev/null
+++ b/fit-bite-web/app/dashboard/page.jsx
@@ -0,0 +1,43 @@
+"use client"
+
+import React from "react";
+import EcommerceMetrics from "../components/EcommerceMetrics";
+import MonthlyTarget from "../components/Ecommerce/MonthlyTarget";
+import MonthlySalesChart from "../components/Ecommerce/MonthlySalesChart";
+import StatisticsChart from "../components/Ecommerce/StatisticsChart";
+import RecentOrders from "../components/Ecommerce/RecentOrders";
+import DemographicCard from "../components/Ecommerce/DemographicCard";
+
+// export const metadata = {
+// title:
+// "Next.js E-commerce Dashboard | TailAdmin - Next.js Dashboard Template",
+// description: "This is Next.js Home for TailAdmin Dashboard Template",
+// };
+
+export default function Ecommerce() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/dishdata.js b/fit-bite-web/app/dishdata.js
new file mode 100644
index 00000000..689f7671
--- /dev/null
+++ b/fit-bite-web/app/dishdata.js
@@ -0,0 +1,533 @@
+export const menuData =
+[
+ {
+ "category": "Weight Gain",
+ "dishes": [
+ {
+ "dish_name": "Paneer Bhurji with Multigrain Roti",
+ "calories": 350,
+ "carbohydrates": 40,
+ "fat": 15,
+ "protein": 18,
+ "description": "A flavorful scrambled paneer dish cooked with onions, tomatoes, and spices, served with multigrain roti.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139443/hack2/products/aruxou9imgdfiwfbrrwo.jpg",
+ "id": 1,
+ "ingredients": [
+ "Paneer (Indian cottage cheese)",
+ "Onions",
+ "Tomatoes",
+ "Green chilies",
+ "Ginger",
+ "Garlic",
+ "Cumin seeds",
+ "Turmeric powder",
+ "Red chili powder",
+ "Garam masala",
+ "Fresh coriander leaves",
+ "Multigrain flour",
+ "Water",
+ "Salt",
+ "Oil or ghee"
+ ]
+ },
+ {
+ "dish_name": "Ghee Paratha with Dal Makhani",
+ "calories": 450,
+ "carbohydrates": 50,
+ "fat": 20,
+ "protein": 16,
+ "description": "Rich and creamy black lentil curry served with ghee-laden paratha.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139442/hack2/products/r3euk03b8hbojzsulffq.jpg",
+ "id": 2,
+ "ingredients": [
+ "Whole wheat flour",
+ "Ghee",
+ "Black lentils (urad dal)",
+ "Red kidney beans (rajma)",
+ "Onions",
+ "Tomatoes",
+ "Ginger",
+ "Garlic",
+ "Green chilies",
+ "Cumin seeds",
+ "Red chili powder",
+ "Garam masala",
+ "Cream",
+ "Salt",
+ "Water"
+ ]
+ },
+ {
+ "dish_name": "Peanut Butter Banana Smoothie",
+ "calories": 400,
+ "carbohydrates": 55,
+ "fat": 12,
+ "protein": 15,
+ "description": "A creamy and nutritious smoothie blending ripe bananas with peanut butter.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 3,
+ "ingredients": [
+ "Ripe bananas",
+ "Peanut butter",
+ "Milk (or dairy-free alternative)",
+ "Honey or maple syrup",
+ "Ice cubes"
+ ]
+ }
+ ]
+ },
+ {
+ "category": "Weight Loss",
+ "dishes": [
+ {
+ "dish_name": "Moong Dal Chilla with Mint Chutney",
+ "calories": 180,
+ "carbohydrates": 25,
+ "fat": 5,
+ "protein": 10,
+ "description": "Savory pancakes made from ground moong dal batter, served with refreshing mint chutney.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139442/hack2/products/z04nbfo9xeje5cvdk5yb.jpg",
+ "id": 4,
+ "ingredients": [
+ "Split green gram (moong dal)",
+ "Green chilies",
+ "Ginger",
+ "Cumin seeds",
+ "Fresh coriander leaves",
+ "Salt",
+ "Oil",
+ "Fresh mint leaves",
+ "Lemon juice"
+ ]
+ },
+ {
+ "dish_name": "Grilled Chicken with Stir-Fried Veggies",
+ "calories": 250,
+ "carbohydrates": 10,
+ "fat": 8,
+ "protein": 35,
+ "description": "Juicy grilled chicken breast paired with a medley of stir-fried vegetables.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139443/hack2/products/ths9ubnw56jzthftplei.jpg",
+ "id": 5,
+ "ingredients": [
+ "Chicken breast",
+ "Mixed vegetables (bell peppers, broccoli, carrots, etc.)",
+ "Olive oil",
+ "Garlic",
+ "Soy sauce",
+ "Black pepper",
+ "Salt",
+ "Lemon juice"
+ ]
+ },
+ {
+ "dish_name": "Sprouts Salad with Lemon Dressing",
+ "calories": 120,
+ "carbohydrates": 20,
+ "fat": 2,
+ "protein": 10,
+ "description": "A refreshing salad featuring mixed sprouts tossed in a tangy lemon dressing.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139443/hack2/products/itminnycvam5zbemwzje.jpg",
+ "id": 6,
+ "ingredients": [
+ "Mixed sprouts (mung beans, chickpeas, etc.)",
+ "Tomatoes",
+ "Cucumbers",
+ "Onions",
+ "Fresh coriander leaves",
+ "Lemon juice",
+ "Black pepper",
+ "Salt"
+ ]
+ }
+ ]
+ },
+
+ {
+ "category": "Muscle Building",
+ "dishes": [
+ {
+ "dish_name": "Grilled Salmon with Quinoa",
+ "calories": 320,
+ "carbohydrates": 35,
+ "fat": 10,
+ "protein": 30,
+ "description": "Perfectly grilled salmon fillet served alongside fluffy quinoa.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 7,
+ "ingredients": [
+ "Salmon fillet",
+ "Quinoa",
+ "Olive oil",
+ "Garlic",
+ "Lemon juice",
+ "Fresh herbs (dill or parsley)",
+ "Salt",
+ "Black pepper"
+ ]
+ },
+ {
+ "dish_name": "Egg and Avocado Toast",
+ "calories": 280,
+ "carbohydrates": 30,
+ "fat": 12,
+ "protein": 22,
+ "description": "Toasted whole grain bread topped with creamy avocado and a poached egg.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 8,
+ "ingredients": [
+ "Whole grain bread",
+ "Ripe avocado",
+ "Eggs",
+ "Lemon juice",
+ "Red chili flakes",
+ "Salt",
+ "Black pepper"
+ ]
+ },
+ {
+ "dish_name": "Tandoori Chicken with Dal Tadka",
+ "calories": 350,
+ "carbohydrates": 40,
+ "fat": 12,
+ "protein": 38,
+ "description": "Spiced tandoori chicken served with flavorful lentil curry.",
+ "price": 57,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 9,
+ "ingredients": [
+ "Chicken legs or thighs",
+ "Yogurt",
+ "Tandoori masala",
+ "Lemon juice",
+ "Red lentils (masoor dal)",
+ "Onions",
+ "Tomato"
+ ]
+ }
+ ]
+ },
+ {
+ "dish_name": "Chickpea Spinach Salad",
+ "calories": 220,
+ "carbohydrates": 30,
+ "fat": 6,
+ "protein": 12,
+ "description": "A fresh and healthy salad combining chickpeas and spinach with a tangy dressing.",
+ "price": 180,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 10,
+ "ingredients": [
+ "Chickpeas",
+ "Spinach",
+ "Cucumber",
+ "Tomatoes",
+ "Red Onion",
+ "Lemon Juice",
+ "Olive Oil",
+ "Salt",
+ "Black Pepper"
+ ]
+ },
+ {
+ "dish_name": "Tofu Bhurji with Roti",
+ "calories": 250,
+ "carbohydrates": 35,
+ "fat": 8,
+ "protein": 15,
+ "description": "A protein-rich scramble made with spiced tofu, served with warm roti.",
+ "price": 210,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 11,
+ "ingredients": [
+ "Tofu",
+ "Onions",
+ "Tomatoes",
+ "Green Chilies",
+ "Turmeric Powder",
+ "Cumin Seeds",
+ "Coriander Powder",
+ "Salt",
+ "Oil",
+ "Whole Wheat Flour"
+ ]
+ },
+ {
+ "dish_name": "Moong Dal Khichdi",
+ "calories": 240,
+ "carbohydrates": 38,
+ "fat": 5,
+ "protein": 10,
+ "description": "A comforting porridge made with moong dal and rice, seasoned with spices.",
+ "price": 150,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 12,
+ "ingredients": [
+ "Moong Dal",
+ "Rice",
+ "Turmeric Powder",
+ "Cumin Seeds",
+ "Asafoetida",
+ "Ginger",
+ "Green Chilies",
+ "Salt",
+ "Ghee or Oil"
+ ]
+ },
+ {
+ "category": "Diabetic-Friendly",
+ "dishes": [
+ {
+ "dish_name": "Ragi Idli with Coconut Chutney",
+ "calories": 180,
+ "carbohydrates": 30,
+ "fat": 5,
+ "protein": 8,
+ "description": "Steamed finger millet cakes served with a traditional coconut chutney.",
+ "price": 190,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 13,
+ "ingredients": [
+ "Ragi Flour",
+ "Urad Dal",
+ "Fenugreek Seeds",
+ "Salt",
+ "Grated Coconut",
+ "Green Chilies",
+ "Ginger",
+ "Curry Leaves",
+ "Mustard Seeds",
+ "Oil"
+ ]
+ },
+ {
+ "dish_name": "Quinoa Upma with Vegetables",
+ "calories": 200,
+ "carbohydrates": 35,
+ "fat": 4,
+ "protein": 10,
+ "description": "A nutritious twist on traditional upma, made with quinoa and mixed vegetables.",
+ "price": 220,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 14,
+ "ingredients": [
+ "Quinoa",
+ "Mixed Vegetables (Carrots, Peas, Beans)",
+ "Onion",
+ "Green Chilies",
+ "Ginger",
+ "Mustard Seeds",
+ "Cumin Seeds",
+ "Turmeric Powder",
+ "Salt",
+ "Oil"
+ ]
+ },
+ {
+ "dish_name": "Palak Dal with Bajra Roti",
+ "calories": 230,
+ "carbohydrates": 40,
+ "fat": 6,
+ "protein": 12,
+ "description": "A hearty lentil curry cooked with spinach, paired with pearl millet flatbread.",
+ "price": 250,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 15,
+ "ingredients": [
+ "Toor Dal",
+ "Spinach",
+ "Onion",
+ "Tomato",
+ "Garlic",
+ "Ginger",
+ "Turmeric Powder",
+ "Cumin Seeds",
+ "Salt",
+ "Bajra Flour"
+ ]
+ }
+
+ ]
+ },
+ {
+ "category": "Heart-Healthy",
+ "dishes": [
+ {
+ "dish_name": "Oats Porridge with Nuts",
+ "calories": 200,
+ "carbohydrates": 35,
+ "fat": 6,
+ "protein": 8,
+ "description": "A warm and creamy oats porridge topped with a mix of nuts.",
+ "price": 160,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 16,
+ "ingredients": [
+ "Rolled Oats",
+ "Milk or Water",
+ "Almonds",
+ "Cashews",
+ "Raisins",
+ "Honey or Sugar",
+ "Salt"
+ ]
+ },
+ {
+ "dish_name": "Steamed Fish with Lemon and Herbs",
+ "calories": 250,
+ "carbohydrates": 5,
+ "fat": 10,
+ "protein": 30,
+ "description": "Delicately steamed fish fillets infused with lemon and fresh herbs.",
+ "price": 280,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 17,
+ "ingredients": [
+ "Fish Fillets",
+ "Lemon",
+ "Fresh Herbs (Parsley, Dill)",
+ "Garlic",
+ "Olive Oil",
+ "Salt",
+ "Black Pepper"
+ ]
+ },
+ {
+ "dish_name": "Avocado and Sprout Sandwich",
+ "calories": 220,
+ "carbohydrates": 30,
+ "fat": 10,
+ "protein": 12,
+ "description": "A wholesome sandwich filled with creamy avocado and crunchy sprouts.",
+ "price": 200,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 18,
+ "ingredients": [
+ "Whole Grain Bread",
+ "Avocado",
+ "Mixed Sprouts",
+ "Tomato",
+ "Lettuce",
+ "Lemon Juice",
+ "Salt",
+ "Black Pepper"
+ ]
+ },
+
+ ]
+ },
+ {
+ "category": "Balanced Diet",
+ "dishes": [
+ {
+ "dish_name": "Dal Tadka with Jeera Rice",
+ "calories": 300,
+ "carbohydrates": 50,
+ "fat": 8,
+ "protein": 12,
+ "description": "A classic combination of spiced lentils (dal tadka) served with cumin-flavored basmati rice (jeera rice).",
+ "price": 150,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 19,
+ "ingredients": [
+ "Toor dal (split pigeon peas)",
+ "Moong dal (split green gram)",
+ "Ghee (clarified butter)",
+ "Ginger",
+ "Garlic",
+ "Onion",
+ "Tomato",
+ "Green chili",
+ "Turmeric powder",
+ "Red chili powder",
+ "Coriander powder",
+ "Garam masala",
+ "Cumin seeds",
+ "Mustard seeds",
+ "Asafoetida (hing)",
+ "Dried red chilies",
+ "Curry leaves",
+ "Fresh coriander leaves",
+ "Basmati rice",
+ "Bay leaf",
+ "Salt"
+ ]
+ },
+ {
+ "dish_name": "Grilled Chicken Wrap with Whole Wheat Roti",
+ "calories": 320,
+ "carbohydrates": 40,
+ "fat": 10,
+ "protein": 28,
+ "description": "Succulent grilled chicken pieces wrapped in a soft whole wheat roti, accompanied by fresh vegetables and tangy sauces.",
+ "price": 200,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 20,
+ "ingredients": [
+ "Chicken breast",
+ "Whole wheat flour",
+ "Yogurt",
+ "Lemon juice",
+ "Ginger-garlic paste",
+ "Garam masala",
+ "Red chili powder",
+ "Turmeric powder",
+ "Cumin powder",
+ "Coriander powder",
+ "Salt",
+ "Olive oil",
+ "Lettuce",
+ "Tomato",
+ "Onion",
+ "Cucumber",
+ "Mint chutney",
+ "Cilantro"
+ ]
+ },
+ {
+ "dish_name": "Egg Curry with Brown Rice",
+ "calories": 350,
+ "carbohydrates": 45,
+ "fat": 12,
+ "protein": 25,
+ "description": "Hard-boiled eggs simmered in a spiced tomato-onion gravy, served alongside nutritious brown rice.",
+ "price": 180,
+ "image":"https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 21,
+ "ingredients": [
+ "Eggs",
+ "Brown rice",
+ "Onion",
+ "Tomato",
+ "Ginger-garlic paste",
+ "Green chili",
+ "Turmeric powder",
+ "Red chili powder",
+ "Coriander powder",
+ "Garam masala",
+ "Cumin seeds",
+ "Mustard seeds",
+ "Bay leaf",
+ "Cinnamon stick",
+ "Cloves",
+ "Green cardamom",
+ "Black cardamom",
+ "Salt",
+ "Oil",
+ "Fresh coriander leaves"
+ ]
+ }
+ ]
+ }
+
+ ]
+
+
\ No newline at end of file
diff --git a/fit-bite-web/app/dishes/[id]/page.jsx b/fit-bite-web/app/dishes/[id]/page.jsx
new file mode 100644
index 00000000..b4b5a331
--- /dev/null
+++ b/fit-bite-web/app/dishes/[id]/page.jsx
@@ -0,0 +1,242 @@
+"use client";
+import React, { useEffect, useState } from "react";
+import { UserContext } from "@/app/Context/UserProvider";
+import { menuData } from "../../dishdata";
+import Link from "next/link";
+import { addtoCart } from "@/app/functions/cart";
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+function page({ params }) {
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState({});
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ // async function render() {
+
+ // try {
+ // const response = await fetch(`/api/item?id=${slug}&dish=desserts`, {
+ // method: "GET",
+ // });
+ // if (response) {
+ // setitemData(res.result);
+ // // console.log(res.result, "response orders");
+ // }
+ // }catch (err) {
+ // console.log(err)
+ // }
+ // }
+
+ function filterDishById(menuData, targetId) {
+ // console.log({targetId})
+ // console.log("Menu Data:", menuData);
+ for (const category of menuData) {
+ console.log("triggering");
+ console.log(targetId);
+ console.log("Menu Data:", menuData);
+ let dish = category?.dishes?.find((dish) => dish.id == targetId);
+ if (dish) {
+ setDish(dish);
+ console.log({ dish });
+ } // Return the dish if found
+ }
+ // Return null if no dish is found
+ }
+ useEffect(() => {
+ // render()
+ filterDishById(menuData, slug);
+ }, [menuData, slug]);
+
+ return (
+
+
+
+
+

+
+
+ The Catcher in the Rye
+
+
+ {dish && dish.dish_name}
+
+
+
{dish && dish.description}
+
+
+
+ Nutrient Requirements
+
+ {dish.calories}kcal Calories{" "}
+
+
+ {dish.carbohydrates}g Carbs
+
+
+ {dish.protein}g Proteins
+
+
+ {dish.fat}g Fats
+
+
+
+
+
Qty
+
+
+
+
+
+
+
+
+
+
+ $58.00
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default page;
diff --git a/fit-bite-web/app/dishes/cakes/large/[id]/page.jsx b/fit-bite-web/app/dishes/cakes/large/[id]/page.jsx
new file mode 100644
index 00000000..32f6acf5
--- /dev/null
+++ b/fit-bite-web/app/dishes/cakes/large/[id]/page.jsx
@@ -0,0 +1,121 @@
+"use client"
+import React, { useEffect, useState } from 'react'
+import { UserContext } from '@/app/Context/UserProvider';
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+ function page({params}) {
+
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState(params.dish);
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ async function render() {
+
+ try {
+ const response = await fetch(`/api/item?id=${slug}&dish=largeCakes`, {
+ method: "GET",
+ });
+ let res = await response.json();
+ console.log({res});
+ if (response.status === 200) {
+ setitemData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
+
+
+

+
+
The Catcher in the Rye
+
{itemData.name}
+
+
{itemData.description}
+
+
+ Color
+
+
+
+
+
+
Qty
+
+
+
+
+
+
+
+
+
+
$58.00
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default page
\ No newline at end of file
diff --git a/fit-bite-web/app/dishes/cakes/large/page.jsx b/fit-bite-web/app/dishes/cakes/large/page.jsx
new file mode 100644
index 00000000..9ab56cf0
--- /dev/null
+++ b/fit-bite-web/app/dishes/cakes/large/page.jsx
@@ -0,0 +1,128 @@
+"use client";
+import React from "react";
+import Head from "next/head";
+import Link from "next/link";
+import { useState, useEffect } from "react";
+import { addtoCart } from "@/app/functions/cart";
+import Image from "next/image";
+import { UserContext } from "../../../Context/UserProvider";
+import { useRouter } from "next/navigation";
+// import { getQty } from '@/app/functions/cart';
+function MenuPage() {
+ const { setCountAgain } = React.useContext(UserContext);
+ const [largeCakesData, setlargeCakesData] = useState([]);
+ const router = useRouter();
+ async function render() {
+ try {
+ const response = await fetch("/api/largeCakes", {
+ method: "GET",
+ });
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ setlargeCakesData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ } catch (err) {
+ console.log(err);
+ }
+ }
+ useEffect(() => {
+ render();
+ }, []);
+ // Quanity Code(Not in Use)
+ // const getQty = (itemCode) => {
+ // let newCart = JSON.parse(localStorage.getItem('cart')) || {};
+ // if (itemCode in newCart) {
+ // console.log(newCart[itemCode].qty)
+ // return newCart[itemCode].qty;
+ // } else {
+ // return 0;
+ // }
+ // }
+ // const isRemoveDisabled = (qty) => {
+
+ // return qty <= 0;
+ // };
+
+ return (
+
+
+
Large Cakes
+
+
+ {/* //Large cakes */}
+
+ Restaurant Menu | Large Sized Cakes{" "}
+
+
+ Total menu items {largeCakesData.length}
+
+
+ {largeCakesData.map((item) => (
+
+
+
router.push(`/dishes/cakes/large/${item._id}`)}>
+ {item.name}
+
+
{item.description}
+
${item.price.toFixed(2)}
+
+ {/*
*/}
+ {/* */}
+ {/*
+ {cartitem[item.id] ? cartitem[item.id].qty : 0}
+ */}
+ {/* Add to Cart */}
+
+
+
+
+
+
+ //
+ ))}
+
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/cakes/page.jsx b/fit-bite-web/app/dishes/cakes/page.jsx
new file mode 100644
index 00000000..06c628f4
--- /dev/null
+++ b/fit-bite-web/app/dishes/cakes/page.jsx
@@ -0,0 +1,65 @@
+import Head from "next/head";
+import Link from "next/link";
+import Image from "next/image";
+
+function MenuPage() {
+
+ return (
+
+
+
Restaurant Menu
+
+
+ Restaurant Menu for Cakes
+
+
Total menu items 20
+
+
+
+
+
+ Large Cakes
+
+
+
Cakes for bigger parties
+
$17.99 onwards
+
+
+
+ {/* //Small cakes */}
+
+
+
+
+
+ Small sized Cakes
+
+
+
Cakes for small gatherings
+
$3.99 onwards
+
+
+
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/cakes/small/[id]/page.jsx b/fit-bite-web/app/dishes/cakes/small/[id]/page.jsx
new file mode 100644
index 00000000..1270330b
--- /dev/null
+++ b/fit-bite-web/app/dishes/cakes/small/[id]/page.jsx
@@ -0,0 +1,121 @@
+"use client"
+import React, { useEffect, useState } from 'react'
+import { UserContext } from '@/app/Context/UserProvider';
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+ function page({params}) {
+
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState(params.dish);
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ async function render() {
+
+ try {
+ const response = await fetch(`/api/item?id=${slug}&dish=smallCakes`, {
+ method: "GET",
+ });
+ let res = await response.json();
+ console.log({res});
+ if (response.status === 200) {
+ setitemData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
+
+
+

+
+
The Catcher in the Rye
+
{itemData.name}
+
+
{itemData.description}
+
+
+ Color
+
+
+
+
+
+
Qty
+
+
+
+
+
+
+
+
+
+
$58.00
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default page
\ No newline at end of file
diff --git a/fit-bite-web/app/dishes/cakes/small/page.jsx b/fit-bite-web/app/dishes/cakes/small/page.jsx
new file mode 100644
index 00000000..2e491483
--- /dev/null
+++ b/fit-bite-web/app/dishes/cakes/small/page.jsx
@@ -0,0 +1,94 @@
+"use client";
+import React from "react";
+import Head from "next/head";
+import Link from "next/link";
+import { useState, useEffect } from "react";
+import { addtoCart } from "@/app/functions/cart";
+import Image from "next/image";
+import { UserContext } from "../../../Context/UserProvider";
+import { useRouter } from "next/navigation";
+function MenuPage() {
+ const { setCountAgain } = React.useContext(UserContext);
+ const [smallCakesData, setsmallCakesData] = useState([]);
+ const router = useRouter();
+ async function render() {
+ try {
+ const response = await fetch(
+ "/api/smallCakes",
+ { cache: "force-cache" },
+ {
+ method: "GET",
+ }
+ );
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ setsmallCakesData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ } catch (err) {
+ console.log(err);
+ }
+ }
+ useEffect(() => {
+ render();
+ }, []);
+ return (
+
+
+
Small Cakes
+
+
+ Restaurant Menu | Small Sized Cakes{" "}
+
+
+ Total menu items {smallCakesData.length}
+
+
+ {smallCakesData.map((item) => (
+
+
+
router.push(`/dishes/cakes/small/${item._id}`)}>
+ {item.name}
+
+
{item.description}
+
${item.price.toFixed(2)}
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/desserts/[id]/page.jsx b/fit-bite-web/app/dishes/desserts/[id]/page.jsx
new file mode 100644
index 00000000..1ac67b82
--- /dev/null
+++ b/fit-bite-web/app/dishes/desserts/[id]/page.jsx
@@ -0,0 +1,121 @@
+"use client"
+import React, { useEffect, useState } from 'react'
+import { UserContext } from '@/app/Context/UserProvider';
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+ function page({params}) {
+
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState(params.dish);
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ async function render() {
+
+ try {
+ const response = await fetch(`/api/item?id=${slug}&dish=desserts`, {
+ method: "GET",
+ });
+ let res = await response.json();
+ console.log({res});
+ if (response.status === 200) {
+ setitemData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
+
+
+

+
+
The Catcher in the Rye
+
{itemData.name}
+
+
{itemData.description}
+
+
+ Color
+
+
+
+
+
+
Qty
+
+
+
+
+
+
+
+
+
+
$58.00
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default page
\ No newline at end of file
diff --git a/fit-bite-web/app/dishes/desserts/page.jsx b/fit-bite-web/app/dishes/desserts/page.jsx
new file mode 100644
index 00000000..0b0c3bb4
--- /dev/null
+++ b/fit-bite-web/app/dishes/desserts/page.jsx
@@ -0,0 +1,94 @@
+"use client"
+import React from "react";
+import Head from "next/head";
+import Link from "next/link";
+import { useState, useEffect } from "react";
+import { addtoCart} from "@/app/functions/cart";
+// import { addtoCart } from "@/app/functions/addtoCart";
+import Image from "next/image";
+import { UserContext } from "../../Context/UserProvider";
+import { useRouter } from "next/navigation";
+function MenuPage() {
+ const { setCountAgain } = React.useContext(UserContext);
+ const [dessertData, setDessertData] = useState([]);
+ const router = useRouter();
+ async function render() {
+ try {
+ const response = await fetch("/api/desserts", {
+ method: "GET",
+ });
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ setDessertData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
Desserts
+
+
+ Restaurant Menu | Desserts
+
+
+ Total menu items {dessertData.length}
+
+
+ {dessertData.map((item) => (
+
+
+
router.push(`/dishes/desserts/${item._id}`)}>
+ {item.name}
+
+
{item.description}
+
${item.price.toFixed(2)}
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/meals/[id]/page.jsx b/fit-bite-web/app/dishes/meals/[id]/page.jsx
new file mode 100644
index 00000000..bece03c7
--- /dev/null
+++ b/fit-bite-web/app/dishes/meals/[id]/page.jsx
@@ -0,0 +1,226 @@
+"use client"
+import React, { useEffect, useState } from 'react'
+import { UserContext } from '@/app/Context/UserProvider';
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+ function page({params}) {
+
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState(params.dish);
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ async function render() {
+
+ try {
+ const response = await fetch(`/api/item?id=${slug}&dish=otherProducts`, {
+ method: "GET",
+ });
+ let res = await response.json();
+ console.log({res});
+ if (response.status === 200) {
+ setitemData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
+
+

+
+
+ The Catcher in the Rye
+
+
+ {itemData && itemData.dish_name}
+
+
+
{itemData && itemData.description}
+
+
+
+ Nutrient Requirements
+
+ {itemData.calories}kcal Calories{" "}
+
+
+ {itemData.carbohydrates}g Carbs
+
+
+ {itemData.protein}g Proteins
+
+
+ {itemData.fat}g Fats
+
+
+
+
+
Qty
+
+
+
+
+
+
+
+
+
+
+ $58.00
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default page
\ No newline at end of file
diff --git a/fit-bite-web/app/dishes/meals/page.jsx b/fit-bite-web/app/dishes/meals/page.jsx
new file mode 100644
index 00000000..b800a634
--- /dev/null
+++ b/fit-bite-web/app/dishes/meals/page.jsx
@@ -0,0 +1,92 @@
+"use client"
+import React from "react";
+import Head from "next/head";
+import Link from "next/link";
+import { useState, useEffect } from "react";
+import { addtoCart} from "@/app/functions/cart";
+// import { addtoCart } from "@/app/functions/addtoCart";
+import Image from "next/image";
+import { UserContext } from "../../Context/UserProvider";
+import { useRouter } from "next/navigation";
+function MenuPage() {
+ const { setCountAgain } = React.useContext(UserContext);
+ const [dessertData, setDessertData] = useState([]);
+ const router = useRouter();
+ async function render() {
+ try {
+ const response = await fetch("/api/otherProducts", {
+ method: "GET",
+ });
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ setDessertData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
Desserts
+
+
+ Restaurant Menu | Healthy Items
+
+
+ Total menu items {dessertData.length}
+
+
+ {/*
*/}
+ { dessertData
+ .flatMap((item) => (item.dishes ? item.dishes : [item])) // Extract nested dishes if they exist
+ .map((dish, index) =>
+ dish.dish_name ? (
+
+
+ {
+ console.log(dish)
+ router.push(`/dishes/${dish.id}`)}}
+ className=" rounded-xl p-4 shadow-2xl shadow-violet-500/30 m-8 opacity-100 "
+ >
+ {console.log(JSON.stringify(dish))}
+
+
+
+ {dish.dish_name}
+
+
+
{dish.calories} kcal
+
{dish.carbs}g carbs
+
{dish.fat}g fat
+
{dish.protein}g protein
+
+
+
+ ) : null
+ )
+} : (
+ No matching dishes found.
+ )
+
+ {/*
*/}
+
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/others/[id]/page.jsx b/fit-bite-web/app/dishes/others/[id]/page.jsx
new file mode 100644
index 00000000..1ac67b82
--- /dev/null
+++ b/fit-bite-web/app/dishes/others/[id]/page.jsx
@@ -0,0 +1,121 @@
+"use client"
+import React, { useEffect, useState } from 'react'
+import { UserContext } from '@/app/Context/UserProvider';
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+ function page({params}) {
+
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState(params.dish);
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ async function render() {
+
+ try {
+ const response = await fetch(`/api/item?id=${slug}&dish=desserts`, {
+ method: "GET",
+ });
+ let res = await response.json();
+ console.log({res});
+ if (response.status === 200) {
+ setitemData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
+
+
+

+
+
The Catcher in the Rye
+
{itemData.name}
+
+
{itemData.description}
+
+
+ Color
+
+
+
+
+
+
Qty
+
+
+
+
+
+
+
+
+
+
$58.00
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default page
\ No newline at end of file
diff --git a/fit-bite-web/app/dishes/others/page.jsx b/fit-bite-web/app/dishes/others/page.jsx
new file mode 100644
index 00000000..2ffa9b7c
--- /dev/null
+++ b/fit-bite-web/app/dishes/others/page.jsx
@@ -0,0 +1,99 @@
+"use client"
+import React from "react";
+import Head from "next/head";
+import Link from "next/link";
+import { useState, useEffect } from "react";
+import { addtoCart} from "@/app/functions/cart";
+// import { addtoCart } from "@/app/functions/addtoCart";
+import Image from "next/image";
+import { UserContext } from "../../Context/UserProvider";
+import { useRouter } from "next/navigation";
+import { menuData } from "@/app/dishdata";
+function MenuPage() {
+ const { setCountAgain } = React.useContext(UserContext);
+ const [dessertData, setDessertData] = useState([]);
+ const router = useRouter();
+ async function render() {
+ try {
+ const response = await fetch("/api/desserts", {
+ method: "GET",
+ });
+ let res = await response.json();
+
+ // console.log(res);
+ if (response.status === 200) {
+ setDessertData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ console.log({menuData})
+ render()
+ }, []);
+ return (
+
+
+
Desserts
+
+
+ Restaurant Menu | Desserts
+
+
+ Total menu items {dessertData.length}
+
+
+ {menuData.map((category) => (
+ category.dishes.map((item) => (
+
+
+
router.push(`/dishes/desserts/${item._id}`)}>
+ {item.name}
+
+
{item.description}
+
${item.price.toFixed(2)}
+
+
+
+
+
+
+
+ ))
+ ))}
+
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/page.jsx b/fit-bite-web/app/dishes/page.jsx
new file mode 100644
index 00000000..f659134e
--- /dev/null
+++ b/fit-bite-web/app/dishes/page.jsx
@@ -0,0 +1,249 @@
+"use client"
+import Head from "next/head";
+import Image from "next/image";
+import Link from "next/link";
+import { useState } from "react";
+import { menuData } from "../dishdata";
+// import Filters from "../components/filter";
+import { useRouter } from "next/navigation";
+function MenuPage() {
+ // const smallCakes = menuData.smallCakes || [];
+ // const largeCakes = menuData.largeCakes || [];
+ // const desserts = menuData.desserts || [];
+ // const pastries = menuData.pastries || [];
+ const [category, setCategory] = useState("All");
+ const [calories, setCalories] = useState(1000);
+ const [carbs, setCarbs] = useState(100);
+ const [fat, setFat] = useState(50);
+ const [protein, setProtein] = useState(50);
+ const router = useRouter();
+ const filteredDishes = menuData
+ .filter((cat) => cat.category === category)
+ .flatMap((cat) =>
+ cat.dishes.filter(
+ (dish) =>
+ dish.calories <= calories &&
+ dish.carbohydrates <= carbs &&
+ dish.fat <= fat &&
+ dish.protein <= protein
+ )
+ );
+ return (
+
+
+
Restaurant Menu
+
+
+ Restaurant Menu
+
+
+
Dietary Menu
+
+ {/* Category Dropdown */}
+
+
+
+ {/* Sliders */}
+ {[
+ { label: "Max Calories", value: calories, setter: setCalories, max: 1000 },
+ { label: "Max Carbs", value: carbs, setter: setCarbs, max: 100 },
+ { label: "Max Fat", value: fat, setter: setFat, max: 50 },
+ { label: "Max Protein", value: protein, setter: setProtein, max: 50 },
+ ].map(({ label, value, setter, max }) => (
+
+
+ setter(Number(e.target.value))}
+ className="w-full"
+ />
+
+ ))}
+
+ {/* Filtered Dishes */}
+
Dishes
+
+
+
+
+ {/*
*/}
+ {filteredDishes.length > 0 ? (
+ filteredDishes.map((dish, index) => (
+
+ {
+ console.log(dish)
+ router.push(`/dishes/${dish.id}`)}}
+ className=" rounded-xl p-4 shadow-2xl shadow-violet-500/30 m-8 opacity-100 "
+ >
+
+
+
+ {dish.dish_name}
+
+
+
{dish.calories} kcal
+
{dish.carbs}g carbs
+
{dish.fat}g fat
+
{dish.protein}g protein
+
+
+ // {dish.dish_name} - {dish.calories} kcal, {dish.carbs}g carbs, {dish.fat}g fat, {dish.protein}g protein
+ //
+ ))
+ ) : (
+ No matching dishes found.
+ )}
+ {/*
*/}
+
+
+ {/*
Total menu items 40
+
+
+
+
+
+ Large Cakes
+
+
+
Cakes for bigger parties
+
$17.99 onwards
+
+
+
+
+
+
+
+
+
+ Small Cakes
+
+
+
Cakes for small gatherings
+
$3.99 onwards
+
+
+
+
+
+
+
+
+
+ Pastries
+
+
+
Pastries for everyone
+
$3.99 onwards
+
+
+
+ //Desserts
+
+
+
+
+
+ Desserts
+
+
+
Desserts of all types
+
$4.99 onwards
+
+
+
*/}
+
+ {/*
+
Filters
+
+
*/}
+ {/*
*/}
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/pastries/[id]/page.jsx b/fit-bite-web/app/dishes/pastries/[id]/page.jsx
new file mode 100644
index 00000000..aded2adb
--- /dev/null
+++ b/fit-bite-web/app/dishes/pastries/[id]/page.jsx
@@ -0,0 +1,121 @@
+"use client"
+import React, { useEffect, useState } from 'react'
+import { UserContext } from '@/app/Context/UserProvider';
+//when you place a order the dishes of different restaurant should be in order dashboard for those restaurants only
+ function page({params}) {
+
+ const [slug, setSlug] = useState(params.id);
+ const [dish, setDish] = useState(params.dish);
+ const { setCountAgain } = React?.useContext(UserContext);
+ const [itemData, setitemData] = useState([]);
+ async function render() {
+
+ try {
+ const response = await fetch(`/api/item?id=${slug}&dish=pastries`, {
+ method: "GET",
+ });
+ let res = await response.json();
+ console.log({res});
+ if (response.status === 200) {
+ setitemData(res.result);
+ // console.log(res.result, "response orders");
+ }
+ }catch (err) {
+ console.log(err)
+ }
+ }
+
+ useEffect(() => {
+ render()
+ }, []);
+ return (
+
+
+
+
+
+

+
+
The Catcher in the Rye
+
{itemData.name}
+
+
{itemData.description}
+
+
+ Color
+
+
+
+
+
+
Qty
+
+
+
+
+
+
+
+
+
+
$58.00
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default page
\ No newline at end of file
diff --git a/fit-bite-web/app/dishes/pastries/page.jsx b/fit-bite-web/app/dishes/pastries/page.jsx
new file mode 100644
index 00000000..1d7b15fc
--- /dev/null
+++ b/fit-bite-web/app/dishes/pastries/page.jsx
@@ -0,0 +1,135 @@
+"use client";
+import React from "react";
+import Head from "next/head";
+import Link from "next/link";
+import { useState } from "react";
+import { addtoCart } from "@/app/functions/cart";
+import Image from "next/image";
+import { UserContext } from "../../Context/UserProvider";
+import useSWR from "swr";
+import { useRouter } from "next/navigation";
+function MenuPage() {
+ const { setCountAgain } = React.useContext(UserContext);
+ const router = useRouter();
+ // const [pastriesData, setpastriesData] = useState([]);
+ const [pageNumber, setPageNumber] = useState(1);
+ let { data, isLoading, isValidating } = useSWR(
+ `/api/pastries?page=${pageNumber}`,
+ render,
+ {
+ revalidateOnFocus: false,
+ revalidateOnReconnect: false,
+ }
+ );
+ // console.log(data, "pastries");
+ async function render(url) {
+ try {
+ const response = await fetch(url, {
+ method: "GET",
+ });
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ // setpastriesData(res.result);
+ return res.result;
+ // console.log(res.result, "response orders");
+ }
+ } catch (err) {
+ console.log(err);
+ }
+ }
+ // useEffect(() => {
+ // // const storedCart = JSON.parse(localStorage.getItem("cart")) || {};
+ // // setCartitem((prevCart) => {
+ // // // Using a callback for avoiding re-renders
+ // // if (JSON.stringify(prevCart) !== JSON.stringify(storedCart)) {
+ // // return storedCart;
+ // // }
+ // // return prevCart;
+ // // });
+ // render();
+ // }, []);
+ return (
+
+
+
Pastries
+
+
+ {/* //Pastries */}
+
+ Restaurant Menu | Pastries{" "}
+
+
+ Total menu items {data?.length}
+
+
+ {data?.map((item) => (
+
+
+
router.push(`/dishes/pastries/${item._id}`)}>
+ {item.name}
+
+
{item.description}
+
${item.price.toFixed(2)}
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+}
+
+export default MenuPage;
diff --git a/fit-bite-web/app/dishes/test/page.jsx b/fit-bite-web/app/dishes/test/page.jsx
new file mode 100644
index 00000000..3fefc86b
--- /dev/null
+++ b/fit-bite-web/app/dishes/test/page.jsx
@@ -0,0 +1,95 @@
+"use client";
+
+import { useState } from "react";
+import { menuData } from "@/app/dishdata";
+// const menuData = [
+// {
+// category: "Weight Gain",
+// dishes: [
+// { name: "Peanut Butter Oatmeal", calories: 450, carbs: 55, fat: 18, protein: 15 },
+// { name: "Avocado Chicken Sandwich", calories: 600, carbs: 50, fat: 25, protein: 30 },
+// ],
+// },
+// {
+// category: "Weight Loss",
+// dishes: [
+// { name: "Grilled Chicken Salad", calories: 250, carbs: 15, fat: 8, protein: 30 },
+// { name: "Quinoa & Veggies", calories: 300, carbs: 40, fat: 10, protein: 20 },
+// ],
+// },
+// ];
+
+export default function MenuFilter() {
+ const [category, setCategory] = useState("All");
+ const [calories, setCalories] = useState(1000);
+ const [carbs, setCarbs] = useState(100);
+ const [fat, setFat] = useState(50);
+ const [protein, setProtein] = useState(50);
+
+ const filteredDishes = menuData
+ .filter((cat) => category === "All" || cat.category === category)
+ .flatMap((cat) =>
+ cat.dishes.filter(
+ (dish) =>
+ dish.calories <= calories &&
+ dish.carbohydrates <= carbs &&
+ dish.fat <= fat &&
+ dish.protein <= protein
+ )
+ );
+console.log({menuData})
+ return (
+
+
Dietary Menu
+
+ {/* Category Dropdown */}
+
+
+
+ {/* Sliders */}
+ {[
+ { label: "Max Calories", value: calories, setter: setCalories, max: 1000 },
+ { label: "Max Carbs", value: carbs, setter: setCarbs, max: 100 },
+ { label: "Max Fat", value: fat, setter: setFat, max: 50 },
+ { label: "Max Protein", value: protein, setter: setProtein, max: 50 },
+ ].map(({ label, value, setter, max }) => (
+
+
+ setter(Number(e.target.value))}
+ className="w-full"
+ />
+
+ ))}
+
+ {/* Filtered Dishes */}
+
Dishes
+
+
+ );
+}
diff --git a/fit-bite-web/app/error.jsx b/fit-bite-web/app/error.jsx
new file mode 100644
index 00000000..f3af6162
--- /dev/null
+++ b/fit-bite-web/app/error.jsx
@@ -0,0 +1,31 @@
+"use client"; // Error components must be Client Components
+import PropTypes from 'prop-types'
+import { useEffect } from "react";
+import Link from "next/link";
+export default function Error({ error, reset }) {
+ useEffect(() => {
+ // Log the error to an error reporting service
+ console.error(error);
+ }, [error]);
+
+ return (
+
+
Something went wrong!
+
+
+ | Back to Home Page
+
+
+ );
+}
+Error.PropTypes= {
+ error: PropTypes.object.isRequired,
+ reset: PropTypes.func
+}
\ No newline at end of file
diff --git a/fit-bite-web/app/functions/cart.js b/fit-bite-web/app/functions/cart.js
new file mode 100644
index 00000000..518d41f0
--- /dev/null
+++ b/fit-bite-web/app/functions/cart.js
@@ -0,0 +1,63 @@
+// "use client"
+// import mongoose from "mongoose";
+// import User from "@/models/UserModel";
+export const addtoCart = (itemCode, qty, price, productName, image) => {
+ var newCart = JSON.parse(localStorage.getItem('cart')) || {};
+ if (itemCode in newCart) {
+ newCart[itemCode].qty = newCart[itemCode].qty + qty;
+ // console.log(itemCode)
+ } else {
+ newCart[itemCode] = {
+ qty: qty,
+ price: price,
+ productName: productName,
+ image: image,
+ };
+ }
+ localStorage.setItem("cart", JSON.stringify(newCart));
+// console.log("Added to cart", itemCode, newCart)
+// console.log(newCart[itemCode].qty )
+ };
+ // export const itemqty = (itemCode)=>{JSON.parse(localStorage.getItem('cart'))[itemCode].qty}
+ // console.log(itemqty(21))
+ export const removeFromCart = (itemCode, qty) => {
+ let newCart = JSON.parse(localStorage.getItem('cart')) || {};
+ if (itemCode in newCart) {
+ newCart[itemCode].qty = newCart[itemCode].qty - qty;
+ }
+ if (newCart[itemCode].qty <= 0) {
+ delete newCart[itemCode];
+ }
+ localStorage.setItem("cart", JSON.stringify(newCart));
+ // let qty1 = 0;
+ // let keys = Object.keys(newCart);
+ // for (let i = 0; i{
+ // let newCart = JSON.parse(localStorage.getItem('cart')) || {};
+ // let qty = 0;
+ // let keys = Object.keys(newCart);
+ // for (let i = 0; i{
+ let newCart = JSON.parse(localStorage.getItem('cart')) || {};
+ let subTotal = 0;
+ let keys = Object.keys(newCart);
+ for (let i = 0; i{
+ localStorage.removeItem("cart");
+}
+
diff --git a/fit-bite-web/app/functions/subtotal.js b/fit-bite-web/app/functions/subtotal.js
new file mode 100644
index 00000000..145f3ee1
--- /dev/null
+++ b/fit-bite-web/app/functions/subtotal.js
@@ -0,0 +1,13 @@
+"use client"
+export const SubTotal = ()=>{
+
+ let newCart = JSON.parse(localStorage.getItem('cart')) || {};
+ let subTotal = 0;
+ let keys = Object.keys(newCart);
+ for (let i = 0; i * {
+ border-right-width: 0;
+ border-bottom-width: 0;
+}
+.fc .fc-scrollgrid {
+ border-left-width: 0;
+}
+.fc .fc-toolbar.fc-header-toolbar {
+ @apply flex-col gap-4 px-6 pt-6 sm:flex-row;
+}
+.fc-button-group {
+ @apply gap-2;
+}
+.fc-button-group .fc-button {
+ @apply flex h-10 w-10 items-center justify-center !rounded-lg border border-gray-200 bg-transparent hover:border-gray-200 hover:bg-gray-50 focus:shadow-none active:!border-gray-200 active:!bg-transparent active:!shadow-none dark:border-gray-800 dark:hover:border-gray-800 dark:hover:bg-gray-900 dark:active:!border-gray-800;
+}
+
+.fc-button-group .fc-button.fc-prev-button:before {
+ @apply inline-block mt-1;
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.0068 6L9.75684 12.25L16.0068 18.5' stroke='%23344054' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.fc-button-group .fc-button.fc-next-button:before {
+ @apply inline-block mt-1;
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.50684 19L15.7568 12.75L9.50684 6.5' stroke='%23344054' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.dark .fc-button-group .fc-button.fc-prev-button:before {
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.0068 6L9.75684 12.25L16.0068 18.5' stroke='%2398A2B3' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.dark .fc-button-group .fc-button.fc-next-button:before {
+ content: url("data:image/svg+xml,%3Csvg width='25' height='24' viewBox='0 0 25 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.50684 19L15.7568 12.75L9.50684 6.5' stroke='%2398A2B3' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
+}
+.fc-button-group .fc-button .fc-icon {
+ @apply hidden;
+}
+.fc-addEventButton-button {
+ @apply !rounded-lg !border-0 !bg-brand-500 !px-4 !py-2.5 !text-sm !font-medium hover:!bg-brand-600 focus:!shadow-none;
+}
+.fc-toolbar-title {
+ @apply !text-lg !font-medium text-gray-800 dark:text-white/90;
+}
+.fc-header-toolbar.fc-toolbar .fc-toolbar-chunk:last-child {
+ @apply rounded-lg bg-gray-100 p-0.5 dark:bg-gray-900;
+}
+.fc-header-toolbar.fc-toolbar .fc-toolbar-chunk:last-child .fc-button {
+ @apply !h-auto !w-auto rounded-md !border-0 bg-transparent !px-5 !py-2 text-sm font-medium text-gray-500 hover:text-gray-700 focus:!shadow-none dark:text-gray-400;
+}
+.fc-header-toolbar.fc-toolbar
+ .fc-toolbar-chunk:last-child
+ .fc-button.fc-button-active {
+ @apply text-gray-900 bg-white dark:bg-gray-800 dark:text-white;
+}
+.fc-theme-standard th {
+ @apply !border-x-0 border-t !border-gray-200 bg-gray-50 !text-left dark:!border-gray-800 dark:bg-gray-900;
+}
+.fc-theme-standard td,
+.fc-theme-standard .fc-scrollgrid {
+ @apply !border-gray-200 dark:!border-gray-800;
+}
+.fc .fc-col-header-cell-cushion {
+ @apply !px-5 !py-4 text-sm font-medium uppercase text-gray-400;
+}
+.fc .fc-daygrid-day.fc-day-today {
+ @apply bg-transparent;
+}
+.fc .fc-daygrid-day {
+ @apply p-2;
+}
+.fc .fc-daygrid-day.fc-day-today .fc-scrollgrid-sync-inner {
+ @apply rounded bg-gray-100 dark:bg-white/[0.03];
+}
+.fc .fc-daygrid-day-number {
+ @apply !p-3 text-sm font-medium text-gray-700 dark:text-gray-400;
+}
+.fc .fc-daygrid-day-top {
+ @apply !flex-row;
+}
+.fc .fc-day-other .fc-daygrid-day-top {
+ opacity: 1;
+}
+.fc .fc-day-other .fc-daygrid-day-top .fc-daygrid-day-number {
+ @apply text-gray-400 dark:text-white/30;
+}
+.event-fc-color {
+ @apply rounded-lg py-2.5 pl-4 pr-3;
+}
+.event-fc-color .fc-event-title {
+ @apply p-0 text-sm font-normal text-gray-700;
+}
+.fc-daygrid-event-dot {
+ @apply w-1 h-5 ml-0 mr-3 border-none rounded;
+}
+.fc-event {
+ @apply focus:shadow-none;
+}
+.fc-daygrid-event.fc-event-start {
+ @apply !ml-3;
+}
+.event-fc-color.fc-bg-success {
+ @apply border-success-50 bg-success-50;
+}
+.event-fc-color.fc-bg-danger {
+ @apply border-error-50 bg-error-50;
+}
+.event-fc-color.fc-bg-primary {
+ @apply border-brand-50 bg-brand-50;
+}
+.event-fc-color.fc-bg-warning {
+ @apply border-orange-50 bg-orange-50;
+}
+.event-fc-color.fc-bg-success .fc-daygrid-event-dot {
+ @apply bg-success-500;
+}
+.event-fc-color.fc-bg-danger .fc-daygrid-event-dot {
+ @apply bg-error-500;
+}
+.event-fc-color.fc-bg-primary .fc-daygrid-event-dot {
+ @apply bg-brand-500;
+}
+.event-fc-color.fc-bg-warning .fc-daygrid-event-dot {
+ @apply bg-orange-500;
+}
+.fc-direction-ltr .fc-timegrid-slot-label-frame {
+ @apply px-3 py-1.5 text-left text-sm font-medium text-gray-500 dark:text-gray-400;
+}
+.fc .fc-timegrid-axis-cushion {
+ @apply text-sm font-medium text-gray-500 dark:text-gray-400;
+}
+.custom-calendar .fc-h-event {
+ background-color: transparent;
+ border: none;
+ color: black;
+}
+.fc.fc-media-screen {
+ @apply min-h-screen;
+}
+
+.input-date-icon::-webkit-inner-spin-button,
+.input-date-icon::-webkit-calendar-picker-indicator {
+ opacity: 0;
+ -webkit-appearance: none;
+}
+
+.stocks-slider-outer .swiper-button-next:after,
+.stocks-slider-outer .swiper-button-prev:after {
+ @apply hidden;
+}
+
+.stocks-slider-outer .swiper-button-next,
+.stocks-slider-outer .swiper-button-prev {
+ @apply !static mt-0 h-8 w-9 rounded-full border dark:hover:bg-white/[0.05] border-gray-200 !text-gray-700 transition hover:bg-gray-100 dark:border-white/[0.03] dark:bg-gray-800 dark:!text-gray-400 dark:hover:!text-white/90;
+}
+
+.stocks-slider-outer .swiper-button-next.swiper-button-disabled,
+.stocks-slider-outer .swiper-button-prev.swiper-button-disabled {
+ @apply bg-white opacity-50 dark:bg-gray-900;
+}
+
+.stocks-slider-outer .swiper-button-next svg,
+.stocks-slider-outer .swiper-button-prev svg {
+ @apply !h-auto !w-auto;
+}
+
+.swiper-button-prev svg,
+.swiper-button-next svg {
+ @apply !h-auto !w-auto;
+}
+
+.carouselTwo .swiper-button-next:after,
+.carouselTwo .swiper-button-prev:after,
+.carouselFour .swiper-button-next:after,
+.carouselFour .swiper-button-prev:after {
+ @apply hidden;
+}
+.carouselTwo .swiper-button-next.swiper-button-disabled,
+.carouselTwo .swiper-button-prev.swiper-button-disabled,
+.carouselFour .swiper-button-next.swiper-button-disabled,
+.carouselFour .swiper-button-prev.swiper-button-disabled {
+ @apply bg-white/60 !opacity-100;
+}
+.carouselTwo .swiper-button-next,
+.carouselTwo .swiper-button-prev,
+.carouselFour .swiper-button-next,
+.carouselFour .swiper-button-prev {
+ @apply h-10 w-10 rounded-full border-[0.5px] border-white/10 bg-white/90 !text-gray-700 shadow-slider-navigation backdrop-blur-[10px];
+}
+
+.carouselTwo .swiper-button-prev,
+.carouselFour .swiper-button-prev {
+ @apply !left-3 sm:!left-4;
+}
+
+.carouselTwo .swiper-button-next,
+.carouselFour .swiper-button-next {
+ @apply !right-3 sm:!right-4;
+}
+
+.carouselThree .swiper-pagination,
+.carouselFour .swiper-pagination {
+ @apply !bottom-3 !left-1/2 inline-flex !w-auto -translate-x-1/2 items-center gap-1.5 rounded-[40px] border-[0.5px] border-white/10 bg-white/60 px-2 py-1.5 shadow-slider-navigation backdrop-blur-[10px] sm:!bottom-5;
+}
+
+.carouselThree .swiper-pagination-bullet,
+.carouselFour .swiper-pagination-bullet {
+ @apply !m-0 h-2.5 w-2.5 bg-white opacity-100 shadow-theme-xs duration-200 ease-in-out;
+}
+
+.carouselThree .swiper-pagination-bullet-active,
+.carouselFour .swiper-pagination-bullet-active {
+ @apply w-6.5 rounded-xl;
+}
+
+.jvectormap-container {
+ @apply !bg-gray-50 dark:!bg-gray-900;
+}
+.jvectormap-region.jvectormap-element {
+ @apply !fill-gray-300 hover:!fill-brand-500 dark:!fill-gray-700 dark:hover:!fill-brand-500;
+}
+.jvectormap-marker.jvectormap-element {
+ @apply !stroke-gray-200 dark:!stroke-gray-800;
+}
+.jvectormap-tip {
+ @apply !bg-brand-500 !border-none !px-2 !py-1;
+}
+.jvectormap-zoomin,
+.jvectormap-zoomout {
+ @apply !hidden;
+}
+
+.form-check-input:checked ~ span {
+ @apply border-[6px] border-brand-500 bg-brand-500 dark:border-brand-500;
+}
+
+.taskCheckbox:checked ~ .box span {
+ @apply opacity-100 bg-brand-500;
+}
+.taskCheckbox:checked ~ p {
+ @apply text-gray-400 line-through;
+}
+.taskCheckbox:checked ~ .box {
+ @apply border-brand-500 bg-brand-500 dark:border-brand-500;
+}
+
+.task {
+ transition: all 0.2s ease; /* Smooth transition for visual effects */
+}
+
+.task {
+ border-radius: 0.75rem;
+ box-shadow: 0px 1px 3px 0px rgba(16, 24, 40, 0.1),
+ 0px 1px 2px 0px rgba(16, 24, 40, 0.06);
+ opacity: 0.8;
+ cursor: grabbing; /* Changes the cursor to indicate dragging */
+}
diff --git a/fit-bite-web/app/hooks/useGoBack.ts b/fit-bite-web/app/hooks/useGoBack.ts
new file mode 100644
index 00000000..87c628f9
--- /dev/null
+++ b/fit-bite-web/app/hooks/useGoBack.ts
@@ -0,0 +1,17 @@
+import { useRouter } from "next/navigation";
+
+const useGoBack = () => {
+ const router = useRouter();
+
+ const goBack = () => {
+ if (window.history.length > 1) {
+ router.back(); // Navigate to the previous route
+ } else {
+ router.push("/"); // Redirect to home if no history exists
+ }
+ };
+
+ return goBack;
+};
+
+export default useGoBack;
diff --git a/fit-bite-web/app/hooks/useModal.ts b/fit-bite-web/app/hooks/useModal.ts
new file mode 100644
index 00000000..13895047
--- /dev/null
+++ b/fit-bite-web/app/hooks/useModal.ts
@@ -0,0 +1,12 @@
+"use client";
+import { useState, useCallback } from "react";
+
+export const useModal = (initialState: boolean = false) => {
+ const [isOpen, setIsOpen] = useState(initialState);
+
+ const openModal = useCallback(() => setIsOpen(true), []);
+ const closeModal = useCallback(() => setIsOpen(false), []);
+ const toggleModal = useCallback(() => setIsOpen((prev) => !prev), []);
+
+ return { isOpen, openModal, closeModal, toggleModal };
+};
diff --git a/fit-bite-web/app/layout.jsx b/fit-bite-web/app/layout.jsx
new file mode 100644
index 00000000..d2e42d10
--- /dev/null
+++ b/fit-bite-web/app/layout.jsx
@@ -0,0 +1,53 @@
+// import PropTypes from 'prop-types';
+import Navbar from "./components/Navbar";
+import "./globals.css";
+import { Inter } from "next/font/google";
+import Footer from "./components/Footer";
+
+import { UserProvider } from "./Context/UserProvider";
+import Head from "next/head";
+//new
+import { Outfit } from "next/font/google";
+import "swiper/css";
+import "swiper/css/navigation";
+import "swiper/css/pagination";
+import "swiper/css/autoplay";
+import { SidebarProvider } from "./Context/SidebarContext";
+import { ThemeProvider } from "./Context/ThemeContext";
+import { ChatProvider } from "./Context/ChatContext";
+
+const inter = Inter({ subsets: ["latin"] });
+export const metadata = {
+ title: "FitBite",
+ description: "0-n Healthy Meals",
+
+};
+
+export default function RootLayout({ children }) {
+
+ return (
+
+
+
+
+ {/* Loading... }> */}
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+
+ {/* */}
+
+ );
+}
+// RootLayout.propTypes = {
+// children: PropTypes.node,
+// };
\ No newline at end of file
diff --git a/fit-bite-web/app/loading.js b/fit-bite-web/app/loading.js
new file mode 100644
index 00000000..c9329af7
--- /dev/null
+++ b/fit-bite-web/app/loading.js
@@ -0,0 +1,14 @@
+import React from 'react'
+
+function loading() {
+ return (
+
+ )
+}
+
+export default loading
\ No newline at end of file
diff --git a/fit-bite-web/app/login/page.jsx b/fit-bite-web/app/login/page.jsx
new file mode 100644
index 00000000..73ddb341
--- /dev/null
+++ b/fit-bite-web/app/login/page.jsx
@@ -0,0 +1,320 @@
+"use client";
+import React from "react";
+import { useState } from "react";
+import Image from "next/image";
+import Link from "next/link";
+import "../globals.css";
+import { ToastContainer, toast } from "react-toastify";
+// import { injectStyle } from "react-toastify/dist/inject-style";
+import "react-toastify/dist/ReactToastify.css";
+import { useRouter } from "next/navigation";
+import { UserContext } from "../Context/UserProvider";
+function LoginPage() {
+ const { login, setLoggedIn } = React.useContext(UserContext);
+ const [submitted, setSubmitted] = useState(false);
+ const [errors, setErrors] = useState({ username: "Username is required" });
+ const [isChecked, setIsChecked] = useState({ checked: false });
+ const [formData, setFormData] = useState({
+ Email: "",
+ Password: "",
+ });
+ let router = useRouter();
+ const handleCheckboxChange = () => {
+ // Toggle the value of isChecked when the checkbox is clicked
+ setIsChecked({ checked: !isChecked.checked });
+ };
+ // IF REMEMBER ME IS CHECKED DO THIS
+ // if(isChecked.checked === true) {
+
+ // console.log("Don't ask for password for this user again")
+ // }
+
+ // Handle input changes and update state
+ const handleInputChange = (e) => {
+ let name = e.target.name;
+ let value = e.target.value;
+
+ setFormData((prevData) => ({
+ ...prevData,
+ [name]: value,
+ }));
+ //Validation Logic Here
+ // const validationErrors = {};
+
+ // if (!formData.Email) {
+ // validationErrors.Email = "Please enter your Email for future updates.";
+ // }
+
+ // if (!formData.Password) {
+ // validationErrors.Password = "Password is required.";
+ // }
+
+ // if (formData.Password.includes(formData.username)) {
+ // validationErrors.Password = "Username should not be used as a password.";
+ // }
+ // if (formData.Email.length > 1 && formData.Email.length < 10) {
+ // validationErrors.Email = "Please enter correct E-mail id";
+ // }
+ // if (formData.Email.length < 1) {
+ // validationErrors.Email = "Please enter your Email for future updates.";
+ // }
+
+ // if (Object.keys(validationErrors).length > 0) {
+ // setErrors(validationErrors);
+
+ // // console.log(validationErrors)
+ // // setShouldSignup(false);
+ // } else {
+ // setErrors(validationErrors);
+ // }
+ };
+ const isFormValid = () => {
+ // Check if there are any errors in the errors state
+ return Object.values(errors).every((error) => error === "");
+ };
+ // Handle form submission
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ // setActiveStep(2)
+ // Convert form data to JSON
+ // const jsonData = JSON.stringify(formData, null, 2);
+ setErrors({});
+ const validationErrors = {};
+
+ if (!formData.Email) {
+ validationErrors.Email = "Please enter your Email for future updates.";
+ }
+
+ if (!formData.Password) {
+ validationErrors.Password = "Password is required.";
+ }
+
+ // if (formData.Password.includes(formData.username)) {
+ // validationErrors.Password = "Username should not be used as a password.";
+ // }
+ if (formData.Email.length > 1 && formData.Email.length < 10) {
+ validationErrors.Email = "Please enter correct E-mail id";
+ }
+ if (formData.Email.length < 1) {
+ validationErrors.Email = "Please enter your Email for future updates.";
+ }
+ if (formData.Password.length <= 1) {
+ validationErrors.Password = "Please enter correct password";
+ }
+
+ if (Object.keys(validationErrors).length > 0) {
+ setErrors(validationErrors);
+ }
+ // { "username": "Abhi",
+ // "ContactNumber": 679234567890,
+ // "Email": "abhi2y@email.com",
+ // "Password": "abhi",
+ // "Address": "PNT Colony"
+ // }
+ // Log the JSON data (you can send it to a server or save it as needed)
+
+ // Convert form data to JSON
+ const jsonDataFinal = JSON.stringify(formData, null, 2);
+ // console.log("String form Data Final", jsonDataFinal);
+ // console.log(Object.keys(validationErrors).length)
+ if (Object.keys(validationErrors).length == 0) {
+ try {
+ console.log("Logging in");
+ const response = await fetch("/api/login", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+ // console.log(response.body);
+ if (response.status === 201) {
+ // Parse the JSON response and extract the token
+ const responseData = await response.json();
+ const token = responseData.token;
+
+ localStorage.setItem("token", token);
+ setSubmitted(true);
+
+ toast.success("🎉 Signed In successfully! Redirecting 🤗", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ setLoggedIn(true);
+ setTimeout(() => {
+ router.push("/dishes");
+ }, 3000);
+
+ login();
+ setFormData({
+ Email: "",
+ Password: "",
+ });
+ } else {
+ console.error("Form submission failed");
+ toast.error("👹 User Not Found!", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ setFormData({
+ Email: "",
+ Password: "",
+ });
+ setIsChecked({ checked: false });
+ }
+ } catch (error) {
+ console.error("Error:", error);
+ }
+ }
+ // console.log(formData);
+ };
+
+ return (
+
+
+
+
+ {/*
+ Zomato
+
*/}
+
+
+
+
+
+ {`Don't`} have an account?
+
+ Sign Up
+
+
+
+
+ ©2023 Zomato. All rights reserved.
+
+
+
+ );
+}
+
+export default LoginPage;
diff --git a/fit-bite-web/app/middlewares/mongoose.js b/fit-bite-web/app/middlewares/mongoose.js
new file mode 100644
index 00000000..990fc704
--- /dev/null
+++ b/fit-bite-web/app/middlewares/mongoose.js
@@ -0,0 +1,9 @@
+// import mongoose from "mongoose"
+// const connectDb = handler => async (req,res) =>{
+// if(mongoose.connections[0].readyState){
+// return handler(req,res)
+// }
+// await mongoose.connect(process.env.MONGODB_URI)
+// return handler(req,res)
+// }
+// export default connectDb
\ No newline at end of file
diff --git a/fit-bite-web/app/models/AdminModel.js b/fit-bite-web/app/models/AdminModel.js
new file mode 100644
index 00000000..d52973a7
--- /dev/null
+++ b/fit-bite-web/app/models/AdminModel.js
@@ -0,0 +1,16 @@
+
+import mongoose, { Schema } from "mongoose";
+const adminSchema = new Schema({
+ username: {type:String, required:true},
+
+ Email: {type:String, required:true, unique:true},
+ // {type:String, required:true, unique:true},
+ // required: true,
+ Password:{type:String, required:true},
+ // {type:String, required:true},
+ // {type:String, required:true},
+}, {timestamps:true})
+mongoose.models = {};
+const Admin =
+ mongoose.model.Admin || mongoose.model("Admin", adminSchema);
+export default Admin;
\ No newline at end of file
diff --git a/fit-bite-web/app/models/DessertModel.js b/fit-bite-web/app/models/DessertModel.js
new file mode 100644
index 00000000..ec3329a5
--- /dev/null
+++ b/fit-bite-web/app/models/DessertModel.js
@@ -0,0 +1,12 @@
+import mongoose, { Schema } from "mongoose";
+
+const dessertSchema = new Schema({
+ id: Number,
+ name: String,
+ description: String,
+ price: Number,
+ image:String,
+});
+mongoose.models = {};
+const Dessert = mongoose.model.Dessert || mongoose.model("Dessert", dessertSchema);
+export default Dessert
\ No newline at end of file
diff --git a/fit-bite-web/app/models/LargeCakesModel.js b/fit-bite-web/app/models/LargeCakesModel.js
new file mode 100644
index 00000000..82ca9005
--- /dev/null
+++ b/fit-bite-web/app/models/LargeCakesModel.js
@@ -0,0 +1,12 @@
+import mongoose, { Schema } from "mongoose";
+
+const LargeCakeSchema = new Schema({
+ id: Number,
+ name: String,
+ description: String,
+ price: Number,
+ image:String,
+});
+mongoose.models = {};
+const LargeCake = mongoose.model.LargeCake || mongoose.model("LargeCake", LargeCakeSchema);
+export default LargeCake
\ No newline at end of file
diff --git a/fit-bite-web/app/models/OrderModel.js b/fit-bite-web/app/models/OrderModel.js
new file mode 100644
index 00000000..7d94dd4b
--- /dev/null
+++ b/fit-bite-web/app/models/OrderModel.js
@@ -0,0 +1,19 @@
+import mongoose, { Schema } from "mongoose";
+const orderSchema = new Schema(
+ {
+ deliveryStatus:{ type: String, required: true},
+ chargeId: { type: String, required: true , unique: true},
+ userId: { type: String, required: true},
+ orderStatus: { type: String, required: true },
+ amount: { type: Number, required: true},
+ paymentMethod: { type: String, required: true },
+ billingEmail: { type: String, required: true },
+ cardBrand: { type: String},
+ last4Digits: { type: Number},
+ receipt_url: { type: String,required: true },
+ },
+ { timestamps: true }
+);
+mongoose.models = {};
+const Order = mongoose.model.Order || mongoose.model("Order", orderSchema);
+export default Order;
diff --git a/fit-bite-web/app/models/OtherProductModel.js b/fit-bite-web/app/models/OtherProductModel.js
new file mode 100644
index 00000000..ce84ecc0
--- /dev/null
+++ b/fit-bite-web/app/models/OtherProductModel.js
@@ -0,0 +1,19 @@
+import mongoose, { Schema } from "mongoose";
+
+const otherProductSchema = new Schema({
+ id: Number,
+ name: String,
+ Description: String,
+ Price: Number,
+ image:String,
+ Calories:Number,
+ Protein:Number,
+ Fat:Number,
+ Carbohydrates:Number,
+ type: String,
+ restaurantId: String//pass mongo db default _id for restaurant
+});
+//scaling,monetization,tech
+mongoose.models = {};
+const OtherProduct = mongoose.model.OtherProduct || mongoose.model("OtherProduct", otherProductSchema);
+export default OtherProduct
\ No newline at end of file
diff --git a/fit-bite-web/app/models/PastriesModel.js b/fit-bite-web/app/models/PastriesModel.js
new file mode 100644
index 00000000..ade9e18f
--- /dev/null
+++ b/fit-bite-web/app/models/PastriesModel.js
@@ -0,0 +1,12 @@
+import mongoose, { Schema } from "mongoose";
+
+const PastriesSchema = new Schema({
+ id: Number,
+ name: String,
+ description: String,
+ price: Number,
+ image:String,
+});
+mongoose.models = {};
+const Pastries = mongoose.model.Pastries || mongoose.model("Pastries", PastriesSchema);
+export default Pastries
\ No newline at end of file
diff --git a/fit-bite-web/app/models/RestaurantModel.js b/fit-bite-web/app/models/RestaurantModel.js
new file mode 100644
index 00000000..835a9077
--- /dev/null
+++ b/fit-bite-web/app/models/RestaurantModel.js
@@ -0,0 +1,33 @@
+import mongoose, { Schema } from "mongoose";
+
+// Define the schema for the individual items in the form data
+const restaurantItemSchema = new Schema({
+ name: String,
+ description: String,
+});
+
+// Define the main schema for the form data containing multiple items
+const restaurantTypeSchema = new Schema({
+ items: [restaurantItemSchema],
+});
+const restaurantSchema = new Schema({
+ userId: { type: String, required: true},
+ restaurantName: { type: String, required: true},
+ // required: true,
+ restaurantContactNumber: { type: Number, required: true},
+ // required: true,
+ restaurantEmail: { type: String, required: true},
+ // required: true,
+ restaurantAddress: { type: String, required: true},
+ // required: true,
+ restaurantLat: { type: Number, required: true},
+ // required: true,
+ restaurantLng: { type: Number, required: true},
+ // required: true,
+ restaurantType: restaurantTypeSchema,
+ restaurantImage: { type: String},
+});
+mongoose.models = {};
+const Restaurant =
+ mongoose.model.Restaurant || mongoose.model("Restaurant", restaurantSchema);
+export default Restaurant;
diff --git a/fit-bite-web/app/models/SmallCakesModel.js b/fit-bite-web/app/models/SmallCakesModel.js
new file mode 100644
index 00000000..94480b80
--- /dev/null
+++ b/fit-bite-web/app/models/SmallCakesModel.js
@@ -0,0 +1,12 @@
+import mongoose, { Schema } from "mongoose";
+
+const smallCakeSchema = new Schema({
+ id: Number,
+ name: String,
+ description: String,
+ price: Number,
+ image:String,
+});
+mongoose.models = {};
+const smallCake = mongoose.model.smallCake || mongoose.model("smallCake", smallCakeSchema);
+export default smallCake
\ No newline at end of file
diff --git a/fit-bite-web/app/models/UserModel.js b/fit-bite-web/app/models/UserModel.js
new file mode 100644
index 00000000..53d48dfe
--- /dev/null
+++ b/fit-bite-web/app/models/UserModel.js
@@ -0,0 +1,21 @@
+
+import mongoose, { Schema } from "mongoose";
+const userSchema = new Schema({
+ username: {type:String, required:true},
+ // {type:String, required:true},
+ // required: true,
+ ContactNumber: {type:Number, required:true, unique:true},
+ // {type:Number, required:true, unique:true},
+ // required: true,
+ Address: {type:String, required:true},
+ Email: {type:String, required:true, unique:true},
+ // {type:String, required:true, unique:true},
+ // required: true,
+ Password:{type:String, required:true},
+ // {type:String, required:true},
+ // {type:String, required:true},
+}, {timestamps:true})
+mongoose.models = {};
+const User =
+ mongoose.model.User || mongoose.model("User", userSchema);
+export default User;
\ No newline at end of file
diff --git a/fit-bite-web/app/not-found.jsx b/fit-bite-web/app/not-found.jsx
new file mode 100644
index 00000000..7784151e
--- /dev/null
+++ b/fit-bite-web/app/not-found.jsx
@@ -0,0 +1,14 @@
+import React from "react";
+import Link from "next/link";
+function NotFound() {
+ return (
+
+ Page Not found{" "}
+
+ Back to Home Page
+
+
+ );
+}
+
+export default NotFound;
diff --git a/fit-bite-web/app/orders/page.jsx b/fit-bite-web/app/orders/page.jsx
new file mode 100644
index 00000000..07d80358
--- /dev/null
+++ b/fit-bite-web/app/orders/page.jsx
@@ -0,0 +1,344 @@
+"use client";
+import React from "react";
+import { useEffect, useState, useCallback } from "react";
+import Stripe from "stripe";
+import { useRouter } from "next/navigation";
+import { UserContext } from "../Context/UserProvider";
+import { ToastContainer, toast } from "react-toastify";
+import Link from "next/link";
+import "react-toastify/dist/ReactToastify.css";
+// http://localhost:3000/orders?success=true&session_id=cs_test_a14K975hTnLpOjnrTpNxKjc4K6SW1Jiov4OtHUzMwJYdH5mBG5mGmB1syr
+const Page = () => {
+ const stripe = new Stripe(process.env.NEXT_PUBLIC_STRIPE_SECRET);
+ const [orders, setOrder] = useState([]);
+ const router = useRouter();
+ const { loggedIn, contextLoading, userData } = React.useContext(UserContext);
+ // let userEmail = decoded.Email
+ // console.log("user", userEmail)
+ // let userId = decoded.Email
+ // console.log("user", userId)
+ // setTimeout(() => {
+
+ // }, 3000);
+
+ const fetchData = useCallback(async () => {
+ const userId = userData._id;
+ if (typeof window !== "undefined") {
+ const urlParams = new URLSearchParams(window.location.search);
+ if (urlParams) {
+ const sessionId = urlParams.get("session_id");
+
+ // console.log(sessionId, "session");
+
+ if (sessionId) {
+ const session1 = await stripe.checkout.sessions.retrieve(sessionId);
+ // let userId = session1?.metadata?.userId;
+ // console.log(session1, "session");
+ let paymentIntentId = session1.payment_intent;
+ // console.log(paymentIntentId, "payment intent");
+ const paymentIntent = await stripe.paymentIntents.retrieve(
+ // "pi_3OMS8xSHh0F7a44U0R8y24GA"
+ paymentIntentId
+ );
+ // let subtotal = paymentIntent.amount;
+ // console.log("payment Intent", paymentIntent);
+ let chargeId = paymentIntent.latest_charge;
+ // console.log("charge Intent", chargeId);
+ if (chargeId) {
+ let charge = await stripe.charges.retrieve(chargeId);
+ // console.log("Charge", charge);
+
+ let orderStatus = charge.status; // "succeeded"
+ let amount = charge.amount; // 11999 (in the smallest currency unit, e.g., cents)
+ let paymentMethod = charge.payment_method_details.type; // "card"
+ let billingEmail = charge.billing_details.email;
+ // Accessing card details
+ let cardBrand = charge.payment_method_details.card.brand; // "visa"
+ let last4Digits = charge.payment_method_details.card.last4; // "4242"
+ let receipt_url = charge.receipt_url;
+ // console.log({ userId }, "from useEffect");
+ let deliveryStatus = "Topping up sweetness";
+ let obj = {
+ deliveryStatus,
+ chargeId,
+ userId,
+ orderStatus,
+ amount,
+ paymentMethod,
+ billingEmail,
+ cardBrand,
+ last4Digits,
+ receipt_url,
+ };
+ // console.log(JSON.stringify(obj));
+
+ try {
+ const jsonDataFinal = JSON.stringify(obj, null, 2);
+ // console.log({ jsonDataFinal });
+ const response = await fetch("/api/orders", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+ let res = await response.json();
+ setOrder(res.orders);
+ if (response.status === 201) {
+ toast.success("🤗 Order Placed 🎈🎈!", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ // alert("Order created");
+ setTimeout(() => {
+ router.push("/orders");
+ }, 1000);
+ // let res = response.json();
+ // console.log(
+ // res.orders,
+ // "response orders from Successful Creation"
+ // );
+ } else {
+ console.log("Order not created", response.status);
+ }
+ } catch (e) {
+ console.log(e.message);
+ }
+ }
+ }
+ }
+ }
+ let urlParameter = new URLSearchParams(window.location.search);
+
+ if (urlParameter) {
+ const sessionData = urlParameter.get("session_id");
+
+ if (
+ sessionData === undefined ||
+ sessionData === null ||
+ sessionData === ""
+ ) {
+ // const jsonDataFinal = JSON.stringify(userId, null, 2);
+ // console.log({ jsonDataFinal });
+ try {
+ const response = await fetch("/api/orders", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({ userId }),
+ });
+ let res = await response.json();
+ // console.log(res);
+ if (response.status === 200) {
+ setOrder(res.orders);
+ }
+ } catch (err) {
+ console.log(err);
+ }
+ }
+ }
+ },[router, stripe.charges, stripe.checkout.sessions, stripe.paymentIntents, userData._id]);
+
+ // async function getUser() {
+ // // if (loggedIn) {
+ // let decodedToken = jwt.decode(user.value);
+ // // console.log("decoded token", decodedToken)
+ // setDecoded(decodedToken);
+ // return decodedToken;
+ // }
+ // }
+ // if(!loggedIn){
+ // return
+ // }
+ // if(!loggedIn) {
+ // setTimeout(() => {
+
+ // router.push('/login')
+ // }, 3000)
+ // }
+ {
+ /* {
+ }
+ > */
+ }
+
+ // }
+ useEffect(() => {
+ if (contextLoading == false) {
+ if (loggedIn) {
+ fetchData();
+ }
+ if (!loggedIn) {
+ console.log("else from orders page is getting triggered");
+ // Schedule the redirect after 3 seconds
+ setTimeout(() => {
+ router.push("/login");
+ }, 2000);
+ }
+ }
+
+ // else {
+ // // Show the div first
+
+ // // Schedule the redirect after 3 seconds
+ // setTimeout(() => {
+ // router.push("/login");
+ // }, 3000);
+ // }
+
+ // getUser().then(()=>{
+ // console.log({decoded});
+ // })
+
+ // cs_test_a1sBkOnJyyCv9FfZt5rogyFokDMk60s6SSVyrogePJGRyVE8u8I1c1vA2Y
+ }, [loggedIn, contextLoading, userData, fetchData, router]);
+
+ // console.log({userId}, "from useEffect")
+
+ // console.log({order})
+ // console.log({jsonDataFinal})
+ // console.log({orders})
+ return (
+
+
+
+ {" "}
+ {!loggedIn ? (
+
+ Loading...
+
+ ) : orders.length > 0 ? (
+ "Recent Orders"
+ ) : (
+ "No Orders Found"
+ )}
+ {/* {orders.length > 0 ? "Recent Orders" : "Orders Found: NAN"} */}
+
+
+
+
+ {orders?.map((order) => (
+ //
{order.chargeId,
+ // order.userId,
+ // order.orderStatus,
+ // order.amount,
+ // order.paymentMethod,
+ // order.billingEmail,
+ // order.cardBrand,
+ // order.last4Digits,
+ // order.receipt_url}
+
+
1 ? "xl:w-1/2" : ""} w-full`}
+ key={order.chargeId}
+ >
+
+
+ {/*
*/}
+
+ {/*
*/}
+
+
+
+ Amount:{" "}
+
+ {order.amount / 100} INR.
+
+
+
+ {order.orderStatus.toUpperCase()}
+
+
+
+ Method: {order.paymentMethod}
+
+
+ Billing Email: {order.billingEmail}
+
+
+ Card Brand: {order.cardBrand}
+
+
+ Last 4 Digits: {order.last4Digits}
+
+
+
+ {order?.deliveryStatus
+ ? order.deliveryStatus === "Delivered"
+ ? ""
+ : "Delivery Status: "
+ : "Awaiting approval"}
+
+ {order?.deliveryStatus}
+
+
+
+ {" "}
+ Invoice
+
+
+
+
+
+ ))}
+
+
+
+
+ );
+};
+
+export default Page;
diff --git a/fit-bite-web/app/output.json b/fit-bite-web/app/output.json
new file mode 100644
index 00000000..62cd2e23
--- /dev/null
+++ b/fit-bite-web/app/output.json
@@ -0,0 +1,526 @@
+ [
+ {
+ "category": "Weight Gain",
+ "dishes": [
+ {
+ "dish_name": "Paneer Bhurji with Multigrain Roti",
+ "calories": 350,
+ "carbohydrates": 40,
+ "fat": 15,
+ "protein": 18,
+ "description": "A flavorful scrambled paneer dish cooked with onions, tomatoes, and spices, served with multigrain roti.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139443/hack2/products/aruxou9imgdfiwfbrrwo.jpg",
+ "id": 1,
+ "ingredients": [
+ "Paneer (Indian cottage cheese)",
+ "Onions",
+ "Tomatoes",
+ "Green chilies",
+ "Ginger",
+ "Garlic",
+ "Cumin seeds",
+ "Turmeric powder",
+ "Red chili powder",
+ "Garam masala",
+ "Fresh coriander leaves",
+ "Multigrain flour",
+ "Water",
+ "Salt",
+ "Oil or ghee"
+ ]
+ },
+ {
+ "dish_name": "Ghee Paratha with Dal Makhani",
+ "calories": 450,
+ "carbohydrates": 50,
+ "fat": 20,
+ "protein": 16,
+ "description": "Rich and creamy black lentil curry served with ghee-laden paratha.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139442/hack2/products/r3euk03b8hbojzsulffq.jpg",
+ "id": 2,
+ "ingredients": [
+ "Whole wheat flour",
+ "Ghee",
+ "Black lentils (urad dal)",
+ "Red kidney beans (rajma)",
+ "Onions",
+ "Tomatoes",
+ "Ginger",
+ "Garlic",
+ "Green chilies",
+ "Cumin seeds",
+ "Red chili powder",
+ "Garam masala",
+ "Cream",
+ "Salt",
+ "Water"
+ ]
+ },
+ {
+ "dish_name": "Peanut Butter Banana Smoothie",
+ "calories": 400,
+ "carbohydrates": 55,
+ "fat": 12,
+ "protein": 15,
+ "description": "A creamy and nutritious smoothie blending ripe bananas with peanut butter.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 3,
+ "ingredients": [
+ "Ripe bananas",
+ "Peanut butter",
+ "Milk (or dairy-free alternative)",
+ "Honey or maple syrup",
+ "Ice cubes"
+ ]
+ }
+ ]
+ },
+ {
+ "category": "Weight Loss",
+ "dishes": [
+ {
+ "dish_name": "Moong Dal Chilla with Mint Chutney",
+ "calories": 180,
+ "carbohydrates": 25,
+ "fat": 5,
+ "protein": 10,
+ "description": "Savory pancakes made from ground moong dal batter, served with refreshing mint chutney.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139442/hack2/products/z04nbfo9xeje5cvdk5yb.jpg",
+ "id": 4,
+ "ingredients": [
+ "Split green gram (moong dal)",
+ "Green chilies",
+ "Ginger",
+ "Cumin seeds",
+ "Fresh coriander leaves",
+ "Salt",
+ "Oil",
+ "Fresh mint leaves",
+ "Lemon juice"
+ ]
+ },
+ {
+ "dish_name": "Grilled Chicken with Stir-Fried Veggies",
+ "calories": 250,
+ "carbohydrates": 10,
+ "fat": 8,
+ "protein": 35,
+ "description": "Juicy grilled chicken breast paired with a medley of stir-fried vegetables.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139443/hack2/products/ths9ubnw56jzthftplei.jpg",
+ "id": 5,
+ "ingredients": [
+ "Chicken breast",
+ "Mixed vegetables (bell peppers, broccoli, carrots, etc.)",
+ "Olive oil",
+ "Garlic",
+ "Soy sauce",
+ "Black pepper",
+ "Salt",
+ "Lemon juice"
+ ]
+ },
+ {
+ "dish_name": "Sprouts Salad with Lemon Dressing",
+ "calories": 120,
+ "carbohydrates": 20,
+ "fat": 2,
+ "protein": 10,
+ "description": "A refreshing salad featuring mixed sprouts tossed in a tangy lemon dressing.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740139443/hack2/products/itminnycvam5zbemwzje.jpg",
+ "id": 6,
+ "ingredients": [
+ "Mixed sprouts (mung beans, chickpeas, etc.)",
+ "Tomatoes",
+ "Cucumbers",
+ "Onions",
+ "Fresh coriander leaves",
+ "Lemon juice",
+ "Black pepper",
+ "Salt"
+ ]
+ }
+ ]
+ },
+ {
+ "category": "Muscle Building",
+ "dishes": [
+ {
+ "dish_name": "Grilled Salmon with Quinoa",
+ "calories": 320,
+ "carbohydrates": 35,
+ "fat": 10,
+ "protein": 30,
+ "description": "Perfectly grilled salmon fillet served alongside fluffy quinoa.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 7,
+ "ingredients": [
+ "Salmon fillet",
+ "Quinoa",
+ "Olive oil",
+ "Garlic",
+ "Lemon juice",
+ "Fresh herbs (dill or parsley)",
+ "Salt",
+ "Black pepper"
+ ]
+ },
+ {
+ "dish_name": "Egg and Avocado Toast",
+ "calories": 280,
+ "carbohydrates": 30,
+ "fat": 12,
+ "protein": 22,
+ "description": "Toasted whole grain bread topped with creamy avocado and a poached egg.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 8,
+ "ingredients": [
+ "Whole grain bread",
+ "Ripe avocado",
+ "Eggs",
+ "Lemon juice",
+ "Red chili flakes",
+ "Salt",
+ "Black pepper"
+ ]
+ },
+ {
+ "dish_name": "Tandoori Chicken with Dal Tadka",
+ "calories": 350,
+ "carbohydrates": 40,
+ "fat": 12,
+ "protein": 38,
+ "description": "Spiced tandoori chicken served with flavorful lentil curry.",
+ "price": 57,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 9,
+ "ingredients": [
+ "Chicken legs or thighs",
+ "Yogurt",
+ "Tandoori masala",
+ "Lemon juice",
+ "Red lentils (masoor dal)",
+ "Onions",
+ "Tomato"
+ ]
+ }
+ ]
+ },
+ {
+ "dish_name": "Chickpea Spinach Salad",
+ "calories": 220,
+ "carbohydrates": 30,
+ "fat": 6,
+ "protein": 12,
+ "description": "A fresh and healthy salad combining chickpeas and spinach with a tangy dressing.",
+ "price": 180,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 10,
+ "ingredients": [
+ "Chickpeas",
+ "Spinach",
+ "Cucumber",
+ "Tomatoes",
+ "Red Onion",
+ "Lemon Juice",
+ "Olive Oil",
+ "Salt",
+ "Black Pepper"
+ ]
+ },
+ {
+ "dish_name": "Tofu Bhurji with Roti",
+ "calories": 250,
+ "carbohydrates": 35,
+ "fat": 8,
+ "protein": 15,
+ "description": "A protein-rich scramble made with spiced tofu, served with warm roti.",
+ "price": 210,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 11,
+ "ingredients": [
+ "Tofu",
+ "Onions",
+ "Tomatoes",
+ "Green Chilies",
+ "Turmeric Powder",
+ "Cumin Seeds",
+ "Coriander Powder",
+ "Salt",
+ "Oil",
+ "Whole Wheat Flour"
+ ]
+ },
+ {
+ "dish_name": "Moong Dal Khichdi",
+ "calories": 240,
+ "carbohydrates": 38,
+ "fat": 5,
+ "protein": 10,
+ "description": "A comforting porridge made with moong dal and rice, seasoned with spices.",
+ "price": 150,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 12,
+ "ingredients": [
+ "Moong Dal",
+ "Rice",
+ "Turmeric Powder",
+ "Cumin Seeds",
+ "Asafoetida",
+ "Ginger",
+ "Green Chilies",
+ "Salt",
+ "Ghee or Oil"
+ ]
+ },
+ {
+ "category": "Diabetic-Friendly",
+ "dishes": [
+ {
+ "dish_name": "Ragi Idli with Coconut Chutney",
+ "calories": 180,
+ "carbohydrates": 30,
+ "fat": 5,
+ "protein": 8,
+ "description": "Steamed finger millet cakes served with a traditional coconut chutney.",
+ "price": 190,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 13,
+ "ingredients": [
+ "Ragi Flour",
+ "Urad Dal",
+ "Fenugreek Seeds",
+ "Salt",
+ "Grated Coconut",
+ "Green Chilies",
+ "Ginger",
+ "Curry Leaves",
+ "Mustard Seeds",
+ "Oil"
+ ]
+ },
+ {
+ "dish_name": "Quinoa Upma with Vegetables",
+ "calories": 200,
+ "carbohydrates": 35,
+ "fat": 4,
+ "protein": 10,
+ "description": "A nutritious twist on traditional upma, made with quinoa and mixed vegetables.",
+ "price": 220,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 14,
+ "ingredients": [
+ "Quinoa",
+ "Mixed Vegetables (Carrots, Peas, Beans)",
+ "Onion",
+ "Green Chilies",
+ "Ginger",
+ "Mustard Seeds",
+ "Cumin Seeds",
+ "Turmeric Powder",
+ "Salt",
+ "Oil"
+ ]
+ },
+ {
+ "dish_name": "Palak Dal with Bajra Roti",
+ "calories": 230,
+ "carbohydrates": 40,
+ "fat": 6,
+ "protein": 12,
+ "description": "A hearty lentil curry cooked with spinach, paired with pearl millet flatbread.",
+ "price": 250,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 15,
+ "ingredients": [
+ "Toor Dal",
+ "Spinach",
+ "Onion",
+ "Tomato",
+ "Garlic",
+ "Ginger",
+ "Turmeric Powder",
+ "Cumin Seeds",
+ "Salt",
+ "Bajra Flour"
+ ]
+ }
+ ]
+ },
+ {
+ "category": "Heart-Healthy",
+ "dishes": [
+ {
+ "dish_name": "Oats Porridge with Nuts",
+ "calories": 200,
+ "carbohydrates": 35,
+ "fat": 6,
+ "protein": 8,
+ "description": "A warm and creamy oats porridge topped with a mix of nuts.",
+ "price": 160,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 16,
+ "ingredients": [
+ "Rolled Oats",
+ "Milk or Water",
+ "Almonds",
+ "Cashews",
+ "Raisins",
+ "Honey or Sugar",
+ "Salt"
+ ]
+ },
+ {
+ "dish_name": "Steamed Fish with Lemon and Herbs",
+ "calories": 250,
+ "carbohydrates": 5,
+ "fat": 10,
+ "protein": 30,
+ "description": "Delicately steamed fish fillets infused with lemon and fresh herbs.",
+ "price": 280,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 17,
+ "ingredients": [
+ "Fish Fillets",
+ "Lemon",
+ "Fresh Herbs (Parsley, Dill)",
+ "Garlic",
+ "Olive Oil",
+ "Salt",
+ "Black Pepper"
+ ]
+ },
+ {
+ "dish_name": "Avocado and Sprout Sandwich",
+ "calories": 220,
+ "carbohydrates": 30,
+ "fat": 10,
+ "protein": 12,
+ "description": "A wholesome sandwich filled with creamy avocado and crunchy sprouts.",
+ "price": 200,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 18,
+ "ingredients": [
+ "Whole Grain Bread",
+ "Avocado",
+ "Mixed Sprouts",
+ "Tomato",
+ "Lettuce",
+ "Lemon Juice",
+ "Salt",
+ "Black Pepper"
+ ]
+ }
+ ]
+ },
+ {
+ "category": "Balanced Diet",
+ "dishes": [
+ {
+ "dish_name": "Dal Tadka with Jeera Rice",
+ "calories": 300,
+ "carbohydrates": 50,
+ "fat": 8,
+ "protein": 12,
+ "description": "A classic combination of spiced lentils (dal tadka) served with cumin-flavored basmati rice (jeera rice).",
+ "price": 150,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 19,
+ "ingredients": [
+ "Toor dal (split pigeon peas)",
+ "Moong dal (split green gram)",
+ "Ghee (clarified butter)",
+ "Ginger",
+ "Garlic",
+ "Onion",
+ "Tomato",
+ "Green chili",
+ "Turmeric powder",
+ "Red chili powder",
+ "Coriander powder",
+ "Garam masala",
+ "Cumin seeds",
+ "Mustard seeds",
+ "Asafoetida (hing)",
+ "Dried red chilies",
+ "Curry leaves",
+ "Fresh coriander leaves",
+ "Basmati rice",
+ "Bay leaf",
+ "Salt"
+ ]
+ },
+ {
+ "dish_name": "Grilled Chicken Wrap with Whole Wheat Roti",
+ "calories": 320,
+ "carbohydrates": 40,
+ "fat": 10,
+ "protein": 28,
+ "description": "Succulent grilled chicken pieces wrapped in a soft whole wheat roti, accompanied by fresh vegetables and tangy sauces.",
+ "price": 200,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 20,
+ "ingredients": [
+ "Chicken breast",
+ "Whole wheat flour",
+ "Yogurt",
+ "Lemon juice",
+ "Ginger-garlic paste",
+ "Garam masala",
+ "Red chili powder",
+ "Turmeric powder",
+ "Cumin powder",
+ "Coriander powder",
+ "Salt",
+ "Olive oil",
+ "Lettuce",
+ "Tomato",
+ "Onion",
+ "Cucumber",
+ "Mint chutney",
+ "Cilantro"
+ ]
+ },
+ {
+ "dish_name": "Egg Curry with Brown Rice",
+ "calories": 350,
+ "carbohydrates": 45,
+ "fat": 12,
+ "protein": 25,
+ "description": "Hard-boiled eggs simmered in a spiced tomato-onion gravy, served alongside nutritious brown rice.",
+ "price": 180,
+ "image": "https://res.cloudinary.com/dkv7cimyy/image/upload/v1740123654/hack2/k7y0mnlaufgojdj3g47t.jpg",
+ "id": 21,
+ "ingredients": [
+ "Eggs",
+ "Brown rice",
+ "Onion",
+ "Tomato",
+ "Ginger-garlic paste",
+ "Green chili",
+ "Turmeric powder",
+ "Red chili powder",
+ "Coriander powder",
+ "Garam masala",
+ "Cumin seeds",
+ "Mustard seeds",
+ "Bay leaf",
+ "Cinnamon stick",
+ "Cloves",
+ "Green cardamom",
+ "Black cardamom",
+ "Salt",
+ "Oil",
+ "Fresh coriander leaves"
+ ]
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/fit-bite-web/app/page.jsx b/fit-bite-web/app/page.jsx
new file mode 100644
index 00000000..52e01e02
--- /dev/null
+++ b/fit-bite-web/app/page.jsx
@@ -0,0 +1,122 @@
+import Image from "next/image";
+import Link from "next/link";
+import React from "react";
+import Head from "next/head";
+export default function Home() {
+ // 1155x1397
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FitBite covers it all !!😃❤
+
+
+ Explore menus, and millions of restaurant photos and reviews from
+ users just like you, to find your next great meal.
+
+
+
+
+
+
+
+
+
+
+
+ From swanky upscale restaurants to the cosiest hidden gems
+
+
+ ----Download On----
+
+
+
+
+
+
+
+
+
+ >
+
+ );
+}
diff --git a/fit-bite-web/app/product-images/Ghee Paratha with Dal Makhani.jpg b/fit-bite-web/app/product-images/Ghee Paratha with Dal Makhani.jpg
new file mode 100644
index 00000000..e2750c63
Binary files /dev/null and b/fit-bite-web/app/product-images/Ghee Paratha with Dal Makhani.jpg differ
diff --git a/fit-bite-web/app/product-images/Grilled Chicken with Stir-Fried Veggies.jpg b/fit-bite-web/app/product-images/Grilled Chicken with Stir-Fried Veggies.jpg
new file mode 100644
index 00000000..3f99e81b
Binary files /dev/null and b/fit-bite-web/app/product-images/Grilled Chicken with Stir-Fried Veggies.jpg differ
diff --git a/fit-bite-web/app/product-images/Moong Dal Chilla with Mint Chutney.jpg b/fit-bite-web/app/product-images/Moong Dal Chilla with Mint Chutney.jpg
new file mode 100644
index 00000000..28cb5f7d
Binary files /dev/null and b/fit-bite-web/app/product-images/Moong Dal Chilla with Mint Chutney.jpg differ
diff --git a/fit-bite-web/app/product-images/Paneer Bhurji with Multigrain Roti.jpg b/fit-bite-web/app/product-images/Paneer Bhurji with Multigrain Roti.jpg
new file mode 100644
index 00000000..b9576d2f
Binary files /dev/null and b/fit-bite-web/app/product-images/Paneer Bhurji with Multigrain Roti.jpg differ
diff --git a/fit-bite-web/app/product-images/Peanut Butter Banana Smoothie.jpg b/fit-bite-web/app/product-images/Peanut Butter Banana Smoothie.jpg
new file mode 100644
index 00000000..56594ffb
Binary files /dev/null and b/fit-bite-web/app/product-images/Peanut Butter Banana Smoothie.jpg differ
diff --git a/fit-bite-web/app/product-images/Sprouts Salad with Lemon Dressing.jpg b/fit-bite-web/app/product-images/Sprouts Salad with Lemon Dressing.jpg
new file mode 100644
index 00000000..07c0f3f0
Binary files /dev/null and b/fit-bite-web/app/product-images/Sprouts Salad with Lemon Dressing.jpg differ
diff --git a/fit-bite-web/app/product-images/testimages.jpg b/fit-bite-web/app/product-images/testimages.jpg
new file mode 100644
index 00000000..5684ad36
Binary files /dev/null and b/fit-bite-web/app/product-images/testimages.jpg differ
diff --git a/fit-bite-web/app/profile/page.jsx b/fit-bite-web/app/profile/page.jsx
new file mode 100644
index 00000000..f3ede37b
--- /dev/null
+++ b/fit-bite-web/app/profile/page.jsx
@@ -0,0 +1,28 @@
+import UserAddressCard from "../components/user-profile/UserAddressCard";
+import UserInfoCard from "../components/user-profile/UserInfoCard";
+import UserMetaCard from "../components/user-profile/UserMetaCard";
+import { Metadata } from "next";
+import React from "react";
+
+export const metadata = {
+ title: "Next.js Profile | TailAdmin - Next.js Dashboard Template",
+ description:
+ "This is Next.js Profile page for TailAdmin - Next.js Tailwind CSS Admin Dashboard Template",
+};
+
+export default function Profile() {
+ return (
+
+
+
+ Profile
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/fit-bite-web/app/signup/page.jsx b/fit-bite-web/app/signup/page.jsx
new file mode 100644
index 00000000..ea3c5ee2
--- /dev/null
+++ b/fit-bite-web/app/signup/page.jsx
@@ -0,0 +1,378 @@
+"use client";
+import { useState } from "react";
+import Image from "next/image";
+import Link from "next/link";
+import Script from 'next/script'
+import "../globals.css";
+import { ToastContainer, toast } from "react-toastify";
+import "react-toastify/dist/ReactToastify.css";
+import { useRouter } from "next/navigation";
+function LoginPage() {
+ const [submitted, setSubmitted] = useState(false);
+ const [errors, setErrors] = useState({ default: "default is required" });
+ const [isChecked, setIsChecked] = useState({ checked: false });
+ const router = useRouter();
+ const [formData, setFormData] = useState({
+ username: "",
+ ContactNumber: 0,
+ Address: "",
+ Email: "",
+ Password: "",
+ });
+
+ const handleCheckboxChange = () => {
+ // Toggle the value of isChecked when the checkbox is clicked
+ setIsChecked({ checked: !isChecked.checked });
+ };
+
+ // Handle input changes and update state
+ const handleInputChange = (e) => {
+ let name = e.target.name;
+ let value = e.target.value;
+
+ setFormData((prevData) => ({
+ ...prevData,
+ [name]: value,
+ }));
+
+ //Validation Logic Here
+ // const validationErrors = {};
+
+ // if (!formData.username) {
+ // validationErrors.username = "Username is required.";
+ // }
+ // if (!formData.ContactNumber) {
+ // validationErrors.ContactNumber = "Please enter your Contact Number.";
+ // }
+ // if (!formData.Email) {
+ // validationErrors.Email = "Please enter your Email for future updates.";
+ // }
+ // if (!formData.Address) {
+ // validationErrors.Address = "Address is required for delivery.";
+ // }
+
+ // if (!formData.Password) {
+ // validationErrors.Password = "Password is required.";
+ // }
+
+ // if (formData.Password.includes(formData.username)) {
+ // validationErrors.Password = "Username should not be used as a password.";
+ // }
+ // if (formData.Email.length > 1 && formData.Email.length < 10) {
+ // validationErrors.Email = "Please enter correct E-mail id";
+ // }
+ // if (formData.Email.length <= 1) {
+ // validationErrors.Email = "Please enter your Email for future updates.";
+ // }
+ // if (formData.ContactNumber.length < 10 || formData.ContactNumber.length > 10) {
+ // validationErrors.ContactNumber = "Please enter correct Contact Number";
+ // }
+
+ // if (Object.keys(validationErrors).length > 0) {
+ // setErrors(validationErrors);
+ // } else {
+ // setErrors(validationErrors);
+ // }
+ };
+ const isFormValid = () => {
+ // Check if there are any errors in the errors state
+ return Object.values(errors).every((error) => error === "");
+ };
+ // Handle form submission
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ setErrors({})
+ const validationErrors = {};
+
+ if (!formData.username) {
+ validationErrors.username = "Username is required.";
+ }
+ if (!formData.ContactNumber) {
+ validationErrors.ContactNumber = "Please enter your Contact Number.";
+ }
+ if (!formData.Email) {
+ validationErrors.Email = "Please enter your Email for future updates.";
+ }
+ if (!formData.Address) {
+ validationErrors.Address = "Address is required for delivery.";
+ }
+
+ if (!formData.Password) {
+ validationErrors.Password = "Password is required.";
+ }
+
+ if (formData.Password.includes(formData.username)) {
+ validationErrors.Password = "Username should not be used as a password.";
+ }
+ if (formData.Email.length > 1 && formData.Email.length < 10) {
+ validationErrors.Email = "Please enter correct E-mail id";
+ }
+ if (formData.Email.length < 1) {
+ validationErrors.Email = "Please enter your Email for future updates.";
+ }
+ if (
+ formData.ContactNumber.length > 0 &&
+ formData.ContactNumber.length < 10 ||
+ formData.ContactNumber.length > 10 || formData.ContactNumber.length < 0
+ ) {
+ validationErrors.ContactNumber = "Please enter correct Contact Number";
+ }
+
+ if (Object.keys(validationErrors).length > 0) {
+ setErrors(validationErrors);
+ }
+
+ // { "username": "Abhi",
+ // "ContactNumber": 679234567890,
+ // "Email": "abhi2y@email.com",
+ // "Password": "abhi",
+ // "Address": "PNT Colony"
+ // }
+
+ // Convert form data to JSON
+ const jsonDataFinal = JSON.stringify(formData, null, 2);
+ // console.log("String form Data Final", jsonDataFinal);
+ if (Object.keys(validationErrors).length == 0) {
+ try {
+ const response = await fetch("/api/signup", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: jsonDataFinal,
+ });
+
+ if (response.status === 200) {
+ setSubmitted(true);
+ // console.log("Form data submitted successfully", formData);
+ toast.success("😎 Account created successfully!", {
+ position: "bottom-center",
+ autoClose: 5000,
+ hideProgressBar: false,
+ closeOnClick: true,
+ pauseOnHover: true,
+ draggable: true,
+ progress: undefined,
+ theme: "dark",
+ });
+ setTimeout(() => {
+ router.replace("/login");
+ }, 3000);
+ setFormData({
+ username: "",
+ ContactNumber: 0,
+ Address: "",
+ Email: "",
+ Password: "",
+ });
+ } else {
+ console.error("Form submission failed");
+ }
+ } catch (error) {
+ console.error("Error:", error);
+ }}
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Already have an account?
+
+ Sign In
+
+
+
+
+ ©2023 Zomato. All rights reserved.
+
+
+
+
+ );
+}
+
+export default LoginPage;
diff --git a/fit-bite-web/app/test/page.jsx b/fit-bite-web/app/test/page.jsx
new file mode 100644
index 00000000..175b4378
--- /dev/null
+++ b/fit-bite-web/app/test/page.jsx
@@ -0,0 +1,96 @@
+"use client";
+import React, { useState } from "react";
+import { CldUploadWidget } from "next-cloudinary";
+function page() {
+ const [selectedFile, setSelectedFile] = useState(null);
+ const [preview, setPreview] = useState(null);
+ const [formData, setFormData] = useState({ name: "", price: "" });
+ const [uploading, setUploading] = useState(false);
+ const handleFileChange = (event) => {
+ const file = event.target.files?.[0];
+ if (file) {
+ setSelectedFile(file);
+ setPreview(URL.createObjectURL(file));
+ }
+ };
+ const handleChange = (event) => {
+ setFormData({ ...formData, [event.target.name]: event.target.value });
+ };
+
+ const handleSubmit = async (event) => {
+ event.preventDefault();
+
+ if (!selectedFile) {
+ alert("Please select an image before submitting.");
+ return;
+ }
+
+ setUploading(true);
+
+ try {
+ // Upload image to Cloudinary
+ // const imageUrl = await uploadImageToCloudinary(selectedFile);
+
+ // Submit form data to your backend
+ // const response = await axios.post("/api/products", {
+ // ...formData,
+ // imageUrl, // Save the Cloudinary URL in your database
+ // });
+
+ console.log("Product created:", response.data);
+ alert("Product added successfully!");
+
+ // Reset form
+ setFormData({ name: "", price: "" });
+ setSelectedFile(null);
+ setPreview(null);
+ } catch (error) {
+ console.error("Error submitting form:", error);
+ alert("Failed to upload image. Try again.");
+ } finally {
+ setUploading(false);
+ }
+ };
+function pushtoDb(results){
+
+}
+ return (
+
+
+
+ );
+}
+
+export default page;
diff --git a/fit-bite-web/app/testML/page.jsx b/fit-bite-web/app/testML/page.jsx
new file mode 100644
index 00000000..d490ed7a
--- /dev/null
+++ b/fit-bite-web/app/testML/page.jsx
@@ -0,0 +1,63 @@
+// app/page.js (or components/UploadForm.js)
+"use client";
+import { useState } from 'react';
+
+export default function UploadForm() {
+ const [file, setFile] = useState(null);
+ const [response, setResponse] = useState(null);
+ const [isUploading, setIsUploading] = useState(false);
+
+ const handleFileChange = (e) => {
+ setFile(e.target.files[0]);
+ };
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ if (!file) return;
+
+ setIsUploading(true);
+ const formData = new FormData();
+ formData.append('file', file);
+
+ try {
+ const res = await fetch('/api/testML', {
+ method: 'POST',
+ body: formData,
+ });
+ const data = await res.json();
+ setResponse(data);
+ } catch (error) {
+ setResponse({ error: error.message });
+ } finally {
+ setIsUploading(false);
+ }
+ };
+
+ return (
+
+
Upload Video
+
+
+ {response && (
+
+
Server Response:
+
{JSON.stringify(response, null, 2)}
+
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/fit-bite-web/app/testUrl/page.jsx b/fit-bite-web/app/testUrl/page.jsx
new file mode 100644
index 00000000..2d4fc834
--- /dev/null
+++ b/fit-bite-web/app/testUrl/page.jsx
@@ -0,0 +1,90 @@
+"use client"
+import { useEffect, useRef, useState } from "react";
+
+const VideoRecorder = () => {
+ const videoRef = useRef(null);
+ const mediaRecorderRef = useRef(null);
+ const [recording, setRecording] = useState(false);
+ const chunks = useRef([]);
+
+ useEffect(() => {
+ async function getCameraStream() {
+ try {
+ const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
+ if (videoRef.current) {
+ videoRef.current.srcObject = stream;
+ }
+ } catch (error) {
+ console.error("Error accessing webcam:", error);
+ }
+ }
+ getCameraStream();
+ }, []);
+
+ const startRecording = () => {
+ if (!videoRef.current || !videoRef.current.srcObject) return;
+
+ chunks.current = [];
+ const stream = videoRef.current.srcObject ;
+ const mediaRecorder = new MediaRecorder(stream);
+
+ mediaRecorder.ondataavailable = (event) => {
+ if (event.data.size > 0) {
+ chunks.current.push(event.data);
+ }
+ };
+
+ mediaRecorder.onstop = async () => {
+ const blob = new Blob(chunks.current, { type: "video/webm" });
+
+ // Convert Blob to File
+ const file = new File([blob], "recorded-video.webm", { type: "video/webm" });
+
+ // Upload video to API for saving
+ const formData = new FormData();
+ formData.append("video", file);
+
+ try {
+ const response = await fetch("/api/uploadVideo", {
+ method: "POST",
+ body: blob, // Send raw video data
+ });
+
+ const data = await response.json();
+ console.log(data.message, "Saved at:", data.filePath);
+ } catch (error) {
+ console.error("Error uploading video:", error);
+ }
+ };
+
+ mediaRecorderRef.current = mediaRecorder;
+ mediaRecorder.start();
+ setRecording(true);
+ };
+
+ const stopRecording = () => {
+ if (mediaRecorderRef.current) {
+ mediaRecorderRef.current.stop();
+ }
+ setRecording(false);
+ };
+
+ return (
+
+
+
+ {!recording ? (
+
+ ) : (
+
+ )}
+
+
+ );
+};
+
+export default VideoRecorder;
diff --git a/fit-bite-web/components.json b/fit-bite-web/components.json
new file mode 100644
index 00000000..78a12027
--- /dev/null
+++ b/fit-bite-web/components.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": true,
+ "tsx": false,
+ "tailwind": {
+ "config": "tailwind.config.js",
+ "css": "app/globals.css",
+ "baseColor": "slate",
+ "cssVariables": true
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils"
+ }
+}
\ No newline at end of file
diff --git a/fit-bite-web/jsconfig.json b/fit-bite-web/jsconfig.json
new file mode 100644
index 00000000..2a2e4b3b
--- /dev/null
+++ b/fit-bite-web/jsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./*"]
+ }
+ }
+}
diff --git a/fit-bite-web/lib/getStripe.js b/fit-bite-web/lib/getStripe.js
new file mode 100644
index 00000000..49b96b1f
--- /dev/null
+++ b/fit-bite-web/lib/getStripe.js
@@ -0,0 +1,9 @@
+import {loadStripe} from '@stripe/stripe-js'
+let stripePromise;
+const getStripe = ()=>{
+ if(!stripePromise){
+ stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE);
+ }
+ return stripePromise;
+}
+export default getStripe;
\ No newline at end of file
diff --git a/fit-bite-web/lib/mongodb.js b/fit-bite-web/lib/mongodb.js
new file mode 100644
index 00000000..e1dafc46
--- /dev/null
+++ b/fit-bite-web/lib/mongodb.js
@@ -0,0 +1,13 @@
+// import mongoose from "mongoose";
+// // const { Dessert } = require('./mongooseSchema');
+
+// const connectMongoDB = () => {
+// try{
+// mongoose.connect(process.env.MongoDB_URI)
+// console.log("Database Connected Successfully")
+// }catch(err){
+// console.log(err)
+// }
+
+// }
+// export default connectMongoDB
diff --git a/fit-bite-web/lib/utils.js b/fit-bite-web/lib/utils.js
new file mode 100644
index 00000000..7f739dc8
--- /dev/null
+++ b/fit-bite-web/lib/utils.js
@@ -0,0 +1,6 @@
+import { clsx } from "clsx"
+import { twMerge } from "tailwind-merge"
+
+export function cn(...inputs) {
+ return twMerge(clsx(inputs))
+}
diff --git a/fit-bite-web/next.config.js b/fit-bite-web/next.config.js
new file mode 100644
index 00000000..cd5b23df
--- /dev/null
+++ b/fit-bite-web/next.config.js
@@ -0,0 +1,23 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ images: {
+ domains: ["res.cloudinary.com"],
+ },
+
+}
+
+module.exports = {
+ webpackDevMiddleware: config => {
+ config.watchOptions = {
+ poll: 1000,
+ aggregateTimeout: 300,
+ };
+ config.plugins.push(
+ new webpack.HotModuleReplacementPlugin(),
+ new ReactRefreshWebpackPlugin(),
+ );
+ return config;
+ },
+ };
+
+module.exports = nextConfig
diff --git a/fit-bite-web/package-lock.json b/fit-bite-web/package-lock.json
new file mode 100644
index 00000000..0f8e610b
--- /dev/null
+++ b/fit-bite-web/package-lock.json
@@ -0,0 +1,7606 @@
+{
+ "name": "my-app",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "my-app",
+ "version": "0.1.0",
+ "dependencies": {
+ "@google/generative-ai": "^0.22.0",
+ "@radix-ui/react-popover": "^1.0.7",
+ "@react-google-maps/api": "^2.19.2",
+ "@react-jvectormap/core": "^1.0.4",
+ "@react-jvectormap/world": "^1.1.2",
+ "@stripe/stripe-js": "^2.2.0",
+ "apexcharts": "^4.4.0",
+ "autoprefixer": "10.4.15",
+ "axios": "^1.7.9",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.0.0",
+ "crypto-js": "^4.2.0",
+ "eslint-config-next": "13.4.19",
+ "flatpickr": "^4.6.13",
+ "form-data": "^4.0.2",
+ "formidable": "^3.5.2",
+ "jsonwebtoken": "^9.0.2",
+ "jvectormap-next": "^3.1.1",
+ "mongodb": "^6.1.0",
+ "mongoose": "^7.5.3",
+ "next": "^14.0.0",
+ "next-cloudinary": "^6.16.0",
+ "postcss": "8.4.29",
+ "prop-types": "^15.8.1",
+ "react": "18.2.0",
+ "react-apexcharts": "^1.7.0",
+ "react-dnd": "^16.0.1",
+ "react-dnd-html5-backend": "^16.0.1",
+ "react-dom": "18.2.0",
+ "react-dropzone": "^14.3.5",
+ "react-flatpickr": "^3.10.13",
+ "react-jvectormap": "^0.0.15",
+ "react-markdown": "^10.0.0",
+ "react-toastify": "^9.1.3",
+ "stripe": "^14.7.0",
+ "swiper": "^11.2.4",
+ "swr": "^2.2.5",
+ "tailwind-merge": "^1.14.0",
+ "tailwindcss": "3.3.3",
+ "tailwindcss-animate": "^1.0.7",
+ "use-places-autocomplete": "^4.0.1",
+ "webpack": "^5.89.0"
+ },
+ "devDependencies": {
+ "@types/react": "18.3.18",
+ "eslint": "^8.57.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-jsx-a11y": "^6.8.0",
+ "eslint-plugin-react": "^7.34.0",
+ "eslint-plugin-react-hooks": "^4.6.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz",
+ "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@cloudinary-util/types": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/@cloudinary-util/types/-/types-1.5.10.tgz",
+ "integrity": "sha512-n5lrm7SdAXhgWEbkSJKHZGnaoO9G/g4WYS6HYnq/k4nLj79sYfQZOoKjyR8hF2iyLRdLkT+qlk68RNFFv5tKew==",
+ "license": "MIT"
+ },
+ "node_modules/@cloudinary-util/url-loader": {
+ "version": "5.10.4",
+ "resolved": "https://registry.npmjs.org/@cloudinary-util/url-loader/-/url-loader-5.10.4.tgz",
+ "integrity": "sha512-gHkdvOaV+rlcwuIT7Vqd0ts/H5bsH4+bwFten/gIZ8oRjzdTBvgIY3R6F8bbJt0pFIEfpFEQLe4rPkl0NNqEWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@cloudinary-util/types": "1.5.10",
+ "@cloudinary-util/util": "3.3.2",
+ "@cloudinary/url-gen": "1.15.0",
+ "zod": "^3.22.4"
+ }
+ },
+ "node_modules/@cloudinary-util/url-loader/node_modules/@cloudinary-util/util": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@cloudinary-util/util/-/util-3.3.2.tgz",
+ "integrity": "sha512-Cc0iFxzfl7fcOXuznpeZFGYC885Of/vDgccRDnhTe/8Rf8YKv2PjLtezyo0VgmdA/CpeZy29NCXAsf6liokbwg==",
+ "license": "MIT"
+ },
+ "node_modules/@cloudinary-util/util": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@cloudinary-util/util/-/util-4.0.0.tgz",
+ "integrity": "sha512-S4xcou/3A7l5o+bcKlw2VHBNgwups7/0lbVDT/cO5YmtrcEYXgj6LGmwnjvpTm/x571VPVN8x5jWdT3rLZiKJQ==",
+ "license": "MIT"
+ },
+ "node_modules/@cloudinary/transformation-builder-sdk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@cloudinary/transformation-builder-sdk/-/transformation-builder-sdk-1.16.1.tgz",
+ "integrity": "sha512-Mh1qYMkoDxSAzbt0qY9NJaZrdH/vFBcrpeVWmbTXbPVDZHLaaLyJ2+RDFGger5lycbrehPLoNp2hh22BvhkvbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@cloudinary/url-gen": "^1.7.0"
+ }
+ },
+ "node_modules/@cloudinary/url-gen": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@cloudinary/url-gen/-/url-gen-1.15.0.tgz",
+ "integrity": "sha512-bjU67eZxLUgoRy/Plli4TQio7q6P31OYqnEgXxeN9TKXrzr6h0DeEdIUhKI9gy3HkEBWXWWJIPh7j7gkOJPnyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@cloudinary/transformation-builder-sdk": "^1.10.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz",
+ "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
+ "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.1"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz",
+ "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
+ "dependencies": {
+ "@floating-ui/core": "^1.0.0",
+ "@floating-ui/utils": "^0.2.0"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
+ "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.6.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
+ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
+ },
+ "node_modules/@google/generative-ai": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.22.0.tgz",
+ "integrity": "sha512-mLR3PDWCk5O/BWNyDvFDIiwKeXQmFGZ+kJFd9m73QrUPCFREttJyVbBPTW4y9CwTbaltLMDaLDfroCrRv5Bl8Q==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@googlemaps/js-api-loader": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.2.tgz",
+ "integrity": "sha512-psGw5u0QM6humao48Hn4lrChOM2/rA43ZCm3tKK9qQsEj1/VzqkCqnvGfEOshDbBQflydfaRovbKwZMF4AyqbA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "node_modules/@googlemaps/markerclusterer": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@googlemaps/markerclusterer/-/markerclusterer-2.3.2.tgz",
+ "integrity": "sha512-zb9OQP8XscZp2Npt1uQUYnGKu1miuq4DPP28JyDuFd6HV17HCEcjV9MtBi4muG/iVRXXvuHW9bRCnHbao9ITfw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "supercluster": "^8.0.1"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
+ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw=="
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+ "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.19",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+ "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mongodb-js/saslprep": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz",
+ "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==",
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.0.tgz",
+ "integrity": "sha512-cIKhxkfVELB6hFjYsbtEeTus2mwrTC+JissfZYM0n+8Fv+g8ucUfOlm3VEDtwtwydZ0Nuauv3bl0qF82nnCAqA=="
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "13.4.19",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz",
+ "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==",
+ "dependencies": {
+ "glob": "7.1.7"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.0.tgz",
+ "integrity": "sha512-HQKi159jCz4SRsPesVCiNN6tPSAFUkOuSkpJsqYTIlbHLKr1mD6be/J0TvWV6fwJekj81bZV9V/Tgx3C2HO9lA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.0.tgz",
+ "integrity": "sha512-4YyQLMSaCgX/kgC1jjF3s3xSoBnwHuDhnF6WA1DWNEYRsbOOPWjcYhv8TKhRe2ApdOam+VfQSffC4ZD+X4u1Cg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.0.tgz",
+ "integrity": "sha512-io7fMkJ28Glj7SH8yvnlD6naIhRDnDxeE55CmpQkj3+uaA2Hko6WGY2pT5SzpQLTnGGnviK85cy8EJ2qsETj/g==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.0.tgz",
+ "integrity": "sha512-nC2h0l1Jt8LEzyQeSs/BKpXAMe0mnHIMykYALWaeddTqCv5UEN8nGO3BG8JAqW/Y8iutqJsaMe2A9itS0d/r8w==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.0.tgz",
+ "integrity": "sha512-Wf+WjXibJQ7hHXOdNOmSMW5bxeJHVf46Pwb3eLSD2L76NrytQlif9NH7JpHuFlYKCQGfKfgSYYre5rIfmnSwQw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.0.tgz",
+ "integrity": "sha512-WTZb2G7B+CTsdigcJVkRxfcAIQj7Lf0ipPNRJ3vlSadU8f0CFGv/ST+sJwF5eSwIe6dxKoX0DG6OljDBaad+rg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.0.tgz",
+ "integrity": "sha512-7R8/x6oQODmNpnWVW00rlWX90sIlwluJwcvMT6GXNIBOvEf01t3fBg0AGURNKdTJg2xNuP7TyLchCL7Lh2DTiw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-ia32-msvc": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.0.tgz",
+ "integrity": "sha512-RLK1nELvhCnxaWPF07jGU4x3tjbyx2319q43loZELqF0+iJtKutZ+Lk8SVmf/KiJkYBc7Cragadz7hb3uQvz4g==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.0.tgz",
+ "integrity": "sha512-g6hLf1SUko+hnnaywQQZzzb3BRecQsoKkF3o/C+F+dOA4w/noVAJngUVkfwF0+2/8FzNznM7ofM6TGZO9svn7w==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz",
+ "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz",
+ "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
+ "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz",
+ "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz",
+ "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-escape-keydown": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz",
+ "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz",
+ "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz",
+ "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popover": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz",
+ "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "1.0.1",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-dismissable-layer": "1.0.5",
+ "@radix-ui/react-focus-guards": "1.0.1",
+ "@radix-ui/react-focus-scope": "1.0.4",
+ "@radix-ui/react-id": "1.0.1",
+ "@radix-ui/react-popper": "1.1.3",
+ "@radix-ui/react-portal": "1.0.4",
+ "@radix-ui/react-presence": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-slot": "1.0.2",
+ "@radix-ui/react-use-controllable-state": "1.0.1",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.5.5"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz",
+ "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.0.3",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-context": "1.0.1",
+ "@radix-ui/react-primitive": "1.0.3",
+ "@radix-ui/react-use-callback-ref": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1",
+ "@radix-ui/react-use-rect": "1.0.1",
+ "@radix-ui/react-use-size": "1.0.1",
+ "@radix-ui/rect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz",
+ "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "1.0.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz",
+ "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz",
+ "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "1.0.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
+ "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
+ "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz",
+ "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz",
+ "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz",
+ "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz",
+ "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/rect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz",
+ "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "1.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz",
+ "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@react-dnd/asap": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz",
+ "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==",
+ "license": "MIT"
+ },
+ "node_modules/@react-dnd/invariant": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz",
+ "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==",
+ "license": "MIT"
+ },
+ "node_modules/@react-dnd/shallowequal": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz",
+ "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==",
+ "license": "MIT"
+ },
+ "node_modules/@react-google-maps/api": {
+ "version": "2.19.2",
+ "resolved": "https://registry.npmjs.org/@react-google-maps/api/-/api-2.19.2.tgz",
+ "integrity": "sha512-Vt57XWzCKfsUjKOmFUl2erVVfOePkPK5OigF/f+q7UuV/Nm9KDDy1PMFBx+wNahEqOd6a32BxfsykEhBnbU9wQ==",
+ "dependencies": {
+ "@googlemaps/js-api-loader": "1.16.2",
+ "@googlemaps/markerclusterer": "2.3.2",
+ "@react-google-maps/infobox": "2.19.2",
+ "@react-google-maps/marker-clusterer": "2.19.2",
+ "@types/google.maps": "3.53.5",
+ "invariant": "2.2.4"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17 || ^18",
+ "react-dom": "^16.8 || ^17 || ^18"
+ }
+ },
+ "node_modules/@react-google-maps/infobox": {
+ "version": "2.19.2",
+ "resolved": "https://registry.npmjs.org/@react-google-maps/infobox/-/infobox-2.19.2.tgz",
+ "integrity": "sha512-6wvBqeJsQ/eFSvoxg+9VoncQvNoVCdmxzxRpLvmjPD+nNC6mHM0vJH1xSqaKijkMrfLJT0nfkTGpovrF896jwg=="
+ },
+ "node_modules/@react-google-maps/marker-clusterer": {
+ "version": "2.19.2",
+ "resolved": "https://registry.npmjs.org/@react-google-maps/marker-clusterer/-/marker-clusterer-2.19.2.tgz",
+ "integrity": "sha512-x9ibmsP0ZVqzyCo1Pitbw+4b6iEXRw/r1TCy3vOUR3eKrzWLnHYZMR325BkZW2r8fnuWE/V3Fp4QZOP9qYORCw=="
+ },
+ "node_modules/@react-jvectormap/core": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@react-jvectormap/core/-/core-1.0.4.tgz",
+ "integrity": "sha512-PefUtLG2Uwu6YVMldTqZCaVu5G+4wS3iQDq5aAV/jY/h8+djIgdSKWb1hEsHk/vb0s2pwallS+VvU7N2xCMncA==",
+ "license": "ISC",
+ "dependencies": {
+ "@react-jvectormap/lib": "^1.0.3",
+ "classnames": "^2.3.1"
+ },
+ "peerDependencies": {
+ "jquery": "^3.6",
+ "react": "^16.8 || ^17 || ^18",
+ "react-dom": "^16.8 || ^17 || ^18"
+ }
+ },
+ "node_modules/@react-jvectormap/jquery-mousewheel": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@react-jvectormap/jquery-mousewheel/-/jquery-mousewheel-1.0.2.tgz",
+ "integrity": "sha512-AmRnBdJfBjDUHreEDDs9qaSo3Q/6oC74m321VuzxkDX6ideVks2n2ouGiMcXq41GdJQoCUzSjfF8KyocL6M+SA==",
+ "license": "MIT",
+ "dependencies": {
+ "jquery": "^3.6.0"
+ }
+ },
+ "node_modules/@react-jvectormap/lib": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@react-jvectormap/lib/-/lib-1.0.3.tgz",
+ "integrity": "sha512-EdPYen5GGrny7Mxc8IYvXtSdjTr3EfWjGCXuy6+0Yz9wZDmCfLFfjmuEOZirhe00BJOzi2LpnYMSp0WaJ2BH7Q==",
+ "license": "(AGPL OR Commercial)",
+ "dependencies": {
+ "@react-jvectormap/jquery-mousewheel": "^1.0.2"
+ }
+ },
+ "node_modules/@react-jvectormap/world": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@react-jvectormap/world/-/world-1.1.2.tgz",
+ "integrity": "sha512-jDSy64DZz4mzEOrVni1zV5rak65+1WZhSGsvAvzHNIMHVx+tdD8R5OikyWUjYte8nxIkOUhQZtVJMK7VOIsmQA==",
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.3.tgz",
+ "integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw=="
+ },
+ "node_modules/@stripe/stripe-js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-2.2.0.tgz",
+ "integrity": "sha512-YyXQbsXvnNRJ6MofFhCLIQ4W7UpfkfSOQhjIaHEiCMBv3IBxhzugXiYNNzceGTK/7DL31v7HtTnkJ+FI+6AIow=="
+ },
+ "node_modules/@svgdotjs/svg.draggable.js": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz",
+ "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@svgdotjs/svg.js": "^3.2.4"
+ }
+ },
+ "node_modules/@svgdotjs/svg.filter.js": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.8.tgz",
+ "integrity": "sha512-YshF2YDaeRA2StyzAs5nUPrev7npQ38oWD0eTRwnsciSL2KrRPMoUw8BzjIXItb3+dccKGTX3IQOd2NFzmHkog==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgdotjs/svg.js": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/@svgdotjs/svg.js": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz",
+ "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Fuzzyma"
+ }
+ },
+ "node_modules/@svgdotjs/svg.resize.js": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz",
+ "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18"
+ },
+ "peerDependencies": {
+ "@svgdotjs/svg.js": "^3.2.4",
+ "@svgdotjs/svg.select.js": "^4.0.1"
+ }
+ },
+ "node_modules/@svgdotjs/svg.select.js": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz",
+ "integrity": "sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18"
+ },
+ "peerDependencies": {
+ "@svgdotjs/svg.js": "^3.2.4"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
+ "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.44.6",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz",
+ "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.6",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz",
+ "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz",
+ "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw=="
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/google.maps": {
+ "version": "3.53.5",
+ "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.53.5.tgz",
+ "integrity": "sha512-HoRq4Te8J6krH7hj+TfdYepqegoKZCj3kkaK5gf+ySFSHLvyqYkDvkrtbcVJXQ6QBphQ0h1TF7p4J6sOh4r/zg=="
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.14",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz",
+ "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw=="
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "20.7.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz",
+ "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz",
+ "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/webidl-conversions": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.1.tgz",
+ "integrity": "sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg=="
+ },
+ "node_modules/@types/whatwg-url": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+ "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.6.0.tgz",
+ "integrity": "sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.6.0",
+ "@typescript-eslint/types": "6.6.0",
+ "@typescript-eslint/typescript-estree": "6.6.0",
+ "@typescript-eslint/visitor-keys": "6.6.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz",
+ "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==",
+ "dependencies": {
+ "@typescript-eslint/types": "6.6.0",
+ "@typescript-eslint/visitor-keys": "6.6.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz",
+ "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==",
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz",
+ "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==",
+ "dependencies": {
+ "@typescript-eslint/types": "6.6.0",
+ "@typescript-eslint/visitor-keys": "6.6.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz",
+ "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==",
+ "dependencies": {
+ "@typescript-eslint/types": "6.6.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+ "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+ "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+ "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+ "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+ "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+ "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+ "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/helper-wasm-section": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-opt": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6",
+ "@webassemblyjs/wast-printer": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+ "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+ "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+ "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+ "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+ },
+ "node_modules/@yr/monotone-cubic-spline": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
+ "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==",
+ "license": "MIT"
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/apexcharts": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.4.0.tgz",
+ "integrity": "sha512-JGsHeQEKDlQh1rob8aBai9/HKvXIpbZ83TnobKZAcdOELf+oQZaxZyAnbbldr6PPBdCgG2zzzLaP1dtEsJxzWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgdotjs/svg.draggable.js": "^3.0.4",
+ "@svgdotjs/svg.filter.js": "^3.0.8",
+ "@svgdotjs/svg.js": "^3.2.4",
+ "@svgdotjs/svg.resize.js": "^2.0.2",
+ "@svgdotjs/svg.select.js": "^4.0.1",
+ "@yr/monotone-cubic-spline": "^1.0.3"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
+ "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
+ "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz",
+ "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
+ "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.toreversed": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
+ "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
+ "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.1.0",
+ "es-shim-unscopables": "^1.0.2"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="
+ },
+ "node_modules/asynciterator.prototype": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
+ "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/attr-accept": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz",
+ "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.15",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz",
+ "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.10",
+ "caniuse-lite": "^1.0.30001520",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz",
+ "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz",
+ "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
+ "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001541",
+ "electron-to-chromium": "^1.4.535",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bson": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-6.1.0.tgz",
+ "integrity": "sha512-yiQ3KxvpVoRpx1oD1uPz4Jit9tAVTJgjdmjDKtUErkOoL9VNoF8Dd58qtAOL5E40exx2jvAT9sqdRSK/r+SHlA==",
+ "engines": {
+ "node": ">=16.20.1"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001564",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz",
+ "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz",
+ "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==",
+ "dependencies": {
+ "clsx": "2.0.0"
+ },
+ "funding": {
+ "url": "https://joebell.co.uk"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "license": "MIT"
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
+ },
+ "node_modules/clsx": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
+ "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+ "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dezalgo": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
+ "license": "ISC",
+ "dependencies": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "node_modules/dnd-core": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz",
+ "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-dnd/asap": "^5.0.1",
+ "@react-dnd/invariant": "^4.0.1",
+ "redux": "^4.2.0"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.593",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.593.tgz",
+ "integrity": "sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+ "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz",
+ "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.1",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.0",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.5",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.17",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz",
+ "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==",
+ "dependencies": {
+ "asynciterator.prototype": "^1.0.0",
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.4",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.2",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz",
+ "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q=="
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+ "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.0",
+ "@humanwhocodes/config-array": "^0.11.14",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-airbnb": {
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
+ "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
+ "dev": true,
+ "dependencies": {
+ "eslint-config-airbnb-base": "^15.0.0",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5"
+ },
+ "engines": {
+ "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.28.0",
+ "eslint-plugin-react-hooks": "^4.3.0"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "dependencies": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.2"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "13.4.19",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz",
+ "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==",
+ "dependencies": {
+ "@next/eslint-plugin-next": "13.4.19",
+ "@rushstack/eslint-patch": "^1.1.3",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.31.7",
+ "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz",
+ "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "enhanced-resolve": "^5.12.0",
+ "eslint-module-utils": "^2.7.4",
+ "fast-glob": "^3.3.1",
+ "get-tsconfig": "^4.5.0",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.29.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
+ "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+ "dependencies": {
+ "array-includes": "^3.1.7",
+ "array.prototype.findlastindex": "^1.2.3",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.8.0",
+ "hasown": "^2.0.0",
+ "is-core-module": "^2.13.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.7",
+ "object.groupby": "^1.0.1",
+ "object.values": "^1.1.7",
+ "semver": "^6.3.1",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz",
+ "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "aria-query": "^5.3.0",
+ "array-includes": "^3.1.7",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "=4.7.0",
+ "axobject-query": "^3.2.1",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "es-iterator-helpers": "^1.0.15",
+ "hasown": "^2.0.0",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.7",
+ "object.fromentries": "^2.0.7"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.34.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz",
+ "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==",
+ "dependencies": {
+ "array-includes": "^3.1.7",
+ "array.prototype.findlast": "^1.2.4",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.toreversed": "^1.1.2",
+ "array.prototype.tosorted": "^1.1.3",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.17",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.7",
+ "object.fromentries": "^2.0.7",
+ "object.hasown": "^1.1.3",
+ "object.values": "^1.1.7",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.10"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/file-selector": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz",
+ "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.7.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
+ "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
+ "dependencies": {
+ "flatted": "^3.2.7",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/flatpickr": {
+ "version": "4.6.13",
+ "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz",
+ "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==",
+ "license": "MIT"
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz",
+ "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==",
+ "license": "MIT",
+ "dependencies": {
+ "dezalgo": "^1.0.4",
+ "hexoid": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
+ "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz",
+ "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.3.tgz",
+ "integrity": "sha512-pdpkP8YD4v+qMKn2lnKSiJvZvb3FunDmFYQvVOsoO08+eTNWdaWKPMrC5wwNICtU3dQWHhElj5Sf5jPEnv4qJg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hexoid": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz",
+ "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/html-url-attributes": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
+ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
+ "license": "MIT"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
+ "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.19.3",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz",
+ "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/jquery": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+ "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+ "license": "MIT"
+ },
+ "node_modules/jquery-mousewheel": {
+ "version": "3.1.13",
+ "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz",
+ "integrity": "sha512-GXhSjfOPyDemM005YCEHvzrEALhKDIswtxSHSR2e4K/suHVJKJxxRCGz3skPjNxjJjQa9AVSGGlYjv1M3VLIPg=="
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
+ },
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/jvectormap-next": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/jvectormap-next/-/jvectormap-next-3.1.1.tgz",
+ "integrity": "sha512-Eo9yJLMvfq5gtO736udb8pQnGKNCEB/LQpX8LElgEeEa4EZDABPCReaFqM0QPce9VNI9X+Um/yvhyzoPaASAyQ==",
+ "license": "(AGPL OR Commercial)",
+ "dependencies": {
+ "jquery": ">=1.7"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/kareem": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
+ "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/kdbush": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
+ "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA=="
+ },
+ "node_modules/keyv": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
+ "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w=="
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "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=="
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz",
+ "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz",
+ "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz",
+ "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mongodb": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
+ "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
+ "dependencies": {
+ "@mongodb-js/saslprep": "^1.1.0",
+ "bson": "^6.1.0",
+ "mongodb-connection-string-url": "^2.6.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": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+ "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+ "dependencies": {
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "node_modules/mongoose": {
+ "version": "7.6.7",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.7.tgz",
+ "integrity": "sha512-6Ihl7Y7OlSEMiwyjar3N8sMKRZa3LNGcayES8I+Hluo0sV6j1SVOo8MXXnwi+z3+Hcyk4zO47+xL87fBTNlWVw==",
+ "dependencies": {
+ "bson": "^5.5.0",
+ "kareem": "2.5.1",
+ "mongodb": "5.9.1",
+ "mpath": "0.9.0",
+ "mquery": "5.0.0",
+ "ms": "2.1.3",
+ "sift": "16.0.1"
+ },
+ "engines": {
+ "node": ">=14.20.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mongoose"
+ }
+ },
+ "node_modules/mongoose/node_modules/bson": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz",
+ "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==",
+ "engines": {
+ "node": ">=14.20.1"
+ }
+ },
+ "node_modules/mongoose/node_modules/mongodb": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.1.tgz",
+ "integrity": "sha512-NBGA8AfJxGPeB12F73xXwozt8ZpeIPmCUeWRwl9xejozTXFes/3zaep9zhzs1B/nKKsw4P3I4iPfXl3K7s6g+Q==",
+ "dependencies": {
+ "bson": "^5.5.0",
+ "mongodb-connection-string-url": "^2.6.0",
+ "socks": "^2.7.1"
+ },
+ "engines": {
+ "node": ">=14.20.1"
+ },
+ "optionalDependencies": {
+ "@mongodb-js/saslprep": "^1.1.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-providers": "^3.188.0",
+ "@mongodb-js/zstd": "^1.0.0",
+ "kerberos": "^1.0.0 || ^2.0.0",
+ "mongodb-client-encryption": ">=2.3.0 <3",
+ "snappy": "^7.2.2"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-providers": {
+ "optional": true
+ },
+ "@mongodb-js/zstd": {
+ "optional": true
+ },
+ "kerberos": {
+ "optional": true
+ },
+ "mongodb-client-encryption": {
+ "optional": true
+ },
+ "snappy": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mongoose/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=="
+ },
+ "node_modules/mpath": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
+ "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
+ "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==",
+ "dependencies": {
+ "debug": "4.x"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "node_modules/next": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/next/-/next-14.0.0.tgz",
+ "integrity": "sha512-J0jHKBJpB9zd4+c153sair0sz44mbaCHxggs8ryVXSFBuBqJ8XdE9/ozoV85xGh2VnSjahwntBZZgsihL9QznA==",
+ "dependencies": {
+ "@next/env": "14.0.0",
+ "@swc/helpers": "0.5.2",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001406",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.1",
+ "watchpack": "2.4.0"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=18.17.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "14.0.0",
+ "@next/swc-darwin-x64": "14.0.0",
+ "@next/swc-linux-arm64-gnu": "14.0.0",
+ "@next/swc-linux-arm64-musl": "14.0.0",
+ "@next/swc-linux-x64-gnu": "14.0.0",
+ "@next/swc-linux-x64-musl": "14.0.0",
+ "@next/swc-win32-arm64-msvc": "14.0.0",
+ "@next/swc-win32-ia32-msvc": "14.0.0",
+ "@next/swc-win32-x64-msvc": "14.0.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next-cloudinary": {
+ "version": "6.16.0",
+ "resolved": "https://registry.npmjs.org/next-cloudinary/-/next-cloudinary-6.16.0.tgz",
+ "integrity": "sha512-gbw/A1aBHJBC2thm4/veI77IkmbAQXuRUj8kNEuxf1zgjGkUWkShho/cXS4VsFhnHuDieqb30gMjZnZdBDrQ/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@cloudinary-util/types": "1.5.10",
+ "@cloudinary-util/url-loader": "5.10.4",
+ "@cloudinary-util/util": "4.0.0"
+ },
+ "peerDependencies": {
+ "next": "^12 || ^13 || ^14 || >=15.0.0-rc || ^15",
+ "react": "^17 || ^18 || >=19.0.0-beta || ^19"
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
+ "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+ "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
+ "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
+ "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
+ "dependencies": {
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
+ "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.29",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz",
+ "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz",
+ "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
+ "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-apexcharts": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.7.0.tgz",
+ "integrity": "sha512-03oScKJyNLRf0Oe+ihJxFZliBQM9vW3UWwomVn4YVRTN1jsIR58dLWt0v1sb8RwJVHDMbeHiKQueM0KGpn7nOA==",
+ "license": "MIT",
+ "dependencies": {
+ "prop-types": "^15.8.1"
+ },
+ "peerDependencies": {
+ "apexcharts": ">=4.0.0",
+ "react": ">=0.13"
+ }
+ },
+ "node_modules/react-dnd": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz",
+ "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-dnd/invariant": "^4.0.1",
+ "@react-dnd/shallowequal": "^4.0.1",
+ "dnd-core": "^16.0.1",
+ "fast-deep-equal": "^3.1.3",
+ "hoist-non-react-statics": "^3.3.2"
+ },
+ "peerDependencies": {
+ "@types/hoist-non-react-statics": ">= 3.3.1",
+ "@types/node": ">= 12",
+ "@types/react": ">= 16",
+ "react": ">= 16.14"
+ },
+ "peerDependenciesMeta": {
+ "@types/hoist-non-react-statics": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-dnd-html5-backend": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz",
+ "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==",
+ "license": "MIT",
+ "dependencies": {
+ "dnd-core": "^16.0.1"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-dropzone": {
+ "version": "14.3.5",
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz",
+ "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "attr-accept": "^2.2.4",
+ "file-selector": "^2.1.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8 || 18.0.0"
+ }
+ },
+ "node_modules/react-flatpickr": {
+ "version": "3.10.13",
+ "resolved": "https://registry.npmjs.org/react-flatpickr/-/react-flatpickr-3.10.13.tgz",
+ "integrity": "sha512-4m+K1K8jhvRFI8J/AHmQfA5hLALzhebEtEK8mLevXjX24MV3u502crzBn+EGFIBOfNUtrL5PId9FsGwgtuz/og==",
+ "license": "MIT",
+ "dependencies": {
+ "flatpickr": "^4.6.2",
+ "prop-types": "^15.5.10"
+ },
+ "peerDependencies": {
+ "react": ">=16, <=18"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-jvectormap": {
+ "version": "0.0.15",
+ "resolved": "https://registry.npmjs.org/react-jvectormap/-/react-jvectormap-0.0.15.tgz",
+ "integrity": "sha512-Ir1avrt42Kk2FzhQ4cnXM+MocObRNez/A0fz+7Rz3NRC9Jch0/sl4jkpm42oaNfJsvSYggXX2zXBMiC1Orl1sw==",
+ "license": "MIT",
+ "dependencies": {
+ "jquery": "^3.4.0",
+ "jquery-mousewheel": "^3.1.13",
+ "jvectormap-next": "^3.0.0",
+ "prop-types": "^15.6.0"
+ },
+ "peerDependencies": {
+ "react": ">=0.14",
+ "react-dom": ">=0.14"
+ }
+ },
+ "node_modules/react-markdown": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.0.0.tgz",
+ "integrity": "sha512-4mTz7Sya/YQ1jYOrkwO73VcFdkFJ8L8I9ehCxdcV0XrClHyOJGKbBk5FR4OOOG+HnyKw5u+C/Aby9TwinCteYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
+ "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.3",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.5.tgz",
+ "integrity": "sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==",
+ "dependencies": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-toastify": {
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz",
+ "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==",
+ "dependencies": {
+ "clsx": "^1.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16",
+ "react-dom": ">=16"
+ }
+ },
+ "node_modules/react-toastify/node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz",
+ "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.0.0",
+ "get-intrinsic": "^1.2.3",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+ "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz",
+ "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
+ "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz",
+ "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "get-intrinsic": "^1.2.2",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
+ "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
+ "dependencies": {
+ "define-data-property": "^1.1.2",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/sift": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
+ "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+ "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "dependencies": {
+ "ip": "^2.0.0",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
+ "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "regexp.prototype.flags": "^1.5.0",
+ "set-function-name": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
+ "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
+ "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
+ "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stripe": {
+ "version": "14.7.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.7.0.tgz",
+ "integrity": "sha512-A6XWH76K0K7IgEBz4odIVxjhkdPduSPafZju6ltAFU0oMbWJlfeaDyMTfRJ9vcYA9zqENfwRizExD/2nZ4rQ1A==",
+ "dependencies": {
+ "@types/node": ">=8.1.0",
+ "qs": "^6.11.0"
+ },
+ "engines": {
+ "node": ">=12.*"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
+ "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.4"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
+ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
+ "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supercluster": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz",
+ "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==",
+ "dependencies": {
+ "kdbush": "^4.0.2"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/swiper": {
+ "version": "11.2.4",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.4.tgz",
+ "integrity": "sha512-DTtglrsFfMYytid+oNy4QI3t2N2+XhhwSYbnyOhlwBmvY8Bkoj3ombK1/b80w8vDpQ+Lqlnbm+0737+i32MrcA==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/swiperjs"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.7.0"
+ }
+ },
+ "node_modules/swr": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz",
+ "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==",
+ "dependencies": {
+ "client-only": "^0.0.1",
+ "use-sync-external-store": "^1.2.0"
+ },
+ "peerDependencies": {
+ "react": "^16.11.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/tailwind-merge": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz",
+ "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
+ "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss-animate": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
+ "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.24.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz",
+ "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.9",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+ "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.16.8"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz",
+ "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==",
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz",
+ "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
+ "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz",
+ "integrity": "sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-places-autocomplete": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/use-places-autocomplete/-/use-places-autocomplete-4.0.1.tgz",
+ "integrity": "sha512-AybOR/qzXcdaMCGSFveycfL3kztwseAOdagbYoJD8c3amll+gEiPmUkSNhYNUEBqbR+JmJG6/oBTRgihNbE+1A==",
+ "peerDependencies": {
+ "react": ">= 16.8.0"
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.89.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
+ "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^1.0.0",
+ "@webassemblyjs/ast": "^1.11.5",
+ "@webassemblyjs/wasm-edit": "^1.11.5",
+ "@webassemblyjs/wasm-parser": "^1.11.5",
+ "acorn": "^8.7.1",
+ "acorn-import-assertions": "^1.9.0",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.15.0",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.2.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.7",
+ "watchpack": "^2.4.0",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
+ "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
+ "dependencies": {
+ "function.prototype.name": "^1.1.5",
+ "has-tostringtag": "^1.0.0",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.0.5",
+ "is-finalizationregistry": "^1.0.2",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.1.4",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "dependencies": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
+ "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.6",
+ "call-bind": "^1.0.5",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/yaml": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz",
+ "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.24.2",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz",
+ "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/fit-bite-web/package.json b/fit-bite-web/package.json
new file mode 100644
index 00000000..d1352ae8
--- /dev/null
+++ b/fit-bite-web/package.json
@@ -0,0 +1,65 @@
+{
+ "name": "my-app",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "stripe:listen": "stripe listen --forward-to localhost:3000/api/webhooks/stripe"
+ },
+ "dependencies": {
+ "@google/generative-ai": "^0.22.0",
+ "@radix-ui/react-popover": "^1.0.7",
+ "@react-google-maps/api": "^2.19.2",
+ "@react-jvectormap/core": "^1.0.4",
+ "@react-jvectormap/world": "^1.1.2",
+ "@stripe/stripe-js": "^2.2.0",
+ "apexcharts": "^4.4.0",
+ "autoprefixer": "10.4.15",
+ "axios": "^1.7.9",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.0.0",
+ "crypto-js": "^4.2.0",
+ "eslint-config-next": "13.4.19",
+ "flatpickr": "^4.6.13",
+ "form-data": "^4.0.2",
+ "formidable": "^3.5.2",
+ "jsonwebtoken": "^9.0.2",
+ "jvectormap-next": "^3.1.1",
+ "mongodb": "^6.1.0",
+ "mongoose": "^7.5.3",
+ "next": "^14.0.0",
+ "next-cloudinary": "^6.16.0",
+ "postcss": "8.4.29",
+ "prop-types": "^15.8.1",
+ "react": "18.2.0",
+ "react-apexcharts": "^1.7.0",
+ "react-dnd": "^16.0.1",
+ "react-dnd-html5-backend": "^16.0.1",
+ "react-dom": "18.2.0",
+ "react-dropzone": "^14.3.5",
+ "react-flatpickr": "^3.10.13",
+ "react-jvectormap": "^0.0.15",
+ "react-markdown": "^10.0.0",
+ "react-toastify": "^9.1.3",
+ "stripe": "^14.7.0",
+ "swiper": "^11.2.4",
+ "swr": "^2.2.5",
+ "tailwind-merge": "^1.14.0",
+ "tailwindcss": "3.3.3",
+ "tailwindcss-animate": "^1.0.7",
+ "use-places-autocomplete": "^4.0.1",
+ "webpack": "^5.89.0"
+ },
+ "devDependencies": {
+ "@types/react": "18.3.18",
+ "eslint": "^8.57.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-jsx-a11y": "^6.8.0",
+ "eslint-plugin-react": "^7.34.0",
+ "eslint-plugin-react-hooks": "^4.6.0"
+ }
+}
diff --git a/fit-bite-web/postcss.config.js b/fit-bite-web/postcss.config.js
new file mode 100644
index 00000000..33ad091d
--- /dev/null
+++ b/fit-bite-web/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/fit-bite-web/public/Ghee Paratha with Dal Makhani.jpg b/fit-bite-web/public/Ghee Paratha with Dal Makhani.jpg
new file mode 100644
index 00000000..e2750c63
Binary files /dev/null and b/fit-bite-web/public/Ghee Paratha with Dal Makhani.jpg differ
diff --git a/fit-bite-web/public/Grilled Chicken with Stir-Fried Veggies.jpg b/fit-bite-web/public/Grilled Chicken with Stir-Fried Veggies.jpg
new file mode 100644
index 00000000..3f99e81b
Binary files /dev/null and b/fit-bite-web/public/Grilled Chicken with Stir-Fried Veggies.jpg differ
diff --git a/fit-bite-web/public/Moong Dal Chilla with Mint Chutney.jpg b/fit-bite-web/public/Moong Dal Chilla with Mint Chutney.jpg
new file mode 100644
index 00000000..28cb5f7d
Binary files /dev/null and b/fit-bite-web/public/Moong Dal Chilla with Mint Chutney.jpg differ
diff --git a/fit-bite-web/public/Paneer Bhurji with Multigrain Roti.jpg b/fit-bite-web/public/Paneer Bhurji with Multigrain Roti.jpg
new file mode 100644
index 00000000..b9576d2f
Binary files /dev/null and b/fit-bite-web/public/Paneer Bhurji with Multigrain Roti.jpg differ
diff --git a/fit-bite-web/public/Peanut Butter Banana Smoothie.jpg b/fit-bite-web/public/Peanut Butter Banana Smoothie.jpg
new file mode 100644
index 00000000..56594ffb
Binary files /dev/null and b/fit-bite-web/public/Peanut Butter Banana Smoothie.jpg differ
diff --git a/fit-bite-web/public/Sprouts Salad with Lemon Dressing.jpg b/fit-bite-web/public/Sprouts Salad with Lemon Dressing.jpg
new file mode 100644
index 00000000..07c0f3f0
Binary files /dev/null and b/fit-bite-web/public/Sprouts Salad with Lemon Dressing.jpg differ
diff --git a/fit-bite-web/public/alert.svg b/fit-bite-web/public/alert.svg
new file mode 100644
index 00000000..f4b9c4e5
--- /dev/null
+++ b/fit-bite-web/public/alert.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/angle-down.svg b/fit-bite-web/public/angle-down.svg
new file mode 100644
index 00000000..32e95573
--- /dev/null
+++ b/fit-bite-web/public/angle-down.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/angle-left.svg b/fit-bite-web/public/angle-left.svg
new file mode 100644
index 00000000..e69de29b
diff --git a/fit-bite-web/public/angle-right.svg b/fit-bite-web/public/angle-right.svg
new file mode 100644
index 00000000..e69de29b
diff --git a/fit-bite-web/public/angle-up.svg b/fit-bite-web/public/angle-up.svg
new file mode 100644
index 00000000..71f074af
--- /dev/null
+++ b/fit-bite-web/public/angle-up.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/arrow-down.svg b/fit-bite-web/public/arrow-down.svg
new file mode 100644
index 00000000..92b036c7
--- /dev/null
+++ b/fit-bite-web/public/arrow-down.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/arrow-right.svg b/fit-bite-web/public/arrow-right.svg
new file mode 100644
index 00000000..593bd553
--- /dev/null
+++ b/fit-bite-web/public/arrow-right.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/arrow-up.svg b/fit-bite-web/public/arrow-up.svg
new file mode 100644
index 00000000..c0ef6427
--- /dev/null
+++ b/fit-bite-web/public/arrow-up.svg
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/fit-bite-web/public/audio.svg b/fit-bite-web/public/audio.svg
new file mode 100644
index 00000000..18e60ad0
--- /dev/null
+++ b/fit-bite-web/public/audio.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/bell.svg b/fit-bite-web/public/bell.svg
new file mode 100644
index 00000000..a6c6ee85
--- /dev/null
+++ b/fit-bite-web/public/bell.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/bolt.svg b/fit-bite-web/public/bolt.svg
new file mode 100644
index 00000000..ecb02a3f
--- /dev/null
+++ b/fit-bite-web/public/bolt.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/box-cube.svg b/fit-bite-web/public/box-cube.svg
new file mode 100644
index 00000000..5a36ea46
--- /dev/null
+++ b/fit-bite-web/public/box-cube.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/box-line.svg b/fit-bite-web/public/box-line.svg
new file mode 100644
index 00000000..57432fec
--- /dev/null
+++ b/fit-bite-web/public/box-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/box.svg b/fit-bite-web/public/box.svg
new file mode 100644
index 00000000..0fa3c19f
--- /dev/null
+++ b/fit-bite-web/public/box.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/calendar.svg b/fit-bite-web/public/calendar.svg
new file mode 100644
index 00000000..b424736b
--- /dev/null
+++ b/fit-bite-web/public/calendar.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/calender-line.svg b/fit-bite-web/public/calender-line.svg
new file mode 100644
index 00000000..227b0fe1
--- /dev/null
+++ b/fit-bite-web/public/calender-line.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/chat.svg b/fit-bite-web/public/chat.svg
new file mode 100644
index 00000000..678886a3
--- /dev/null
+++ b/fit-bite-web/public/chat.svg
@@ -0,0 +1,3 @@
+
diff --git a/fit-bite-web/public/check-circle.svg b/fit-bite-web/public/check-circle.svg
new file mode 100644
index 00000000..a77bb7af
--- /dev/null
+++ b/fit-bite-web/public/check-circle.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/check-line.svg b/fit-bite-web/public/check-line.svg
new file mode 100644
index 00000000..17b47864
--- /dev/null
+++ b/fit-bite-web/public/check-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/chevron-down.svg b/fit-bite-web/public/chevron-down.svg
new file mode 100644
index 00000000..88775fda
--- /dev/null
+++ b/fit-bite-web/public/chevron-down.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/fit-bite-web/public/chevron-left.svg b/fit-bite-web/public/chevron-left.svg
new file mode 100644
index 00000000..9409d16a
--- /dev/null
+++ b/fit-bite-web/public/chevron-left.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/chevron-up.svg b/fit-bite-web/public/chevron-up.svg
new file mode 100644
index 00000000..9bb13b96
--- /dev/null
+++ b/fit-bite-web/public/chevron-up.svg
@@ -0,0 +1,3 @@
+
diff --git a/fit-bite-web/public/close-line.svg b/fit-bite-web/public/close-line.svg
new file mode 100644
index 00000000..8ed1b2e9
--- /dev/null
+++ b/fit-bite-web/public/close-line.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/close.svg b/fit-bite-web/public/close.svg
new file mode 100644
index 00000000..6692f849
--- /dev/null
+++ b/fit-bite-web/public/close.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/copy.svg b/fit-bite-web/public/copy.svg
new file mode 100644
index 00000000..951dde49
--- /dev/null
+++ b/fit-bite-web/public/copy.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/docs.svg b/fit-bite-web/public/docs.svg
new file mode 100644
index 00000000..316264ab
--- /dev/null
+++ b/fit-bite-web/public/docs.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/dollar-line.svg b/fit-bite-web/public/dollar-line.svg
new file mode 100644
index 00000000..843955f8
--- /dev/null
+++ b/fit-bite-web/public/dollar-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/download.svg b/fit-bite-web/public/download.svg
new file mode 100644
index 00000000..a5889356
--- /dev/null
+++ b/fit-bite-web/public/download.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/envelope.svg b/fit-bite-web/public/envelope.svg
new file mode 100644
index 00000000..128cb87f
--- /dev/null
+++ b/fit-bite-web/public/envelope.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/eye-close.svg b/fit-bite-web/public/eye-close.svg
new file mode 100644
index 00000000..761523c1
--- /dev/null
+++ b/fit-bite-web/public/eye-close.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/eye.svg b/fit-bite-web/public/eye.svg
new file mode 100644
index 00000000..f9ff4204
--- /dev/null
+++ b/fit-bite-web/public/eye.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/favicon.ico b/fit-bite-web/public/favicon.ico
new file mode 100644
index 00000000..e1d7a862
Binary files /dev/null and b/fit-bite-web/public/favicon.ico differ
diff --git a/fit-bite-web/public/file.svg b/fit-bite-web/public/file.svg
new file mode 100644
index 00000000..840edf26
--- /dev/null
+++ b/fit-bite-web/public/file.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/folder.svg b/fit-bite-web/public/folder.svg
new file mode 100644
index 00000000..ba7056d0
--- /dev/null
+++ b/fit-bite-web/public/folder.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/grid.svg b/fit-bite-web/public/grid.svg
new file mode 100644
index 00000000..a66ab76f
--- /dev/null
+++ b/fit-bite-web/public/grid.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/group.svg b/fit-bite-web/public/group.svg
new file mode 100644
index 00000000..5d2898b6
--- /dev/null
+++ b/fit-bite-web/public/group.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/horizontal-dots.svg b/fit-bite-web/public/horizontal-dots.svg
new file mode 100644
index 00000000..d5234595
--- /dev/null
+++ b/fit-bite-web/public/horizontal-dots.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/info-hexa.svg b/fit-bite-web/public/info-hexa.svg
new file mode 100644
index 00000000..59ea9328
--- /dev/null
+++ b/fit-bite-web/public/info-hexa.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/info.svg b/fit-bite-web/public/info.svg
new file mode 100644
index 00000000..6ef176e7
--- /dev/null
+++ b/fit-bite-web/public/info.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/list.svg b/fit-bite-web/public/list.svg
new file mode 100644
index 00000000..93060bdf
--- /dev/null
+++ b/fit-bite-web/public/list.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/lock.svg b/fit-bite-web/public/lock.svg
new file mode 100644
index 00000000..a9afbe61
--- /dev/null
+++ b/fit-bite-web/public/lock.svg
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/logo.png b/fit-bite-web/public/logo.png
new file mode 100644
index 00000000..e1d7a862
Binary files /dev/null and b/fit-bite-web/public/logo.png differ
diff --git a/fit-bite-web/public/mail-line.svg b/fit-bite-web/public/mail-line.svg
new file mode 100644
index 00000000..2e8a46bd
--- /dev/null
+++ b/fit-bite-web/public/mail-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/more-dot.svg b/fit-bite-web/public/more-dot.svg
new file mode 100644
index 00000000..d99c76be
--- /dev/null
+++ b/fit-bite-web/public/more-dot.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/next.svg b/fit-bite-web/public/next.svg
new file mode 100644
index 00000000..5174b28c
--- /dev/null
+++ b/fit-bite-web/public/next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/page.svg b/fit-bite-web/public/page.svg
new file mode 100644
index 00000000..862c68a7
--- /dev/null
+++ b/fit-bite-web/public/page.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/paper-plane.svg b/fit-bite-web/public/paper-plane.svg
new file mode 100644
index 00000000..1e001964
--- /dev/null
+++ b/fit-bite-web/public/paper-plane.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/pencil.svg b/fit-bite-web/public/pencil.svg
new file mode 100644
index 00000000..6b94796b
--- /dev/null
+++ b/fit-bite-web/public/pencil.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/pie-chart.svg b/fit-bite-web/public/pie-chart.svg
new file mode 100644
index 00000000..8917ca9c
--- /dev/null
+++ b/fit-bite-web/public/pie-chart.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/plug-in.svg b/fit-bite-web/public/plug-in.svg
new file mode 100644
index 00000000..958e3e9a
--- /dev/null
+++ b/fit-bite-web/public/plug-in.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/plus.svg b/fit-bite-web/public/plus.svg
new file mode 100644
index 00000000..9241f555
--- /dev/null
+++ b/fit-bite-web/public/plus.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/shooting-star.svg b/fit-bite-web/public/shooting-star.svg
new file mode 100644
index 00000000..519f5d28
--- /dev/null
+++ b/fit-bite-web/public/shooting-star.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/table.svg b/fit-bite-web/public/table.svg
new file mode 100644
index 00000000..889bd896
--- /dev/null
+++ b/fit-bite-web/public/table.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/task-icon.svg b/fit-bite-web/public/task-icon.svg
new file mode 100644
index 00000000..9f1d0922
--- /dev/null
+++ b/fit-bite-web/public/task-icon.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/task.svg b/fit-bite-web/public/task.svg
new file mode 100644
index 00000000..52d9f4dc
--- /dev/null
+++ b/fit-bite-web/public/task.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/testimages.jpg b/fit-bite-web/public/testimages.jpg
new file mode 100644
index 00000000..5684ad36
Binary files /dev/null and b/fit-bite-web/public/testimages.jpg differ
diff --git a/fit-bite-web/public/time.svg b/fit-bite-web/public/time.svg
new file mode 100644
index 00000000..e8df4208
--- /dev/null
+++ b/fit-bite-web/public/time.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/trash.svg b/fit-bite-web/public/trash.svg
new file mode 100644
index 00000000..e42ce25b
--- /dev/null
+++ b/fit-bite-web/public/trash.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/user-circle.svg b/fit-bite-web/public/user-circle.svg
new file mode 100644
index 00000000..fa6c14ae
--- /dev/null
+++ b/fit-bite-web/public/user-circle.svg
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/fit-bite-web/public/user-line.svg b/fit-bite-web/public/user-line.svg
new file mode 100644
index 00000000..28280ae6
--- /dev/null
+++ b/fit-bite-web/public/user-line.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/vercel.svg b/fit-bite-web/public/vercel.svg
new file mode 100644
index 00000000..d2f84222
--- /dev/null
+++ b/fit-bite-web/public/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/public/videos.svg b/fit-bite-web/public/videos.svg
new file mode 100644
index 00000000..b8d69f17
--- /dev/null
+++ b/fit-bite-web/public/videos.svg
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/fit-bite-web/tailwind.config.js b/fit-bite-web/tailwind.config.js
new file mode 100644
index 00000000..c19098b1
--- /dev/null
+++ b/fit-bite-web/tailwind.config.js
@@ -0,0 +1,229 @@
+/** @type {import('tailwindcss').Config} */
+const defaultTheme = require("tailwindcss/defaultTheme");
+module.exports = {
+ darkMode: ["class"],
+ content: [
+ './pages/**/*.{js,jsx}',
+ './components/**/*.{js,jsx}',
+ './app/**/*.{js,jsx}',
+ './app/(root)/**/*.{js,jsx}',
+ './src/**/*.{js,jsx}',
+ ],
+ theme: {
+ fontFamily: {
+ outfit: ["Outfit", "sans-serif"],
+ },
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ screens: {
+ "2xsm": "375px",
+ xsm: "425px",
+ "3xl": "2000px",
+ ...defaultTheme.screens,
+ },
+ extend: {
+ size: {
+ "1.5": "0.375rem", // 6px (equivalent to `w-1.5 h-1.5`)
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: 0 },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: 0 },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ },
+ fontSize: {
+ "title-2xl": ["72px", "90px"],
+ "title-xl": ["60px", "72px"],
+ "title-lg": ["48px", "60px"],
+ "title-md": ["36px", "44px"],
+ "title-sm": ["30px", "38px"],
+ "theme-xl": ["20px", "30px"],
+ "theme-sm": ["14px", "20px"],
+ "theme-xs": ["12px", "18px"],
+ },
+ colors: {
+ current: "currentColor",
+ transparent: "transparent",
+ white: "#FFFFFF",
+ black: "#101828",
+ brand: {
+ 25: "#F2F7FF",
+ 50: "#ECF3FF",
+ 100: "#DDE9FF",
+ 200: "#C2D6FF",
+ 300: "#9CB9FF",
+ 400: "#7592FF",
+ 500: "#465FFF",
+ 600: "#3641F5",
+ 700: "#2A31D8",
+ 800: "#252DAE",
+ 900: "#262E89",
+ 950: "#161950",
+ },
+ "blue-light": {
+ 25: "#F5FBFF",
+ 50: "#F0F9FF",
+ 100: "#E0F2FE",
+ 200: "#B9E6FE",
+ 300: "#7CD4FD",
+ 400: "#36BFFA",
+ 500: "#0BA5EC",
+ 600: "#0086C9",
+ 700: "#026AA2",
+ 800: "#065986",
+ 900: "#0B4A6F",
+ 950: "#062C41",
+ },
+ gray: {
+ dark: "#1A2231",
+ 25: "#FCFCFD",
+ 50: "#F9FAFB",
+ 100: "#F2F4F7",
+ 200: "#E4E7EC",
+ 300: "#D0D5DD",
+ 400: "#98A2B3",
+ 500: "#667085",
+ 600: "#475467",
+ 700: "#344054",
+ 800: "#1D2939",
+ 900: "#101828",
+ 950: "#0C111D",
+ },
+ orange: {
+ 25: "#FFFAF5",
+ 50: "#FFF6ED",
+ 100: "#FFEAD5",
+ 200: "#FDDCAB",
+ 300: "#FEB273",
+ 400: "#FD853A",
+ 500: "#FB6514",
+ 600: "#EC4A0A",
+ 700: "#C4320A",
+ 800: "#9C2A10",
+ 900: "#7E2410",
+ 950: "#511C10",
+ },
+ success: {
+ 25: "#F6FEF9",
+ 50: "#ECFDF3",
+ 100: "#D1FADF",
+ 200: "#A6F4C5",
+ 300: "#6CE9A6",
+ 400: "#32D583",
+ 500: "#12B76A",
+ 600: "#039855",
+ 700: "#027A48",
+ 800: "#05603A",
+ 900: "#054F31",
+ 950: "#053321",
+ },
+ error: {
+ 25: "#FFFBFA",
+ 50: "#FEF3F2",
+ 100: "#FEE4E2",
+ 200: "#FECDCA",
+ 300: "#FDA29B",
+ 400: "#F97066",
+ 500: "#F04438",
+ 600: "#D92D20",
+ 700: "#B42318",
+ 800: "#912018",
+ 900: "#7A271A",
+ 950: "#55160C",
+ },
+ warning: {
+ 25: "#FFFCF5",
+ 50: "#FFFAEB",
+ 100: "#FEF0C7",
+ 200: "#FEDF89",
+ 300: "#FEC84B",
+ 400: "#FDB022",
+ 500: "#F79009",
+ 600: "#DC6803",
+ 700: "#B54708",
+ 800: "#93370D",
+ 900: "#7A2E0E",
+ 950: "#4E1D09",
+ },
+ "theme-pink": {
+ 500: "#EE46BC",
+ },
+ "theme-purple": {
+ 500: "#7A5AF8",
+ },
+ },
+ backgroundColor: ({ theme }) => ({
+ "brand-500-15": `rgba(70, 95, 255, 0.15)`, // Manually define with opacity
+ "brand-500-20": `rgba(70, 95, 255, 0.20)`,
+ }),
+ boxShadow: {
+ "theme-md":
+ "0px 4px 8px -2px rgba(16, 24, 40, 0.10), 0px 2px 4px -2px rgba(16, 24, 40, 0.06)",
+ "theme-lg":
+ "0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03)",
+
+ "theme-sm":
+ "0px 1px 3px 0px rgba(16, 24, 40, 0.10), 0px 1px 2px 0px rgba(16, 24, 40, 0.06)",
+ "theme-xs": "0px 1px 2px 0px rgba(16, 24, 40, 0.05)",
+ "theme-xl":
+ "0px 20px 24px -4px rgba(16, 24, 40, 0.08), 0px 8px 8px -4px rgba(16, 24, 40, 0.03)",
+ datepicker: "-5px 0 0 #262d3c, 5px 0 0 #262d3c",
+ "focus-ring": "0px 0px 0px 4px rgba(70, 95, 255, 0.12)",
+ "slider-navigation":
+ "0px 1px 2px 0px rgba(16, 24, 40, 0.10), 0px 1px 3px 0px rgba(16, 24, 40, 0.10)",
+ tooltip:
+ "0px 4px 6px -2px rgba(16, 24, 40, 0.05), -8px 0px 20px 8px rgba(16, 24, 40, 0.05)",
+ },
+ dropShadow: {
+ "4xl": [
+ "0 35px 35px rgba(0, 0, 0, 0.25)",
+ "0 45px 65px rgba(0, 0, 0, 0.15)",
+ ],
+ },
+ zIndex: {
+ 999999: "999999",
+ 99999: "99999",
+ 9999: "9999",
+ 999: "999",
+ 99: "99",
+ 9: "9",
+ 1: "1",
+ },
+ spacing: {
+ 4.5: "1.125rem",
+ 5.5: "1.375rem",
+ 6.5: "1.625rem",
+ 7.5: "1.875rem",
+ 8.5: "2.125rem",
+ 9.5: "2.375rem",
+ 10.5: "2.625rem",
+ 11.5: "2.875rem",
+ 12.5: "3.125rem",
+ 13: "3.25rem",
+ 13.5: "3.375rem",
+ 14.5: "3.625rem",
+ 15: "3.75rem",
+ },
+
+ },
+ },
+ plugins: [require("tailwindcss-animate")],
+}
\ No newline at end of file
diff --git a/fit-bite-web/tsconfig.json b/fit-bite-web/tsconfig.json
new file mode 100644
index 00000000..826fc21e
--- /dev/null
+++ b/fit-bite-web/tsconfig.json
@@ -0,0 +1,38 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./*"]
+ },
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "noEmit": true,
+ "incremental": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": [
+ "next-env.d.ts",
+ ".next/types/**/*.ts",
+ "**/*.ts",
+ "**/*.tsx"
+, "app/reuse/layout/Backdrop.jsx", "app/reuse/layout/SidebarWiapp/reuse/components1/ui/badge/Badge.jsxge/Bapp/reuse/context1/SidebarContext.jsxrConapp/reuse/context1/ThemeConapp/reuse/components1/icons/index.jsxponeapp/reuse/components1/header/NotificationDropdown.jsxNotiapp/reuse/components1/header/UserDropdown.jsx/heaapp/reuse/components1/ui/dropdown/Dropdown.jsxui/dapp/reuse/components1/ui/dropdown/DropdownItem.jsxropdapp/reuse/components1/ui/images/ResponsiveImage.jsxagesapp/reuse/components1/ui/images/ThreeColumnImageGrid.jsxThreapp/reuse/components1/ui/images/TwoColumnImageGrid.jsxs/Twapp/reuse/components1/ui/modal/index.jsxentsapp/reuse/components1/ui/table/index.jsxentsapp/reuse/components1/ui/video/VideosExample.jsx/vidapp/reuse/components1/ui/video/YouTubeEmbed.jsxi/viapp/reuse/components1/user-profile/UserAddressCard.jsxfileapp/reuse/components1/user-profile/UserInfoCard.jsxprofapp/reuse/components1/user-profile/UserMetaCard.jsxprofapp/reuse/components1/videos/FourIsToThree.jsxvideapp/reuse/components1/videos/OneIsToOne.jsxs1/vapp/reuse/components1/videos/SixteenIsToNine.jsxdeosapp/reuse/components1/videos/TwentyOneIsToNine.jsxos/Tapp/reuse/components1/ui/button/Button.jsxts1/app/reuse/components1/ui/avatar/Avatar.jsxts1/app/reuse/components1/ui/avatar/AvatarText.jsxui/aapp/reuse/components1/ui/alert/Alert.jsxentsapp/reuse/components1/form/Select.jsxponeapp/reuse/components1/form/MultiSelect.jsxts1/app/reuse/components1/form/Label.jsxmponapp/reuse/components1/form/Form.jsxompoapp/reuse/components1/form/switch/Switch.jsx1/foapp/reuse/components1/form/input/Checkbox.jsx/forapp/reuse/components1/form/input/FileInput.jsxformapp/reuse/components1/form/input/InputField.jsxorm/app/reuse/components1/form/input/Radio.jsxts1/app/reuse/components1/form/input/RadioSm.jsx1/foapp/reuse/components1/form/input/TextArea.jsx/forapp/reuse/components1/form/group-input/PhoneInput.jsxoup-app/reuse/components1/form/form-elements/CheckboxComponents.jsxs/Chapp/reuse/components1/form/form-elements/DefaultInputs.jsxemenapp/reuse/components1/form/form-elements/DropZone.jsxrm-eapp/reuse/components1/form/form-elements/FileInputExample.jsxnts/app/reuse/components1/form/form-elements/InputGroup.jsx-eleapp/reuse/components1/form/form-elements/InputStates.jsxelemapp/reuse/components1/form/form-elements/RadioButtons.jsxlemeapp/reuse/components1/form/form-elements/SelectInputs.jsxlemeapp/reuse/components1/form/form-elements/TextAreaInput.jsxemenapp/reuse/components1/form/form-elements/ToggleSwitch.jsxlemeapp/reuse/components1/form/example-form/BasicForm.jsxamplapp/reuse/components1/form/example-form/ExampleFormOne.jsx-forapp/reuse/components1/form/example-form/ExampleFormTwo.jsx-forapp/reuse/components1/form/example-form/ExampleFormWithIcon.jsx/Exaapp/reuse/components1/common/ChartTab.jsxnts1app/reuse/components1/common/ComponentCard.jsxcommapp/reuse/components1/common/GridShape.jsxts1/app/reuse/components1/common/PageBreadCrumb.jsxommoapp/reuse/components1/common/ThemeToggleButton.jsxon/Tapp/reuse/components1/charts/line/LineChartOne.jsxts/lapp/reuse/components1/charts/bar/BarChartOne.jsxartsapp/reuse/components1/calendar/Calendar.jsxs1/capp/reuse/components1/auth/SignInForm.jsxnts1app/reuse/components1/auth/SignUpForm.jsxnts1/auth/SignUpForm.jsx", "app/components/icons/index.jsx" ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/poseangle-app/PoseVideos/1.mov b/poseangle-app/PoseVideos/1.mov
new file mode 100755
index 00000000..2e9a6b01
Binary files /dev/null and b/poseangle-app/PoseVideos/1.mov differ
diff --git a/poseangle-app/dockerfile b/poseangle-app/dockerfile
new file mode 100755
index 00000000..fc8dd346
--- /dev/null
+++ b/poseangle-app/dockerfile
@@ -0,0 +1,25 @@
+# Use Python 3.10 as the base image
+FROM python:3.10
+
+# Set the working directory inside the container
+WORKDIR /app
+
+# Install required system dependencies (including OpenGL for OpenCV)
+RUN apt-get update && apt-get install -y \
+ libgl1-mesa-glx \
+ libglib2.0-0
+
+# Copy the requirements file into the container
+COPY requirements.txt .
+
+# Install the Python dependencies
+RUN pip install --no-cache-dir -r requirements.txt
+
+# Copy the rest of the application files
+COPY poseangle.py .
+
+# Expose the port (if using Flask or another web app)
+EXPOSE 5000
+
+# Set the default command to run the Python script
+CMD ["python", "poseangle.py"]
diff --git a/poseangle-app/poseangle.py b/poseangle-app/poseangle.py
new file mode 100755
index 00000000..d0236552
--- /dev/null
+++ b/poseangle-app/poseangle.py
@@ -0,0 +1,123 @@
+import cv2
+import mediapipe as mp
+import math
+import time
+
+
+class PoseAngle:
+ def __init__(self):
+ self.mp_pose = mp.solutions.pose
+ self.pose = self.mp_pose.Pose()
+ self.mp_drawing = mp.solutions.drawing_utils
+ # Track min and max angles for elbow and knee
+ self.min_elbow_angle, self.max_elbow_angle = 180, 0
+ self.min_knee_angle, self.max_knee_angle = 180, 0
+
+ def calculate_angle(self, p1, p2, p3):
+ """Calculate the angle between three points and limit it to 0-180 degrees."""
+ x1, y1 = p1
+ x2, y2 = p2
+ x3, y3 = p3
+
+ angle = math.degrees(math.atan2(y3 - y2, x3 - x2) -
+ math.atan2(y1 - y2, x1 - x2))
+ angle = abs(angle) # Ensure positive angle
+ if angle > 180:
+ angle = 360 - angle # Convert to proper range (0-180)
+ return angle
+
+ def calculate_knee_landmarks(self, results, frame):
+ """Calculate the knee angle and return the landmarks."""
+ landmarks = results.pose_landmarks.landmark
+ h, w, _ = frame.shape
+
+ right_hip = (int(landmarks[24].x * w), int(landmarks[24].y * h))
+ right_knee = (int(landmarks[26].x * w), int(landmarks[26].y * h))
+ right_ankle = (int(landmarks[28].x * w), int(landmarks[28].y * h))
+
+ return right_hip, right_knee, right_ankle
+
+ def calculate_elbow_landmarks(self, results, frame):
+ """Calculate the elbow angle and return the landmarks."""
+ landmarks = results.pose_landmarks.landmark
+ h, w, _ = frame.shape
+
+ right_shoulder = (int(landmarks[12].x * w), int(landmarks[12].y * h))
+ right_elbow = (int(landmarks[14].x * w), int(landmarks[14].y * h))
+ right_wrist = (int(landmarks[16].x * w), int(landmarks[16].y * h))
+
+ return right_shoulder, right_elbow, right_wrist
+
+
+def main():
+ # Initialize PoseAngle class
+ pose_angle = PoseAngle()
+
+ # Open webcam (0 for default camera)
+ cap = cv2.VideoCapture(0)
+
+ # Countdown before starting
+ for i in range(3, 0, -1):
+ print(f"Starting in {i} seconds...")
+ time.sleep(1)
+
+ print("Recording started!")
+ start_time = time.time()
+ duration = 15 # Record for 15 seconds
+
+ while cap.isOpened():
+ success, frame = cap.read()
+ if not success:
+ break
+
+ # Convert frame to RGB
+ frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
+ results = pose_angle.pose.process(frame_rgb)
+
+ if results.pose_landmarks:
+ # Get landmarks for elbow and knee
+ right_shoulder, right_elbow, right_wrist = pose_angle.calculate_elbow_landmarks(results, frame)
+ right_hip, right_knee, right_ankle = pose_angle.calculate_knee_landmarks(results, frame)
+
+ # Calculate angles
+ elbow_angle = pose_angle.calculate_angle(right_shoulder, right_elbow, right_wrist)
+ knee_angle = pose_angle.calculate_angle(right_hip, right_knee, right_ankle)
+
+ # Update min/max values
+ pose_angle.min_elbow_angle = min(pose_angle.min_elbow_angle, elbow_angle)
+ pose_angle.max_elbow_angle = max(pose_angle.max_elbow_angle, elbow_angle)
+ pose_angle.min_knee_angle = min(pose_angle.min_knee_angle, knee_angle)
+ pose_angle.max_knee_angle = max(pose_angle.max_knee_angle, knee_angle)
+
+ # Draw landmarks on the frame
+ pose_angle.mp_drawing.draw_landmarks(frame, results.pose_landmarks, pose_angle.mp_pose.POSE_CONNECTIONS)
+
+ # Display angles on the frame
+ cv2.putText(frame, f"Elbow: {int(elbow_angle)} deg", (right_elbow[0] + 20, right_elbow[1] - 20),
+ cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
+ cv2.putText(frame, f"Knee: {int(knee_angle)} deg", (right_knee[0] + 20, right_knee[1] - 20),
+ cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
+
+ # Show frame in a window
+ cv2.imshow("Pose Analysis", frame)
+
+ # Stop after 15 seconds
+ if time.time() - start_time > duration:
+ print("Recording finished!")
+ break
+
+ # Press 'q' to exit early
+ if cv2.waitKey(10) & 0xFF == ord('q'):
+ print("Recording stopped manually!")
+ break
+
+ # Release resources
+ cap.release()
+ cv2.destroyAllWindows()
+
+ print(f"Elbow Min: {pose_angle.min_elbow_angle:.2f}, Max: {pose_angle.max_elbow_angle:.2f}")
+ print(f"Knee Min: {pose_angle.min_knee_angle:.2f}, Max: {pose_angle.max_knee_angle:.2f}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/poseangle-app/requirements.txt b/poseangle-app/requirements.txt
new file mode 100755
index 00000000..60938277
--- /dev/null
+++ b/poseangle-app/requirements.txt
@@ -0,0 +1,2 @@
+opencv-python
+mediapipe