├── .gitignore ├── README.md ├── app ├── admin │ ├── authors │ │ ├── components │ │ │ └── AuthorsListView.jsx │ │ ├── form │ │ │ ├── contexts │ │ │ │ └── AuthorFormContext.jsx │ │ │ ├── layout.jsx │ │ │ └── page.jsx │ │ └── page.jsx │ ├── categories │ │ ├── components │ │ │ └── CategoriesListView.jsx │ │ ├── form │ │ │ ├── contexts │ │ │ │ └── CategoryFormContext.jsx │ │ │ ├── layout.jsx │ │ │ └── page.jsx │ │ └── page.jsx │ ├── components │ │ ├── CountCard.jsx │ │ └── Sidebar.jsx │ ├── layout.jsx │ ├── page.jsx │ └── posts │ │ ├── components │ │ └── PostListView.jsx │ │ ├── form │ │ ├── components │ │ │ └── RTEField.jsx │ │ ├── contexts │ │ │ └── PostFormContext.jsx │ │ ├── layout.jsx │ │ └── page.jsx │ │ └── page.jsx ├── categories │ ├── [categoryId] │ │ └── page.jsx │ └── page.jsx ├── components │ ├── Header │ │ ├── Header.jsx │ │ └── LoginButton.jsx │ └── PostListView.jsx ├── favicon.ico ├── globals.css ├── layout.js ├── page.js └── posts │ └── [postId] │ └── page.jsx ├── jsconfig.json ├── lib ├── contexts │ └── AuthContext.jsx ├── firebase.jsx └── firebase │ ├── admin │ └── read.jsx │ ├── author │ ├── read.jsx │ ├── read_server.jsx │ └── write.jsx │ ├── category │ ├── read.jsx │ ├── read_server.jsx │ └── write.jsx │ ├── count.jsx │ └── post │ ├── read.jsx │ ├── read_server.jsx │ └── write.jsx ├── next.config.mjs ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── google.png ├── logo.png ├── next.svg └── vercel.svg └── 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 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /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/admin/authors/components/AuthorsListView.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useAuthors } from "@/lib/firebase/author/read"; 4 | import Link from "next/link" 5 | 6 | export default function AuthorsListView() { 7 | const { data, error, isLoading } = useAuthors(); 8 | if (isLoading) { 9 | return

Loading...

10 | } 11 | if (error) { 12 | return

{error}

13 | } 14 | if (!data) { 15 | return

Data not found!

16 | } 17 | return
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | {data?.map((item, key) => { 30 | return 31 | 32 | 33 | 34 | 35 | 40 | 41 | })} 42 | 43 |
Sr.PhotoNameEmailAction
{key + 1} {item?.name}{item?.email} 36 | 37 | 38 | 39 |
44 |
45 | } -------------------------------------------------------------------------------- /app/admin/authors/form/contexts/AuthorFormContext.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { getAuthor } from "@/lib/firebase/author/read"; 4 | import { createNewAuthor, deleteAuthor, updateAuthor } from "@/lib/firebase/author/write"; 5 | import { useRouter, useSearchParams } from "next/navigation"; 6 | import { createContext, useContext, useState } from "react"; 7 | 8 | const AuthorFormContext = createContext(); 9 | 10 | export default function AuthorFormContextProvider({ children }) { 11 | const router = useRouter(); 12 | 13 | const [data, setData] = useState({}); 14 | const [isLoading, setIsLoading] = useState(false); 15 | const [error, setError] = useState(null); 16 | const [isDone, setIsDone] = useState(false); 17 | const [image, setImage] = useState(null); 18 | 19 | const handleData = (key, value) => { 20 | setIsDone(false) 21 | setData({ 22 | ...data, 23 | [key]: value, 24 | }) 25 | } 26 | 27 | const handleCreate = async () => { 28 | setError(null) 29 | setIsLoading(true) 30 | setIsDone(false) 31 | try { 32 | await createNewAuthor({ data: data, image: image }); 33 | setIsDone(true) 34 | } catch (error) { 35 | setError(error?.message) 36 | } 37 | setIsLoading(false) 38 | } 39 | 40 | const handleUpdate = async () => { 41 | setError(null) 42 | setIsLoading(true) 43 | setIsDone(false) 44 | try { 45 | await updateAuthor({ data: data, image: image }); 46 | setIsDone(true) 47 | } catch (error) { 48 | setError(error?.message) 49 | } 50 | setIsLoading(false) 51 | } 52 | 53 | const handleDelete = async (id) => { 54 | setError(null) 55 | setIsLoading(true) 56 | setIsDone(false) 57 | try { 58 | await deleteAuthor(id); 59 | setIsDone(true); 60 | router.push('/admin/authors'); 61 | } catch (error) { 62 | setError(error?.message) 63 | } 64 | setIsLoading(false) 65 | } 66 | 67 | const fetchData = async (id) => { 68 | setError(null) 69 | setIsLoading(true) 70 | setIsDone(false) 71 | try { 72 | const res = await getAuthor(id); 73 | if (res.exists()) { 74 | setData(res.data()); 75 | } else { 76 | throw new Error(`No Category found from id ${id}`) 77 | } 78 | 79 | } catch (error) { 80 | setError(error?.message) 81 | } 82 | setIsLoading(false) 83 | } 84 | 85 | 86 | return {children} 101 | } 102 | 103 | export const useAuthorForm = () => useContext(AuthorFormContext); -------------------------------------------------------------------------------- /app/admin/authors/form/layout.jsx: -------------------------------------------------------------------------------- 1 | import AuthorFormContextProvider from "./contexts/AuthorFormContext"; 2 | 3 | export default function Layout({ children }) { 4 | return {children} 5 | } -------------------------------------------------------------------------------- /app/admin/authors/form/page.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useSearchParams } from "next/navigation"; 4 | import { useEffect } from "react"; 5 | import { useAuthorForm } from "./contexts/AuthorFormContext"; 6 | 7 | export default function Page() { 8 | const searchParams = useSearchParams(); 9 | const updateAuthorId = searchParams.get('id') 10 | 11 | const { 12 | data, 13 | isLoading, 14 | error, 15 | isDone, 16 | handleData, 17 | handleCreate, 18 | handleUpdate, 19 | handleDelete, 20 | image, 21 | setImage, 22 | fetchData, 23 | } = useAuthorForm(); 24 | 25 | useEffect(() => { 26 | if (updateAuthorId) { 27 | fetchData(updateAuthorId); 28 | } 29 | }, [updateAuthorId]) 30 | 31 | 32 | return
33 |
34 | {updateAuthorId &&
35 |

Update

36 |
} 37 | {!updateAuthorId &&
38 |

Create

39 |
} 40 |

Author | Form

41 |
42 |
43 |
{ 45 | e.preventDefault(); 46 | if (updateAuthorId) { 47 | handleUpdate(); 48 | } else { 49 | handleCreate(); 50 | } 51 | }} 52 | className="flex flex-col gap-2 bg-blue-50 rounded-xl p-7"> 53 |
54 | 55 | { 60 | handleData('name', e.target.value) 61 | }} 62 | value={data?.name} 63 | required 64 | /> 65 |
66 |
67 | 68 | { 73 | handleData('email', e.target.value) 74 | }} 75 | value={data?.email} 76 | required 77 | /> 78 |
79 | {data?.photoURL &&
80 | 81 |
} 82 | {image &&
83 | 84 |
} 85 |
86 | 87 | { 93 | e.preventDefault(); 94 | setImage(e.target.files[0]); 95 | }} 96 | /> 97 |
98 | 99 | {error &&

{error}

} 100 | 101 | {!isDone && } 107 | 108 | {updateAuthorId && !isDone && } 117 | 118 | {isDone &&

119 | Successfully {updateAuthorId ? "Updated" : "Created"} ! 120 |

} 121 | 122 |
123 |
124 |
125 | } -------------------------------------------------------------------------------- /app/admin/authors/page.jsx: -------------------------------------------------------------------------------- 1 | import { CirclePlus } from 'lucide-react'; 2 | import Link from 'next/link' 3 | import AuthorsListView from './components/AuthorsListView'; 4 | 5 | export default function Page() { 6 | return
7 |
8 |

Authors

9 | 10 | 14 | 15 |
16 | 17 |
18 | } -------------------------------------------------------------------------------- /app/admin/categories/components/CategoriesListView.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useCategories } from "@/lib/firebase/category/read" 4 | import Link from "next/link" 5 | 6 | export default function CategoriesListView() { 7 | const { data, error, isLoading } = useCategories(); 8 | if (isLoading) { 9 | return

Loading...

10 | } 11 | if (error) { 12 | return

{error}

13 | } 14 | if (!data) { 15 | return

Data not found!

16 | } 17 | return
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | {data?.map((item, key) => { 30 | return 31 | 32 | 33 | 34 | 35 | 40 | 41 | })} 42 | 43 |
Sr.IconNameSlugAction
{key + 1} {item?.name}{item?.slug} 36 | 37 | 38 | 39 |
44 |
45 | } -------------------------------------------------------------------------------- /app/admin/categories/form/contexts/CategoryFormContext.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { getCategory } from "@/lib/firebase/category/read"; 4 | import { createNewCategory, deleteCategory, updateCategory } from "@/lib/firebase/category/write"; 5 | import { useRouter, useSearchParams } from "next/navigation"; 6 | import { createContext, useContext, useState } from "react"; 7 | 8 | const CategoryFormContext = createContext(); 9 | 10 | export default function CategoryFormContextProvider({ children }) { 11 | const router = useRouter(); 12 | 13 | const [data, setData] = useState({}); 14 | const [isLoading, setIsLoading] = useState(false); 15 | const [error, setError] = useState(null); 16 | const [isDone, setIsDone] = useState(false); 17 | const [image, setImage] = useState(null); 18 | 19 | const handleData = (key, value) => { 20 | setIsDone(false) 21 | setData({ 22 | ...data, 23 | [key]: value, 24 | }) 25 | } 26 | 27 | const handleCreate = async () => { 28 | setError(null) 29 | setIsLoading(true) 30 | setIsDone(false) 31 | try { 32 | await createNewCategory({ data: data, image: image }); 33 | setIsDone(true) 34 | } catch (error) { 35 | setError(error?.message) 36 | } 37 | setIsLoading(false) 38 | } 39 | 40 | const handleUpdate = async () => { 41 | setError(null) 42 | setIsLoading(true) 43 | setIsDone(false) 44 | try { 45 | await updateCategory({ data: data, image: image }); 46 | setIsDone(true) 47 | } catch (error) { 48 | setError(error?.message) 49 | } 50 | setIsLoading(false) 51 | } 52 | 53 | const handleDelete = async (id) => { 54 | setError(null) 55 | setIsLoading(true) 56 | setIsDone(false) 57 | try { 58 | await deleteCategory(id); 59 | setIsDone(true); 60 | router.push('/admin/categories'); 61 | } catch (error) { 62 | setError(error?.message) 63 | } 64 | setIsLoading(false) 65 | } 66 | 67 | const fetchData = async (id) => { 68 | setError(null) 69 | setIsLoading(true) 70 | setIsDone(false) 71 | try { 72 | const res = await getCategory(id); 73 | if (res.exists()) { 74 | setData(res.data()); 75 | } else { 76 | throw new Error(`No Category found from id ${id}`) 77 | } 78 | 79 | } catch (error) { 80 | setError(error?.message) 81 | } 82 | setIsLoading(false) 83 | } 84 | 85 | 86 | return {children} 101 | } 102 | 103 | export const useCategoryForm = () => useContext(CategoryFormContext); -------------------------------------------------------------------------------- /app/admin/categories/form/layout.jsx: -------------------------------------------------------------------------------- 1 | import CategoryFormContextProvider from "./contexts/CategoryFormContext"; 2 | 3 | export default function Layout({ children }) { 4 | return {children} 5 | } -------------------------------------------------------------------------------- /app/admin/categories/form/page.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useSearchParams } from "next/navigation"; 4 | import { useCategoryForm } from "./contexts/CategoryFormContext"; 5 | import { useEffect } from "react"; 6 | 7 | export default function Page() { 8 | const searchParams = useSearchParams(); 9 | const updateCategoryId = searchParams.get('id') 10 | 11 | const { 12 | data, 13 | isLoading, 14 | error, 15 | isDone, 16 | handleData, 17 | handleCreate, 18 | handleUpdate, 19 | handleDelete, 20 | image, 21 | setImage, 22 | fetchData, 23 | } = useCategoryForm(); 24 | 25 | useEffect(() => { 26 | if (updateCategoryId) { 27 | fetchData(updateCategoryId); 28 | } 29 | }, [updateCategoryId]) 30 | 31 | 32 | return
33 |
34 | {updateCategoryId &&
35 |

Update

36 |
} 37 | {!updateCategoryId &&
38 |

Create

39 |
} 40 |

Category | Form

41 |
42 |
43 |
{ 45 | e.preventDefault(); 46 | if (updateCategoryId) { 47 | handleUpdate(); 48 | } else { 49 | handleCreate(); 50 | } 51 | }} 52 | className="flex flex-col gap-2 bg-blue-50 rounded-xl p-7"> 53 |
54 | 55 | { 60 | handleData('name', e.target.value) 61 | }} 62 | value={data?.name} 63 | required 64 | /> 65 |
66 |
67 | 68 | { 73 | handleData('slug', e.target.value) 74 | }} 75 | value={data?.slug} 76 | required 77 | /> 78 |
79 | {data?.iconURL &&
80 | 81 |
} 82 | {image &&
83 | 84 |
} 85 |
86 | 87 | { 93 | e.preventDefault(); 94 | setImage(e.target.files[0]); 95 | }} 96 | /> 97 |
98 | 99 | {error &&

{error}

} 100 | 101 | {!isDone && } 107 | 108 | {updateCategoryId && !isDone && } 117 | 118 | {isDone &&

119 | Successfully {updateCategoryId ? "Updated" : "Created"} ! 120 |

} 121 | 122 |
123 |
124 |
125 | } -------------------------------------------------------------------------------- /app/admin/categories/page.jsx: -------------------------------------------------------------------------------- 1 | import { CirclePlus } from 'lucide-react'; 2 | import Link from 'next/link' 3 | import CategoriesListView from './components/CategoriesListView'; 4 | 5 | export default function Page() { 6 | return
7 |
8 |

Categories

9 | 10 | 14 | 15 |
16 | 17 |
18 | } -------------------------------------------------------------------------------- /app/admin/components/CountCard.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import useCollectionCount from "@/lib/firebase/count" 4 | 5 | export default function CountCard({ path, name, icon }) { 6 | const { data, isLoading, error } = useCollectionCount({ path: path }) 7 | if (isLoading) { 8 | return

Loading ...

9 | } 10 | if (error) { 11 | return

{error}

12 | } 13 | return
14 | {icon} 15 |
16 |

{name}

17 |

{data}

18 |
19 |
20 | } -------------------------------------------------------------------------------- /app/admin/components/Sidebar.jsx: -------------------------------------------------------------------------------- 1 | import { Gauge, LayoutList, Layers2, User } from 'lucide-react'; 2 | import Link from 'next/link' 3 | 4 | export default function Sidebar() { 5 | const link = [ 6 | { 7 | name: 'Dashboard', 8 | link: '/admin', 9 | icon: , 10 | }, 11 | { 12 | name: 'Posts', 13 | link: '/admin/posts', 14 | icon: , 15 | }, 16 | { 17 | name: 'Categories', 18 | link: '/admin/categories', 19 | icon: , 20 | }, 21 | { 22 | name: 'Authors', 23 | link: '/admin/authors', 24 | icon: , 25 | }, 26 | ] 27 | return
28 |
    29 | {link.map((item) => { 30 | return 31 |
  • 32 | {item.icon} 33 | {item.name} 34 |
  • 35 | 36 | })} 37 |
38 |
39 | } -------------------------------------------------------------------------------- /app/admin/layout.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import AuthContextProvider, { useAuth } from "@/lib/contexts/AuthContext"; 4 | import Sidebar from "./components/Sidebar"; 5 | import { useAdmin } from "@/lib/firebase/admin/read"; 6 | 7 | export default function Layout({ children }) { 8 | return 9 | {children} 10 | 11 | } 12 | 13 | function InnerLayout({ children }) { 14 | const { user, isLoading: authIsLoading } = useAuth(); 15 | const { data, error, isLoading } = useAdmin({ uid: user?.uid }) 16 | if (authIsLoading || isLoading) { 17 | return

Loading ...

18 | } 19 | if (error) { 20 | return

{error}

21 | } 22 | if (!data) { 23 | return
24 |

You are not admin

25 |
26 | } 27 | return <> 28 |
29 | 30 | {children} 31 |
32 | 33 | } -------------------------------------------------------------------------------- /app/admin/page.jsx: -------------------------------------------------------------------------------- 1 | import CountCard from "./components/CountCard"; 2 | import { StickyNote, UserRound, List } from 'lucide-react' 3 | 4 | export default function Page() { 5 | return
6 |
7 | } /> 8 | } /> 9 | } /> 10 |
11 |
12 | } -------------------------------------------------------------------------------- /app/admin/posts/components/PostListView.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { usePosts } from "@/lib/firebase/post/read"; 4 | import Link from "next/link" 5 | 6 | export default function PostListView() { 7 | const { data, error, isLoading } = usePosts(); 8 | if (isLoading) { 9 | return

Loading...

10 | } 11 | if (error) { 12 | return

{error}

13 | } 14 | if (!data) { 15 | return

Data not found!

16 | } 17 | return
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | {data?.map((item, key) => { 30 | return 31 | 32 | 33 | 34 | 35 | 40 | 41 | })} 42 | 43 |
Sr.ImageTitleSlugAction
{key + 1} {item?.title}{item?.slug} 36 | 37 | 38 | 39 |
44 |
45 | } -------------------------------------------------------------------------------- /app/admin/posts/form/components/RTEField.jsx: -------------------------------------------------------------------------------- 1 | 2 | import { useState } from 'react'; 3 | import dynamic from 'next/dynamic'; 4 | import 'react-quill/dist/quill.snow.css'; 5 | import { usePostForm } from '../contexts/PostFormContext'; 6 | 7 | const ReactQuill = dynamic(() => import('react-quill'), { ssr: false }); 8 | 9 | const modules = { 10 | toolbar: { 11 | container: [ 12 | [{ header: [1, 2, false] }], 13 | ['bold', 'italic', 'underline', 'strike', 'blockquote'], 14 | [{ size: ['extra-small', 'small', 'medium', 'large'] }], 15 | [{ list: 'ordered' }, { list: 'bullet' }], 16 | ['link', 'image', 'video'], 17 | [{ color: [] }, { background: [] }], 18 | ['clean'], 19 | ], 20 | }, 21 | }; 22 | 23 | export function RTEField() { 24 | const { data, handleData } = usePostForm(); 25 | 26 | const handleChange = (value) => { 27 | handleData('content', value); 28 | }; 29 | 30 | return ( 31 |
32 | 38 |
39 | ); 40 | } 41 | 42 | -------------------------------------------------------------------------------- /app/admin/posts/form/contexts/PostFormContext.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { getPost } from "@/lib/firebase/post/read"; 4 | import { createNewPost, deletePost, updatePost } from "@/lib/firebase/post/write"; 5 | import { useRouter } from "next/navigation"; 6 | import { createContext, useContext, useState } from "react"; 7 | 8 | const PostFormContext = createContext(); 9 | 10 | export default function PostFormContextProvider({ children }) { 11 | const router = useRouter(); 12 | 13 | const [data, setData] = useState({}); 14 | const [isLoading, setIsLoading] = useState(false); 15 | const [error, setError] = useState(null); 16 | const [isDone, setIsDone] = useState(false); 17 | const [image, setImage] = useState(null); 18 | 19 | const handleData = (key, value) => { 20 | setIsDone(false) 21 | setData({ 22 | ...data, 23 | [key]: value, 24 | }) 25 | } 26 | 27 | const handleCreate = async () => { 28 | setError(null) 29 | setIsLoading(true) 30 | setIsDone(false) 31 | try { 32 | await createNewPost({ data: data, image: image }); 33 | setIsDone(true) 34 | } catch (error) { 35 | setError(error?.message) 36 | } 37 | setIsLoading(false) 38 | } 39 | 40 | const handleUpdate = async () => { 41 | setError(null) 42 | setIsLoading(true) 43 | setIsDone(false) 44 | try { 45 | await updatePost({ data: data, image: image }); 46 | setIsDone(true) 47 | } catch (error) { 48 | setError(error?.message) 49 | } 50 | setIsLoading(false) 51 | } 52 | 53 | const handleDelete = async (id) => { 54 | setError(null) 55 | setIsLoading(true) 56 | setIsDone(false) 57 | try { 58 | await deletePost(id); 59 | setIsDone(true); 60 | router.push('/admin/posts'); 61 | } catch (error) { 62 | setError(error?.message) 63 | } 64 | setIsLoading(false) 65 | } 66 | 67 | const fetchData = async (id) => { 68 | setError(null) 69 | setIsLoading(true) 70 | setIsDone(false) 71 | try { 72 | const res = await getPost(id); 73 | if (res.exists()) { 74 | setData(res.data()); 75 | } else { 76 | throw new Error(`No Post found from id ${id}`) 77 | } 78 | 79 | } catch (error) { 80 | setError(error?.message) 81 | } 82 | setIsLoading(false) 83 | } 84 | 85 | 86 | return {children} 101 | } 102 | 103 | export const usePostForm = () => useContext(PostFormContext); -------------------------------------------------------------------------------- /app/admin/posts/form/layout.jsx: -------------------------------------------------------------------------------- 1 | import PostFormContextProvider from "./contexts/PostFormContext"; 2 | 3 | export default function Layout({ children }) { 4 | return {children} 5 | } -------------------------------------------------------------------------------- /app/admin/posts/form/page.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useSearchParams } from "next/navigation"; 4 | import { useEffect, useRef, useState } from "react"; 5 | import { usePostForm } from "./contexts/PostFormContext"; 6 | import { useCategories } from "@/lib/firebase/category/read"; 7 | import { useAuthors } from "@/lib/firebase/author/read"; 8 | import { RTEField } from "./components/RTEField"; 9 | 10 | export default function Page() { 11 | const searchParams = useSearchParams(); 12 | const updatePostId = searchParams.get('id') 13 | 14 | const { 15 | data, 16 | isLoading, 17 | error, 18 | isDone, 19 | handleData, 20 | handleCreate, 21 | handleUpdate, 22 | handleDelete, 23 | image, 24 | setImage, 25 | fetchData, 26 | } = usePostForm(); 27 | 28 | useEffect(() => { 29 | if (updatePostId) { 30 | fetchData(updatePostId); 31 | } 32 | }, [updatePostId]) 33 | 34 | 35 | return
36 |
37 | {updatePostId &&
38 |

Update

39 |
} 40 | {!updatePostId &&
41 |

Create

42 |
} 43 |

Posts | Form

44 |
45 |
46 |
{ 48 | e.preventDefault(); 49 | if (updatePostId) { 50 | handleUpdate(); 51 | } else { 52 | handleCreate(); 53 | } 54 | }} 55 | className="flex flex-col gap-2 bg-blue-50 rounded-xl p-7"> 56 |
57 | 58 | { 63 | handleData('title', e.target.value) 64 | }} 65 | value={data?.title} 66 | required 67 | /> 68 |
69 |
70 | 71 | { 77 | handleData('slug', e.target.value) 78 | }} 79 | value={data?.slug} 80 | required 81 | /> 82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | {data?.imageURL &&
90 | 91 |
} 92 | {image &&
93 | 94 |
} 95 |
96 | 97 | { 103 | e.preventDefault(); 104 | setImage(e.target.files[0]); 105 | }} 106 | /> 107 |
108 | 109 | {error &&

{error}

} 110 | 111 | {!isDone && } 117 | 118 | {updatePostId && !isDone && } 127 | 128 | {isDone &&

129 | Successfully {updatePostId ? "Updated" : "Created"} ! 130 |

} 131 | 132 | 133 | 134 |
135 |
136 | } 137 | 138 | function SelectCategoryField() { 139 | const { 140 | data, 141 | handleData, 142 | } = usePostForm(); 143 | const { data: categories } = useCategories(); 144 | return
145 | 146 | 160 |
161 | } 162 | 163 | 164 | function SelectAuthorField() { 165 | const { 166 | data, 167 | handleData, 168 | } = usePostForm(); 169 | const { data: authors } = useAuthors(); 170 | return
171 | 172 | 186 |
187 | } 188 | -------------------------------------------------------------------------------- /app/admin/posts/page.jsx: -------------------------------------------------------------------------------- 1 | import { CirclePlus } from 'lucide-react'; 2 | import Link from 'next/link' 3 | import PostListView from './components/PostListView'; 4 | 5 | export default function Page() { 6 | return
7 |
8 |

Posts

9 | 10 | 14 | 15 |
16 | 17 |
18 | } -------------------------------------------------------------------------------- /app/categories/[categoryId]/page.jsx: -------------------------------------------------------------------------------- 1 | import { PostCard } from "@/app/components/PostListView"; 2 | import { getCategory } from "@/lib/firebase/category/read_server"; 3 | import { getAllPostsWithCategory } from "@/lib/firebase/post/read_server"; 4 | 5 | export default async function Page({ params }) { 6 | const { categoryId: categoryIdEncoded } = params; 7 | const categoryId = decodeURI(categoryIdEncoded); 8 | const posts = await getAllPostsWithCategory(categoryId) 9 | return
10 |
11 |

Categories /

12 | 13 |
14 |
15 | {posts?.map((post, key) => { 16 | return 17 | })} 18 |
19 |
20 | } 21 | 22 | async function CategoryCard({ categoryId }) { 23 | const category = await getCategory(categoryId); 24 | return
25 | 26 |

{category?.name}

27 |
28 | } 29 | -------------------------------------------------------------------------------- /app/categories/page.jsx: -------------------------------------------------------------------------------- 1 | import { getAllCategories } from "@/lib/firebase/category/read_server" 2 | import Link from 'next/link' 3 | 4 | export const dynamic = 'force-dynamic' 5 | 6 | export default async function Page() { 7 | const categories = await getAllCategories(); 8 | 9 | return
10 |
11 | {categories?.map((category, key) => { 12 | return 13 | })} 14 |
15 |
16 | } 17 | 18 | function CategoryCard({ category }) { 19 | return 20 |
21 | 22 |

{category?.name}

23 |
24 | 25 | } -------------------------------------------------------------------------------- /app/components/Header/Header.jsx: -------------------------------------------------------------------------------- 1 | import { Home, List, MessageCircle } from 'lucide-react' 2 | import LoginButton from './LoginButton' 3 | import AuthContextProvider from '@/lib/contexts/AuthContext' 4 | import Link from 'next/link'; 5 | 6 | export default function Header() { 7 | return 35 | } -------------------------------------------------------------------------------- /app/components/Header/LoginButton.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useAuth } from "@/lib/contexts/AuthContext" 4 | import Link from 'next/link' 5 | 6 | export default function LoginButton() { 7 | 8 | const { 9 | user, 10 | isLoading, 11 | error, 12 | handleSignInWithGoogle, 13 | handleLogout, 14 | } = useAuth(); 15 | 16 | if (isLoading) { 17 | return

Loading...

18 | } 19 | 20 | if (user) { 21 | return
22 | 30 | 31 |
32 | 33 |
34 |

{user?.displayName}

35 |

{user?.email}

36 |
37 |
38 | 39 |
40 | } 41 | 42 | return
43 | 51 |
52 | } -------------------------------------------------------------------------------- /app/components/PostListView.jsx: -------------------------------------------------------------------------------- 1 | import { getAuthor } from "@/lib/firebase/author/read_server"; 2 | import { getCategory } from "@/lib/firebase/category/read_server"; 3 | import { getAllPosts } from "@/lib/firebase/post/read_server" 4 | import Link from 'next/link' 5 | 6 | export const dynamic = 'force-dynamic' 7 | 8 | export default async function PostListView() { 9 | const posts = await getAllPosts(); 10 | if (!posts) { 11 | return
12 |

Posts Not Available!

13 |
14 | } 15 | return
16 |
17 | {posts?.map((post, key) => { 18 | return 19 | })} 20 |
21 |
22 | } 23 | 24 | export function PostCard({ post }) { 25 | return 26 |
27 |
28 |
29 | 30 |
31 | 32 |
33 |

{post?.title}

34 |
35 | 36 |
{post?.timestamp?.toDate()?.toLocaleDateString()}
37 |
38 |
39 | 40 | } 41 | 42 | async function AuthorCard({ authorId }) { 43 | const author = await getAuthor(authorId); 44 | return
45 | 46 |

{author?.name}

47 |
48 | } 49 | 50 | async function CategoryCard({ categoryId }) { 51 | const category = await getCategory(categoryId); 52 | return
53 | 54 |

{category?.name}

55 |
56 | } -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RajendraAVerma/blog-website-nextjs/b1bd1a4a3b271e5aba7bd165f8d21dc97393f746/app/favicon.ico -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /app/layout.js: -------------------------------------------------------------------------------- 1 | import { Inter } from "next/font/google"; 2 | import "./globals.css"; 3 | import Header from "./components/Header/Header"; 4 | 5 | const inter = Inter({ subsets: ["latin"] }); 6 | 7 | export const metadata = { 8 | title: "Lyeana Blog Webiste", 9 | description: "Generated by create next app", 10 | }; 11 | 12 | export default function RootLayout({ children }) { 13 | return ( 14 | 15 | 16 |
17 | {children} 18 | 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /app/page.js: -------------------------------------------------------------------------------- 1 | import PostListView from "./components/PostListView"; 2 | 3 | export const dynamic = 'force-dynamic' 4 | 5 | export default function Home() { 6 | return ( 7 |
8 | 9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /app/posts/[postId]/page.jsx: -------------------------------------------------------------------------------- 1 | import { getAuthor } from "@/lib/firebase/author/read_server"; 2 | import { getCategory } from "@/lib/firebase/category/read_server"; 3 | import { getPost } from "@/lib/firebase/post/read_server"; 4 | 5 | export async function generateMetadata({ params }) { 6 | const { postId } = params; 7 | const post = await getPost(postId) 8 | 9 | return { 10 | title: post?.title, 11 | openGraph: { 12 | images: [post?.imageURL], 13 | }, 14 | } 15 | } 16 | 17 | export default async function Page({ params }) { 18 | const { postId } = params; 19 | const post = await getPost(postId) 20 | return
21 |
22 | 23 |

{post?.title}

24 | 25 |
26 | 27 |
{post?.timestamp?.toDate()?.toLocaleDateString()}
28 |
29 |
30 |
31 |
32 | } 33 | 34 | async function AuthorCard({ authorId }) { 35 | const author = await getAuthor(authorId); 36 | return
37 | 38 |

{author?.name}

39 |
40 | } 41 | 42 | async function CategoryCard({ categoryId }) { 43 | const category = await getCategory(categoryId); 44 | return
45 |
46 | 47 |

{category?.name}

48 |
49 |
50 | } -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/contexts/AuthContext.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { GoogleAuthProvider, onAuthStateChanged, signInWithPopup, signOut } from "firebase/auth"; 4 | import { createContext, useContext, useEffect, useState } from "react"; 5 | import { auth } from "../firebase"; 6 | 7 | const AuthContext = createContext(); 8 | 9 | export default function AuthContextProvider({ children }) { 10 | const [user, setUser] = useState(null); 11 | const [isLoading, setIsLoading] = useState(false); 12 | const [error, setError] = useState(null); 13 | 14 | useEffect(() => { 15 | setIsLoading(true) 16 | const unsub = onAuthStateChanged(auth, (user) => { 17 | if (user) { 18 | setUser(user); 19 | } else { 20 | setUser(null); 21 | } 22 | setIsLoading(false) 23 | }); 24 | return () => unsub(); 25 | }, []) 26 | 27 | const handleSignInWithGoogle = async () => { 28 | setIsLoading(true) 29 | try { 30 | await signInWithPopup(auth, new GoogleAuthProvider()); 31 | } catch (error) { 32 | setError(error?.message) 33 | } 34 | setIsLoading(false) 35 | } 36 | 37 | const handleLogout = async () => { 38 | setIsLoading(true) 39 | try { 40 | await signOut(auth); 41 | } catch (error) { 42 | setError(error?.message) 43 | } 44 | setIsLoading(false) 45 | } 46 | 47 | return 56 | {children} 57 | 58 | } 59 | 60 | export const useAuth = () => useContext(AuthContext); -------------------------------------------------------------------------------- /lib/firebase.jsx: -------------------------------------------------------------------------------- 1 | import { initializeApp } from "firebase/app"; 2 | import { getFirestore } from 'firebase/firestore' 3 | import { getAuth } from 'firebase/auth' 4 | import { getStorage } from 'firebase/storage' 5 | 6 | const firebaseConfig = { 7 | apiKey: process.env.NEXT_PUBLIC_API_KEY, 8 | authDomain: process.env.NEXT_PUBLIC_AUTH_DOMAIN, 9 | projectId: process.env.NEXT_PUBLIC_PROJECT_ID, 10 | storageBucket: process.env.NEXT_PUBLIC_STORAGE_BUCKET, 11 | messagingSenderId: process.env.NEXT_PUBLIC_MESSANGING_ID, 12 | appId: process.env.NEXT_PUBLIC_APP_ID, 13 | }; 14 | 15 | const app = initializeApp(firebaseConfig); 16 | 17 | export const db = getFirestore(); 18 | export const auth = getAuth(); 19 | export const storage = getStorage(); -------------------------------------------------------------------------------- /lib/firebase/admin/read.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { db } from '@/lib/firebase' 4 | import { collection, doc, getDoc, onSnapshot } from 'firebase/firestore' 5 | import useSWRSubscription from 'swr/subscription' 6 | 7 | export function useAdmin({ uid }) { 8 | const { data, error } = useSWRSubscription([`admins/${uid}`], ([path], { next }) => { 9 | const ref = doc(db, path); 10 | 11 | const unsub = onSnapshot(ref, (snaps) => { 12 | next(null, snaps.exists() ? snaps.data() : null) 13 | }, (error) => { 14 | next(error?.message) 15 | }) 16 | return () => unsub(); 17 | }) 18 | return { 19 | data, 20 | error, 21 | isLoading: data === undefined ? true : false, 22 | } 23 | } -------------------------------------------------------------------------------- /lib/firebase/author/read.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { db } from '@/lib/firebase' 4 | import { collection, doc, getDoc, onSnapshot } from 'firebase/firestore' 5 | import useSWRSubscription from 'swr/subscription' 6 | 7 | export function useAuthors() { 8 | const { data, error } = useSWRSubscription(['authors'], ([path], { next }) => { 9 | const ref = collection(db, path); 10 | 11 | const unsub = onSnapshot(ref, (snaps) => { 12 | next(null, snaps.docs.map((v) => v.data())) 13 | }, (error) => { 14 | next(error?.message) 15 | }) 16 | return () => unsub(); 17 | }) 18 | return { 19 | data, 20 | error, 21 | isLoading: data === undefined ? true : false, 22 | } 23 | } 24 | 25 | export const getAuthor = async (id)=>{ 26 | return await getDoc(doc(db, `authors/${id}`)); 27 | } -------------------------------------------------------------------------------- /lib/firebase/author/read_server.jsx: -------------------------------------------------------------------------------- 1 | import { db } from "@/lib/firebase"; 2 | import { doc, getDoc } from "firebase/firestore"; 3 | 4 | export const getAuthor = async (id) => { 5 | return await getDoc(doc(db, `authors/${id}`)).then((snap) => snap.data()); 6 | } -------------------------------------------------------------------------------- /lib/firebase/author/write.jsx: -------------------------------------------------------------------------------- 1 | import { db, storage } from "@/lib/firebase"; 2 | import { Timestamp, collection, deleteDoc, doc, setDoc, updateDoc } from "firebase/firestore"; 3 | import { getDownloadURL, ref, uploadBytes } from "firebase/storage"; 4 | 5 | export const createNewAuthor = async ({ data, image }) => { 6 | if (!data?.name) { 7 | throw new Error("Name is undefined"); 8 | } 9 | if (!image) { 10 | throw new Error("Image is not selected"); 11 | } 12 | const id = doc(collection(db, 'ids')).id; 13 | 14 | const imageRef = ref(storage, `authors/${id}.png`); 15 | await uploadBytes(imageRef, image); 16 | const imageURL = await getDownloadURL(imageRef); 17 | 18 | const firestoreRef = doc(db, `authors/${id}`) 19 | await setDoc(firestoreRef, { 20 | ...data, 21 | id: id, 22 | photoURL: imageURL, 23 | timestamp: Timestamp.now(), 24 | }); 25 | } 26 | 27 | export const updateAuthor = async ({ data, image }) => { 28 | if (!data?.name) { 29 | throw new Error("Name is undefined"); 30 | } 31 | var imageURL = data?.photoURL; 32 | 33 | if (image) { 34 | const imageRef = ref(storage, `authors/${data?.id}.png`); 35 | await uploadBytes(imageRef, image); 36 | imageURL = await getDownloadURL(imageRef); 37 | } 38 | 39 | const firestoreRef = doc(db, `authors/${data?.id}`); 40 | 41 | await updateDoc(firestoreRef, { 42 | ...data, 43 | photoURL: imageURL, 44 | timestamp: Timestamp.now(), 45 | }); 46 | } 47 | 48 | export const deleteAuthor = async (id) => { 49 | if (!id) { 50 | throw new Error("Id is required"); 51 | } 52 | await deleteDoc(doc(db, `authors/${id}`)); 53 | } -------------------------------------------------------------------------------- /lib/firebase/category/read.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { db } from '@/lib/firebase' 4 | import { collection, doc, getDoc, onSnapshot } from 'firebase/firestore' 5 | import useSWRSubscription from 'swr/subscription' 6 | 7 | export function useCategories() { 8 | const { data, error } = useSWRSubscription(['categories'], ([path], { next }) => { 9 | const ref = collection(db, path); 10 | 11 | const unsub = onSnapshot(ref, (snaps) => { 12 | next(null, snaps.docs.map((v) => v.data())) 13 | }, (error) => { 14 | next(error?.message) 15 | }) 16 | return () => unsub(); 17 | }) 18 | return { 19 | data, 20 | error, 21 | isLoading: data === undefined ? true : false, 22 | } 23 | } 24 | 25 | export const getCategory = async (id)=>{ 26 | return await getDoc(doc(db, `categories/${id}`)); 27 | } -------------------------------------------------------------------------------- /lib/firebase/category/read_server.jsx: -------------------------------------------------------------------------------- 1 | import { db } from "@/lib/firebase"; 2 | import { collection, doc, getDoc, getDocs } from "firebase/firestore"; 3 | 4 | export const getCategory = async (id) => { 5 | return await getDoc(doc(db, `categories/${id}`)).then((snap) => snap.data()); 6 | } 7 | 8 | export const getAllCategories = async () => { 9 | return await getDocs(collection(db, 'categories')).then((snaps) => snaps.docs.map((d) => d.data())); 10 | } -------------------------------------------------------------------------------- /lib/firebase/category/write.jsx: -------------------------------------------------------------------------------- 1 | import { db, storage } from "@/lib/firebase"; 2 | import { Timestamp, deleteDoc, doc, setDoc, updateDoc } from "firebase/firestore"; 3 | import { getDownloadURL, ref, uploadBytes } from "firebase/storage"; 4 | 5 | export const createNewCategory = async ({ data, image }) => { 6 | if (!data?.name) { 7 | throw new Error("Name is undefined"); 8 | } 9 | if (!data?.slug) { 10 | throw new Error("Slug is undefined"); 11 | } 12 | if (!image) { 13 | throw new Error("Image is not selected"); 14 | } 15 | const imageRef = ref(storage, `categories/${data?.slug}.png`); 16 | await uploadBytes(imageRef, image); 17 | const imageURL = await getDownloadURL(imageRef); 18 | 19 | const firestoreRef = doc(db, `categories/${data?.slug}`) 20 | await setDoc(firestoreRef, { 21 | ...data, 22 | id: data?.slug, 23 | iconURL: imageURL, 24 | timestamp: Timestamp.now(), 25 | }); 26 | } 27 | 28 | export const updateCategory = async ({ data, image }) => { 29 | if (!data?.name) { 30 | throw new Error("Name is undefined"); 31 | } 32 | if (!data?.slug) { 33 | throw new Error("Slug is undefined"); 34 | } 35 | var imageURL = data?.iconURL; 36 | 37 | if (image) { 38 | const imageRef = ref(storage, `categories/${data?.slug}.png`); 39 | await uploadBytes(imageRef, image); 40 | imageURL = await getDownloadURL(imageRef); 41 | } 42 | 43 | const firestoreRef = doc(db, `categories/${data?.id}`); 44 | 45 | await updateDoc(firestoreRef, { 46 | ...data, 47 | iconURL: imageURL, 48 | timestamp: Timestamp.now(), 49 | }); 50 | } 51 | 52 | export const deleteCategory = async (id) => { 53 | if (!id) { 54 | throw new Error("Id is required"); 55 | } 56 | await deleteDoc(doc(db, `categories/${id}`)); 57 | } -------------------------------------------------------------------------------- /lib/firebase/count.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { collection, getCountFromServer } from 'firebase/firestore' 4 | import useSWR from 'swr' 5 | import { db } from '../firebase' 6 | 7 | const fetcher = path => getCountFromServer(collection(db, path)).then((value) => value.data().count) 8 | 9 | export default function useCollectionCount({ path }) { 10 | const { data, error, isLoading } = useSWR(path, fetcher); 11 | return { 12 | data, 13 | error, 14 | isLoading 15 | } 16 | } -------------------------------------------------------------------------------- /lib/firebase/post/read.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { db } from '@/lib/firebase' 4 | import { collection, doc, getDoc, getDocs, onSnapshot } from 'firebase/firestore' 5 | import useSWRSubscription from 'swr/subscription' 6 | 7 | export function usePosts() { 8 | const { data, error } = useSWRSubscription(['posts'], ([path], { next }) => { 9 | const ref = collection(db, path); 10 | 11 | const unsub = onSnapshot(ref, (snaps) => { 12 | next(null, snaps.docs.map((v) => v.data())) 13 | }, (error) => { 14 | next(error?.message) 15 | }) 16 | return () => unsub(); 17 | }) 18 | return { 19 | data, 20 | error, 21 | isLoading: data === undefined ? true : false, 22 | } 23 | } 24 | 25 | export const getPost = async (id) => { 26 | return await getDoc(doc(db, `posts/${id}`)); 27 | } 28 | -------------------------------------------------------------------------------- /lib/firebase/post/read_server.jsx: -------------------------------------------------------------------------------- 1 | import { db } from "@/lib/firebase" 2 | import { collection, doc, getDoc, getDocs, query, where } from "firebase/firestore" 3 | 4 | export const getAllPosts = async () => { 5 | return await getDocs(collection(db, 'posts')).then((snaps) => snaps.docs.map((d) => d.data())) 6 | } 7 | 8 | export const getAllPostsWithCategory = async (categoryId) => { 9 | const q = query(collection(db, 'posts'), where('categoryId', '==', categoryId)) 10 | return await getDocs(q).then((snaps) => snaps.docs.map((d) => d.data())) 11 | } 12 | 13 | 14 | export const getPost = async (id) => { 15 | return await getDoc(doc(db, `posts/${id}`)).then((snap) => snap.data()); 16 | } 17 | -------------------------------------------------------------------------------- /lib/firebase/post/write.jsx: -------------------------------------------------------------------------------- 1 | import { db, storage } from "@/lib/firebase"; 2 | import { Timestamp, deleteDoc, doc, setDoc, updateDoc } from "firebase/firestore"; 3 | import { getDownloadURL, ref, uploadBytes } from "firebase/storage"; 4 | 5 | export const createNewPost = async ({ data, image }) => { 6 | if (!data?.title) { 7 | throw new Error("Name is undefined"); 8 | } 9 | if (!data?.slug) { 10 | throw new Error("Slug is undefined"); 11 | } 12 | if (!image) { 13 | throw new Error("Image is not selected"); 14 | } 15 | const imageRef = ref(storage, `posts/${data?.slug}.png`); 16 | await uploadBytes(imageRef, image); 17 | const imageURL = await getDownloadURL(imageRef); 18 | 19 | const firestoreRef = doc(db, `posts/${data?.slug}`) 20 | await setDoc(firestoreRef, { 21 | ...data, 22 | id: data?.slug, 23 | imageURL: imageURL, 24 | timestamp: Timestamp.now(), 25 | }); 26 | } 27 | 28 | export const updatePost = async ({ data, image }) => { 29 | if (!data?.title) { 30 | throw new Error("Name is undefined"); 31 | } 32 | if (!data?.slug) { 33 | throw new Error("Slug is undefined"); 34 | } 35 | var imageURL = data?.imageURL; 36 | 37 | if (image) { 38 | const imageRef = ref(storage, `posts/${data?.slug}.png`); 39 | await uploadBytes(imageRef, image); 40 | imageURL = await getDownloadURL(imageRef); 41 | } 42 | 43 | const firestoreRef = doc(db, `posts/${data?.id}`); 44 | 45 | await updateDoc(firestoreRef, { 46 | ...data, 47 | imageURL: imageURL, 48 | timestamp: Timestamp.now(), 49 | }); 50 | } 51 | 52 | export const deletePost = async (id) => { 53 | if (!id) { 54 | throw new Error("Id is required"); 55 | } 56 | await deleteDoc(doc(db, `posts/${id}`)); 57 | } -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lyeana_blog", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "lyeana_blog", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "draft-convert": "^2.1.13", 12 | "draft-js": "^0.11.7", 13 | "firebase": "^10.10.0", 14 | "lucide-react": "^0.365.0", 15 | "next": "14.1.4", 16 | "react": "^18", 17 | "react-dom": "^18", 18 | "react-draft-wysiwyg": "^1.15.0", 19 | "react-quill": "^2.0.0", 20 | "swr": "^2.2.5" 21 | }, 22 | "devDependencies": { 23 | "autoprefixer": "^10.0.1", 24 | "postcss": "^8", 25 | "tailwindcss": "^3.3.0" 26 | } 27 | }, 28 | "node_modules/@alloc/quick-lru": { 29 | "version": "5.2.0", 30 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 31 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 32 | "dev": true, 33 | "engines": { 34 | "node": ">=10" 35 | }, 36 | "funding": { 37 | "url": "https://github.com/sponsors/sindresorhus" 38 | } 39 | }, 40 | "node_modules/@babel/runtime": { 41 | "version": "7.24.4", 42 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", 43 | "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", 44 | "dependencies": { 45 | "regenerator-runtime": "^0.14.0" 46 | }, 47 | "engines": { 48 | "node": ">=6.9.0" 49 | } 50 | }, 51 | "node_modules/@fastify/busboy": { 52 | "version": "2.1.1", 53 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", 54 | "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", 55 | "engines": { 56 | "node": ">=14" 57 | } 58 | }, 59 | "node_modules/@firebase/analytics": { 60 | "version": "0.10.2", 61 | "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.2.tgz", 62 | "integrity": "sha512-6Gv/Fndih+dOEEfsBJEeKlwxw9EvCO9D/y+yJMasblvCmj78wUVtn+T96zguSrbhfZ2yBhLS1vukYiPg6hI49w==", 63 | "dependencies": { 64 | "@firebase/component": "0.6.6", 65 | "@firebase/installations": "0.6.6", 66 | "@firebase/logger": "0.4.1", 67 | "@firebase/util": "1.9.5", 68 | "tslib": "^2.1.0" 69 | }, 70 | "peerDependencies": { 71 | "@firebase/app": "0.x" 72 | } 73 | }, 74 | "node_modules/@firebase/analytics-compat": { 75 | "version": "0.2.8", 76 | "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.8.tgz", 77 | "integrity": "sha512-scvzDPIsP9HcLWM77YQD7F3yLQksGvPUzyfqUrPo9XxIx26txJvGMJAS8O8BHa6jIvsjUenaTZ5oXEtKqNZQ9Q==", 78 | "dependencies": { 79 | "@firebase/analytics": "0.10.2", 80 | "@firebase/analytics-types": "0.8.1", 81 | "@firebase/component": "0.6.6", 82 | "@firebase/util": "1.9.5", 83 | "tslib": "^2.1.0" 84 | }, 85 | "peerDependencies": { 86 | "@firebase/app-compat": "0.x" 87 | } 88 | }, 89 | "node_modules/@firebase/analytics-types": { 90 | "version": "0.8.1", 91 | "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.1.tgz", 92 | "integrity": "sha512-niv/67/EOkTlGUxyiOYfIkysSMGYxkIUHJzT9pNkeIGt6zOz759oCUXOAwwjJzckh11dMBFjIYBmtWrdSgbmJw==" 93 | }, 94 | "node_modules/@firebase/app": { 95 | "version": "0.10.0", 96 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.0.tgz", 97 | "integrity": "sha512-bemcsqQD4teEnCM/+FiK8LFjlfoIFewMY3LOIgxa59ISlkk4zlw4ezz1iLY45yQ6ip6WDwky7cx9UruFBAn6iw==", 98 | "dependencies": { 99 | "@firebase/component": "0.6.6", 100 | "@firebase/logger": "0.4.1", 101 | "@firebase/util": "1.9.5", 102 | "idb": "7.1.1", 103 | "tslib": "^2.1.0" 104 | } 105 | }, 106 | "node_modules/@firebase/app-check": { 107 | "version": "0.8.3", 108 | "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.3.tgz", 109 | "integrity": "sha512-nvlsj5oZBtYDjFTygQJ6xpyiYj8Jao2bFFyNJkUUPdg/QB8uhqDeG74P+gUH6iY9qzd1g5ZokmmGsoIhv9tdSQ==", 110 | "dependencies": { 111 | "@firebase/component": "0.6.6", 112 | "@firebase/logger": "0.4.1", 113 | "@firebase/util": "1.9.5", 114 | "tslib": "^2.1.0" 115 | }, 116 | "peerDependencies": { 117 | "@firebase/app": "0.x" 118 | } 119 | }, 120 | "node_modules/@firebase/app-check-compat": { 121 | "version": "0.3.10", 122 | "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.10.tgz", 123 | "integrity": "sha512-v+jiLG3rQ1fhpIuNIm3WqrL4dkPUIkgOWoic7QABVsZKSAv2YhOFvAenp7IhSP/pz/aiPniJ8G7el/MWieECTg==", 124 | "dependencies": { 125 | "@firebase/app-check": "0.8.3", 126 | "@firebase/app-check-types": "0.5.1", 127 | "@firebase/component": "0.6.6", 128 | "@firebase/logger": "0.4.1", 129 | "@firebase/util": "1.9.5", 130 | "tslib": "^2.1.0" 131 | }, 132 | "peerDependencies": { 133 | "@firebase/app-compat": "0.x" 134 | } 135 | }, 136 | "node_modules/@firebase/app-check-interop-types": { 137 | "version": "0.3.1", 138 | "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.1.tgz", 139 | "integrity": "sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==" 140 | }, 141 | "node_modules/@firebase/app-check-types": { 142 | "version": "0.5.1", 143 | "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.1.tgz", 144 | "integrity": "sha512-NqeIcuGzZjl+khpXV0qsyOoaTqLeiG/K0kIDrebol+gb7xpmfOvXXqPEls+1WFBgHcPGdu+XRLhBA7xLzrVdpA==" 145 | }, 146 | "node_modules/@firebase/app-compat": { 147 | "version": "0.2.30", 148 | "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.30.tgz", 149 | "integrity": "sha512-S3FI3yx36xq5NYWXv/rqZiEnkQ89QwfGdl26iWZ9skuOGM96DYQUxs/zs7NkfAQcfpXC8f5DuUrE0Rz/0XdTEg==", 150 | "dependencies": { 151 | "@firebase/app": "0.10.0", 152 | "@firebase/component": "0.6.6", 153 | "@firebase/logger": "0.4.1", 154 | "@firebase/util": "1.9.5", 155 | "tslib": "^2.1.0" 156 | } 157 | }, 158 | "node_modules/@firebase/app-types": { 159 | "version": "0.9.1", 160 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.1.tgz", 161 | "integrity": "sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==" 162 | }, 163 | "node_modules/@firebase/auth": { 164 | "version": "1.7.0", 165 | "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.0.tgz", 166 | "integrity": "sha512-xvyCR3Ivan74AwT/rQOqrYkyu4Ccz6GOFaohi1Pw3gLOpG2WIdC/phc4zdQkLJjmbGFcYNisHyqII2P/H9ZJow==", 167 | "dependencies": { 168 | "@firebase/component": "0.6.6", 169 | "@firebase/logger": "0.4.1", 170 | "@firebase/util": "1.9.5", 171 | "tslib": "^2.1.0", 172 | "undici": "5.28.3" 173 | }, 174 | "peerDependencies": { 175 | "@firebase/app": "0.x", 176 | "@react-native-async-storage/async-storage": "^1.18.1" 177 | }, 178 | "peerDependenciesMeta": { 179 | "@react-native-async-storage/async-storage": { 180 | "optional": true 181 | } 182 | } 183 | }, 184 | "node_modules/@firebase/auth-compat": { 185 | "version": "0.5.5", 186 | "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.5.tgz", 187 | "integrity": "sha512-iAq/wCCEX4TPhZeCOmLxscHh6oZtvJ4g/FcRLynFntW3WOtrWF9/91jq+FsDSSJo9Av8MpnayCbbx+jpGSv4DQ==", 188 | "dependencies": { 189 | "@firebase/auth": "1.7.0", 190 | "@firebase/auth-types": "0.12.1", 191 | "@firebase/component": "0.6.6", 192 | "@firebase/util": "1.9.5", 193 | "tslib": "^2.1.0", 194 | "undici": "5.28.3" 195 | }, 196 | "peerDependencies": { 197 | "@firebase/app-compat": "0.x" 198 | } 199 | }, 200 | "node_modules/@firebase/auth-interop-types": { 201 | "version": "0.2.2", 202 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.2.tgz", 203 | "integrity": "sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==" 204 | }, 205 | "node_modules/@firebase/auth-types": { 206 | "version": "0.12.1", 207 | "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.1.tgz", 208 | "integrity": "sha512-B3dhiWRWf/njWosx4zdhSEoD4WHJmr4zbnBw6t20mRG/IZ4u0rWUBlMP1vFjhMstKIow1XmoGhTwD65X5ZXLjw==", 209 | "peerDependencies": { 210 | "@firebase/app-types": "0.x", 211 | "@firebase/util": "1.x" 212 | } 213 | }, 214 | "node_modules/@firebase/component": { 215 | "version": "0.6.6", 216 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.6.tgz", 217 | "integrity": "sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==", 218 | "dependencies": { 219 | "@firebase/util": "1.9.5", 220 | "tslib": "^2.1.0" 221 | } 222 | }, 223 | "node_modules/@firebase/database": { 224 | "version": "1.0.4", 225 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.4.tgz", 226 | "integrity": "sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==", 227 | "dependencies": { 228 | "@firebase/app-check-interop-types": "0.3.1", 229 | "@firebase/auth-interop-types": "0.2.2", 230 | "@firebase/component": "0.6.6", 231 | "@firebase/logger": "0.4.1", 232 | "@firebase/util": "1.9.5", 233 | "faye-websocket": "0.11.4", 234 | "tslib": "^2.1.0" 235 | } 236 | }, 237 | "node_modules/@firebase/database-compat": { 238 | "version": "1.0.4", 239 | "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.4.tgz", 240 | "integrity": "sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==", 241 | "dependencies": { 242 | "@firebase/component": "0.6.6", 243 | "@firebase/database": "1.0.4", 244 | "@firebase/database-types": "1.0.2", 245 | "@firebase/logger": "0.4.1", 246 | "@firebase/util": "1.9.5", 247 | "tslib": "^2.1.0" 248 | } 249 | }, 250 | "node_modules/@firebase/database-types": { 251 | "version": "1.0.2", 252 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.2.tgz", 253 | "integrity": "sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==", 254 | "dependencies": { 255 | "@firebase/app-types": "0.9.1", 256 | "@firebase/util": "1.9.5" 257 | } 258 | }, 259 | "node_modules/@firebase/firestore": { 260 | "version": "4.5.1", 261 | "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.5.1.tgz", 262 | "integrity": "sha512-VQsMKJGuqlx8I+n+NhNrdFRBJU/B1O8mpGIAYABBmVxPyJax/ynuBMJkREmqzRWpbBj5IAtHe+vm4EvJlb6RLg==", 263 | "dependencies": { 264 | "@firebase/component": "0.6.6", 265 | "@firebase/logger": "0.4.1", 266 | "@firebase/util": "1.9.5", 267 | "@firebase/webchannel-wrapper": "0.10.6", 268 | "@grpc/grpc-js": "~1.9.0", 269 | "@grpc/proto-loader": "^0.7.8", 270 | "tslib": "^2.1.0", 271 | "undici": "5.28.3" 272 | }, 273 | "engines": { 274 | "node": ">=10.10.0" 275 | }, 276 | "peerDependencies": { 277 | "@firebase/app": "0.x" 278 | } 279 | }, 280 | "node_modules/@firebase/firestore-compat": { 281 | "version": "0.3.28", 282 | "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.28.tgz", 283 | "integrity": "sha512-qaE9QYrWV0K+nh/HWf2EL/V2fPsuTZJ8K4S4e+xUOIxVulmXXwlKg4vgJgRF6r5AlABcSphKNbz/77fChgNwiQ==", 284 | "dependencies": { 285 | "@firebase/component": "0.6.6", 286 | "@firebase/firestore": "4.5.1", 287 | "@firebase/firestore-types": "3.0.1", 288 | "@firebase/util": "1.9.5", 289 | "tslib": "^2.1.0" 290 | }, 291 | "peerDependencies": { 292 | "@firebase/app-compat": "0.x" 293 | } 294 | }, 295 | "node_modules/@firebase/firestore-types": { 296 | "version": "3.0.1", 297 | "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.1.tgz", 298 | "integrity": "sha512-mVhPcHr5FICjF67m6JHgj+XRvAz/gZ62xifeGfcm00RFl6tNKfCzCfKeyB2BDIEc9dUnEstkmIXlmLIelOWoaA==", 299 | "peerDependencies": { 300 | "@firebase/app-types": "0.x", 301 | "@firebase/util": "1.x" 302 | } 303 | }, 304 | "node_modules/@firebase/functions": { 305 | "version": "0.11.3", 306 | "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.3.tgz", 307 | "integrity": "sha512-fpjc3VwxsgFBcR0wmof6kIng7NNvhjqetwWUTMs/ZeOI0QiZoUvSDaudFZvPfvXujSK/sr3tk9G1YzjbwCQkgQ==", 308 | "dependencies": { 309 | "@firebase/app-check-interop-types": "0.3.1", 310 | "@firebase/auth-interop-types": "0.2.2", 311 | "@firebase/component": "0.6.6", 312 | "@firebase/messaging-interop-types": "0.2.1", 313 | "@firebase/util": "1.9.5", 314 | "tslib": "^2.1.0", 315 | "undici": "5.28.3" 316 | }, 317 | "peerDependencies": { 318 | "@firebase/app": "0.x" 319 | } 320 | }, 321 | "node_modules/@firebase/functions-compat": { 322 | "version": "0.3.9", 323 | "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.9.tgz", 324 | "integrity": "sha512-yVcNBUljBFD6VPeTJcnWBEFZlVICKWuJzJmPuvgKEH++8z/CdgUKw0YslceaPQIWnstdviZDEF1cjJnR/bLvzQ==", 325 | "dependencies": { 326 | "@firebase/component": "0.6.6", 327 | "@firebase/functions": "0.11.3", 328 | "@firebase/functions-types": "0.6.1", 329 | "@firebase/util": "1.9.5", 330 | "tslib": "^2.1.0" 331 | }, 332 | "peerDependencies": { 333 | "@firebase/app-compat": "0.x" 334 | } 335 | }, 336 | "node_modules/@firebase/functions-types": { 337 | "version": "0.6.1", 338 | "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.1.tgz", 339 | "integrity": "sha512-DirqgTXSBzyKsQwcKnx/YdGMaRdJhywnThrINP+Iog8QfQnrL7aprTXHDFHlpZEMwykS54YRk53xzz7j396QXQ==" 340 | }, 341 | "node_modules/@firebase/installations": { 342 | "version": "0.6.6", 343 | "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.6.tgz", 344 | "integrity": "sha512-dNGRGoHmstgEJqh9Kzk22fR2ZrVBH1JWliaL6binQ6pIzlWscreHNczzJDgOKoVT0PjWTrAmh/azztiX/e2uTw==", 345 | "dependencies": { 346 | "@firebase/component": "0.6.6", 347 | "@firebase/util": "1.9.5", 348 | "idb": "7.1.1", 349 | "tslib": "^2.1.0" 350 | }, 351 | "peerDependencies": { 352 | "@firebase/app": "0.x" 353 | } 354 | }, 355 | "node_modules/@firebase/installations-compat": { 356 | "version": "0.2.6", 357 | "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.6.tgz", 358 | "integrity": "sha512-uxBAt2WsuEMT5dalA/1O+Uyi9DS25zKHgIPdrQ7KO1ZUdBURiGScIyjdhIM/7NMSvHGYugK4PUVdK9NFIffeiw==", 359 | "dependencies": { 360 | "@firebase/component": "0.6.6", 361 | "@firebase/installations": "0.6.6", 362 | "@firebase/installations-types": "0.5.1", 363 | "@firebase/util": "1.9.5", 364 | "tslib": "^2.1.0" 365 | }, 366 | "peerDependencies": { 367 | "@firebase/app-compat": "0.x" 368 | } 369 | }, 370 | "node_modules/@firebase/installations-types": { 371 | "version": "0.5.1", 372 | "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.1.tgz", 373 | "integrity": "sha512-OyREnRTfe2wIWTrzCz65ajyo4lFm6VgbeVqMMP+3GJLfCtNvY9VXkmqs3WFEsyYezzdcRqOt39FynZoLlkO+cQ==", 374 | "peerDependencies": { 375 | "@firebase/app-types": "0.x" 376 | } 377 | }, 378 | "node_modules/@firebase/logger": { 379 | "version": "0.4.1", 380 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.1.tgz", 381 | "integrity": "sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==", 382 | "dependencies": { 383 | "tslib": "^2.1.0" 384 | } 385 | }, 386 | "node_modules/@firebase/messaging": { 387 | "version": "0.12.7", 388 | "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.7.tgz", 389 | "integrity": "sha512-FNZiGMZWjU2D13U/XpoGDSfqCx2kqJ171P3VjquBJfd8SkYNyJMkKM82QvTjQaDd4nuWzgvTDR81DGJFUO6AOg==", 390 | "dependencies": { 391 | "@firebase/component": "0.6.6", 392 | "@firebase/installations": "0.6.6", 393 | "@firebase/messaging-interop-types": "0.2.1", 394 | "@firebase/util": "1.9.5", 395 | "idb": "7.1.1", 396 | "tslib": "^2.1.0" 397 | }, 398 | "peerDependencies": { 399 | "@firebase/app": "0.x" 400 | } 401 | }, 402 | "node_modules/@firebase/messaging-compat": { 403 | "version": "0.2.7", 404 | "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.7.tgz", 405 | "integrity": "sha512-29eeNzkjJPNc1RAVmxocaA8PzkbtuNvabX8jKw3N8VdAmyugx7+dYB+jCnereiWqIwivIZ2xSbCUQ24vC7+HaQ==", 406 | "dependencies": { 407 | "@firebase/component": "0.6.6", 408 | "@firebase/messaging": "0.12.7", 409 | "@firebase/util": "1.9.5", 410 | "tslib": "^2.1.0" 411 | }, 412 | "peerDependencies": { 413 | "@firebase/app-compat": "0.x" 414 | } 415 | }, 416 | "node_modules/@firebase/messaging-interop-types": { 417 | "version": "0.2.1", 418 | "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.1.tgz", 419 | "integrity": "sha512-jfGJ7Jc32BDHXvXHyXi34mVLzZY8X0t929DTMwz7Tj2Hc40Zuzx8VRCIPLRrRUyvBrJCd5EpIcQgCygXhtaN1A==" 420 | }, 421 | "node_modules/@firebase/performance": { 422 | "version": "0.6.6", 423 | "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.6.tgz", 424 | "integrity": "sha512-UOUHhvj2GJcjyJewdX1ShnON0/eqTswHvYzzQPC4nrIuMFvHwMGk8NpCaqh7JZmpaxh9AMr6kM+M/p37DrKWXA==", 425 | "dependencies": { 426 | "@firebase/component": "0.6.6", 427 | "@firebase/installations": "0.6.6", 428 | "@firebase/logger": "0.4.1", 429 | "@firebase/util": "1.9.5", 430 | "tslib": "^2.1.0" 431 | }, 432 | "peerDependencies": { 433 | "@firebase/app": "0.x" 434 | } 435 | }, 436 | "node_modules/@firebase/performance-compat": { 437 | "version": "0.2.6", 438 | "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.6.tgz", 439 | "integrity": "sha512-JSGdNNHBAMRTocGpN+m+7tk+9rulBcwuG+Ejw/ooDj45FGcON1Eymxh/qbe5M6Dlj5P1ClbkHLj4yf7MiCHOag==", 440 | "dependencies": { 441 | "@firebase/component": "0.6.6", 442 | "@firebase/logger": "0.4.1", 443 | "@firebase/performance": "0.6.6", 444 | "@firebase/performance-types": "0.2.1", 445 | "@firebase/util": "1.9.5", 446 | "tslib": "^2.1.0" 447 | }, 448 | "peerDependencies": { 449 | "@firebase/app-compat": "0.x" 450 | } 451 | }, 452 | "node_modules/@firebase/performance-types": { 453 | "version": "0.2.1", 454 | "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.1.tgz", 455 | "integrity": "sha512-kQ8pEr4d6ArhPoYrngcFlEJMNWMdEZTpvMAttWH0C2vegBgj47cm6xXFy9+0j27OBhOIiPn48Z+2WE2XNu33CQ==" 456 | }, 457 | "node_modules/@firebase/remote-config": { 458 | "version": "0.4.6", 459 | "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.6.tgz", 460 | "integrity": "sha512-qtanFS+AX5k/7e/+Azf27Hq4reX28QsUvRcYWyS5cOaRMS9jtll4MK4winWmzX8MdJY637nFzIx43PlMKVnaKw==", 461 | "dependencies": { 462 | "@firebase/component": "0.6.6", 463 | "@firebase/installations": "0.6.6", 464 | "@firebase/logger": "0.4.1", 465 | "@firebase/util": "1.9.5", 466 | "tslib": "^2.1.0" 467 | }, 468 | "peerDependencies": { 469 | "@firebase/app": "0.x" 470 | } 471 | }, 472 | "node_modules/@firebase/remote-config-compat": { 473 | "version": "0.2.6", 474 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.6.tgz", 475 | "integrity": "sha512-cFdpmN/rzDhm4pbk0WpOzK9JQ9I1ZhXzhtYbKRBwUag3pG1odEfIORygMDCGQniPpcae/QGXho4srJHfoijKuw==", 476 | "dependencies": { 477 | "@firebase/component": "0.6.6", 478 | "@firebase/logger": "0.4.1", 479 | "@firebase/remote-config": "0.4.6", 480 | "@firebase/remote-config-types": "0.3.1", 481 | "@firebase/util": "1.9.5", 482 | "tslib": "^2.1.0" 483 | }, 484 | "peerDependencies": { 485 | "@firebase/app-compat": "0.x" 486 | } 487 | }, 488 | "node_modules/@firebase/remote-config-types": { 489 | "version": "0.3.1", 490 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.1.tgz", 491 | "integrity": "sha512-PgmfUugcJAinPLsJlYcBbNZe7KE2omdQw1WCT/z46nKkNVGkuHdVFSq54s3wiFa9BoHmLZ01u4hGXIhm6MdLOw==" 492 | }, 493 | "node_modules/@firebase/storage": { 494 | "version": "0.12.3", 495 | "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.3.tgz", 496 | "integrity": "sha512-JP/rN8fb4CgCo7k/I8OLVgRx5cgExsWOIUQ2O2VQwR6YKItuL375c9v7PDaOfEcFZea/fXtfJJ3Z2NaI9445CQ==", 497 | "dependencies": { 498 | "@firebase/component": "0.6.6", 499 | "@firebase/util": "1.9.5", 500 | "tslib": "^2.1.0", 501 | "undici": "5.28.3" 502 | }, 503 | "peerDependencies": { 504 | "@firebase/app": "0.x" 505 | } 506 | }, 507 | "node_modules/@firebase/storage-compat": { 508 | "version": "0.3.6", 509 | "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.6.tgz", 510 | "integrity": "sha512-AKv0vwktqdW4SDDDcHSN2ahi1Hpjs8rTM6sE7+yrWpm8cRght/PkqylsFnIe+a/toCNd8WeWaXq/oaXHPvRw1w==", 511 | "dependencies": { 512 | "@firebase/component": "0.6.6", 513 | "@firebase/storage": "0.12.3", 514 | "@firebase/storage-types": "0.8.1", 515 | "@firebase/util": "1.9.5", 516 | "tslib": "^2.1.0" 517 | }, 518 | "peerDependencies": { 519 | "@firebase/app-compat": "0.x" 520 | } 521 | }, 522 | "node_modules/@firebase/storage-types": { 523 | "version": "0.8.1", 524 | "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.1.tgz", 525 | "integrity": "sha512-yj0vypPT9UbbfYYwzpXPYchnjWqCADcTbGNawAIebww8rnQYPGbESYTKQdFRPXiLspYPB7xCHTXThmMJuvDcsQ==", 526 | "peerDependencies": { 527 | "@firebase/app-types": "0.x", 528 | "@firebase/util": "1.x" 529 | } 530 | }, 531 | "node_modules/@firebase/util": { 532 | "version": "1.9.5", 533 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.5.tgz", 534 | "integrity": "sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==", 535 | "dependencies": { 536 | "tslib": "^2.1.0" 537 | } 538 | }, 539 | "node_modules/@firebase/webchannel-wrapper": { 540 | "version": "0.10.6", 541 | "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.6.tgz", 542 | "integrity": "sha512-EnfRJvrnzkHwN3BPMCayCFT5lCqInzg3RdlRsDjDvB1EJli6Usj26T6lJ67BU2UcYXBS5xcp1Wj4+zRzj2NaZg==" 543 | }, 544 | "node_modules/@grpc/grpc-js": { 545 | "version": "1.9.14", 546 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", 547 | "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", 548 | "dependencies": { 549 | "@grpc/proto-loader": "^0.7.8", 550 | "@types/node": ">=12.12.47" 551 | }, 552 | "engines": { 553 | "node": "^8.13.0 || >=10.10.0" 554 | } 555 | }, 556 | "node_modules/@grpc/proto-loader": { 557 | "version": "0.7.12", 558 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", 559 | "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", 560 | "dependencies": { 561 | "lodash.camelcase": "^4.3.0", 562 | "long": "^5.0.0", 563 | "protobufjs": "^7.2.4", 564 | "yargs": "^17.7.2" 565 | }, 566 | "bin": { 567 | "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" 568 | }, 569 | "engines": { 570 | "node": ">=6" 571 | } 572 | }, 573 | "node_modules/@isaacs/cliui": { 574 | "version": "8.0.2", 575 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 576 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 577 | "dev": true, 578 | "dependencies": { 579 | "string-width": "^5.1.2", 580 | "string-width-cjs": "npm:string-width@^4.2.0", 581 | "strip-ansi": "^7.0.1", 582 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 583 | "wrap-ansi": "^8.1.0", 584 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 585 | }, 586 | "engines": { 587 | "node": ">=12" 588 | } 589 | }, 590 | "node_modules/@jridgewell/gen-mapping": { 591 | "version": "0.3.5", 592 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 593 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 594 | "dev": true, 595 | "dependencies": { 596 | "@jridgewell/set-array": "^1.2.1", 597 | "@jridgewell/sourcemap-codec": "^1.4.10", 598 | "@jridgewell/trace-mapping": "^0.3.24" 599 | }, 600 | "engines": { 601 | "node": ">=6.0.0" 602 | } 603 | }, 604 | "node_modules/@jridgewell/resolve-uri": { 605 | "version": "3.1.2", 606 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 607 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 608 | "dev": true, 609 | "engines": { 610 | "node": ">=6.0.0" 611 | } 612 | }, 613 | "node_modules/@jridgewell/set-array": { 614 | "version": "1.2.1", 615 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 616 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 617 | "dev": true, 618 | "engines": { 619 | "node": ">=6.0.0" 620 | } 621 | }, 622 | "node_modules/@jridgewell/sourcemap-codec": { 623 | "version": "1.4.15", 624 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 625 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 626 | "dev": true 627 | }, 628 | "node_modules/@jridgewell/trace-mapping": { 629 | "version": "0.3.25", 630 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 631 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 632 | "dev": true, 633 | "dependencies": { 634 | "@jridgewell/resolve-uri": "^3.1.0", 635 | "@jridgewell/sourcemap-codec": "^1.4.14" 636 | } 637 | }, 638 | "node_modules/@next/env": { 639 | "version": "14.1.4", 640 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz", 641 | "integrity": "sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==" 642 | }, 643 | "node_modules/@next/swc-darwin-arm64": { 644 | "version": "14.1.4", 645 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz", 646 | "integrity": "sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==", 647 | "cpu": [ 648 | "arm64" 649 | ], 650 | "optional": true, 651 | "os": [ 652 | "darwin" 653 | ], 654 | "engines": { 655 | "node": ">= 10" 656 | } 657 | }, 658 | "node_modules/@next/swc-darwin-x64": { 659 | "version": "14.1.4", 660 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz", 661 | "integrity": "sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==", 662 | "cpu": [ 663 | "x64" 664 | ], 665 | "optional": true, 666 | "os": [ 667 | "darwin" 668 | ], 669 | "engines": { 670 | "node": ">= 10" 671 | } 672 | }, 673 | "node_modules/@next/swc-linux-arm64-gnu": { 674 | "version": "14.1.4", 675 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz", 676 | "integrity": "sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==", 677 | "cpu": [ 678 | "arm64" 679 | ], 680 | "optional": true, 681 | "os": [ 682 | "linux" 683 | ], 684 | "engines": { 685 | "node": ">= 10" 686 | } 687 | }, 688 | "node_modules/@next/swc-linux-arm64-musl": { 689 | "version": "14.1.4", 690 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz", 691 | "integrity": "sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==", 692 | "cpu": [ 693 | "arm64" 694 | ], 695 | "optional": true, 696 | "os": [ 697 | "linux" 698 | ], 699 | "engines": { 700 | "node": ">= 10" 701 | } 702 | }, 703 | "node_modules/@next/swc-linux-x64-gnu": { 704 | "version": "14.1.4", 705 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz", 706 | "integrity": "sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==", 707 | "cpu": [ 708 | "x64" 709 | ], 710 | "optional": true, 711 | "os": [ 712 | "linux" 713 | ], 714 | "engines": { 715 | "node": ">= 10" 716 | } 717 | }, 718 | "node_modules/@next/swc-linux-x64-musl": { 719 | "version": "14.1.4", 720 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz", 721 | "integrity": "sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==", 722 | "cpu": [ 723 | "x64" 724 | ], 725 | "optional": true, 726 | "os": [ 727 | "linux" 728 | ], 729 | "engines": { 730 | "node": ">= 10" 731 | } 732 | }, 733 | "node_modules/@next/swc-win32-arm64-msvc": { 734 | "version": "14.1.4", 735 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz", 736 | "integrity": "sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==", 737 | "cpu": [ 738 | "arm64" 739 | ], 740 | "optional": true, 741 | "os": [ 742 | "win32" 743 | ], 744 | "engines": { 745 | "node": ">= 10" 746 | } 747 | }, 748 | "node_modules/@next/swc-win32-ia32-msvc": { 749 | "version": "14.1.4", 750 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz", 751 | "integrity": "sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==", 752 | "cpu": [ 753 | "ia32" 754 | ], 755 | "optional": true, 756 | "os": [ 757 | "win32" 758 | ], 759 | "engines": { 760 | "node": ">= 10" 761 | } 762 | }, 763 | "node_modules/@next/swc-win32-x64-msvc": { 764 | "version": "14.1.4", 765 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz", 766 | "integrity": "sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==", 767 | "cpu": [ 768 | "x64" 769 | ], 770 | "optional": true, 771 | "os": [ 772 | "win32" 773 | ], 774 | "engines": { 775 | "node": ">= 10" 776 | } 777 | }, 778 | "node_modules/@nodelib/fs.scandir": { 779 | "version": "2.1.5", 780 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 781 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 782 | "dev": true, 783 | "dependencies": { 784 | "@nodelib/fs.stat": "2.0.5", 785 | "run-parallel": "^1.1.9" 786 | }, 787 | "engines": { 788 | "node": ">= 8" 789 | } 790 | }, 791 | "node_modules/@nodelib/fs.stat": { 792 | "version": "2.0.5", 793 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 794 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 795 | "dev": true, 796 | "engines": { 797 | "node": ">= 8" 798 | } 799 | }, 800 | "node_modules/@nodelib/fs.walk": { 801 | "version": "1.2.8", 802 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 803 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 804 | "dev": true, 805 | "dependencies": { 806 | "@nodelib/fs.scandir": "2.1.5", 807 | "fastq": "^1.6.0" 808 | }, 809 | "engines": { 810 | "node": ">= 8" 811 | } 812 | }, 813 | "node_modules/@pkgjs/parseargs": { 814 | "version": "0.11.0", 815 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 816 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 817 | "dev": true, 818 | "optional": true, 819 | "engines": { 820 | "node": ">=14" 821 | } 822 | }, 823 | "node_modules/@protobufjs/aspromise": { 824 | "version": "1.1.2", 825 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 826 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 827 | }, 828 | "node_modules/@protobufjs/base64": { 829 | "version": "1.1.2", 830 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 831 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 832 | }, 833 | "node_modules/@protobufjs/codegen": { 834 | "version": "2.0.4", 835 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 836 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 837 | }, 838 | "node_modules/@protobufjs/eventemitter": { 839 | "version": "1.1.0", 840 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 841 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 842 | }, 843 | "node_modules/@protobufjs/fetch": { 844 | "version": "1.1.0", 845 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 846 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 847 | "dependencies": { 848 | "@protobufjs/aspromise": "^1.1.1", 849 | "@protobufjs/inquire": "^1.1.0" 850 | } 851 | }, 852 | "node_modules/@protobufjs/float": { 853 | "version": "1.0.2", 854 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 855 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 856 | }, 857 | "node_modules/@protobufjs/inquire": { 858 | "version": "1.1.0", 859 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 860 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 861 | }, 862 | "node_modules/@protobufjs/path": { 863 | "version": "1.1.2", 864 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 865 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 866 | }, 867 | "node_modules/@protobufjs/pool": { 868 | "version": "1.1.0", 869 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 870 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 871 | }, 872 | "node_modules/@protobufjs/utf8": { 873 | "version": "1.1.0", 874 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 875 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 876 | }, 877 | "node_modules/@swc/helpers": { 878 | "version": "0.5.2", 879 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", 880 | "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", 881 | "dependencies": { 882 | "tslib": "^2.4.0" 883 | } 884 | }, 885 | "node_modules/@types/node": { 886 | "version": "20.12.4", 887 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", 888 | "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", 889 | "dependencies": { 890 | "undici-types": "~5.26.4" 891 | } 892 | }, 893 | "node_modules/@types/quill": { 894 | "version": "1.3.10", 895 | "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", 896 | "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", 897 | "dependencies": { 898 | "parchment": "^1.1.2" 899 | } 900 | }, 901 | "node_modules/ansi-regex": { 902 | "version": "6.0.1", 903 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 904 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 905 | "dev": true, 906 | "engines": { 907 | "node": ">=12" 908 | }, 909 | "funding": { 910 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 911 | } 912 | }, 913 | "node_modules/ansi-styles": { 914 | "version": "6.2.1", 915 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 916 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 917 | "dev": true, 918 | "engines": { 919 | "node": ">=12" 920 | }, 921 | "funding": { 922 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 923 | } 924 | }, 925 | "node_modules/any-promise": { 926 | "version": "1.3.0", 927 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 928 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 929 | "dev": true 930 | }, 931 | "node_modules/anymatch": { 932 | "version": "3.1.3", 933 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 934 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 935 | "dev": true, 936 | "dependencies": { 937 | "normalize-path": "^3.0.0", 938 | "picomatch": "^2.0.4" 939 | }, 940 | "engines": { 941 | "node": ">= 8" 942 | } 943 | }, 944 | "node_modules/arg": { 945 | "version": "5.0.2", 946 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 947 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 948 | "dev": true 949 | }, 950 | "node_modules/asap": { 951 | "version": "2.0.6", 952 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 953 | "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" 954 | }, 955 | "node_modules/autoprefixer": { 956 | "version": "10.4.19", 957 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", 958 | "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", 959 | "dev": true, 960 | "funding": [ 961 | { 962 | "type": "opencollective", 963 | "url": "https://opencollective.com/postcss/" 964 | }, 965 | { 966 | "type": "tidelift", 967 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 968 | }, 969 | { 970 | "type": "github", 971 | "url": "https://github.com/sponsors/ai" 972 | } 973 | ], 974 | "dependencies": { 975 | "browserslist": "^4.23.0", 976 | "caniuse-lite": "^1.0.30001599", 977 | "fraction.js": "^4.3.7", 978 | "normalize-range": "^0.1.2", 979 | "picocolors": "^1.0.0", 980 | "postcss-value-parser": "^4.2.0" 981 | }, 982 | "bin": { 983 | "autoprefixer": "bin/autoprefixer" 984 | }, 985 | "engines": { 986 | "node": "^10 || ^12 || >=14" 987 | }, 988 | "peerDependencies": { 989 | "postcss": "^8.1.0" 990 | } 991 | }, 992 | "node_modules/balanced-match": { 993 | "version": "1.0.2", 994 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 995 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 996 | "dev": true 997 | }, 998 | "node_modules/binary-extensions": { 999 | "version": "2.3.0", 1000 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1001 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1002 | "dev": true, 1003 | "engines": { 1004 | "node": ">=8" 1005 | }, 1006 | "funding": { 1007 | "url": "https://github.com/sponsors/sindresorhus" 1008 | } 1009 | }, 1010 | "node_modules/brace-expansion": { 1011 | "version": "2.0.1", 1012 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1013 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "balanced-match": "^1.0.0" 1017 | } 1018 | }, 1019 | "node_modules/braces": { 1020 | "version": "3.0.2", 1021 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1022 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1023 | "dev": true, 1024 | "dependencies": { 1025 | "fill-range": "^7.0.1" 1026 | }, 1027 | "engines": { 1028 | "node": ">=8" 1029 | } 1030 | }, 1031 | "node_modules/browserslist": { 1032 | "version": "4.23.0", 1033 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", 1034 | "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", 1035 | "dev": true, 1036 | "funding": [ 1037 | { 1038 | "type": "opencollective", 1039 | "url": "https://opencollective.com/browserslist" 1040 | }, 1041 | { 1042 | "type": "tidelift", 1043 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1044 | }, 1045 | { 1046 | "type": "github", 1047 | "url": "https://github.com/sponsors/ai" 1048 | } 1049 | ], 1050 | "dependencies": { 1051 | "caniuse-lite": "^1.0.30001587", 1052 | "electron-to-chromium": "^1.4.668", 1053 | "node-releases": "^2.0.14", 1054 | "update-browserslist-db": "^1.0.13" 1055 | }, 1056 | "bin": { 1057 | "browserslist": "cli.js" 1058 | }, 1059 | "engines": { 1060 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1061 | } 1062 | }, 1063 | "node_modules/busboy": { 1064 | "version": "1.6.0", 1065 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 1066 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 1067 | "dependencies": { 1068 | "streamsearch": "^1.1.0" 1069 | }, 1070 | "engines": { 1071 | "node": ">=10.16.0" 1072 | } 1073 | }, 1074 | "node_modules/call-bind": { 1075 | "version": "1.0.7", 1076 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 1077 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 1078 | "dependencies": { 1079 | "es-define-property": "^1.0.0", 1080 | "es-errors": "^1.3.0", 1081 | "function-bind": "^1.1.2", 1082 | "get-intrinsic": "^1.2.4", 1083 | "set-function-length": "^1.2.1" 1084 | }, 1085 | "engines": { 1086 | "node": ">= 0.4" 1087 | }, 1088 | "funding": { 1089 | "url": "https://github.com/sponsors/ljharb" 1090 | } 1091 | }, 1092 | "node_modules/camelcase-css": { 1093 | "version": "2.0.1", 1094 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1095 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1096 | "dev": true, 1097 | "engines": { 1098 | "node": ">= 6" 1099 | } 1100 | }, 1101 | "node_modules/caniuse-lite": { 1102 | "version": "1.0.30001606", 1103 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", 1104 | "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", 1105 | "funding": [ 1106 | { 1107 | "type": "opencollective", 1108 | "url": "https://opencollective.com/browserslist" 1109 | }, 1110 | { 1111 | "type": "tidelift", 1112 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1113 | }, 1114 | { 1115 | "type": "github", 1116 | "url": "https://github.com/sponsors/ai" 1117 | } 1118 | ] 1119 | }, 1120 | "node_modules/chokidar": { 1121 | "version": "3.6.0", 1122 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 1123 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 1124 | "dev": true, 1125 | "dependencies": { 1126 | "anymatch": "~3.1.2", 1127 | "braces": "~3.0.2", 1128 | "glob-parent": "~5.1.2", 1129 | "is-binary-path": "~2.1.0", 1130 | "is-glob": "~4.0.1", 1131 | "normalize-path": "~3.0.0", 1132 | "readdirp": "~3.6.0" 1133 | }, 1134 | "engines": { 1135 | "node": ">= 8.10.0" 1136 | }, 1137 | "funding": { 1138 | "url": "https://paulmillr.com/funding/" 1139 | }, 1140 | "optionalDependencies": { 1141 | "fsevents": "~2.3.2" 1142 | } 1143 | }, 1144 | "node_modules/chokidar/node_modules/glob-parent": { 1145 | "version": "5.1.2", 1146 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1147 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1148 | "dev": true, 1149 | "dependencies": { 1150 | "is-glob": "^4.0.1" 1151 | }, 1152 | "engines": { 1153 | "node": ">= 6" 1154 | } 1155 | }, 1156 | "node_modules/classnames": { 1157 | "version": "2.5.1", 1158 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", 1159 | "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" 1160 | }, 1161 | "node_modules/client-only": { 1162 | "version": "0.0.1", 1163 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 1164 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 1165 | }, 1166 | "node_modules/cliui": { 1167 | "version": "8.0.1", 1168 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 1169 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 1170 | "dependencies": { 1171 | "string-width": "^4.2.0", 1172 | "strip-ansi": "^6.0.1", 1173 | "wrap-ansi": "^7.0.0" 1174 | }, 1175 | "engines": { 1176 | "node": ">=12" 1177 | } 1178 | }, 1179 | "node_modules/cliui/node_modules/ansi-regex": { 1180 | "version": "5.0.1", 1181 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1182 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1183 | "engines": { 1184 | "node": ">=8" 1185 | } 1186 | }, 1187 | "node_modules/cliui/node_modules/ansi-styles": { 1188 | "version": "4.3.0", 1189 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1190 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1191 | "dependencies": { 1192 | "color-convert": "^2.0.1" 1193 | }, 1194 | "engines": { 1195 | "node": ">=8" 1196 | }, 1197 | "funding": { 1198 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1199 | } 1200 | }, 1201 | "node_modules/cliui/node_modules/emoji-regex": { 1202 | "version": "8.0.0", 1203 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1204 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1205 | }, 1206 | "node_modules/cliui/node_modules/string-width": { 1207 | "version": "4.2.3", 1208 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1209 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1210 | "dependencies": { 1211 | "emoji-regex": "^8.0.0", 1212 | "is-fullwidth-code-point": "^3.0.0", 1213 | "strip-ansi": "^6.0.1" 1214 | }, 1215 | "engines": { 1216 | "node": ">=8" 1217 | } 1218 | }, 1219 | "node_modules/cliui/node_modules/strip-ansi": { 1220 | "version": "6.0.1", 1221 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1222 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1223 | "dependencies": { 1224 | "ansi-regex": "^5.0.1" 1225 | }, 1226 | "engines": { 1227 | "node": ">=8" 1228 | } 1229 | }, 1230 | "node_modules/cliui/node_modules/wrap-ansi": { 1231 | "version": "7.0.0", 1232 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1233 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1234 | "dependencies": { 1235 | "ansi-styles": "^4.0.0", 1236 | "string-width": "^4.1.0", 1237 | "strip-ansi": "^6.0.0" 1238 | }, 1239 | "engines": { 1240 | "node": ">=10" 1241 | }, 1242 | "funding": { 1243 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1244 | } 1245 | }, 1246 | "node_modules/clone": { 1247 | "version": "2.1.2", 1248 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 1249 | "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", 1250 | "engines": { 1251 | "node": ">=0.8" 1252 | } 1253 | }, 1254 | "node_modules/color-convert": { 1255 | "version": "2.0.1", 1256 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1257 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1258 | "dependencies": { 1259 | "color-name": "~1.1.4" 1260 | }, 1261 | "engines": { 1262 | "node": ">=7.0.0" 1263 | } 1264 | }, 1265 | "node_modules/color-name": { 1266 | "version": "1.1.4", 1267 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1268 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1269 | }, 1270 | "node_modules/commander": { 1271 | "version": "4.1.1", 1272 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1273 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1274 | "dev": true, 1275 | "engines": { 1276 | "node": ">= 6" 1277 | } 1278 | }, 1279 | "node_modules/core-js": { 1280 | "version": "3.36.1", 1281 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", 1282 | "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", 1283 | "hasInstallScript": true, 1284 | "funding": { 1285 | "type": "opencollective", 1286 | "url": "https://opencollective.com/core-js" 1287 | } 1288 | }, 1289 | "node_modules/cross-fetch": { 1290 | "version": "3.1.8", 1291 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", 1292 | "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", 1293 | "dependencies": { 1294 | "node-fetch": "^2.6.12" 1295 | } 1296 | }, 1297 | "node_modules/cross-spawn": { 1298 | "version": "7.0.3", 1299 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1300 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1301 | "dev": true, 1302 | "dependencies": { 1303 | "path-key": "^3.1.0", 1304 | "shebang-command": "^2.0.0", 1305 | "which": "^2.0.1" 1306 | }, 1307 | "engines": { 1308 | "node": ">= 8" 1309 | } 1310 | }, 1311 | "node_modules/cssesc": { 1312 | "version": "3.0.0", 1313 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1314 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1315 | "dev": true, 1316 | "bin": { 1317 | "cssesc": "bin/cssesc" 1318 | }, 1319 | "engines": { 1320 | "node": ">=4" 1321 | } 1322 | }, 1323 | "node_modules/deep-equal": { 1324 | "version": "1.1.2", 1325 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", 1326 | "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", 1327 | "dependencies": { 1328 | "is-arguments": "^1.1.1", 1329 | "is-date-object": "^1.0.5", 1330 | "is-regex": "^1.1.4", 1331 | "object-is": "^1.1.5", 1332 | "object-keys": "^1.1.1", 1333 | "regexp.prototype.flags": "^1.5.1" 1334 | }, 1335 | "engines": { 1336 | "node": ">= 0.4" 1337 | }, 1338 | "funding": { 1339 | "url": "https://github.com/sponsors/ljharb" 1340 | } 1341 | }, 1342 | "node_modules/define-data-property": { 1343 | "version": "1.1.4", 1344 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 1345 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 1346 | "dependencies": { 1347 | "es-define-property": "^1.0.0", 1348 | "es-errors": "^1.3.0", 1349 | "gopd": "^1.0.1" 1350 | }, 1351 | "engines": { 1352 | "node": ">= 0.4" 1353 | }, 1354 | "funding": { 1355 | "url": "https://github.com/sponsors/ljharb" 1356 | } 1357 | }, 1358 | "node_modules/define-properties": { 1359 | "version": "1.2.1", 1360 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 1361 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 1362 | "dependencies": { 1363 | "define-data-property": "^1.0.1", 1364 | "has-property-descriptors": "^1.0.0", 1365 | "object-keys": "^1.1.1" 1366 | }, 1367 | "engines": { 1368 | "node": ">= 0.4" 1369 | }, 1370 | "funding": { 1371 | "url": "https://github.com/sponsors/ljharb" 1372 | } 1373 | }, 1374 | "node_modules/didyoumean": { 1375 | "version": "1.2.2", 1376 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1377 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1378 | "dev": true 1379 | }, 1380 | "node_modules/dlv": { 1381 | "version": "1.1.3", 1382 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1383 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1384 | "dev": true 1385 | }, 1386 | "node_modules/draft-convert": { 1387 | "version": "2.1.13", 1388 | "resolved": "https://registry.npmjs.org/draft-convert/-/draft-convert-2.1.13.tgz", 1389 | "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==", 1390 | "dependencies": { 1391 | "@babel/runtime": "^7.5.5", 1392 | "immutable": "~3.7.4", 1393 | "invariant": "^2.2.1" 1394 | }, 1395 | "peerDependencies": { 1396 | "draft-js": ">=0.7.0", 1397 | "react": "^15.0.2 || ^16.0.0-rc || ^16.0.0 || ^17.0.0 || ^18.0.0", 1398 | "react-dom": "^15.0.2 || ^16.0.0-rc || ^16.0.0 || ^17.0.0 || ^18.0.0" 1399 | } 1400 | }, 1401 | "node_modules/draft-js": { 1402 | "version": "0.11.7", 1403 | "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.7.tgz", 1404 | "integrity": "sha512-ne7yFfN4sEL82QPQEn80xnADR8/Q6ALVworbC5UOSzOvjffmYfFsr3xSZtxbIirti14R7Y33EZC5rivpLgIbsg==", 1405 | "dependencies": { 1406 | "fbjs": "^2.0.0", 1407 | "immutable": "~3.7.4", 1408 | "object-assign": "^4.1.1" 1409 | }, 1410 | "peerDependencies": { 1411 | "react": ">=0.14.0", 1412 | "react-dom": ">=0.14.0" 1413 | } 1414 | }, 1415 | "node_modules/draftjs-utils": { 1416 | "version": "0.10.2", 1417 | "resolved": "https://registry.npmjs.org/draftjs-utils/-/draftjs-utils-0.10.2.tgz", 1418 | "integrity": "sha512-EstHqr3R3JVcilJrBaO/A+01GvwwKmC7e4TCjC7S94ZeMh4IVmf60OuQXtHHpwItK8C2JCi3iljgN5KHkJboUg==", 1419 | "peerDependencies": { 1420 | "draft-js": "^0.11.x", 1421 | "immutable": "3.x.x || 4.x.x" 1422 | } 1423 | }, 1424 | "node_modules/eastasianwidth": { 1425 | "version": "0.2.0", 1426 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1427 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1428 | "dev": true 1429 | }, 1430 | "node_modules/electron-to-chromium": { 1431 | "version": "1.4.728", 1432 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.728.tgz", 1433 | "integrity": "sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw==", 1434 | "dev": true 1435 | }, 1436 | "node_modules/emoji-regex": { 1437 | "version": "9.2.2", 1438 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1439 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1440 | "dev": true 1441 | }, 1442 | "node_modules/es-define-property": { 1443 | "version": "1.0.0", 1444 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 1445 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 1446 | "dependencies": { 1447 | "get-intrinsic": "^1.2.4" 1448 | }, 1449 | "engines": { 1450 | "node": ">= 0.4" 1451 | } 1452 | }, 1453 | "node_modules/es-errors": { 1454 | "version": "1.3.0", 1455 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 1456 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 1457 | "engines": { 1458 | "node": ">= 0.4" 1459 | } 1460 | }, 1461 | "node_modules/escalade": { 1462 | "version": "3.1.2", 1463 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 1464 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 1465 | "engines": { 1466 | "node": ">=6" 1467 | } 1468 | }, 1469 | "node_modules/eventemitter3": { 1470 | "version": "2.0.3", 1471 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", 1472 | "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" 1473 | }, 1474 | "node_modules/extend": { 1475 | "version": "3.0.2", 1476 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1477 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1478 | }, 1479 | "node_modules/fast-diff": { 1480 | "version": "1.1.2", 1481 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", 1482 | "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" 1483 | }, 1484 | "node_modules/fast-glob": { 1485 | "version": "3.3.2", 1486 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1487 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1488 | "dev": true, 1489 | "dependencies": { 1490 | "@nodelib/fs.stat": "^2.0.2", 1491 | "@nodelib/fs.walk": "^1.2.3", 1492 | "glob-parent": "^5.1.2", 1493 | "merge2": "^1.3.0", 1494 | "micromatch": "^4.0.4" 1495 | }, 1496 | "engines": { 1497 | "node": ">=8.6.0" 1498 | } 1499 | }, 1500 | "node_modules/fast-glob/node_modules/glob-parent": { 1501 | "version": "5.1.2", 1502 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1503 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1504 | "dev": true, 1505 | "dependencies": { 1506 | "is-glob": "^4.0.1" 1507 | }, 1508 | "engines": { 1509 | "node": ">= 6" 1510 | } 1511 | }, 1512 | "node_modules/fastq": { 1513 | "version": "1.17.1", 1514 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1515 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1516 | "dev": true, 1517 | "dependencies": { 1518 | "reusify": "^1.0.4" 1519 | } 1520 | }, 1521 | "node_modules/faye-websocket": { 1522 | "version": "0.11.4", 1523 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", 1524 | "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", 1525 | "dependencies": { 1526 | "websocket-driver": ">=0.5.1" 1527 | }, 1528 | "engines": { 1529 | "node": ">=0.8.0" 1530 | } 1531 | }, 1532 | "node_modules/fbjs": { 1533 | "version": "2.0.0", 1534 | "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-2.0.0.tgz", 1535 | "integrity": "sha512-8XA8ny9ifxrAWlyhAbexXcs3rRMtxWcs3M0lctLfB49jRDHiaxj+Mo0XxbwE7nKZYzgCFoq64FS+WFd4IycPPQ==", 1536 | "dependencies": { 1537 | "core-js": "^3.6.4", 1538 | "cross-fetch": "^3.0.4", 1539 | "fbjs-css-vars": "^1.0.0", 1540 | "loose-envify": "^1.0.0", 1541 | "object-assign": "^4.1.0", 1542 | "promise": "^7.1.1", 1543 | "setimmediate": "^1.0.5", 1544 | "ua-parser-js": "^0.7.18" 1545 | } 1546 | }, 1547 | "node_modules/fbjs-css-vars": { 1548 | "version": "1.0.2", 1549 | "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", 1550 | "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" 1551 | }, 1552 | "node_modules/fill-range": { 1553 | "version": "7.0.1", 1554 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1555 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1556 | "dev": true, 1557 | "dependencies": { 1558 | "to-regex-range": "^5.0.1" 1559 | }, 1560 | "engines": { 1561 | "node": ">=8" 1562 | } 1563 | }, 1564 | "node_modules/firebase": { 1565 | "version": "10.10.0", 1566 | "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.10.0.tgz", 1567 | "integrity": "sha512-iJxnCKsBTYa4BSv8cscNbwciX42BvwoePTHg7iwWevb+GyVcZFmKi9eSkg/L7Jpu9mvAFv1jdDGbIaG3xRrE+w==", 1568 | "dependencies": { 1569 | "@firebase/analytics": "0.10.2", 1570 | "@firebase/analytics-compat": "0.2.8", 1571 | "@firebase/app": "0.10.0", 1572 | "@firebase/app-check": "0.8.3", 1573 | "@firebase/app-check-compat": "0.3.10", 1574 | "@firebase/app-compat": "0.2.30", 1575 | "@firebase/app-types": "0.9.1", 1576 | "@firebase/auth": "1.7.0", 1577 | "@firebase/auth-compat": "0.5.5", 1578 | "@firebase/database": "1.0.4", 1579 | "@firebase/database-compat": "1.0.4", 1580 | "@firebase/firestore": "4.5.1", 1581 | "@firebase/firestore-compat": "0.3.28", 1582 | "@firebase/functions": "0.11.3", 1583 | "@firebase/functions-compat": "0.3.9", 1584 | "@firebase/installations": "0.6.6", 1585 | "@firebase/installations-compat": "0.2.6", 1586 | "@firebase/messaging": "0.12.7", 1587 | "@firebase/messaging-compat": "0.2.7", 1588 | "@firebase/performance": "0.6.6", 1589 | "@firebase/performance-compat": "0.2.6", 1590 | "@firebase/remote-config": "0.4.6", 1591 | "@firebase/remote-config-compat": "0.2.6", 1592 | "@firebase/storage": "0.12.3", 1593 | "@firebase/storage-compat": "0.3.6", 1594 | "@firebase/util": "1.9.5" 1595 | } 1596 | }, 1597 | "node_modules/foreground-child": { 1598 | "version": "3.1.1", 1599 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 1600 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 1601 | "dev": true, 1602 | "dependencies": { 1603 | "cross-spawn": "^7.0.0", 1604 | "signal-exit": "^4.0.1" 1605 | }, 1606 | "engines": { 1607 | "node": ">=14" 1608 | }, 1609 | "funding": { 1610 | "url": "https://github.com/sponsors/isaacs" 1611 | } 1612 | }, 1613 | "node_modules/fraction.js": { 1614 | "version": "4.3.7", 1615 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 1616 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 1617 | "dev": true, 1618 | "engines": { 1619 | "node": "*" 1620 | }, 1621 | "funding": { 1622 | "type": "patreon", 1623 | "url": "https://github.com/sponsors/rawify" 1624 | } 1625 | }, 1626 | "node_modules/fsevents": { 1627 | "version": "2.3.3", 1628 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1629 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1630 | "dev": true, 1631 | "hasInstallScript": true, 1632 | "optional": true, 1633 | "os": [ 1634 | "darwin" 1635 | ], 1636 | "engines": { 1637 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1638 | } 1639 | }, 1640 | "node_modules/function-bind": { 1641 | "version": "1.1.2", 1642 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1643 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1644 | "funding": { 1645 | "url": "https://github.com/sponsors/ljharb" 1646 | } 1647 | }, 1648 | "node_modules/functions-have-names": { 1649 | "version": "1.2.3", 1650 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 1651 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 1652 | "funding": { 1653 | "url": "https://github.com/sponsors/ljharb" 1654 | } 1655 | }, 1656 | "node_modules/get-caller-file": { 1657 | "version": "2.0.5", 1658 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1659 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1660 | "engines": { 1661 | "node": "6.* || 8.* || >= 10.*" 1662 | } 1663 | }, 1664 | "node_modules/get-intrinsic": { 1665 | "version": "1.2.4", 1666 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 1667 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 1668 | "dependencies": { 1669 | "es-errors": "^1.3.0", 1670 | "function-bind": "^1.1.2", 1671 | "has-proto": "^1.0.1", 1672 | "has-symbols": "^1.0.3", 1673 | "hasown": "^2.0.0" 1674 | }, 1675 | "engines": { 1676 | "node": ">= 0.4" 1677 | }, 1678 | "funding": { 1679 | "url": "https://github.com/sponsors/ljharb" 1680 | } 1681 | }, 1682 | "node_modules/glob": { 1683 | "version": "10.3.12", 1684 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", 1685 | "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", 1686 | "dev": true, 1687 | "dependencies": { 1688 | "foreground-child": "^3.1.0", 1689 | "jackspeak": "^2.3.6", 1690 | "minimatch": "^9.0.1", 1691 | "minipass": "^7.0.4", 1692 | "path-scurry": "^1.10.2" 1693 | }, 1694 | "bin": { 1695 | "glob": "dist/esm/bin.mjs" 1696 | }, 1697 | "engines": { 1698 | "node": ">=16 || 14 >=14.17" 1699 | }, 1700 | "funding": { 1701 | "url": "https://github.com/sponsors/isaacs" 1702 | } 1703 | }, 1704 | "node_modules/glob-parent": { 1705 | "version": "6.0.2", 1706 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1707 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1708 | "dev": true, 1709 | "dependencies": { 1710 | "is-glob": "^4.0.3" 1711 | }, 1712 | "engines": { 1713 | "node": ">=10.13.0" 1714 | } 1715 | }, 1716 | "node_modules/gopd": { 1717 | "version": "1.0.1", 1718 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1719 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1720 | "dependencies": { 1721 | "get-intrinsic": "^1.1.3" 1722 | }, 1723 | "funding": { 1724 | "url": "https://github.com/sponsors/ljharb" 1725 | } 1726 | }, 1727 | "node_modules/graceful-fs": { 1728 | "version": "4.2.11", 1729 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1730 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 1731 | }, 1732 | "node_modules/has-property-descriptors": { 1733 | "version": "1.0.2", 1734 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1735 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1736 | "dependencies": { 1737 | "es-define-property": "^1.0.0" 1738 | }, 1739 | "funding": { 1740 | "url": "https://github.com/sponsors/ljharb" 1741 | } 1742 | }, 1743 | "node_modules/has-proto": { 1744 | "version": "1.0.3", 1745 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1746 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1747 | "engines": { 1748 | "node": ">= 0.4" 1749 | }, 1750 | "funding": { 1751 | "url": "https://github.com/sponsors/ljharb" 1752 | } 1753 | }, 1754 | "node_modules/has-symbols": { 1755 | "version": "1.0.3", 1756 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1757 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1758 | "engines": { 1759 | "node": ">= 0.4" 1760 | }, 1761 | "funding": { 1762 | "url": "https://github.com/sponsors/ljharb" 1763 | } 1764 | }, 1765 | "node_modules/has-tostringtag": { 1766 | "version": "1.0.2", 1767 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 1768 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 1769 | "dependencies": { 1770 | "has-symbols": "^1.0.3" 1771 | }, 1772 | "engines": { 1773 | "node": ">= 0.4" 1774 | }, 1775 | "funding": { 1776 | "url": "https://github.com/sponsors/ljharb" 1777 | } 1778 | }, 1779 | "node_modules/hasown": { 1780 | "version": "2.0.2", 1781 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1782 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1783 | "dependencies": { 1784 | "function-bind": "^1.1.2" 1785 | }, 1786 | "engines": { 1787 | "node": ">= 0.4" 1788 | } 1789 | }, 1790 | "node_modules/html-to-draftjs": { 1791 | "version": "1.5.0", 1792 | "resolved": "https://registry.npmjs.org/html-to-draftjs/-/html-to-draftjs-1.5.0.tgz", 1793 | "integrity": "sha512-kggLXBNciKDwKf+KYsuE+V5gw4dZ7nHyGMX9m0wy7urzWjKGWyNFetmArRLvRV0VrxKN70WylFsJvMTJx02OBQ==", 1794 | "peerDependencies": { 1795 | "draft-js": "^0.10.x || ^0.11.x", 1796 | "immutable": "3.x.x || 4.x.x" 1797 | } 1798 | }, 1799 | "node_modules/http-parser-js": { 1800 | "version": "0.5.8", 1801 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", 1802 | "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" 1803 | }, 1804 | "node_modules/idb": { 1805 | "version": "7.1.1", 1806 | "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", 1807 | "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" 1808 | }, 1809 | "node_modules/immutable": { 1810 | "version": "3.7.6", 1811 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", 1812 | "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", 1813 | "engines": { 1814 | "node": ">=0.8.0" 1815 | } 1816 | }, 1817 | "node_modules/invariant": { 1818 | "version": "2.2.4", 1819 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1820 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1821 | "dependencies": { 1822 | "loose-envify": "^1.0.0" 1823 | } 1824 | }, 1825 | "node_modules/is-arguments": { 1826 | "version": "1.1.1", 1827 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1828 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1829 | "dependencies": { 1830 | "call-bind": "^1.0.2", 1831 | "has-tostringtag": "^1.0.0" 1832 | }, 1833 | "engines": { 1834 | "node": ">= 0.4" 1835 | }, 1836 | "funding": { 1837 | "url": "https://github.com/sponsors/ljharb" 1838 | } 1839 | }, 1840 | "node_modules/is-binary-path": { 1841 | "version": "2.1.0", 1842 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1843 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1844 | "dev": true, 1845 | "dependencies": { 1846 | "binary-extensions": "^2.0.0" 1847 | }, 1848 | "engines": { 1849 | "node": ">=8" 1850 | } 1851 | }, 1852 | "node_modules/is-core-module": { 1853 | "version": "2.13.1", 1854 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1855 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1856 | "dev": true, 1857 | "dependencies": { 1858 | "hasown": "^2.0.0" 1859 | }, 1860 | "funding": { 1861 | "url": "https://github.com/sponsors/ljharb" 1862 | } 1863 | }, 1864 | "node_modules/is-date-object": { 1865 | "version": "1.0.5", 1866 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1867 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1868 | "dependencies": { 1869 | "has-tostringtag": "^1.0.0" 1870 | }, 1871 | "engines": { 1872 | "node": ">= 0.4" 1873 | }, 1874 | "funding": { 1875 | "url": "https://github.com/sponsors/ljharb" 1876 | } 1877 | }, 1878 | "node_modules/is-extglob": { 1879 | "version": "2.1.1", 1880 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1881 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1882 | "dev": true, 1883 | "engines": { 1884 | "node": ">=0.10.0" 1885 | } 1886 | }, 1887 | "node_modules/is-fullwidth-code-point": { 1888 | "version": "3.0.0", 1889 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1890 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1891 | "engines": { 1892 | "node": ">=8" 1893 | } 1894 | }, 1895 | "node_modules/is-glob": { 1896 | "version": "4.0.3", 1897 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1898 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1899 | "dev": true, 1900 | "dependencies": { 1901 | "is-extglob": "^2.1.1" 1902 | }, 1903 | "engines": { 1904 | "node": ">=0.10.0" 1905 | } 1906 | }, 1907 | "node_modules/is-number": { 1908 | "version": "7.0.0", 1909 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1910 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1911 | "dev": true, 1912 | "engines": { 1913 | "node": ">=0.12.0" 1914 | } 1915 | }, 1916 | "node_modules/is-regex": { 1917 | "version": "1.1.4", 1918 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1919 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1920 | "dependencies": { 1921 | "call-bind": "^1.0.2", 1922 | "has-tostringtag": "^1.0.0" 1923 | }, 1924 | "engines": { 1925 | "node": ">= 0.4" 1926 | }, 1927 | "funding": { 1928 | "url": "https://github.com/sponsors/ljharb" 1929 | } 1930 | }, 1931 | "node_modules/isexe": { 1932 | "version": "2.0.0", 1933 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1934 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1935 | "dev": true 1936 | }, 1937 | "node_modules/jackspeak": { 1938 | "version": "2.3.6", 1939 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", 1940 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", 1941 | "dev": true, 1942 | "dependencies": { 1943 | "@isaacs/cliui": "^8.0.2" 1944 | }, 1945 | "engines": { 1946 | "node": ">=14" 1947 | }, 1948 | "funding": { 1949 | "url": "https://github.com/sponsors/isaacs" 1950 | }, 1951 | "optionalDependencies": { 1952 | "@pkgjs/parseargs": "^0.11.0" 1953 | } 1954 | }, 1955 | "node_modules/jiti": { 1956 | "version": "1.21.0", 1957 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", 1958 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", 1959 | "dev": true, 1960 | "bin": { 1961 | "jiti": "bin/jiti.js" 1962 | } 1963 | }, 1964 | "node_modules/js-tokens": { 1965 | "version": "4.0.0", 1966 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1967 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1968 | }, 1969 | "node_modules/lilconfig": { 1970 | "version": "2.1.0", 1971 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 1972 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 1973 | "dev": true, 1974 | "engines": { 1975 | "node": ">=10" 1976 | } 1977 | }, 1978 | "node_modules/lines-and-columns": { 1979 | "version": "1.2.4", 1980 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1981 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1982 | "dev": true 1983 | }, 1984 | "node_modules/linkify-it": { 1985 | "version": "2.2.0", 1986 | "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", 1987 | "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", 1988 | "dependencies": { 1989 | "uc.micro": "^1.0.1" 1990 | } 1991 | }, 1992 | "node_modules/lodash": { 1993 | "version": "4.17.21", 1994 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1995 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1996 | }, 1997 | "node_modules/lodash.camelcase": { 1998 | "version": "4.3.0", 1999 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 2000 | "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" 2001 | }, 2002 | "node_modules/long": { 2003 | "version": "5.2.3", 2004 | "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", 2005 | "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" 2006 | }, 2007 | "node_modules/loose-envify": { 2008 | "version": "1.4.0", 2009 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2010 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2011 | "dependencies": { 2012 | "js-tokens": "^3.0.0 || ^4.0.0" 2013 | }, 2014 | "bin": { 2015 | "loose-envify": "cli.js" 2016 | } 2017 | }, 2018 | "node_modules/lru-cache": { 2019 | "version": "10.2.0", 2020 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", 2021 | "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", 2022 | "dev": true, 2023 | "engines": { 2024 | "node": "14 || >=16.14" 2025 | } 2026 | }, 2027 | "node_modules/lucide-react": { 2028 | "version": "0.365.0", 2029 | "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.365.0.tgz", 2030 | "integrity": "sha512-sJYpPyyzGHI4B3pys+XSFnE4qtSWc68rFnDLxbNNKjkLST5XSx9DNn5+1Z3eFgFiw39PphNRiVBSVb+AL3oKwA==", 2031 | "peerDependencies": { 2032 | "react": "^16.5.1 || ^17.0.0 || ^18.0.0" 2033 | } 2034 | }, 2035 | "node_modules/merge2": { 2036 | "version": "1.4.1", 2037 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2038 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2039 | "dev": true, 2040 | "engines": { 2041 | "node": ">= 8" 2042 | } 2043 | }, 2044 | "node_modules/micromatch": { 2045 | "version": "4.0.5", 2046 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2047 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2048 | "dev": true, 2049 | "dependencies": { 2050 | "braces": "^3.0.2", 2051 | "picomatch": "^2.3.1" 2052 | }, 2053 | "engines": { 2054 | "node": ">=8.6" 2055 | } 2056 | }, 2057 | "node_modules/minimatch": { 2058 | "version": "9.0.4", 2059 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", 2060 | "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", 2061 | "dev": true, 2062 | "dependencies": { 2063 | "brace-expansion": "^2.0.1" 2064 | }, 2065 | "engines": { 2066 | "node": ">=16 || 14 >=14.17" 2067 | }, 2068 | "funding": { 2069 | "url": "https://github.com/sponsors/isaacs" 2070 | } 2071 | }, 2072 | "node_modules/minipass": { 2073 | "version": "7.0.4", 2074 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", 2075 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", 2076 | "dev": true, 2077 | "engines": { 2078 | "node": ">=16 || 14 >=14.17" 2079 | } 2080 | }, 2081 | "node_modules/mz": { 2082 | "version": "2.7.0", 2083 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 2084 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 2085 | "dev": true, 2086 | "dependencies": { 2087 | "any-promise": "^1.0.0", 2088 | "object-assign": "^4.0.1", 2089 | "thenify-all": "^1.0.0" 2090 | } 2091 | }, 2092 | "node_modules/nanoid": { 2093 | "version": "3.3.7", 2094 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2095 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2096 | "funding": [ 2097 | { 2098 | "type": "github", 2099 | "url": "https://github.com/sponsors/ai" 2100 | } 2101 | ], 2102 | "bin": { 2103 | "nanoid": "bin/nanoid.cjs" 2104 | }, 2105 | "engines": { 2106 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2107 | } 2108 | }, 2109 | "node_modules/next": { 2110 | "version": "14.1.4", 2111 | "resolved": "https://registry.npmjs.org/next/-/next-14.1.4.tgz", 2112 | "integrity": "sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==", 2113 | "dependencies": { 2114 | "@next/env": "14.1.4", 2115 | "@swc/helpers": "0.5.2", 2116 | "busboy": "1.6.0", 2117 | "caniuse-lite": "^1.0.30001579", 2118 | "graceful-fs": "^4.2.11", 2119 | "postcss": "8.4.31", 2120 | "styled-jsx": "5.1.1" 2121 | }, 2122 | "bin": { 2123 | "next": "dist/bin/next" 2124 | }, 2125 | "engines": { 2126 | "node": ">=18.17.0" 2127 | }, 2128 | "optionalDependencies": { 2129 | "@next/swc-darwin-arm64": "14.1.4", 2130 | "@next/swc-darwin-x64": "14.1.4", 2131 | "@next/swc-linux-arm64-gnu": "14.1.4", 2132 | "@next/swc-linux-arm64-musl": "14.1.4", 2133 | "@next/swc-linux-x64-gnu": "14.1.4", 2134 | "@next/swc-linux-x64-musl": "14.1.4", 2135 | "@next/swc-win32-arm64-msvc": "14.1.4", 2136 | "@next/swc-win32-ia32-msvc": "14.1.4", 2137 | "@next/swc-win32-x64-msvc": "14.1.4" 2138 | }, 2139 | "peerDependencies": { 2140 | "@opentelemetry/api": "^1.1.0", 2141 | "react": "^18.2.0", 2142 | "react-dom": "^18.2.0", 2143 | "sass": "^1.3.0" 2144 | }, 2145 | "peerDependenciesMeta": { 2146 | "@opentelemetry/api": { 2147 | "optional": true 2148 | }, 2149 | "sass": { 2150 | "optional": true 2151 | } 2152 | } 2153 | }, 2154 | "node_modules/next/node_modules/postcss": { 2155 | "version": "8.4.31", 2156 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 2157 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 2158 | "funding": [ 2159 | { 2160 | "type": "opencollective", 2161 | "url": "https://opencollective.com/postcss/" 2162 | }, 2163 | { 2164 | "type": "tidelift", 2165 | "url": "https://tidelift.com/funding/github/npm/postcss" 2166 | }, 2167 | { 2168 | "type": "github", 2169 | "url": "https://github.com/sponsors/ai" 2170 | } 2171 | ], 2172 | "dependencies": { 2173 | "nanoid": "^3.3.6", 2174 | "picocolors": "^1.0.0", 2175 | "source-map-js": "^1.0.2" 2176 | }, 2177 | "engines": { 2178 | "node": "^10 || ^12 || >=14" 2179 | } 2180 | }, 2181 | "node_modules/node-fetch": { 2182 | "version": "2.7.0", 2183 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 2184 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 2185 | "dependencies": { 2186 | "whatwg-url": "^5.0.0" 2187 | }, 2188 | "engines": { 2189 | "node": "4.x || >=6.0.0" 2190 | }, 2191 | "peerDependencies": { 2192 | "encoding": "^0.1.0" 2193 | }, 2194 | "peerDependenciesMeta": { 2195 | "encoding": { 2196 | "optional": true 2197 | } 2198 | } 2199 | }, 2200 | "node_modules/node-releases": { 2201 | "version": "2.0.14", 2202 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", 2203 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", 2204 | "dev": true 2205 | }, 2206 | "node_modules/normalize-path": { 2207 | "version": "3.0.0", 2208 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2209 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2210 | "dev": true, 2211 | "engines": { 2212 | "node": ">=0.10.0" 2213 | } 2214 | }, 2215 | "node_modules/normalize-range": { 2216 | "version": "0.1.2", 2217 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 2218 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 2219 | "dev": true, 2220 | "engines": { 2221 | "node": ">=0.10.0" 2222 | } 2223 | }, 2224 | "node_modules/object-assign": { 2225 | "version": "4.1.1", 2226 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2227 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2228 | "engines": { 2229 | "node": ">=0.10.0" 2230 | } 2231 | }, 2232 | "node_modules/object-hash": { 2233 | "version": "3.0.0", 2234 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2235 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 2236 | "dev": true, 2237 | "engines": { 2238 | "node": ">= 6" 2239 | } 2240 | }, 2241 | "node_modules/object-is": { 2242 | "version": "1.1.6", 2243 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", 2244 | "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", 2245 | "dependencies": { 2246 | "call-bind": "^1.0.7", 2247 | "define-properties": "^1.2.1" 2248 | }, 2249 | "engines": { 2250 | "node": ">= 0.4" 2251 | }, 2252 | "funding": { 2253 | "url": "https://github.com/sponsors/ljharb" 2254 | } 2255 | }, 2256 | "node_modules/object-keys": { 2257 | "version": "1.1.1", 2258 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2259 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2260 | "engines": { 2261 | "node": ">= 0.4" 2262 | } 2263 | }, 2264 | "node_modules/parchment": { 2265 | "version": "1.1.4", 2266 | "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", 2267 | "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" 2268 | }, 2269 | "node_modules/path-key": { 2270 | "version": "3.1.1", 2271 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2272 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2273 | "dev": true, 2274 | "engines": { 2275 | "node": ">=8" 2276 | } 2277 | }, 2278 | "node_modules/path-parse": { 2279 | "version": "1.0.7", 2280 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2281 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2282 | "dev": true 2283 | }, 2284 | "node_modules/path-scurry": { 2285 | "version": "1.10.2", 2286 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", 2287 | "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", 2288 | "dev": true, 2289 | "dependencies": { 2290 | "lru-cache": "^10.2.0", 2291 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2292 | }, 2293 | "engines": { 2294 | "node": ">=16 || 14 >=14.17" 2295 | }, 2296 | "funding": { 2297 | "url": "https://github.com/sponsors/isaacs" 2298 | } 2299 | }, 2300 | "node_modules/picocolors": { 2301 | "version": "1.0.0", 2302 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2303 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 2304 | }, 2305 | "node_modules/picomatch": { 2306 | "version": "2.3.1", 2307 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2308 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2309 | "dev": true, 2310 | "engines": { 2311 | "node": ">=8.6" 2312 | }, 2313 | "funding": { 2314 | "url": "https://github.com/sponsors/jonschlinkert" 2315 | } 2316 | }, 2317 | "node_modules/pify": { 2318 | "version": "2.3.0", 2319 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2320 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2321 | "dev": true, 2322 | "engines": { 2323 | "node": ">=0.10.0" 2324 | } 2325 | }, 2326 | "node_modules/pirates": { 2327 | "version": "4.0.6", 2328 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 2329 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 2330 | "dev": true, 2331 | "engines": { 2332 | "node": ">= 6" 2333 | } 2334 | }, 2335 | "node_modules/postcss": { 2336 | "version": "8.4.38", 2337 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 2338 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 2339 | "dev": true, 2340 | "funding": [ 2341 | { 2342 | "type": "opencollective", 2343 | "url": "https://opencollective.com/postcss/" 2344 | }, 2345 | { 2346 | "type": "tidelift", 2347 | "url": "https://tidelift.com/funding/github/npm/postcss" 2348 | }, 2349 | { 2350 | "type": "github", 2351 | "url": "https://github.com/sponsors/ai" 2352 | } 2353 | ], 2354 | "dependencies": { 2355 | "nanoid": "^3.3.7", 2356 | "picocolors": "^1.0.0", 2357 | "source-map-js": "^1.2.0" 2358 | }, 2359 | "engines": { 2360 | "node": "^10 || ^12 || >=14" 2361 | } 2362 | }, 2363 | "node_modules/postcss-import": { 2364 | "version": "15.1.0", 2365 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 2366 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 2367 | "dev": true, 2368 | "dependencies": { 2369 | "postcss-value-parser": "^4.0.0", 2370 | "read-cache": "^1.0.0", 2371 | "resolve": "^1.1.7" 2372 | }, 2373 | "engines": { 2374 | "node": ">=14.0.0" 2375 | }, 2376 | "peerDependencies": { 2377 | "postcss": "^8.0.0" 2378 | } 2379 | }, 2380 | "node_modules/postcss-js": { 2381 | "version": "4.0.1", 2382 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 2383 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 2384 | "dev": true, 2385 | "dependencies": { 2386 | "camelcase-css": "^2.0.1" 2387 | }, 2388 | "engines": { 2389 | "node": "^12 || ^14 || >= 16" 2390 | }, 2391 | "funding": { 2392 | "type": "opencollective", 2393 | "url": "https://opencollective.com/postcss/" 2394 | }, 2395 | "peerDependencies": { 2396 | "postcss": "^8.4.21" 2397 | } 2398 | }, 2399 | "node_modules/postcss-load-config": { 2400 | "version": "4.0.2", 2401 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 2402 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 2403 | "dev": true, 2404 | "funding": [ 2405 | { 2406 | "type": "opencollective", 2407 | "url": "https://opencollective.com/postcss/" 2408 | }, 2409 | { 2410 | "type": "github", 2411 | "url": "https://github.com/sponsors/ai" 2412 | } 2413 | ], 2414 | "dependencies": { 2415 | "lilconfig": "^3.0.0", 2416 | "yaml": "^2.3.4" 2417 | }, 2418 | "engines": { 2419 | "node": ">= 14" 2420 | }, 2421 | "peerDependencies": { 2422 | "postcss": ">=8.0.9", 2423 | "ts-node": ">=9.0.0" 2424 | }, 2425 | "peerDependenciesMeta": { 2426 | "postcss": { 2427 | "optional": true 2428 | }, 2429 | "ts-node": { 2430 | "optional": true 2431 | } 2432 | } 2433 | }, 2434 | "node_modules/postcss-load-config/node_modules/lilconfig": { 2435 | "version": "3.1.1", 2436 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", 2437 | "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", 2438 | "dev": true, 2439 | "engines": { 2440 | "node": ">=14" 2441 | }, 2442 | "funding": { 2443 | "url": "https://github.com/sponsors/antonk52" 2444 | } 2445 | }, 2446 | "node_modules/postcss-nested": { 2447 | "version": "6.0.1", 2448 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", 2449 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", 2450 | "dev": true, 2451 | "dependencies": { 2452 | "postcss-selector-parser": "^6.0.11" 2453 | }, 2454 | "engines": { 2455 | "node": ">=12.0" 2456 | }, 2457 | "funding": { 2458 | "type": "opencollective", 2459 | "url": "https://opencollective.com/postcss/" 2460 | }, 2461 | "peerDependencies": { 2462 | "postcss": "^8.2.14" 2463 | } 2464 | }, 2465 | "node_modules/postcss-selector-parser": { 2466 | "version": "6.0.16", 2467 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", 2468 | "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", 2469 | "dev": true, 2470 | "dependencies": { 2471 | "cssesc": "^3.0.0", 2472 | "util-deprecate": "^1.0.2" 2473 | }, 2474 | "engines": { 2475 | "node": ">=4" 2476 | } 2477 | }, 2478 | "node_modules/postcss-value-parser": { 2479 | "version": "4.2.0", 2480 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 2481 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 2482 | "dev": true 2483 | }, 2484 | "node_modules/promise": { 2485 | "version": "7.3.1", 2486 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 2487 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 2488 | "dependencies": { 2489 | "asap": "~2.0.3" 2490 | } 2491 | }, 2492 | "node_modules/prop-types": { 2493 | "version": "15.8.1", 2494 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 2495 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 2496 | "dependencies": { 2497 | "loose-envify": "^1.4.0", 2498 | "object-assign": "^4.1.1", 2499 | "react-is": "^16.13.1" 2500 | } 2501 | }, 2502 | "node_modules/protobufjs": { 2503 | "version": "7.2.6", 2504 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", 2505 | "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", 2506 | "hasInstallScript": true, 2507 | "dependencies": { 2508 | "@protobufjs/aspromise": "^1.1.2", 2509 | "@protobufjs/base64": "^1.1.2", 2510 | "@protobufjs/codegen": "^2.0.4", 2511 | "@protobufjs/eventemitter": "^1.1.0", 2512 | "@protobufjs/fetch": "^1.1.0", 2513 | "@protobufjs/float": "^1.0.2", 2514 | "@protobufjs/inquire": "^1.1.0", 2515 | "@protobufjs/path": "^1.1.2", 2516 | "@protobufjs/pool": "^1.1.0", 2517 | "@protobufjs/utf8": "^1.1.0", 2518 | "@types/node": ">=13.7.0", 2519 | "long": "^5.0.0" 2520 | }, 2521 | "engines": { 2522 | "node": ">=12.0.0" 2523 | } 2524 | }, 2525 | "node_modules/queue-microtask": { 2526 | "version": "1.2.3", 2527 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2528 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2529 | "dev": true, 2530 | "funding": [ 2531 | { 2532 | "type": "github", 2533 | "url": "https://github.com/sponsors/feross" 2534 | }, 2535 | { 2536 | "type": "patreon", 2537 | "url": "https://www.patreon.com/feross" 2538 | }, 2539 | { 2540 | "type": "consulting", 2541 | "url": "https://feross.org/support" 2542 | } 2543 | ] 2544 | }, 2545 | "node_modules/quill": { 2546 | "version": "1.3.7", 2547 | "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", 2548 | "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", 2549 | "dependencies": { 2550 | "clone": "^2.1.1", 2551 | "deep-equal": "^1.0.1", 2552 | "eventemitter3": "^2.0.3", 2553 | "extend": "^3.0.2", 2554 | "parchment": "^1.1.4", 2555 | "quill-delta": "^3.6.2" 2556 | } 2557 | }, 2558 | "node_modules/quill-delta": { 2559 | "version": "3.6.3", 2560 | "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", 2561 | "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", 2562 | "dependencies": { 2563 | "deep-equal": "^1.0.1", 2564 | "extend": "^3.0.2", 2565 | "fast-diff": "1.1.2" 2566 | }, 2567 | "engines": { 2568 | "node": ">=0.10" 2569 | } 2570 | }, 2571 | "node_modules/react": { 2572 | "version": "18.2.0", 2573 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 2574 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 2575 | "dependencies": { 2576 | "loose-envify": "^1.1.0" 2577 | }, 2578 | "engines": { 2579 | "node": ">=0.10.0" 2580 | } 2581 | }, 2582 | "node_modules/react-dom": { 2583 | "version": "18.2.0", 2584 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 2585 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 2586 | "dependencies": { 2587 | "loose-envify": "^1.1.0", 2588 | "scheduler": "^0.23.0" 2589 | }, 2590 | "peerDependencies": { 2591 | "react": "^18.2.0" 2592 | } 2593 | }, 2594 | "node_modules/react-draft-wysiwyg": { 2595 | "version": "1.15.0", 2596 | "resolved": "https://registry.npmjs.org/react-draft-wysiwyg/-/react-draft-wysiwyg-1.15.0.tgz", 2597 | "integrity": "sha512-p1cYZcWc6/ALFBVksbFoCM3b29fGQDlZLIMrXng0TU/UElxIOF2/AWWo4L5auIYVhmqKTZ0NkNjnXOzGGuxyeA==", 2598 | "dependencies": { 2599 | "classnames": "^2.2.6", 2600 | "draftjs-utils": "^0.10.2", 2601 | "html-to-draftjs": "^1.5.0", 2602 | "linkify-it": "^2.2.0", 2603 | "prop-types": "^15.7.2" 2604 | }, 2605 | "peerDependencies": { 2606 | "draft-js": "^0.10.x || ^0.11.x", 2607 | "immutable": "3.x.x || 4.x.x", 2608 | "react": "0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x || ^18.x.x", 2609 | "react-dom": "0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x || ^18.x.x" 2610 | } 2611 | }, 2612 | "node_modules/react-is": { 2613 | "version": "16.13.1", 2614 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2615 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 2616 | }, 2617 | "node_modules/react-quill": { 2618 | "version": "2.0.0", 2619 | "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", 2620 | "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", 2621 | "dependencies": { 2622 | "@types/quill": "^1.3.10", 2623 | "lodash": "^4.17.4", 2624 | "quill": "^1.3.7" 2625 | }, 2626 | "peerDependencies": { 2627 | "react": "^16 || ^17 || ^18", 2628 | "react-dom": "^16 || ^17 || ^18" 2629 | } 2630 | }, 2631 | "node_modules/read-cache": { 2632 | "version": "1.0.0", 2633 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 2634 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 2635 | "dev": true, 2636 | "dependencies": { 2637 | "pify": "^2.3.0" 2638 | } 2639 | }, 2640 | "node_modules/readdirp": { 2641 | "version": "3.6.0", 2642 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2643 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2644 | "dev": true, 2645 | "dependencies": { 2646 | "picomatch": "^2.2.1" 2647 | }, 2648 | "engines": { 2649 | "node": ">=8.10.0" 2650 | } 2651 | }, 2652 | "node_modules/regenerator-runtime": { 2653 | "version": "0.14.1", 2654 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 2655 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" 2656 | }, 2657 | "node_modules/regexp.prototype.flags": { 2658 | "version": "1.5.2", 2659 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", 2660 | "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", 2661 | "dependencies": { 2662 | "call-bind": "^1.0.6", 2663 | "define-properties": "^1.2.1", 2664 | "es-errors": "^1.3.0", 2665 | "set-function-name": "^2.0.1" 2666 | }, 2667 | "engines": { 2668 | "node": ">= 0.4" 2669 | }, 2670 | "funding": { 2671 | "url": "https://github.com/sponsors/ljharb" 2672 | } 2673 | }, 2674 | "node_modules/require-directory": { 2675 | "version": "2.1.1", 2676 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2677 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2678 | "engines": { 2679 | "node": ">=0.10.0" 2680 | } 2681 | }, 2682 | "node_modules/resolve": { 2683 | "version": "1.22.8", 2684 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 2685 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 2686 | "dev": true, 2687 | "dependencies": { 2688 | "is-core-module": "^2.13.0", 2689 | "path-parse": "^1.0.7", 2690 | "supports-preserve-symlinks-flag": "^1.0.0" 2691 | }, 2692 | "bin": { 2693 | "resolve": "bin/resolve" 2694 | }, 2695 | "funding": { 2696 | "url": "https://github.com/sponsors/ljharb" 2697 | } 2698 | }, 2699 | "node_modules/reusify": { 2700 | "version": "1.0.4", 2701 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2702 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2703 | "dev": true, 2704 | "engines": { 2705 | "iojs": ">=1.0.0", 2706 | "node": ">=0.10.0" 2707 | } 2708 | }, 2709 | "node_modules/run-parallel": { 2710 | "version": "1.2.0", 2711 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2712 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2713 | "dev": true, 2714 | "funding": [ 2715 | { 2716 | "type": "github", 2717 | "url": "https://github.com/sponsors/feross" 2718 | }, 2719 | { 2720 | "type": "patreon", 2721 | "url": "https://www.patreon.com/feross" 2722 | }, 2723 | { 2724 | "type": "consulting", 2725 | "url": "https://feross.org/support" 2726 | } 2727 | ], 2728 | "dependencies": { 2729 | "queue-microtask": "^1.2.2" 2730 | } 2731 | }, 2732 | "node_modules/safe-buffer": { 2733 | "version": "5.2.1", 2734 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2735 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2736 | "funding": [ 2737 | { 2738 | "type": "github", 2739 | "url": "https://github.com/sponsors/feross" 2740 | }, 2741 | { 2742 | "type": "patreon", 2743 | "url": "https://www.patreon.com/feross" 2744 | }, 2745 | { 2746 | "type": "consulting", 2747 | "url": "https://feross.org/support" 2748 | } 2749 | ] 2750 | }, 2751 | "node_modules/scheduler": { 2752 | "version": "0.23.0", 2753 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 2754 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 2755 | "dependencies": { 2756 | "loose-envify": "^1.1.0" 2757 | } 2758 | }, 2759 | "node_modules/set-function-length": { 2760 | "version": "1.2.2", 2761 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 2762 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 2763 | "dependencies": { 2764 | "define-data-property": "^1.1.4", 2765 | "es-errors": "^1.3.0", 2766 | "function-bind": "^1.1.2", 2767 | "get-intrinsic": "^1.2.4", 2768 | "gopd": "^1.0.1", 2769 | "has-property-descriptors": "^1.0.2" 2770 | }, 2771 | "engines": { 2772 | "node": ">= 0.4" 2773 | } 2774 | }, 2775 | "node_modules/set-function-name": { 2776 | "version": "2.0.2", 2777 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 2778 | "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 2779 | "dependencies": { 2780 | "define-data-property": "^1.1.4", 2781 | "es-errors": "^1.3.0", 2782 | "functions-have-names": "^1.2.3", 2783 | "has-property-descriptors": "^1.0.2" 2784 | }, 2785 | "engines": { 2786 | "node": ">= 0.4" 2787 | } 2788 | }, 2789 | "node_modules/setimmediate": { 2790 | "version": "1.0.5", 2791 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2792 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" 2793 | }, 2794 | "node_modules/shebang-command": { 2795 | "version": "2.0.0", 2796 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2797 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2798 | "dev": true, 2799 | "dependencies": { 2800 | "shebang-regex": "^3.0.0" 2801 | }, 2802 | "engines": { 2803 | "node": ">=8" 2804 | } 2805 | }, 2806 | "node_modules/shebang-regex": { 2807 | "version": "3.0.0", 2808 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2809 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2810 | "dev": true, 2811 | "engines": { 2812 | "node": ">=8" 2813 | } 2814 | }, 2815 | "node_modules/signal-exit": { 2816 | "version": "4.1.0", 2817 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2818 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2819 | "dev": true, 2820 | "engines": { 2821 | "node": ">=14" 2822 | }, 2823 | "funding": { 2824 | "url": "https://github.com/sponsors/isaacs" 2825 | } 2826 | }, 2827 | "node_modules/source-map-js": { 2828 | "version": "1.2.0", 2829 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 2830 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 2831 | "engines": { 2832 | "node": ">=0.10.0" 2833 | } 2834 | }, 2835 | "node_modules/streamsearch": { 2836 | "version": "1.1.0", 2837 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 2838 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 2839 | "engines": { 2840 | "node": ">=10.0.0" 2841 | } 2842 | }, 2843 | "node_modules/string-width": { 2844 | "version": "5.1.2", 2845 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2846 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2847 | "dev": true, 2848 | "dependencies": { 2849 | "eastasianwidth": "^0.2.0", 2850 | "emoji-regex": "^9.2.2", 2851 | "strip-ansi": "^7.0.1" 2852 | }, 2853 | "engines": { 2854 | "node": ">=12" 2855 | }, 2856 | "funding": { 2857 | "url": "https://github.com/sponsors/sindresorhus" 2858 | } 2859 | }, 2860 | "node_modules/string-width-cjs": { 2861 | "name": "string-width", 2862 | "version": "4.2.3", 2863 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2864 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2865 | "dev": true, 2866 | "dependencies": { 2867 | "emoji-regex": "^8.0.0", 2868 | "is-fullwidth-code-point": "^3.0.0", 2869 | "strip-ansi": "^6.0.1" 2870 | }, 2871 | "engines": { 2872 | "node": ">=8" 2873 | } 2874 | }, 2875 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2876 | "version": "5.0.1", 2877 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2878 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2879 | "dev": true, 2880 | "engines": { 2881 | "node": ">=8" 2882 | } 2883 | }, 2884 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2885 | "version": "8.0.0", 2886 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2887 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2888 | "dev": true 2889 | }, 2890 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2891 | "version": "6.0.1", 2892 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2893 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2894 | "dev": true, 2895 | "dependencies": { 2896 | "ansi-regex": "^5.0.1" 2897 | }, 2898 | "engines": { 2899 | "node": ">=8" 2900 | } 2901 | }, 2902 | "node_modules/strip-ansi": { 2903 | "version": "7.1.0", 2904 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2905 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2906 | "dev": true, 2907 | "dependencies": { 2908 | "ansi-regex": "^6.0.1" 2909 | }, 2910 | "engines": { 2911 | "node": ">=12" 2912 | }, 2913 | "funding": { 2914 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2915 | } 2916 | }, 2917 | "node_modules/strip-ansi-cjs": { 2918 | "name": "strip-ansi", 2919 | "version": "6.0.1", 2920 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2921 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2922 | "dev": true, 2923 | "dependencies": { 2924 | "ansi-regex": "^5.0.1" 2925 | }, 2926 | "engines": { 2927 | "node": ">=8" 2928 | } 2929 | }, 2930 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2931 | "version": "5.0.1", 2932 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2933 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2934 | "dev": true, 2935 | "engines": { 2936 | "node": ">=8" 2937 | } 2938 | }, 2939 | "node_modules/styled-jsx": { 2940 | "version": "5.1.1", 2941 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", 2942 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", 2943 | "dependencies": { 2944 | "client-only": "0.0.1" 2945 | }, 2946 | "engines": { 2947 | "node": ">= 12.0.0" 2948 | }, 2949 | "peerDependencies": { 2950 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 2951 | }, 2952 | "peerDependenciesMeta": { 2953 | "@babel/core": { 2954 | "optional": true 2955 | }, 2956 | "babel-plugin-macros": { 2957 | "optional": true 2958 | } 2959 | } 2960 | }, 2961 | "node_modules/sucrase": { 2962 | "version": "3.35.0", 2963 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 2964 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 2965 | "dev": true, 2966 | "dependencies": { 2967 | "@jridgewell/gen-mapping": "^0.3.2", 2968 | "commander": "^4.0.0", 2969 | "glob": "^10.3.10", 2970 | "lines-and-columns": "^1.1.6", 2971 | "mz": "^2.7.0", 2972 | "pirates": "^4.0.1", 2973 | "ts-interface-checker": "^0.1.9" 2974 | }, 2975 | "bin": { 2976 | "sucrase": "bin/sucrase", 2977 | "sucrase-node": "bin/sucrase-node" 2978 | }, 2979 | "engines": { 2980 | "node": ">=16 || 14 >=14.17" 2981 | } 2982 | }, 2983 | "node_modules/supports-preserve-symlinks-flag": { 2984 | "version": "1.0.0", 2985 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2986 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2987 | "dev": true, 2988 | "engines": { 2989 | "node": ">= 0.4" 2990 | }, 2991 | "funding": { 2992 | "url": "https://github.com/sponsors/ljharb" 2993 | } 2994 | }, 2995 | "node_modules/swr": { 2996 | "version": "2.2.5", 2997 | "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", 2998 | "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==", 2999 | "dependencies": { 3000 | "client-only": "^0.0.1", 3001 | "use-sync-external-store": "^1.2.0" 3002 | }, 3003 | "peerDependencies": { 3004 | "react": "^16.11.0 || ^17.0.0 || ^18.0.0" 3005 | } 3006 | }, 3007 | "node_modules/tailwindcss": { 3008 | "version": "3.4.3", 3009 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", 3010 | "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", 3011 | "dev": true, 3012 | "dependencies": { 3013 | "@alloc/quick-lru": "^5.2.0", 3014 | "arg": "^5.0.2", 3015 | "chokidar": "^3.5.3", 3016 | "didyoumean": "^1.2.2", 3017 | "dlv": "^1.1.3", 3018 | "fast-glob": "^3.3.0", 3019 | "glob-parent": "^6.0.2", 3020 | "is-glob": "^4.0.3", 3021 | "jiti": "^1.21.0", 3022 | "lilconfig": "^2.1.0", 3023 | "micromatch": "^4.0.5", 3024 | "normalize-path": "^3.0.0", 3025 | "object-hash": "^3.0.0", 3026 | "picocolors": "^1.0.0", 3027 | "postcss": "^8.4.23", 3028 | "postcss-import": "^15.1.0", 3029 | "postcss-js": "^4.0.1", 3030 | "postcss-load-config": "^4.0.1", 3031 | "postcss-nested": "^6.0.1", 3032 | "postcss-selector-parser": "^6.0.11", 3033 | "resolve": "^1.22.2", 3034 | "sucrase": "^3.32.0" 3035 | }, 3036 | "bin": { 3037 | "tailwind": "lib/cli.js", 3038 | "tailwindcss": "lib/cli.js" 3039 | }, 3040 | "engines": { 3041 | "node": ">=14.0.0" 3042 | } 3043 | }, 3044 | "node_modules/thenify": { 3045 | "version": "3.3.1", 3046 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 3047 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 3048 | "dev": true, 3049 | "dependencies": { 3050 | "any-promise": "^1.0.0" 3051 | } 3052 | }, 3053 | "node_modules/thenify-all": { 3054 | "version": "1.6.0", 3055 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 3056 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 3057 | "dev": true, 3058 | "dependencies": { 3059 | "thenify": ">= 3.1.0 < 4" 3060 | }, 3061 | "engines": { 3062 | "node": ">=0.8" 3063 | } 3064 | }, 3065 | "node_modules/to-regex-range": { 3066 | "version": "5.0.1", 3067 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3068 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3069 | "dev": true, 3070 | "dependencies": { 3071 | "is-number": "^7.0.0" 3072 | }, 3073 | "engines": { 3074 | "node": ">=8.0" 3075 | } 3076 | }, 3077 | "node_modules/tr46": { 3078 | "version": "0.0.3", 3079 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3080 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 3081 | }, 3082 | "node_modules/ts-interface-checker": { 3083 | "version": "0.1.13", 3084 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 3085 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 3086 | "dev": true 3087 | }, 3088 | "node_modules/tslib": { 3089 | "version": "2.6.2", 3090 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 3091 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 3092 | }, 3093 | "node_modules/ua-parser-js": { 3094 | "version": "0.7.37", 3095 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", 3096 | "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", 3097 | "funding": [ 3098 | { 3099 | "type": "opencollective", 3100 | "url": "https://opencollective.com/ua-parser-js" 3101 | }, 3102 | { 3103 | "type": "paypal", 3104 | "url": "https://paypal.me/faisalman" 3105 | }, 3106 | { 3107 | "type": "github", 3108 | "url": "https://github.com/sponsors/faisalman" 3109 | } 3110 | ], 3111 | "engines": { 3112 | "node": "*" 3113 | } 3114 | }, 3115 | "node_modules/uc.micro": { 3116 | "version": "1.0.6", 3117 | "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", 3118 | "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" 3119 | }, 3120 | "node_modules/undici": { 3121 | "version": "5.28.3", 3122 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", 3123 | "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", 3124 | "dependencies": { 3125 | "@fastify/busboy": "^2.0.0" 3126 | }, 3127 | "engines": { 3128 | "node": ">=14.0" 3129 | } 3130 | }, 3131 | "node_modules/undici-types": { 3132 | "version": "5.26.5", 3133 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 3134 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 3135 | }, 3136 | "node_modules/update-browserslist-db": { 3137 | "version": "1.0.13", 3138 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", 3139 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", 3140 | "dev": true, 3141 | "funding": [ 3142 | { 3143 | "type": "opencollective", 3144 | "url": "https://opencollective.com/browserslist" 3145 | }, 3146 | { 3147 | "type": "tidelift", 3148 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3149 | }, 3150 | { 3151 | "type": "github", 3152 | "url": "https://github.com/sponsors/ai" 3153 | } 3154 | ], 3155 | "dependencies": { 3156 | "escalade": "^3.1.1", 3157 | "picocolors": "^1.0.0" 3158 | }, 3159 | "bin": { 3160 | "update-browserslist-db": "cli.js" 3161 | }, 3162 | "peerDependencies": { 3163 | "browserslist": ">= 4.21.0" 3164 | } 3165 | }, 3166 | "node_modules/use-sync-external-store": { 3167 | "version": "1.2.0", 3168 | "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", 3169 | "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", 3170 | "peerDependencies": { 3171 | "react": "^16.8.0 || ^17.0.0 || ^18.0.0" 3172 | } 3173 | }, 3174 | "node_modules/util-deprecate": { 3175 | "version": "1.0.2", 3176 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3177 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3178 | "dev": true 3179 | }, 3180 | "node_modules/webidl-conversions": { 3181 | "version": "3.0.1", 3182 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3183 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 3184 | }, 3185 | "node_modules/websocket-driver": { 3186 | "version": "0.7.4", 3187 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 3188 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 3189 | "dependencies": { 3190 | "http-parser-js": ">=0.5.1", 3191 | "safe-buffer": ">=5.1.0", 3192 | "websocket-extensions": ">=0.1.1" 3193 | }, 3194 | "engines": { 3195 | "node": ">=0.8.0" 3196 | } 3197 | }, 3198 | "node_modules/websocket-extensions": { 3199 | "version": "0.1.4", 3200 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 3201 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", 3202 | "engines": { 3203 | "node": ">=0.8.0" 3204 | } 3205 | }, 3206 | "node_modules/whatwg-url": { 3207 | "version": "5.0.0", 3208 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3209 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 3210 | "dependencies": { 3211 | "tr46": "~0.0.3", 3212 | "webidl-conversions": "^3.0.0" 3213 | } 3214 | }, 3215 | "node_modules/which": { 3216 | "version": "2.0.2", 3217 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3218 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3219 | "dev": true, 3220 | "dependencies": { 3221 | "isexe": "^2.0.0" 3222 | }, 3223 | "bin": { 3224 | "node-which": "bin/node-which" 3225 | }, 3226 | "engines": { 3227 | "node": ">= 8" 3228 | } 3229 | }, 3230 | "node_modules/wrap-ansi": { 3231 | "version": "8.1.0", 3232 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3233 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3234 | "dev": true, 3235 | "dependencies": { 3236 | "ansi-styles": "^6.1.0", 3237 | "string-width": "^5.0.1", 3238 | "strip-ansi": "^7.0.1" 3239 | }, 3240 | "engines": { 3241 | "node": ">=12" 3242 | }, 3243 | "funding": { 3244 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3245 | } 3246 | }, 3247 | "node_modules/wrap-ansi-cjs": { 3248 | "name": "wrap-ansi", 3249 | "version": "7.0.0", 3250 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3251 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3252 | "dev": true, 3253 | "dependencies": { 3254 | "ansi-styles": "^4.0.0", 3255 | "string-width": "^4.1.0", 3256 | "strip-ansi": "^6.0.0" 3257 | }, 3258 | "engines": { 3259 | "node": ">=10" 3260 | }, 3261 | "funding": { 3262 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3263 | } 3264 | }, 3265 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 3266 | "version": "5.0.1", 3267 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3268 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3269 | "dev": true, 3270 | "engines": { 3271 | "node": ">=8" 3272 | } 3273 | }, 3274 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 3275 | "version": "4.3.0", 3276 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3277 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3278 | "dev": true, 3279 | "dependencies": { 3280 | "color-convert": "^2.0.1" 3281 | }, 3282 | "engines": { 3283 | "node": ">=8" 3284 | }, 3285 | "funding": { 3286 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3287 | } 3288 | }, 3289 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 3290 | "version": "8.0.0", 3291 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3292 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3293 | "dev": true 3294 | }, 3295 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3296 | "version": "4.2.3", 3297 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3298 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3299 | "dev": true, 3300 | "dependencies": { 3301 | "emoji-regex": "^8.0.0", 3302 | "is-fullwidth-code-point": "^3.0.0", 3303 | "strip-ansi": "^6.0.1" 3304 | }, 3305 | "engines": { 3306 | "node": ">=8" 3307 | } 3308 | }, 3309 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 3310 | "version": "6.0.1", 3311 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3312 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3313 | "dev": true, 3314 | "dependencies": { 3315 | "ansi-regex": "^5.0.1" 3316 | }, 3317 | "engines": { 3318 | "node": ">=8" 3319 | } 3320 | }, 3321 | "node_modules/y18n": { 3322 | "version": "5.0.8", 3323 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3324 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3325 | "engines": { 3326 | "node": ">=10" 3327 | } 3328 | }, 3329 | "node_modules/yaml": { 3330 | "version": "2.4.1", 3331 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", 3332 | "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", 3333 | "dev": true, 3334 | "bin": { 3335 | "yaml": "bin.mjs" 3336 | }, 3337 | "engines": { 3338 | "node": ">= 14" 3339 | } 3340 | }, 3341 | "node_modules/yargs": { 3342 | "version": "17.7.2", 3343 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 3344 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 3345 | "dependencies": { 3346 | "cliui": "^8.0.1", 3347 | "escalade": "^3.1.1", 3348 | "get-caller-file": "^2.0.5", 3349 | "require-directory": "^2.1.1", 3350 | "string-width": "^4.2.3", 3351 | "y18n": "^5.0.5", 3352 | "yargs-parser": "^21.1.1" 3353 | }, 3354 | "engines": { 3355 | "node": ">=12" 3356 | } 3357 | }, 3358 | "node_modules/yargs-parser": { 3359 | "version": "21.1.1", 3360 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3361 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3362 | "engines": { 3363 | "node": ">=12" 3364 | } 3365 | }, 3366 | "node_modules/yargs/node_modules/ansi-regex": { 3367 | "version": "5.0.1", 3368 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3369 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3370 | "engines": { 3371 | "node": ">=8" 3372 | } 3373 | }, 3374 | "node_modules/yargs/node_modules/emoji-regex": { 3375 | "version": "8.0.0", 3376 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3377 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 3378 | }, 3379 | "node_modules/yargs/node_modules/string-width": { 3380 | "version": "4.2.3", 3381 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3382 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3383 | "dependencies": { 3384 | "emoji-regex": "^8.0.0", 3385 | "is-fullwidth-code-point": "^3.0.0", 3386 | "strip-ansi": "^6.0.1" 3387 | }, 3388 | "engines": { 3389 | "node": ">=8" 3390 | } 3391 | }, 3392 | "node_modules/yargs/node_modules/strip-ansi": { 3393 | "version": "6.0.1", 3394 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3395 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3396 | "dependencies": { 3397 | "ansi-regex": "^5.0.1" 3398 | }, 3399 | "engines": { 3400 | "node": ">=8" 3401 | } 3402 | } 3403 | } 3404 | } 3405 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lyeana_blog", 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 | "draft-convert": "^2.1.13", 13 | "draft-js": "^0.11.7", 14 | "firebase": "^10.10.0", 15 | "lucide-react": "^0.365.0", 16 | "next": "14.1.4", 17 | "react": "^18", 18 | "react-dom": "^18", 19 | "react-draft-wysiwyg": "^1.15.0", 20 | "react-quill": "^2.0.0", 21 | "swr": "^2.2.5" 22 | }, 23 | "devDependencies": { 24 | "autoprefixer": "^10.0.1", 25 | "postcss": "^8", 26 | "tailwindcss": "^3.3.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RajendraAVerma/blog-website-nextjs/b1bd1a4a3b271e5aba7bd165f8d21dc97393f746/public/google.png -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RajendraAVerma/blog-website-nextjs/b1bd1a4a3b271e5aba7bd165f8d21dc97393f746/public/logo.png -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./pages/**/*.{js,ts,jsx,tsx,mdx}", 5 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 6 | "./app/**/*.{js,ts,jsx,tsx,mdx}", 7 | ], 8 | theme: { 9 | extend: { 10 | backgroundImage: { 11 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 12 | "gradient-conic": 13 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 14 | }, 15 | }, 16 | }, 17 | plugins: [], 18 | }; 19 | --------------------------------------------------------------------------------