├── .gitignore
├── README.md
├── app
├── (auth)
│ ├── layout.js
│ ├── page.jsx
│ └── register
│ │ └── page.jsx
├── (root)
│ ├── chats
│ │ ├── [chatId]
│ │ │ ├── group-info
│ │ │ │ └── page.jsx
│ │ │ └── page.jsx
│ │ └── page.jsx
│ ├── contacts
│ │ └── page.jsx
│ ├── layout.js
│ └── profile
│ │ └── page.jsx
├── api
│ ├── auth
│ │ ├── [...nextauth]
│ │ │ └── route.js
│ │ └── register
│ │ │ └── route.js
│ ├── chats
│ │ ├── [chatId]
│ │ │ ├── route.js
│ │ │ └── update
│ │ │ │ └── route.js
│ │ └── route.js
│ ├── messages
│ │ └── route.js
│ └── users
│ │ ├── [userId]
│ │ ├── route.js
│ │ ├── searchChat
│ │ │ └── [query]
│ │ │ │ └── route.js
│ │ └── update
│ │ │ └── route.js
│ │ ├── route.js
│ │ └── searchContact
│ │ └── [query]
│ │ └── route.js
├── favicon.ico
└── globals.css
├── components
├── BottomBar.jsx
├── ChatBox.jsx
├── ChatDetails.jsx
├── ChatList.jsx
├── Contacts.jsx
├── Form.jsx
├── Loader.jsx
├── MessageBox.jsx
├── Provider.jsx
├── ToasterContext.jsx
└── TopBar.jsx
├── jsconfig.json
├── lib
└── pusher.js
├── middleware.js
├── models
├── Chat.js
├── Message.js
└── User.js
├── mongodb
└── index.js
├── next.config.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
└── assets
│ ├── andrew.jpg
│ ├── coffee.jpg
│ ├── denny.jpg
│ ├── finance.jpg
│ ├── forest.jpg
│ ├── group.png
│ ├── logo.png
│ ├── marketing.jpg
│ ├── mathew.jpg
│ ├── ngocmai.jpg
│ ├── person.jpg
│ ├── phucmai.png
│ ├── sales.jpeg
│ ├── send.jpg
│ ├── sunehildeep.png
│ └── vivian.jpeg
├── screenshots
├── 1.png
├── 2.png
├── 3.png
├── 4.png
└── 5.png
└── tailwind.config.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 | .env
31 |
32 | # vercel
33 | .vercel
34 |
35 | # typescript
36 | *.tsbuildinfo
37 | next-env.d.ts
38 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 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).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | # or
12 | pnpm dev
13 | # or
14 | bun dev
15 | ```
16 |
17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 |
19 | You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
20 |
21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
22 |
23 | ## Learn More
24 |
25 | To learn more about Next.js, take a look at the following resources:
26 |
27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 |
30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
31 |
32 | ## Deploy on Vercel
33 |
34 | 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.
35 |
36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
37 |
--------------------------------------------------------------------------------
/app/(auth)/layout.js:
--------------------------------------------------------------------------------
1 | import { Inter } from "next/font/google";
2 |
3 | import "../globals.css";
4 | import ToasterContext from "@components/ToasterContext";
5 | import Provider from "@components/Provider";
6 |
7 | const inter = Inter({ subsets: ["latin"] });
8 |
9 | export const metadata = {
10 | title: "Auth Halo Chat",
11 | description: "Build a Next 14 Chat App",
12 | };
13 |
14 | export default function RootLayout({ children }) {
15 | return (
16 |
17 |
18 |
19 |
20 | {children}
21 |
22 |
23 |
24 | );
25 | }
26 |
--------------------------------------------------------------------------------
/app/(auth)/page.jsx:
--------------------------------------------------------------------------------
1 | import Form from "@components/Form"
2 |
3 | const Login = () => {
4 | return (
5 |
6 | )
7 | }
8 |
9 | export default Login
--------------------------------------------------------------------------------
/app/(auth)/register/page.jsx:
--------------------------------------------------------------------------------
1 | import Form from "@components/Form";
2 |
3 | const Register = () => {
4 | return ;
5 | };
6 |
7 | export default Register;
8 |
--------------------------------------------------------------------------------
/app/(root)/chats/[chatId]/group-info/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import Loader from "@components/Loader";
4 | import { GroupOutlined, PersonOutline } from "@mui/icons-material";
5 | import { CldUploadButton } from "next-cloudinary";
6 | import { useParams, useRouter } from "next/navigation";
7 | import { useEffect, useState } from "react";
8 | import { useForm } from "react-hook-form";
9 |
10 | const GroupInfo = () => {
11 | const [loading, setLoading] = useState(true);
12 | const [chat, setChat] = useState({});
13 |
14 | const { chatId } = useParams();
15 |
16 | const getChatDetails = async () => {
17 | try {
18 | const res = await fetch(`/api/chats/${chatId}`);
19 | const data = await res.json();
20 | setChat(data);
21 | setLoading(false);
22 | reset({
23 | name: data?.name,
24 | groupPhoto: data?.groupPhoto,
25 | });
26 | } catch (error) {
27 | console.log(error);
28 | }
29 | };
30 |
31 | useEffect(() => {
32 | if (chatId) {
33 | getChatDetails();
34 | }
35 | }, [chatId]);
36 |
37 | const {
38 | register,
39 | watch,
40 | setValue,
41 | reset,
42 | handleSubmit,
43 | formState: { error },
44 | } = useForm();
45 |
46 | const uploadPhoto = (result) => {
47 | setValue("groupPhoto", result?.info?.secure_url);
48 | };
49 |
50 | const router = useRouter();
51 |
52 | const updateGroupChat = async (data) => {
53 | setLoading(true);
54 | try {
55 | const res = await fetch(`/api/chats/${chatId}/update`, {
56 | method: "POST",
57 | headers: {
58 | "Content-Type": "application/json",
59 | },
60 | body: JSON.stringify(data),
61 | });
62 |
63 | setLoading(false);
64 |
65 | if (res.ok) {
66 | router.push(`/chats/${chatId}`);
67 | }
68 |
69 | } catch (error) {
70 | console.log(error);
71 | }
72 | };
73 |
74 | return loading ? (
75 |
76 | ) : (
77 |
78 |
Edit Group Info
79 |
80 |
119 |
120 | );
121 | };
122 |
123 | export default GroupInfo;
124 |
--------------------------------------------------------------------------------
/app/(root)/chats/[chatId]/page.jsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import ChatDetails from "@components/ChatDetails"
4 | import ChatList from "@components/ChatList"
5 | import { useSession } from "next-auth/react"
6 | import { useParams } from "next/navigation"
7 | import { useEffect } from "react"
8 |
9 |
10 | const ChatPage = () => {
11 | const { chatId } = useParams()
12 |
13 | const { data: session } = useSession()
14 | const currentUser = session?.user
15 |
16 | const seenMessages = async () => {
17 | try {
18 | await fetch (`/api/chats/${chatId}`, {
19 | method: "POST",
20 | headers: {
21 | "Content-Type": "application/json"
22 | },
23 | body: JSON.stringify({
24 | currentUserId: currentUser._id
25 | })
26 | })
27 | } catch (err) {
28 | console.log(err)
29 | }
30 | }
31 |
32 | useEffect(() => {
33 | if (currentUser && chatId) seenMessages()
34 | }, [currentUser, chatId])
35 |
36 | return (
37 |
41 | )
42 | }
43 |
44 | export default ChatPage
--------------------------------------------------------------------------------
/app/(root)/chats/page.jsx:
--------------------------------------------------------------------------------
1 | import ChatList from "@components/ChatList"
2 | import Contacts from "@components/Contacts"
3 |
4 | const Chats = () => {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | )
15 | }
16 |
17 | export default Chats
--------------------------------------------------------------------------------
/app/(root)/contacts/page.jsx:
--------------------------------------------------------------------------------
1 | import Contacts from '@components/Contacts'
2 |
3 | const ContactsPage = () => {
4 | return (
5 |
6 | )
7 | }
8 |
9 | export default ContactsPage
--------------------------------------------------------------------------------
/app/(root)/layout.js:
--------------------------------------------------------------------------------
1 | import { Inter } from "next/font/google";
2 | import "../globals.css";
3 | import Provider from "@components/Provider";
4 | import TopBar from "@components/TopBar";
5 | import BottomBar from "@components/BottomBar";
6 |
7 | const inter = Inter({ subsets: ["latin"] });
8 |
9 | export const metadata = {
10 | title: "Halo Chat App",
11 | description: "A Next.js 14 Chat App ",
12 | };
13 |
14 | export default function RootLayout({ children }) {
15 | return (
16 |
17 |
18 |
19 |
20 | {children}
21 |
22 |
23 |
24 |
25 | );
26 | }
27 |
--------------------------------------------------------------------------------
/app/(root)/profile/page.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import Loader from "@components/Loader";
4 | import { PersonOutline } from "@mui/icons-material";
5 | import { useSession } from "next-auth/react";
6 | import { CldUploadButton } from "next-cloudinary";
7 | import React, { useEffect, useState } from "react";
8 | import { useForm } from "react-hook-form";
9 |
10 | const Profile = () => {
11 | const { data: session } = useSession();
12 | const user = session?.user;
13 |
14 | const [loading, setLoading] = useState(true);
15 |
16 | useEffect(() => {
17 | if (user) {
18 | reset({
19 | username: user?.username,
20 | profileImage: user?.profileImage,
21 | });
22 | }
23 | setLoading(false);
24 | }, [user]);
25 |
26 | const {
27 | register,
28 | watch,
29 | setValue,
30 | reset,
31 | handleSubmit,
32 | formState: { error },
33 | } = useForm();
34 |
35 | const uploadPhoto = (result) => {
36 | setValue("profileImage", result?.info?.secure_url);
37 | };
38 |
39 | const updateUser = async (data) => {
40 | setLoading(true);
41 | try {
42 | const res = await fetch(`/api/users/${user._id}/update`, {
43 | method: "POST",
44 | headers: {
45 | "Content-Type": "application/json",
46 | },
47 | body: JSON.stringify(data),
48 | });
49 |
50 | setLoading(false);
51 | window.location.reload();
52 | } catch (error) {
53 | console.log(error);
54 | }
55 | };
56 |
57 | return loading ? (
58 |
59 | ) : (
60 |
61 |
Edit Your Profile
62 |
63 |
107 |
108 | );
109 | };
110 |
111 | export default Profile;
112 |
--------------------------------------------------------------------------------
/app/api/auth/[...nextauth]/route.js:
--------------------------------------------------------------------------------
1 | import NextAuth from "next-auth";
2 | import CredentialsProvider from "next-auth/providers/credentials";
3 | import { compare } from "bcryptjs";
4 |
5 | import { connectToDB } from "@mongodb";
6 | import User from "@models/User";
7 |
8 | const handler = NextAuth({
9 | providers: [
10 | CredentialsProvider({
11 | name: "Credentials",
12 | async authorize(credentials, req) {
13 | if (!credentials.email || !credentials.password) {
14 | throw new Error("Invalid email or password");
15 | }
16 |
17 | await connectToDB()
18 |
19 | const user = await User.findOne({ email: credentials.email });
20 |
21 | if (!user || !user?.password) {
22 | throw new Error("Invalid email or password");
23 | }
24 |
25 | const isMatch = await compare(credentials.password, user.password);
26 |
27 | if (!isMatch) {
28 | throw new Error("Invalid password");
29 | }
30 |
31 | return user
32 | },
33 | }),
34 | ],
35 |
36 | secret: process.env.NEXTAUTH_SECRET,
37 |
38 | callbacks: {
39 | async session({session}) {
40 | const mongodbUser = await User.findOne({ email: session.user.email })
41 | session.user.id = mongodbUser._id.toString()
42 |
43 | session.user = {...session.user, ...mongodbUser._doc}
44 |
45 | return session
46 | }
47 | }
48 | });
49 |
50 | export { handler as GET, handler as POST };
51 |
--------------------------------------------------------------------------------
/app/api/auth/register/route.js:
--------------------------------------------------------------------------------
1 | import User from "@models/User";
2 | import { connectToDB } from "@mongodb";
3 | import { hash } from "bcryptjs";
4 |
5 | export const POST = async (req, res) => {
6 | try {
7 | await connectToDB();
8 |
9 | const body = await req.json();
10 |
11 | const { username, email, password } = body;
12 |
13 | const existingUser = await User.findOne({ email });
14 |
15 | if (existingUser) {
16 | return new Response("User already exists", {
17 | status: 400,
18 | });
19 | }
20 |
21 | const hashedPassword = await hash(password, 10);
22 |
23 | const newUser = await User.create({
24 | username,
25 | email,
26 | password: hashedPassword,
27 | });
28 |
29 | await newUser.save();
30 |
31 | return new Response(JSON.stringify(newUser), { status: 200 });
32 | } catch (err) {
33 | console.log(err);
34 | return new Response("Failed to create a new user", {
35 | status: 500,
36 | });
37 | }
38 | };
39 |
--------------------------------------------------------------------------------
/app/api/chats/[chatId]/route.js:
--------------------------------------------------------------------------------
1 | import Chat from "@models/Chat";
2 | import Message from "@models/Message";
3 | import User from "@models/User";
4 | import { connectToDB } from "@mongodb";
5 |
6 | export const GET = async (req, { params }) => {
7 | try {
8 | await connectToDB();
9 |
10 | const { chatId } = params;
11 |
12 | const chat = await Chat.findById(chatId)
13 | .populate({
14 | path: "members",
15 | model: User,
16 | })
17 | .populate({
18 | path: "messages",
19 | model: Message,
20 | populate: {
21 | path: "sender seenBy",
22 | model: User,
23 | },
24 | })
25 | .exec();
26 |
27 | return new Response(JSON.stringify(chat), { status: 200 });
28 | } catch (err) {
29 | console.log(err);
30 | return new Response("Failed to get chat details", { status: 500 });
31 | }
32 | };
33 |
34 | export const POST = async (req, { params }) => {
35 | try {
36 | await connectToDB();
37 |
38 | const { chatId } = params;
39 |
40 | const body = await req.json();
41 |
42 | const { currentUserId } = body;
43 |
44 | await Message.updateMany(
45 | { chat: chatId },
46 | { $addToSet: { seenBy: currentUserId } },
47 | { new: true }
48 | )
49 | .populate({
50 | path: "sender seenBy",
51 | model: User,
52 | })
53 | .exec();
54 |
55 | return new Response("Seen all messages by current user", { status: 200 });
56 | } catch (err) {
57 | console.log(err);
58 | return new Response("Failed to update seen messages", { status: 500 });
59 | }
60 | };
61 |
--------------------------------------------------------------------------------
/app/api/chats/[chatId]/update/route.js:
--------------------------------------------------------------------------------
1 | import Chat from "@models/Chat"
2 | import { connectToDB } from "@mongodb"
3 |
4 | export const POST = async (req, { params }) => {
5 | try {
6 | await connectToDB()
7 |
8 | const body = await req.json()
9 |
10 | const { chatId } = params
11 |
12 | const { name, groupPhoto } = body
13 |
14 | const updatedGroupChat = await Chat.findByIdAndUpdate(
15 | chatId,
16 | { name, groupPhoto },
17 | { new: true }
18 | )
19 |
20 | return new Response(JSON.stringify(updatedGroupChat), { status: 200 })
21 | } catch (err) {
22 | return new Response("Failed to update group chat info", { status: 500 })
23 | }
24 | }
--------------------------------------------------------------------------------
/app/api/chats/route.js:
--------------------------------------------------------------------------------
1 | import { pusherServer } from "@lib/pusher";
2 | import Chat from "@models/Chat";
3 | import User from "@models/User";
4 | import { connectToDB } from "@mongodb";
5 |
6 | export const POST = async (req) => {
7 | try {
8 | await connectToDB();
9 |
10 | const body = await req.json();
11 |
12 | const { currentUserId, members, isGroup, name, groupPhoto } = body;
13 |
14 | // Define "query" to find the chat
15 | const query = isGroup
16 | ? { isGroup, name, groupPhoto, members: [currentUserId, ...members] }
17 | : { members: { $all: [currentUserId, ...members], $size: 2 } };
18 |
19 | let chat = await Chat.findOne(query);
20 |
21 | if (!chat) {
22 | chat = await new Chat(
23 | isGroup ? query : { members: [currentUserId, ...members] }
24 | );
25 |
26 | await chat.save();
27 |
28 | const updateAllMembers = chat.members.map(async (memberId) => {
29 | await User.findByIdAndUpdate(
30 | memberId,
31 | {
32 | $addToSet: { chats: chat._id },
33 | },
34 | { new: true }
35 | );
36 | })
37 | Promise.all(updateAllMembers);
38 |
39 | /* Trigger a Pusher event for each member to notify a new chat */
40 | chat.members.map(async (member) => {
41 | await pusherServer.trigger(member._id.toString(), "new-chat", chat)
42 | })
43 | }
44 |
45 |
46 | return new Response(JSON.stringify(chat), { status: 200 });
47 | } catch (err) {
48 | console.error(err);
49 | return new Response("Failed to create a new chat", { status: 500 })
50 | }
51 | };
52 |
--------------------------------------------------------------------------------
/app/api/messages/route.js:
--------------------------------------------------------------------------------
1 | import { pusherServer } from "@lib/pusher";
2 | import Chat from "@models/Chat";
3 | import Message from "@models/Message";
4 | import User from "@models/User";
5 | import { connectToDB } from "@mongodb";
6 |
7 | export const POST = async (req) => {
8 | try {
9 | await connectToDB();
10 |
11 | const body = await req.json();
12 |
13 | const { chatId, currentUserId, text, photo } = body;
14 |
15 | const currentUser = await User.findById(currentUserId);
16 |
17 | const newMessage = await Message.create({
18 | chat: chatId,
19 | sender: currentUser,
20 | text,
21 | photo,
22 | seenBy: currentUserId,
23 | });
24 |
25 | const updatedChat = await Chat.findByIdAndUpdate(
26 | chatId,
27 | {
28 | $push: { messages: newMessage._id },
29 | $set: { lastMessageAt: newMessage.createdAt },
30 | },
31 | { new: true }
32 | )
33 | .populate({
34 | path: "messages",
35 | model: Message,
36 | populate: { path: "sender seenBy", model: "User" },
37 | })
38 | .populate({
39 | path: "members",
40 | model: "User",
41 | })
42 | .exec();
43 |
44 | /* Trigger a Pusher event for a specific chat about the new message */
45 | await pusherServer.trigger(chatId, "new-message", newMessage)
46 |
47 | /* Triggers a Pusher event for each member of the chat about the chat update with the latest message */
48 | const lastMessage = updatedChat.messages[updatedChat.messages.length - 1];
49 | updatedChat.members.forEach(async (member) => {
50 | try {
51 | await pusherServer.trigger(member._id.toString(), "update-chat", {
52 | id: chatId,
53 | messages: [lastMessage]
54 | });
55 | } catch (err) {
56 | console.error(`Failed to trigger update-chat event`);
57 | }
58 | });
59 |
60 |
61 | return new Response(JSON.stringify(newMessage), { status: 200 });
62 | } catch (err) {
63 | console.log(err);
64 | return new Response("Failed to create new message", { status: 500 });
65 | }
66 | };
67 |
--------------------------------------------------------------------------------
/app/api/users/[userId]/route.js:
--------------------------------------------------------------------------------
1 | import Chat from "@models/Chat";
2 | import Message from "@models/Message";
3 | import User from "@models/User";
4 | import { connectToDB } from "@mongodb";
5 |
6 | export const GET = async (req, { params }) => {
7 | try {
8 | await connectToDB();
9 |
10 | const { userId } = params;
11 |
12 | const allChats = await Chat.find({ members: userId })
13 | .sort({ lastMessageAt: -1 })
14 | .populate({
15 | path: "members",
16 | model: User,
17 | })
18 | .populate({
19 | path: "messages",
20 | model: Message,
21 | populate: {
22 | path: "sender seenBy",
23 | model: User,
24 | },
25 | })
26 | .exec();
27 |
28 | return new Response(JSON.stringify(allChats), { status: 200 });
29 | } catch (err) {
30 | console.log(err);
31 | return new Response("Failed to get all chats of current user", {
32 | status: 500,
33 | });
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/app/api/users/[userId]/searchChat/[query]/route.js:
--------------------------------------------------------------------------------
1 | import Chat from "@models/Chat";
2 | import Message from "@models/Message";
3 | import User from "@models/User";
4 | import { connectToDB } from "@mongodb";
5 |
6 | export const GET = async (req, { params }) => {
7 | try {
8 | await connectToDB();
9 |
10 | // const currentUserId = params.userId
11 | // const query = params.query
12 |
13 | const { userId, query } = params;
14 |
15 | const searchedChat = await Chat.find({
16 | members: userId,
17 | name: { $regex: query, $options: "i" },
18 | })
19 | .populate({
20 | path: "members",
21 | model: User,
22 | })
23 | .populate({
24 | path: "messages",
25 | model: Message,
26 | populate: {
27 | path: "sender seenBy",
28 | model: User,
29 | },
30 | })
31 | .exec();
32 |
33 | return new Response(JSON.stringify(searchedChat), { status: 200 });
34 | } catch (err) {
35 | console.log(err);
36 | return new Response("Failed to search chat", { status: 500 });
37 | }
38 | };
39 |
--------------------------------------------------------------------------------
/app/api/users/[userId]/update/route.js:
--------------------------------------------------------------------------------
1 | import User from "@models/User";
2 | import { connectToDB } from "@mongodb";
3 |
4 | export const POST = async (req, { params }) => {
5 | try {
6 | await connectToDB();
7 |
8 | const { userId } = params;
9 |
10 | const body = await req.json();
11 |
12 | const { username, profileImage } = body;
13 |
14 | const updatedUser = await User.findByIdAndUpdate(
15 | userId,
16 | {
17 | username,
18 | profileImage,
19 | },
20 | { new: true }
21 | );
22 |
23 | return new Response(JSON.stringify(updatedUser), { status: 200 });
24 | } catch (err) {
25 | console.log(err);
26 | return new Response("Failed to update user", { status: 500 })
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/app/api/users/route.js:
--------------------------------------------------------------------------------
1 | import User from "@models/User"
2 | import { connectToDB } from "@mongodb"
3 |
4 | export const GET = async (req, res) => {
5 | try {
6 | await connectToDB()
7 |
8 | const allUsers = await User.find()
9 |
10 | return new Response(JSON.stringify(allUsers), { status: 200 })
11 | } catch (err) {
12 | console.log(err)
13 | return new Response("Failed to get all users", { status: 500 })
14 | }
15 | }
--------------------------------------------------------------------------------
/app/api/users/searchContact/[query]/route.js:
--------------------------------------------------------------------------------
1 | import User from "@models/User"
2 | import { connectToDB } from "@mongodb"
3 |
4 | export const GET = async (req, { params }) => {
5 | try {
6 | await connectToDB()
7 |
8 | const { query } = params
9 |
10 | const searchedContacts = await User.find({
11 | $or: [
12 | { username: { $regex: query, $options: "i" } },
13 | { email: { $regex: query, $options: "i" } }
14 | ]
15 | })
16 |
17 | return new Response(JSON.stringify(searchedContacts), { status: 200 })
18 | } catch (err) {
19 | return new Response("Failed to search contact", { status: 500 })
20 | }
21 | }
--------------------------------------------------------------------------------
/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/app/favicon.ico
--------------------------------------------------------------------------------
/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | @layer utilities {
6 | .custom-scrollbar::-webkit-scrollbar {
7 | width: 3px;
8 | height: 3px;
9 | border-radius: 2px;
10 | }
11 | }
12 |
13 | /* Login & Register Pages */
14 | .auth {
15 | @apply w-full h-lvh flex items-center justify-center;
16 | }
17 |
18 | .content {
19 | @apply w-1/3 py-7 px-4 max-sm:w-5/6 max-lg:w-2/3 max-xl:w-1/2 flex flex-col items-center justify-center gap-6 bg-white rounded-3xl;
20 | }
21 |
22 | .logo {
23 | @apply w-52 h-auto;
24 | }
25 |
26 | .form {
27 | @apply flex flex-col items-center gap-5;
28 | }
29 |
30 | .input {
31 | @apply flex items-center justify-between px-5 py-3 rounded-2xl cursor-pointer shadow-2xl;
32 | }
33 |
34 | .input-field {
35 | @apply w-[300px] max-sm:w-full bg-transparent outline-none;
36 | }
37 |
38 | .button {
39 | @apply w-full px-5 py-3 mt-5 mb-7 rounded-xl cursor-pointer bg-blue-1 hover:bg-red-1 text-white text-body-bold;
40 | }
41 |
42 | .link {
43 | @apply text-base-medium hover:text-red-1;
44 | }
45 |
46 | /* Main Container */
47 | .main-container {
48 | @apply h-screen flex justify-between gap-5 px-10 py-3 max-lg:gap-8;
49 | }
50 |
51 | /* Top Bar */
52 | .topbar {
53 | @apply top-0 sticky px-10 py-5 flex items-center justify-between bg-blue-2;
54 | }
55 |
56 | .menu {
57 | @apply flex items-center gap-8 max-sm:hidden;
58 | }
59 |
60 | .profilePhoto {
61 | @apply w-11 h-11 rounded-full object-cover object-center;
62 | }
63 |
64 | /* Bottom Bar */
65 | .bottom-bar {
66 | @apply fixed bottom-0 z-50 w-full flex justify-between items-center px-5 py-2 bg-white sm:hidden
67 | }
68 |
69 | /* Profile Page */
70 | .profile-page {
71 | @apply mt-16 flex flex-col gap-11 items-center justify-center;
72 | }
73 |
74 | .edit-profile {
75 | @apply flex flex-col gap-9
76 | }
77 |
78 | .profile {
79 | @apply w-1/3 max-sm:w-5/6 max-lg:w-2/3 max-xl:w-1/2 flex flex-col items-center justify-center gap-6 bg-white rounded-3xl;
80 | }
81 |
82 | .btn {
83 | @apply flex items-center justify-center rounded-xl p-3 bg-gradient-to-l from-blue-1 to-blue-3 text-body-bold text-white;
84 | }
85 |
86 | /* Chat List */
87 | .chat-list {
88 | @apply h-screen flex flex-col gap-5 pb-20;
89 | }
90 |
91 | .input-search {
92 | @apply px-5 py-3 rounded-2xl bg-white outline-none;
93 | }
94 |
95 | .chats {
96 | @apply flex-1 flex flex-col bg-white rounded-3xl py-4 px-3 overflow-y-scroll custom-scrollbar;
97 | }
98 |
99 | /* Chat Box */
100 | .chat-box {
101 | @apply flex items-start justify-between p-2 rounded-2xl cursor-pointer hover:bg-grey-2;
102 | }
103 |
104 | .current-chat {
105 | @apply bg-blue-2;
106 | }
107 |
108 | .chat-info {
109 | @apply flex gap-3;
110 | }
111 |
112 | .last-message {
113 | @apply w-[120px] sm:w-[250px] truncate;
114 | }
115 |
116 | /* Contacts */
117 | .create-chat-container {
118 | @apply flex flex-col gap-5;
119 | }
120 |
121 | .contact-bar {
122 | @apply flex gap-7 items-start max-lg:flex-col;
123 | }
124 |
125 | .contact-list {
126 | @apply h-screen w-1/2 max-lg:w-full flex flex-col gap-5 bg-white rounded-3xl py-5 px-8 mb-20;
127 | }
128 |
129 | .contact {
130 | @apply flex gap-3 items-center cursor-pointer;
131 | }
132 |
133 | .create-chat {
134 | @apply w-1/2 max-lg:w-full flex flex-col gap-7;
135 | }
136 |
137 | .input-group-name {
138 | @apply bg-white rounded-2xl px-5 py-3 outline-none ;
139 | }
140 |
141 | .selected-contact {
142 | @apply text-base-bold p-2 bg-pink-1 rounded-lg;
143 | }
144 |
145 | /* ChatDetails */
146 | .chat-details {
147 | @apply h-screen flex flex-col bg-white rounded-2xl;
148 | }
149 |
150 | /* Chat Header */
151 | .chat-header {
152 | @apply flex items-center gap-4 px-8 py-3 text-body-bold;
153 | }
154 |
155 | /* Chat Body */
156 | .chat-body {
157 | @apply flex-1 flex flex-col gap-5 bg-grey-2 p-5 overflow-y-scroll custom-scrollbar;
158 | }
159 |
160 | .message-box {
161 | @apply flex gap-3 items-start;
162 | }
163 |
164 | .message-profilePhoto {
165 | @apply w-8 h-8 rounded-full;
166 | }
167 |
168 | .message-info {
169 | @apply flex flex-col gap-2;
170 | }
171 |
172 | .message-photo {
173 | @apply w-40 h-auto rounded-lg;
174 | }
175 |
176 | .message-text {
177 | @apply w-fit bg-white p-3 rounded-lg text-base-medium;
178 | }
179 |
180 | .message-text-sender {
181 | @apply w-fit bg-purple-2 text-white p-3 rounded-lg text-base-medium;
182 | }
183 |
184 | /* Message Input */
185 | .send-message {
186 | @apply w-full flex items-center justify-between px-7 py-3 rounded-3xl cursor-pointer bg-white;
187 | }
188 |
189 | .prepare-message {
190 | @apply flex items-center gap-4;
191 | }
192 |
193 | .send-icon {
194 | @apply w-10 h-10 rounded-full hover:scale-125 ease-in-out duration-300;
195 | }
196 |
197 | /* BottomBar */
198 | .bottombar {
199 | @apply bottom-0 sticky px-10 py-5 flex items-center justify-between sm:hidden;
200 | }
201 |
--------------------------------------------------------------------------------
/components/BottomBar.jsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { Logout } from "@mui/icons-material";
4 | import { signOut, useSession } from "next-auth/react";
5 | import Link from "next/link";
6 | import { usePathname } from "next/navigation";
7 |
8 | const BottomBar = () => {
9 | const pathname = usePathname();
10 |
11 | const handleLogout = async () => {
12 | signOut({ callbackUrl: "/" });
13 | };
14 |
15 | const { data: session } = useSession();
16 | const user = session?.user;
17 |
18 | return (
19 |
20 |
26 | Chats
27 |
28 |
34 | Contacts
35 |
36 |
37 |
41 |
42 |
43 |

48 |
49 |
50 | );
51 | };
52 |
53 | export default BottomBar;
54 |
--------------------------------------------------------------------------------
/components/ChatBox.jsx:
--------------------------------------------------------------------------------
1 | import { format } from "date-fns";
2 | import { useRouter } from "next/navigation";
3 |
4 | const ChatBox = ({ chat, currentUser, currentChatId }) => {
5 | const otherMembers = chat?.members?.filter(
6 | (member) => member._id !== currentUser._id
7 | );
8 |
9 | const lastMessage =
10 | chat?.messages?.length > 0 && chat?.messages[chat?.messages.length - 1];
11 |
12 | const seen = lastMessage?.seenBy?.find(
13 | (member) => member._id === currentUser._id
14 | );
15 |
16 | const router = useRouter();
17 |
18 | return (
19 | router.push(`/chats/${chat._id}`)}
22 | >
23 |
24 | {chat?.isGroup ? (
25 |

30 | ) : (
31 |

36 | )}
37 |
38 |
39 | {chat?.isGroup ? (
40 |
{chat?.name}
41 | ) : (
42 |
{otherMembers[0]?.username}
43 | )}
44 |
45 | {!lastMessage &&
Started a chat
}
46 |
47 | {lastMessage?.photo ? (
48 | lastMessage?.sender?._id === currentUser._id ? (
49 |
You sent a photo
50 | ) : (
51 |
56 | Received a photo
57 |
58 | )
59 | ) : (
60 |
65 | {lastMessage?.text}
66 |
67 | )}
68 |
69 |
70 |
71 |
72 |
73 | {!lastMessage
74 | ? format(new Date(chat?.createdAt), "p")
75 | : format(new Date(chat?.lastMessageAt), "p")}
76 |
77 |
78 |
79 | );
80 | };
81 |
82 | export default ChatBox;
83 |
--------------------------------------------------------------------------------
/components/ChatDetails.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useState, useEffect, useRef } from "react";
4 | import Loader from "./Loader";
5 | import { AddPhotoAlternate } from "@mui/icons-material";
6 | import { useSession } from "next-auth/react";
7 | import Link from "next/link";
8 | import { CldUploadButton } from "next-cloudinary";
9 | import MessageBox from "./MessageBox";
10 | import { pusherClient } from "@lib/pusher";
11 |
12 | const ChatDetails = ({ chatId }) => {
13 | const [loading, setLoading] = useState(true);
14 | const [chat, setChat] = useState({});
15 | const [otherMembers, setOtherMembers] = useState([]);
16 |
17 | const { data: session } = useSession();
18 | const currentUser = session?.user;
19 |
20 | const [text, setText] = useState("");
21 |
22 | const getChatDetails = async () => {
23 | try {
24 | const res = await fetch(`/api/chats/${chatId}`, {
25 | method: "GET",
26 | headers: {
27 | "Content-Type": "application/json",
28 | },
29 | });
30 | const data = await res.json();
31 | setChat(data);
32 | setOtherMembers(
33 | data?.members?.filter((member) => member._id !== currentUser._id)
34 | );
35 | setLoading(false);
36 | } catch (error) {
37 | console.log(error);
38 | }
39 | };
40 |
41 | useEffect(() => {
42 | if (currentUser && chatId) getChatDetails();
43 | }, [currentUser, chatId]);
44 |
45 | const sendText = async () => {
46 | try {
47 | const res = await fetch("/api/messages", {
48 | method: "POST",
49 | headers: {
50 | "Content-Type": "application/json",
51 | },
52 | body: JSON.stringify({
53 | chatId,
54 | currentUserId: currentUser._id,
55 | text,
56 | }),
57 | });
58 |
59 | if (res.ok) {
60 | setText("");
61 | }
62 | } catch (err) {
63 | console.log(err);
64 | }
65 | };
66 |
67 | const sendPhoto = async (result) => {
68 | try {
69 | const res = await fetch("/api/messages", {
70 | method: "POST",
71 | headers: {
72 | "Content-Type": "application/json",
73 | },
74 | body: JSON.stringify({
75 | chatId,
76 | currentUserId: currentUser._id,
77 | photo: result?.info?.secure_url,
78 | }),
79 | });
80 | } catch (err) {
81 | console.log(err);
82 | }
83 | };
84 |
85 | useEffect(() => {
86 | pusherClient.subscribe(chatId);
87 |
88 | const handleMessage = async (newMessage) => {
89 | setChat((prevChat) => {
90 | return {
91 | ...prevChat,
92 | messages: [...prevChat.messages, newMessage],
93 | };
94 | });
95 | };
96 |
97 | pusherClient.bind("new-message", handleMessage);
98 |
99 | return () => {
100 | pusherClient.unsubscribe(chatId);
101 | pusherClient.unbind("new-message", handleMessage);
102 | };
103 | }, [chatId]);
104 |
105 | /* Scrolling down to the bottom when having the new message */
106 |
107 | const bottomRef = useRef(null);
108 |
109 | useEffect(() => {
110 | bottomRef.current?.scrollIntoView({
111 | behavior: "smooth",
112 | });
113 | }, [chat?.messages]);
114 |
115 | return loading ? (
116 |
117 | ) : (
118 |
119 |
120 |
121 | {chat?.isGroup ? (
122 | <>
123 |
124 |

129 |
130 |
131 |
132 |
133 | {chat?.name} · {chat?.members?.length}{" "}
134 | members
135 |
136 |
137 | >
138 | ) : (
139 | <>
140 |

145 |
146 |
{otherMembers[0].username}
147 |
148 | >
149 | )}
150 |
151 |
152 |
153 | {chat?.messages?.map((message, index) => (
154 |
159 | ))}
160 |
161 |
162 |
163 |
164 |
165 |
170 |
178 |
179 |
180 |
setText(e.target.value)}
186 | required
187 | />
188 |
189 |
190 |
191 |

192 |
193 |
194 |
195 |
196 | );
197 | };
198 |
199 | export default ChatDetails;
200 |
--------------------------------------------------------------------------------
/components/ChatList.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useSession } from "next-auth/react";
4 | import { use, useEffect, useState } from "react";
5 | import ChatBox from "./ChatBox";
6 | import Loader from "./Loader";
7 | import { pusherClient } from "@lib/pusher";
8 |
9 | const ChatList = ({ currentChatId }) => {
10 | const { data: sessions } = useSession();
11 | const currentUser = sessions?.user;
12 |
13 | const [loading, setLoading] = useState(true);
14 | const [chats, setChats] = useState([]);
15 | const [search, setSearch] = useState("");
16 |
17 | const getChats = async () => {
18 | try {
19 | const res = await fetch(
20 | search !== ""
21 | ? `/api/users/${currentUser._id}/searchChat/${search}`
22 | : `/api/users/${currentUser._id}`
23 | );
24 | const data = await res.json();
25 | setChats(data);
26 | setLoading(false);
27 | } catch (err) {
28 | console.log(err);
29 | }
30 | };
31 |
32 | useEffect(() => {
33 | if (currentUser) {
34 | getChats();
35 | }
36 | }, [currentUser, search]);
37 |
38 | useEffect(() => {
39 | if (currentUser) {
40 | pusherClient.subscribe(currentUser._id);
41 |
42 | const handleChatUpdate = (updatedChat) => {
43 | setChats((allChats) =>
44 | allChats.map((chat) => {
45 | if (chat._id === updatedChat.id) {
46 | return { ...chat, messages: updatedChat.messages };
47 | } else {
48 | return chat;
49 | }
50 | })
51 | );
52 | };
53 |
54 | const handleNewChat = (newChat) => {
55 | setChats((allChats) => [...allChats, newChat]);
56 | }
57 |
58 | pusherClient.bind("update-chat", handleChatUpdate);
59 | pusherClient.bind("new-chat", handleNewChat);
60 |
61 | return () => {
62 | pusherClient.unsubscribe(currentUser._id);
63 | pusherClient.unbind("update-chat", handleChatUpdate);
64 | pusherClient.unbind("new-chat", handleNewChat);
65 | };
66 | }
67 | }, [currentUser]);
68 |
69 | return loading ? (
70 |
71 | ) : (
72 |
73 |
setSearch(e.target.value)}
78 | />
79 |
80 |
81 | {chats?.map((chat, index) => (
82 |
88 | ))}
89 |
90 |
91 | );
92 | };
93 |
94 | export default ChatList;
95 |
--------------------------------------------------------------------------------
/components/Contacts.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useSession } from "next-auth/react";
4 | import { useEffect, useState } from "react";
5 | import Loader from "./Loader";
6 | import { CheckCircle, RadioButtonUnchecked } from "@mui/icons-material";
7 | import { useRouter } from "next/navigation";
8 |
9 | const Contacts = () => {
10 | const [loading, setLoading] = useState(true);
11 | const [contacts, setContacts] = useState([]);
12 | const [search, setSearch] = useState("");
13 |
14 | const { data: session } = useSession();
15 | const currentUser = session?.user;
16 |
17 | const getContacts = async () => {
18 | try {
19 | const res = await fetch(
20 | search !== "" ? `/api/users/searchContact/${search}` : "/api/users"
21 | );
22 | const data = await res.json();
23 | setContacts(data.filter((contact) => contact._id !== currentUser._id));
24 | setLoading(false);
25 | } catch (err) {
26 | console.log(err);
27 | }
28 | };
29 |
30 | useEffect(() => {
31 | if (currentUser) getContacts();
32 | }, [currentUser, search]);
33 |
34 | /* SELECT CONTACT */
35 | const [selectedContacts, setSelectedContacts] = useState([]);
36 | const isGroup = selectedContacts.length > 1;
37 |
38 | const handleSelect = (contact) => {
39 | if (selectedContacts.includes(contact)) {
40 | setSelectedContacts((prevSelectedContacts) =>
41 | prevSelectedContacts.filter((item) => item !== contact)
42 | );
43 | } else {
44 | setSelectedContacts((prevSelectedContacts) => [
45 | ...prevSelectedContacts,
46 | contact,
47 | ]);
48 | }
49 | };
50 |
51 | /* ADD GROUP CHAT NAME */
52 | const [name, setName] = useState("");
53 |
54 | const router = useRouter();
55 |
56 | /* CREATE CHAT */
57 | const createChat = async () => {
58 | const res = await fetch("/api/chats", {
59 | method: "POST",
60 | body: JSON.stringify({
61 | currentUserId: currentUser._id,
62 | members: selectedContacts.map((contact) => contact._id),
63 | isGroup,
64 | name,
65 | }),
66 | });
67 | const chat = await res.json();
68 |
69 | if (res.ok) {
70 | router.push(`/chats/${chat._id}`);
71 | }
72 | };
73 |
74 | return loading ? (
75 |
76 | ) : (
77 |
78 |
setSearch(e.target.value)}
83 | />
84 |
85 |
86 |
87 |
Select or Deselect
88 |
89 |
90 | {contacts.map((user, index) => (
91 |
handleSelect(user)}
95 | >
96 | {selectedContacts.find((item) => item === user) ? (
97 |
98 | ) : (
99 |
100 | )}
101 |

106 |
{user.username}
107 |
108 | ))}
109 |
110 |
111 |
112 |
113 | {isGroup && (
114 | <>
115 |
116 |
Group Chat Name
117 |
setName(e.target.value)}
122 | />
123 |
124 |
125 |
126 |
Members
127 |
128 | {selectedContacts.map((contact, index) => (
129 |
130 | {contact.username}
131 |
132 | ))}
133 |
134 |
135 | >
136 | )}
137 |
144 |
145 |
146 |
147 | );
148 | };
149 |
150 | export default Contacts;
151 |
--------------------------------------------------------------------------------
/components/Form.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import {
4 | EmailOutlined,
5 | LockOutlined,
6 | PersonOutline,
7 | } from "@mui/icons-material";
8 | import Link from "next/link";
9 | import { useRouter } from "next/navigation";
10 | import { useForm } from "react-hook-form";
11 | import toast from "react-hot-toast";
12 | import { signIn } from "next-auth/react"
13 |
14 | const Form = ({ type }) => {
15 | const {
16 | register,
17 | handleSubmit,
18 | watch,
19 | formState: { errors },
20 | } = useForm();
21 |
22 | const router = useRouter();
23 |
24 | const onSubmit = async (data) => {
25 | if (type === "register") {
26 | const res = await fetch("/api/auth/register", {
27 | method: "POST",
28 | headers: {
29 | "Content-Type": "application/json",
30 | },
31 | body: JSON.stringify(data),
32 | });
33 |
34 | if (res.ok) {
35 | router.push("/");
36 | }
37 |
38 | if (res.error) {
39 | toast.error("Something went wrong");
40 | }
41 | }
42 |
43 | if (type === "login") {
44 | const res = await signIn("credentials", {
45 | ...data,
46 | redirect: false,
47 | })
48 |
49 | if (res.ok) {
50 | router.push("/chats");
51 | }
52 |
53 | if (res.error) {
54 | toast.error("Invalid email or password");
55 | }
56 | }
57 | };
58 |
59 |
60 |
61 | return (
62 |
63 |
64 |

65 |
66 |
138 |
139 | {type === "register" ? (
140 |
141 |
Already have an account? Sign In Here
142 |
143 | ) : (
144 |
145 |
Don't have an account? Register Here
146 |
147 | )}
148 |
149 |
150 | );
151 | };
152 |
153 | export default Form;
154 |
--------------------------------------------------------------------------------
/components/Loader.jsx:
--------------------------------------------------------------------------------
1 | const Loader = () => {
2 | return (
3 |
6 | );
7 | }
8 |
9 | export default Loader;
--------------------------------------------------------------------------------
/components/MessageBox.jsx:
--------------------------------------------------------------------------------
1 | import { format } from "date-fns"
2 |
3 | const MessageBox = ({ message, currentUser }) => {
4 | return message?.sender?._id !== currentUser._id ? (
5 |
6 |

7 |
8 |
9 | {message?.sender?.username} · {format(new Date(message?.createdAt), "p")}
10 |
11 |
12 | {message?.text ? (
13 |
{message?.text}
14 | ) : (
15 |

16 | )}
17 |
18 |
19 | ) : (
20 |
21 |
22 |
23 | {format(new Date(message?.createdAt), "p")}
24 |
25 |
26 | {message?.text ? (
27 |
{message?.text}
28 | ) : (
29 |

30 | )}
31 |
32 |
33 | )
34 | }
35 |
36 | export default MessageBox
--------------------------------------------------------------------------------
/components/Provider.jsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { SessionProvider } from "next-auth/react"
4 |
5 | const Provider = ({ children, session }) => {
6 | return (
7 |
8 | {children}
9 |
10 | )
11 | }
12 |
13 | export default Provider
--------------------------------------------------------------------------------
/components/ToasterContext.jsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import { Toaster } from "react-hot-toast"
4 |
5 | const ToasterContext = () => {
6 | return (
7 |
8 | )
9 | }
10 |
11 | export default ToasterContext
--------------------------------------------------------------------------------
/components/TopBar.jsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { Logout } from "@mui/icons-material";
4 | import { signOut, useSession } from "next-auth/react";
5 | import Link from "next/link";
6 | import { usePathname } from "next/navigation";
7 | import React from "react";
8 |
9 | const TopBar = () => {
10 | const pathname = usePathname();
11 |
12 | const handleLogout = async () => {
13 | signOut({ callbackUrl: "/" });
14 | };
15 |
16 | const { data: session } = useSession();
17 | const user = session?.user;
18 |
19 | return (
20 |
21 |
22 |

23 |
24 |
25 |
26 |
32 | Chats
33 |
34 |
40 | Contacts
41 |
42 |
43 |
47 |
48 |
49 |

54 |
55 |
56 |
57 | );
58 | };
59 |
60 | export default TopBar;
61 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "paths": {
4 | "@*": ["./*"]
5 | }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/lib/pusher.js:
--------------------------------------------------------------------------------
1 | import PusherServer from "pusher";
2 | import PusherClient from "pusher-js";
3 |
4 | export const pusherServer = new PusherServer({
5 | appId: process.env.PUSHER_APP_ID,
6 | key: process.env.NEXT_PUBLIC_PUSHER_APP_KEY,
7 | secret: process.env.PUSHER_SECRET,
8 | cluster: "us2",
9 | useTLS: true,
10 | });
11 |
12 | export const pusherClient = new PusherClient(
13 | process.env.NEXT_PUBLIC_PUSHER_APP_KEY,
14 | {
15 | cluster: "us2",
16 | }
17 | );
18 |
--------------------------------------------------------------------------------
/middleware.js:
--------------------------------------------------------------------------------
1 | import { withAuth } from "next-auth/middleware";
2 |
3 | export default withAuth({
4 | pages: {
5 | signIn: "/",
6 | },
7 | });
8 |
9 | export const config = {
10 | matcher: [
11 | "/chats/:path*",
12 | "/contacts/:path*",
13 | "/profile/:path*",
14 | ]
15 | };
--------------------------------------------------------------------------------
/models/Chat.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose"
2 |
3 | const ChatSchema = new mongoose.Schema({
4 | members: {
5 | type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User'}],
6 | default: []
7 | },
8 | messages: {
9 | type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Message'}],
10 | default: []
11 | },
12 | isGroup: {
13 | type: Boolean,
14 | default: false
15 | },
16 | name: {
17 | type: String,
18 | default: ''
19 | },
20 | groupPhoto: {
21 | type: String,
22 | default: ''
23 | },
24 | createdAt: {
25 | type: Date,
26 | default: Date.now
27 | },
28 | lastMessageAt: {
29 | type: Date,
30 | default: Date.now
31 | }
32 | })
33 |
34 | const Chat = mongoose.models.Chat || mongoose.model('Chat', ChatSchema)
35 |
36 | export default Chat
--------------------------------------------------------------------------------
/models/Message.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose"
2 |
3 | const MessageSchema = new mongoose.Schema({
4 | chat: {
5 | type: mongoose.Schema.Types.ObjectId,
6 | ref: "Chat",
7 | },
8 | sender: {
9 | type: mongoose.Schema.Types.ObjectId,
10 | ref: "User",
11 | },
12 | text: {
13 | type: String,
14 | default: "",
15 | },
16 | photo: {
17 | type: String,
18 | default: "",
19 | },
20 | createdAt: {
21 | type: Date,
22 | default: Date.now,
23 | },
24 | seenBy: {
25 | type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User'}],
26 | default: []
27 | }
28 | })
29 |
30 | const Message = mongoose.models.Message || mongoose.model('Message', MessageSchema)
31 |
32 | export default Message
--------------------------------------------------------------------------------
/models/User.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | const UserSchema = new mongoose.Schema({
4 | username: {
5 | type: String,
6 | required: true,
7 | },
8 | email: {
9 | type: String,
10 | required: true,
11 | unique: true,
12 | },
13 | password: {
14 | type: String,
15 | required: true,
16 | },
17 | profileImage: {
18 | type: String,
19 | default: "",
20 | },
21 | chats: {
22 | type: [{ type: mongoose.Schema.Types.ObjectId, ref: "Chat" }],
23 | default: [],
24 | }
25 | });
26 |
27 | const User = mongoose.models.User || mongoose.model("User", UserSchema);
28 |
29 | export default User;
30 |
--------------------------------------------------------------------------------
/mongodb/index.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | let isConnected = false;
4 |
5 | export const connectToDB = async () => {
6 | mongoose.set("strictQuery", true);
7 |
8 | if (isConnected) {
9 | console.log("MongoDB is already connected");
10 | return;
11 | }
12 |
13 | try {
14 | await mongoose.connect(process.env.MONGODB_URL, {
15 | dbName: "HaloChat",
16 | useNewUrlParser: true,
17 | useUnifiedTopology: true,
18 | });
19 |
20 | isConnected = true;
21 |
22 | console.log("MongoDB is connected successfully");
23 | } catch (error) {
24 | console.log(error);
25 | }
26 | };
27 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {}
3 |
4 | module.exports = nextConfig
5 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "halochat",
3 | "version": "0.1.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "halochat",
9 | "version": "0.1.0",
10 | "dependencies": {
11 | "@emotion/react": "^11.11.3",
12 | "@emotion/styled": "^11.11.0",
13 | "@mui/icons-material": "^5.15.4",
14 | "bcryptjs": "^2.4.3",
15 | "date-fns": "^3.2.0",
16 | "mongoose": "^8.0.4",
17 | "next": "14.0.4",
18 | "next-auth": "^4.24.5",
19 | "next-cloudinary": "^5.18.0",
20 | "pusher": "^5.2.0",
21 | "pusher-js": "^8.4.0-rc2",
22 | "react": "^18",
23 | "react-dom": "^18",
24 | "react-hook-form": "^7.49.3",
25 | "react-hot-toast": "^2.4.1"
26 | },
27 | "devDependencies": {
28 | "autoprefixer": "^10.0.1",
29 | "postcss": "^8",
30 | "tailwindcss": "^3.3.0"
31 | }
32 | },
33 | "node_modules/@alloc/quick-lru": {
34 | "version": "5.2.0",
35 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
36 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
37 | "dev": true,
38 | "engines": {
39 | "node": ">=10"
40 | },
41 | "funding": {
42 | "url": "https://github.com/sponsors/sindresorhus"
43 | }
44 | },
45 | "node_modules/@babel/code-frame": {
46 | "version": "7.23.5",
47 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
48 | "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
49 | "dependencies": {
50 | "@babel/highlight": "^7.23.4",
51 | "chalk": "^2.4.2"
52 | },
53 | "engines": {
54 | "node": ">=6.9.0"
55 | }
56 | },
57 | "node_modules/@babel/helper-module-imports": {
58 | "version": "7.22.15",
59 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
60 | "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
61 | "dependencies": {
62 | "@babel/types": "^7.22.15"
63 | },
64 | "engines": {
65 | "node": ">=6.9.0"
66 | }
67 | },
68 | "node_modules/@babel/helper-string-parser": {
69 | "version": "7.23.4",
70 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
71 | "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
72 | "engines": {
73 | "node": ">=6.9.0"
74 | }
75 | },
76 | "node_modules/@babel/helper-validator-identifier": {
77 | "version": "7.22.20",
78 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
79 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
80 | "engines": {
81 | "node": ">=6.9.0"
82 | }
83 | },
84 | "node_modules/@babel/highlight": {
85 | "version": "7.23.4",
86 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
87 | "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
88 | "dependencies": {
89 | "@babel/helper-validator-identifier": "^7.22.20",
90 | "chalk": "^2.4.2",
91 | "js-tokens": "^4.0.0"
92 | },
93 | "engines": {
94 | "node": ">=6.9.0"
95 | }
96 | },
97 | "node_modules/@babel/runtime": {
98 | "version": "7.23.8",
99 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz",
100 | "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==",
101 | "dependencies": {
102 | "regenerator-runtime": "^0.14.0"
103 | },
104 | "engines": {
105 | "node": ">=6.9.0"
106 | }
107 | },
108 | "node_modules/@babel/types": {
109 | "version": "7.23.6",
110 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
111 | "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
112 | "dependencies": {
113 | "@babel/helper-string-parser": "^7.23.4",
114 | "@babel/helper-validator-identifier": "^7.22.20",
115 | "to-fast-properties": "^2.0.0"
116 | },
117 | "engines": {
118 | "node": ">=6.9.0"
119 | }
120 | },
121 | "node_modules/@cloudinary-util/url-loader": {
122 | "version": "3.23.0",
123 | "resolved": "https://registry.npmjs.org/@cloudinary-util/url-loader/-/url-loader-3.23.0.tgz",
124 | "integrity": "sha512-Tp6TrAkOYkgT3CyIU4nXS4utLkYN9nquTQSNW6Qqmb7vA7Y1MaSRty+F2FHV84WETK9XQDCfdCn4B+SyH4sWWw==",
125 | "dependencies": {
126 | "@cloudinary-util/util": "2.3.0",
127 | "@cloudinary/url-gen": "^1.10.2"
128 | }
129 | },
130 | "node_modules/@cloudinary-util/util": {
131 | "version": "2.3.0",
132 | "resolved": "https://registry.npmjs.org/@cloudinary-util/util/-/util-2.3.0.tgz",
133 | "integrity": "sha512-0Gojd+ZRQjJQmlBEAa8Ua94amvx7uWHoUzVUEGi1S8bgF1wPcMqG07cSUGQfRwHsFQ/9XOesx76Df622E+CevA=="
134 | },
135 | "node_modules/@cloudinary/transformation-builder-sdk": {
136 | "version": "1.10.1",
137 | "resolved": "https://registry.npmjs.org/@cloudinary/transformation-builder-sdk/-/transformation-builder-sdk-1.10.1.tgz",
138 | "integrity": "sha512-UUb1wS/eWCf4YBThGszoBBzH6kP+frdd5JeJkF0/SOwbX3tkcrdzxD+Srn5GXPCqzf6Gw1nrGrv/3U9hiZP55A==",
139 | "dependencies": {
140 | "@cloudinary/url-gen": "^1.7.0"
141 | }
142 | },
143 | "node_modules/@cloudinary/url-gen": {
144 | "version": "1.15.0",
145 | "resolved": "https://registry.npmjs.org/@cloudinary/url-gen/-/url-gen-1.15.0.tgz",
146 | "integrity": "sha512-bjU67eZxLUgoRy/Plli4TQio7q6P31OYqnEgXxeN9TKXrzr6h0DeEdIUhKI9gy3HkEBWXWWJIPh7j7gkOJPnyA==",
147 | "dependencies": {
148 | "@cloudinary/transformation-builder-sdk": "^1.10.0"
149 | }
150 | },
151 | "node_modules/@emotion/babel-plugin": {
152 | "version": "11.11.0",
153 | "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
154 | "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
155 | "dependencies": {
156 | "@babel/helper-module-imports": "^7.16.7",
157 | "@babel/runtime": "^7.18.3",
158 | "@emotion/hash": "^0.9.1",
159 | "@emotion/memoize": "^0.8.1",
160 | "@emotion/serialize": "^1.1.2",
161 | "babel-plugin-macros": "^3.1.0",
162 | "convert-source-map": "^1.5.0",
163 | "escape-string-regexp": "^4.0.0",
164 | "find-root": "^1.1.0",
165 | "source-map": "^0.5.7",
166 | "stylis": "4.2.0"
167 | }
168 | },
169 | "node_modules/@emotion/cache": {
170 | "version": "11.11.0",
171 | "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
172 | "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
173 | "dependencies": {
174 | "@emotion/memoize": "^0.8.1",
175 | "@emotion/sheet": "^1.2.2",
176 | "@emotion/utils": "^1.2.1",
177 | "@emotion/weak-memoize": "^0.3.1",
178 | "stylis": "4.2.0"
179 | }
180 | },
181 | "node_modules/@emotion/hash": {
182 | "version": "0.9.1",
183 | "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
184 | "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
185 | },
186 | "node_modules/@emotion/is-prop-valid": {
187 | "version": "1.2.1",
188 | "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
189 | "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
190 | "dependencies": {
191 | "@emotion/memoize": "^0.8.1"
192 | }
193 | },
194 | "node_modules/@emotion/memoize": {
195 | "version": "0.8.1",
196 | "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
197 | "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
198 | },
199 | "node_modules/@emotion/react": {
200 | "version": "11.11.3",
201 | "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz",
202 | "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==",
203 | "dependencies": {
204 | "@babel/runtime": "^7.18.3",
205 | "@emotion/babel-plugin": "^11.11.0",
206 | "@emotion/cache": "^11.11.0",
207 | "@emotion/serialize": "^1.1.3",
208 | "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
209 | "@emotion/utils": "^1.2.1",
210 | "@emotion/weak-memoize": "^0.3.1",
211 | "hoist-non-react-statics": "^3.3.1"
212 | },
213 | "peerDependencies": {
214 | "react": ">=16.8.0"
215 | },
216 | "peerDependenciesMeta": {
217 | "@types/react": {
218 | "optional": true
219 | }
220 | }
221 | },
222 | "node_modules/@emotion/serialize": {
223 | "version": "1.1.3",
224 | "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz",
225 | "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==",
226 | "dependencies": {
227 | "@emotion/hash": "^0.9.1",
228 | "@emotion/memoize": "^0.8.1",
229 | "@emotion/unitless": "^0.8.1",
230 | "@emotion/utils": "^1.2.1",
231 | "csstype": "^3.0.2"
232 | }
233 | },
234 | "node_modules/@emotion/sheet": {
235 | "version": "1.2.2",
236 | "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
237 | "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
238 | },
239 | "node_modules/@emotion/styled": {
240 | "version": "11.11.0",
241 | "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
242 | "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
243 | "dependencies": {
244 | "@babel/runtime": "^7.18.3",
245 | "@emotion/babel-plugin": "^11.11.0",
246 | "@emotion/is-prop-valid": "^1.2.1",
247 | "@emotion/serialize": "^1.1.2",
248 | "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
249 | "@emotion/utils": "^1.2.1"
250 | },
251 | "peerDependencies": {
252 | "@emotion/react": "^11.0.0-rc.0",
253 | "react": ">=16.8.0"
254 | },
255 | "peerDependenciesMeta": {
256 | "@types/react": {
257 | "optional": true
258 | }
259 | }
260 | },
261 | "node_modules/@emotion/unitless": {
262 | "version": "0.8.1",
263 | "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
264 | "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
265 | },
266 | "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
267 | "version": "1.0.1",
268 | "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
269 | "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
270 | "peerDependencies": {
271 | "react": ">=16.8.0"
272 | }
273 | },
274 | "node_modules/@emotion/utils": {
275 | "version": "1.2.1",
276 | "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
277 | "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
278 | },
279 | "node_modules/@emotion/weak-memoize": {
280 | "version": "0.3.1",
281 | "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
282 | "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
283 | },
284 | "node_modules/@floating-ui/core": {
285 | "version": "1.5.3",
286 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.3.tgz",
287 | "integrity": "sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==",
288 | "peer": true,
289 | "dependencies": {
290 | "@floating-ui/utils": "^0.2.0"
291 | }
292 | },
293 | "node_modules/@floating-ui/dom": {
294 | "version": "1.5.4",
295 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.4.tgz",
296 | "integrity": "sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==",
297 | "peer": true,
298 | "dependencies": {
299 | "@floating-ui/core": "^1.5.3",
300 | "@floating-ui/utils": "^0.2.0"
301 | }
302 | },
303 | "node_modules/@floating-ui/react-dom": {
304 | "version": "2.0.5",
305 | "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.5.tgz",
306 | "integrity": "sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==",
307 | "peer": true,
308 | "dependencies": {
309 | "@floating-ui/dom": "^1.5.4"
310 | },
311 | "peerDependencies": {
312 | "react": ">=16.8.0",
313 | "react-dom": ">=16.8.0"
314 | }
315 | },
316 | "node_modules/@floating-ui/utils": {
317 | "version": "0.2.1",
318 | "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
319 | "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==",
320 | "peer": true
321 | },
322 | "node_modules/@isaacs/cliui": {
323 | "version": "8.0.2",
324 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
325 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
326 | "dev": true,
327 | "dependencies": {
328 | "string-width": "^5.1.2",
329 | "string-width-cjs": "npm:string-width@^4.2.0",
330 | "strip-ansi": "^7.0.1",
331 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
332 | "wrap-ansi": "^8.1.0",
333 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
334 | },
335 | "engines": {
336 | "node": ">=12"
337 | }
338 | },
339 | "node_modules/@jridgewell/gen-mapping": {
340 | "version": "0.3.3",
341 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
342 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
343 | "dev": true,
344 | "dependencies": {
345 | "@jridgewell/set-array": "^1.0.1",
346 | "@jridgewell/sourcemap-codec": "^1.4.10",
347 | "@jridgewell/trace-mapping": "^0.3.9"
348 | },
349 | "engines": {
350 | "node": ">=6.0.0"
351 | }
352 | },
353 | "node_modules/@jridgewell/resolve-uri": {
354 | "version": "3.1.1",
355 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
356 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
357 | "dev": true,
358 | "engines": {
359 | "node": ">=6.0.0"
360 | }
361 | },
362 | "node_modules/@jridgewell/set-array": {
363 | "version": "1.1.2",
364 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
365 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
366 | "dev": true,
367 | "engines": {
368 | "node": ">=6.0.0"
369 | }
370 | },
371 | "node_modules/@jridgewell/sourcemap-codec": {
372 | "version": "1.4.15",
373 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
374 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
375 | "dev": true
376 | },
377 | "node_modules/@jridgewell/trace-mapping": {
378 | "version": "0.3.21",
379 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz",
380 | "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==",
381 | "dev": true,
382 | "dependencies": {
383 | "@jridgewell/resolve-uri": "^3.1.0",
384 | "@jridgewell/sourcemap-codec": "^1.4.14"
385 | }
386 | },
387 | "node_modules/@mongodb-js/saslprep": {
388 | "version": "1.1.4",
389 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz",
390 | "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==",
391 | "dependencies": {
392 | "sparse-bitfield": "^3.0.3"
393 | }
394 | },
395 | "node_modules/@mui/base": {
396 | "version": "5.0.0-beta.31",
397 | "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.31.tgz",
398 | "integrity": "sha512-+uNbP3OHJuZVI00WyMg7xfLZotaEY7LgvYXDfONVJbrS+K9wyjCIPNfjy8r9XJn4fbHo/5ibiZqjWnU9LMNv+A==",
399 | "peer": true,
400 | "dependencies": {
401 | "@babel/runtime": "^7.23.7",
402 | "@floating-ui/react-dom": "^2.0.5",
403 | "@mui/types": "^7.2.13",
404 | "@mui/utils": "^5.15.4",
405 | "@popperjs/core": "^2.11.8",
406 | "clsx": "^2.1.0",
407 | "prop-types": "^15.8.1"
408 | },
409 | "engines": {
410 | "node": ">=12.0.0"
411 | },
412 | "funding": {
413 | "type": "opencollective",
414 | "url": "https://opencollective.com/mui-org"
415 | },
416 | "peerDependencies": {
417 | "@types/react": "^17.0.0 || ^18.0.0",
418 | "react": "^17.0.0 || ^18.0.0",
419 | "react-dom": "^17.0.0 || ^18.0.0"
420 | },
421 | "peerDependenciesMeta": {
422 | "@types/react": {
423 | "optional": true
424 | }
425 | }
426 | },
427 | "node_modules/@mui/core-downloads-tracker": {
428 | "version": "5.15.4",
429 | "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.4.tgz",
430 | "integrity": "sha512-0OZN9O6hAtBpx70mMNFOPaAIol/ytwZYPY+z7Rf9dK3+1Xlzwvj5/IeShJKvtp76S1qJyhPuvZg0+BGqQaUnUw==",
431 | "peer": true,
432 | "funding": {
433 | "type": "opencollective",
434 | "url": "https://opencollective.com/mui-org"
435 | }
436 | },
437 | "node_modules/@mui/icons-material": {
438 | "version": "5.15.4",
439 | "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.4.tgz",
440 | "integrity": "sha512-q/Yk7aokN8qGMpR7bwoDpBSeaNe6Bv7vaY9yHYodP37c64TM6ime05ueb/wgksOVszrKkNXC67E/XYbRWOoUFA==",
441 | "dependencies": {
442 | "@babel/runtime": "^7.23.7"
443 | },
444 | "engines": {
445 | "node": ">=12.0.0"
446 | },
447 | "funding": {
448 | "type": "opencollective",
449 | "url": "https://opencollective.com/mui-org"
450 | },
451 | "peerDependencies": {
452 | "@mui/material": "^5.0.0",
453 | "@types/react": "^17.0.0 || ^18.0.0",
454 | "react": "^17.0.0 || ^18.0.0"
455 | },
456 | "peerDependenciesMeta": {
457 | "@types/react": {
458 | "optional": true
459 | }
460 | }
461 | },
462 | "node_modules/@mui/material": {
463 | "version": "5.15.4",
464 | "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.4.tgz",
465 | "integrity": "sha512-T/LGRAC+M0c+D3+y67eHwIN5bSje0TxbcJCWR0esNvU11T0QwrX3jedXItPNBwMupF2F5VWCDHBVLlFnN3+ABA==",
466 | "peer": true,
467 | "dependencies": {
468 | "@babel/runtime": "^7.23.7",
469 | "@mui/base": "5.0.0-beta.31",
470 | "@mui/core-downloads-tracker": "^5.15.4",
471 | "@mui/system": "^5.15.4",
472 | "@mui/types": "^7.2.13",
473 | "@mui/utils": "^5.15.4",
474 | "@types/react-transition-group": "^4.4.10",
475 | "clsx": "^2.1.0",
476 | "csstype": "^3.1.2",
477 | "prop-types": "^15.8.1",
478 | "react-is": "^18.2.0",
479 | "react-transition-group": "^4.4.5"
480 | },
481 | "engines": {
482 | "node": ">=12.0.0"
483 | },
484 | "funding": {
485 | "type": "opencollective",
486 | "url": "https://opencollective.com/mui-org"
487 | },
488 | "peerDependencies": {
489 | "@emotion/react": "^11.5.0",
490 | "@emotion/styled": "^11.3.0",
491 | "@types/react": "^17.0.0 || ^18.0.0",
492 | "react": "^17.0.0 || ^18.0.0",
493 | "react-dom": "^17.0.0 || ^18.0.0"
494 | },
495 | "peerDependenciesMeta": {
496 | "@emotion/react": {
497 | "optional": true
498 | },
499 | "@emotion/styled": {
500 | "optional": true
501 | },
502 | "@types/react": {
503 | "optional": true
504 | }
505 | }
506 | },
507 | "node_modules/@mui/private-theming": {
508 | "version": "5.15.4",
509 | "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.4.tgz",
510 | "integrity": "sha512-9N5myIMEEQTM5WYWPGvvYADzjFo12LgJ7S+2iTZkBNOcJpUxQYM1tvYjkHCDV+t1ocMOEgjR2EfJ9Dus30dBlg==",
511 | "peer": true,
512 | "dependencies": {
513 | "@babel/runtime": "^7.23.7",
514 | "@mui/utils": "^5.15.4",
515 | "prop-types": "^15.8.1"
516 | },
517 | "engines": {
518 | "node": ">=12.0.0"
519 | },
520 | "funding": {
521 | "type": "opencollective",
522 | "url": "https://opencollective.com/mui-org"
523 | },
524 | "peerDependencies": {
525 | "@types/react": "^17.0.0 || ^18.0.0",
526 | "react": "^17.0.0 || ^18.0.0"
527 | },
528 | "peerDependenciesMeta": {
529 | "@types/react": {
530 | "optional": true
531 | }
532 | }
533 | },
534 | "node_modules/@mui/styled-engine": {
535 | "version": "5.15.4",
536 | "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.4.tgz",
537 | "integrity": "sha512-vtrZUXG5XI8CNiNLcxjIirW4dEbOloR+ikfm6ePBo7jXpJdpXjVzBWetrfE+5eI0cHkKWlTptnJ2voKV8pBRfw==",
538 | "peer": true,
539 | "dependencies": {
540 | "@babel/runtime": "^7.23.7",
541 | "@emotion/cache": "^11.11.0",
542 | "csstype": "^3.1.2",
543 | "prop-types": "^15.8.1"
544 | },
545 | "engines": {
546 | "node": ">=12.0.0"
547 | },
548 | "funding": {
549 | "type": "opencollective",
550 | "url": "https://opencollective.com/mui-org"
551 | },
552 | "peerDependencies": {
553 | "@emotion/react": "^11.4.1",
554 | "@emotion/styled": "^11.3.0",
555 | "react": "^17.0.0 || ^18.0.0"
556 | },
557 | "peerDependenciesMeta": {
558 | "@emotion/react": {
559 | "optional": true
560 | },
561 | "@emotion/styled": {
562 | "optional": true
563 | }
564 | }
565 | },
566 | "node_modules/@mui/system": {
567 | "version": "5.15.4",
568 | "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.4.tgz",
569 | "integrity": "sha512-KCwkHajGBXPs2TK1HJjIyab4NDk0cZoBDYN/TTlXVo1qBAmCjY0vjqrlsjeoG+wrwwcezXMLs/e6OGP66fPCog==",
570 | "peer": true,
571 | "dependencies": {
572 | "@babel/runtime": "^7.23.7",
573 | "@mui/private-theming": "^5.15.4",
574 | "@mui/styled-engine": "^5.15.4",
575 | "@mui/types": "^7.2.13",
576 | "@mui/utils": "^5.15.4",
577 | "clsx": "^2.1.0",
578 | "csstype": "^3.1.2",
579 | "prop-types": "^15.8.1"
580 | },
581 | "engines": {
582 | "node": ">=12.0.0"
583 | },
584 | "funding": {
585 | "type": "opencollective",
586 | "url": "https://opencollective.com/mui-org"
587 | },
588 | "peerDependencies": {
589 | "@emotion/react": "^11.5.0",
590 | "@emotion/styled": "^11.3.0",
591 | "@types/react": "^17.0.0 || ^18.0.0",
592 | "react": "^17.0.0 || ^18.0.0"
593 | },
594 | "peerDependenciesMeta": {
595 | "@emotion/react": {
596 | "optional": true
597 | },
598 | "@emotion/styled": {
599 | "optional": true
600 | },
601 | "@types/react": {
602 | "optional": true
603 | }
604 | }
605 | },
606 | "node_modules/@mui/types": {
607 | "version": "7.2.13",
608 | "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz",
609 | "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==",
610 | "peer": true,
611 | "peerDependencies": {
612 | "@types/react": "^17.0.0 || ^18.0.0"
613 | },
614 | "peerDependenciesMeta": {
615 | "@types/react": {
616 | "optional": true
617 | }
618 | }
619 | },
620 | "node_modules/@mui/utils": {
621 | "version": "5.15.4",
622 | "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.4.tgz",
623 | "integrity": "sha512-E2wLQGBcs3VR52CpMRjk46cGscC4cbf3Q2uyHNaAeL36yTTm+aVNbtsTCazXtjOP4BDd8lu6VtlTpVC8Rtl4mg==",
624 | "peer": true,
625 | "dependencies": {
626 | "@babel/runtime": "^7.23.7",
627 | "@types/prop-types": "^15.7.11",
628 | "prop-types": "^15.8.1",
629 | "react-is": "^18.2.0"
630 | },
631 | "engines": {
632 | "node": ">=12.0.0"
633 | },
634 | "funding": {
635 | "type": "opencollective",
636 | "url": "https://opencollective.com/mui-org"
637 | },
638 | "peerDependencies": {
639 | "@types/react": "^17.0.0 || ^18.0.0",
640 | "react": "^17.0.0 || ^18.0.0"
641 | },
642 | "peerDependenciesMeta": {
643 | "@types/react": {
644 | "optional": true
645 | }
646 | }
647 | },
648 | "node_modules/@next/env": {
649 | "version": "14.0.4",
650 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz",
651 | "integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ=="
652 | },
653 | "node_modules/@next/swc-darwin-arm64": {
654 | "version": "14.0.4",
655 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz",
656 | "integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==",
657 | "cpu": [
658 | "arm64"
659 | ],
660 | "optional": true,
661 | "os": [
662 | "darwin"
663 | ],
664 | "engines": {
665 | "node": ">= 10"
666 | }
667 | },
668 | "node_modules/@next/swc-darwin-x64": {
669 | "version": "14.0.4",
670 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz",
671 | "integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==",
672 | "cpu": [
673 | "x64"
674 | ],
675 | "optional": true,
676 | "os": [
677 | "darwin"
678 | ],
679 | "engines": {
680 | "node": ">= 10"
681 | }
682 | },
683 | "node_modules/@next/swc-linux-arm64-gnu": {
684 | "version": "14.0.4",
685 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz",
686 | "integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==",
687 | "cpu": [
688 | "arm64"
689 | ],
690 | "optional": true,
691 | "os": [
692 | "linux"
693 | ],
694 | "engines": {
695 | "node": ">= 10"
696 | }
697 | },
698 | "node_modules/@next/swc-linux-arm64-musl": {
699 | "version": "14.0.4",
700 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz",
701 | "integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==",
702 | "cpu": [
703 | "arm64"
704 | ],
705 | "optional": true,
706 | "os": [
707 | "linux"
708 | ],
709 | "engines": {
710 | "node": ">= 10"
711 | }
712 | },
713 | "node_modules/@next/swc-linux-x64-gnu": {
714 | "version": "14.0.4",
715 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz",
716 | "integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==",
717 | "cpu": [
718 | "x64"
719 | ],
720 | "optional": true,
721 | "os": [
722 | "linux"
723 | ],
724 | "engines": {
725 | "node": ">= 10"
726 | }
727 | },
728 | "node_modules/@next/swc-linux-x64-musl": {
729 | "version": "14.0.4",
730 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz",
731 | "integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==",
732 | "cpu": [
733 | "x64"
734 | ],
735 | "optional": true,
736 | "os": [
737 | "linux"
738 | ],
739 | "engines": {
740 | "node": ">= 10"
741 | }
742 | },
743 | "node_modules/@next/swc-win32-arm64-msvc": {
744 | "version": "14.0.4",
745 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz",
746 | "integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==",
747 | "cpu": [
748 | "arm64"
749 | ],
750 | "optional": true,
751 | "os": [
752 | "win32"
753 | ],
754 | "engines": {
755 | "node": ">= 10"
756 | }
757 | },
758 | "node_modules/@next/swc-win32-ia32-msvc": {
759 | "version": "14.0.4",
760 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz",
761 | "integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==",
762 | "cpu": [
763 | "ia32"
764 | ],
765 | "optional": true,
766 | "os": [
767 | "win32"
768 | ],
769 | "engines": {
770 | "node": ">= 10"
771 | }
772 | },
773 | "node_modules/@next/swc-win32-x64-msvc": {
774 | "version": "14.0.4",
775 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz",
776 | "integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==",
777 | "cpu": [
778 | "x64"
779 | ],
780 | "optional": true,
781 | "os": [
782 | "win32"
783 | ],
784 | "engines": {
785 | "node": ">= 10"
786 | }
787 | },
788 | "node_modules/@nodelib/fs.scandir": {
789 | "version": "2.1.5",
790 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
791 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
792 | "dev": true,
793 | "dependencies": {
794 | "@nodelib/fs.stat": "2.0.5",
795 | "run-parallel": "^1.1.9"
796 | },
797 | "engines": {
798 | "node": ">= 8"
799 | }
800 | },
801 | "node_modules/@nodelib/fs.stat": {
802 | "version": "2.0.5",
803 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
804 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
805 | "dev": true,
806 | "engines": {
807 | "node": ">= 8"
808 | }
809 | },
810 | "node_modules/@nodelib/fs.walk": {
811 | "version": "1.2.8",
812 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
813 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
814 | "dev": true,
815 | "dependencies": {
816 | "@nodelib/fs.scandir": "2.1.5",
817 | "fastq": "^1.6.0"
818 | },
819 | "engines": {
820 | "node": ">= 8"
821 | }
822 | },
823 | "node_modules/@panva/hkdf": {
824 | "version": "1.1.1",
825 | "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz",
826 | "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==",
827 | "funding": {
828 | "url": "https://github.com/sponsors/panva"
829 | }
830 | },
831 | "node_modules/@pkgjs/parseargs": {
832 | "version": "0.11.0",
833 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
834 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
835 | "dev": true,
836 | "optional": true,
837 | "engines": {
838 | "node": ">=14"
839 | }
840 | },
841 | "node_modules/@popperjs/core": {
842 | "version": "2.11.8",
843 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
844 | "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
845 | "peer": true,
846 | "funding": {
847 | "type": "opencollective",
848 | "url": "https://opencollective.com/popperjs"
849 | }
850 | },
851 | "node_modules/@swc/helpers": {
852 | "version": "0.5.2",
853 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
854 | "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
855 | "dependencies": {
856 | "tslib": "^2.4.0"
857 | }
858 | },
859 | "node_modules/@types/node": {
860 | "version": "20.11.2",
861 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.2.tgz",
862 | "integrity": "sha512-cZShBaVa+UO1LjWWBPmWRR4+/eY/JR/UIEcDlVsw3okjWEu+rB7/mH6X3B/L+qJVHDLjk9QW/y2upp9wp1yDXA==",
863 | "dependencies": {
864 | "undici-types": "~5.26.4"
865 | }
866 | },
867 | "node_modules/@types/node-fetch": {
868 | "version": "2.6.10",
869 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz",
870 | "integrity": "sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==",
871 | "dependencies": {
872 | "@types/node": "*",
873 | "form-data": "^4.0.0"
874 | }
875 | },
876 | "node_modules/@types/parse-json": {
877 | "version": "4.0.2",
878 | "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
879 | "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
880 | },
881 | "node_modules/@types/prop-types": {
882 | "version": "15.7.11",
883 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
884 | "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
885 | "peer": true
886 | },
887 | "node_modules/@types/react": {
888 | "version": "18.2.48",
889 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz",
890 | "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==",
891 | "peer": true,
892 | "dependencies": {
893 | "@types/prop-types": "*",
894 | "@types/scheduler": "*",
895 | "csstype": "^3.0.2"
896 | }
897 | },
898 | "node_modules/@types/react-transition-group": {
899 | "version": "4.4.10",
900 | "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
901 | "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
902 | "peer": true,
903 | "dependencies": {
904 | "@types/react": "*"
905 | }
906 | },
907 | "node_modules/@types/scheduler": {
908 | "version": "0.16.8",
909 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
910 | "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
911 | "peer": true
912 | },
913 | "node_modules/@types/webidl-conversions": {
914 | "version": "7.0.3",
915 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
916 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="
917 | },
918 | "node_modules/@types/whatwg-url": {
919 | "version": "8.2.2",
920 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
921 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
922 | "dependencies": {
923 | "@types/node": "*",
924 | "@types/webidl-conversions": "*"
925 | }
926 | },
927 | "node_modules/abort-controller": {
928 | "version": "3.0.0",
929 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
930 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
931 | "dependencies": {
932 | "event-target-shim": "^5.0.0"
933 | },
934 | "engines": {
935 | "node": ">=6.5"
936 | }
937 | },
938 | "node_modules/ansi-regex": {
939 | "version": "6.0.1",
940 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
941 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
942 | "dev": true,
943 | "engines": {
944 | "node": ">=12"
945 | },
946 | "funding": {
947 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
948 | }
949 | },
950 | "node_modules/ansi-styles": {
951 | "version": "6.2.1",
952 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
953 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
954 | "dev": true,
955 | "engines": {
956 | "node": ">=12"
957 | },
958 | "funding": {
959 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
960 | }
961 | },
962 | "node_modules/any-promise": {
963 | "version": "1.3.0",
964 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
965 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
966 | "dev": true
967 | },
968 | "node_modules/anymatch": {
969 | "version": "3.1.3",
970 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
971 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
972 | "dev": true,
973 | "dependencies": {
974 | "normalize-path": "^3.0.0",
975 | "picomatch": "^2.0.4"
976 | },
977 | "engines": {
978 | "node": ">= 8"
979 | }
980 | },
981 | "node_modules/arg": {
982 | "version": "5.0.2",
983 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
984 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
985 | "dev": true
986 | },
987 | "node_modules/asynckit": {
988 | "version": "0.4.0",
989 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
990 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
991 | },
992 | "node_modules/autoprefixer": {
993 | "version": "10.4.16",
994 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
995 | "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
996 | "dev": true,
997 | "funding": [
998 | {
999 | "type": "opencollective",
1000 | "url": "https://opencollective.com/postcss/"
1001 | },
1002 | {
1003 | "type": "tidelift",
1004 | "url": "https://tidelift.com/funding/github/npm/autoprefixer"
1005 | },
1006 | {
1007 | "type": "github",
1008 | "url": "https://github.com/sponsors/ai"
1009 | }
1010 | ],
1011 | "dependencies": {
1012 | "browserslist": "^4.21.10",
1013 | "caniuse-lite": "^1.0.30001538",
1014 | "fraction.js": "^4.3.6",
1015 | "normalize-range": "^0.1.2",
1016 | "picocolors": "^1.0.0",
1017 | "postcss-value-parser": "^4.2.0"
1018 | },
1019 | "bin": {
1020 | "autoprefixer": "bin/autoprefixer"
1021 | },
1022 | "engines": {
1023 | "node": "^10 || ^12 || >=14"
1024 | },
1025 | "peerDependencies": {
1026 | "postcss": "^8.1.0"
1027 | }
1028 | },
1029 | "node_modules/babel-plugin-macros": {
1030 | "version": "3.1.0",
1031 | "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
1032 | "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
1033 | "dependencies": {
1034 | "@babel/runtime": "^7.12.5",
1035 | "cosmiconfig": "^7.0.0",
1036 | "resolve": "^1.19.0"
1037 | },
1038 | "engines": {
1039 | "node": ">=10",
1040 | "npm": ">=6"
1041 | }
1042 | },
1043 | "node_modules/balanced-match": {
1044 | "version": "1.0.2",
1045 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1046 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1047 | "dev": true
1048 | },
1049 | "node_modules/bcryptjs": {
1050 | "version": "2.4.3",
1051 | "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
1052 | "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
1053 | },
1054 | "node_modules/binary-extensions": {
1055 | "version": "2.2.0",
1056 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
1057 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
1058 | "dev": true,
1059 | "engines": {
1060 | "node": ">=8"
1061 | }
1062 | },
1063 | "node_modules/brace-expansion": {
1064 | "version": "2.0.1",
1065 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1066 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1067 | "dev": true,
1068 | "dependencies": {
1069 | "balanced-match": "^1.0.0"
1070 | }
1071 | },
1072 | "node_modules/braces": {
1073 | "version": "3.0.2",
1074 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
1075 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
1076 | "dev": true,
1077 | "dependencies": {
1078 | "fill-range": "^7.0.1"
1079 | },
1080 | "engines": {
1081 | "node": ">=8"
1082 | }
1083 | },
1084 | "node_modules/browserslist": {
1085 | "version": "4.22.2",
1086 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
1087 | "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
1088 | "dev": true,
1089 | "funding": [
1090 | {
1091 | "type": "opencollective",
1092 | "url": "https://opencollective.com/browserslist"
1093 | },
1094 | {
1095 | "type": "tidelift",
1096 | "url": "https://tidelift.com/funding/github/npm/browserslist"
1097 | },
1098 | {
1099 | "type": "github",
1100 | "url": "https://github.com/sponsors/ai"
1101 | }
1102 | ],
1103 | "dependencies": {
1104 | "caniuse-lite": "^1.0.30001565",
1105 | "electron-to-chromium": "^1.4.601",
1106 | "node-releases": "^2.0.14",
1107 | "update-browserslist-db": "^1.0.13"
1108 | },
1109 | "bin": {
1110 | "browserslist": "cli.js"
1111 | },
1112 | "engines": {
1113 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1114 | }
1115 | },
1116 | "node_modules/bson": {
1117 | "version": "6.2.0",
1118 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
1119 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
1120 | "engines": {
1121 | "node": ">=16.20.1"
1122 | }
1123 | },
1124 | "node_modules/busboy": {
1125 | "version": "1.6.0",
1126 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
1127 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
1128 | "dependencies": {
1129 | "streamsearch": "^1.1.0"
1130 | },
1131 | "engines": {
1132 | "node": ">=10.16.0"
1133 | }
1134 | },
1135 | "node_modules/callsites": {
1136 | "version": "3.1.0",
1137 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1138 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1139 | "engines": {
1140 | "node": ">=6"
1141 | }
1142 | },
1143 | "node_modules/camelcase-css": {
1144 | "version": "2.0.1",
1145 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1146 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1147 | "dev": true,
1148 | "engines": {
1149 | "node": ">= 6"
1150 | }
1151 | },
1152 | "node_modules/caniuse-lite": {
1153 | "version": "1.0.30001576",
1154 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz",
1155 | "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==",
1156 | "funding": [
1157 | {
1158 | "type": "opencollective",
1159 | "url": "https://opencollective.com/browserslist"
1160 | },
1161 | {
1162 | "type": "tidelift",
1163 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1164 | },
1165 | {
1166 | "type": "github",
1167 | "url": "https://github.com/sponsors/ai"
1168 | }
1169 | ]
1170 | },
1171 | "node_modules/chalk": {
1172 | "version": "2.4.2",
1173 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
1174 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
1175 | "dependencies": {
1176 | "ansi-styles": "^3.2.1",
1177 | "escape-string-regexp": "^1.0.5",
1178 | "supports-color": "^5.3.0"
1179 | },
1180 | "engines": {
1181 | "node": ">=4"
1182 | }
1183 | },
1184 | "node_modules/chalk/node_modules/ansi-styles": {
1185 | "version": "3.2.1",
1186 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1187 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1188 | "dependencies": {
1189 | "color-convert": "^1.9.0"
1190 | },
1191 | "engines": {
1192 | "node": ">=4"
1193 | }
1194 | },
1195 | "node_modules/chalk/node_modules/color-convert": {
1196 | "version": "1.9.3",
1197 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1198 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1199 | "dependencies": {
1200 | "color-name": "1.1.3"
1201 | }
1202 | },
1203 | "node_modules/chalk/node_modules/color-name": {
1204 | "version": "1.1.3",
1205 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1206 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
1207 | },
1208 | "node_modules/chalk/node_modules/escape-string-regexp": {
1209 | "version": "1.0.5",
1210 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1211 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
1212 | "engines": {
1213 | "node": ">=0.8.0"
1214 | }
1215 | },
1216 | "node_modules/chokidar": {
1217 | "version": "3.5.3",
1218 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
1219 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
1220 | "dev": true,
1221 | "funding": [
1222 | {
1223 | "type": "individual",
1224 | "url": "https://paulmillr.com/funding/"
1225 | }
1226 | ],
1227 | "dependencies": {
1228 | "anymatch": "~3.1.2",
1229 | "braces": "~3.0.2",
1230 | "glob-parent": "~5.1.2",
1231 | "is-binary-path": "~2.1.0",
1232 | "is-glob": "~4.0.1",
1233 | "normalize-path": "~3.0.0",
1234 | "readdirp": "~3.6.0"
1235 | },
1236 | "engines": {
1237 | "node": ">= 8.10.0"
1238 | },
1239 | "optionalDependencies": {
1240 | "fsevents": "~2.3.2"
1241 | }
1242 | },
1243 | "node_modules/chokidar/node_modules/glob-parent": {
1244 | "version": "5.1.2",
1245 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1246 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1247 | "dev": true,
1248 | "dependencies": {
1249 | "is-glob": "^4.0.1"
1250 | },
1251 | "engines": {
1252 | "node": ">= 6"
1253 | }
1254 | },
1255 | "node_modules/client-only": {
1256 | "version": "0.0.1",
1257 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
1258 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
1259 | },
1260 | "node_modules/clsx": {
1261 | "version": "2.1.0",
1262 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
1263 | "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
1264 | "peer": true,
1265 | "engines": {
1266 | "node": ">=6"
1267 | }
1268 | },
1269 | "node_modules/color-convert": {
1270 | "version": "2.0.1",
1271 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1272 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1273 | "dev": true,
1274 | "dependencies": {
1275 | "color-name": "~1.1.4"
1276 | },
1277 | "engines": {
1278 | "node": ">=7.0.0"
1279 | }
1280 | },
1281 | "node_modules/color-name": {
1282 | "version": "1.1.4",
1283 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1284 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1285 | "dev": true
1286 | },
1287 | "node_modules/combined-stream": {
1288 | "version": "1.0.8",
1289 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1290 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1291 | "dependencies": {
1292 | "delayed-stream": "~1.0.0"
1293 | },
1294 | "engines": {
1295 | "node": ">= 0.8"
1296 | }
1297 | },
1298 | "node_modules/commander": {
1299 | "version": "4.1.1",
1300 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1301 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1302 | "dev": true,
1303 | "engines": {
1304 | "node": ">= 6"
1305 | }
1306 | },
1307 | "node_modules/convert-source-map": {
1308 | "version": "1.9.0",
1309 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
1310 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
1311 | },
1312 | "node_modules/cookie": {
1313 | "version": "0.5.0",
1314 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
1315 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
1316 | "engines": {
1317 | "node": ">= 0.6"
1318 | }
1319 | },
1320 | "node_modules/cosmiconfig": {
1321 | "version": "7.1.0",
1322 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
1323 | "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
1324 | "dependencies": {
1325 | "@types/parse-json": "^4.0.0",
1326 | "import-fresh": "^3.2.1",
1327 | "parse-json": "^5.0.0",
1328 | "path-type": "^4.0.0",
1329 | "yaml": "^1.10.0"
1330 | },
1331 | "engines": {
1332 | "node": ">=10"
1333 | }
1334 | },
1335 | "node_modules/cosmiconfig/node_modules/yaml": {
1336 | "version": "1.10.2",
1337 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
1338 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
1339 | "engines": {
1340 | "node": ">= 6"
1341 | }
1342 | },
1343 | "node_modules/cross-spawn": {
1344 | "version": "7.0.3",
1345 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1346 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1347 | "dev": true,
1348 | "dependencies": {
1349 | "path-key": "^3.1.0",
1350 | "shebang-command": "^2.0.0",
1351 | "which": "^2.0.1"
1352 | },
1353 | "engines": {
1354 | "node": ">= 8"
1355 | }
1356 | },
1357 | "node_modules/cssesc": {
1358 | "version": "3.0.0",
1359 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1360 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1361 | "dev": true,
1362 | "bin": {
1363 | "cssesc": "bin/cssesc"
1364 | },
1365 | "engines": {
1366 | "node": ">=4"
1367 | }
1368 | },
1369 | "node_modules/csstype": {
1370 | "version": "3.1.3",
1371 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1372 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
1373 | },
1374 | "node_modules/date-fns": {
1375 | "version": "3.2.0",
1376 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.2.0.tgz",
1377 | "integrity": "sha512-E4KWKavANzeuusPi0jUjpuI22SURAznGkx7eZV+4i6x2A+IZxAMcajgkvuDAU1bg40+xuhW1zRdVIIM/4khuIg==",
1378 | "funding": {
1379 | "type": "github",
1380 | "url": "https://github.com/sponsors/kossnocorp"
1381 | }
1382 | },
1383 | "node_modules/debug": {
1384 | "version": "4.3.4",
1385 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1386 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1387 | "dependencies": {
1388 | "ms": "2.1.2"
1389 | },
1390 | "engines": {
1391 | "node": ">=6.0"
1392 | },
1393 | "peerDependenciesMeta": {
1394 | "supports-color": {
1395 | "optional": true
1396 | }
1397 | }
1398 | },
1399 | "node_modules/debug/node_modules/ms": {
1400 | "version": "2.1.2",
1401 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1402 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1403 | },
1404 | "node_modules/delayed-stream": {
1405 | "version": "1.0.0",
1406 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1407 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
1408 | "engines": {
1409 | "node": ">=0.4.0"
1410 | }
1411 | },
1412 | "node_modules/didyoumean": {
1413 | "version": "1.2.2",
1414 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1415 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1416 | "dev": true
1417 | },
1418 | "node_modules/dlv": {
1419 | "version": "1.1.3",
1420 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1421 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1422 | "dev": true
1423 | },
1424 | "node_modules/dom-helpers": {
1425 | "version": "5.2.1",
1426 | "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
1427 | "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
1428 | "peer": true,
1429 | "dependencies": {
1430 | "@babel/runtime": "^7.8.7",
1431 | "csstype": "^3.0.2"
1432 | }
1433 | },
1434 | "node_modules/eastasianwidth": {
1435 | "version": "0.2.0",
1436 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1437 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1438 | "dev": true
1439 | },
1440 | "node_modules/electron-to-chromium": {
1441 | "version": "1.4.630",
1442 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.630.tgz",
1443 | "integrity": "sha512-osHqhtjojpCsACVnuD11xO5g9xaCyw7Qqn/C2KParkMv42i8jrJJgx3g7mkHfpxwhy9MnOJr8+pKOdZ7qzgizg==",
1444 | "dev": true
1445 | },
1446 | "node_modules/emoji-regex": {
1447 | "version": "9.2.2",
1448 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1449 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1450 | "dev": true
1451 | },
1452 | "node_modules/error-ex": {
1453 | "version": "1.3.2",
1454 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
1455 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
1456 | "dependencies": {
1457 | "is-arrayish": "^0.2.1"
1458 | }
1459 | },
1460 | "node_modules/escalade": {
1461 | "version": "3.1.1",
1462 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
1463 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
1464 | "dev": true,
1465 | "engines": {
1466 | "node": ">=6"
1467 | }
1468 | },
1469 | "node_modules/escape-string-regexp": {
1470 | "version": "4.0.0",
1471 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1472 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1473 | "engines": {
1474 | "node": ">=10"
1475 | },
1476 | "funding": {
1477 | "url": "https://github.com/sponsors/sindresorhus"
1478 | }
1479 | },
1480 | "node_modules/event-target-shim": {
1481 | "version": "5.0.1",
1482 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
1483 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
1484 | "engines": {
1485 | "node": ">=6"
1486 | }
1487 | },
1488 | "node_modules/fast-glob": {
1489 | "version": "3.3.2",
1490 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
1491 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
1492 | "dev": true,
1493 | "dependencies": {
1494 | "@nodelib/fs.stat": "^2.0.2",
1495 | "@nodelib/fs.walk": "^1.2.3",
1496 | "glob-parent": "^5.1.2",
1497 | "merge2": "^1.3.0",
1498 | "micromatch": "^4.0.4"
1499 | },
1500 | "engines": {
1501 | "node": ">=8.6.0"
1502 | }
1503 | },
1504 | "node_modules/fast-glob/node_modules/glob-parent": {
1505 | "version": "5.1.2",
1506 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1507 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1508 | "dev": true,
1509 | "dependencies": {
1510 | "is-glob": "^4.0.1"
1511 | },
1512 | "engines": {
1513 | "node": ">= 6"
1514 | }
1515 | },
1516 | "node_modules/fastq": {
1517 | "version": "1.16.0",
1518 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
1519 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
1520 | "dev": true,
1521 | "dependencies": {
1522 | "reusify": "^1.0.4"
1523 | }
1524 | },
1525 | "node_modules/fill-range": {
1526 | "version": "7.0.1",
1527 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1528 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1529 | "dev": true,
1530 | "dependencies": {
1531 | "to-regex-range": "^5.0.1"
1532 | },
1533 | "engines": {
1534 | "node": ">=8"
1535 | }
1536 | },
1537 | "node_modules/find-root": {
1538 | "version": "1.1.0",
1539 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
1540 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
1541 | },
1542 | "node_modules/foreground-child": {
1543 | "version": "3.1.1",
1544 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
1545 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
1546 | "dev": true,
1547 | "dependencies": {
1548 | "cross-spawn": "^7.0.0",
1549 | "signal-exit": "^4.0.1"
1550 | },
1551 | "engines": {
1552 | "node": ">=14"
1553 | },
1554 | "funding": {
1555 | "url": "https://github.com/sponsors/isaacs"
1556 | }
1557 | },
1558 | "node_modules/form-data": {
1559 | "version": "4.0.0",
1560 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1561 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1562 | "dependencies": {
1563 | "asynckit": "^0.4.0",
1564 | "combined-stream": "^1.0.8",
1565 | "mime-types": "^2.1.12"
1566 | },
1567 | "engines": {
1568 | "node": ">= 6"
1569 | }
1570 | },
1571 | "node_modules/fraction.js": {
1572 | "version": "4.3.7",
1573 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
1574 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
1575 | "dev": true,
1576 | "engines": {
1577 | "node": "*"
1578 | },
1579 | "funding": {
1580 | "type": "patreon",
1581 | "url": "https://github.com/sponsors/rawify"
1582 | }
1583 | },
1584 | "node_modules/fsevents": {
1585 | "version": "2.3.3",
1586 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1587 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1588 | "dev": true,
1589 | "hasInstallScript": true,
1590 | "optional": true,
1591 | "os": [
1592 | "darwin"
1593 | ],
1594 | "engines": {
1595 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1596 | }
1597 | },
1598 | "node_modules/function-bind": {
1599 | "version": "1.1.2",
1600 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1601 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1602 | "funding": {
1603 | "url": "https://github.com/sponsors/ljharb"
1604 | }
1605 | },
1606 | "node_modules/glob": {
1607 | "version": "10.3.10",
1608 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
1609 | "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
1610 | "dev": true,
1611 | "dependencies": {
1612 | "foreground-child": "^3.1.0",
1613 | "jackspeak": "^2.3.5",
1614 | "minimatch": "^9.0.1",
1615 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
1616 | "path-scurry": "^1.10.1"
1617 | },
1618 | "bin": {
1619 | "glob": "dist/esm/bin.mjs"
1620 | },
1621 | "engines": {
1622 | "node": ">=16 || 14 >=14.17"
1623 | },
1624 | "funding": {
1625 | "url": "https://github.com/sponsors/isaacs"
1626 | }
1627 | },
1628 | "node_modules/glob-parent": {
1629 | "version": "6.0.2",
1630 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1631 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1632 | "dev": true,
1633 | "dependencies": {
1634 | "is-glob": "^4.0.3"
1635 | },
1636 | "engines": {
1637 | "node": ">=10.13.0"
1638 | }
1639 | },
1640 | "node_modules/glob-to-regexp": {
1641 | "version": "0.4.1",
1642 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
1643 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
1644 | },
1645 | "node_modules/goober": {
1646 | "version": "2.1.14",
1647 | "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz",
1648 | "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==",
1649 | "peerDependencies": {
1650 | "csstype": "^3.0.10"
1651 | }
1652 | },
1653 | "node_modules/graceful-fs": {
1654 | "version": "4.2.11",
1655 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1656 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
1657 | },
1658 | "node_modules/has-flag": {
1659 | "version": "3.0.0",
1660 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1661 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
1662 | "engines": {
1663 | "node": ">=4"
1664 | }
1665 | },
1666 | "node_modules/hasown": {
1667 | "version": "2.0.0",
1668 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
1669 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
1670 | "dependencies": {
1671 | "function-bind": "^1.1.2"
1672 | },
1673 | "engines": {
1674 | "node": ">= 0.4"
1675 | }
1676 | },
1677 | "node_modules/hoist-non-react-statics": {
1678 | "version": "3.3.2",
1679 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
1680 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
1681 | "dependencies": {
1682 | "react-is": "^16.7.0"
1683 | }
1684 | },
1685 | "node_modules/hoist-non-react-statics/node_modules/react-is": {
1686 | "version": "16.13.1",
1687 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
1688 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
1689 | },
1690 | "node_modules/import-fresh": {
1691 | "version": "3.3.0",
1692 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1693 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1694 | "dependencies": {
1695 | "parent-module": "^1.0.0",
1696 | "resolve-from": "^4.0.0"
1697 | },
1698 | "engines": {
1699 | "node": ">=6"
1700 | },
1701 | "funding": {
1702 | "url": "https://github.com/sponsors/sindresorhus"
1703 | }
1704 | },
1705 | "node_modules/is-arrayish": {
1706 | "version": "0.2.1",
1707 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1708 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
1709 | },
1710 | "node_modules/is-base64": {
1711 | "version": "1.1.0",
1712 | "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-1.1.0.tgz",
1713 | "integrity": "sha512-Nlhg7Z2dVC4/PTvIFkgVVNvPHSO2eR/Yd0XzhGiXCXEvWnptXlXa/clQ8aePPiMuxEGcWfzWbGw2Fe3d+Y3v1g==",
1714 | "bin": {
1715 | "is_base64": "bin/is-base64",
1716 | "is-base64": "bin/is-base64"
1717 | }
1718 | },
1719 | "node_modules/is-binary-path": {
1720 | "version": "2.1.0",
1721 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1722 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1723 | "dev": true,
1724 | "dependencies": {
1725 | "binary-extensions": "^2.0.0"
1726 | },
1727 | "engines": {
1728 | "node": ">=8"
1729 | }
1730 | },
1731 | "node_modules/is-core-module": {
1732 | "version": "2.13.1",
1733 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
1734 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
1735 | "dependencies": {
1736 | "hasown": "^2.0.0"
1737 | },
1738 | "funding": {
1739 | "url": "https://github.com/sponsors/ljharb"
1740 | }
1741 | },
1742 | "node_modules/is-extglob": {
1743 | "version": "2.1.1",
1744 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1745 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1746 | "dev": true,
1747 | "engines": {
1748 | "node": ">=0.10.0"
1749 | }
1750 | },
1751 | "node_modules/is-fullwidth-code-point": {
1752 | "version": "3.0.0",
1753 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1754 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1755 | "dev": true,
1756 | "engines": {
1757 | "node": ">=8"
1758 | }
1759 | },
1760 | "node_modules/is-glob": {
1761 | "version": "4.0.3",
1762 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1763 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1764 | "dev": true,
1765 | "dependencies": {
1766 | "is-extglob": "^2.1.1"
1767 | },
1768 | "engines": {
1769 | "node": ">=0.10.0"
1770 | }
1771 | },
1772 | "node_modules/is-number": {
1773 | "version": "7.0.0",
1774 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1775 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1776 | "dev": true,
1777 | "engines": {
1778 | "node": ">=0.12.0"
1779 | }
1780 | },
1781 | "node_modules/isexe": {
1782 | "version": "2.0.0",
1783 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1784 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1785 | "dev": true
1786 | },
1787 | "node_modules/jackspeak": {
1788 | "version": "2.3.6",
1789 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
1790 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
1791 | "dev": true,
1792 | "dependencies": {
1793 | "@isaacs/cliui": "^8.0.2"
1794 | },
1795 | "engines": {
1796 | "node": ">=14"
1797 | },
1798 | "funding": {
1799 | "url": "https://github.com/sponsors/isaacs"
1800 | },
1801 | "optionalDependencies": {
1802 | "@pkgjs/parseargs": "^0.11.0"
1803 | }
1804 | },
1805 | "node_modules/jiti": {
1806 | "version": "1.21.0",
1807 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
1808 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
1809 | "dev": true,
1810 | "bin": {
1811 | "jiti": "bin/jiti.js"
1812 | }
1813 | },
1814 | "node_modules/jose": {
1815 | "version": "4.15.4",
1816 | "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz",
1817 | "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==",
1818 | "funding": {
1819 | "url": "https://github.com/sponsors/panva"
1820 | }
1821 | },
1822 | "node_modules/js-tokens": {
1823 | "version": "4.0.0",
1824 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1825 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1826 | },
1827 | "node_modules/json-parse-even-better-errors": {
1828 | "version": "2.3.1",
1829 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
1830 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
1831 | },
1832 | "node_modules/kareem": {
1833 | "version": "2.5.1",
1834 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
1835 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
1836 | "engines": {
1837 | "node": ">=12.0.0"
1838 | }
1839 | },
1840 | "node_modules/lilconfig": {
1841 | "version": "2.1.0",
1842 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
1843 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
1844 | "dev": true,
1845 | "engines": {
1846 | "node": ">=10"
1847 | }
1848 | },
1849 | "node_modules/lines-and-columns": {
1850 | "version": "1.2.4",
1851 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1852 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
1853 | },
1854 | "node_modules/loose-envify": {
1855 | "version": "1.4.0",
1856 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1857 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1858 | "dependencies": {
1859 | "js-tokens": "^3.0.0 || ^4.0.0"
1860 | },
1861 | "bin": {
1862 | "loose-envify": "cli.js"
1863 | }
1864 | },
1865 | "node_modules/lru-cache": {
1866 | "version": "10.1.0",
1867 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
1868 | "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
1869 | "dev": true,
1870 | "engines": {
1871 | "node": "14 || >=16.14"
1872 | }
1873 | },
1874 | "node_modules/memory-pager": {
1875 | "version": "1.5.0",
1876 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
1877 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
1878 | },
1879 | "node_modules/merge2": {
1880 | "version": "1.4.1",
1881 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1882 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1883 | "dev": true,
1884 | "engines": {
1885 | "node": ">= 8"
1886 | }
1887 | },
1888 | "node_modules/micromatch": {
1889 | "version": "4.0.5",
1890 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
1891 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
1892 | "dev": true,
1893 | "dependencies": {
1894 | "braces": "^3.0.2",
1895 | "picomatch": "^2.3.1"
1896 | },
1897 | "engines": {
1898 | "node": ">=8.6"
1899 | }
1900 | },
1901 | "node_modules/mime-db": {
1902 | "version": "1.52.0",
1903 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1904 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1905 | "engines": {
1906 | "node": ">= 0.6"
1907 | }
1908 | },
1909 | "node_modules/mime-types": {
1910 | "version": "2.1.35",
1911 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1912 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1913 | "dependencies": {
1914 | "mime-db": "1.52.0"
1915 | },
1916 | "engines": {
1917 | "node": ">= 0.6"
1918 | }
1919 | },
1920 | "node_modules/minimatch": {
1921 | "version": "9.0.3",
1922 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
1923 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
1924 | "dev": true,
1925 | "dependencies": {
1926 | "brace-expansion": "^2.0.1"
1927 | },
1928 | "engines": {
1929 | "node": ">=16 || 14 >=14.17"
1930 | },
1931 | "funding": {
1932 | "url": "https://github.com/sponsors/isaacs"
1933 | }
1934 | },
1935 | "node_modules/minipass": {
1936 | "version": "7.0.4",
1937 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
1938 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
1939 | "dev": true,
1940 | "engines": {
1941 | "node": ">=16 || 14 >=14.17"
1942 | }
1943 | },
1944 | "node_modules/mongodb": {
1945 | "version": "6.2.0",
1946 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
1947 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
1948 | "dependencies": {
1949 | "@mongodb-js/saslprep": "^1.1.0",
1950 | "bson": "^6.2.0",
1951 | "mongodb-connection-string-url": "^2.6.0"
1952 | },
1953 | "engines": {
1954 | "node": ">=16.20.1"
1955 | },
1956 | "peerDependencies": {
1957 | "@aws-sdk/credential-providers": "^3.188.0",
1958 | "@mongodb-js/zstd": "^1.1.0",
1959 | "gcp-metadata": "^5.2.0",
1960 | "kerberos": "^2.0.1",
1961 | "mongodb-client-encryption": ">=6.0.0 <7",
1962 | "snappy": "^7.2.2",
1963 | "socks": "^2.7.1"
1964 | },
1965 | "peerDependenciesMeta": {
1966 | "@aws-sdk/credential-providers": {
1967 | "optional": true
1968 | },
1969 | "@mongodb-js/zstd": {
1970 | "optional": true
1971 | },
1972 | "gcp-metadata": {
1973 | "optional": true
1974 | },
1975 | "kerberos": {
1976 | "optional": true
1977 | },
1978 | "mongodb-client-encryption": {
1979 | "optional": true
1980 | },
1981 | "snappy": {
1982 | "optional": true
1983 | },
1984 | "socks": {
1985 | "optional": true
1986 | }
1987 | }
1988 | },
1989 | "node_modules/mongodb-connection-string-url": {
1990 | "version": "2.6.0",
1991 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
1992 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
1993 | "dependencies": {
1994 | "@types/whatwg-url": "^8.2.1",
1995 | "whatwg-url": "^11.0.0"
1996 | }
1997 | },
1998 | "node_modules/mongoose": {
1999 | "version": "8.0.4",
2000 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.4.tgz",
2001 | "integrity": "sha512-wN9qvdevX3+922VnLT7CpaZRT3jmVCBOK2QMHMGeScQxDRnFMPpkuI9StEPpZo/3x8t+kbzH7F8RMPsyNwyM4w==",
2002 | "dependencies": {
2003 | "bson": "^6.2.0",
2004 | "kareem": "2.5.1",
2005 | "mongodb": "6.2.0",
2006 | "mpath": "0.9.0",
2007 | "mquery": "5.0.0",
2008 | "ms": "2.1.3",
2009 | "sift": "16.0.1"
2010 | },
2011 | "engines": {
2012 | "node": ">=16.20.1"
2013 | },
2014 | "funding": {
2015 | "type": "opencollective",
2016 | "url": "https://opencollective.com/mongoose"
2017 | }
2018 | },
2019 | "node_modules/mpath": {
2020 | "version": "0.9.0",
2021 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
2022 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
2023 | "engines": {
2024 | "node": ">=4.0.0"
2025 | }
2026 | },
2027 | "node_modules/mquery": {
2028 | "version": "5.0.0",
2029 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
2030 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
2031 | "dependencies": {
2032 | "debug": "4.x"
2033 | },
2034 | "engines": {
2035 | "node": ">=14.0.0"
2036 | }
2037 | },
2038 | "node_modules/ms": {
2039 | "version": "2.1.3",
2040 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2041 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
2042 | },
2043 | "node_modules/mz": {
2044 | "version": "2.7.0",
2045 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
2046 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
2047 | "dev": true,
2048 | "dependencies": {
2049 | "any-promise": "^1.0.0",
2050 | "object-assign": "^4.0.1",
2051 | "thenify-all": "^1.0.0"
2052 | }
2053 | },
2054 | "node_modules/nanoid": {
2055 | "version": "3.3.7",
2056 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
2057 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
2058 | "funding": [
2059 | {
2060 | "type": "github",
2061 | "url": "https://github.com/sponsors/ai"
2062 | }
2063 | ],
2064 | "bin": {
2065 | "nanoid": "bin/nanoid.cjs"
2066 | },
2067 | "engines": {
2068 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2069 | }
2070 | },
2071 | "node_modules/next": {
2072 | "version": "14.0.4",
2073 | "resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz",
2074 | "integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==",
2075 | "dependencies": {
2076 | "@next/env": "14.0.4",
2077 | "@swc/helpers": "0.5.2",
2078 | "busboy": "1.6.0",
2079 | "caniuse-lite": "^1.0.30001406",
2080 | "graceful-fs": "^4.2.11",
2081 | "postcss": "8.4.31",
2082 | "styled-jsx": "5.1.1",
2083 | "watchpack": "2.4.0"
2084 | },
2085 | "bin": {
2086 | "next": "dist/bin/next"
2087 | },
2088 | "engines": {
2089 | "node": ">=18.17.0"
2090 | },
2091 | "optionalDependencies": {
2092 | "@next/swc-darwin-arm64": "14.0.4",
2093 | "@next/swc-darwin-x64": "14.0.4",
2094 | "@next/swc-linux-arm64-gnu": "14.0.4",
2095 | "@next/swc-linux-arm64-musl": "14.0.4",
2096 | "@next/swc-linux-x64-gnu": "14.0.4",
2097 | "@next/swc-linux-x64-musl": "14.0.4",
2098 | "@next/swc-win32-arm64-msvc": "14.0.4",
2099 | "@next/swc-win32-ia32-msvc": "14.0.4",
2100 | "@next/swc-win32-x64-msvc": "14.0.4"
2101 | },
2102 | "peerDependencies": {
2103 | "@opentelemetry/api": "^1.1.0",
2104 | "react": "^18.2.0",
2105 | "react-dom": "^18.2.0",
2106 | "sass": "^1.3.0"
2107 | },
2108 | "peerDependenciesMeta": {
2109 | "@opentelemetry/api": {
2110 | "optional": true
2111 | },
2112 | "sass": {
2113 | "optional": true
2114 | }
2115 | }
2116 | },
2117 | "node_modules/next-auth": {
2118 | "version": "4.24.5",
2119 | "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz",
2120 | "integrity": "sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==",
2121 | "dependencies": {
2122 | "@babel/runtime": "^7.20.13",
2123 | "@panva/hkdf": "^1.0.2",
2124 | "cookie": "^0.5.0",
2125 | "jose": "^4.11.4",
2126 | "oauth": "^0.9.15",
2127 | "openid-client": "^5.4.0",
2128 | "preact": "^10.6.3",
2129 | "preact-render-to-string": "^5.1.19",
2130 | "uuid": "^8.3.2"
2131 | },
2132 | "peerDependencies": {
2133 | "next": "^12.2.5 || ^13 || ^14",
2134 | "nodemailer": "^6.6.5",
2135 | "react": "^17.0.2 || ^18",
2136 | "react-dom": "^17.0.2 || ^18"
2137 | },
2138 | "peerDependenciesMeta": {
2139 | "nodemailer": {
2140 | "optional": true
2141 | }
2142 | }
2143 | },
2144 | "node_modules/next-cloudinary": {
2145 | "version": "5.18.0",
2146 | "resolved": "https://registry.npmjs.org/next-cloudinary/-/next-cloudinary-5.18.0.tgz",
2147 | "integrity": "sha512-QzqjyNs+ji+XCbkDQ+vfOoG37mgNI0gXnI8dPgKPnORIVOfZIjfIRh2hFDL3paEX2ph0CHj4mc4Pu2pSIDTkcw==",
2148 | "dependencies": {
2149 | "@cloudinary-util/url-loader": "^3.22.0",
2150 | "@cloudinary-util/util": "^2.3.0"
2151 | },
2152 | "peerDependencies": {
2153 | "next": "^12 || ^13 || ^14",
2154 | "react": "^17 || ^18"
2155 | }
2156 | },
2157 | "node_modules/next/node_modules/postcss": {
2158 | "version": "8.4.31",
2159 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
2160 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
2161 | "funding": [
2162 | {
2163 | "type": "opencollective",
2164 | "url": "https://opencollective.com/postcss/"
2165 | },
2166 | {
2167 | "type": "tidelift",
2168 | "url": "https://tidelift.com/funding/github/npm/postcss"
2169 | },
2170 | {
2171 | "type": "github",
2172 | "url": "https://github.com/sponsors/ai"
2173 | }
2174 | ],
2175 | "dependencies": {
2176 | "nanoid": "^3.3.6",
2177 | "picocolors": "^1.0.0",
2178 | "source-map-js": "^1.0.2"
2179 | },
2180 | "engines": {
2181 | "node": "^10 || ^12 || >=14"
2182 | }
2183 | },
2184 | "node_modules/node-fetch": {
2185 | "version": "2.7.0",
2186 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
2187 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
2188 | "dependencies": {
2189 | "whatwg-url": "^5.0.0"
2190 | },
2191 | "engines": {
2192 | "node": "4.x || >=6.0.0"
2193 | },
2194 | "peerDependencies": {
2195 | "encoding": "^0.1.0"
2196 | },
2197 | "peerDependenciesMeta": {
2198 | "encoding": {
2199 | "optional": true
2200 | }
2201 | }
2202 | },
2203 | "node_modules/node-fetch/node_modules/tr46": {
2204 | "version": "0.0.3",
2205 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
2206 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
2207 | },
2208 | "node_modules/node-fetch/node_modules/webidl-conversions": {
2209 | "version": "3.0.1",
2210 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
2211 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
2212 | },
2213 | "node_modules/node-fetch/node_modules/whatwg-url": {
2214 | "version": "5.0.0",
2215 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
2216 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
2217 | "dependencies": {
2218 | "tr46": "~0.0.3",
2219 | "webidl-conversions": "^3.0.0"
2220 | }
2221 | },
2222 | "node_modules/node-releases": {
2223 | "version": "2.0.14",
2224 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
2225 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
2226 | "dev": true
2227 | },
2228 | "node_modules/normalize-path": {
2229 | "version": "3.0.0",
2230 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2231 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2232 | "dev": true,
2233 | "engines": {
2234 | "node": ">=0.10.0"
2235 | }
2236 | },
2237 | "node_modules/normalize-range": {
2238 | "version": "0.1.2",
2239 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
2240 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
2241 | "dev": true,
2242 | "engines": {
2243 | "node": ">=0.10.0"
2244 | }
2245 | },
2246 | "node_modules/oauth": {
2247 | "version": "0.9.15",
2248 | "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
2249 | "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA=="
2250 | },
2251 | "node_modules/object-assign": {
2252 | "version": "4.1.1",
2253 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2254 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2255 | "engines": {
2256 | "node": ">=0.10.0"
2257 | }
2258 | },
2259 | "node_modules/object-hash": {
2260 | "version": "3.0.0",
2261 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
2262 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
2263 | "dev": true,
2264 | "engines": {
2265 | "node": ">= 6"
2266 | }
2267 | },
2268 | "node_modules/oidc-token-hash": {
2269 | "version": "5.0.3",
2270 | "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz",
2271 | "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==",
2272 | "engines": {
2273 | "node": "^10.13.0 || >=12.0.0"
2274 | }
2275 | },
2276 | "node_modules/openid-client": {
2277 | "version": "5.6.4",
2278 | "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz",
2279 | "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==",
2280 | "dependencies": {
2281 | "jose": "^4.15.4",
2282 | "lru-cache": "^6.0.0",
2283 | "object-hash": "^2.2.0",
2284 | "oidc-token-hash": "^5.0.3"
2285 | },
2286 | "funding": {
2287 | "url": "https://github.com/sponsors/panva"
2288 | }
2289 | },
2290 | "node_modules/openid-client/node_modules/lru-cache": {
2291 | "version": "6.0.0",
2292 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
2293 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
2294 | "dependencies": {
2295 | "yallist": "^4.0.0"
2296 | },
2297 | "engines": {
2298 | "node": ">=10"
2299 | }
2300 | },
2301 | "node_modules/openid-client/node_modules/object-hash": {
2302 | "version": "2.2.0",
2303 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
2304 | "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
2305 | "engines": {
2306 | "node": ">= 6"
2307 | }
2308 | },
2309 | "node_modules/parent-module": {
2310 | "version": "1.0.1",
2311 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2312 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2313 | "dependencies": {
2314 | "callsites": "^3.0.0"
2315 | },
2316 | "engines": {
2317 | "node": ">=6"
2318 | }
2319 | },
2320 | "node_modules/parse-json": {
2321 | "version": "5.2.0",
2322 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
2323 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
2324 | "dependencies": {
2325 | "@babel/code-frame": "^7.0.0",
2326 | "error-ex": "^1.3.1",
2327 | "json-parse-even-better-errors": "^2.3.0",
2328 | "lines-and-columns": "^1.1.6"
2329 | },
2330 | "engines": {
2331 | "node": ">=8"
2332 | },
2333 | "funding": {
2334 | "url": "https://github.com/sponsors/sindresorhus"
2335 | }
2336 | },
2337 | "node_modules/path-key": {
2338 | "version": "3.1.1",
2339 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2340 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2341 | "dev": true,
2342 | "engines": {
2343 | "node": ">=8"
2344 | }
2345 | },
2346 | "node_modules/path-parse": {
2347 | "version": "1.0.7",
2348 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2349 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
2350 | },
2351 | "node_modules/path-scurry": {
2352 | "version": "1.10.1",
2353 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
2354 | "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
2355 | "dev": true,
2356 | "dependencies": {
2357 | "lru-cache": "^9.1.1 || ^10.0.0",
2358 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
2359 | },
2360 | "engines": {
2361 | "node": ">=16 || 14 >=14.17"
2362 | },
2363 | "funding": {
2364 | "url": "https://github.com/sponsors/isaacs"
2365 | }
2366 | },
2367 | "node_modules/path-type": {
2368 | "version": "4.0.0",
2369 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2370 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2371 | "engines": {
2372 | "node": ">=8"
2373 | }
2374 | },
2375 | "node_modules/picocolors": {
2376 | "version": "1.0.0",
2377 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
2378 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
2379 | },
2380 | "node_modules/picomatch": {
2381 | "version": "2.3.1",
2382 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2383 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2384 | "dev": true,
2385 | "engines": {
2386 | "node": ">=8.6"
2387 | },
2388 | "funding": {
2389 | "url": "https://github.com/sponsors/jonschlinkert"
2390 | }
2391 | },
2392 | "node_modules/pify": {
2393 | "version": "2.3.0",
2394 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2395 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
2396 | "dev": true,
2397 | "engines": {
2398 | "node": ">=0.10.0"
2399 | }
2400 | },
2401 | "node_modules/pirates": {
2402 | "version": "4.0.6",
2403 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
2404 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
2405 | "dev": true,
2406 | "engines": {
2407 | "node": ">= 6"
2408 | }
2409 | },
2410 | "node_modules/postcss": {
2411 | "version": "8.4.33",
2412 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz",
2413 | "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
2414 | "dev": true,
2415 | "funding": [
2416 | {
2417 | "type": "opencollective",
2418 | "url": "https://opencollective.com/postcss/"
2419 | },
2420 | {
2421 | "type": "tidelift",
2422 | "url": "https://tidelift.com/funding/github/npm/postcss"
2423 | },
2424 | {
2425 | "type": "github",
2426 | "url": "https://github.com/sponsors/ai"
2427 | }
2428 | ],
2429 | "dependencies": {
2430 | "nanoid": "^3.3.7",
2431 | "picocolors": "^1.0.0",
2432 | "source-map-js": "^1.0.2"
2433 | },
2434 | "engines": {
2435 | "node": "^10 || ^12 || >=14"
2436 | }
2437 | },
2438 | "node_modules/postcss-import": {
2439 | "version": "15.1.0",
2440 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
2441 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
2442 | "dev": true,
2443 | "dependencies": {
2444 | "postcss-value-parser": "^4.0.0",
2445 | "read-cache": "^1.0.0",
2446 | "resolve": "^1.1.7"
2447 | },
2448 | "engines": {
2449 | "node": ">=14.0.0"
2450 | },
2451 | "peerDependencies": {
2452 | "postcss": "^8.0.0"
2453 | }
2454 | },
2455 | "node_modules/postcss-js": {
2456 | "version": "4.0.1",
2457 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
2458 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
2459 | "dev": true,
2460 | "dependencies": {
2461 | "camelcase-css": "^2.0.1"
2462 | },
2463 | "engines": {
2464 | "node": "^12 || ^14 || >= 16"
2465 | },
2466 | "funding": {
2467 | "type": "opencollective",
2468 | "url": "https://opencollective.com/postcss/"
2469 | },
2470 | "peerDependencies": {
2471 | "postcss": "^8.4.21"
2472 | }
2473 | },
2474 | "node_modules/postcss-load-config": {
2475 | "version": "4.0.2",
2476 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
2477 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
2478 | "dev": true,
2479 | "funding": [
2480 | {
2481 | "type": "opencollective",
2482 | "url": "https://opencollective.com/postcss/"
2483 | },
2484 | {
2485 | "type": "github",
2486 | "url": "https://github.com/sponsors/ai"
2487 | }
2488 | ],
2489 | "dependencies": {
2490 | "lilconfig": "^3.0.0",
2491 | "yaml": "^2.3.4"
2492 | },
2493 | "engines": {
2494 | "node": ">= 14"
2495 | },
2496 | "peerDependencies": {
2497 | "postcss": ">=8.0.9",
2498 | "ts-node": ">=9.0.0"
2499 | },
2500 | "peerDependenciesMeta": {
2501 | "postcss": {
2502 | "optional": true
2503 | },
2504 | "ts-node": {
2505 | "optional": true
2506 | }
2507 | }
2508 | },
2509 | "node_modules/postcss-load-config/node_modules/lilconfig": {
2510 | "version": "3.0.0",
2511 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
2512 | "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
2513 | "dev": true,
2514 | "engines": {
2515 | "node": ">=14"
2516 | }
2517 | },
2518 | "node_modules/postcss-nested": {
2519 | "version": "6.0.1",
2520 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
2521 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
2522 | "dev": true,
2523 | "dependencies": {
2524 | "postcss-selector-parser": "^6.0.11"
2525 | },
2526 | "engines": {
2527 | "node": ">=12.0"
2528 | },
2529 | "funding": {
2530 | "type": "opencollective",
2531 | "url": "https://opencollective.com/postcss/"
2532 | },
2533 | "peerDependencies": {
2534 | "postcss": "^8.2.14"
2535 | }
2536 | },
2537 | "node_modules/postcss-selector-parser": {
2538 | "version": "6.0.15",
2539 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
2540 | "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
2541 | "dev": true,
2542 | "dependencies": {
2543 | "cssesc": "^3.0.0",
2544 | "util-deprecate": "^1.0.2"
2545 | },
2546 | "engines": {
2547 | "node": ">=4"
2548 | }
2549 | },
2550 | "node_modules/postcss-value-parser": {
2551 | "version": "4.2.0",
2552 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
2553 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
2554 | "dev": true
2555 | },
2556 | "node_modules/preact": {
2557 | "version": "10.19.3",
2558 | "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz",
2559 | "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==",
2560 | "funding": {
2561 | "type": "opencollective",
2562 | "url": "https://opencollective.com/preact"
2563 | }
2564 | },
2565 | "node_modules/preact-render-to-string": {
2566 | "version": "5.2.6",
2567 | "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz",
2568 | "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==",
2569 | "dependencies": {
2570 | "pretty-format": "^3.8.0"
2571 | },
2572 | "peerDependencies": {
2573 | "preact": ">=10"
2574 | }
2575 | },
2576 | "node_modules/pretty-format": {
2577 | "version": "3.8.0",
2578 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
2579 | "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
2580 | },
2581 | "node_modules/prop-types": {
2582 | "version": "15.8.1",
2583 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
2584 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
2585 | "peer": true,
2586 | "dependencies": {
2587 | "loose-envify": "^1.4.0",
2588 | "object-assign": "^4.1.1",
2589 | "react-is": "^16.13.1"
2590 | }
2591 | },
2592 | "node_modules/prop-types/node_modules/react-is": {
2593 | "version": "16.13.1",
2594 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2595 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
2596 | "peer": true
2597 | },
2598 | "node_modules/punycode": {
2599 | "version": "2.3.1",
2600 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2601 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2602 | "engines": {
2603 | "node": ">=6"
2604 | }
2605 | },
2606 | "node_modules/pusher": {
2607 | "version": "5.2.0",
2608 | "resolved": "https://registry.npmjs.org/pusher/-/pusher-5.2.0.tgz",
2609 | "integrity": "sha512-F6LNiZyJsIkoHLz+YurjKZ1HH8V1/cMggn4k97kihjP3uTvm0P4mZzSFeHOWIy+PlJ2VInJBhUFJBYLsFR5cjg==",
2610 | "dependencies": {
2611 | "@types/node-fetch": "^2.5.7",
2612 | "abort-controller": "^3.0.0",
2613 | "is-base64": "^1.1.0",
2614 | "node-fetch": "^2.6.1",
2615 | "tweetnacl": "^1.0.0",
2616 | "tweetnacl-util": "^0.15.0"
2617 | },
2618 | "engines": {
2619 | "node": ">= 4.0.0"
2620 | }
2621 | },
2622 | "node_modules/pusher-js": {
2623 | "version": "8.4.0-rc2",
2624 | "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.4.0-rc2.tgz",
2625 | "integrity": "sha512-d87GjOEEl9QgO5BWmViSqW0LOzPvybvX6WA9zLUstNdB57jVJuR27zHkRnrav2a3+zAMlHbP2Og8wug+rG8T+g==",
2626 | "dependencies": {
2627 | "tweetnacl": "^1.0.3"
2628 | }
2629 | },
2630 | "node_modules/queue-microtask": {
2631 | "version": "1.2.3",
2632 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2633 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2634 | "dev": true,
2635 | "funding": [
2636 | {
2637 | "type": "github",
2638 | "url": "https://github.com/sponsors/feross"
2639 | },
2640 | {
2641 | "type": "patreon",
2642 | "url": "https://www.patreon.com/feross"
2643 | },
2644 | {
2645 | "type": "consulting",
2646 | "url": "https://feross.org/support"
2647 | }
2648 | ]
2649 | },
2650 | "node_modules/react": {
2651 | "version": "18.2.0",
2652 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
2653 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
2654 | "dependencies": {
2655 | "loose-envify": "^1.1.0"
2656 | },
2657 | "engines": {
2658 | "node": ">=0.10.0"
2659 | }
2660 | },
2661 | "node_modules/react-dom": {
2662 | "version": "18.2.0",
2663 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
2664 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
2665 | "dependencies": {
2666 | "loose-envify": "^1.1.0",
2667 | "scheduler": "^0.23.0"
2668 | },
2669 | "peerDependencies": {
2670 | "react": "^18.2.0"
2671 | }
2672 | },
2673 | "node_modules/react-hook-form": {
2674 | "version": "7.49.3",
2675 | "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.3.tgz",
2676 | "integrity": "sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ==",
2677 | "engines": {
2678 | "node": ">=18",
2679 | "pnpm": "8"
2680 | },
2681 | "funding": {
2682 | "type": "opencollective",
2683 | "url": "https://opencollective.com/react-hook-form"
2684 | },
2685 | "peerDependencies": {
2686 | "react": "^16.8.0 || ^17 || ^18"
2687 | }
2688 | },
2689 | "node_modules/react-hot-toast": {
2690 | "version": "2.4.1",
2691 | "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz",
2692 | "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==",
2693 | "dependencies": {
2694 | "goober": "^2.1.10"
2695 | },
2696 | "engines": {
2697 | "node": ">=10"
2698 | },
2699 | "peerDependencies": {
2700 | "react": ">=16",
2701 | "react-dom": ">=16"
2702 | }
2703 | },
2704 | "node_modules/react-is": {
2705 | "version": "18.2.0",
2706 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
2707 | "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
2708 | "peer": true
2709 | },
2710 | "node_modules/react-transition-group": {
2711 | "version": "4.4.5",
2712 | "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
2713 | "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
2714 | "peer": true,
2715 | "dependencies": {
2716 | "@babel/runtime": "^7.5.5",
2717 | "dom-helpers": "^5.0.1",
2718 | "loose-envify": "^1.4.0",
2719 | "prop-types": "^15.6.2"
2720 | },
2721 | "peerDependencies": {
2722 | "react": ">=16.6.0",
2723 | "react-dom": ">=16.6.0"
2724 | }
2725 | },
2726 | "node_modules/read-cache": {
2727 | "version": "1.0.0",
2728 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2729 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
2730 | "dev": true,
2731 | "dependencies": {
2732 | "pify": "^2.3.0"
2733 | }
2734 | },
2735 | "node_modules/readdirp": {
2736 | "version": "3.6.0",
2737 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2738 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2739 | "dev": true,
2740 | "dependencies": {
2741 | "picomatch": "^2.2.1"
2742 | },
2743 | "engines": {
2744 | "node": ">=8.10.0"
2745 | }
2746 | },
2747 | "node_modules/regenerator-runtime": {
2748 | "version": "0.14.1",
2749 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
2750 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
2751 | },
2752 | "node_modules/resolve": {
2753 | "version": "1.22.8",
2754 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
2755 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
2756 | "dependencies": {
2757 | "is-core-module": "^2.13.0",
2758 | "path-parse": "^1.0.7",
2759 | "supports-preserve-symlinks-flag": "^1.0.0"
2760 | },
2761 | "bin": {
2762 | "resolve": "bin/resolve"
2763 | },
2764 | "funding": {
2765 | "url": "https://github.com/sponsors/ljharb"
2766 | }
2767 | },
2768 | "node_modules/resolve-from": {
2769 | "version": "4.0.0",
2770 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2771 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2772 | "engines": {
2773 | "node": ">=4"
2774 | }
2775 | },
2776 | "node_modules/reusify": {
2777 | "version": "1.0.4",
2778 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2779 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2780 | "dev": true,
2781 | "engines": {
2782 | "iojs": ">=1.0.0",
2783 | "node": ">=0.10.0"
2784 | }
2785 | },
2786 | "node_modules/run-parallel": {
2787 | "version": "1.2.0",
2788 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2789 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2790 | "dev": true,
2791 | "funding": [
2792 | {
2793 | "type": "github",
2794 | "url": "https://github.com/sponsors/feross"
2795 | },
2796 | {
2797 | "type": "patreon",
2798 | "url": "https://www.patreon.com/feross"
2799 | },
2800 | {
2801 | "type": "consulting",
2802 | "url": "https://feross.org/support"
2803 | }
2804 | ],
2805 | "dependencies": {
2806 | "queue-microtask": "^1.2.2"
2807 | }
2808 | },
2809 | "node_modules/scheduler": {
2810 | "version": "0.23.0",
2811 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
2812 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
2813 | "dependencies": {
2814 | "loose-envify": "^1.1.0"
2815 | }
2816 | },
2817 | "node_modules/shebang-command": {
2818 | "version": "2.0.0",
2819 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2820 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2821 | "dev": true,
2822 | "dependencies": {
2823 | "shebang-regex": "^3.0.0"
2824 | },
2825 | "engines": {
2826 | "node": ">=8"
2827 | }
2828 | },
2829 | "node_modules/shebang-regex": {
2830 | "version": "3.0.0",
2831 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2832 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2833 | "dev": true,
2834 | "engines": {
2835 | "node": ">=8"
2836 | }
2837 | },
2838 | "node_modules/sift": {
2839 | "version": "16.0.1",
2840 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
2841 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
2842 | },
2843 | "node_modules/signal-exit": {
2844 | "version": "4.1.0",
2845 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2846 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2847 | "dev": true,
2848 | "engines": {
2849 | "node": ">=14"
2850 | },
2851 | "funding": {
2852 | "url": "https://github.com/sponsors/isaacs"
2853 | }
2854 | },
2855 | "node_modules/source-map": {
2856 | "version": "0.5.7",
2857 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2858 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
2859 | "engines": {
2860 | "node": ">=0.10.0"
2861 | }
2862 | },
2863 | "node_modules/source-map-js": {
2864 | "version": "1.0.2",
2865 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
2866 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
2867 | "engines": {
2868 | "node": ">=0.10.0"
2869 | }
2870 | },
2871 | "node_modules/sparse-bitfield": {
2872 | "version": "3.0.3",
2873 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
2874 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
2875 | "dependencies": {
2876 | "memory-pager": "^1.0.2"
2877 | }
2878 | },
2879 | "node_modules/streamsearch": {
2880 | "version": "1.1.0",
2881 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
2882 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
2883 | "engines": {
2884 | "node": ">=10.0.0"
2885 | }
2886 | },
2887 | "node_modules/string-width": {
2888 | "version": "5.1.2",
2889 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2890 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
2891 | "dev": true,
2892 | "dependencies": {
2893 | "eastasianwidth": "^0.2.0",
2894 | "emoji-regex": "^9.2.2",
2895 | "strip-ansi": "^7.0.1"
2896 | },
2897 | "engines": {
2898 | "node": ">=12"
2899 | },
2900 | "funding": {
2901 | "url": "https://github.com/sponsors/sindresorhus"
2902 | }
2903 | },
2904 | "node_modules/string-width-cjs": {
2905 | "name": "string-width",
2906 | "version": "4.2.3",
2907 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2908 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2909 | "dev": true,
2910 | "dependencies": {
2911 | "emoji-regex": "^8.0.0",
2912 | "is-fullwidth-code-point": "^3.0.0",
2913 | "strip-ansi": "^6.0.1"
2914 | },
2915 | "engines": {
2916 | "node": ">=8"
2917 | }
2918 | },
2919 | "node_modules/string-width-cjs/node_modules/ansi-regex": {
2920 | "version": "5.0.1",
2921 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2922 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2923 | "dev": true,
2924 | "engines": {
2925 | "node": ">=8"
2926 | }
2927 | },
2928 | "node_modules/string-width-cjs/node_modules/emoji-regex": {
2929 | "version": "8.0.0",
2930 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2931 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2932 | "dev": true
2933 | },
2934 | "node_modules/string-width-cjs/node_modules/strip-ansi": {
2935 | "version": "6.0.1",
2936 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2937 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2938 | "dev": true,
2939 | "dependencies": {
2940 | "ansi-regex": "^5.0.1"
2941 | },
2942 | "engines": {
2943 | "node": ">=8"
2944 | }
2945 | },
2946 | "node_modules/strip-ansi": {
2947 | "version": "7.1.0",
2948 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2949 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2950 | "dev": true,
2951 | "dependencies": {
2952 | "ansi-regex": "^6.0.1"
2953 | },
2954 | "engines": {
2955 | "node": ">=12"
2956 | },
2957 | "funding": {
2958 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2959 | }
2960 | },
2961 | "node_modules/strip-ansi-cjs": {
2962 | "name": "strip-ansi",
2963 | "version": "6.0.1",
2964 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2965 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2966 | "dev": true,
2967 | "dependencies": {
2968 | "ansi-regex": "^5.0.1"
2969 | },
2970 | "engines": {
2971 | "node": ">=8"
2972 | }
2973 | },
2974 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
2975 | "version": "5.0.1",
2976 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2977 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2978 | "dev": true,
2979 | "engines": {
2980 | "node": ">=8"
2981 | }
2982 | },
2983 | "node_modules/styled-jsx": {
2984 | "version": "5.1.1",
2985 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
2986 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
2987 | "dependencies": {
2988 | "client-only": "0.0.1"
2989 | },
2990 | "engines": {
2991 | "node": ">= 12.0.0"
2992 | },
2993 | "peerDependencies": {
2994 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
2995 | },
2996 | "peerDependenciesMeta": {
2997 | "@babel/core": {
2998 | "optional": true
2999 | },
3000 | "babel-plugin-macros": {
3001 | "optional": true
3002 | }
3003 | }
3004 | },
3005 | "node_modules/stylis": {
3006 | "version": "4.2.0",
3007 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
3008 | "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
3009 | },
3010 | "node_modules/sucrase": {
3011 | "version": "3.35.0",
3012 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
3013 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
3014 | "dev": true,
3015 | "dependencies": {
3016 | "@jridgewell/gen-mapping": "^0.3.2",
3017 | "commander": "^4.0.0",
3018 | "glob": "^10.3.10",
3019 | "lines-and-columns": "^1.1.6",
3020 | "mz": "^2.7.0",
3021 | "pirates": "^4.0.1",
3022 | "ts-interface-checker": "^0.1.9"
3023 | },
3024 | "bin": {
3025 | "sucrase": "bin/sucrase",
3026 | "sucrase-node": "bin/sucrase-node"
3027 | },
3028 | "engines": {
3029 | "node": ">=16 || 14 >=14.17"
3030 | }
3031 | },
3032 | "node_modules/supports-color": {
3033 | "version": "5.5.0",
3034 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3035 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3036 | "dependencies": {
3037 | "has-flag": "^3.0.0"
3038 | },
3039 | "engines": {
3040 | "node": ">=4"
3041 | }
3042 | },
3043 | "node_modules/supports-preserve-symlinks-flag": {
3044 | "version": "1.0.0",
3045 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
3046 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
3047 | "engines": {
3048 | "node": ">= 0.4"
3049 | },
3050 | "funding": {
3051 | "url": "https://github.com/sponsors/ljharb"
3052 | }
3053 | },
3054 | "node_modules/tailwindcss": {
3055 | "version": "3.4.1",
3056 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz",
3057 | "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==",
3058 | "dev": true,
3059 | "dependencies": {
3060 | "@alloc/quick-lru": "^5.2.0",
3061 | "arg": "^5.0.2",
3062 | "chokidar": "^3.5.3",
3063 | "didyoumean": "^1.2.2",
3064 | "dlv": "^1.1.3",
3065 | "fast-glob": "^3.3.0",
3066 | "glob-parent": "^6.0.2",
3067 | "is-glob": "^4.0.3",
3068 | "jiti": "^1.19.1",
3069 | "lilconfig": "^2.1.0",
3070 | "micromatch": "^4.0.5",
3071 | "normalize-path": "^3.0.0",
3072 | "object-hash": "^3.0.0",
3073 | "picocolors": "^1.0.0",
3074 | "postcss": "^8.4.23",
3075 | "postcss-import": "^15.1.0",
3076 | "postcss-js": "^4.0.1",
3077 | "postcss-load-config": "^4.0.1",
3078 | "postcss-nested": "^6.0.1",
3079 | "postcss-selector-parser": "^6.0.11",
3080 | "resolve": "^1.22.2",
3081 | "sucrase": "^3.32.0"
3082 | },
3083 | "bin": {
3084 | "tailwind": "lib/cli.js",
3085 | "tailwindcss": "lib/cli.js"
3086 | },
3087 | "engines": {
3088 | "node": ">=14.0.0"
3089 | }
3090 | },
3091 | "node_modules/thenify": {
3092 | "version": "3.3.1",
3093 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
3094 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
3095 | "dev": true,
3096 | "dependencies": {
3097 | "any-promise": "^1.0.0"
3098 | }
3099 | },
3100 | "node_modules/thenify-all": {
3101 | "version": "1.6.0",
3102 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
3103 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
3104 | "dev": true,
3105 | "dependencies": {
3106 | "thenify": ">= 3.1.0 < 4"
3107 | },
3108 | "engines": {
3109 | "node": ">=0.8"
3110 | }
3111 | },
3112 | "node_modules/to-fast-properties": {
3113 | "version": "2.0.0",
3114 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
3115 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
3116 | "engines": {
3117 | "node": ">=4"
3118 | }
3119 | },
3120 | "node_modules/to-regex-range": {
3121 | "version": "5.0.1",
3122 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
3123 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
3124 | "dev": true,
3125 | "dependencies": {
3126 | "is-number": "^7.0.0"
3127 | },
3128 | "engines": {
3129 | "node": ">=8.0"
3130 | }
3131 | },
3132 | "node_modules/tr46": {
3133 | "version": "3.0.0",
3134 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
3135 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
3136 | "dependencies": {
3137 | "punycode": "^2.1.1"
3138 | },
3139 | "engines": {
3140 | "node": ">=12"
3141 | }
3142 | },
3143 | "node_modules/ts-interface-checker": {
3144 | "version": "0.1.13",
3145 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
3146 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
3147 | "dev": true
3148 | },
3149 | "node_modules/tslib": {
3150 | "version": "2.6.2",
3151 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
3152 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
3153 | },
3154 | "node_modules/tweetnacl": {
3155 | "version": "1.0.3",
3156 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
3157 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
3158 | },
3159 | "node_modules/tweetnacl-util": {
3160 | "version": "0.15.1",
3161 | "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
3162 | "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw=="
3163 | },
3164 | "node_modules/undici-types": {
3165 | "version": "5.26.5",
3166 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
3167 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
3168 | },
3169 | "node_modules/update-browserslist-db": {
3170 | "version": "1.0.13",
3171 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
3172 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
3173 | "dev": true,
3174 | "funding": [
3175 | {
3176 | "type": "opencollective",
3177 | "url": "https://opencollective.com/browserslist"
3178 | },
3179 | {
3180 | "type": "tidelift",
3181 | "url": "https://tidelift.com/funding/github/npm/browserslist"
3182 | },
3183 | {
3184 | "type": "github",
3185 | "url": "https://github.com/sponsors/ai"
3186 | }
3187 | ],
3188 | "dependencies": {
3189 | "escalade": "^3.1.1",
3190 | "picocolors": "^1.0.0"
3191 | },
3192 | "bin": {
3193 | "update-browserslist-db": "cli.js"
3194 | },
3195 | "peerDependencies": {
3196 | "browserslist": ">= 4.21.0"
3197 | }
3198 | },
3199 | "node_modules/util-deprecate": {
3200 | "version": "1.0.2",
3201 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3202 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
3203 | "dev": true
3204 | },
3205 | "node_modules/uuid": {
3206 | "version": "8.3.2",
3207 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
3208 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
3209 | "bin": {
3210 | "uuid": "dist/bin/uuid"
3211 | }
3212 | },
3213 | "node_modules/watchpack": {
3214 | "version": "2.4.0",
3215 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
3216 | "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
3217 | "dependencies": {
3218 | "glob-to-regexp": "^0.4.1",
3219 | "graceful-fs": "^4.1.2"
3220 | },
3221 | "engines": {
3222 | "node": ">=10.13.0"
3223 | }
3224 | },
3225 | "node_modules/webidl-conversions": {
3226 | "version": "7.0.0",
3227 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
3228 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
3229 | "engines": {
3230 | "node": ">=12"
3231 | }
3232 | },
3233 | "node_modules/whatwg-url": {
3234 | "version": "11.0.0",
3235 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
3236 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
3237 | "dependencies": {
3238 | "tr46": "^3.0.0",
3239 | "webidl-conversions": "^7.0.0"
3240 | },
3241 | "engines": {
3242 | "node": ">=12"
3243 | }
3244 | },
3245 | "node_modules/which": {
3246 | "version": "2.0.2",
3247 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3248 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3249 | "dev": true,
3250 | "dependencies": {
3251 | "isexe": "^2.0.0"
3252 | },
3253 | "bin": {
3254 | "node-which": "bin/node-which"
3255 | },
3256 | "engines": {
3257 | "node": ">= 8"
3258 | }
3259 | },
3260 | "node_modules/wrap-ansi": {
3261 | "version": "8.1.0",
3262 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
3263 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
3264 | "dev": true,
3265 | "dependencies": {
3266 | "ansi-styles": "^6.1.0",
3267 | "string-width": "^5.0.1",
3268 | "strip-ansi": "^7.0.1"
3269 | },
3270 | "engines": {
3271 | "node": ">=12"
3272 | },
3273 | "funding": {
3274 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3275 | }
3276 | },
3277 | "node_modules/wrap-ansi-cjs": {
3278 | "name": "wrap-ansi",
3279 | "version": "7.0.0",
3280 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3281 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3282 | "dev": true,
3283 | "dependencies": {
3284 | "ansi-styles": "^4.0.0",
3285 | "string-width": "^4.1.0",
3286 | "strip-ansi": "^6.0.0"
3287 | },
3288 | "engines": {
3289 | "node": ">=10"
3290 | },
3291 | "funding": {
3292 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3293 | }
3294 | },
3295 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
3296 | "version": "5.0.1",
3297 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3298 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3299 | "dev": true,
3300 | "engines": {
3301 | "node": ">=8"
3302 | }
3303 | },
3304 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
3305 | "version": "4.3.0",
3306 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3307 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3308 | "dev": true,
3309 | "dependencies": {
3310 | "color-convert": "^2.0.1"
3311 | },
3312 | "engines": {
3313 | "node": ">=8"
3314 | },
3315 | "funding": {
3316 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3317 | }
3318 | },
3319 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
3320 | "version": "8.0.0",
3321 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3322 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3323 | "dev": true
3324 | },
3325 | "node_modules/wrap-ansi-cjs/node_modules/string-width": {
3326 | "version": "4.2.3",
3327 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3328 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3329 | "dev": true,
3330 | "dependencies": {
3331 | "emoji-regex": "^8.0.0",
3332 | "is-fullwidth-code-point": "^3.0.0",
3333 | "strip-ansi": "^6.0.1"
3334 | },
3335 | "engines": {
3336 | "node": ">=8"
3337 | }
3338 | },
3339 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
3340 | "version": "6.0.1",
3341 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3342 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3343 | "dev": true,
3344 | "dependencies": {
3345 | "ansi-regex": "^5.0.1"
3346 | },
3347 | "engines": {
3348 | "node": ">=8"
3349 | }
3350 | },
3351 | "node_modules/yallist": {
3352 | "version": "4.0.0",
3353 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
3354 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
3355 | },
3356 | "node_modules/yaml": {
3357 | "version": "2.3.4",
3358 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
3359 | "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
3360 | "dev": true,
3361 | "engines": {
3362 | "node": ">= 14"
3363 | }
3364 | }
3365 | }
3366 | }
3367 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "halochat",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@emotion/react": "^11.11.3",
13 | "@emotion/styled": "^11.11.0",
14 | "@mui/icons-material": "^5.15.4",
15 | "bcryptjs": "^2.4.3",
16 | "date-fns": "^3.2.0",
17 | "mongoose": "^8.0.4",
18 | "next": "14.0.4",
19 | "next-auth": "^4.24.5",
20 | "next-cloudinary": "^5.18.0",
21 | "pusher": "^5.2.0",
22 | "pusher-js": "^8.4.0-rc2",
23 | "react": "^18",
24 | "react-dom": "^18",
25 | "react-hook-form": "^7.49.3",
26 | "react-hot-toast": "^2.4.1"
27 | },
28 | "devDependencies": {
29 | "autoprefixer": "^10.0.1",
30 | "postcss": "^8",
31 | "tailwindcss": "^3.3.0"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/assets/andrew.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/andrew.jpg
--------------------------------------------------------------------------------
/public/assets/coffee.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/coffee.jpg
--------------------------------------------------------------------------------
/public/assets/denny.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/denny.jpg
--------------------------------------------------------------------------------
/public/assets/finance.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/finance.jpg
--------------------------------------------------------------------------------
/public/assets/forest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/forest.jpg
--------------------------------------------------------------------------------
/public/assets/group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/group.png
--------------------------------------------------------------------------------
/public/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/logo.png
--------------------------------------------------------------------------------
/public/assets/marketing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/marketing.jpg
--------------------------------------------------------------------------------
/public/assets/mathew.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/mathew.jpg
--------------------------------------------------------------------------------
/public/assets/ngocmai.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/ngocmai.jpg
--------------------------------------------------------------------------------
/public/assets/person.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/person.jpg
--------------------------------------------------------------------------------
/public/assets/phucmai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/phucmai.png
--------------------------------------------------------------------------------
/public/assets/sales.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/sales.jpeg
--------------------------------------------------------------------------------
/public/assets/send.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/send.jpg
--------------------------------------------------------------------------------
/public/assets/sunehildeep.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/sunehildeep.png
--------------------------------------------------------------------------------
/public/assets/vivian.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/public/assets/vivian.jpeg
--------------------------------------------------------------------------------
/screenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/screenshots/1.png
--------------------------------------------------------------------------------
/screenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/screenshots/2.png
--------------------------------------------------------------------------------
/screenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/screenshots/3.png
--------------------------------------------------------------------------------
/screenshots/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/screenshots/4.png
--------------------------------------------------------------------------------
/screenshots/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/phuc-mai/halochat/1cca2830c5f80607528bc1e3be7f5a0f85a99661/screenshots/5.png
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | darkMode: ["class"],
4 | content: [
5 | "./pages/**/*.{js,ts,jsx,tsx,mdx}",
6 | "./components/**/*.{js,ts,jsx,tsx,mdx}",
7 | "./app/**/*.{js,ts,jsx,tsx,mdx}",
8 | "./src/**/*.{js,ts,jsx,tsx,mdx}",
9 | ],
10 | theme: {
11 | fontSize: {
12 | "heading1-bold": [
13 | "36px",
14 | {
15 | lineHeight: "100%",
16 | fontWeight: "700",
17 | },
18 | ],
19 | "heading2-bold": [
20 | "30px",
21 | {
22 | lineHeight: "140%",
23 | fontWeight: "700",
24 | },
25 | ],
26 | "heading3-bold": [
27 | "24px",
28 | {
29 | lineHeight: "140%",
30 | fontWeight: "700",
31 | },
32 | ],
33 | "heading4-bold": [
34 | "20px",
35 | {
36 | lineHeight: "140%",
37 | fontWeight: "700",
38 | },
39 | ],
40 | "body-bold": [
41 | "18px",
42 | {
43 | lineHeight: "140%",
44 | fontWeight: "700",
45 | },
46 | ],
47 | "body-medium": [
48 | "18px",
49 | {
50 | lineHeight: "140%",
51 | fontWeight: "500",
52 | },
53 | ],
54 | "base-bold": [
55 | "16px",
56 | {
57 | lineHeight: "140%",
58 | fontWeight: "600",
59 | },
60 | ],
61 | "base-medium": [
62 | "16px",
63 | {
64 | lineHeight: "140%",
65 | fontWeight: "500",
66 | },
67 | ],
68 | "base-light": [
69 | "16px",
70 | {
71 | lineHeight: "140%",
72 | fontWeight: "400",
73 | },
74 | ],
75 | "small-bold": [
76 | "14px",
77 | {
78 | lineHeight: "140%",
79 | fontWeight: "600",
80 | },
81 | ],
82 | "small-medium": [
83 | "14px",
84 | {
85 | lineHeight: "140%",
86 | fontWeight: "500",
87 | },
88 | ],
89 | "subtle-medium": [
90 | "12px",
91 | {
92 | lineHeight: "16px",
93 | fontWeight: "500",
94 | },
95 | ],
96 | "tiny-medium": [
97 | "10px",
98 | {
99 | lineHeight: "140%",
100 | fontWeight: "500",
101 | },
102 | ],
103 | "x-small-bold": [
104 | "7px",
105 | {
106 | lineHeight: "9.318px",
107 | fonteWeight: "600",
108 | },
109 | ],
110 | },
111 | extend: {
112 | colors: {
113 | "blue-1": "#0A065C",
114 | "blue-2": "#F5F7FB",
115 | "blue-3": "#04A1E3",
116 | "grey-1": "#737373",
117 | "grey-2": "#f0f0f0",
118 | "grey-3": "#8B8B8B",
119 | "red-1": "#FF5252",
120 | "purple-1": "#C6D4FF",
121 | "purple-2": "#4D426D",
122 | "green-1": "#13E0E0",
123 | "pink-1": "#FDDAD6",
124 | },
125 | },
126 | },
127 | plugins: [],
128 | };
129 |
--------------------------------------------------------------------------------