diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e1e047 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md new file mode 100644 index 0000000..c403366 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/app/(auth)/layout.tsx b/app/(auth)/layout.tsx new file mode 100644 index 0000000..dc75d69 --- /dev/null +++ b/app/(auth)/layout.tsx @@ -0,0 +1,11 @@ +import React, { ReactNode } from 'react' + +const AuthLayout = ({children} : {children : ReactNode}) => { + return ( +
+ {children} +
+ ) +} + +export default AuthLayout \ No newline at end of file diff --git a/app/(auth)/sign-in/[[...sign-in]]/page.tsx b/app/(auth)/sign-in/[[...sign-in]]/page.tsx new file mode 100644 index 0000000..c256786 --- /dev/null +++ b/app/(auth)/sign-in/[[...sign-in]]/page.tsx @@ -0,0 +1,10 @@ +import { SignIn } from "@clerk/nextjs"; +import AuthLayout from "../../layout"; + +export default function Page() { + return ( + + + + ); +} diff --git a/app/(auth)/sign-up/[[...sign-up]]/page.tsx b/app/(auth)/sign-up/[[...sign-up]]/page.tsx new file mode 100644 index 0000000..aba3bdd --- /dev/null +++ b/app/(auth)/sign-up/[[...sign-up]]/page.tsx @@ -0,0 +1,10 @@ +import { SignUp } from "@clerk/nextjs"; +import AuthLayout from "../../layout"; + +export default function Page() { + return ( + + + + ); +} diff --git a/app/(resume)/build-resume/[id]/(edit)/layout.tsx b/app/(resume)/build-resume/[id]/(edit)/layout.tsx new file mode 100644 index 0000000..284665c --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/layout.tsx @@ -0,0 +1,209 @@ +"use client"; + +import { useParams, usePathname, useSearchParams } from "next/navigation"; +import { useUser } from "@clerk/nextjs"; +import { useQuery } from "convex/react"; +import { useRouter } from "nextjs-toploader/app"; +import React from "react"; +import toast from "react-hot-toast"; + +import LiveResumePreview from "@/components/LiveResumePreview"; +import VerticalTimeline from "@/components/VerticalTimeline"; +import ContineBtn from "@/components/ContineBtn"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { geologicaFont } from "@/lib/font"; +import { cn } from "@/lib/utils"; +import { motion } from "framer-motion"; +import { item } from "@/lib/motion"; +import useMobile from "@/lib/useMobile"; +import MobilePreviewButton from "@/components/MobilePreviewButton"; +import PreviewModal from "@/components/PreviewModal"; +import { ResumeTemplate } from "@/types/templateTypes"; +import { Button } from "@/components/ui/button"; + +// Types +type Section = + | "header" + | "experience" + | "skills" + | "education" + | "projects" + | "custom" + | "final"; +type ResumeSection = { + type: Section; +}; + +interface ResumeData { + userId: string; + sections: ResumeSection[]; +} + +interface ResumeBuilderLayoutProps { + children: React.ReactNode; +} + +// Constants +const POSSIBLE_SECTIONS: readonly Section[] = [ + "header", + "experience", + "skills", + "education", + "projects", + "custom", + "final", +]; + +const ResumeBuilderLayout: React.FC = ({ + children, +}) => { + // Hooks + const params = useParams(); + const router = useRouter(); + const { user, isLoaded } = useUser(); + const searchParams = useSearchParams(); + const pathname = usePathname(); + const isMobile = useMobile(); + + const resumeId = params.id as Id<"resumes">; + const resume = useQuery(api.resume.getTemplateDetails, { id: resumeId }); + + // Helper functions + const validateSection = (section: string): section is Section => { + return POSSIBLE_SECTIONS.includes(section as Section); + }; + + const getNavigationUrls = ( + sectionArray: Section[], + currentSection: string | null, + pathname: string + ): { prevUrl: string; nextUrl: string } => { + if (currentSection) { + return handleSearchParamNavigation(sectionArray, currentSection); + } + return handlePathNavigation(sectionArray, pathname); + }; + + const handleSearchParamNavigation = ( + sectionArray: Section[], + sec: string + ) => { + const index = sectionArray.findIndex((item) => item === sec); + const nextSection = sec === "custom" ? "custom" : sectionArray[index]; + const prevSection = sectionArray[index - 1] ?? "header"; + + return { + nextUrl: `/build-resume/${resumeId}/section/${nextSection}`, + prevUrl: + sec === "header" + ? `/build-resume/${resumeId}/tips?sec=header` + : `/build-resume/${resumeId}/section/${prevSection}`, + }; + }; + + const handlePathNavigation = (sectionArray: Section[], pathname: string) => { + const sectionType = pathname.split("/section/")[1] as Section; + const currentIndex = sectionArray.findIndex((item) => item === sectionType); + + return { + prevUrl: + sectionType === "final" + ? `/build-resume/${resumeId}/tips?sec=custom` + : `/build-resume/${resumeId}/tips?sec=${sectionArray[currentIndex]}`, + nextUrl: + sectionType === "custom" + ? `/build-resume/${resumeId}/section/final` + : sectionType === "final" + ? `/build-resume/${resumeId}/download` + : `/build-resume/${resumeId}/tips?sec=${sectionArray[currentIndex + 1]}`, + }; + }; + + // Error handling and validation + if (resume === undefined) return null; + if (resume === null) return
Template not found
; + if (isLoaded && resume?.userId !== user?.id) { + toast.error("Not authenticated"); + router.push("/"); + return null; + } + + const sectionArray: Section[] = resume.sections.map((item) => item.type); + sectionArray.push("custom"); + sectionArray.push("final"); + const sec = searchParams.get("sec"); + + if (sec && !validateSection(sec)) { + toast.error("Invalid section"); + router.push(`/build-resume/${resumeId}/tips?sec=header`); + return null; + } + + const currentSection = pathname.split("/section/")[1]; + if (currentSection && !validateSection(currentSection)) { + toast.error("Invalid section"); + router.push(`/build-resume/${resumeId}/tips?sec=header`); + return null; + } + + const { prevUrl, nextUrl } = getNavigationUrls(sectionArray, sec, pathname); + + // Render + return ( + <> +
+ +
+
+ + +
+
+
+
+ +
+ +
+ {children} + {(isMobile || (!currentSection && !isMobile)) && ( + + + + + )} +
+
+ +
+ +
+
+ + + + ); +}; + +export default ResumeBuilderLayout; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/custom/page.tsx b/app/(resume)/build-resume/[id]/(edit)/section/custom/page.tsx new file mode 100644 index 0000000..fa89042 --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/custom/page.tsx @@ -0,0 +1,43 @@ +"use client"; + +import CustomForm from "@/components/forms/CustomForm"; +import SkillsForm from "@/components/forms/SkillsForm"; +import HeaderSkeleton from "@/components/HeaderSkeleton"; +import SectionInfo from "@/components/SectionInfo"; +import { api } from "@/convex/_generated/api"; +import { Doc, Id } from "@/convex/_generated/dataModel"; +import { useQuery } from "convex/react"; +import { useParams } from "next/navigation"; +import { useRouter } from 'nextjs-toploader/app'; + +const Page = () => { + const params = useParams(); + const resumeId = params.id; + const resume = useQuery(api.resume.getTemplateDetails, { + id: resumeId as Id<"resumes">, + }); + + if (resume === null) { + return
No Template Found
; + } + if (resume === undefined) { + return ; + } + + return ( +
+ + + } + styles={"sadf"} + item={"asdf"} + /> +
+ ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/education/page.tsx b/app/(resume)/build-resume/[id]/(edit)/section/education/page.tsx new file mode 100644 index 0000000..f61bb4a --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/education/page.tsx @@ -0,0 +1,45 @@ +"use client"; +import EducationForm from "@/components/forms/EducationForm"; +import HeaderSkeleton from "@/components/HeaderSkeleton"; +import SectionInfo from "@/components/SectionInfo"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { EducationSection } from "@/types/templateTypes"; +import { useQuery } from "convex/react"; +import { useParams, useRouter } from "next/navigation"; +import React from "react"; + +const Page = () => { + const params = useParams(); + const resumeId = params.id; + const resume = useQuery(api.resume.getTemplateDetails, { + id: resumeId as Id<"resumes">, + }); + if (resume === null) { + return
No template found
; + } + if (resume === undefined) { + return ; + } + + return ( + <> + {resume?.sections?.map((item, idx) => { + if (item?.type === "education") { + return ( +
+ + } item={item as EducationSection} /> +
+ ); + } + })} + + ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/experience/page.tsx b/app/(resume)/build-resume/[id]/(edit)/section/experience/page.tsx new file mode 100644 index 0000000..86b3ceb --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/experience/page.tsx @@ -0,0 +1,46 @@ +"use client"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { useQuery } from "convex/react"; +import { useParams } from "next/navigation"; +import React from "react"; +import SectionInfo from "@/components/SectionInfo"; +import HeaderSkeleton from "@/components/HeaderSkeleton"; +import ExperienceForm from "@/components/forms/ExperienceForm"; + +const Page = () => { + + const params = useParams(); + const resumeId = params.id as Id<"resumes">; + const resume = useQuery(api.resume.getTemplateDetails, { id: resumeId }); + + if (resume === null) { + return
Template not found
; + } + + if (resume === undefined) { + return ; + } + + return ( + <> + {resume.sections?.map((item, idx) => { + if (item?.type === "experience") { + return ( +
+ + + +
+ ); + } + return null; + })} + + ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/final/layout.tsx b/app/(resume)/build-resume/[id]/(edit)/section/final/layout.tsx new file mode 100644 index 0000000..2ca29c1 --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/final/layout.tsx @@ -0,0 +1,7 @@ +import React, { ReactNode } from "react"; + +const FinalLayout = ({ children }: { children: ReactNode }) => { + return
{children}
; +}; + +export default FinalLayout; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/final/page.tsx b/app/(resume)/build-resume/[id]/(edit)/section/final/page.tsx new file mode 100644 index 0000000..bf07b99 --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/final/page.tsx @@ -0,0 +1,330 @@ +"use client"; +import React, { useEffect, useMemo, useState } from "react"; +import FinalLayout from "./layout"; +import { ColorPicker, useColor } from "react-color-palette"; +import "react-color-palette/css"; +import { debounce } from "lodash"; +import { useParams } from "next/navigation"; +import { useMutation, useQuery } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { Label } from "@/components/ui/label"; +import { Button } from "@/components/ui/button"; +import { motion } from "framer-motion"; +import { ChevronDown, Eye, EyeOff } from "lucide-react"; +import SortableList, { SortableItem } from "react-easy-sort"; +import { arrayMoveImmutable } from "array-move"; + +interface Section { + type: string; + title: string; +} + +const Page = () => { + const [primaryTextColor, setPrimaryTextColor] = useColor("#000"); + const [primaryColor, setPrimaryColor] = useColor("#000"); + const [showPrimaryTextColorBox, setShowPrimaryTextColorBox] = useState(false); + const [showPrimaryColorBox, setShowPrimaryColorBox] = useState(false); + + const params = useParams(); + const resumeId = params.id; + const resume = useQuery(api.resume.getTemplateDetails, { + id: resumeId as Id<"resumes">, + }); + + const sortedSections = resume?.sections.sort( + (a: any, b: any) => a.orderNumber - b.orderNumber + ); + const [sections, setSections] = useState(sortedSections); + + const reorder = useMutation(api.resume.reorderSections); + const update = useMutation(api.resume.updateColor); + const updatePC = useMutation(api.resume.updateColorPC); + const updateFont = useMutation(api.resume.updateFont); + + const hideSection = useMutation(api.resume.hideSection); + + const toggleSectionVisibility = (sectionId: string) => { + hideSection({ id: resumeId as Id<"resumes">, sectionId: sectionId }); + }; + + useEffect(() => { + if (resume?.sections) { + const mainSections = resume.sections.filter( + (item) => item.type !== "custom" + ); + const customSections = resume.sections.filter( + (item) => item.type === "custom" + ); + const updatedSections = [...mainSections, ...customSections].sort( + (a: any, b: any) => a.orderNumber - b.orderNumber + ); + setSections(updatedSections); + } + }, [resume]); + + const onSortEnd = (oldIndex: number, newIndex: number) => { + setSections((prev: any) => { + const newSections = arrayMoveImmutable(prev, oldIndex, newIndex); + const updatedSections = newSections.map( + (section: any, index: number) => ({ + ...section, + orderNumber: index, + }) + ); + + reorder({ + id: resumeId as Id<"resumes">, + updatedSections: updatedSections, + }); + return updatedSections; + }); + }; + + const handlePrimaryTextColorChange = useMemo(() => { + return debounce((color: any) => { + setPrimaryTextColor(color); + update({ id: resumeId as Id<"resumes">, color: color.hex }); + }, 400); + }, [update, setPrimaryTextColor, resumeId]); + + const handlePrimaryColorChange = useMemo(() => { + return debounce((color: any) => { + setPrimaryColor(color); + updatePC({ id: resumeId as Id<"resumes">, color: color.hex }); + }, 400); + }, [setPrimaryColor, updatePC, resumeId]); + + const handleChosePrimaryColor = (color: string) => { + updatePC({ id: resumeId as Id<"resumes">, color: color }); + }; + + const handleChosePrimaryTextColor = (color: string) => { + update({ id: resumeId as Id<"resumes">, color: color }); + }; + + const colorOptions = [ + "#000", + "#C026D3", + "#153b66", + "#a1be29", + "#955b15", + ]; + + const fontOptions = [ + "Raleway", + "Inter", + "OpenSans", + "Poppins", + "Montserrat", + "Geologica", + ]; + + const handleFontChange = (font: string) => { + updateFont({ id: resumeId as Id<"resumes">, font }); + }; + + const currentFont = resume?.globalStyles?.fontFamily || "Inter"; + + return ( + +
+
+

Almost Done !!

+

+ Change the theme color and font of your resume if you want... +

+
+ +
+
+ +

Reorder the sections if you want...

+
+ + {sections?.map((item: any, index: number) => { + return ( + +
+
+ {item?.orderNumber + 1} +
+
+ + {item.type === "custom" + ? item.content.sectionTitle + : item.type} + + +
+
+
+ ); + })} +
+
+ +
+
+ +

+ This is for all the title text that you can see in the resume.. +

+
+
+ {colorOptions.map((item) => { + return ( + handleChosePrimaryTextColor(item)} + className={`size-[35px] ${ + resume?.globalStyles?.primaryTextColor === item && + "size-[38px] ring-2 ring-offset-2 ring-black" + } rounded-full cursor-pointer`} + style={{ backgroundColor: item }} + > + ); + })} + + + + +
+
+ + {showPrimaryTextColorBox && ( +
+ +
+ )} + +
+
+ +

+ This is for all the borders or designs that you can see in the + resume. +

+
+
+ {colorOptions.map((item) => { + return ( + handleChosePrimaryColor(item)} + className={`size-[35px] ${ + resume?.globalStyles?.primaryColor === item && + "size-[38px] ring-2 ring-offset-2 ring-black" + } rounded-full cursor-pointer`} + style={{ backgroundColor: item }} + > + ); + })} + + + + +
+
+ + {showPrimaryColorBox && ( +
+ +
+ )} + +
+ +

+ Choose a font style for your resume... +

+
+
+ {fontOptions?.map((item, index) => { + return ( + + ); + })} +
+
+
+ ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/header/page.tsx b/app/(resume)/build-resume/[id]/(edit)/section/header/page.tsx new file mode 100644 index 0000000..20b733b --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/header/page.tsx @@ -0,0 +1,49 @@ +"use client"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { useQuery } from "convex/react"; +import { useParams } from "next/navigation"; +import React from "react"; +import SectionInfo from "@/components/SectionInfo"; +import HeaderSkeleton from "@/components/HeaderSkeleton"; +import HeaderForm from "@/components/forms/HeaderForm"; +import { HeaderSection } from "@/types/templateTypes"; +import useMobile from "@/lib/useMobile"; +import ContineBtn from "@/components/ContineBtn"; + +const Page = () => { + const params = useParams(); + const resumeId = params.id as Id<"resumes">; + const resume = useQuery(api.resume.getTemplateDetails, { id: resumeId }); + const isMobile = useMobile(); + + if (resume === null) { + return
Template not found
; + } + + if (resume === undefined) { + return ; + } + + return ( + <> + {resume.sections?.map((item, idx) => { + if (item?.type === "header") { + return ( +
+ + +
+ ); + } + return null; + })} + + ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/projects/page.tsx b/app/(resume)/build-resume/[id]/(edit)/section/projects/page.tsx new file mode 100644 index 0000000..a092399 --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/projects/page.tsx @@ -0,0 +1,52 @@ +"use client"; +import ProjectForm from "@/components/forms/ProjectForm"; +import HeaderSkeleton from "@/components/HeaderSkeleton"; +import SectionInfo from "@/components/SectionInfo"; +import { Button } from "@/components/ui/button"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { ProjectSection } from "@/types/templateTypes"; +import { useMutation, useQuery } from "convex/react"; +import { useParams } from "next/navigation"; +import React from "react"; +import { useRouter } from 'nextjs-toploader/app'; + +const Page = () => { + const params = useParams(); + const resumeId = params.id; + const router = useRouter(); + const resume = useQuery(api.resume.getTemplateDetails, { + id: resumeId as Id<"resumes">, + }); + if (resume === null) { + return
No template found
; + } + if (resume === undefined) { + return ; + } + + + let sectionArray: string[] = []; + resume?.sections?.map((item) => sectionArray.push(item.type)); + let projectIndex = sectionArray.findIndex((item) => item === "projects"); + + return ( + <> + {resume?.sections?.map((item, idx) => { + if (item?.type === "projects") { + return ( +
+ + } item={item as ProjectSection} /> +
+ ); + } + })} + + ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/(edit)/section/skills/page.tsx b/app/(resume)/build-resume/[id]/(edit)/section/skills/page.tsx new file mode 100644 index 0000000..fef7a90 --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/section/skills/page.tsx @@ -0,0 +1,49 @@ +"use client"; + +import SkillsForm from "@/components/forms/SkillsForm"; +import HeaderSkeleton from "@/components/HeaderSkeleton"; +import SectionInfo from "@/components/SectionInfo"; +import { api } from "@/convex/_generated/api"; +import { Doc, Id } from "@/convex/_generated/dataModel"; +import { useQuery } from "convex/react"; +import { useParams } from "next/navigation"; + +const Page = () => { + const params = useParams(); + const resumeId = params.id; + const resume = useQuery(api.resume.getTemplateDetails, { + id: resumeId as Id<"resumes">, + }); + + if (resume === null) { + return
No Template Found
; + } + if (resume === undefined) { + return ; + } + + return ( + <> + {resume?.sections?.map((item, idx) => { + if (item?.type === "skills") { + return ( +
+ + + } + styles={item?.style} + item={item} + /> +
+ ); + } + })} + + ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/(edit)/tips/page.tsx b/app/(resume)/build-resume/[id]/(edit)/tips/page.tsx new file mode 100644 index 0000000..5d6f2db --- /dev/null +++ b/app/(resume)/build-resume/[id]/(edit)/tips/page.tsx @@ -0,0 +1,70 @@ +"use client"; +import ContineBtn from "@/components/ContineBtn"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { tipsData } from "@/lib/tipsData"; +import { cn } from "@/lib/utils"; +import { useQuery } from "convex/react"; +import { useParams, useSearchParams } from "next/navigation"; +import React from "react"; +import { motion } from "framer-motion"; +import { container, item } from "@/lib/motion"; +import TipsSkeleton from "@/components/TipsSkeleton"; +import { geologicaFont, poppinsFont } from "@/lib/font"; + +const Page = () => { + const searchParams = useSearchParams(); + const sec = searchParams.get("sec"); + + const params = useParams(); + const resumeId = params.id; + const resume = useQuery(api.resume.getTemplateDetails, { + id: resumeId as Id<"resumes">, + }); + + if (resume === null) { + return
no document
; + } + + if (resume === undefined) { + return ; + } + + let sectionArray: string[] = []; + resume?.sections?.map((item) => sectionArray.push(item.type)); + + const currentTips = tipsData.find((item) => item.sec === sec); + + return ( +
+ +
+ + {currentTips?.topText} + + +

+ {currentTips?.mainText} +

+
+

+ {currentTips?.bottomMainText} +

+

+ {currentTips?.bottomText} +

+
+
+
+ +
+
+ ); +}; + +export default Page; diff --git a/app/(resume)/build-resume/[id]/download/page.tsx b/app/(resume)/build-resume/[id]/download/page.tsx new file mode 100644 index 0000000..a773546 --- /dev/null +++ b/app/(resume)/build-resume/[id]/download/page.tsx @@ -0,0 +1,198 @@ +"use client"; +import { useParams, useSearchParams } from "next/navigation"; +import React, { useRef, useState } from "react"; +import Template1 from "@/templates/template1/Template1"; +import { useQuery } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { ResumeTemplate } from "@/types/templateTypes"; +import Template2 from "@/templates/template2/Template2"; +import { Button } from "@/components/ui/button"; +import { cn } from "@/lib/utils"; +import toast from "react-hot-toast"; +import { + CheckCircle, + Download, + DownloadCloud, + Loader, + Loader2, +} from "lucide-react"; +import Navbar from "@/components/Navbar"; +import { + geologicaFont, + interFont, + montserratFont, + openSansFont, + poppinsFont, + ralewayFont, +} from "@/lib/font"; +import useMobile from "@/lib/useMobile"; + +const LiveResumePreview = () => { + const params = useParams(); + const [loading, setLoading] = useState(false); + + const templateDetails = useQuery(api.resume.getTemplateDetails, { + id: params.id as Id<"resumes">, + }) as ResumeTemplate | undefined | null; + + const searchParams = useSearchParams(); + const resumeOnlyMode = searchParams.get("resumeonly") === "true"; + const isMobile = useMobile(); + + if (templateDetails === null) { + return ( +
+

Template not found

+
+ ); + } + if (templateDetails === undefined) { + return ( +
+ +
+ ); + } + + type TemplateComponentType = React.ComponentType<{ + obj: ResumeTemplate; + size: "md" | "sm" | "lg"; + }>; + + const templateComponents: Record = { + Template1: Template1, + Template2: Template2, + }; + + const TemplateComponent = templateComponents[templateDetails.templateName]; + + if (!TemplateComponent) { + console.error( + `No component found for template: ${templateDetails.templateName}` + ); + return ( +
+

Error: Template not found

+
+ ); + } + + const handlePdfDownload = () => { + window.print(); + }; + + return ( +
+
+ +
+ +
+ {!resumeOnlyMode && ( +
+

+ Your Resume is Ready !! +

+ +
+
+ +

+ Your resume has been professionally formatted and is ready for + download. +

+
+ +
+ +

+ When downloading, select 'Save as Pdf' and Paper + Size 'ISO A4' to ensure the resume text remains + selectable, allowing easy copy-pasting by recruiters. +

+
+ +
+ +

+ Take a moment to review your resume one last time before + sharing it with potential employers. +

+
+
+ +
+ + + {loading && ( +

+ Downloading may take few seconds so kindly be patient... +

+ )} +
+
+ )} + +
+
+ {templateDetails && ( + + )} +
+
+
+
+ ); +}; + +export default LiveResumePreview; diff --git a/app/(resume)/build-resume/steps/page.tsx b/app/(resume)/build-resume/steps/page.tsx new file mode 100644 index 0000000..5021fdb --- /dev/null +++ b/app/(resume)/build-resume/steps/page.tsx @@ -0,0 +1,116 @@ +"use client"; +import { Button } from "@/components/ui/button"; +import { ArrowRight, Computer, LayoutTemplate, PencilLine } from "lucide-react"; +import Link from "next/link"; +import React from "react"; +import { motion } from "framer-motion"; +import { container, item } from "@/lib/motion"; +import { geologicaFont, poppinsFont } from "@/lib/font"; + +const Page = () => { + return ( + <> +
+ {/* Left section */} +
+
+

+ Say hello to ResumeCraft +

+

+ Get your resume ready in 3 steps +

+

+ Resume Craft gives you the tools and guidance you need to create a + truly professional resume that highlights your skills and + experience. +

+
+ + + + + + +
+
+
+ + {/* Right section */} +
+
+
+ +
+
+

+ Step-1: Start with a great template +

+

+ Choose from our collection of pre-designed templates tailored + for various industries and career levels. +

+
+
+ +
+
+ +
+
+

+ Step-2: Add compelling content +

+

+ Utilize our AI-powered content suggestions to effectively + describe your skills, experience, and achievements. +

+
+
+ +
+
+ +
+
+

+ Step-3: Customize and polish +

+

+ Fine-tune your resume's layout, style, and content to make + it uniquely yours and stand out to employers. +

+
+
+
+ + + + + + +
+
+
+ + ); +}; + +export default Page; \ No newline at end of file diff --git a/app/(resume)/build-resume/templates/page.tsx b/app/(resume)/build-resume/templates/page.tsx new file mode 100644 index 0000000..670f47e --- /dev/null +++ b/app/(resume)/build-resume/templates/page.tsx @@ -0,0 +1,29 @@ +import ChooseTemplates from "@/components/ChooseTemplates"; +import Navbar from "@/components/Navbar"; + +const Page = () => { + return ( + <> +
+ +
+
+

+ Recommended Templates +

+

+ Start with a solid foundation — select a template and build your + perfect resume. +

+
+
+ +
+ +
+
+ + ); +}; + +export default Page; diff --git a/app/(resume)/my-resumes/page.tsx b/app/(resume)/my-resumes/page.tsx new file mode 100644 index 0000000..51b5a0a --- /dev/null +++ b/app/(resume)/my-resumes/page.tsx @@ -0,0 +1,30 @@ +"use client"; +import Navbar from "@/components/Navbar"; +import React from "react"; +import ChooseTemplates from "@/components/ChooseTemplates"; + +const Page = () => { + return ( + <> +
+ +
+
+

+ My Resumes. +

+

+ Select a template and contine building your perfect resume. +

+
+
+ +
+ +
+
+ + ); +}; + +export default Page; diff --git a/app/api/generateJD/route.ts b/app/api/generateJD/route.ts new file mode 100644 index 0000000..aed4a8a --- /dev/null +++ b/app/api/generateJD/route.ts @@ -0,0 +1,55 @@ +import { NextRequest, NextResponse } from "next/server"; +import { GoogleGenerativeAI } from "@google/generative-ai"; + +function parseStringToArray(str: string) { + str = str.trim().slice(1, -1); + let items = str.split(/,\s*\n/); + items = items.map((item) => item.trim().replace(/^"|"$/g, "")); + + return items; +} + +export async function POST(req: NextRequest, res: NextResponse) { + try { + const genAI = new GoogleGenerativeAI(process.env.API_KEY!); + + const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); + + const { companyName, role,jobDescription } = await req.json(); + + let prompt = ""; + + if (companyName && role && !jobDescription) { + prompt = `for a ${role} who has worked at ${companyName} write a job description in 3 points..each point + must not exceed 1.5-2lines and should be + atleast 0.5 lines...Use metrics in the job description... + + make sure the response should be in the form of array of points so that i can use JSON.parse() on that response..Dont add any text before or after it... + + dont put a \n after [ and before ] + + Example points : Designed and developed web applications used by the DJSI committee, ensuring a 99.5% uptime to support critical sustainability ratings.,Optimized code and implemented efficient database management strategies, resulting in a 25% reduction in application load times.,Successfully integrated third-party data feeds, improving the accuracy and comprehensiveness of DJSI data by 15% `; + } else { + prompt = `for a ${role} who has worked at ${companyName} this is the job descriptoin ${jobDescription}..write 3 bullet points..each point + must not exceed 1.5-2lines and should be + atleast 0.5 lines...Use metrics in the job description to make it more ats friendly... + + make sure the response should be in the form of array of points so that i can use JSON.parse() on that response..Dont add any text before or after it... + + dont put a \n after [ and before ] + + Example points : Designed and developed web applications used by the DJSI committee, ensuring a 99.5% uptime to support critical sustainability ratings.,Optimized code and implemented efficient database management strategies, resulting in a 25% reduction in application load times.,Successfully integrated third-party data feeds, improving the accuracy and comprehensiveness of DJSI data by 15% `; + } + + const result = await model.generateContent(prompt); + const response = await result.response; + let text = response.text(); + + + const textArray = parseStringToArray(text); + + return NextResponse.json({ textArray }, { status: 200 }); + } catch (error) { + return NextResponse.json({ error }, { status: 500 }); + } +} diff --git a/app/api/generatePD/route.ts b/app/api/generatePD/route.ts new file mode 100644 index 0000000..da46256 --- /dev/null +++ b/app/api/generatePD/route.ts @@ -0,0 +1,69 @@ +import { NextRequest, NextResponse } from "next/server"; +import { GoogleGenerativeAI } from "@google/generative-ai"; + +function parseStringToArray(str: string) { + // Remove leading and trailing brackets + str = str.trim().slice(1, -1); + + // Split the string by comma and newline + let items = str.split(/,\s*\n/); + + // Clean each item and remove surrounding quotes + items = items.map((item) => item.trim().replace(/^"|"$/g, "")); + + return items; +} + +export async function POST(req: NextRequest, res: NextResponse) { + try { + const genAI = new GoogleGenerativeAI(process.env.API_KEY!); + + const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); + + const { projectTitle, projectDescription } = await req.json(); + + let prompt = ""; + + if (projectTitle && !projectDescription) { + prompt = `The title of the project is ${projectTitle}...Write project description in 3 points ..each point + must not exceed 1.5-2lines and should be + atleast 0.5 lines...Use metrics in the job description... + + make sure the response should be in the form of array of points so that i can use JSON.parse() on that response..Dont add any text before or after it... + write description as you are supposed to write it in a resume describing the project and not explaining it to someone + + dont put a \n after [ and before ] + + Example points : Built an Advanced Resume Builder using Next.js, Tailwind CSS, Shadcn UI, and TypeScript, allowing +users to create high ATS (Applicant Tracking System) resumes from scratch with ease, increasing +resume quality by 40%.,Integrated Convex DB for efficient database management, ensuring a 50% improvement in data +retrieval speeds and a smooth user experience with real-time updates.,Implemented customizable templates and real-time preview, enabling users to see changes +instantly and choose from various professional designs, boosting user engagement by 35%. `; + } else if (projectTitle && projectDescription) { + prompt = `The title of the project is ${projectTitle} and its description is ${projectDescription}...Improve this project description and write it in 3 points ..each point + must not exceed 1.5-2lines and should be + atleast 0.5 lines...Use metrics in the job description this is very very important...if the description contains tech stack make sure to use it while you improve + write description as you are supposed to write it in a resume describing the project and not explaining it to someone + + make sure the response should be in the form of array of points so that i can use JSON.parse() on that response..Dont add any text before or after it... + + dont put a \n after [ and before ] + + Example points : Built an Advanced Resume Builder using Next.js, Tailwind CSS, Shadcn UI, and TypeScript, allowing + users to create high ATS (Applicant Tracking System) resumes from scratch with ease, increasing + resume quality by 40%.,Integrated Convex DB for efficient database management, ensuring a 50% improvement in data + retrieval speeds and a smooth user experience with real-time updates.,Implemented customizable templates and real-time preview, enabling users to see changes + instantly and choose from various professional designs, boosting user engagement by 35%. `; + } + + const result = await model.generateContent(prompt); + const response = await result.response; + let text = response.text(); + + const textArray = parseStringToArray(text); + + return NextResponse.json({ textArray }, { status: 200 }); + } catch (error) { + return NextResponse.json({ error }, { status: 500 }); + } +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/app/favicon.ico differ diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..5ff4475 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,129 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + img { + @apply inline-block; + } +} +@layer base { + :root { + --background: 345 83% 97%; + --foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; + --primary: 346.8 77.2% 49.8%; + --primary-foreground: 355.7 100% 97.3%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; + --muted: 240 4.8% 95.9%; + --muted-foreground: 240 3.8% 46.1%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.9% 10%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 346.8 77.2% 49.8%; + --radius: 0.5rem; + } + + .dark { + --background: 20 14.3% 4.1%; + --foreground: 0 0% 95%; + --card: 24 9.8% 10%; + --card-foreground: 0 0% 95%; + --popover: 0 0% 9%; + --popover-foreground: 0 0% 95%; + --primary: 346.8 77.2% 49.8%; + --primary-foreground: 355.7 100% 97.3%; + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 15%; + --muted-foreground: 240 5% 64.9%; + --accent: 12 6.5% 15.1%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 85.7% 97.3%; + --border: 240 3.7% 15.9%; + --input: 240 3.7% 15.9%; + --ring: 346.8 77.2% 49.8%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground !overflow-x-hidden; + } +} + +.quill-content ul { + list-style-type: disc; + padding-left: 1em; +} + +.quill-content ol { + list-style-type: decimal; + padding-left: 1em; +} + +.quill-content li { + margin-bottom: 0.3em; +} + +body { + padding: 0px; + margin: 0px; +} + +@layer utilities { + /* Hide scrollbar for Chrome, Safari and Opera */ + .no-scrollbar::-webkit-scrollbar { + display: none; + } + /* Hide scrollbar for IE, Edge and Firefox */ + .no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } +} + +@media print { + #no-print { + display: none; + } + + #pdf { + display: block; + } + + body { + margin: 0; + padding: 0; + box-sizing: border-box; + } + + #hello { + transform: none !important; /* Reset any transforms */ + position: absolute !important; + top: 0 !important; + left: 0 !important; + width: 100% !important; + height: 100% !important; + border-radius: 0 !important; + } +} + +@page { + size: auto; + margin: 0mm; +} +.radial { + background: radial-gradient(circle, #fff, #ffe4e6); +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..be2bf11 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,39 @@ +import type { Metadata } from "next"; +import "./globals.css"; +import ConvexAndClerk from "@/providers/ConvexAndClerk"; +import { Toaster } from "react-hot-toast"; +import { poppinsFont } from "@/lib/font"; +import React from "react"; +import { Analytics } from "@vercel/analytics/react"; +import { SpeedInsights } from "@vercel/speed-insights/next"; +import NextTopLoader from "nextjs-toploader"; +import { useRouter } from "next/navigation"; +import NextLoader from "@/providers/NextLoader"; + +export const metadata: Metadata = { + title: "Resume Craft", + description: "Craft a winning resume in minutes", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + + return ( + + + + {/* */} + + + + + {children} + {/* */} + + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..c90c730 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,142 @@ +"use client"; +import Navbar from "@/components/Navbar"; +import { Button } from "@/components/ui/button"; +import { motion } from "framer-motion"; +import { container, item } from "@/lib/motion"; +import { geologicaFont, poppinsFont } from "@/lib/font"; +import { ArrowRight, Check } from "lucide-react"; +import React, { useEffect, useRef, useState } from "react"; +import { temp2Obj } from "@/templates/template2/temp2obj"; +import Template2 from "@/templates/template2/Template2"; +import { useRouter } from "next/navigation"; +import Template1 from "@/templates/template1/Template1"; +import temp1Obj from "@/templates/template1/temp1obj"; +import useMobile from "@/lib/useMobile"; + +export default function Home() { + + const router = useRouter(); + const isMobile = useMobile(); + + // const oneTimeRef = useRef(false); + // const migration = useMutation(api.resume.migrateResumes); + + // useEffect(() => { + // if (!oneTimeRef.current) { + // const promise = migration() + // .then((res) => { + // console.log(res, "yes"); + // }) + // .catch((err) => { + // console.log(err, "no"); + // }); + // oneTimeRef.current = true; + // } + // }, []); + + return ( +
+ +
+
+ {/* Content Section */} + +
+ {/* Heading */} + + Transform Your Experience into an Impactful Resume + + + {/* Description */} + + {!isMobile && ( + Create standout resumes and impress employers. + )} + Our user-friendly builder offers customizable templates to + ensure your resume is job-ready. + + + {/* Features List */} + + {[ + "ATS-optimized resumes", + "Professional templates tto industry standards", + "Customizable layouts for personal branding", + "Real-time preview to ensure perfection", + "Save hours with easy-to-use tools", + ].map((feature, index) => ( +
  • + + {feature} +
  • + ))} +
    + + {/* CTA Button */} + + + +
    +
    + + {/* Template Preview */} + + + + + + + +
    +
    +
    + ); +} diff --git a/components.json b/components.json new file mode 100644 index 0000000..15f2b02 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/components/ChooseTemplates.tsx b/components/ChooseTemplates.tsx new file mode 100644 index 0000000..e5dfb54 --- /dev/null +++ b/components/ChooseTemplates.tsx @@ -0,0 +1,148 @@ +"use client"; +import { Button } from "./ui/button"; +import { Edit, Eye } from "lucide-react"; +import { useUser } from "@clerk/nextjs"; +import { useMutation, useQuery } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import { redirect } from "next/navigation"; +import toast from "react-hot-toast"; +import { Id } from "@/convex/_generated/dataModel"; +import { Skeleton } from "./ui/skeleton"; +import { + templateComponents, + TemplateComponentType, +} from "@/templates/templateStructures"; +import { ResumeTemplate } from "@/types/templateTypes"; +import { usePreview } from "@/lib/use-preview"; +import PreviewModal from "./PreviewModal"; +import { cn } from "@/lib/utils"; +import React from "react"; +import { useRouter } from "nextjs-toploader/app"; +import Template3 from "@/templates/template3/Template3"; +import temp1Obj from "@/templates/template1/temp1obj"; +import temp3obj from "@/templates/template3/temp3obj"; + +const ChooseTemplates = ({ myResumes = false }: { myResumes?: boolean }) => { + const { user } = useUser(); + const createUserResume = useMutation(api.resume.createUserResume); + const router = useRouter(); + const templates = useQuery(api.resume.getTemplates); + const myResumeTemplates = useQuery(api.resume.getUserResumes, { + userId: user?.id || "", + }); + const preview = usePreview(); + + const finalTemplates = myResumes ? myResumeTemplates : templates; + + if (finalTemplates === undefined) { + return ; + } + if (finalTemplates.length === 0) { + return ( +
    +

    + {myResumes ? "No resumes found" : "No templates found"} +

    +
    + ); + } + if (!user) { + return redirect("/sign-up"); + } + + const selectResume = async (id: Id<"resumes">, templateName: string) => { + createUserResume({ + id: id, + userId: user?.id, + templateName: templateName, + }) + .then((res) => { + return router.push(`/build-resume/${res}/tips?sec=header`); + }) + .catch((err) => { + console.log(err); + toast.error("Something went wrong..."); + }); + }; + + const editResume = (resumeId: Id<"resumes">) => { + router.push(`/build-resume/${resumeId}/tips?sec=header`); + }; + + return ( +
    + {finalTemplates?.map((item, index) => { + const TemplateComponent: TemplateComponentType = + templateComponents[item.templateName]; + + if (!TemplateComponent) { + console.error( + `No component found for template: ${item.templateName}` + ); + return null; + } + + return ( +
    +
    + +
    + +
    + + +
    +
    + ); + })} + {/* */} +
    + +
    +
    + ); +}; + +const ChooseSkeleton = () => { + return ( +
    + {[1, 2, 3, 4, 5, 6, 7, 8].map((item) => ( +
    + +
    + ))} +
    + ); +}; + +export default ChooseTemplates; diff --git a/components/ContineBtn.tsx b/components/ContineBtn.tsx new file mode 100644 index 0000000..0c34570 --- /dev/null +++ b/components/ContineBtn.tsx @@ -0,0 +1,47 @@ +"use client"; +import { cn } from "@/lib/utils"; +import { Button } from "./ui/button"; +import { motion } from "framer-motion"; +import { useRouter } from "nextjs-toploader/app"; +import useMobile from "@/lib/useMobile"; +import { ArrowLeft, ArrowRight } from "lucide-react"; + +const ContineBtn = ({ + path, + type, + text, +}: { + path: string; + type: string; + text: string; +}) => { + const router = useRouter(); + const isMobile = useMobile(); + + return ( + + + + ); +}; + +export default ContineBtn; diff --git a/components/HeaderSkeleton.tsx b/components/HeaderSkeleton.tsx new file mode 100644 index 0000000..993bada --- /dev/null +++ b/components/HeaderSkeleton.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import { Skeleton } from "./ui/skeleton"; + +const HeaderSkeleton = () => { + return ( +
    +
    + + +
    +
    + + + + + + +
    + +
    + ); +}; + +export default HeaderSkeleton; diff --git a/components/LiveResumePreview.tsx b/components/LiveResumePreview.tsx new file mode 100644 index 0000000..ceb7f9e --- /dev/null +++ b/components/LiveResumePreview.tsx @@ -0,0 +1,147 @@ +"use client"; +import { useParams, usePathname } from "next/navigation"; +import React from "react"; +import { useQuery } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { motion } from "framer-motion"; +import ContineBtn from "./ContineBtn"; +import { Skeleton } from "./ui/skeleton"; +import { ResumeTemplate } from "@/types/templateTypes"; +import Template1 from "@/templates/template1/Template1"; +import Template2 from "@/templates/template2/Template2"; +import { cn } from "@/lib/utils"; +import { + geologicaFont, + interFont, + montserratFont, + openSansFont, + poppinsFont, + ralewayFont, +} from "@/lib/font"; + +type TemplateComponentType = React.ComponentType<{ + obj: ResumeTemplate; + isPreview: boolean; + isLive?: boolean; + size: "sm" | "md" | "lg"; +}>; + +const templateComponents: Record = { + Template1: Template1, + Template2: Template2, +}; + +const LiveResumePreview = () => { + const params = useParams(); + const templateDetails = useQuery(api.resume.getTemplateDetails, { + id: params.id as Id<"resumes">, + }); + const pathname = usePathname(); + const sectionType = pathname.split("/section/")[1]; + + let sectionArray: string[] = []; + templateDetails?.sections?.map((item) => sectionArray.push(item.type)); + let currentIndex = sectionArray.findIndex((item) => item === sectionType); + + if (templateDetails === null) { + return
    Template not found
    ; + } + + if (templateDetails === undefined) { + return ; + } + const backLocation = `/build-resume/${params.id}/tips?sec=${sectionArray[currentIndex]}`; + const nextLocation = + sectionType === "custom" + ? `/build-resume/${params.id}/section/final` + : sectionArray[currentIndex + 1] + ? `/build-resume/${params.id}/tips?sec=${sectionArray[currentIndex + 1]}` + : `/build-resume/${params.id}/section/custom`; + + const TemplateComponent = templateComponents[templateDetails.templateName]; + + if (!TemplateComponent) { + console.error( + `No component found for template: ${templateDetails.templateName}` + ); + return
    Error: Template not found
    ; + } + + return ( + <> +
    + + + +
    + + {sectionType && ( + +
    + + +
    +
    + )} + + ); +}; + +const ResumeSkeleton = () => { + return ( +
    + +
    + ); +}; + +export default LiveResumePreview; diff --git a/components/MobilePreviewButton.tsx b/components/MobilePreviewButton.tsx new file mode 100644 index 0000000..b22e120 --- /dev/null +++ b/components/MobilePreviewButton.tsx @@ -0,0 +1,35 @@ +"use client"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import { Eye } from "lucide-react"; +import { motion } from "framer-motion"; +import { usePreview } from "@/lib/use-preview"; +import temp1Obj from "@/templates/template1/temp1obj"; +import { ResumeTemplate } from "@/types/templateTypes"; + +const MobilePreviewButton = ({ item }: { item: ResumeTemplate }) => { + const preview = usePreview(); + const handlePreview = () => { + if (preview) { + preview.onOpen(item); + } + }; + + return ( + + {!preview.isOpen && } + + ); +}; + +export default MobilePreviewButton; diff --git a/components/Navbar.tsx b/components/Navbar.tsx new file mode 100644 index 0000000..6cea058 --- /dev/null +++ b/components/Navbar.tsx @@ -0,0 +1,147 @@ +"use client"; +import { ChevronDown, File, Menu, X } from "lucide-react"; +import { Button } from "./ui/button"; +import { SignInButton, SignUpButton, UserButton, useUser } from "@clerk/nextjs"; +import Link from "next/link"; +import { poppinsFont } from "@/lib/font"; +import { Skeleton } from "./ui/skeleton"; +import { useRouter } from "nextjs-toploader/app"; +import { useState } from "react"; +import { cn } from "@/lib/utils"; + +const Navbar = () => { + const { user, isLoaded, isSignedIn } = useUser(); + const router = useRouter(); + const [isMenuOpen, setIsMenuOpen] = useState(false); + + const toggleMenu = () => { + setIsMenuOpen(!isMenuOpen); + }; + + return ( + <> + {/* Backdrop */} + {isMenuOpen && ( +
    setIsMenuOpen(false)} + /> + )} + +
    +
    + {/* Logo Section */} +
    + + +

    + ResumeCraft +

    + +
    + + {/* Mobile Menu Button */} + + + {/* Loading State */} + {!isLoaded && ( +
    + + + +
    + )} + + {/* Desktop Navigation */} + {isSignedIn && ( +
    + +

    {user?.firstName}

    + +
    + )} + + {!isSignedIn && isLoaded && ( +
    + +
    + +
    +
    + )} +
    + +
    +
    + {isSignedIn ? ( + <> +
    + +

    {user?.firstName}

    +
    + + + ) : ( + isLoaded && ( +
    + +
    + +
    +
    + ) + )} +
    +
    +
    + + ); +}; + +export default Navbar; diff --git a/components/PreviewModal.tsx b/components/PreviewModal.tsx new file mode 100644 index 0000000..04529a7 --- /dev/null +++ b/components/PreviewModal.tsx @@ -0,0 +1,48 @@ +import { usePreview } from "@/lib/use-preview"; +import React from "react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "./ui/dialog"; +import { ResumeTemplate } from "@/types/templateTypes"; +import { + templateComponents, + TemplateComponentType, +} from "@/templates/templateStructures"; + +const PreviewModal = () => { + const preview = usePreview(); + + const TemplateComponent: TemplateComponentType | null = + preview?.currentTemplate + ? templateComponents[preview?.currentTemplate.templateName] + : null; + + if (!TemplateComponent) return null; + + return ( + + + + +
    + {TemplateComponent && preview.currentTemplate && ( + + )} +
    +
    +
    +
    +
    + ); +}; + +export default PreviewModal; diff --git a/components/QuillEditors/QuillEditor.tsx b/components/QuillEditors/QuillEditor.tsx new file mode 100644 index 0000000..f2db708 --- /dev/null +++ b/components/QuillEditors/QuillEditor.tsx @@ -0,0 +1,57 @@ +"use client"; +import React, { useState } from "react"; +import dynamic from "next/dynamic"; +import "react-quill/dist/quill.snow.css"; +import { motion } from "framer-motion"; +import axios from "axios"; +import toast from "react-hot-toast"; +import { poppinsFont } from "@/lib/font"; +import { Label } from "../ui/label"; + +const QuillEditor = dynamic(() => import("react-quill"), { ssr: false }); + +interface QuillEditorComponentProps { + value: string; + onChange: (content: string) => void; + label: string; + currentFormat?: string; + placeholder?: string; +} + +export default function QuillEditorComponent({ + value, + onChange, + label, + currentFormat, + placeholder +}: QuillEditorComponentProps) { + + + const quillModules = { + toolbar: [ + ["bold", "italic", "underline"], + [{ list: "ordered" }, { list: "bullet" }, { list: "check" }], + ["link"], + ], + }; + + const quillFormats = ["bold", "italic", "underline", "list", "bullet","link"]; + + return ( + + + + + ); +} diff --git a/components/QuillEditors/QuillExp.tsx b/components/QuillEditors/QuillExp.tsx new file mode 100644 index 0000000..5d583f8 --- /dev/null +++ b/components/QuillEditors/QuillExp.tsx @@ -0,0 +1,178 @@ +"use client"; +import React, { useState } from "react"; +import dynamic from "next/dynamic"; +import "react-quill/dist/quill.snow.css"; +import { motion } from "framer-motion"; +import { LinkIcon, Loader2, WandSparkles } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import axios from "axios"; +import { Button } from "../ui/button"; +import { Label } from "../ui/label"; +import toast from "react-hot-toast"; + +const QuillEditor = dynamic(() => import("react-quill"), { ssr: false }); + +interface QuillEditorComponentProps { + value: string; + onChange: (content: string) => void; + label: string; + companyName: string; + role: string; +} + +export default function QuillExpEditor({ + value, + onChange, + label, + companyName, + role, +}: QuillEditorComponentProps) { + const [generatedContent, setGeneratedContent] = useState(""); + const [tempValue, setTempValue] = useState(""); + const [loading, setLoading] = useState(false); + const [dialogIsOpen, setDialogIsOpen] = useState(false); + + const quillModules = { + toolbar: [ + ["bold", "italic", "underline"], + [{ list: "ordered" }, { list: "bullet" }], + ["link"], // Add link button to toolbar + ], + }; + + const quillFormats = ["bold", "italic", "underline", "list", "bullet","link"]; + + const handleGenerate = async () => { + try { + setLoading(true); + const response = await axios.post( + `${process.env.NEXT_PUBLIC_WEBSITE_URL}/api/generateJD`, + { companyName: companyName, role: role, jobDescription: tempValue } + ); + const listItems = response.data.textArray + .map((item: string) => `
  • ${item}
  • `) + .join(""); + const generatedHtml = `
      ${listItems}
    `; + setGeneratedContent(generatedHtml); + setLoading(false); + } catch (error) { + console.log(error); + toast.error("Something went wrong Quill Experience"); + } + }; + + const continueData = () => { + onChange(generatedContent); + setTempValue(""); + setGeneratedContent(""); + setDialogIsOpen(false); + }; + + const cancelData = () => { + setDialogIsOpen(false); + setGeneratedContent(""); + }; + + return ( + +
    + + + +
    + + +
    + + + + + + Write ATS friendly, professional job descriptions with our AI + + + Enter your experience details in the text area provided. Click + 'Generate Description' to refine and enhance your input. If you + leave the text area blank and click 'Generate Description', our + AI will create experience points based on the job title. + +
    + + {loading ? ( + + ) : ( + <> + {!generatedContent ? ( + + ) : ( +
    + + +
    + )} + + )} +
    +
    +
    +
    +
    + +
    + ); +} diff --git a/components/QuillEditors/QuillProject.tsx b/components/QuillEditors/QuillProject.tsx new file mode 100644 index 0000000..fd7c86c --- /dev/null +++ b/components/QuillEditors/QuillProject.tsx @@ -0,0 +1,171 @@ +"use client"; +import React, { useState } from "react"; +import dynamic from "next/dynamic"; +import "react-quill/dist/quill.snow.css"; +import { motion } from "framer-motion"; +import { Loader2, WandSparkles } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import axios from "axios"; +import { Button } from "../ui/button"; +import { Label } from "../ui/label"; +import toast from "react-hot-toast"; + +const QuillEditor = dynamic(() => import("react-quill"), { ssr: false }); + +interface QuillEditorComponentProps { + value: string; + onChange: (content: string) => void; + label: string; + projectTitle: string; +} + +export default function QuillProjectEditor({ + value, + onChange, + label, + projectTitle, +}: QuillEditorComponentProps) { + const [generatedContent, setGeneratedContent] = useState(""); + const [loading, setLoading] = useState(false); + const [dialogIsOpen, setDialogIsOpen] = useState(false); + const [tempValue, setTempValue] = useState(""); + + const quillModules = { + toolbar: [ + ["bold", "italic", "underline"], + [{ list: "ordered" }, { list: "bullet" }], + ["link"], + ], + }; + + const quillFormats = ["bold", "italic", "underline", "list", "bullet","link"]; + + const handleGenerate = async () => { + try { + setLoading(true); + const response = await axios.post( + `${process.env.NEXT_PUBLIC_WEBSITE_URL}/api/generatePD`, + { projectTitle: projectTitle, projectDescription: tempValue } + ); + const listItems = response.data.textArray + .map((item: string) => `
  • ${item}
  • `) + .join(""); + const generatedHtml = `
      ${listItems}
    `; + setGeneratedContent(generatedHtml); + setLoading(false); + } catch (error) { + toast.error("Something went wrong Quill Project"); + } + }; + + const continueData = () => { + onChange(generatedContent); + setTempValue(""); + setGeneratedContent(""); + setDialogIsOpen(false); + }; + + const cancelData = () => { + setDialogIsOpen(false); + setGeneratedContent(""); + }; + + return ( + +
    + + + + + + + + + Write ATS friendly, project descriptions with our AI + + + Compose your description in the text area provided. Select + 'Generate Description' to enhance your writing. If you leave the + text area empty and click 'Generate Description', our AI will + create a description for you based on the title. + +
    + + {loading ? ( + + ) : ( + <> + {!generatedContent ? ( + + ) : ( +
    + + +
    + )} + + )} +
    +
    +
    +
    +
    + +
    + ); +} diff --git a/components/SectionInfo.tsx b/components/SectionInfo.tsx new file mode 100644 index 0000000..4033d0e --- /dev/null +++ b/components/SectionInfo.tsx @@ -0,0 +1,29 @@ +"use client"; +import { cn } from "@/lib/utils"; +import React from "react"; +import { motion } from "framer-motion"; +import { item } from "@/lib/motion"; +import { poppinsFont } from "@/lib/font"; + +interface SectionInfoTypes { + heading: string; + text: string; +} + +const SectionInfo = ({ heading, text }: SectionInfoTypes) => { + return ( + +

    + {heading} +

    +

    {text}

    +
    + ); +}; + +export default SectionInfo; diff --git a/components/SocialLinkField.tsx b/components/SocialLinkField.tsx new file mode 100644 index 0000000..811e3ba --- /dev/null +++ b/components/SocialLinkField.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Github, Linkedin, Globe, Twitter, Instagram, Link } from 'lucide-react'; + +interface SocialLinkFieldProps { + value: { type: string; url: string }; + onChange: (value: { type: string; url: string }) => void; + onRemove: () => void; +} + +const socialOptions = [ + { value: 'github', label: 'GitHub', icon: Github }, + { value: 'linkedin', label: 'LinkedIn', icon: Linkedin }, + { value: 'portfolio', label: 'Portfolio', icon: Globe }, + { value: 'twitter', label: 'Twitter', icon: Twitter }, + { value: 'instagram', label: 'Instagram', icon: Instagram }, + { value: 'other', label: 'Other', icon: Link }, +]; + +const SocialLinkField: React.FC = ({ value, onChange, onRemove }) => { + const handleTypeChange = (newType: string) => { + onChange({ ...value, type: newType }); + }; + + const handleUrlChange = (e: React.ChangeEvent) => { + onChange({ ...value, url: e.target.value }); + }; + + const selectedOption = socialOptions.find(option => option.value === value.type) || socialOptions[socialOptions.length - 1]; + const Icon = selectedOption.icon; + + return ( +
    +
    + + +
    +
    + +
    + + +
    +
    + +
    + ); +}; + +export default SocialLinkField; \ No newline at end of file diff --git a/components/TipsSkeleton.tsx b/components/TipsSkeleton.tsx new file mode 100644 index 0000000..c4a8a26 --- /dev/null +++ b/components/TipsSkeleton.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import { Skeleton } from "./ui/skeleton"; + +const TipsSkeleton = () => { + return ( +
    +
    +
    + +
    + +
    + + +
    +
    +
    + + {/* BUTTONS DIV */} +
    + + +
    +
    +
    + ); +}; + +export default TipsSkeleton; diff --git a/components/VerticalTimeline.tsx b/components/VerticalTimeline.tsx new file mode 100644 index 0000000..712d775 --- /dev/null +++ b/components/VerticalTimeline.tsx @@ -0,0 +1,169 @@ +import React, { useEffect, useState } from "react"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { useQuery } from "convex/react"; +import { + Baseline, + Brain, + FolderKanban, + GraduationCap, + LineChart, + PenToolIcon, + User, +} from "lucide-react"; +import { + redirect, + useParams, + usePathname, + useSearchParams, +} from "next/navigation"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "./ui/tooltip"; +import Link from "next/link"; +import { Button } from "./ui/button"; +import { useRouter } from "nextjs-toploader/app"; + +const Timeline = () => { + const params = useParams(); + const router = useRouter(); + const resumeId = params.id; + const [isMobile, setIsMobile] = useState(false); + + const resume = useQuery(api.resume.getTemplateDetails, { + id: resumeId as Id<"resumes">, + }); + + const pathname = usePathname(); + const currentSec = pathname.split("section/")[1]; + + const searchParams = useSearchParams(); + const sec = searchParams.get("sec"); + + useEffect(() => { + const checkMobile = () => { + setIsMobile(window.innerWidth <= 768); + }; + + checkMobile(); + window.addEventListener("resize", checkMobile); + return () => window.removeEventListener("resize", checkMobile); + }, []); + + let sectionArray: string[] = []; + resume?.sections?.map((item) => { + item.type !== "custom" && sectionArray.push(item.type); + }); + sectionArray.push("custom"); + sectionArray.push("final"); + + const sectionIconMap: any = { + header: User, + experience: LineChart, + education: GraduationCap, + skills: Brain, + projects: FolderKanban, + final: Baseline, + custom: PenToolIcon, + }; + + const TimelineItem = ({ + section, + index, + total, + }: { + section: string; + index: number; + total: number; + }) => { + const SectionIcon = sectionIconMap[section]; + + return ( +
    +
    + + + + +
    +
    + +
    +
    + +
    + +

    {section}

    +
    +
    +
    +
    +
    +
    + ); + }; + + return ( +
    + +
    +
    +
    + {sectionArray.map((section, index) => ( + + ))} +
    +
    +
    + ); +}; + +export default Timeline; \ No newline at end of file diff --git a/components/forms/CustomForm.tsx b/components/forms/CustomForm.tsx new file mode 100644 index 0000000..1909752 --- /dev/null +++ b/components/forms/CustomForm.tsx @@ -0,0 +1,138 @@ +import { Id } from "@/convex/_generated/dataModel"; +import React, { useEffect, useMemo, useRef, useState } from "react"; +import { Label } from "../ui/label"; +import { Input } from "../ui/input"; +import QuillEditorComponent from "../QuillEditors/QuillEditor"; +import { Button } from "../ui/button"; +import { debounce } from "lodash"; +import { useMutation, useQuery } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import { XIcon } from "lucide-react"; + +const CustomForm = ({ + resumeId, + styles, + item, +}: { + resumeId: Id<"resumes">; + styles: string; + item: string; +}) => { + interface SectionItem { + sectionTitle: string; + sectionDescription: string; + sectionNumber: number; + } + + const [sectionsContent, setSectionsContent] = useState([ + { sectionTitle: "", sectionDescription: "", sectionNumber: 1 }, + ]); + const update = useMutation(api.resume.updateCustomSection); + const removeSectionUpdate = useMutation(api.resume.removeCustomSection); + const pendingChangesRef = useRef(false); + + const handleAddSection = () => { + setSectionsContent([ + ...sectionsContent, + { + sectionTitle: "", + sectionDescription: "", + sectionNumber: sectionsContent.length + 1, + }, + ]); + }; + + const debouncedUpdate = useMemo(() => { + return debounce((newSection: SectionItem[], index: number) => { + update({ id: resumeId, content: newSection[index] }); + pendingChangesRef.current = false; + }, 400); + }, [update, resumeId]); + + const handleTitleChange = (index: number, value: string) => { + pendingChangesRef.current = true; + setSectionsContent((prev) => { + const updatedSections = [...prev]; + updatedSections[index].sectionTitle = value; + debouncedUpdate(updatedSections, index); + return updatedSections; + }); + }; + + const handleDescriptionChange = (index: number, value: string) => { + pendingChangesRef.current = true; + setSectionsContent((prev) => { + const updatedSections = [...prev]; + updatedSections[index].sectionDescription = value; + debouncedUpdate(updatedSections, index); + return updatedSections; + }); + }; + + const initialData = useQuery(api.resume.getCustomSections, { id: resumeId }); + useEffect(() => { + if (initialData && initialData.length > 0 && !pendingChangesRef.current) { + const modified: any[] = initialData.map((item) => item.content); + setSectionsContent(modified); + } + }, [initialData]); + + const debouncedRemoveUpdate = useMemo(() => { + return debounce((toRemoveSectionNumber: number) => { + removeSectionUpdate({ + id: resumeId, + sectionNumber: toRemoveSectionNumber, + }); + }, 400); + }, [removeSectionUpdate, resumeId]); + + const removeSection = (index: number) => { + const removedSection = sectionsContent.find( + (section) => section.sectionNumber === index + ); + const toRemoveSectionNumber = removedSection?.sectionNumber; + const filteredContent = sectionsContent.filter((_, i) => i + 1 !== index); + debouncedRemoveUpdate(toRemoveSectionNumber || 0); + setSectionsContent(filteredContent); + }; + + return ( +
    + {sectionsContent.map((section, index) => ( +
    +
    + + {index !== 0 && ( + removeSection(index + 1)} + className="mr-4 cursor-pointer" + width={16} + /> + )} +
    + handleTitleChange(index, e.target.value)} + /> +
    + handleDescriptionChange(index, value)} + label="Section Description" + /> +
    +
    + ))} + +
    + ); +}; + +export default CustomForm; diff --git a/components/forms/CustomSectionForm.tsx b/components/forms/CustomSectionForm.tsx new file mode 100644 index 0000000..3c2c021 --- /dev/null +++ b/components/forms/CustomSectionForm.tsx @@ -0,0 +1,111 @@ +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { Id } from "@/convex/_generated/dataModel"; +import { debounce } from "lodash"; +import { useMutation } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import QuillEditorComponent from "../QuillEditors/QuillEditor"; +import { Input } from "../ui/input"; +import { Label } from "../ui/label"; +import { Button } from "../ui/button"; +import { XIcon } from "lucide-react"; + +interface SectionItem { + sectionTitle: string; + sectionDescription: string; + sectionNumber: number; +} + +interface SkillsFormProps { + item: any; + resumeId: Id<"resumes">; + styles: any; +} + +const SkillsForm: React.FC = ({ item, resumeId, styles }) => { + const initialSection: SectionItem = { + sectionTitle: "", + sectionDescription: "", + sectionNumber: 0, + }; + + const [sectionContent, setSectionContent] = useState([initialSection]); + const pendingChangesRef = useRef(false); + const update = useMutation(api.resume.updateCustomSection); + + const debouncedUpdate = useMemo(() => { + return debounce((newSection: SectionItem[], index: number) => { + update({ id: resumeId, content: newSection[index] }); + pendingChangesRef.current = false; + }, 400); + }, [update, resumeId]); + + const handleChange = useCallback( + (index: number, field: keyof SectionItem, value: string | boolean) => { + pendingChangesRef.current = true; + setSectionContent((prev) => { + const newSectionContent = prev.map((section, i) => + i === index ? { ...section, [field]: value } : section + ); + debouncedUpdate(newSectionContent, index); + return newSectionContent; + }); + }, + [debouncedUpdate] + ); + + useEffect(() => { + if (!pendingChangesRef.current && item?.content) { + setSectionContent(item.content.length > 0 ? item.content : [initialSection]); + } + }, [item?.content]); + + const addNewSection = () => { + setSectionContent((prev) => [...prev, { ...initialSection, sectionNumber: prev.length }]); + }; + + const removeSection = useCallback((index: number) => { + setSectionContent((prev) => { + const newContent = prev.filter((_, i) => i !== index).map((section, i) => ({ + ...section, + sectionNumber: i, + })); + debouncedUpdate(newContent, index); + return newContent; + }); + }, [debouncedUpdate]); + + return ( +
    + {sectionContent.map((section, index) => ( +
    +
    + + {index !== 0 && removeSection(index)} className="mr-4 cursor-pointer" width={16}/>} +
    + handleChange(index, "sectionTitle", e.target.value)} + value={section.sectionTitle} + placeholder="Section Title" + className="w-full mt-2 border border-muted-foreground" + /> +
    + handleChange(index, "sectionDescription", content)} + label="Section Description" + /> +
    +
    + ))} + +
    + ); +}; + +export default SkillsForm; \ No newline at end of file diff --git a/components/forms/EducationForm.tsx b/components/forms/EducationForm.tsx new file mode 100644 index 0000000..9ac732d --- /dev/null +++ b/components/forms/EducationForm.tsx @@ -0,0 +1,329 @@ +"use client"; + +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { Label } from "../ui/label"; +import { Input } from "../ui/input"; +import debounce from "lodash/debounce"; +import { useMutation } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { Button } from "../ui/button"; +import { motion } from "framer-motion"; +import "react-date-picker/dist/DatePicker.css"; +import "react-calendar/dist/Calendar.css"; +import { EducationSection } from "@/types/templateTypes"; +import { Checkbox } from "../ui/checkbox"; +import { XIcon } from "lucide-react"; + +interface EducationItem { + courseName: string; + instituteName: string; + location: string; + grade: string; + startMonth: string; + startYear: string; + endMonth: string; + endYear: string; + studyingHere: boolean; +} + +interface EducationContent { + education: EducationItem[]; +} + +interface EducationFormProps { + item: EducationSection; + resumeId: Id<"resumes">; +} + +const EducationForm: React.FC = ({ item, resumeId }) => { + const emptyEducation: EducationItem = { + courseName: "", + instituteName: "", + location: "", + grade: "", + startMonth: "", + startYear: "", + endMonth: "", + endYear: "", + studyingHere: false, + }; + + const [education, setEducation] = useState({ + education: [], + }); + const pendingChangesRef = useRef(false); + const update = useMutation(api.resume.updateEducation); + + useEffect(() => { + if (!pendingChangesRef.current) { + setEducation(item?.content as EducationContent); + } + }, [item?.content, pendingChangesRef]); + + const debouncedUpdate = useMemo(() => { + return debounce((newEducation: EducationContent) => { + update({ id: resumeId, content: newEducation }); + pendingChangesRef.current = false; + }, 400); + }, [update, resumeId]); + + const handleChange = useCallback( + (index: number) => (name: keyof EducationItem, value: string | boolean) => { + pendingChangesRef.current = true; + setEducation((prevEducation) => { + const newEducation = { ...prevEducation }; + const updatedItem = { ...newEducation.education[index] }; + + if (name === "studyingHere") { + updatedItem.studyingHere = value as boolean; + if (updatedItem.studyingHere) { + updatedItem.endMonth = ""; + updatedItem.endYear = "Present"; + } + } else { + updatedItem[name] = value as string; + } + + newEducation.education[index] = updatedItem; + debouncedUpdate(newEducation); + return newEducation; + }); + }, + [debouncedUpdate] + ); + + const addEducation = () => { + setEducation((prev) => ({ + education: [...prev.education, emptyEducation], + })); + }; + + const removeEducation = useCallback( + (index: number) => { + setEducation((prev) => { + const newEducation = { + ...prev, + education: prev.education.filter((_, i) => i !== index), + }; + debouncedUpdate(newEducation); + return newEducation; + }); + }, + [debouncedUpdate] + ); + + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ]; + const currentYear = new Date().getFullYear(); + const years = Array.from({ length: 30 }, (_, i) => + (currentYear - i).toString() + ); + + return ( +
    + {education?.education?.map((item, index) => ( + + {index !== 0 && ( + removeEducation(index)} + className="right-8 top-4 absolute cursor-pointer" + /> + )} +
    + + + + + + + + + + + handleChange(index)("studyingHere", checked) + } + /> + + +
    +
    + ))} + + + +
    + ); +}; + +interface InputFieldProps { + label: string; + name: keyof EducationItem; + value: string; + onChange: (name: keyof EducationItem, value: string) => void; + placeholder: string; + type?: "text" | "select"; + options?: string[]; + disabled?: boolean; +} + +const InputField: React.FC = ({ + label, + name, + value, + onChange, + placeholder, + type = "text", + options, + disabled = false, +}) => ( + + + {type === "select" ? ( + + ) : ( + onChange(name, e.target.value)} + placeholder={placeholder} + className="border bg-[#FFF5F5] border-muted-foreground" + disabled={disabled} + /> + )} + +); + +export default EducationForm; diff --git a/components/forms/ExperienceForm.tsx b/components/forms/ExperienceForm.tsx new file mode 100644 index 0000000..220bbd2 --- /dev/null +++ b/components/forms/ExperienceForm.tsx @@ -0,0 +1,330 @@ +import { api } from "@/convex/_generated/api"; +import { Id } from "@/convex/_generated/dataModel"; +import { useMutation } from "convex/react"; +import { debounce } from "lodash"; +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { Label } from "../ui/label"; +import { Input } from "../ui/input"; +import QuillExpEditor from "../QuillEditors/QuillExp"; +import { motion } from "framer-motion"; +import { Button } from "../ui/button"; +import { Checkbox } from "../ui/checkbox"; +import { XIcon } from "lucide-react"; + +interface ExperienceItem { + companyName: string; + role: string; + jobDescription: string; + location: string; + startMonth: string; + startYear: string; + endMonth: string; + endYear: string; + workingHere: boolean; +} + +interface ExperienceContent { + experience: ExperienceItem[]; +} + +const emptyExperienceItem: ExperienceItem = { + companyName: "", + role: "", + jobDescription: "", + location: "", + startMonth: "", + startYear: "", + endMonth: "", + endYear: "", + workingHere: false, +}; + +const ExperienceForm = ({ + resumeId, + item, +}: { + resumeId: Id<"resumes">; + item: any; +}) => { + const pendingChangesRef = useRef(false); + const [experience, setExperience] = useState({ + experience: [], + }); + const update = useMutation(api.resume.updateExperience); + + useEffect(() => { + if (!pendingChangesRef.current) { + setExperience(item?.content); + } + }, [item?.content, pendingChangesRef]); + + const debouncedUpdate = useMemo(() => { + return debounce((newExperience: ExperienceContent) => { + update({ id: resumeId, content: newExperience }); + pendingChangesRef.current = false; + }, 400); + }, [update, resumeId]); + + const handleChange = useCallback( + (index: number) => + (name: keyof ExperienceItem, value: string | boolean) => { + pendingChangesRef.current = true; + setExperience((prevExperience) => { + const newExperience = { ...prevExperience }; + const updatedItem = { ...newExperience.experience[index] }; + + if (name === "workingHere") { + updatedItem.workingHere = value as boolean; + if (updatedItem.workingHere) { + updatedItem.endMonth = ""; + updatedItem.endYear = "Present"; + } + } else { + updatedItem[name] = value as string; + } + newExperience.experience[index] = updatedItem; + debouncedUpdate(newExperience); + return newExperience; + }); + }, + [debouncedUpdate] + ); + + const addExperience = () => { + setExperience((prev) => ({ + experience: [...prev.experience, emptyExperienceItem], + })); + }; + + const removeEducation = useCallback( + (index: number) => { + setExperience((prev) => { + const newExperience = { + ...prev, + experience: prev.experience.filter((_, i) => i !== index), + }; + debouncedUpdate(newExperience); + return newExperience; + }); + }, + [debouncedUpdate] + ); + + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "July", + "Aug", + "Sept", + "Oct", + "Nov", + "Dec", + ]; + const currentYear = new Date().getFullYear(); + const years = Array.from({ length: 30 }, (_, i) => + (currentYear - i).toString() + ); + + return ( + <> + {experience.experience.map((exp, index) => ( + + {index !== 0 && ( + removeEducation(index)} + className="right-8 top-4 absolute cursor-pointer" + /> + )} +
    + + + + + + + + + + handleChange(index)("workingHere", checked) + } + /> + + +
    +
    + + handleChange(index)("jobDescription", content) + } + /> +
    +
    + ))} + + + + + ); +}; + +interface InputFieldProps { + label: string; + name: keyof ExperienceItem; + value: string; + onChange: (name: keyof ExperienceItem, value: string) => void; + placeholder: string; + type?: string; + options?: string[]; + disabled?: boolean; +} + +const InputField: React.FC = ({ + label, + name, + value, + onChange, + placeholder, + type = "text", + options, + disabled = false, +}) => ( + + + {type === "select" ? ( + + ) : ( + onChange(name, e.target.value)} + placeholder={placeholder} + className="border bg-[#FFF5F5] border-muted-foreground" + disabled={disabled} + /> + )} + +); + +export default ExperienceForm; diff --git a/components/forms/HeaderForm.tsx b/components/forms/HeaderForm.tsx new file mode 100644 index 0000000..1b16ebf --- /dev/null +++ b/components/forms/HeaderForm.tsx @@ -0,0 +1,300 @@ +import { api } from "@/convex/_generated/api"; +import { Doc, Id } from "@/convex/_generated/dataModel"; +import { useMutation, useQuery } from "convex/react"; +import { debounce } from "lodash"; +import React, { + ChangeEvent, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import QuillEditorComponent from "../QuillEditors/QuillEditor"; +import { motion } from "framer-motion"; +import { Label } from "../ui/label"; +import { Input } from "../ui/input"; +import { HeaderSection } from "@/types/templateTypes"; +import { + Github, + Globe, + Link, + Linkedin, + Plus, + Twitter, + XIcon, +} from "lucide-react"; + +interface SocialLink { + type: string; + name: string; + url: string; +} + +interface HeaderContent { + firstName: string; + lastName: string; + email: string; + phone: string; + location: string; + summary: string; + socialLinks: SocialLink[]; +} + +const initialHeader: HeaderContent = { + firstName: "", + lastName: "", + email: "", + phone: "", + location: "", + summary: "", + socialLinks: [], +}; + +const HeaderForm = ({ + resumeId, + item, +}: { + resumeId: Id<"resumes">; + item: HeaderSection; +}) => { + const [header, setHeader] = useState(initialHeader); + const [activeLink, setActiveLink] = useState(""); + const [activeLinkValue, setActiveLinkValue] = useState(""); + + const update = useMutation(api.resume.updateHeader); + const pendingChangesRef = useRef(false); + + useEffect(() => { + if (item?.content && !pendingChangesRef.current) { + setHeader(item.content as HeaderContent); + console.log(item.content); + } + }, [item?.content, pendingChangesRef]); + + const debouncedUpdate = useMemo(() => { + return debounce((newHeader: HeaderContent) => { + update({ id: resumeId, content: newHeader }); + pendingChangesRef.current = false; + }, 400); + }, [update, resumeId]); + + const handleChange = useCallback( + (e: ChangeEvent | string) => { + pendingChangesRef.current = true; + setHeader((prevHeader) => { + let newHeader; + if (typeof e === "string") { + newHeader = { ...prevHeader, summary: e }; + } else { + newHeader = { ...prevHeader, [e.target.name]: e.target.value }; + } + debouncedUpdate(newHeader); + return newHeader; + }); + }, + [debouncedUpdate] + ); + + const handleSocialChange = useCallback( + (index: number, name: string, value: string) => { + pendingChangesRef.current = true; + setHeader((prevHeader) => { + const newSocialLinks = [...prevHeader.socialLinks]; + newSocialLinks[index] = { ...newSocialLinks[index], [name]: value }; + const newHeader = { ...prevHeader, socialLinks: newSocialLinks }; + debouncedUpdate(newHeader); + return newHeader; + }); + }, + [debouncedUpdate] + ); + + const handleAddSocialLink = useCallback( + (type: string) => { + pendingChangesRef.current = true; + setHeader((prevHeader) => { + const existingLink = prevHeader.socialLinks.find( + (link) => link.type === type && link.type !== "other" + ); + if (existingLink) { + return prevHeader; + } + const newSocialLinks = [ + ...prevHeader.socialLinks, + { type, name: "", url: "" }, + ]; + const newHeader = { ...prevHeader, socialLinks: newSocialLinks }; + debouncedUpdate(newHeader); + return newHeader; + }); + }, + [debouncedUpdate] + ); + + const handleRemoveSocialLink = useCallback( + (index: number) => { + pendingChangesRef.current = true; + setHeader((prevHeader) => { + const newSocialLinks = [...prevHeader.socialLinks]; + const filteredArray = newSocialLinks.filter((_, i) => i !== index); + const newHeader = { ...prevHeader, socialLinks: filteredArray }; + debouncedUpdate(newHeader); + return newHeader; + }); + }, + [debouncedUpdate] + ); + + const socialOptions = [ + { value: "github", label: "GitHub", icon: Github }, + { value: "linkedin", label: "LinkedIn", icon: Linkedin }, + { value: "portfolio", label: "Portfolio", icon: Globe }, + { value: "twitter", label: "Twitter", icon: Twitter }, + { value: "other", label: "Other", icon: Link }, + ]; + + return ( + <> + +
    + + + + +
    + +
    +

    Social Links

    + {header?.socialLinks?.map((link, index) => ( +
    + + handleSocialChange(index, "name", e.target.value) + } + placeholder={`Enter ${link.type}`} + /> + + handleSocialChange(index, "url", e.target.value) + } + placeholder={`Enter your ${link.type} URL`} + /> + +
    + ))} +
    + +
    + {socialOptions.map((option) => ( + handleAddSocialLink(option.value)} + className={`flex items-center gap-2 bg-[#FFF5F5] shadow-sm shadow-primary/40 cursor-pointer border-2 ${ + header?.socialLinks?.some((link) => link.type === option.value) + ? "border-primary/60" + : "border-transparent hover:border-primary/60" + } transition duration-300 ease rounded-lg p-2`} + > + {option.label} + + ))} +
    + + {item?.content?.summary !== undefined && ( +
    + handleChange(content)} + /> +
    + )} +
    + + ); +}; + +interface InputFieldProps { + label: string; + name: keyof HeaderContent; + value: string; + onChange: (e: ChangeEvent) => void; + placeholder: string; + type?: string; + required?: boolean; +} + +const InputField: React.FC = ({ + label, + name, + value, + onChange, + placeholder, + type = "text", + required, +}) => ( + + + + +); + +export default HeaderForm; diff --git a/components/forms/ProjectForm.tsx b/components/forms/ProjectForm.tsx new file mode 100644 index 0000000..76343f7 --- /dev/null +++ b/components/forms/ProjectForm.tsx @@ -0,0 +1,215 @@ +import { Id } from "@/convex/_generated/dataModel"; +import React, { + ChangeEvent, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { Label } from "../ui/label"; +import { Input } from "../ui/input"; +import { useMutation } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import { debounce } from "lodash"; +import { Button } from "../ui/button"; +import { motion } from "framer-motion"; +import QuillProjectEditor from "../QuillEditors/QuillProject"; +import { ProjectSection } from "@/types/templateTypes"; +import { XIcon } from "lucide-react"; + +interface ProjectType { + name: string; + description: string; + githuburl: string; + liveurl: string; +} + +interface ProjectContent { + projects: ProjectType[]; +} + +const ProjectForm = ({ + resumeId, + item, +}: { + resumeId: Id<"resumes">; + item: ProjectSection; +}) => { + const emptyProject: ProjectType = { + name: "", + description: "", + githuburl: "", + liveurl: "", + }; + + const [projects, setProjects] = useState({ projects: [] }); + const pendingChangesRef = useRef(false); + const update = useMutation(api.resume.updateProjects); + + useEffect(() => { + if (!pendingChangesRef.current) { + setProjects(item?.content as ProjectContent); + } + }, [item?.content, pendingChangesRef]); + + const debouncedUpdate = useMemo(() => { + return debounce((newProject: ProjectContent) => { + update({ id: resumeId, content: newProject }); + pendingChangesRef.current = false; + }, 400); + }, [update, resumeId]); + + const handleChange = useCallback( + (index: number) => + ( + e: ChangeEvent | string, + field?: keyof ProjectType + ) => { + pendingChangesRef.current = true; + setProjects((prevProjects) => { + const newProject = { ...prevProjects }; + if (typeof e === "string" && field) { + newProject.projects[index][field] = e; + } else if (typeof e !== "string") { + newProject.projects[index][e.target.name as keyof ProjectType] = + e.target.value; + } + debouncedUpdate(newProject); + return newProject; + }); + }, + [debouncedUpdate] + ); + + const addProject = () => { + setProjects((prev) => ({ + ...prev, + projects: [...prev.projects, emptyProject], + })); + }; + + const removeProject = useCallback( + (index: number) => { + setProjects((prev) => { + const newProjects = { + ...prev, + projects: prev.projects.filter((_, i) => i !== index), + }; + debouncedUpdate(newProjects); + return newProjects; + }); + }, + [debouncedUpdate] + ); + + return ( + <> + {projects?.projects.map((item, index) => { + return ( +
    +
    + {index !== 0 && ( + removeProject(index)} + className="right-8 top-4 absolute cursor-pointer" + /> + )} +
    + + + +
    +
    + + handleChange(index)(content, "description") + } + /> +
    + + + + +
    + ); + })} + + ); +}; + +interface InputFieldProps { + label: string; + name: string; + value: string; + onChange: (e: ChangeEvent) => void; + placeholder: string; +} + +const InputField: React.FC = ({ + label, + name, + value, + onChange, + placeholder, +}) => { + return ( + + + + + ); +}; + +export default ProjectForm; diff --git a/components/forms/SkillsForm.tsx b/components/forms/SkillsForm.tsx new file mode 100644 index 0000000..7dc3d47 --- /dev/null +++ b/components/forms/SkillsForm.tsx @@ -0,0 +1,153 @@ +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import { Id } from "@/convex/_generated/dataModel"; +import { debounce, set } from "lodash"; +import { useMutation } from "convex/react"; +import { api } from "@/convex/_generated/api"; +import QuillEditorComponent from "../QuillEditors/QuillEditor"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Button } from "../ui/button"; + +const SkillsForm = ({ + item, + resumeId, + styles, +}: { + item: any; + resumeId: Id<"resumes">; + styles: any; +}) => { + const [skillDescription, setSkillDescription] = useState(""); + const [currentFormat, setCurrentFormat] = useState("paragraph"); + const pendingChangesRef = useRef(false); + const update = useMutation(api.resume.updateSkills); + + useEffect(() => { + if (!pendingChangesRef.current) { + setSkillDescription(item?.content?.description || ""); + } + }, [item?.content?.description]); + + const debouncedUpdate = useMemo( + () => + debounce((newSkills: string) => { + update({ id: resumeId, content: { description: newSkills } }); + pendingChangesRef.current = false; + }, 400), + [update, resumeId] + ); + + const handleChange = useCallback( + (description: string) => { + pendingChangesRef.current = true; + setSkillDescription(description); + debouncedUpdate(description); + }, + [debouncedUpdate] + ); + + const descriptionObj = [ + { + heading: "Full Stack Web Developer", + allDescriptions: [ + `Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.`, + `Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.`, + `DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.`, + `Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.`, + ], + }, + { + heading: "Data Scientist", + allDescriptions: [ + `Programming Languages: Python, R, SQL, Java.`, + `Data Analysis Tools: Pandas, NumPy, Scikit-learn, TensorFlow, PyTorch, Matplotlib, Seaborn.`, + `Databases: MySQL, PostgreSQL, MongoDB, Redis.`, + `Machine Learning: Regression, Classification, Clustering, Neural Networks, Natural Language Processing.`, + `Version Control & Tools: Git, GitHub, Jupyter, Anaconda, Docker. Testing: PyTest, Unittest.`, + ], + }, + { + heading: "DevOps Engineer", + allDescriptions: [ + `Tools & Platforms: Jenkins, Docker, Kubernetes, GitHub Actions, CircleCI, TravisCI.`, + `Cloud Services: AWS (EC2, S3, Lambda, CloudFormation), Azure, GCP.`, + `Automation & Monitoring: Terraform, Ansible, Nagios, Prometheus, Grafana.`, + `Version Control & Tools: Git, GitLab, GitHub, Bitbucket.`, + `Networking & Security: VPN, SSL, Firewalls, Load Balancing, AWS IAM.`, + ], + }, + { + heading: "Mobile App Developer", + allDescriptions: [ + `Languages & Frameworks: Swift, Kotlin, Java, React Native, Flutter, Dart.`, + `Mobile Development Tools: Xcode, Android Studio, Firebase, Realm, SQLite.`, + `Backend: REST APIs, GraphQL, Node.js, Express.js.`, + `Version Control & Tools: Git, GitHub, Bitbucket, Postman. Testing: Jest, Detox, Espresso.`, + `Deployment: App Store, Google Play, Fastlane.`, + ], + }, + ]; + + const handleSetDescription = (descriptions: string[]) => { + const combinedDescription = descriptions.join("
    "); + setSkillDescription(combinedDescription); + }; + + return ( + <> +
    + + +

    Tailor Your Skillset

    +

    + We recommend you take this only as a reference and personalize it by + adding your own unique skills. +

    + + {descriptionObj.map((item, index) => { + return ( + <> +
    +
    +
    handleSetDescription(item.allDescriptions)} + className="group-hover:flex items-center justify-center h-full hidden" + > + +
    +
    +
    +

    {item.heading}

    +

    + {item.allDescriptions.map((desc, index) => { + return ( +

  • + ); + })} +

    +
    +
    + + ); + })} +
    + + ); +}; + +export default SkillsForm; diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 0000000..d27984d --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,58 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + big_icon: + "bg-primary text-primary-foreground hover:bg-primary/90 !py-[25px] md:!py-[34px] px-8 text-sm md:text-base flex items-center gap-2 hover:gap-4 active:scale-[0.97] transition-all duration-300 ease-out", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + } +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/components/ui/checkbox.tsx b/components/ui/checkbox.tsx new file mode 100644 index 0000000..df61a13 --- /dev/null +++ b/components/ui/checkbox.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as CheckboxPrimitive from "@radix-ui/react-checkbox" +import { Check } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx new file mode 100644 index 0000000..d3ae524 --- /dev/null +++ b/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client"; + +import * as React from "react"; +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { X } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Dialog = DialogPrimitive.Root; + +const DialogTrigger = DialogPrimitive.Trigger; + +const DialogPortal = DialogPrimitive.Portal; + +const DialogClose = DialogPrimitive.Close; + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName; + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName; + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
    +); +DialogHeader.displayName = "DialogHeader"; + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
    +); +DialogFooter.displayName = "DialogFooter"; + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogTitle.displayName = DialogPrimitive.Title.displayName; + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DialogDescription.displayName = DialogPrimitive.Description.displayName; + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +}; diff --git a/components/ui/input.tsx b/components/ui/input.tsx new file mode 100644 index 0000000..4cc8e02 --- /dev/null +++ b/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/components/ui/label.tsx b/components/ui/label.tsx new file mode 100644 index 0000000..5341821 --- /dev/null +++ b/components/ui/label.tsx @@ -0,0 +1,26 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +) + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } diff --git a/components/ui/select.tsx b/components/ui/select.tsx new file mode 100644 index 0000000..d296850 --- /dev/null +++ b/components/ui/select.tsx @@ -0,0 +1,160 @@ +"use client" + +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className + )} + {...props} + > + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} diff --git a/components/ui/skeleton.tsx b/components/ui/skeleton.tsx new file mode 100644 index 0000000..01b8b6d --- /dev/null +++ b/components/ui/skeleton.tsx @@ -0,0 +1,15 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
    + ) +} + +export { Skeleton } diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000..236e353 --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client"; + +import * as React from "react"; +import * as TabsPrimitive from "@radix-ui/react-tabs"; + +import { cn } from "@/lib/utils"; + +const Tabs = TabsPrimitive.Root; + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsList.displayName = TabsPrimitive.List.displayName; + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName; + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsContent.displayName = TabsPrimitive.Content.displayName; + +export { Tabs, TabsList, TabsTrigger, TabsContent }; diff --git a/components/ui/tooltip.tsx b/components/ui/tooltip.tsx new file mode 100644 index 0000000..c3f4c7d --- /dev/null +++ b/components/ui/tooltip.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/convex/README.md b/convex/README.md new file mode 100644 index 0000000..4d82e13 --- /dev/null +++ b/convex/README.md @@ -0,0 +1,90 @@ +# Welcome to your Convex functions directory! + +Write your Convex functions here. +See https://docs.convex.dev/functions for more. + +A query function that takes two arguments looks like: + +```ts +// functions.js +import { query } from "./_generated/server"; +import { v } from "convex/values"; + +export const myQueryFunction = query({ + // Validators for arguments. + args: { + first: v.number(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Read the database as many times as you need here. + // See https://docs.convex.dev/database/reading-data. + const documents = await ctx.db.query("tablename").collect(); + + // Arguments passed from the client are properties of the args object. + console.log(args.first, args.second); + + // Write arbitrary JavaScript here: filter, aggregate, build derived data, + // remove non-public properties, or create new objects. + return documents; + }, +}); +``` + +Using this query function in a React component looks like: + +```ts +const data = useQuery(api.functions.myQueryFunction, { + first: 10, + second: "hello", +}); +``` + +A mutation function looks like: + +```ts +// functions.js +import { mutation } from "./_generated/server"; +import { v } from "convex/values"; + +export const myMutationFunction = mutation({ + // Validators for arguments. + args: { + first: v.string(), + second: v.string(), + }, + + // Function implementation. + handler: async (ctx, args) => { + // Insert or modify documents in the database here. + // Mutations can also read from the database like queries. + // See https://docs.convex.dev/database/writing-data. + const message = { body: args.first, author: args.second }; + const id = await ctx.db.insert("messages", message); + + // Optionally, return a value from your mutation. + return await ctx.db.get(id); + }, +}); +``` + +Using this mutation function in a React component looks like: + +```ts +const mutation = useMutation(api.functions.myMutationFunction); +function handleButtonPress() { + // fire and forget, the most common way to use mutations + mutation({ first: "Hello!", second: "me" }); + // OR + // use the result once the mutation has completed + mutation({ first: "Hello!", second: "me" }).then((result) => + console.log(result), + ); +} +``` + +Use the Convex CLI to push your functions to a deployment. See everything +the Convex CLI can do by running `npx convex -h` in your project root +directory. To learn more, launch the docs with `npx convex docs`. diff --git a/convex/_generated/api.d.ts b/convex/_generated/api.d.ts new file mode 100644 index 0000000..0b46fe9 --- /dev/null +++ b/convex/_generated/api.d.ts @@ -0,0 +1,37 @@ +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * Generated by convex@1.12.2. + * To regenerate, run `npx convex dev`. + * @module + */ + +import type { + ApiFromModules, + FilterApi, + FunctionReference, +} from "convex/server"; +import type * as resume from "../resume.js"; + +/** + * A utility for referencing Convex functions in your app's API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ +declare const fullApi: ApiFromModules<{ + resume: typeof resume; +}>; +export declare const api: FilterApi< + typeof fullApi, + FunctionReference +>; +export declare const internal: FilterApi< + typeof fullApi, + FunctionReference +>; diff --git a/convex/_generated/api.js b/convex/_generated/api.js new file mode 100644 index 0000000..ad3dfd2 --- /dev/null +++ b/convex/_generated/api.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +/** + * Generated `api` utility. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * Generated by convex@1.12.2. + * To regenerate, run `npx convex dev`. + * @module + */ + +import { anyApi } from "convex/server"; + +/** + * A utility for referencing Convex functions in your app's API. + * + * Usage: + * ```js + * const myFunctionReference = api.myModule.myFunction; + * ``` + */ +export const api = anyApi; +export const internal = anyApi; diff --git a/convex/_generated/dataModel.d.ts b/convex/_generated/dataModel.d.ts new file mode 100644 index 0000000..a935214 --- /dev/null +++ b/convex/_generated/dataModel.d.ts @@ -0,0 +1,61 @@ +/* eslint-disable */ +/** + * Generated data model types. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * Generated by convex@1.12.2. + * To regenerate, run `npx convex dev`. + * @module + */ + +import type { + DataModelFromSchemaDefinition, + DocumentByName, + TableNamesInDataModel, + SystemTableNames, +} from "convex/server"; +import type { GenericId } from "convex/values"; +import schema from "../schema.js"; + +/** + * The names of all of your Convex tables. + */ +export type TableNames = TableNamesInDataModel; + +/** + * The type of a document stored in Convex. + * + * @typeParam TableName - A string literal type of the table name (like "users"). + */ +export type Doc = DocumentByName< + DataModel, + TableName +>; + +/** + * An identifier for a document in Convex. + * + * Convex documents are uniquely identified by their `Id`, which is accessible + * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids). + * + * Documents can be loaded using `db.get(id)` in query and mutation functions. + * + * IDs are just strings at runtime, but this type can be used to distinguish them from other + * strings when type checking. + * + * @typeParam TableName - A string literal type of the table name (like "users"). + */ +export type Id = + GenericId; + +/** + * A type describing your Convex data model. + * + * This type includes information about what tables you have, the type of + * documents stored in those tables, and the indexes defined on them. + * + * This type is used to parameterize methods like `queryGeneric` and + * `mutationGeneric` to make them type-safe. + */ +export type DataModel = DataModelFromSchemaDefinition; diff --git a/convex/_generated/server.d.ts b/convex/_generated/server.d.ts new file mode 100644 index 0000000..3c75725 --- /dev/null +++ b/convex/_generated/server.d.ts @@ -0,0 +1,143 @@ +/* eslint-disable */ +/** + * Generated utilities for implementing server-side Convex query and mutation functions. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * Generated by convex@1.12.2. + * To regenerate, run `npx convex dev`. + * @module + */ + +import { + ActionBuilder, + HttpActionBuilder, + MutationBuilder, + QueryBuilder, + GenericActionCtx, + GenericMutationCtx, + GenericQueryCtx, + GenericDatabaseReader, + GenericDatabaseWriter, +} from "convex/server"; +import type { DataModel } from "./dataModel.js"; + +/** + * Define a query in this Convex app's public API. + * + * This function will be allowed to read your Convex database and will be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export declare const query: QueryBuilder; + +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export declare const internalQuery: QueryBuilder; + +/** + * Define a mutation in this Convex app's public API. + * + * This function will be allowed to modify your Convex database and will be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export declare const mutation: MutationBuilder; + +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export declare const internalMutation: MutationBuilder; + +/** + * Define an action in this Convex app's public API. + * + * An action is a function which can execute any JavaScript code, including non-deterministic + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. + * + * @param func - The action. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped action. Include this as an `export` to name it and make it accessible. + */ +export declare const action: ActionBuilder; + +/** + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export declare const internalAction: ActionBuilder; + +/** + * Define an HTTP action. + * + * This function will be used to respond to HTTP requests received by a Convex + * deployment if the requests matches the path and method where this action + * is routed. Be sure to route your action in `convex/http.js`. + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up. + */ +export declare const httpAction: HttpActionBuilder; + +/** + * A set of services for use within Convex query functions. + * + * The query context is passed as the first argument to any Convex query + * function run on the server. + * + * This differs from the {@link MutationCtx} because all of the services are + * read-only. + */ +export type QueryCtx = GenericQueryCtx; + +/** + * A set of services for use within Convex mutation functions. + * + * The mutation context is passed as the first argument to any Convex mutation + * function run on the server. + */ +export type MutationCtx = GenericMutationCtx; + +/** + * A set of services for use within Convex action functions. + * + * The action context is passed as the first argument to any Convex action + * function run on the server. + */ +export type ActionCtx = GenericActionCtx; + +/** + * An interface to read from the database within Convex query functions. + * + * The two entry points are {@link DatabaseReader.get}, which fetches a single + * document by its {@link Id}, or {@link DatabaseReader.query}, which starts + * building a query. + */ +export type DatabaseReader = GenericDatabaseReader; + +/** + * An interface to read from and write to the database within Convex mutation + * functions. + * + * Convex guarantees that all writes within a single mutation are + * executed atomically, so you never have to worry about partial writes leaving + * your data in an inconsistent state. See [the Convex Guide](https://docs.convex.dev/understanding/convex-fundamentals/functions#atomicity-and-optimistic-concurrency-control) + * for the guarantees Convex provides your functions. + */ +export type DatabaseWriter = GenericDatabaseWriter; diff --git a/convex/_generated/server.js b/convex/_generated/server.js new file mode 100644 index 0000000..d76b05a --- /dev/null +++ b/convex/_generated/server.js @@ -0,0 +1,90 @@ +/* eslint-disable */ +/** + * Generated utilities for implementing server-side Convex query and mutation functions. + * + * THIS CODE IS AUTOMATICALLY GENERATED. + * + * Generated by convex@1.12.2. + * To regenerate, run `npx convex dev`. + * @module + */ + +import { + actionGeneric, + httpActionGeneric, + queryGeneric, + mutationGeneric, + internalActionGeneric, + internalMutationGeneric, + internalQueryGeneric, +} from "convex/server"; + +/** + * Define a query in this Convex app's public API. + * + * This function will be allowed to read your Convex database and will be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export const query = queryGeneric; + +/** + * Define a query that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to read from your Convex database. It will not be accessible from the client. + * + * @param func - The query function. It receives a {@link QueryCtx} as its first argument. + * @returns The wrapped query. Include this as an `export` to name it and make it accessible. + */ +export const internalQuery = internalQueryGeneric; + +/** + * Define a mutation in this Convex app's public API. + * + * This function will be allowed to modify your Convex database and will be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export const mutation = mutationGeneric; + +/** + * Define a mutation that is only accessible from other Convex functions (but not from the client). + * + * This function will be allowed to modify your Convex database. It will not be accessible from the client. + * + * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument. + * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible. + */ +export const internalMutation = internalMutationGeneric; + +/** + * Define an action in this Convex app's public API. + * + * An action is a function which can execute any JavaScript code, including non-deterministic + * code and code with side-effects, like calling third-party services. + * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive. + * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}. + * + * @param func - The action. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped action. Include this as an `export` to name it and make it accessible. + */ +export const action = actionGeneric; + +/** + * Define an action that is only accessible from other Convex functions (but not from the client). + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument. + * @returns The wrapped function. Include this as an `export` to name it and make it accessible. + */ +export const internalAction = internalActionGeneric; + +/** + * Define a Convex HTTP action. + * + * @param func - The function. It receives an {@link ActionCtx} as its first argument, and a `Request` object + * as its second. + * @returns The wrapped endpoint function. Route a URL path to this function in `convex/http.js`. + */ +export const httpAction = httpActionGeneric; diff --git a/convex/auth.config.ts b/convex/auth.config.ts new file mode 100644 index 0000000..e712076 --- /dev/null +++ b/convex/auth.config.ts @@ -0,0 +1,8 @@ +export default { + providers: [ + { + domain: "https://sound-crab-61.clerk.accounts.dev/", + applicationID: "convex", + }, + ] + }; \ No newline at end of file diff --git a/convex/resume.ts b/convex/resume.ts new file mode 100644 index 0000000..8f486ce --- /dev/null +++ b/convex/resume.ts @@ -0,0 +1,700 @@ +import { v } from "convex/values"; +import { mutation, query } from "./_generated/server"; +import { + createSection, + templateStructures, +} from "../templates/templateStructures"; +import { ResumeTemplate, SocialLink } from "../types/templateTypes"; + +export const getTemplates = query({ + args: {}, + handler: async (ctx, args) => { + const resumes = await ctx.db + .query("resumes") + .filter((q) => q.eq(q.field("isTemplate"), true)) + .collect(); + + return resumes; + }, +}); + +export const getTemplateDetails = query({ + args: { + id: v.id("resumes"), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + return resume; + }, +}); + +export const updateHeader = mutation({ + args: { + id: v.id("resumes"), + content: v.object({ + firstName: v.string(), + lastName: v.optional(v.string()), + email: v.string(), + phone: v.optional(v.string()), + socialLinks: v.optional( + v.array( + v.object({ + name: v.string(), + url: v.string(), + type: v.string(), + }) + ) + ), + location: v.optional(v.string()), + summary: v.optional(v.string()), + }), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + const resumeSections = resume?.sections; + let index = resumeSections.findIndex((obj) => obj.type === "header"); + + if (index === -1) { + throw new Error("Somethign went wrong index"); + } else { + resumeSections[index].content = { + ...resumeSections[index].content, + ...args.content, + }; + } + + const newResume = await ctx.db.patch(args.id, { + sections: resumeSections, + }); + + return resumeSections; + }, +}); + +export const createUserResume = mutation({ + args: { + id: v.id("resumes"), + userId: v.string(), + templateName: v.string(), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + + if (!args.userId) { + throw new Error("Something went wrong...no userId"); + } + + if (!resume) { + throw new Error("Something went wrong"); + } + + const templateSections: any = templateStructures[args.templateName]; + if (!templateSections) { + throw new Error("Invalid template name"); + } + + const initialSections = templateSections.map((section: any) => + createSection( + section.type, + section.fields, + section.orderNumber, + section.isVisible + ) + ); + + const newResume = await ctx.db.insert("resumes", { + isTemplate: false, + userId: args.userId, + globalStyles: resume?.globalStyles!, + templateName: args?.templateName, + sections: initialSections, + }); + + return newResume; + }, +}); + +export const updateExperience = mutation({ + args: { + id: v.id("resumes"), + content: v.object({ + experience: v.array( + v.object({ + companyName: v.string(), + role: v.string(), + jobDescription: v.string(), + location: v.optional(v.string()), + startMonth: v.optional(v.string()), + startYear: v.string(), + endMonth: v.optional(v.string()), + endYear: v.string(), + workingHere: v.boolean(), + }) + ), + }), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + const resumeSections = resume?.sections; + let index = resumeSections.findIndex((item) => item.type === "experience"); + if (index === -1) { + throw new Error("Something went wrong index"); + } else { + resumeSections[index].content = { + ...resumeSections[index]?.content, + ...args.content, + }; + } + + const newResume = await ctx.db.patch(args.id, { + sections: resumeSections, + }); + return newResume; + }, +}); + +export const updateEducation = mutation({ + args: { + id: v.id("resumes"), + content: v.object({ + education: v.array( + v.object({ + courseName: v.string(), + instituteName: v.string(), + startMonth: v.optional(v.string()), + startYear: v.optional(v.string()), + endMonth: v.optional(v.string()), + endYear: v.optional(v.string()), + location: v.string(), + grade: v.optional(v.string()), + studyingHere: v.boolean(), + }) + ), + }), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + const resumeSections = resume?.sections; + let index = resumeSections.findIndex((item) => item.type === "education"); + if (index === -1) { + throw new Error("Something went wrong index"); + } else { + resumeSections[index].content = { + ...resumeSections[index]?.content, + ...args.content, + }; + } + await ctx.db.patch(args.id, { + sections: resumeSections, + }); + }, +}); + +export const updateCustomSection = mutation({ + args: { + id: v.id("resumes"), + content: v.object({ + sectionTitle: v.string(), + sectionDescription: v.string(), + sectionNumber: v.number(), + }), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + const resumeSections = resume?.sections; + const customSection = resumeSections.filter( + (item) => item.type === "custom" + ); + + const currentCustomSectionIndex = customSection.findIndex( + (item) => item.content.sectionNumber === args.content.sectionNumber + ); + + const allOrderNumbers: any = + resumeSections?.map((item) => item.orderNumber) || []; + const maxNumber = Math.max(...allOrderNumbers); + + if ( + args.content.sectionTitle.trim() === "" && + (args.content.sectionDescription.trim() === "


    " || + args.content.sectionDescription.trim() === "") + ) { + const updatedSections = resumeSections.filter( + (item) => + !( + item.type === "custom" && + item.content.sectionNumber === args.content.sectionNumber + ) + ); + return await ctx.db.patch(args.id, { + sections: updatedSections, + }); + } + + if (currentCustomSectionIndex === -1) { + resumeSections.push({ + type: "custom", + content: { + sectionTitle: args.content.sectionTitle, + sectionDescription: args.content.sectionDescription, + sectionNumber: args.content.sectionNumber, + }, + orderNumber: maxNumber + 1, + isVisible: true, + }); + await ctx.db.patch(args.id, { + sections: resumeSections, + }); + } else { + customSection[currentCustomSectionIndex].content = args.content; + await ctx.db.patch(args.id, { + sections: resumeSections, + }); + } + }, +}); + +export const removeCustomSection = mutation({ + args: { + id: v.id("resumes"), + sectionNumber: v.number(), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + + const resumeSections = resume?.sections; + const customSection = resumeSections.filter( + (item) => item.type === "custom" + ); + const currentCustomSection = customSection.find( + (item) => item.content.sectionNumber === args.sectionNumber + ); + + const orderNumberRemoved = currentCustomSection?.orderNumber; + + if (!orderNumberRemoved) { + throw new Error("Something went wrong"); + } + + const updatedCustomSections = resumeSections.filter( + (item) => item.orderNumber !== orderNumberRemoved + ); + + await ctx.db.patch(args.id, { + sections: updatedCustomSections, + }); + }, +}); + +export const updateSkills = mutation({ + args: { + id: v.id("resumes"), + content: v.object({ + description: v.string(), + }), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + const resumeSections = resume?.sections; + let index = resumeSections.findIndex((item) => item.type === "skills"); + if (index === -1) { + throw new Error("Something went wrong index"); + } else { + resumeSections[index].content = { + ...resumeSections[index].content, + ...args.content, + }; + } + const newResume = await ctx.db.patch(args.id, { + sections: resumeSections, + }); + + return newResume; + }, +}); + +export const updateProjects = mutation({ + args: { + id: v.id("resumes"), + content: v.object({ + projects: v.array( + v.object({ + name: v.string(), + description: v.string(), + githuburl: v.optional(v.string()), + liveurl: v.optional(v.string()), + }) + ), + }), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + const resumeSections = resume?.sections; + let projectsIndex = resumeSections.findIndex( + (item) => item.type === "projects" + ); + if (projectsIndex === -1) { + throw new Error("Projects section not found in resume"); + } else { + resumeSections[projectsIndex].content = { + ...resumeSections[projectsIndex].content, + ...args.content, + }; + } + + const newResume = await ctx.db.patch(args.id, { + sections: resumeSections, + }); + return newResume; + }, +}); + +export const updateColor = mutation({ + args: { + id: v.id("resumes"), + color: v.string(), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + const newGlobalStyles = { + ...resume.globalStyles, + primaryTextColor: args.color, + }; + const newResume = await ctx.db.patch(args.id, { + globalStyles: newGlobalStyles, + }); + return newResume; + }, +}); + +export const updateColorPC = mutation({ + args: { + id: v.id("resumes"), + color: v.string(), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + + const newGlobalStyles = { + ...resume.globalStyles, + primaryColor: args.color, + }; + const newResume = await ctx.db.patch(args.id, { + globalStyles: newGlobalStyles, + }); + return newResume; + }, +}); + +export const updateFont = mutation({ + args: { + id: v.id("resumes"), + font: v.string(), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Something went wrong"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + + const updatedResume = await ctx.db.patch(args.id, { + globalStyles: { + ...resume.globalStyles, + fontFamily: args.font, + }, + }); + + return updatedResume; + }, +}); + +export const getUserResumes = query({ + args: { + userId: v.string(), + }, + handler: async (ctx, args) => { + const resumes = await ctx.db + .query("resumes") + .filter((q) => q.eq(q.field("userId"), args.userId)) + .collect(); + + return resumes; + }, +}); + +export const getCustomSections = query({ + args: { + id: v.id("resumes"), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Resume not found"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + + const resumeSections = resume?.sections; + + const customSection = resumeSections.filter( + (item) => item.type === "custom" + ); + + return customSection; + }, +}); + +const SectionType = v.union( + v.literal("header"), + v.literal("skills"), + v.literal("projects"), + v.literal("experience"), + v.literal("education"), + v.literal("custom") +); + +export const reorderSections = mutation({ + args: { + id: v.id("resumes"), + updatedSections: v.any(), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Resume not found"); + } + + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + + const updatedResume = await ctx.db.patch(args.id, { + sections: args.updatedSections, + }); + return updatedResume; + }, +}); + +export const migrateResumes = mutation({ + args: {}, + handler: async (ctx, args) => { + const resumes = await ctx.db.query("resumes").collect(); + + for (const resume of resumes) { + const oldHeader: any = resume.sections.find( + (section) => section.type === "header" + ); + + if (oldHeader) { + const socialLinks: SocialLink[] = []; + + if (oldHeader.content.github) { + socialLinks.push({ + name: "GitHub", + type: "github", + url: `https://github.com/${oldHeader.content.github}`, + }); + } + + if (oldHeader.content.linkedin) { + socialLinks.push({ + name: "LinkedIn", + type: "linkedin", + url: oldHeader.content.linkedin, + }); + } + + const newHeader = { + ...oldHeader, + content: { + email: oldHeader.content.email, + firstName: oldHeader.content.firstName, + lastName: oldHeader.content.lastName, + phone: oldHeader.content.phone, + socialLinks, + }, + }; + + if (oldHeader.content.summary) { + newHeader.content.summary = oldHeader.content.summary; + } + + resume.sections = resume.sections.map((section) => + section.type === "header" ? newHeader : section + ); + + await ctx.db.patch(resume._id, { + sections: resume.sections, + }); + } + } + + return resumes; + }, +}); + + +export const hideSection = mutation({ + args: { + id: v.id("resumes"), + sectionId: v.string(), + }, + handler: async (ctx, args) => { + const resume = await ctx.db.get(args.id); + if (!resume) { + throw new Error("Resume not found"); + } + const identity = await ctx.auth.getUserIdentity(); + if (!identity) { + throw new Error("Not authenticated"); + } + + if (identity.subject !== resume.userId) { + throw new Error("Unauthorized"); + } + + const resumeSections = resume?.sections; + let index = resumeSections.findIndex((item) => item.type === args.sectionId); + if (index === -1) { + throw new Error("Something went wrong index"); + } else { + resumeSections[index].isVisible = !resumeSections[index].isVisible; + } + + const updatedResume = await ctx.db.patch(args.id, { + sections: resumeSections, + }); + + return updatedResume; + }, +}); \ No newline at end of file diff --git a/convex/schema.ts b/convex/schema.ts new file mode 100644 index 0000000..0dab9f8 --- /dev/null +++ b/convex/schema.ts @@ -0,0 +1,128 @@ + import { defineSchema, defineTable } from "convex/server"; + import { v } from "convex/values"; + + const sectionContentSchema = v.union( + v.object({ + type: v.literal("header"), + content: v.object({ + firstName: v.string(), + lastName: v.optional(v.string()), + email: v.string(), + phone: v.optional(v.string()), + location: v.optional(v.string()), + summary: v.optional(v.string()), + photo: v.optional(v.string()), + socialLinks : v.array( + v.object({ + type : v.string(), + name: v.string(), + url: v.string(), + }) + ) + }), + isVisible : v.boolean(), + orderNumber: v.optional(v.number()), + style: v.optional(v.any()), + }), + + v.object({ + type: v.literal("skills"), + content: v.object({ + description: v.string(), + }), + isVisible : v.boolean(), + orderNumber: v.optional(v.number()), + style: v.optional(v.any()), + }), + + v.object({ + type: v.literal("projects"), + content: v.object({ + projects: v.array( + v.object({ + name: v.string(), + description: v.string(), + githuburl: v.optional(v.string()), + liveurl: v.optional(v.string()), + }) + ), + }), + isVisible : v.boolean(), + orderNumber: v.optional(v.number()), + style: v.optional(v.any()), + }), + + v.object({ + type: v.literal("experience"), + content: v.object({ + experience: v.array( + v.object({ + companyName: v.string(), + role: v.string(), + jobDescription: v.string(), + location: v.optional(v.string()), + startMonth: v.optional(v.string()), + startYear: v.string(), + endMonth: v.optional(v.string()), + endYear: v.string(), + workingHere: v.boolean(), + }) + ), + }), + isVisible : v.boolean(), + orderNumber: v.optional(v.number()), + style: v.optional(v.any()), + }), + + v.object({ + type: v.literal("education"), + content: v.object({ + education: v.array( + v.object({ + courseName: v.string(), + instituteName: v.string(), + location: v.optional(v.string()), + startMonth: v.optional(v.string()), + startYear: v.optional(v.string()), + endMonth: v.optional(v.string()), + endYear: v.optional(v.string()), + studyingHere: v.boolean(), + grade: v.optional(v.string()), + }) + ), + }), + isVisible : v.boolean(), + orderNumber: v.optional(v.number()), + style: v.optional(v.any()), + }), + + v.object({ + type: v.literal("custom"), + content: v.object({ + sectionTitle: v.optional(v.string()), + sectionDescription: v.optional(v.string()), + sectionNumber : v.optional(v.number()), + }), + isVisible : v.boolean(), + orderNumber: v.optional(v.number()), + style: v.optional(v.any()), + }) + ); + + export default defineSchema({ + resumes: defineTable({ + isTemplate: v.boolean(), + userId: v.string(), + templateName: v.string(), + sections: v.array(sectionContentSchema), + globalStyles: v.object({ + fontFamily: v.string(), + primaryTextColor: v.string(), + primaryColor: v.string(), + photo: v.boolean(), + columns: v.number(), + }), + }), + }); + + diff --git a/convex/tsconfig.json b/convex/tsconfig.json new file mode 100644 index 0000000..6fa874e --- /dev/null +++ b/convex/tsconfig.json @@ -0,0 +1,25 @@ +{ + /* This TypeScript project config describes the environment that + * Convex functions run in and is used to typecheck them. + * You can modify it, but some settings required to use Convex. + */ + "compilerOptions": { + /* These settings are not required by Convex and can be modified. */ + "allowJs": true, + "strict": true, + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + + /* These compiler options are required by Convex */ + "target": "ESNext", + "lib": ["ES2021", "dom"], + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "isolatedModules": true, + "noEmit": true + }, + "include": ["./**/*"], + "exclude": ["./_generated"] +} diff --git a/lib/documents.jsonl b/lib/documents.jsonl new file mode 100644 index 0000000..c950a0b --- /dev/null +++ b/lib/documents.jsonl @@ -0,0 +1,37 @@ +{"_creationTime":1727527326415.1604,"_id":"j5702s1k3dqqqfymh6a0z5r65x71mvyr","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"Microsoft","endMonth":"","endYear":"","jobDescription":"
    • Developed and maintained key features for Microsoft's Azure platform, contributing to a 10% increase in user engagement and a 5% reduction in support tickets.
    • Collaborated with cross-functional teams to design and implement new software solutions, resulting in a 20% improvement in application performance and a 15% reduction in development time.
    • Leveraged expertise in cloud technologies and software development best practices to deliver high-quality, scalable applications, achieving a 99.9% uptime SLA for critical services.
    ","location":"","role":"Software Developer","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mfPvdV0LAJkDOnZ5QYsAzougsK"} +{"_creationTime":1727738980381.7708,"_id":"j570x1aenyeqjssf2dcwqg4t9n71rrzy","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"parisottohoracio@gmail.com","firstName":"Horacio","github":"johndoe676","lastName":"Parisotto","linkedin":"linkedin.com/johndoe","phone":"01140817173"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2moNS73zQ5ODONPRbBo2GlGGqzI"} +{"_creationTime":1727420986563.1978,"_id":"j5717p3w5r3x1a766285s861j971jkv7","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":true,"sections":[{"content":{"email":"john.doe@example.com","firstName":"JOHN","github":"johndoe","lastName":"DOE","linkedin":"john-doe","location":"New York, NY","phone":"+1-555-123-4567"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"Bachelor of Science in Computer Science","endMonth":"March","endYear":"2023","grade":"8.2 CGPA","instituteName":"University of California, Berkeley","location":"Berkeley, CA","startMonth":"Feb","startYear":"2022","studyingHere":false},{"courseName":"Master of Science in Software Engineering","endMonth":"Dec","endYear":"2022","grade":"8.2 CGPA","instituteName":"Stanford University","location":"Stanford, CA","startMonth":"Jan","startYear":"2020","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"projects":[{"description":"

    Developed a full-featured eCommerce platform with user authentication, product management, and secure payment processing using MongoDB, Express.js, React, and Node.js, resulting in a 40% increase in user engagement.

    Integrated advanced search and filtering capabilities, enhancing the user experience by reducing product search time by 50%, and implemented a real-time order tracking system.

    ","githuburl":"https://github.com/johndoe/ecommerce","liveurl":"https://johndoe.com","name":"E-commerce Website Using MERN Stack"},{"description":"

    Built a dynamic currency converter application in React, leveraging third-party APIs to provide real-time exchange rates for over 150 currencies, resulting in a 25% increase in user satisfaction.

    Implemented a responsive and intuitive user interface, ensuring seamless performance across various devices and improving usability scores by 30%.

    ","githuburl":"https://github.com/johndoe/ecommerce","liveurl":"https://ecommerce.johndoe.com","name":"Currency Converter in React"}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"experience":[{"companyName":"Tech Solutions Inc.","endMonth":"","endYear":"2024","jobDescription":"

    Led a team of 5 developers in designing and implementing scalable web applications using microservices architecture.

    Developed and maintained 8 web applications using modern JavaScript frameworks and RESTful APIs, ensuring high performance and user-centric design.

    Contributed to 12 successful software releases, including 3 major feature enhancements, achieving a 20% improvement in application efficiency.

    ","location":"San Francisco, CA","role":"Senior Software Engineer","startMonth":"","startYear":"2024","workingHere":false},{"companyName":"Web Innovations LLC","endMonth":"","endYear":"2024","jobDescription":"

    Spearheaded the development of 6 end-to-end web applications from concept to deployment, leveraging React and Node.js, resulting in a 30% reduction in time-to-market.

    Implemented robust authentication systems and RESTful APIs for 10+ web projects, ensuring data security and seamless integration with external services.

    Collaborated with cross-functional teams on 15+ sprints, delivering scalable solutions that improved performance metrics by 25% across multiple client projects.

    ","location":"Austin, TX","role":"Full Stack Developer","startMonth":"","startYear":"2024","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"description":"Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.
    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.
    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.
    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm."},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"admin"} +{"_creationTime":1727724673627.9053,"_id":"j571gmb1xm2025ysd1vvzbjp2n71sb38","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#00f6ff"},"isTemplate":false,"sections":[{"content":{"email":"nigga@gmail.com","firstName":"Asaf","github":"AsafCN","lastName":"Cohen","linkedin":"","phone":"1234567896","summary":"


    "},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"GaryOnTop","endMonth":"","endYear":"Present","jobDescription":"
    • Successfully led the development and implementation of innovative strategies that increased GaryOnTop's customer base by 20% within the past year.
    • Proven ability to manage and motivate a team of 10+ developers, consistently exceeding project deadlines by an average of 10%.
    • Developed and executed a comprehensive marketing plan that resulted in a 15% increase in website traffic and a 5% rise in lead generation.
    ","location":"somewhere","role":"Owner","startMonth":"May","startYear":"2024","workingHere":true}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"
    • Developed a FiveM server, 'Chinchilla GANG,' using C# and Lua, attracting over 500 active players and generating 200,000+ hours of gameplay, showcasing a robust and engaging server experience.
    • Implemented custom scripts and game mechanics, enhancing player interaction and immersion by 30%, resulting in a thriving community with active roleplay and social interactions.
    • Utilized server optimization techniques, ensuring smooth gameplay with minimal lag for over 90% of players, contributing to a positive and enjoyable experience.
    ","githuburl":"","liveurl":"","name":"Chinchilla GANG"}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mnuSio6cRJPrKBDm4yoLGPE1up"} +{"_creationTime":1727551760988.2375,"_id":"j573jsnbb55sf3fhrpxckvjwf971mnqk","globalStyles":{"columns":2.0,"fontFamily":"Raleway","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"zuberkhan034@gmail.com","firstName":"Zuber","github":"dsyucgyuds","lastName":"Khan","linkedin":"dvcudsfcdus","phone":"8171584000"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"dibcdsibf","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"
    • Developed a foundational project, **sadisadias**, demonstrating core programming principles and showcasing proficiency in basic web development concepts.
    • Successfully implemented the classic \\\"Hello World\\\" output, validating the project's functionality and providing a clear starting point for further development.
    • Utilized fundamental web technologies, including HTML, CSS, and JavaScript, to establish a basic web structure and interaction.
    ","githuburl":"sajvdgas","liveurl":"sbjsdash","name":"sadisadias"}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2miFre5HAWwyFKZpjonJCmIPznT"} +{"_creationTime":1727949037431.0198,"_id":"j573kpev81n6hxc8mpjzvc7jh171yeef","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2meJqQdYkaYUlbXpPPB7sTppxxt"} +{"_creationTime":1727549194415.8567,"_id":"j5743yqwz4aysvdg7st3jxahhd71mmbb","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"Present","grade":"","instituteName":"","location":"","startMonth":"","startYear":"2024","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2miAnDAwMyNaxTNd50uNMZTT7VE"} +{"_creationTime":1727530304224.0742,"_id":"j5745bhs6xnrh2ksk790k48rv171n4jb","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"Neo","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mhYU2Phyi4uWWORAf2mb4FMwKR"} +{"_creationTime":1727805571863.8352,"_id":"j574v8v1jymq2f6z2c630k5w1n71vjr4","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mqYQrJtBNCmJftysFa8qWHT3Kb"} +{"_creationTime":1727724326702.2046,"_id":"j575743r1t24v6xye1mcb76w6d71r924","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":"

    Automation

    "},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mntiGoZF4JIsy0M5tFPEFiMI3B"} +{"_creationTime":1727461599029.3206,"_id":"j5758q2epvr123kqt1cgx7jdj171jche","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"None@ofYour.business","firstName":"Jon","github":"Certainly None Of Yours","lastName":"Doe","linkedin":"Definetly None Of yours","phone":"12301112321","summary":"

    Software engineer

    "},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"Imaginary","endMonth":"","endYear":"Present","jobDescription":"
    • Developed innovative and engaging interactive experiences for Imaginary's clients, consistently exceeding client satisfaction ratings by 10%.
    • Collaborated with cross-functional teams to create compelling and user-friendly prototypes, achieving a 95% success rate in user testing.
    • Leveraged cutting-edge technologies and frameworks to build high-performance, scalable applications, resulting in a 20% improvement in application performance.
    ","location":"Moon","role":"Maker","startMonth":"Apr","startYear":"2018","workingHere":true}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mfJCKfZlYoAJAFgfAxWb6OZFj4"} +{"_creationTime":1727420960206.5225,"_id":"j576ws9av39d0ksq9wnfwmcsrd71jsy5","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":true,"sections":[{"content":{"email":"john.doe@example.com","firstName":"John","github":"johndoe","lastName":"Doe","linkedin":"john-doe","location":"New York, NY","phone":"+1-555-123-456","photo":"","summary":"Experienced software developer with a strong background in full-stack development and a passion for creating innovative solutions."},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"description":"Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.
    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.
    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.
    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium."},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"

    Developed a full-featured eCommerce platform with user authentication, product management, and secure payment processing using MongoDB, Express.js, React, and Node.js, resulting in a 40% increase in user engagement.

    Integrated advanced search and filtering capabilities, enhancing the user experience by reducing product search time by 50%, and implemented a real-time order tracking system.

    ","githuburl":"https://github.com/johndoe/ecommerce","liveurl":"https://johndoe.com","name":"E-commerce Website Using MERN Stack"},{"description":"

    Built a dynamic currency converter application in React, leveraging third-party APIs to provide real-time exchange rates for over 150 currencies, resulting in a 25% increase in user satisfaction.

    Implemented a responsive and intuitive user interface, ensuring seamless performance across various devices and improving usability scores by 30%.

    ","githuburl":"https://github.com/johndoe/ecommerce","liveurl":"https://ecommerce.johndoe.com","name":"Currency Converter in React"}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"experience":[{"companyName":"Tech Solutions Inc.","endMonth":"Dec","endYear":"2024","jobDescription":"

    Led a team of 5 developers in designing and implementing scalable web applications using microservices architecture.

    Developed and maintained 8 web applications using modern JavaScript frameworks and RESTful APIs, ensuring high performance and user-centric design.

    Contributed to 12 successful software releases, including 3 major feature enhancements, achieving a 20% improvement in application efficiency.

    ","location":"San Francisco, CA","role":"Senior Software Engineer","startMonth":"Feb","startYear":"2024","workingHere":false},{"companyName":"Web Innovations LLC","endMonth":"Dec","endYear":"2024","jobDescription":"

    Spearheaded the development of 6 end-to-end web applications from concept to deployment, leveraging React and Node.js, resulting in a 30% reduction in time-to-market.

    Implemented robust authentication systems and RESTful APIs for 10+ web projects, ensuring data security and seamless integration with external services.

    ","location":"Austin, TX","role":"Full Stack Developer","startMonth":"Feb","startYear":"2024","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"education":[{"courseName":"Bachelor of Science in Computer Science","endMonth":"March","endYear":"2023","grade":"8.2 CGPA","instituteName":"University of California, Berkeley","location":"Berkeley, CA","startMonth":"Feb","startYear":"2022","studyingHere":false},{"courseName":"Master of Science in Software Engineering","endMonth":"March","endYear":"2023","grade":"8.2 CGPA","instituteName":"Stanford University","location":"Stanford, CA","startMonth":"Feb","startYear":"2022","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"admin"} +{"_creationTime":1727753717673.132,"_id":"j577120tgb24qc3gn7bbpvmbk171vp7e","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"subhajit@letraz.app","firstName":"Subhajit","github":"pingSubhajit","lastName":"Kundu","linkedin":"","phone":"9239202525"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"Master of Computer Application","endMonth":"Dec","endYear":"2024","grade":"8.2 CGPA","instituteName":"Amity University","location":"Noida, India","startMonth":"Jan","startYear":"2023","studyingHere":false},{"courseName":"Bachelor of Commerce","endMonth":"Jul","endYear":"2022","grade":"9.2 CGPA","instituteName":"Kalyani Mahavidyalaya","location":"Kolkata, India","startMonth":"Jun","startYear":"2019","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"Stacks","endMonth":"","endYear":"Present","jobDescription":"
    • Developed and maintained core features of Stacks, a leading blockchain infrastructure, ensuring 99.9% uptime and contributing to the successful launch of over 100 decentralized applications.
    • Collaborated with a team of engineers to implement performance optimizations, resulting in a 15% reduction in transaction latency and a 20% increase in block throughput.
    • Proactively identified and addressed security vulnerabilities, contributing to the robust security posture of Stacks and securing over $1 billion in user funds.
    ","location":"Mumbai, India","role":"Software Engineer","startMonth":"Apr","startYear":"2024","workingHere":true}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2morLCT7RFbmOwnQrPUCSnZNEKI"} +{"_creationTime":1727526772978.4604,"_id":"j577bnmnxk1djy18qa2eyjecf171m250","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"rojinchhetri07@gmail.com","firstName":"Roshan","github":"RojinXChhetri","lastName":"Bhandari Chhetri","linkedin":"linkedin.com/in/rojinchhetri","phone":"0468957055"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"Bachelor of Information Technology","endMonth":"","endYear":"Present","grade":"","instituteName":"Torrens University Australia","location":"Sydney, Australia","startMonth":"Jun","startYear":"2023","studyingHere":true}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"Tech Sanjal PVT. LTD.","endMonth":"Mar","endYear":"2022","jobDescription":"
    • Developed and maintained high-performance web applications for Tech Sanjal PVT. LTD., achieving an average 98% uptime and exceeding customer satisfaction expectations.
    • Implemented efficient database management strategies and optimized code for improved performance, resulting in a 20% reduction in application loading times.
    • Collaborated with cross-functional teams to integrate third-party APIs and streamline user workflows, leading to a 15% increase in user engagement and data accuracy.
    ","location":"Birtamode, Nepal","role":"FullStack Developer","startMonth":"Feb","startYear":"2020","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"
    • Developed a fully functional blog website using React.js for the frontend and Node.js/Express.js for the backend, featuring user authentication, dynamic content rendering, and CRUD operations for blog posts, achieving a 99.9% uptime and 100% API success rate.
    • Implemented a robust content management system (CMS) allowing users to create, edit, and publish blog posts with rich text formatting, image uploads, and SEO optimization, resulting in a 20% increase in user-generated content.
    • Integrated a responsive design framework, ensuring seamless user experience across various devices and screen sizes, leading to a 30% increase in mobile web traffic and improved overall engagement.
    ","githuburl":"","liveurl":"","name":"FullStack Blog Site"},{"description":"
    • Developed a Python-based Cold Email Sender application with features like personalized email composition, automated scheduling, and tracking, achieving a 20% increase in email open rates.
    • Implemented a robust email verification system to ensure deliverability and reduce bounce rates, resulting in a 15% decrease in undelivered emails.
    • Integrated with popular email marketing platforms like Mailchimp and SendGrid, allowing for seamless integration and enhanced campaign management, increasing email click-through rates by 10%.
    ","githuburl":"","liveurl":"","name":"Cold Email Sender"}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mhRKC6j9TcoCGSqBfrE5xrFRWx"} +{"_creationTime":1727464933836.1113,"_id":"j577dp3fck1av8bwqd3p48h6z171k5xf","globalStyles":{"columns":2.0,"fontFamily":"Poppins","photo":false,"primaryColor":"#ebb5b5","primaryTextColor":"#9d161d"},"isTemplate":false,"sections":[{"content":{"email":"jankowalski@gmail.com","firstName":"Jan","github":"JanKowalski69","lastName":"Kowalski","linkedin":"linkedin.com/Jano666","phone":"+48 123 456 789","summary":"

    Bardzo fajnie lubie lody etc lololoo

    "},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"experience":[{"companyName":"Microsoft","endMonth":"","endYear":"Present","jobDescription":"

    i did there so much

    ","location":"New York","role":"Peanut Eater","startMonth":"Jan","startYear":"2024","workingHere":true}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mfPvdV0LAJkDOnZ5QYsAzougsK"} +{"_creationTime":1727647040839.4119,"_id":"j577kqamz0x5gwesbj046p1z7x71qexr","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"vinhwin1810@gmail.com","firstName":"Vinh","github":"","lastName":"Pham","linkedin":"","phone":"5189829436","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mlN6MPqRQQe48KPQKgeR3ix711"} +{"_creationTime":1727699704391.0244,"_id":"j5788gj1kcnfkyy84m98bwheqs71rtwm","globalStyles":{"columns":2.0,"fontFamily":"Raleway","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"vishal909781@gmail.com","firstName":"Vishal","github":"iamvkr","lastName":"Kumar","linkedin":"https://www.linkedin.com/in/vishal-kumar047","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    Version Control & Tools: Git, GitHub, GitLab, Postman

    "},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"

    Full Stack Shop management Project.

    Tech Stack

    • Frontend: React js
    • Tailwind css With Daisy ui
    • Backend: Node js Express
    • Database: MongoDB
    ","githuburl":"https://github.com/iamvkr/shop-inventory-management-MERN","liveurl":"","name":"Shop Inventory Management System -MERN"},{"description":"

    An eCommerce shopping project. Made with React.

    • React js
    • Redux Toolkit for state management
    • Tailwind css with Daisy UI Tailwind components
    ","githuburl":"https://github.com/iamvkr/cart-flix-reactjs","liveurl":"","name":"Cart Flix E-commerce React Js"},{"description":"

    A school website made with react js.

    Visit School Website. Made using javascript, HTML, CSS, React js and tailwind css

    ","githuburl":"https://github.com/iamvkr/school-website-project","liveurl":"https://iamvkr.github.io/school-website-project/","name":"School Website - React js"},{"description":"

    A Quote app, Explore quotes and create Quotes. Made with Node js and mongodb with authentication.

    • Express js Node js
    • Ejs
    • Mongoose
    ","githuburl":"https://github.com/iamvkr/quote-x","liveurl":"","name":"Quote X"}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"experience":[{"companyName":"Freelancer ","endMonth":"","endYear":"Present","jobDescription":"
    • Developed and maintained web applications using Reactjs, Nextjs ensuring a high level of performance and scalability.
    • Integrated front-end and back-end components seamlessly, delivering a unified and user-friendly experience.
    ","location":"Remote","role":"Full stack developer ","startMonth":"","startYear":"2023","workingHere":true}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"education":[{"courseName":"Master of computer Application","endMonth":"","endYear":"Present","grade":"7.8","instituteName":"Vinoba Bhave University Hazaribagh ","location":"Hazribagh, Jharkhand ","startMonth":"Oct","startYear":"2022","studyingHere":true},{"courseName":"Bachelor of computer Application","endMonth":"Oct","endYear":"2021","grade":"","instituteName":"Vinoba Bhave University Hazaribagh ","location":"Hazaribagh, Jharkhand ","startMonth":"Oct","startYear":"2018","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template2","userId":"user_2mn5pa3q0YU3BYkHNHOucHeiFlv"} +{"_creationTime":1727637634747.6304,"_id":"j578stcdbjej5dg4hw7x1m6rhs71qgyd","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2ml3uz7DuPO3HCS6mXdj1tu3JbW"} +{"_creationTime":1727684786279.126,"_id":"j57915pp2b9050ckw8ztp6m40n71sbgf","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mmbcRUYxnCiJkku0IxgrYLOvN7"} +{"_creationTime":1727719065418.8596,"_id":"j57a32b6hycp18twvagcyjc0kn71r3st","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#9d161d"},"isTemplate":false,"sections":[{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":0.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":3.0,"style":{},"type":"skills"},{"content":{"email":"worklikeakshay@gmail.com","firstName":"Akshay","github":"https://github.com/AkshayPratapSingh09","lastName":"Pratap Singh","linkedin":"https://www.linkedin.com/in/akshaypratap09/","phone":"9045304479"},"isVisible":true,"orderNumber":4.0,"style":{},"type":"header"}],"templateName":"Template2","userId":"user_2mnj51Qk7QTmbaPiDQ8BIRdLg3n"} +{"_creationTime":1727456283051.6255,"_id":"j57a7j6pv0x2qd0epz4941c3b171jxw9","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2me4Ag84YC4XLG3zpoA1Caxtcid"} +{"_creationTime":1727466709587.6462,"_id":"j57asjwn5xde80y6rgcgh41tz971jc80","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"Srivardhan","github":"","lastName":"Veeramalli","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"aaa","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mfTbQCDNKQktp9mkYZuifwrV4G"} +{"_creationTime":1727467623140.439,"_id":"j57c0pgpt1cgzy8fkya4pfqg6n71k5wc","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mfVSaKWBLuluUwafHRyqKhMlSp"} +{"_creationTime":1727527154025.5825,"_id":"j57cegdnxc5t6pjhwdt80msrcs71m401","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":"

    Frontend : JavaScript (ES6+),HTML5, CSS3, TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"wa","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mfPvdV0LAJkDOnZ5QYsAzougsK"} +{"_creationTime":1727461885635.5159,"_id":"j57cjyb9emcx7yfw4n7mmk0r5h71k5db","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"chandrasekharchadalawada7@gmail.com","firstName":"Chandrasekhar","github":"","lastName":"Chadalawada","linkedin":"","phone":"09553394020"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mfJmAqCc0eYjKPY2iCtasXYtZr"} +{"_creationTime":1727551605619.587,"_id":"j57cpr5wsva1syfze5p1s1amhn71mgxd","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2miFgArCN8w2jAZNmbIJnnbtzbF"} +{"_creationTime":1727567540231.9194,"_id":"j57cs2exq027n72pwrp1sdmjds71n183","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2milvvPrNQG22TGmk4Vul3lAC1n"} +{"_creationTime":1727805872452.2234,"_id":"j57d3ba8yz8fky01ragfkrfmx971vrsc","globalStyles":{"columns":2.0,"fontFamily":"Inter","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"work.devanshsk@gmail.com","firstName":"Devansh","github":"DevanshSK","lastName":"Singh Kushwah","linkedin":"https://www.linkedin.com/in/devanshsk/","phone":"8103008804"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"B.Tech in Infrormation Technology","endMonth":"","endYear":"Present","grade":"8.0","instituteName":"Institute of Technology and Management","location":"Gwalior, Madhya Pradesh","startMonth":"Oct","startYear":"2021","studyingHere":true}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"TechieShubDeep IT Solutions Pvt Ltd","endMonth":"Apr","endYear":"2023","jobDescription":"
    • Developed and launched 10+ web applications using MERN stack, achieving seamless user experiences and a 99.9% uptime for the real-time video conferencing platform.
    • Delivered 7+ high-performing mobile applications using Flutter, Dart, Android Studio, Java, and Firebase, resulting in smooth user experiences and increased engagement.
    • Engineered a cross-platform e-commerce app, leveraging Flutter, Dart, Django, and Python, leading to a 30% increase in user engagement through intuitive design and efficient functionality.
    ","location":"Gwalior, Madhya Pradesh","role":"Fullstack Web/App Developer","startMonth":"Nov","startYear":"2022","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"
    • Developed a modern, user-friendly web application using React, Next.js, Redux, RTK-Query, Cloudinary, Python, FastAPI, and PostgreSQL, resulting in a 20% improvement in page load times and a 15% increase in user engagement.
    • Implemented a robust backend using FastAPI and integrated it with the frontend through Redux and RTK Query, improving API response time by 20% and enhancing overall application performance.
    • Utilized Shadcn-UI and Tailwind CSS to create a visually appealing and consistent user interface, resulting in a 25% increase in user retention and a 30% reduction in unauthorized access through role-based authentication using JWT tokens.
    ","githuburl":"https://github.com/DevanshSK/add-learn","liveurl":"https://add-learn.vercel.app/","name":"ADD Learn"}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mqYpQjIvgyANms9yU8gDERrbQR"} +{"_creationTime":1727865327934.768,"_id":"j57dvt2440s119v1qhzk1f6a1h71xet2","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2msVYCrmtV4JsymnpAg33GdH705"} +{"_creationTime":1727637633768.1616,"_id":"j57e5v33sxynkv0w0zt520t3t171q21g","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2ml3uz7DuPO3HCS6mXdj1tu3JbW"} +{"_creationTime":1727516865649.3936,"_id":"j57eb5yvrr8xsbb2y611d4ydxx71me1n","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":"","summary":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"description":""},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2mh7FsoZ3jjvD7uQOF2svMOZNQz"} +{"_creationTime":1727462961008.936,"_id":"j57emykcv2e9rkn5wxs6sxf2th71k2a3","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"zuberkhan034@gmail.com","firstName":"Zuber","github":"","lastName":"Khan","linkedin":"","phone":"8171584000"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"Present","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"WayRabbit","endMonth":"","endYear":"","jobDescription":"
    • Developed and maintained key components of WayRabbit's platform, resulting in a 15% increase in user engagement and a 10% reduction in support tickets.
    • Collaborated with cross-functional teams to design and implement new features, achieving a 98% on-time delivery rate for critical project milestones.
    • Utilized agile methodologies and continuous integration/continuous deployment practices, leading to a 20% reduction in development time and a 5% increase in code quality.
    ","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mfLyIEaIgxe6GBmOfQBGzB85GW"} +{"_creationTime":1727942863323.6228,"_id":"j57ewr0pbkjkz23zjbstyz8fgx71yzj4","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"ys30371@gmail.com","firstName":"Yogesh","github":"yogesh616","lastName":"Saini","linkedin":"https://www.linkedin.com/in/yogesh-saini-678563170/","phone":"6367365117","summary":"

    Passionate front-end developer with hands-on experience in HTML, CSS, JavaScript, and React, dedicated to creating responsive and user-centric web applications. Skilled in leveraging tools like Axios and Cheerio for efficient data management and web scraping in projects such as IntelliChat. Eager to embrace new technologies and continuously enhance my skill set, with a strong commitment to delivering innovative solutions and contributing to collaborative team environments.

    "},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"projects":[{"description":"
    •  Ripple is a dynamic social media web application designed to faster engagement and interaction among users.  
    •  User Authentication: Integrates Firebase for secure and streamlined user authentication.   
    •   Post Creation and Interaction: Allows users to create and share posts, comment on them, and engage in real-time conversations through integrated chat features. 
    • Responsive UI: Designed with Bootstrap for consistent and intuitive user experience across devices.
    ","githuburl":"https://github.com/yogesh616/Ripple","liveurl":"https://ripple-steel.vercel.app/","name":"Ripple | React, Firebase, Bootstrap"},{"description":"
    • IntelliChat is a web scraping tool designed to extract data from websites based on user prompts.
    •  Custom Web Scraping: Utilizes Node.js and Cheerio to scrape and collect data from multiple websites according to user-defined queries. 
    •  User-Friendly Interface: Built with React and Bootstrap for a responsive and intuitive interface.
    •  Data Readability: Future enhancements include AI integration to convert raw scraped data into more readable formats.
    ","githuburl":"https://github.com/yogesh616/IntelliChat","liveurl":"https://intelli-chat-two.vercel.app/","name":"IntelliChat | React, Node.js, Cheerio"},{"description":"
    • Syncy is a music streaming web app where users can search and listen to music, and add songs to their favorites. 
    •  Features: Search for songs, play music, and manage favorite tracks.
    •  Responsive Design: Built with Tailwind CSS for a smooth and visually appealing user experience across devices.
    ","githuburl":"https://github.com/yogesh616/Syncy","liveurl":"https://syncy.vercel.app/","name":"Syncy | React, Tailwind"}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"projects"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), React.js, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid.

    Backend : Node.js, Express.js, REST APIs, Mongoose, Firebase, Cheerio.

    "},"isVisible":true,"orderNumber":2.0,"style":{},"type":"skills"},{"content":{"sectionDescription":"

    M.J.F. Sr. Sec. School Deeg, 12th PCM 71%

    ","sectionNumber":1.0,"sectionTitle":"EDUCATION"},"isVisible":true,"orderNumber":3.0,"type":"custom"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":5.0,"style":{},"type":"experience"}],"templateName":"Template1","userId":"user_2mv2idPITGQRh9Rih1ItJMYcLwC"} +{"_creationTime":1727578499619.3809,"_id":"j57ezwshczc2ftm9q3pswb653d71q0rz","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"","firstName":"","github":"","lastName":"","linkedin":"","phone":""},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"
    • Developed an E-learning platform utilizing React, Redux, and Node.js, facilitating online learning with interactive content, achieving a 20% increase in user engagement and a 15% reduction in course completion time.
    • Implemented a robust course management system with features like personalized learning paths, progress tracking, and interactive quizzes, resulting in a 10% improvement in student performance and a 5% increase in course completion rates.
    • Integrated a secure payment gateway and analytics dashboard, enabling seamless transactions and providing valuable insights into user behavior, leading to a 15% rise in revenue and a 20% increase in course enrollment.
    ","githuburl":"","liveurl":"","name":"E-learning"}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mj89hARzHDse7AZ46xgEFAuazs"} +{"_creationTime":1727745292327.6963,"_id":"j57fff4sfzm064v7e1x479greh71vp8y","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"jatinsharma4586@gmail.com","firstName":"Jatin","github":"github.com/softartinc","lastName":"Sharma","linkedin":"https://www.linkedin.com/in/jatinsharma4586/","phone":"7906957815"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"","githuburl":"","liveurl":"","name":""}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":""},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2moaG05oJH5DtxJKPjsnLTrYlK9"} +{"_creationTime":1727493093777.6614,"_id":"j57fhk2nzcdmamk2bceba1yjed71nsve","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#000","primaryTextColor":"#000"},"isTemplate":false,"sections":[{"content":{"email":"majorvidosa@gmail.com","firstName":"Major","github":"AlanGacihi","lastName":"Vidosa","linkedin":"linkedin.com/alan-gacihi","phone":"+154112557830"},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"education":[{"courseName":"Software Engineering","endMonth":"Mar","endYear":"2023","grade":"86","instituteName":"ALX Holberton School","location":"Nairobi","startMonth":"Feb","startYear":"2022","studyingHere":false}]},"isVisible":true,"orderNumber":1.0,"style":{},"type":"education"},{"content":{"experience":[{"companyName":"Next Technologies","endMonth":"Aug","endYear":"2023","jobDescription":"
    • Streamlined software delivery processes by implementing CI/CD pipelines, leading to a 15% reduction in deployment time and a 20% increase in release frequency.
    • Collaborated with cross-functional teams to optimize development workflows, resulting in a 10% improvement in developer productivity and a 5% decrease in time to market.
    • Contributed to infrastructure design and deployment, ensuring high availability and scalability for critical applications, leading to a 99.9% uptime.
    ","location":"Nairobi, Kenya","role":"Systems Engineer","startMonth":"Jun","startYear":"2023","workingHere":false}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"experience"},{"content":{"projects":[{"description":"
    • Developed a Sudoku Solver application using Python, implementing backtracking algorithms to efficiently solve Sudoku puzzles of varying difficulty levels.
    • Utilized constraint satisfaction techniques to optimize the solver's performance, achieving a 95% success rate in solving complex Sudoku puzzles within a reasonable timeframe.
    • Implemented a user-friendly interface for puzzle input and solution display, enhancing user experience and allowing for easy interaction with the solver.
    ","githuburl":"https://github.com/AlanGacihi/SudokuSolver","liveurl":"","name":"SudokuSolver"}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"projects"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    "},"isVisible":true,"orderNumber":4.0,"style":{},"type":"skills"}],"templateName":"Template2","userId":"user_2mgKzWp5GUOmJggZMoinXCzSVo5"} +{"_creationTime":1727940490063.4783,"_id":"j57ft0kv6zmp5ndbpqemp9kt8n71z2qf","globalStyles":{"columns":2.0,"fontFamily":"Geologica","photo":false,"primaryColor":"#C026D3","primaryTextColor":"#C026D3"},"isTemplate":false,"sections":[{"content":{"email":"ys30371@gmail.com","firstName":"Yogesh","github":"yogesh616","lastName":"Saini","linkedin":"https://in.linkedin.com/in/yogesh-saini-678563170","phone":"6367365117","summary":"

    Passionate front-end developer with hands-on experience in HTML, CSS, JavaScript, and React, dedicated to creating responsive and user-centric web applications. Skilled in leveraging tools like Axios and Cheerio for efficient data management and web scraping in projects such as IntelliChat. Eager to embrace new technologies and continuously enhance my skill set, with a strong commitment to delivering innovative solutions and contributing to collaborative team environments.

    "},"isVisible":true,"orderNumber":0.0,"style":{},"type":"header"},{"content":{"experience":[{"companyName":"","endMonth":"","endYear":"","jobDescription":"","location":"","role":"","startMonth":"","startYear":"","workingHere":false}]},"isVisible":true,"orderNumber":3.0,"style":{},"type":"experience"},{"content":{"description":"

    Frontend : HTML5, CSS3, JavaScript (ES6+), React.js, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Mongoose, Firebase, Cheerio.


    "},"isVisible":true,"orderNumber":1.0,"style":{},"type":"skills"},{"content":{"projects":[{"description":"
    • Ripple is a dynamic social media web application designed to faster engagement and interaction among users.  
    • User Authentication: Integrates Firebase for secure and streamlined user authentication.  
    • Post Creation and Interaction: Allows users to create and share posts, comment on them, and engage in real-time conversations through integrated chat features.   - Responsive UI: Designed with Bootstrap for consistent and intuitive user experience across devices.
    ","githuburl":"https://github.com/yogesh616/Ripple","liveurl":"https://ripple-steel.vercel.app/","name":"Ripple"}]},"isVisible":true,"orderNumber":2.0,"style":{},"type":"projects"},{"content":{"education":[{"courseName":"","endMonth":"","endYear":"","grade":"","instituteName":"","location":"","startMonth":"","startYear":"","studyingHere":false}]},"isVisible":true,"orderNumber":4.0,"style":{},"type":"education"}],"templateName":"Template1","userId":"user_2muxrfMacIHWVZBxZBIMO0yWyto"} diff --git a/lib/font.ts b/lib/font.ts new file mode 100644 index 0000000..c46776c --- /dev/null +++ b/lib/font.ts @@ -0,0 +1,17 @@ +import { Inter, Montserrat, Open_Sans, Poppins, Raleway, Geologica } from 'next/font/google'; + +export type FontName = 'Inter' | 'Montserrat' | 'OpenSans' | 'Poppins' | 'Raleway' | 'Geologica'; + +export const interFont = Inter({ subsets: ["latin"] }); +export const montserratFont = Montserrat({ subsets: ["latin"] }); +export const openSansFont = Open_Sans({ subsets: ["latin"] }); +export const poppinsFont = Poppins({ + subsets: ["latin"], + weight: ["100", "200", "300", "400", "500", "600", "700", "800", "900"], +}); +export const ralewayFont = Raleway({ subsets: ["latin"] }); +export const geologicaFont = Geologica({ + subsets: ["latin"], + weight: ["100", "200", "300", "400", "500", "600", "700", "800", "900"], +}); + diff --git a/lib/migrateResumes.js b/lib/migrateResumes.js new file mode 100644 index 0000000..ef876b3 --- /dev/null +++ b/lib/migrateResumes.js @@ -0,0 +1,15 @@ +import { query } from "@/convex/_generated/server"; + +const migrateResumes = query({ + args: {}, + handler: async (ctx, args) => { + const resumes = await ctx.db + .query("resumes") + .filter((q) => q.eq(q.field("isTemplate"), true)) + .collect(); + + console.log(resumes); + }, +}); + +export { migrateResumes }; diff --git a/lib/motion.js b/lib/motion.js new file mode 100644 index 0000000..558caf7 --- /dev/null +++ b/lib/motion.js @@ -0,0 +1,15 @@ +export const container = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + delayChildren: 0.3, + staggerChildren: 0.4, + }, + }, + }; + + export const item = { + hidden: { y: 20, opacity: 0 }, + visible: { y: 0, opacity: 1 }, + }; \ No newline at end of file diff --git a/lib/tipsData.tsx b/lib/tipsData.tsx new file mode 100644 index 0000000..49d413d --- /dev/null +++ b/lib/tipsData.tsx @@ -0,0 +1,64 @@ +interface TipsType { + sec: string; + topText: string; + mainText: string; + bottomMainText?: string; + bottomText?: string; +} + +export const tipsData: TipsType[] = [ + { + sec: "introduction", + topText: "Ready to begin?", + mainText: "Craft your standout resume", + bottomMainText: "Our AI-powered tools streamline the writing process!", + }, + { + sec: "header", + topText: "Welcome aboard! Let's dive in", + mainText: "Your journey to a stellar resume starts now", + bottomMainText: "Our intuitive tools will navigate you through each phase.", + bottomText: + "Begin with your core details, and let our AI assistant enhance your content along the way.", + }, + { + sec: "experience", + topText: "Excellent progress! Next stop → Work Experience", + mainText: "Showcase your professional journey", + bottomMainText: "Our AI simplifies the writing process!", + bottomText: + "Leverage our writing assistance to refine and tailor your experience descriptions for maximum impact.", + }, + { + sec: "education", + topText: "Well done! Moving on to → Education", + mainText: "Time to highlight your academic path", + bottomMainText: "Showcase your educational milestones!", + bottomText: + "Feature your degrees, certifications, and any standout academic achievements.", + }, + { + sec: "skills", + topText: "Fantastic progress! Next up → Skills", + mainText: "Let's spotlight your unique abilities", + bottomMainText: "Craft a skills section that truly stands out.", + bottomText: + "Utilize our curated suggestions to emphasize your strengths and boost your resume's visibility to potential employers.", + }, + { + sec: "projects", + topText: "Final stretch! Last stop → Projects", + mainText: "Showcase projects that define your expertise", + bottomMainText: + "Featuring projects demonstrates your hands-on experience.", + bottomText: + "Include personal, academic, or professional projects to illustrate your skills in real-world scenarios.", + }, + { + sec: "custom", + topText: "Tailor your resume with a custom section", + mainText: "Add any additional details to personalize your resume", + bottomMainText: "Whether it's achievements, hackathons, certifications, or any unique experience—make your resume truly yours.", + bottomText: "Highlight what sets you apart by adding specialized sections that showcase your unique qualifications." + } +]; \ No newline at end of file diff --git a/lib/use-preview.ts b/lib/use-preview.ts new file mode 100644 index 0000000..539db10 --- /dev/null +++ b/lib/use-preview.ts @@ -0,0 +1,18 @@ +import { ResumeTemplate } from '@/types/templateTypes'; +import {create} from 'zustand' + +type previewStore = { + isOpen : boolean; + currentTemplate: ResumeTemplate | null; + onOpen : (template : ResumeTemplate)=>void; + onClose: ()=>void; + toggle : ()=>void; +} + +export const usePreview = create((set,get)=>({ + isOpen: false, + currentTemplate : null, + onOpen: (template)=>set({isOpen : true,currentTemplate: template}), + onClose: ()=>set({isOpen : false,currentTemplate: null}), + toggle : ()=>set({isOpen: !get().isOpen}), +})) \ No newline at end of file diff --git a/lib/useMobile.tsx b/lib/useMobile.tsx new file mode 100644 index 0000000..bdeac71 --- /dev/null +++ b/lib/useMobile.tsx @@ -0,0 +1,22 @@ +"use client"; +import React, { useEffect, useState } from "react"; + +const useMobile = () => { + const [isMobile, setIsMobile] = useState(false); + + useEffect(() => { + const handleResize = () => { + setIsMobile(window.innerWidth < 768); + }; + + handleResize(); + + window.addEventListener("resize", handleResize); + + return () => window.removeEventListener("resize", handleResize); + }, []); + + return isMobile; +}; + +export default useMobile; diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..d084cca --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..4678774 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4426a1b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8834 @@ +{ + "name": "resume-craft", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "resume-craft", + "version": "0.1.0", + "dependencies": { + "@clerk/nextjs": "^5.1.6", + "@google/generative-ai": "^0.14.0", + "@radix-ui/react-checkbox": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.1", + "@types/lodash": "^4.17.5", + "@vercel/analytics": "^1.3.1", + "@vercel/speed-insights": "^1.0.12", + "array-move": "^4.0.0", + "axios": "^1.7.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "convex": "^1.12.2", + "framer-motion": "^11.2.12", + "fs": "^0.0.1-security", + "lodash": "^4.17.21", + "lucide-react": "^0.396.0", + "next": "^14.2.4", + "nextjs-toploader": "^3.7.15", + "nprogress": "^0.2.0", + "quill": "^2.0.2", + "react": "^18", + "react-color-palette": "^7.1.1", + "react-color-pallete": "^1.0.1", + "react-date-picker": "^11.0.0", + "react-dom": "^18", + "react-easy-sort": "^1.6.0", + "react-hot-toast": "^2.4.1", + "react-quill": "^2.0.0", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "zustand": "^4.5.4" + }, + "devDependencies": { + "@types/node": "^20", + "@types/nprogress": "^0.2.3", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.4", + "ignore-loader": "^0.1.2", + "postcss": "^8", + "puppeteer": "^22.12.1", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@clerk/backend": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@clerk/backend/-/backend-1.2.4.tgz", + "integrity": "sha512-H6K1kHPaDFM6pBdwDAHh1jWSZxCWhGPzDmqgc7LByjqKS6RZUf3cs5mJkIXyopUpHY7wvwj50vSF0xJ46MEzNA==", + "license": "MIT", + "dependencies": { + "@clerk/shared": "2.3.1", + "@clerk/types": "4.6.1", + "cookie": "0.5.0", + "snakecase-keys": "5.4.4", + "tslib": "2.4.1" + }, + "engines": { + "node": ">=18.17.0" + } + }, + "node_modules/@clerk/backend/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "license": "0BSD" + }, + "node_modules/@clerk/clerk-react": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@clerk/clerk-react/-/clerk-react-5.2.5.tgz", + "integrity": "sha512-Ihf1t2LdWTagW3U5BH5KRwQ8i+ECaZGEUymhJ89eZA+Ux5iXwLfOIBdwCIs45gbVuFiQ8WK0W00eaDgsNaf1mw==", + "license": "MIT", + "dependencies": { + "@clerk/shared": "2.3.1", + "@clerk/types": "4.6.1", + "tslib": "2.4.1" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" + } + }, + "node_modules/@clerk/clerk-react/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "license": "0BSD" + }, + "node_modules/@clerk/nextjs": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@clerk/nextjs/-/nextjs-5.1.6.tgz", + "integrity": "sha512-HAxDzvVJ6EM99NbxNYOvMfGSSFEXyz+yPo1ER7RoV95sTH61PZ4ugsg+Ml0AhjQ60j3xUU/BPhQEYogGxvQzEA==", + "license": "MIT", + "dependencies": { + "@clerk/backend": "1.2.4", + "@clerk/clerk-react": "5.2.5", + "@clerk/shared": "2.3.1", + "@clerk/types": "4.6.1", + "crypto-js": "4.2.0", + "path-to-regexp": "6.2.2", + "tslib": "2.4.1" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "next": "^13.5.4 || ^14.0.3 || >=15.0.0-rc", + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" + } + }, + "node_modules/@clerk/nextjs/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "license": "0BSD" + }, + "node_modules/@clerk/shared": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-2.3.1.tgz", + "integrity": "sha512-WX7cCViYqkNMnbFfT2B93ykNcSseoYM1obMUynO60VBl9Zi6Epde5tn9VRamhuOdojgPR+DyYkH9AzBpXFYnSg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@clerk/types": "4.6.1", + "glob-to-regexp": "0.4.1", + "js-cookie": "3.0.5", + "std-env": "^3.7.0", + "swr": "^2.2.0" + }, + "engines": { + "node": ">=18.17.0" + }, + "peerDependencies": { + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@clerk/types": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.6.1.tgz", + "integrity": "sha512-QFeNKPYDmTJ88l5QYG0SPwbABk42wRMalW3M/wAtr+wnQxBCXyX2XRZe9h4g2rH1VF+wG4Xe56abeeD+xE4iEw==", + "license": "MIT", + "dependencies": { + "csstype": "3.1.1" + }, + "engines": { + "node": ">=18.17.0" + } + }, + "node_modules/@clerk/types/node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "license": "MIT" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", + "license": "MIT" + }, + "node_modules/@google/generative-ai": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.14.0.tgz", + "integrity": "sha512-wNgIGEpInlVd98SapqvnQX8HQz0zM43U9NMvrbIMKQzz2pQm60pJTeHHlICTDcy/yZNLsvFQ/RfD+Ck9H8K7vw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.4.tgz", + "integrity": "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz", + "integrity": "sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz", + "integrity": "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", + "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", + "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", + "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", + "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", + "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", + "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", + "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", + "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", + "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", + "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", + "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", + "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.1.tgz", + "integrity": "sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", + "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", + "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/nprogress": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.3.tgz", + "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "license": "MIT", + "dependencies": { + "parchment": "^1.1.2" + } + }, + "node_modules/@types/quill/node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "license": "BSD-3-Clause" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vercel/analytics": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.3.1.tgz", + "integrity": "sha512-xhSlYgAuJ6Q4WQGkzYTLmXwhYl39sWjoMA3nHxfkvG+WdBT25c563a7QhwwKivEOZtPJXifYHR1m2ihoisbWyA==", + "license": "MPL-2.0", + "dependencies": { + "server-only": "^0.0.1" + }, + "peerDependencies": { + "next": ">= 13", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@vercel/speed-insights": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.0.12.tgz", + "integrity": "sha512-ZGQ+a7bcfWJD2VYEp2R1LHvRAMyyaFBYytZXsfnbOMkeOvzGNVxUL7aVUvisIrTZjXTSsxG45DKX7yiw6nq2Jw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "peerDependencies": { + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "react": "^18 || ^19", + "svelte": "^4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, + "node_modules/@wojtekmaj/date-utils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.5.1.tgz", + "integrity": "sha512-+i7+JmNiE/3c9FKxzWFi2IjRJ+KzZl1QPu6QNrsgaa2MuBgXvUy4gA1TVzf/JMdIIloB76xSKikTWuyYAIVLww==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/date-utils?sponsor=1" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-move": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-move/-/array-move-4.0.0.tgz", + "integrity": "sha512-+RY54S8OuVvg94THpneQvFRmqWdAHeqtMzgMW6JNurHxe8rsS07cHQdfGkXnTUXiBcyZ0j3SiDIxxj0RPiqCkQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chromium-bidi": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.24.tgz", + "integrity": "sha512-5xQNN2SVBdZv4TxeMLaI+PelrnZsHDhn8h2JtyriLr+0qHcZS8BMuo93qN6J1VmtmrgYP+rmcLHcbpnA8QJh+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convex": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/convex/-/convex-1.12.2.tgz", + "integrity": "sha512-LQb5o2eritXTObYA/HqkUzHky60qTVU4pLefqTh09PU5xfBBAi0ObF9EmYvD657jKsWGjU5MVjdg8aZ5XhVl2A==", + "license": "Apache-2.0", + "dependencies": { + "esbuild": "^0.17.5", + "jwt-decode": "^3.1.2", + "node-fetch": "^2.6.1", + "prettier": "3.2.5" + }, + "bin": { + "convex": "bin/main.js" + }, + "engines": { + "node": ">=16.15.1", + "npm": ">=7.0.0" + }, + "peerDependencies": { + "@auth0/auth0-react": "^2.0.1", + "@clerk/clerk-react": "^4.12.8 || ^5.0.0", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@auth0/auth0-react": { + "optional": true + }, + "@clerk/clerk-react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-element-overflow": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/detect-element-overflow/-/detect-element-overflow-1.4.2.tgz", + "integrity": "sha512-4m6cVOtvm/GJLjo7WFkPfwXoEIIbM7GQwIh4WEa4g7IsNi1YzwUsGL5ApNLrrHL29bHeNeQ+/iZhw+YHqgE2Fw==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/detect-element-overflow?sponsor=1" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.1299070", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", + "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.4.tgz", + "integrity": "sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "14.2.4", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "license": "Apache-2.0" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/framer-motion": { + "version": "11.2.12", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.2.12.tgz", + "integrity": "sha512-lCjkV4nA9rWOy2bhR4RZzkp2xpB++kFmUZ6D44V9VQaxk+JDmbDd5lq+u58DjJIIllE8AZEXp9OG/TyDN4FB/w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "license": "ISC" + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-user-locale": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/get-user-locale/-/get-user-locale-2.3.2.tgz", + "integrity": "sha512-O2GWvQkhnbDoWFUJfaBlDIKUEdND8ATpBXD6KXcbhxlfktyD/d8w6mkzM/IlQEqGZAMz/PW6j6Hv53BiigKLUQ==", + "license": "MIT", + "dependencies": { + "mem": "^8.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/get-user-locale?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/goober": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz", + "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-loader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", + "integrity": "sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/lucide-react": { + "version": "0.396.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.396.0.tgz", + "integrity": "sha512-N/zP+9vEfEYHiMWMpjwH/M5diaV0e4UFe07BpgdzaRYce5QvXi87hixf7F0Xqdr3zuX/9u7H/2D4MVXIK22O0A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/make-event-props": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", + "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/next": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.4.tgz", + "integrity": "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ==", + "license": "MIT", + "dependencies": { + "@next/env": "14.2.4", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.4", + "@next/swc-darwin-x64": "14.2.4", + "@next/swc-linux-arm64-gnu": "14.2.4", + "@next/swc-linux-arm64-musl": "14.2.4", + "@next/swc-linux-x64-gnu": "14.2.4", + "@next/swc-linux-x64-musl": "14.2.4", + "@next/swc-win32-arm64-msvc": "14.2.4", + "@next/swc-win32-ia32-msvc": "14.2.4", + "@next/swc-win32-x64-msvc": "14.2.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/nextjs-toploader": { + "version": "3.7.15", + "resolved": "https://registry.npmjs.org/nextjs-toploader/-/nextjs-toploader-3.7.15.tgz", + "integrity": "sha512-DvvXEJVRPfE2j1HVXgFhmPl8pRcLb/4mvyVBDuYdMdkbEY7KJghp0fG5iOZ002cV6awbBw9j/Di7vQL8LRazxQ==", + "license": "MIT", + "dependencies": { + "nprogress": "^0.2.0", + "prop-types": "^15.8.1" + }, + "funding": { + "url": "https://buymeacoffee.com/thesgj" + }, + "peerDependencies": { + "next": ">= 6.0.0", + "react": ">= 16.0.0", + "react-dom": ">= 16.0.0" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parchment": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", + "license": "BSD-3-Clause" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "22.12.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.12.1.tgz", + "integrity": "sha512-1GxY8dnEnHr1SLzdSDr0FCjM6JQfAh2E2I/EqzeF8a58DbGVk9oVjj4lFdqNoVbpgFSpAbz7VER9St7S1wDpNg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.2.3", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1299070", + "puppeteer-core": "22.12.1" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer/node_modules/puppeteer-core": { + "version": "22.12.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.12.1.tgz", + "integrity": "sha512-XmqeDPVdC5/3nGJys1jbgeoZ02wP0WV1GBlPtr/ULRbGXJFuqgXMcKQ3eeNtFpBzGRbpeoCGWHge1ZWKWl0Exw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.2.3", + "chromium-bidi": "0.5.24", + "debug": "^4.3.5", + "devtools-protocol": "0.0.1299070", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true, + "license": "MIT" + }, + "node_modules/quill": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.2.tgz", + "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==", + "license": "BSD-3-Clause", + "dependencies": { + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" + }, + "engines": { + "npm": ">=8.2.3" + } + }, + "node_modules/quill-delta": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", + "license": "MIT", + "dependencies": { + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-calendar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-calendar/-/react-calendar-5.0.0.tgz", + "integrity": "sha512-bHcE5e5f+VUKLd4R19BGkcSQLpuwjKBVG0fKz74cwPW5xDfNsReHdDbfd4z3mdjuUuZzVtw4Q920mkwK5/ZOEg==", + "license": "MIT", + "dependencies": { + "@wojtekmaj/date-utils": "^1.1.3", + "clsx": "^2.0.0", + "get-user-locale": "^2.2.1", + "warning": "^4.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-calendar?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-color-palette": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/react-color-palette/-/react-color-palette-7.1.1.tgz", + "integrity": "sha512-fBmTRWmTCrH08yZwU+5647pUKABRM6h4TS/43Q/mt/TLH1hyTfWopCc6wm2L9IoynPcOT7SaOm3Xmdz+goFEDw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-color-pallete": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-color-pallete/-/react-color-pallete-1.0.1.tgz", + "integrity": "sha512-j4Yh6K8lh3LWP0ExYV2qQPp1KT/y4fTkTJH/UsBWByr+q74zcNcszwHz062wbxqux+kK76e4OUfDgMolW9zzXg==" + }, + "node_modules/react-date-picker": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/react-date-picker/-/react-date-picker-11.0.0.tgz", + "integrity": "sha512-l+siu5HSZ/ciGL1293KCAHl4o9aD5rw16V4tB0C43h7QbMv2dWGgj7Dxgt8iztLaPVtEfOt/+sxNiTYw4WVq6A==", + "license": "MIT", + "dependencies": { + "@wojtekmaj/date-utils": "^1.1.3", + "clsx": "^2.0.0", + "get-user-locale": "^2.2.1", + "make-event-props": "^1.6.0", + "react-calendar": "^5.0.0", + "react-fit": "^2.0.0", + "update-input-width": "^1.4.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-date-picker?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-easy-sort": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-easy-sort/-/react-easy-sort-1.6.0.tgz", + "integrity": "sha512-zd9Nn90wVlZPEwJrpqElN87sf9GZnFR1StfjgNQVbSpR5QTSzCHjEYK6REuwq49Ip+76KOMSln9tg/ST2KLelg==", + "license": "MIT", + "dependencies": { + "array-move": "^3.0.1", + "tslib": "2.0.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=16.4.0", + "react-dom": ">=16.4.0" + } + }, + "node_modules/react-easy-sort/node_modules/array-move": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-move/-/array-move-3.0.1.tgz", + "integrity": "sha512-H3Of6NIn2nNU1gsVDqDnYKY/LCdWvCMMOWifNGhKcVQgiZ6nOek39aESOvro6zmueP07exSl93YLvkN4fZOkSg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-easy-sort/node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "license": "0BSD" + }, + "node_modules/react-fit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-fit/-/react-fit-2.0.1.tgz", + "integrity": "sha512-Eip6ALs/+6Jv82Si0I9UnfysdwVlAhkkZRycgmMdnj7jwUg69SVFp84ICxwB8zszkfvJJ2MGAAo9KAYM8ZUykQ==", + "license": "MIT", + "dependencies": { + "detect-element-overflow": "^1.4.0", + "warning": "^4.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-fit?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react-hot-toast": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz", + "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==", + "license": "MIT", + "dependencies": { + "goober": "^2.1.10" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-quill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", + "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", + "license": "MIT", + "dependencies": { + "@types/quill": "^1.3.10", + "lodash": "^4.17.4", + "quill": "^1.3.7" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/react-quill/node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/react-quill/node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", + "license": "MIT" + }, + "node_modules/react-quill/node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "license": "Apache-2.0" + }, + "node_modules/react-quill/node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "license": "BSD-3-Clause" + }, + "node_modules/react-quill/node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "license": "BSD-3-Clause", + "dependencies": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/react-quill/node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "license": "MIT", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snakecase-keys": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.4.4.tgz", + "integrity": "sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==", + "license": "MIT", + "dependencies": { + "map-obj": "^4.1.0", + "snake-case": "^3.0.4", + "type-fest": "^2.5.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/snakecase-keys/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swr": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", + "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==", + "license": "MIT", + "dependencies": { + "client-only": "^0.0.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/tailwind-merge": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz", + "integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-input-width": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/update-input-width/-/update-input-width-1.4.2.tgz", + "integrity": "sha512-/p0XLhrQQQ4bMWD7bL9duYObwYCO1qGr8R19xcMmoMSmXuQ7/1//veUnCObQ7/iW6E2pGS6rFkS4TfH4ur7e/g==", + "license": "MIT", + "funding": { + "url": "https://github.com/wojtekmaj/update-input-width?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz", + "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zustand/node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..811b8d3 --- /dev/null +++ b/package.json @@ -0,0 +1,62 @@ +{ + "name": "resume-craft", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@clerk/nextjs": "^5.1.6", + "@google/generative-ai": "^0.14.0", + "@radix-ui/react-checkbox": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-select": "^2.1.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.1", + "@types/lodash": "^4.17.5", + "@vercel/analytics": "^1.3.1", + "@vercel/speed-insights": "^1.0.12", + "array-move": "^4.0.0", + "axios": "^1.7.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "convex": "^1.12.2", + "framer-motion": "^11.2.12", + "fs": "^0.0.1-security", + "lodash": "^4.17.21", + "lucide-react": "^0.396.0", + "next": "^14.2.4", + "nextjs-toploader": "^3.7.15", + "nprogress": "^0.2.0", + "quill": "^2.0.2", + "react": "^18", + "react-color-palette": "^7.1.1", + "react-color-pallete": "^1.0.1", + "react-date-picker": "^11.0.0", + "react-dom": "^18", + "react-easy-sort": "^1.6.0", + "react-hot-toast": "^2.4.1", + "react-quill": "^2.0.0", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "zustand": "^4.5.4" + }, + "devDependencies": { + "@types/node": "^20", + "@types/nprogress": "^0.2.3", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.4", + "ignore-loader": "^0.1.2", + "postcss": "^8", + "puppeteer": "^22.12.1", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..1a69fd2 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/providers/ConvexAndClerk.tsx b/providers/ConvexAndClerk.tsx new file mode 100644 index 0000000..10d36d8 --- /dev/null +++ b/providers/ConvexAndClerk.tsx @@ -0,0 +1,21 @@ +"use client" +import { ClerkProvider, useAuth } from "@clerk/nextjs"; +import { ConvexReactClient } from "convex/react"; +import { ConvexProviderWithClerk } from "convex/react-clerk"; +import React from "react"; + +const ConvexAndClerk = ({ children }: { children: React.ReactNode }) => { + const convex = new ConvexReactClient(process.env.NEXT_PUBLIC_CONVEX_URL as string); + + return ( + <> + + + {children} + + + + ); +}; + +export default ConvexAndClerk; diff --git a/providers/NextLoader.tsx b/providers/NextLoader.tsx new file mode 100644 index 0000000..c2e0b4e --- /dev/null +++ b/providers/NextLoader.tsx @@ -0,0 +1,22 @@ +"use client"; +import useMobile from "@/lib/useMobile"; +import { usePathname } from "next/navigation"; +import NextTopLoader from "nextjs-toploader"; +import React from "react"; +const NextLoader = () => { + const pathname = usePathname(); + const isInBuildResume = pathname.includes("build-resume"); + const isMobile = useMobile(); + + return ( + + ); +}; + +export default NextLoader; diff --git a/providers/ScreenProvider.tsx b/providers/ScreenProvider.tsx new file mode 100644 index 0000000..7eb2449 --- /dev/null +++ b/providers/ScreenProvider.tsx @@ -0,0 +1,41 @@ +"use client"; +import { useState, useEffect } from "react"; + +export default function ScreenProvider({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const [isMobile, setIsMobile] = useState(false); + + useEffect(() => { + const checkIfMobile = () => { + setIsMobile(window.innerWidth < 768); + }; + + checkIfMobile(); + window.addEventListener("resize", checkIfMobile); + + return () => window.removeEventListener("resize", checkIfMobile); + }, []); + + return ( +
    + {isMobile ? ( +
    +
    +

    + Best Experience on Larger Screens +

    +

    + For the best experience, please open this website on a laptop or + PC. +

    +
    +
    + ) : ( + children + )} +
    + ); +} diff --git a/providers/TemplateWrapper.tsx b/providers/TemplateWrapper.tsx new file mode 100644 index 0000000..8d2e4ed --- /dev/null +++ b/providers/TemplateWrapper.tsx @@ -0,0 +1,35 @@ +import useMobile from "@/lib/useMobile"; +import { cn } from "@/lib/utils"; + +const TemplateWrapper = ({ + children, + size, +}: { + children: React.ReactNode; + size: "sm" | "md" | "lg"; +}) => { + const isMobile = useMobile(); + + return ( +
    + {children} +
    + ); +}; + +export default TemplateWrapper; diff --git a/public/image.png b/public/image.png new file mode 100644 index 0000000..88998ff Binary files /dev/null and b/public/image.png differ diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..d2f8422 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..ff76665 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,82 @@ +import type { Config } from "tailwindcss" + +const config = { + darkMode: ["class"], + + content: [ + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', + './templates/**/*.{ts,tsx}', // Add this line + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +} satisfies Config + +export default config \ No newline at end of file diff --git a/templates/template1/Temp1Types.tsx b/templates/template1/Temp1Types.tsx new file mode 100644 index 0000000..bbf79c7 --- /dev/null +++ b/templates/template1/Temp1Types.tsx @@ -0,0 +1,61 @@ +import { SocialLink } from "@/types/templateTypes"; + + +export type HeaderContent = { + firstName: string; + lastName: string; + phone?: string; + email?: string; + summary?: string; + socialLinks : SocialLink[]; +}; + +export type EducationContent = { + education: { + courseName: string; + instituteName: string; + startMonth?: string; + startYear: string; + endMonth?: string; + endYear: string; + location?: string; + grade?: string; + studyingHere: boolean; + }[]; +}; + +export type ExperienceContent = { + experience: { + companyName: string; + role: string; + jobDescription: string; + location?: string; + startMonth?: string; + startYear: string; + endMonth?: string; + endYear: string; + workingHere: boolean; + }[]; +}; + +export type SkillsContent = { + content: { + description: string; + }; +}; + +export type ProjectContent = { + projects: { + name: string; + description: string; + githuburl?: string; + liveurl?: string; + }[]; +}; + + +export type CustomContent = { + sectionTitle: string; + sectionDescription: string; + sectionNumber: string; +} \ No newline at end of file diff --git a/templates/template1/Template1.tsx b/templates/template1/Template1.tsx new file mode 100644 index 0000000..cb95ec4 --- /dev/null +++ b/templates/template1/Template1.tsx @@ -0,0 +1,354 @@ +"use client"; +import { cn } from "@/lib/utils"; +import { ResumeTemplate } from "@/types/templateTypes"; +import { + Github, + Globe, + Link2, + Linkedin, + Mail, + Phone, + Twitter, +} from "lucide-react"; +import Link from "next/link"; +import React from "react"; +import { + EducationContent, + ExperienceContent, + HeaderContent, + ProjectContent, + SkillsContent, +} from "./Temp1Types"; +import TemplateWrapper from "@/providers/TemplateWrapper"; + +export interface TemplateType { + obj: ResumeTemplate; + size?: "sm" | "md" | "lg"; +} + +const Template1 = ({ obj, size }: TemplateType) => { + const headerLogoMap: any = { + github: , + linkedin: , + portfolio: , + twitter: , + other: , + }; + + const visitedCustoms: number[] = []; + const primaryTextColor = obj?.globalStyles?.primaryTextColor || "black"; + const primaryColor = obj?.globalStyles?.primaryColor || "black"; + const sortedSections = [...obj.sections].sort( + (a, b) => a.orderNumber - b.orderNumber + ); + + const uniqueSectionTypes = Array.from( + new Set(sortedSections.map((item) => item.type)) + ); + + const renderSection = (type: string) => { + return sortedSections?.map((item, index) => { + if (item.type === type) { + switch (type) { + case "header": + const headerContent = item.content as HeaderContent; + + return ( +
    +
    +

    + {headerContent?.firstName} {headerContent?.lastName} +

    + +
    + {headerContent.phone && ( +
    + +

    {`${headerContent.phone}`}

    +
    + )} + {headerContent.email && ( +
    + +

    + {`${headerContent.email}`} +

    +
    + )} + {headerContent.socialLinks.map((item) => { + return ( +
    + {headerLogoMap[item.type]} + + {item.name} + +
    + ); + })} +
    +
    + + {/* SUMMARY */} +
    +

    + SUMMARY +

    +
    +
    +
    + ); + + case "education": + const educationContent = item.content as EducationContent; + + return ( +
    + {" "} +

    + EDUCATION +

    +
    + {educationContent?.education.map((edu, index2) => { + return ( +
    +
    +

    + {edu?.courseName} +

    +

    {edu?.instituteName}

    +
    +
    + {edu?.startYear && edu?.endYear && ( +

    + {`${edu?.startMonth ? `${edu.startMonth} ` : ""}${edu?.startYear ? edu.startYear : ""}${!edu?.studyingHere && (edu?.endMonth || edu?.endYear) ? ` - ${edu.endMonth} ${edu.endYear}` : edu?.studyingHere ? " - Present" : ""}`} +

    + )} +
    +
    + ); + })} +
    +
    + ); + + case "experience": + const experienceContent = item.content as ExperienceContent; + + return ( +
    +

    + WORK EXPERIENCE +

    + {experienceContent.experience?.map((exp, index) => { + return ( +
    +
    +

    + {exp?.role} {exp?.role && exp?.companyName && ","}{" "} + {exp?.companyName} +

    +
    + {exp?.startMonth && + exp?.startYear && + exp?.endMonth && + exp?.endYear && ( +

    + {exp?.startMonth}, {exp?.startYear} -{" "} + {exp?.endMonth}, {exp?.endYear} +

    + )} +
    +
    +
    +
    + ); + })} +
    + ); + + case "projects": + const projectContent = item.content as ProjectContent; + return ( + <> +
    +

    + PROJECTS +

    + +
    + {projectContent?.projects?.map((project, index) => { + return ( +
    +
    +

    + {project?.name} +

    + {project?.githuburl && ( + + + + )} + + {project?.liveurl && ( + + + + )} +
    +
    +
    + ); + })} +
    +
    + + ); + + case "skills": + const skillsContent = item as SkillsContent; + + return ( +
    + {" "} +

    + SKILLS +

    +
    +
    {" "} +
    +
    + ); + + case "custom": + return sortedSections.map((item, index) => { + if (item.type === "custom") { + if (visitedCustoms.includes(item.orderNumber)) return; + visitedCustoms.push(item.orderNumber); + + return ( +
    +

    + {item.content.sectionTitle} +

    +
    +
    + ); + } + return null; + }); + } + } + }); + }; + + const content = ( +
    +
    + {uniqueSectionTypes?.map((section, index) => { + return ( + + {renderSection(section)} + + ); + })} +
    +
    + ); + + return {content}; +}; + +export default Template1; diff --git a/templates/template1/temp1obj.tsx b/templates/template1/temp1obj.tsx new file mode 100644 index 0000000..c48394c --- /dev/null +++ b/templates/template1/temp1obj.tsx @@ -0,0 +1,152 @@ +import { ResumeTemplate } from "@/types/templateTypes"; + +const temp1Obj: ResumeTemplate = { + isTemplate: true, + userId: "admin", + templateName: "Template1", + sections: [ + { + type: "header", + content: { + email: "john.doe@example.com", + firstName: "John", + lastName: "Doe", + socialLinks: [ + { + type: "github", + name: "JohnDoe", + url: "https://github.com/JohnDoe", + }, + ], + location: "New York, NY", + phone: "+1-555-123-4567", + photo: "", + summary: + "Experienced software developer with a strong background in full-stack development and a passion for creating innovative solutions.", + }, + isVisible: true, + orderNumber: 0, + style: {}, + }, + { + type: "skills", + content: { + description: + "

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    ", + }, + isVisible: true, + orderNumber: 1, + style: {}, + }, + { + type: "projects", + content: { + projects: [ + { + name: "E-commerce Website Using MERN Stack", + description: + "

    Developed a full-featured eCommerce platform with user authentication, product management, and secure payment processing using MongoDB, Express.js, React, and Node.js, resulting in a 40% increase in user engagement.

    Integrated advanced search and filtering capabilities, enhancing the user experience by reducing product search time by 50%, and implemented a real-time order tracking system.

    ", + githuburl: "https://github.com/johndoe/ecommerce", + liveurl: "https://johndoe.com", + }, + { + name: "Currency Converter in React", + description: + "

    Built a dynamic currency converter application in React, leveraging third-party APIs to provide real-time exchange rates for over 150 currencies, resulting in a 25% increase in user satisfaction.

    Implemented a responsive and intuitive user interface, ensuring seamless performance across various devices and improving usability scores by 30%.

    ", + githuburl: "https://github.com/johndoe/ecommerce", + liveurl: "https://ecommerce.johndoe.com", + }, + ], + }, + isVisible: true, + orderNumber: 2, + style: {}, + }, + { + type: "experience", + content: { + experience: [ + { + companyName: "Tech Solutions Inc.", + jobDescription: + "

    Led a team of 5 developers in designing and implementing scalable web applications using microservices architecture.

    Developed and maintained 8 web applications using modern JavaScript frameworks and RESTful APIs, ensuring high performance and user-centric design.

    Contributed to 12 successful software releases, including 3 major feature enhancements, achieving a 20% improvement in application efficiency.

    ", + location: "San Francisco, CA", + role: "Senior Software Engineer", + startYear: "2024", + endYear: "2024", + workingHere: false, + startMonth: "Feb", + endMonth: "Dec", + }, + { + companyName: "Web Innovations LLC", + jobDescription: + "

    Implemented robust authentication systems and RESTful APIs for 10+ web projects, ensuring data security and seamless integration with external services.

    Collaborated with cross-functional teams on 15+ sprints, delivering scalable solutions that improved performance metrics by 25% across multiple client projects.

    ", + location: "Austin, TX", + role: "Full Stack Developer", + startYear: "2024", + endYear: "2024", + workingHere: false, + startMonth: "Feb", + endMonth: "Dec", + }, + ], + }, + isVisible: true, + orderNumber: 3, + style: {}, + }, + { + type: "education", + content: { + education: [ + { + courseName: "Bachelor of Science in Computer Science", + instituteName: "University of California, Berkeley", + location: "Berkeley, CA", + startMonth: "Feb", + startYear: "2022", + endMonth: "March", + endYear: "2023", + studyingHere: false, + grade: "8.2 CGPA", + }, + { + courseName: "Master of Science in Software Engineering", + instituteName: "Stanford University", + location: "Stanford, CA", + startMonth: "Feb", + startYear: "2022", + endMonth: "March", + endYear: "2023", + studyingHere: false, + grade: "8.2 CGPA", + }, + ], + }, + isVisible: true, + orderNumber: 4, + style: {}, + }, + { + type: "custom", + content: { + sectionTitle: "About Me", + sectionDescription: "Summary", + sectionNumber: 0, + }, + isVisible: false, + orderNumber: 5, + style: {}, + }, + ], + globalStyles: { + fontFamily: "Geologica", + primaryTextColor: "#C026D3", + primaryColor: "#C026D3", + photo: false, + columns: 2, + }, +}; + +export default temp1Obj; diff --git a/templates/template2/Template2.tsx b/templates/template2/Template2.tsx new file mode 100644 index 0000000..3f001d8 --- /dev/null +++ b/templates/template2/Template2.tsx @@ -0,0 +1,341 @@ +import { cn } from "@/lib/utils"; +import Link from "next/link"; +import { + Github, + Globe, + Globe2, + Link2, + Linkedin, + Mail, + MessageCircle, + Phone, + Twitter, +} from "lucide-react"; +import React from "react"; +import { + HeaderContent, + EducationContent, + SkillsContent, + ExperienceContent, + ProjectContent, + CustomContent, +} from "./temp2Types"; +import { ResumeTemplate } from "@/types/templateTypes"; +import useMobile from "@/lib/useMobile"; + +interface TemplateType { + obj: ResumeTemplate; + size?: "sm" | "md" | "lg"; +} + +const Template2 = ({ obj, size }: TemplateType) => { + const sectionArray = obj?.sections?.map((item) => item.type); + const isMobile = useMobile(); + + const PreviewWrapper = ({ children }: { children: React.ReactNode }) => ( +
    + {children} +
    + ); + + const primaryTextColorClass = obj?.globalStyles?.primaryTextColor || "black"; + const primaryColorClass = obj?.globalStyles?.primaryColor || "black"; + + const sortedSections = [...obj.sections].sort( + (a, b) => a.orderNumber - b.orderNumber + ); + const visitedCustoms: number[] = []; + const uniqueSectionTypes = Array.from( + new Set(sortedSections.map((item) => item.type)) + ); + + const headerLogoMap: any = { + github: , + linkedin: , + portfolio: , + twitter: , + other: , + }; + + const renderSection = (type: string) => { + return obj?.sections?.map((item, index) => { + if (item.type === type) { + switch (type) { + case "header": + const headerContent = item.content as HeaderContent; + + return ( +
    +

    + {headerContent.firstName} {headerContent.lastName} +

    +
    + {headerContent.phone && ( +
    + +

    {`${headerContent.phone}`}

    +
    + )} + {headerContent.email && ( +
    + +

    + {`${headerContent.email}`} +

    +
    + )} + {headerContent.socialLinks.map((item) => { + return ( +
    + {headerLogoMap[item.type]} + + {item.name} + +
    + ); + })} +
    +
    + ); + + case "education": + const educationContent = item.content as EducationContent; + + return ( +
    +
    +

    + EDUCATION +

    +
    + {educationContent?.education?.map((edu, index) => ( +
    +
    +

    + {edu?.instituteName} +

    +

    + {edu?.courseName} {edu?.grade && "-"} {edu?.grade} +

    +
    +
    +

    + {edu?.location && edu?.location} +

    +

    + {`${edu?.startMonth ? `${edu.startMonth} ` : ""}${edu?.startYear ? edu.startYear : ""}${!edu?.studyingHere && (edu?.endMonth || edu?.endYear) ? ` - ${edu.endMonth} ${edu.endYear}` : edu?.studyingHere ? " - Present" : ""}`} +

    +
    +
    + ))} +
    + ); + + case "experience": + const experienceContent = item.content as ExperienceContent; + return ( +
    +
    +

    + EXPERIENCE +

    +
    + {experienceContent?.experience?.map((exp, index) => ( +
    +
    +
    +

    {exp?.role}

    +

    {exp?.companyName}

    +
    +
    + {exp?.startYear && exp?.endYear && ( +

    + {exp?.startMonth} {exp?.startYear}{" "} + {(exp?.startYear || exp?.startMonth) && + (exp?.endYear || exp?.endMonth) && + "-"} + {exp?.endMonth} {exp?.endYear} +

    + )}{" "} + {exp?.location && ( +

    {exp?.location}

    + )} +
    +
    +
    +
    + ))} +
    + ); + + case "skills": + const skillsContent = item as SkillsContent; + + return ( +
    +
    +

    + SKILLS +

    +
    +
    +
    + ); + + case "projects": + const projectContent = item.content as ProjectContent; + return ( +
    +
    +

    + PROJECTS +

    +
    + {projectContent?.projects?.map((project, index) => ( +
    +
    +

    + {project?.name} +

    + {project?.githuburl && ( + + + + )} + + {project?.liveurl && ( + + + + )} +
    +
    +
    + ))} +
    + ); + + case "custom": + return sortedSections.map((item, index) => { + if (item.type === "custom") { + if (visitedCustoms.includes(item.orderNumber)) return; + visitedCustoms.push(item.orderNumber); + return ( + <> +
    +

    + {item.content.sectionTitle} +

    +
    +
    + + ); + } + return null; + }); + + default: + return null; + } + } + return null; + }); + }; + + const content = ( +
    +
    + {uniqueSectionTypes?.map((section, index) => { + return
    {renderSection(section)}
    ; + })} +
    +
    + ); + + return {content}; +}; + +export default Template2; diff --git a/templates/template2/temp2Types.tsx b/templates/template2/temp2Types.tsx new file mode 100644 index 0000000..f68d654 --- /dev/null +++ b/templates/template2/temp2Types.tsx @@ -0,0 +1,59 @@ +import { SocialLink } from "@/types/templateTypes"; + + +export type HeaderContent = { + firstName: string; + lastName: string; + phone?: string; + email?: string; + socialLinks : SocialLink[] +}; + +export type EducationContent = { + education: { + courseName: string; + instituteName: string; + startMonth?: string; + startYear: string; + endMonth?: string; + endYear: string; + location?: string; + grade?: string; + studyingHere: boolean; + }[]; +}; + +export type ExperienceContent = { + experience: { + companyName: string; + role: string; + jobDescription: string; + location?: string; + startMonth?: string; + startYear: string; + endMonth?: string; + endYear: string; + workingHere: boolean; + }[]; +}; + +export type SkillsContent = { + content: { + description : string; + }; +}; + +export type ProjectContent = { + projects: { + name: string; + description: string; + githuburl?: string; + liveurl?: string; + }[]; +}; + +export type CustomContent = { + sectionTitle: string; + sectionDescription: string; + sectionNumber: string; +} \ No newline at end of file diff --git a/templates/template2/temp2obj.tsx b/templates/template2/temp2obj.tsx new file mode 100644 index 0000000..f6410c4 --- /dev/null +++ b/templates/template2/temp2obj.tsx @@ -0,0 +1,138 @@ +import { ResumeTemplate } from "@/types/templateTypes"; + +export const temp2Obj: ResumeTemplate = { + isTemplate: true, + userId: "admin", + templateName: "Template2", + sections: [ + { + content: { + email: "john.doe@example.com", + firstName: "John", + lastName: "Doe", + socialLinks: [ + { + type: "github", + name: "JohnDoe", + url: "https://github.com/JohnDoe", + }, + ], + location: "New York, NY", + phone: "+1-555-123-4567", + photo: "", + summary: "", + }, + style: {}, + isVisible: true, + orderNumber: 0, + type: "header", + }, + { + content: { + education: [ + { + courseName: "Bachelor of Science in Computer Science", + instituteName: "University of California, Berkeley", + location: "Berkeley, CA", + startMonth: "Feb", + startYear: "2022", + endMonth: "March", + endYear: "2023", + grade: "8.2 CGPA", + studyingHere: false, + }, + { + courseName: "Master of Science in Software Engineering", + instituteName: "Stanford University", + location: "Stanford, CA", + startMonth: "Jan", + startYear: "2020", + endMonth: "Dec", + endYear: "2022", + grade: "8.2 CGPA", + studyingHere: false, + }, + ], + }, + style: {}, + isVisible: true, + orderNumber: 1, + type: "education", + }, + { + content: { + projects: [ + { + description: + "

    Developed a full-featured eCommerce platform with user authentication, product management, and secure payment processing using MongoDB, Express.js, React, and Node.js, resulting in a 40% increase in user engagement.

    Integrated advanced search and filtering capabilities, enhancing the user experience by reducing product search time by 50%, and implemented a real-time order tracking system.

    ", + githuburl: "https://github.com/johndoe/ecommerce", + liveurl: "https://johndoe.com", + name: "E-commerce Website Using MERN Stack", + }, + { + description: + "

    Built a dynamic currency converter application in React, leveraging third-party APIs to provide real-time exchange rates for over 150 currencies, resulting in a 25% increase in user satisfaction.

    Implemented a responsive and intuitive user interface, ensuring seamless performance across various devices and improving usability scores by 30%.

    ", + githuburl: "https://github.com/johndoe/ecommerce", + liveurl: "https://ecommerce.johndoe.com", + name: "Currency Converter in React", + }, + ], + }, + style: {}, + isVisible: true, + orderNumber: 3, + type: "projects", + }, + { + content: { + experience: [ + { + companyName: "Tech Solutions Inc.", + jobDescription: + "

    Led a team of 5 developers in designing and implementing scalable web applications using microservices architecture.

    Developed and maintained 8 web applications using modern JavaScript frameworks and RESTful APIs, ensuring high performance and user-centric design.

    Contributed to 12 successful software releases, including 3 major feature enhancements, achieving a 20% improvement in application efficiency.

    ", + location: "San Francisco, CA", + role: "Senior Software Engineer", + startYear: "2024", + endYear: "2024", + workingHere: false, + endMonth: "", + startMonth: "", + }, + { + companyName: "Web Innovations LLC", + jobDescription: + "

    Spearheaded the development of 6 end-to-end web applications from concept to deployment, leveraging React and Node.js, resulting in a 30% reduction in time-to-market.

    Implemented robust authentication systems and RESTful APIs for 10+ web projects, ensuring data security and seamless integration with external services.

    Collaborated with cross-functional teams on 15+ sprints, delivering scalable solutions that improved performance metrics by 25% across multiple client projects.

    ", + location: "Austin, TX", + role: "Full Stack Developer", + startYear: "2024", + endYear: "2024", + workingHere: false, + endMonth: "", + startMonth: "", + }, + ], + }, + style: {}, + isVisible: true, + orderNumber: 2, + type: "experience", + }, + { + content: { + description: + "

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    ", + }, + style: {}, + isVisible: true, + orderNumber: 4, + type: "skills", + }, + ], + globalStyles: { + columns: 2, + fontFamily: "Geologica", + photo: false, + primaryColor: "#000", + primaryTextColor: "#000", + }, +}; diff --git a/templates/template3/Template3.tsx b/templates/template3/Template3.tsx new file mode 100644 index 0000000..706d15f --- /dev/null +++ b/templates/template3/Template3.tsx @@ -0,0 +1,360 @@ +"use client"; +import { cn } from "@/lib/utils"; +import { ResumeTemplate } from "@/types/templateTypes"; +import { + Github, + Globe, + Link2, + Linkedin, + Mail, + Phone, + Twitter, +} from "lucide-react"; +import Link from "next/link"; +import React from "react"; +import { + EducationContent, + ExperienceContent, + HeaderContent, + ProjectContent, + SkillsContent, +} from "../template1/Temp1Types"; +import TemplateWrapper from "@/providers/TemplateWrapper"; + +export interface TemplateType { + obj: ResumeTemplate; + size: "sm" | "md" | "lg"; +} + +const Template3 = ({ obj, size }: TemplateType) => { + const headerLogoMap: any = { + github: , + linkedin: , + portfolio: , + twitter: , + other: , + }; + + console.log(obj); + + const visitedCustoms: number[] = []; + const primaryTextColor = obj?.globalStyles?.primaryTextColor || "black"; + const primaryColor = obj?.globalStyles?.primaryColor || "black"; + const sortedSections = [...obj.sections].sort( + (a, b) => a.orderNumber - b.orderNumber + ); + + const uniqueSectionTypes = Array.from( + new Set(sortedSections.map((item) => item.type)) + ); + + const renderSection = (type: string) => { + return sortedSections?.map((item, index) => { + if (item.type === type) { + switch (type) { + case "header": + const headerContent = item.content as HeaderContent; + + return ( +

    +
    +

    + {headerContent?.firstName} {headerContent?.lastName} +

    + +
    + {headerContent.phone && ( +
    + +

    {`${headerContent.phone}`}

    +
    + )} + {headerContent.email && ( +
    + +

    + {`${headerContent.email}`} +

    +
    + )} + {headerContent.socialLinks.map((item) => { + return ( +
    + {headerLogoMap[item.type]} + + {item.name} + +
    + ); + })} +
    +
    + + {/* SUMMARY */} +
    +

    + SUMMARY +

    +
    +
    +
    + ); + + case "education": + const educationContent = item.content as EducationContent; + + return ( +
    + {" "} +

    + EDUCATION +

    +
    + {educationContent?.education.map((edu, index2) => { + return ( +
    +
    +

    + {edu?.courseName} +

    +

    {edu?.instituteName}

    +
    +
    + {edu?.startYear && edu?.endYear && ( +

    + {`${edu?.startMonth ? `${edu.startMonth} ` : ""}${edu?.startYear ? edu.startYear : ""}${!edu?.studyingHere && (edu?.endMonth || edu?.endYear) ? ` - ${edu.endMonth} ${edu.endYear}` : edu?.studyingHere ? " - Present" : ""}`} +

    + )} +
    +
    + ); + })} +
    +
    + ); + + case "experience": + const experienceContent = item.content as ExperienceContent; + + return ( +
    +

    + WORK EXPERIENCE +

    + {experienceContent.experience?.map((exp, index) => { + return ( +
    +
    +

    + {exp?.role} {exp?.role && exp?.companyName && ","}{" "} + {exp?.companyName} +

    +
    + {exp?.startMonth && + exp?.startYear && + exp?.endMonth && + exp?.endYear && ( +

    + {exp?.startMonth}, {exp?.startYear} -{" "} + {exp?.endMonth}, {exp?.endYear} +

    + )} +
    +
    +
    +
    + ); + })} +
    + ); + + case "projects": + const projectContent = item.content as ProjectContent; + return ( + <> +
    +

    + PROJECTS +

    + +
    + {projectContent?.projects?.map((project, index) => { + return ( +
    +
    +

    + {project?.name} +

    + {project?.githuburl && ( + + + + )} + + {project?.liveurl && ( + + + + )} +
    +
    +
    + ); + })} +
    +
    + + ); + + case "skills": + const skillsContent = item as SkillsContent; + + return ( +
    + {" "} +

    + SKILLS +

    +
    +
    {" "} +
    +
    + ); + + case "custom": + return sortedSections.map((item, index) => { + if (item.type === "custom") { + if (visitedCustoms.includes(item.orderNumber)) return; + visitedCustoms.push(item.orderNumber); + + return ( +
    +

    + {item.content.sectionTitle} +

    +
    +
    + ); + } + return null; + }); + } + } + }); + }; + + const content = ( +
    +
    + {uniqueSectionTypes?.map((section, index) => { + return ( + + {/* {renderSection(section)} */} +
    +
    {section === 'header' && renderSection(section)}
    +
    +
    +
    + ); + })} +
    +
    + ); + + return {content}; +}; + +export default Template3; diff --git a/templates/template3/temp3obj.tsx b/templates/template3/temp3obj.tsx new file mode 100644 index 0000000..bb6c713 --- /dev/null +++ b/templates/template3/temp3obj.tsx @@ -0,0 +1,152 @@ +import { ResumeTemplate } from "@/types/templateTypes"; + +const temp3obj: ResumeTemplate = { + isTemplate: true, + userId: "admin", + templateName: "Template1", + sections: [ + { + type: "header", + content: { + email: "john.doe@example.com", + firstName: "John", + lastName: "Doe", + socialLinks: [ + { + type: "github", + name: "JohnDoe", + url: "https://github.com/JohnDoe", + }, + ], + location: "New York, NY", + phone: "+1-555-123-4567", + photo: "", + summary: + "Experienced software developer with a strong background in full-stack development and a passion for creating innovative solutions.", + }, + isVisible: true, + orderNumber: 0, + style: {}, + }, + { + type: "skills", + content: { + description: + "

    Frontend : HTML5, CSS3, JavaScript (ES6+), TypeScript, React.js, Next.js, Redux, Tailwind CSS, Bootstrap, Responsive Design, Flexbox, CSS Grid, Webpack, Babel.

    Backend : Node.js, Express.js, REST APIs, GraphQL, Authentication (JWT, OAuth), MongoDB, Mongoose, PostgreSQL, WebSockets (Socket.io), Real-Time Data.

    DevOps: Docker, Kubernetes, AWS (S3, EC2, Lambda), DigitalOcean, CI/CD Pipelines (GitHub Actions, Jenkins), Nginx, Apache, PM2.

    Version Control & Tools: Git, GitHub, GitLab, Postman, Insomnia, Swagger, VS Code, WebStorm. Testing: Jest, Mocha, Chai, Cypress, Selenium.

    ", + }, + isVisible: true, + orderNumber: 1, + style: {}, + }, + { + type: "projects", + content: { + projects: [ + { + name: "E-commerce Website Using MERN Stack", + description: + "

    Developed a full-featured eCommerce platform with user authentication, product management, and secure payment processing using MongoDB, Express.js, React, and Node.js, resulting in a 40% increase in user engagement.

    Integrated advanced search and filtering capabilities, enhancing the user experience by reducing product search time by 50%, and implemented a real-time order tracking system.

    ", + githuburl: "https://github.com/johndoe/ecommerce", + liveurl: "https://johndoe.com", + }, + { + name: "Currency Converter in React", + description: + "

    Built a dynamic currency converter application in React, leveraging third-party APIs to provide real-time exchange rates for over 150 currencies, resulting in a 25% increase in user satisfaction.

    Implemented a responsive and intuitive user interface, ensuring seamless performance across various devices and improving usability scores by 30%.

    ", + githuburl: "https://github.com/johndoe/ecommerce", + liveurl: "https://ecommerce.johndoe.com", + }, + ], + }, + isVisible: true, + orderNumber: 2, + style: {}, + }, + { + type: "experience", + content: { + experience: [ + { + companyName: "Tech Solutions Inc.", + jobDescription: + "

    Led a team of 5 developers in designing and implementing scalable web applications using microservices architecture.

    Developed and maintained 8 web applications using modern JavaScript frameworks and RESTful APIs, ensuring high performance and user-centric design.

    Contributed to 12 successful software releases, including 3 major feature enhancements, achieving a 20% improvement in application efficiency.

    ", + location: "San Francisco, CA", + role: "Senior Software Engineer", + startYear: "2024", + endYear: "2024", + workingHere: false, + startMonth: "Feb", + endMonth: "Dec", + }, + { + companyName: "Web Innovations LLC", + jobDescription: + "

    Implemented robust authentication systems and RESTful APIs for 10+ web projects, ensuring data security and seamless integration with external services.

    Collaborated with cross-functional teams on 15+ sprints, delivering scalable solutions that improved performance metrics by 25% across multiple client projects.

    ", + location: "Austin, TX", + role: "Full Stack Developer", + startYear: "2024", + endYear: "2024", + workingHere: false, + startMonth: "Feb", + endMonth: "Dec", + }, + ], + }, + isVisible: true, + orderNumber: 3, + style: {}, + }, + { + type: "education", + content: { + education: [ + { + courseName: "Bachelor of Science in Computer Science", + instituteName: "University of California, Berkeley", + location: "Berkeley, CA", + startMonth: "Feb", + startYear: "2022", + endMonth: "March", + endYear: "2023", + studyingHere: false, + grade: "8.2 CGPA", + }, + { + courseName: "Master of Science in Software Engineering", + instituteName: "Stanford University", + location: "Stanford, CA", + startMonth: "Feb", + startYear: "2022", + endMonth: "March", + endYear: "2023", + studyingHere: false, + grade: "8.2 CGPA", + }, + ], + }, + isVisible: true, + orderNumber: 4, + style: {}, + }, + { + type: "custom", + content: { + sectionTitle: "About Me", + sectionDescription: "Summary", + sectionNumber: 0, + }, + isVisible: false, + orderNumber: 5, + style: {}, + }, + ], + globalStyles: { + fontFamily: "Geologica", + primaryTextColor: "#C026D3", + primaryColor: "#C026D3", + photo: false, + columns: 2, + }, +}; + +export default temp3obj; diff --git a/templates/template3/temp3types.tsx b/templates/template3/temp3types.tsx new file mode 100644 index 0000000..e69de29 diff --git a/templates/templateStructures.tsx b/templates/templateStructures.tsx new file mode 100644 index 0000000..d7450eb --- /dev/null +++ b/templates/templateStructures.tsx @@ -0,0 +1,154 @@ +import { ResumeTemplate } from "@/types/templateTypes"; +import Template1 from "@/templates/template1/Template1"; +import Template2 from "@/templates/template2/Template2"; + +export const allSectionFields: any = { + header: { + firstName: "", + lastName: "", + email: "", + phone: "", + socialLinks: [], + summary: "", + location: "", + photo: undefined, + }, + experience: { + experience: [ + { + companyName: "", + role: "", + jobDescription: "", + location: "", + startMonth: "", + endMonth: "", + startYear: "", + endYear: "", + workingHere: false, + }, + ], + }, + education: { + education: [ + { + courseName: "", + instituteName: "", + startMonth: "", + startYear: "", + endMonth: "", + endYear: "", + location: "", + grade: "", + studyingHere: false, + }, + ], + }, + skills: { + description: "", + }, + projects: { + projects: [ + { + name: "", + description: "", + githuburl: "", + liveurl: "", + }, + ], + }, +}; + +export function createSection( + type: any, + fields: string[], + orderNumber: number, + isVisible: boolean +) { + let content: any = {}; + fields.forEach((field) => { + content[field] = allSectionFields[type][field]; + }); + + return { + type, + content, + orderNumber: orderNumber, + isVisible: isVisible, + style: {}, + }; +} + +export const templateStructures: any = { + Template1: [ + { + type: "header", + fields: [ + "firstName", + "lastName", + "email", + "phone", + "socialLinks", + "summary", + ], + orderNumber: 0, + isVisible: true, + }, + { + type: "experience", + fields: ["experience"], + orderNumber: 3, + isVisible: true, + }, + { + type: "skills", + fields: ["description"], + orderNumber: 1, + isVisible: true, + }, + { type: "projects", fields: ["projects"], orderNumber: 2, isVisible: true }, + { + type: "education", + fields: ["education"], + orderNumber: 4, + isVisible: true, + }, + ], + Template2: [ + { + type: "header", + fields: ["firstName", "lastName", "email", "phone", "socialLinks"], + orderNumber: 0, + isVisible: true, + }, + { + type: "education", + fields: ["education"], + orderNumber: 1, + isVisible: true, + }, + { + type: "experience", + fields: ["experience"], + orderNumber: 2, + isVisible: true, + }, + { type: "projects", fields: ["projects"], orderNumber: 3, isVisible: true }, + { + type: "skills", + fields: ["description"], + orderNumber: 4, + isVisible: true, + }, + ], +}; + +export type TemplateComponentType = React.ComponentType<{ + obj: ResumeTemplate; + isPreview: boolean; + size? : "sm" | "md" | "lg"; +}>; + +export const templateComponents: Record = { + Template1: Template1, + Template2: Template2, +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e0fe834 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "components/QuillEditors/Quill.modules", "components/QuillEditors/QuillModules.js"], + "exclude": ["node_modules"] +} diff --git a/types/templateTypes.tsx b/types/templateTypes.tsx new file mode 100644 index 0000000..4d5e73f --- /dev/null +++ b/types/templateTypes.tsx @@ -0,0 +1,135 @@ +type SectionType = + | "header" + | "education" + | "skills" + | "projects" + | "experience" + | "custom"; + +interface BaseSection { + type: SectionType; + content: Record; + style?: Record; +} + +export interface SocialLink { + type: string; + name: string; + url: string; +} + +export interface HeaderSection extends BaseSection { + type: "header"; + content: { + firstName: string; + lastName?: string; + email: string; + phone?: string; + location?: string; + summary?: string; + photo?: string; + socialLinks : SocialLink[] + }; + isVisible: boolean; + orderNumber: number; + style?: {}; +} + +export interface SkillSection extends BaseSection { + type: "skills"; + content: { + description: string; + }; + isVisible: boolean; + orderNumber: number; + style?: {}; +} + +export interface ProjectSection extends BaseSection { + type: "projects"; + content: { + projects: { + name: string; + description: string; + githuburl?: string; + liveurl?: string; + }[]; + }; + isVisible: boolean; + orderNumber: number; + style?: {}; +} + +export interface ExperienceSection extends BaseSection { + type: "experience"; + content: { + experience: { + companyName: string; + role: string; + jobDescription: string; + location?: string; + startMonth?: string; + startYear: string; + endMonth?: string; + endYear: string; + workingHere: false; + }[]; + }; + isVisible: boolean; + orderNumber: number; + style?: {}; +} + +export interface EducationSection extends BaseSection { + type: "education"; + content: { + education: { + courseName: string; + instituteName: string; + startMonth?: string; + startYear?: string; + endMonth?: string; + endYear?: string; + location?: string; + studyingHere: boolean; + grade?: string; + }[]; + }; + isVisible: boolean; + orderNumber: number; + style?: {}; +} + +export interface CustomSection extends BaseSection { + type: "custom"; + content: { + sectionTitle : string; + sectionDescription : string; + sectionNumber : number; + }; + isVisible: boolean; + orderNumber: number; + style?: {}; +} + +export type SectionTypes = + | HeaderSection + | SkillSection + | ProjectSection + | ExperienceSection + | EducationSection + | CustomSection; + +export interface ResumeTemplate { + isTemplate: boolean; + userId: string; + templateName: string; + sections: SectionTypes[]; + globalStyles: { + fontFamily: string; + primaryTextColor: string; + primaryColor: string; + photo: boolean; + columns: number; + }; +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..f3c09f5 --- /dev/null +++ b/vercel.json @@ -0,0 +1,8 @@ +{ + "builds": [ + { + "src": "package.json", + "use": "@vercel/next" + } + ] +} \ No newline at end of file