diff --git a/.gitignore b/.gitignore index 62aec3e..dd19570 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules .next node_shell -.env \ No newline at end of file +.env +/dump \ No newline at end of file diff --git a/app/(components)/AboutSection.tsx b/app/(components)/AboutSection.tsx new file mode 100644 index 0000000..29e6ec8 --- /dev/null +++ b/app/(components)/AboutSection.tsx @@ -0,0 +1,115 @@ +"use client"; + +import React from "react"; +import TextShuffler from "../../components/actions/TextShuffler"; +import { about } from "../(utils)/animate"; + +export default function AboutSection() { + React.useEffect(about, []); + + const webDevStack = require("../(utils)/web-dev-stack.json"); + const uiStack = require("../(utils)/ui-ux-stack.json"); + + const [targetStack, setTargetStack] = React.useState("dev"); + + return ( +
+ {/* + About Me + */} +
+ +
+
+

+ +

+ +
+
+
{ + setTargetStack("dev"); + }} + > +
Web Dev Stack
+
+
{ + setTargetStack("design"); + }} + > +
UI/UX Stack
+
+
+ + + + + + Learn More About Me + +
+
+ +
+
+

+ +

+
+
    + {targetStack?.match(/dev/i) ? ( + + {webDevStack.map((item: { title: string; description: string }, index: number) => ( +
  • +

    + +

    + + + +
  • + ))} +
    + ) : ( + + {uiStack.map((item: { title: string; description: string }, index: number) => ( +
  • +

    + +

    + + + +
  • + ))} +
    + )} +
+
+
+
+
+ ); +} diff --git a/app/(components)/Hero.tsx b/app/(components)/Hero.tsx new file mode 100644 index 0000000..fc2fd67 --- /dev/null +++ b/app/(components)/Hero.tsx @@ -0,0 +1,76 @@ +"use client"; + +import React from "react"; +import Image from "next/image"; +import TextShuffler from "../../components/actions/TextShuffler"; +import { hero } from "../(utils)/animate"; + +export default function Hero() { + React.useEffect(hero, []); + + return ( +
+
+
+ Benjamin Toby Image +
+ +
+

+ {/* Hi */} + {/* Fullstack developer, UI/UX designer, Software Engineer, welcome */} + +

+ +
+ + See my resume + + + Linkedin + + + Contact Me + +
+
+
+
+ ); +} diff --git a/app/(styles)/header.css b/app/(styles)/header.css new file mode 100644 index 0000000..f962908 --- /dev/null +++ b/app/(styles)/header.css @@ -0,0 +1,6 @@ +header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} diff --git a/app/(utils)/animate.ts b/app/(utils)/animate.ts new file mode 100644 index 0000000..67ff651 --- /dev/null +++ b/app/(utils)/animate.ts @@ -0,0 +1,149 @@ +import { gsap } from "gsap"; +import ScrollTrigger from "gsap/ScrollTrigger"; +import TextPlugin from "gsap/TextPlugin"; + +/** + * Register plugins + */ +gsap.registerPlugin(ScrollTrigger); +gsap.registerPlugin(TextPlugin); + +/** + * Animates the hero section + */ +export function hero() { + /** + * Animate hero section + */ + gsap.fromTo( + "#main-image", + { + z: -100, + scale: 1.2, + }, + { + z: 0, + duration: 1.5, + scale: 1, + } + ); + + gsap.fromTo( + "#hero-text-section", + { + z: -100, + scale: 1.2, + }, + { + z: 0, + duration: 2.5, + scale: 1, + } + ); + + gsap.fromTo( + "#main-image", + { + y: 0, + // scale: 1, + }, + { + scrollTrigger: { + scrub: 1, + }, + y: 150, + // scale: 0.8, + } + ); + + gsap.fromTo( + "#hero-text-section", + { + y: 0, + // scale: 1, + }, + { + scrollTrigger: { + scrub: 2, + }, + y: 100, + // scale: 0.8, + } + ); +} + +/** + * Animates the about section + */ +export function about() { + gsap.fromTo( + "#about-section", + { + y: 40, + scale: 0.8, + }, + { + scrollTrigger: { + scrub: 4, + }, + y: 0, + scale: 1.1, + } + ); + + gsap.to("#about-me-label", { + scrollTrigger: { + scrub: 2, + }, + y: 300, + scale: 0.8, + }); +} + +/** + * Animates the about section + */ +export function genericScroll() { + gsap.fromTo( + ".generic-scroll", + { + y: 0, + scale: 0.9, + }, + { + scrollTrigger: { + scrub: 3, + }, + y: 100, + scale: 1, + } + ); +} + +/** + * Animates the about section + */ +export function appear() { + gsap.fromTo( + ".appear", + { + y: 40, + scale: 0.8, + opacity: 0, + }, + { + y: 0, + scale: 1, + opacity: 1, + duration: 2, + delay: (i, target) => { + const datasetDelay = target?.dataset?.delay; + + if (datasetDelay) { + return datasetDelay; + } + return 0; + }, + } + ); +} diff --git a/app/(utils)/ui-ux-stack.json b/app/(utils)/ui-ux-stack.json new file mode 100644 index 0000000..9ce0230 --- /dev/null +++ b/app/(utils)/ui-ux-stack.json @@ -0,0 +1,30 @@ +[ + { + "title": "Adobe Photoshop", + "description": "Web design, image manipulation, image compositing, and more." + }, + { + "title": "Adobe Illustrator", + "description": "Vector graphic of all types" + }, + { + "title": "Figma", + "description": "Web, UI, UX design." + }, + { + "title": "Affinity Designer", + "description": "Vector graphics." + }, + { + "title": "After Effects", + "description": "Motion graphics and animation" + }, + { + "title": "Adobe XD", + "description": "UI/UX design" + }, + { + "title": "Webflow", + "description": "Visual Web coding" + } +] diff --git a/app/(utils)/web-dev-stack.json b/app/(utils)/web-dev-stack.json new file mode 100644 index 0000000..be75009 --- /dev/null +++ b/app/(utils)/web-dev-stack.json @@ -0,0 +1,42 @@ +[ + { + "title": "HTML, CSS, Javascript", + "description": "The basics, the bedrock of all websites." + }, + { + "title": "HTML, CSS, Javascript", + "description": "The basics, the bedrock of all websites." + }, + { + "title": "React JS", + "description": "JavaScript library for high-performance web applications" + }, + { + "title": "Next JS", + "description": "High performance React and Node js web framework for building blazing flast and performant web applications" + }, + { + "title": "Tailwind CSS", + "description": "Lighting fast mobile first styling" + }, + { + "title": "Node JS", + "description": "JavaScript runtime for the server. For creating backend architectures and APIs" + }, + { + "title": "Ubuntu Linux", + "description": "Secure server management with ubuntu and Linux" + }, + { + "title": "Nginx", + "description": "Super secure web server, reverse proxy and load balancer" + }, + { + "title": "MySQL", + "description": "Tried and tested data storage, querying, and management." + }, + { + "title": "Git and Github", + "description": "Version control" + } +] diff --git a/app/about/(components)/Hero.tsx b/app/about/(components)/Hero.tsx new file mode 100644 index 0000000..d0f63b0 --- /dev/null +++ b/app/about/(components)/Hero.tsx @@ -0,0 +1,35 @@ +"use client"; + +import React from "react"; +import TextShuffler from "../../../components/actions/TextShuffler"; +import { appear, genericScroll } from "../../(utils)/animate"; + +export default function Hero() { + React.useEffect(genericScroll, []); + React.useEffect(appear, []); + + return ( +
+
+ + + +

+ +

+ + + +
+
+ ); +} diff --git a/app/about/(components)/MoreAboutMe.tsx b/app/about/(components)/MoreAboutMe.tsx new file mode 100644 index 0000000..4edf0a6 --- /dev/null +++ b/app/about/(components)/MoreAboutMe.tsx @@ -0,0 +1,97 @@ +"use client"; + +import React from "react"; +import TextShuffler from "../../../components/actions/TextShuffler"; +import { appear, genericScroll } from "../../(utils)/animate"; + +export default function MoreAboutMe() { + React.useEffect(genericScroll, []); + React.useEffect(appear, []); + + const webDevStack = require("../../(utils)/web-dev-stack.json"); + const uiStack = require("../../(utils)/ui-ux-stack.json"); + + const [targetStack, setTargetStack] = React.useState("dev"); + + return ( +
+
+ +
+
+

+ +

+ +
+
+
{ + setTargetStack("dev"); + }} + > +
Web Dev Stack
+
+
{ + setTargetStack("design"); + }} + > +
UI/UX Stack
+
+
+
+
+ +
+
+

+ +

+
+
    + {targetStack?.match(/dev/i) ? ( + + {webDevStack.map((item: { title: string; description: string }, index: number) => ( +
  • +

    + +

    + + + +
  • + ))} +
    + ) : ( + + {uiStack.map((item: { title: string; description: string }, index: number) => ( +
  • +

    + +

    + + + +
  • + ))} +
    + )} +
+
+
+
+
+ ); +} diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..363b66b --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import MoreAboutMe from "./(components)/MoreAboutMe"; +import Hero from "./(components)/Hero"; + +export default function AboutPage() { + return ( + + + + + ); +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..ebe50bb --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,31 @@ +// General imports +import { Metadata } from "next"; +import GeneralLayout from "../layouts/general_layout/GeneralLayout"; + +// Styles imports +import "../styles/main.css"; +import "../styles/tw_main.css"; + +// Metadata +export const metadata: Metadata = { + title: "Homepage", + description: "Software engineer, UI/UX designer, Full Stack Web Developer, Web/graphic/motion designer, React Developer, Next JS developer, Node JS developer, Javascript Developer, Linux Ubuntu, DevOps, Nginx, MySQL developer, Freelancer", + keywords: "UI/UX designer, Full Stack Web Developer, Web/graphic/motion designer, React Developer, NextJS developer, Node JS developer, Javascript Developer, Linux Ubuntu, DevOps, Nginx, MySQL developer, Freelancer", +}; + +// Main Layout Component +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..81f63a2 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import Hero from "./(components)/Hero"; +import AboutSection from "./(components)/AboutSection"; + +export default function Homepage() { + return ( + + + + + ); +} diff --git a/components/actions/TextShuffler.jsx b/components/actions/TextShuffler.jsx deleted file mode 100644 index e5f9a38..0000000 --- a/components/actions/TextShuffler.jsx +++ /dev/null @@ -1,167 +0,0 @@ -import React, { Fragment, useEffect, useState } from 'react'; -import { gsap } from "gsap"; - -let timer = 0; -let keyNum = 0; -let textTimeout; -let textInterval; -// let chars = ("abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-;.,/?><][}{:`~").split(""); -let interval = 200; - -const TextShuffler = ({ textInput, delay }) => { - - // let [text, setText] = useState(textInput); - // let [refresh, setRefresh] = useState(0); - let [readyState, setReadyState] = useState(false); - - const spanRef = React.useRef(); - - useEffect(() => { - const spanObserver = new IntersectionObserver((entries, observer) => { - if (entries[0].isIntersecting) { - if (delay) { - setTimeout(() => { - setReadyState(true); - }, delay); - } else { - setReadyState(true); - } - - observer.unobserve(spanRef.current) - } - - }, { - rootMargin: "0px 0px 0px 0px" - }); - - spanObserver.observe(spanRef.current) - }, []) - - // useEffect(() => { - // if (!readyState) return; - - // requestAnimationFrame(() => { - // textTimeout = setTimeout(() => { - // if (timer === 7) { - // setText(textInput); - // return window.clearTimeout(textTimeout); - // }; - - // setRefresh(prev => prev + 1); - // timer++ - // }, 300); - // }) - // }, [refresh, readyState]) - - useEffect(() => { - if (!readyState) return; - - - - let chars = textInput.split(""); - - - - let charsSpans = chars.map(char => `${char}`) - - spanRef.current.innerHTML = charsSpans.join(""); - - gsap.to(spanRef.current, { - opacity: 1, - duration: 1 - }); - - let textSpans = spanRef.current.querySelectorAll("span"); - - // textInterval = setInterval(() => { - // if (timer >= 600) { - // window.clearInterval(textInterval); - - // requestAnimationFrame(() => { - // textSpans.forEach(span => { - // // gsap.killTweensOf(span, "opacity"); - - // gsap.to(span, { - // opacity: 1, - // duration: Math.random(), - // delay: Math.random() - // }) - // }) - // }) - - // return; - // } - - // requestAnimationFrame(() => { - // textSpans.forEach(span => { - // gsap.to(span, { - // opacity: 1, - // duration: Math.random() * 2, - // delay: Math.random() * 1.5 - // }) - // }) - - // // textSpans.forEach(span => { - // // gsap.to(span, { - // // opacity: 0, - // // duration: Math.random() * 2, - // // delay: Math.random() * 1.5 - // // }) - // // }) - - // // gsap.to(spanRef.current, { - // // opacity: 0, - // // duration: 2 - // // }); - - // timer += interval; - // }) - - // }, interval) - - requestAnimationFrame(() => { - // let charsSpans = chars.map(char => `${char}`) - - // spanRef.current.innerHTML = charsSpans.join(""); - - // let textSpans = spanRef.current.querySelectorAll("span"); - - textSpans.forEach(span => { - gsap.to(span, { - opacity: 1, - duration: Math.random() * 1.5, - }) - }) - - textSpans.forEach(span => { - gsap.killTweensOf(span, "opacity"); - gsap.to(span, { - opacity: 0, - duration: Math.random() * 1.5, - delay: Math.random() * 0.5 - }) - }) - - textSpans.forEach(span => { - gsap.killTweensOf(span, "opacity"); - - gsap.to(span, { - opacity: 1, - duration: Math.random() * 1.5, - delay: Math.random() - }) - }) - }) - - - }, [readyState]) - - return ( - - {/* { text.split("").map(char => { char }) } */ } - { textInput } - - ) -} - -export default TextShuffler diff --git a/components/actions/TextShuffler.tsx b/components/actions/TextShuffler.tsx new file mode 100644 index 0000000..cb58b08 --- /dev/null +++ b/components/actions/TextShuffler.tsx @@ -0,0 +1,98 @@ +"use client"; + +import React, { FC, useEffect, useState, ReactElement } from "react"; +import { gsap } from "gsap"; + +type ChildProps = { + textInput: string; + delay?: number; +}; + +const TextShuffler: FC = ({ textInput, delay }): ReactElement => { + let [readyState, setReadyState] = useState(false); + + const spanRef = React.useRef(null); + + useEffect(() => { + const spanObserver = new IntersectionObserver( + (entries, observer) => { + if (entries[0].isIntersecting) { + if (delay) { + setTimeout(() => { + setReadyState(true); + }, delay); + } else { + setReadyState(true); + } + if (spanRef.current) observer.unobserve(spanRef.current); + } + }, + { + rootMargin: "0px 0px 0px 0px", + } + ); + + if (spanRef.current) spanObserver.observe(spanRef.current); + }, []); + + useEffect(() => { + if (!readyState) return; + + let chars = textInput.split(""); + + let charsSpans = chars.map((char) => `${char}`); + + if (spanRef?.current?.innerHTML) spanRef.current.innerHTML = charsSpans.join(""); + + if (spanRef.current) { + gsap.to(spanRef.current, { + opacity: 1, + duration: 1, + }); + } + + let textSpans: NodeList | null = spanRef.current ? spanRef.current.querySelectorAll("span") : null; + + requestAnimationFrame(() => { + if (textSpans) { + textSpans.forEach((span) => { + gsap.to(span, { + opacity: 1, + duration: Math.random() * 1.5, + }); + }); + + textSpans.forEach((span) => { + gsap.killTweensOf(span, "opacity"); + gsap.to(span, { + opacity: 0, + duration: Math.random() * 1.5, + delay: Math.random() * 0.5, + }); + }); + + textSpans.forEach((span) => { + gsap.killTweensOf(span, "opacity"); + + gsap.to(span, { + opacity: 1, + duration: Math.random() * 1.5, + delay: Math.random(), + }); + }); + } + }); + }, [readyState]); + + return ( + + {textInput} + + ); +}; + +export default TextShuffler; diff --git a/functions/backend/sanitizeHtmlOptions.ts b/functions/backend/sanitizeHtmlOptions.ts new file mode 100644 index 0000000..a237830 --- /dev/null +++ b/functions/backend/sanitizeHtmlOptions.ts @@ -0,0 +1,10 @@ +const sanitizeHtmlOptions: object = { + allowedTags: ["b", "i", "em", "strong", "a", "p", "span", "ul", "ol", "li", "h1", "h2", "h3", "h4", "h5", "h6", "img", "div", "button", "pre", "code", "br"], + allowedAttributes: { + a: ["href"], + img: ["src", "alt", "width", "height", "class", "style"], + "*": ["style", "class"], + }, +}; + +export default sanitizeHtmlOptions; diff --git a/functions/frontend/threeJsAnimations.js b/functions/frontend/threeJsAnimations.js index b8e2c88..f8e6b3e 100644 --- a/functions/frontend/threeJsAnimations.js +++ b/functions/frontend/threeJsAnimations.js @@ -2,7 +2,6 @@ import * as THREE from "three"; export default function threeJsAnimations() { const animationWrapper = document.getElementById("homepage-animation-wrapper"); - console.log(THREE); const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, animationWrapper.clientWidth / animationWrapper.clientHeight, 0.1, 1000); @@ -16,13 +15,6 @@ export default function threeJsAnimations() { const sphereSize = 1; const pointLightHelper = new THREE.PointLightHelper(pointLight, sphereSize); - // const spotLight = new THREE.SpotLight(0xffffff); - // spotLight.position.set(10, 10, 10); - // scene.add(spotLight); - - // const spotLightHelper = new THREE.SpotLightHelper(spotLight); - // scene.add(spotLightHelper); - const renderer = new THREE.WebGLRenderer(); renderer.setSize(animationWrapper.clientWidth, animationWrapper.clientHeight); animationWrapper.appendChild(renderer.domElement); @@ -122,21 +114,10 @@ export default function threeJsAnimations() { relMouseX < 0 ? (cube3.position.x += 0.0007) : (cube3.position.x -= 0.0007); relMouseY > 0 ? (cube3.position.y += 0.0007) : (cube3.position.y -= 0.0007); - - // relMouseX < 0 ? scene.rotateX(5) : scene.rotateX(-5); - // relMouseY > 0 ? scene.rotateX(5) : scene.rotateX(-5); - // relMouseX < 0 ? (scene.rotation.z += 0.005) : (scene.rotation.x += 0.005); - // relMouseY > 0 ? (scene.rotation.y += 0.005) : (scene.rotation.y += 0.005); - // cube.rotation.x += relMouseX / e.x; - // cube.rotation.y += relMouseY / e.y; - - // scene.rotation.x; }); window.addEventListener("resize", (e) => { renderer.setSize(animationWrapper.clientWidth, window.innerHeight); - // animationWrapper.querySelector("canvas").width = animationWrapper.clientWidth; - // animationWrapper.querySelector("canvas").height = animationWrapper.clientHeight; }); window.addEventListener("scroll", (e) => { diff --git a/layouts/general_layout/BG.tsx b/layouts/general_layout/BG.tsx new file mode 100644 index 0000000..efe8885 --- /dev/null +++ b/layouts/general_layout/BG.tsx @@ -0,0 +1,46 @@ +"use client"; + +import React from "react"; +import { gsap } from "gsap"; +// import scrollTrigger from "gsap/ScrollTrigger"; + +const BG = () => { + React.useEffect(() => { + // gsap.registerPlugin(scrollTrigger); + + gsap.to("#bg-blurred-image", { + scrollTrigger: { + scrub: 5, + }, + y: 50, + scale: 0.8, + }); + + gsap.to("#bg-image", { + scrollTrigger: { + scrub: 2, + }, + y: 50, + opacity: 0, + }); + }, []); + + return ( + + bg-image + bg-image + + ); +}; + +export default BG; diff --git a/layouts/general_layout/GeneralFooter.jsx b/layouts/general_layout/GeneralFooter.jsx deleted file mode 100644 index b40159f..0000000 --- a/layouts/general_layout/GeneralFooter.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' - -const GeneralFooter = () => { - const date = new Date(); - return ( -
- {/*
- Tben.me -
*/} - Copyright © { date.getFullYear() } Tben.me. All Rights Reserved. -
- ) -} - -export default GeneralFooter diff --git a/layouts/general_layout/GeneralFooter.tsx b/layouts/general_layout/GeneralFooter.tsx new file mode 100644 index 0000000..f6d737c --- /dev/null +++ b/layouts/general_layout/GeneralFooter.tsx @@ -0,0 +1,42 @@ +import React from "react"; +import Image from "next/image"; + +const GeneralFooter = () => { + const date = new Date(); + return ( +
+
+ + Logo + +
+
+ Contact Me +
+ LinkedIn + Mail + Phone +
+
+ Copyright © {date.getFullYear()} Tben.me. All Rights Reserved. +
+
+
+ ); +}; + +export default GeneralFooter; diff --git a/layouts/general_layout/GeneralHeader.jsx b/layouts/general_layout/GeneralHeader.jsx deleted file mode 100644 index d03ed86..0000000 --- a/layouts/general_layout/GeneralHeader.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react' -import { useRouter } from 'next/router'; - -const GeneralHeader = () => { - const router = useRouter(); - - function pushRouter(e) { - e.preventDefault(); - let url = e.target.dataset.href; - router.push(url); - } - - return ( -
- { - pushRouter("/") - } }>

Tben.me

- -
- ) -} - -export default GeneralHeader diff --git a/layouts/general_layout/GeneralHeader.tsx b/layouts/general_layout/GeneralHeader.tsx new file mode 100644 index 0000000..f186119 --- /dev/null +++ b/layouts/general_layout/GeneralHeader.tsx @@ -0,0 +1,73 @@ +import React from "react"; +import { useRouter } from "next/navigation"; +import Image from "next/image"; + +import { gsap } from "gsap"; + +/** + * General Header for all pages + */ +const GeneralHeader = (): React.ReactElement => { + const links: { title: string; url: string }[] = require("./links.json"); + + /** + * Animate the header on mount + */ + React.useEffect(() => { + gsap.fromTo( + "#main-header", + { + y: -20, + filter: "blur(100px)", + webkitFilter: "blur(100px)", + opacity: 0, + }, + { + y: 0, + opacity: 1, + duration: 1, + filter: "none", + webkitFilter: "none", + delay: 0.5, + } + ); + }, []); + + return ( +
+ + Logo + + + +
+ ); +}; + +export default GeneralHeader; diff --git a/layouts/general_layout/GeneralLayout.jsx b/layouts/general_layout/GeneralLayout.jsx deleted file mode 100644 index 0103675..0000000 --- a/layouts/general_layout/GeneralLayout.jsx +++ /dev/null @@ -1,94 +0,0 @@ -import React, { Fragment } from 'react'; -import GeneralHeader from './GeneralHeader'; -import Head from "next/head" -import GeneralFooter from './GeneralFooter'; -import { gsap } from "gsap"; -import threeJsAnimations from '../../functions/frontend/threeJsAnimations'; - -export const SiteContext = React.createContext(); - -const GeneralLayout = ({ children, pageName }) => { - const [readyState, setReadyState] = React.useState(false); - - // React.useEffect(() => { - // setReadyState(true); - // }, [readyState]); - - React.useEffect(() => { - // barba.init({ - // transitions: [{ - // name: 'default-transition', - // leave() { - // // create your stunning leave animation here - // return gsap.to("main", { - // opacity: 1, - // duration: 1, - // delay: 2 - // }) - // }, - // enter() { - // // create your amazing enter animation here - // return gsap.from("main", { - // opacity: 0, - // duration: 1, - // delay: 2 - // }) - // } - // }] - // }); - - // window.addEventListener("load", () => { - // }) - // setReadyState(true); - - document.querySelectorAll("nav a").forEach((link) => { - let locationRegex = new RegExp(`${window.location.pathname}.*?`); - if (link.dataset.href === window.location.pathname) { - link.classList.add("active-page"); - } - - if (window.location.pathname.match(new RegExp(`${link.dataset.href}\\/.*`))) { - link.classList.add("active-page"); - } - }); - - gsap.to("#main-content-wrapper", { - opacity: 1, - duration: 2, - }) - - // gsap.to("#page-loader", { - // opacity: 0, - // duration: 0.5, - // delay: 1, - // pointerEvents: "none" - // }) - - // document.getElementById("page-loader").style.opacity - - threeJsAnimations(); - }, []) - - - - - return ( - - - - - -
- -
- { children } -
- -
-
- -
- ) -} - -export default GeneralLayout diff --git a/layouts/general_layout/GeneralLayout.tsx b/layouts/general_layout/GeneralLayout.tsx new file mode 100644 index 0000000..47077de --- /dev/null +++ b/layouts/general_layout/GeneralLayout.tsx @@ -0,0 +1,62 @@ +"use client"; + +import React, { ReactElement } from "react"; +import GeneralHeader from "./GeneralHeader"; +import GeneralFooter from "./GeneralFooter"; +import { gsap } from "gsap"; +import BG from "./BG"; + +export const SiteContext = React.createContext({}); + +type GeneralLayoutProps = { + children: React.ReactNode; +}; + +const GeneralLayout = ({ children }: GeneralLayoutProps): ReactElement => { + const [readyState, setReadyState] = React.useState(false); + + React.useEffect(() => { + const links: NodeListOf | null = document.querySelectorAll("nav a"); + + links?.forEach((link) => { + if (link.dataset.href === window.location.pathname) { + link.classList.add("active-page"); + } + + if (window.location.pathname.match(new RegExp(`${link.dataset.href}\\/.*`))) { + link.classList.add("active-page"); + } + }); + + gsap.to("#main-content-wrapper", { + opacity: 1, + duration: 2, + }); + }, []); + + return ( + +
+ +
+ {children} +
+ +
+ +
+ ); +}; + +export default GeneralLayout; diff --git a/layouts/general_layout/links.json b/layouts/general_layout/links.json new file mode 100644 index 0000000..2f091b7 --- /dev/null +++ b/layouts/general_layout/links.json @@ -0,0 +1,27 @@ +[ + { + "title": "Home", + "url": "/" + }, + { + "title": "About Me", + "url": "/about" + }, + { + "title": "My Work", + "url": "/work" + }, + { + "title": "My Resume", + "url": "/documents/Resume-Benjamin-Toby-Linkedin.pdf", + "download": true + }, + { + "title": "Blog", + "url": "/blog" + }, + { + "title": " Contact Me", + "url": "/contact" + } +] diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..fd36f94 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/next.config.js b/next.config.js index c1607e2..76ff8eb 100644 --- a/next.config.js +++ b/next.config.js @@ -3,4 +3,14 @@ module.exports = { eslint: { ignoreDuringBuilds: true, }, + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "static.datasquirel.com", + port: "", + pathname: "/images/**", + }, + ], + }, }; diff --git a/package-lock.json b/package-lock.json index 610c641..b76f863 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "personal_site", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -11,15 +11,32 @@ "dependencies": { "@barba/core": "^2.9.7", "contentful": "^9.1.32", + "datasquirel": "^1.1.82", "gsap": "^3.10.4", - "next": "^12.0.4", + "next": "^13.4.10", "nodemailer": "^6.7.2", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sanitize-html": "^2.11.0", "three": "^0.138.3" }, "devDependencies": { - "tailwindcss": "^3.0.23" + "@types/node": "^20.4.2", + "@types/react": "^18.2.15", + "tailwindcss": "^3.0.23", + "typescript": "^5.1.6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@barba/core": { @@ -31,45 +48,77 @@ "path-to-regexp": "^3.0.0" } }, + "node_modules/@contentful/rich-text-types": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@contentful/rich-text-types/-/rich-text-types-16.2.0.tgz", + "integrity": "sha512-4BHC+mfa50JB70epzpnas4EkiuB3mGdBZ5Rp8w7R5wXvswEf8TLg5yGau2FxmZeEjrAkDrt4vzBLVQ8v3Y//Jw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, "node_modules/@next/env": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.4.tgz", - "integrity": "sha512-/gApFXWk5CCLFQJL5IYJXxPQuG5tz5nPX4l27A9Zm/+wJxiwFrRSP54AopDxIv4JRp/rGwcgk/lZS/0Clw8jYA==" - }, - "node_modules/@next/swc-android-arm-eabi": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.4.tgz", - "integrity": "sha512-P4YSFNpmXXSnn3P1qsOAqz+MX3On9fHrlc8ovb/CFJJoU+YLCR53iCEwfw39e0IZEgDA7ttgr108plF8mxaX0g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-android-arm64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.4.tgz", - "integrity": "sha512-4o2n14E18O+8xHlf6dgJsWPXN9gmSmfIe2Z0EqKDIPBBkFt/2CyrH0+vwHnL2l7xkDHhOGfZYcYIWVUR5aNu0A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz", + "integrity": "sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.4.tgz", - "integrity": "sha512-DcUO6MGBL9E3jj5o86MUnTOy4WawIJJhyCcFYO4f51sbl7+uPIYIx40eo98A6NwJEXazCqq1hLeqOaNTAIvDiQ==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz", + "integrity": "sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==", "cpu": [ "arm64" ], @@ -82,9 +131,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.4.tgz", - "integrity": "sha512-IUlFMqeLjdIzDorrGC2Dt+2Ae3DbKQbRzCzmDq4/CP1+jJGeDXo/2AHnlE+WYnwQAC4KtAz6pbVnd3KstZWsVA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz", + "integrity": "sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==", "cpu": [ "x64" ], @@ -96,40 +145,10 @@ "node": ">= 10" } }, - "node_modules/@next/swc-freebsd-x64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.4.tgz", - "integrity": "sha512-475vwyWcjnyDVDWLgAATP0HI8W1rwByc+uXk1B6KkAVFhkoDgH387LW0uNqxavK+VxCzj3avQXX/58XDvxtSlg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm-gnueabihf": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.4.tgz", - "integrity": "sha512-qZW+L3iG3XSGtlOPmD5RRWXyk6ZNdscLV0BQjuDvP+exTg+uixqHXOHz0/GVATIJEBQOF0Kew7jAXVXEP+iRTQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.4.tgz", - "integrity": "sha512-fEPRjItWYaKyyG9N+2HIA59OBHIhk7WC+Rh+LwXsh0pQe870Ykpek3KQs0umjsrEGe57NyMomq3f80/N8taDvA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz", + "integrity": "sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==", "cpu": [ "arm64" ], @@ -142,9 +161,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.4.tgz", - "integrity": "sha512-rnCTzXII0EBCcFn9P5s/Dho2kPUMSX/bP0iOAj8wEI/IxUEfEElbin89zJoNW30cycHu19xY8YP4K2+hzciPzQ==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz", + "integrity": "sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==", "cpu": [ "arm64" ], @@ -157,9 +176,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.4.tgz", - "integrity": "sha512-PhXX6NSuIuhHInxPY2VkG2Bl7VllsD3Cjx+pQcS1wTym7Zt7UoLvn05PkRrkiyIkvR+UXnqPUM3TYiSbnemXEw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz", + "integrity": "sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==", "cpu": [ "x64" ], @@ -172,9 +191,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.4.tgz", - "integrity": "sha512-GmC/QROiUZpFirHRfPQqMyCXZ+5+ndbBZrMvL74HtQB/CKXB8K1VM+rvy9Gp/5OaU8Rxp48IcX79NOfI2LiXlA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz", + "integrity": "sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==", "cpu": [ "x64" ], @@ -187,9 +206,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.4.tgz", - "integrity": "sha512-9XKoCXbNZuaMRPtcKQz3+hgVpkMosaLlcxHFXT8/j4w61k7/qvEbrkMDS9WHNrD/xVcLycwhPRgXcns2K1BdBQ==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz", + "integrity": "sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==", "cpu": [ "arm64" ], @@ -202,9 +221,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.4.tgz", - "integrity": "sha512-hEyRieZKH9iw4AzvXaQ+Fyb98k0G/o9QcRGxA1/O/O/elf1+Qvuwb15phT8GbVtIeNziy66XTPOhKKfdr8KyUg==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz", + "integrity": "sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==", "cpu": [ "ia32" ], @@ -217,9 +236,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.4.tgz", - "integrity": "sha512-5Pl1tdMJWLy4rvzU1ecx0nHWgDPqoYuvYoXE/5X0Clu9si/yOuBIj573F2kOTY7mu0LX2wgCJVSnyK0abHBxIw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz", + "integrity": "sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==", "cpu": [ "x64" ], @@ -267,49 +286,52 @@ } }, "node_modules/@swc/helpers": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.3.tgz", - "integrity": "sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", "dependencies": { "tslib": "^2.4.0" } }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "node_modules/@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "dev": true }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz", + "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==", "dev": true, "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "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==", + "dev": true }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -339,6 +361,12 @@ "form-data": "^4.0.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==", + "dev": true + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -348,6 +376,16 @@ "node": ">=8" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -360,6 +398,17 @@ "node": ">=8" } }, + "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.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -382,9 +431,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001374", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz", - "integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==", + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", "funding": [ { "type": "opencollective", @@ -393,6 +442,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -435,11 +488,10 @@ "node": ">= 6" } }, - "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==", - "dev": true + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -452,16 +504,32 @@ "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==", + "dev": true, + "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 + }, "node_modules/contentful": { - "version": "9.1.33", - "resolved": "https://registry.npmjs.org/contentful/-/contentful-9.1.33.tgz", - "integrity": "sha512-iiu2cC/9JvDrTK6cfSHhZ1iW6dOq+NmYMA2p5Thpv+9h2pEOyoHm1Un9Xir5XZSB11bu4POmo6JazGAn9N0tqg==", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/contentful/-/contentful-9.3.5.tgz", + "integrity": "sha512-QVXHwD9nxREBpcemC6Po2LUYStmBBHPyVbN3SKzkR+WmIZhflF6x+TDmmz2jcCg/RSN+INDZbhe8FQ1S/zTE8w==", "hasInstallScript": true, "dependencies": { + "@contentful/rich-text-types": "^16.0.2", "axios": "^0.27.0", - "contentful-resolve-response": "^1.3.0", - "contentful-sdk-core": "^7.0.1", - "fast-copy": "^2.1.0", + "contentful-resolve-response": "^1.3.12", + "contentful-sdk-core": "^7.0.5", + "fast-copy": "^2.1.7", "json-stringify-safe": "^5.0.1" }, "engines": { @@ -469,22 +537,22 @@ } }, "node_modules/contentful-resolve-response": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/contentful-resolve-response/-/contentful-resolve-response-1.3.8.tgz", - "integrity": "sha512-y3ttLqttxAN8yh3KfXNF+5kbnJa/01VFV/Rr1GNCaTWEVp6S9VGsTa1GH1cSf5czrK4nM4LUG5r6SzgNg3OkWw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/contentful-resolve-response/-/contentful-resolve-response-1.7.0.tgz", + "integrity": "sha512-NIaQkXAdNWf/1wp13aqtrmHWHy71oCIIbynojGs9ONDtA7hBXC2yCEf2IjzfgOkrkEfOMvwDQHizD0WmL6FR8w==", "dependencies": { - "fast-copy": "^2.1.3" + "fast-copy": "^2.1.7" }, "engines": { "node": ">=4.7.2" } }, "node_modules/contentful-sdk-core": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-7.0.2.tgz", - "integrity": "sha512-HkBzzzJ3UGqOIJiTd4qMEMvn44ccrN7a75gEej28X1srGn05myRgJ/pWbmXJhtgpq/5gU7IURnynyKx/ecsOfg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-7.1.0.tgz", + "integrity": "sha512-RzTPnRsbCdVAhyka3wa9sDsAu9YsxoerNgaMqd63Ljb7qpG2zkdHcP7NTfyIbuHDJNJdAQdifyafxfEEwP+q/w==", "dependencies": { - "fast-copy": "^2.1.3", + "fast-copy": "^2.1.7", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "p-throttle": "^4.1.1", @@ -506,12 +574,25 @@ "node": ">=4" } }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, + "node_modules/datasquirel": { + "version": "1.1.82", + "resolved": "https://registry.npmjs.org/datasquirel/-/datasquirel-1.1.82.tgz", + "integrity": "sha512-SOkoURo7GDAfmyquVJLHzwkuMQ5Gq9GjPFX0RderX3wZb66YNQyMvEc/bpI5w/2XQpEpYln2ru8+JA+OFegx5Q==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -520,23 +601,6 @@ "node": ">=0.4.0" } }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -549,15 +613,88 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-copy": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.3.tgz", - "integrity": "sha512-LDzYKNTHhD+XOp8wGMuCkY4eTxFZOOycmpwLBiuF3r3OjOmZnURRD8t2dUAbmKuXGbo/MGggwbSjcBdp8QT0+g==" + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz", + "integrity": "sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -583,9 +720,9 @@ } }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -604,9 +741,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -635,6 +772,12 @@ "node": ">= 6" } }, + "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 + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -655,18 +798,39 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -679,10 +843,20 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/gsap": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.10.4.tgz", - "integrity": "sha512-6QatdkKxXCMfvCW4rM++0RqyLQAzFX5nwl3yHS0XPgkZBkiSEY3VZVbMltrdtsbER/xZonLtyHt684wRp4erlQ==" + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.2.tgz", + "integrity": "sha512-EkYnpG8qHgYBFAwsgsGEqvT1WUidX0tt/ijepx7z8EUJHElykg91RvW1XbkT59T0gZzzszOpjQv7SE41XuIXyQ==" }, "node_modules/has": { "version": "1.0.3", @@ -695,6 +869,17 @@ "node": ">= 0.4.0" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "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", @@ -706,6 +891,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "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==", + "dev": true, + "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 + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -719,9 +938,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -760,11 +979,28 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -776,14 +1012,20 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "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==", + "dev": true + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -846,16 +1088,39 @@ "node": ">= 0.6" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -864,50 +1129,48 @@ } }, "node_modules/next": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-12.2.4.tgz", - "integrity": "sha512-b1xlxEozmAWokAXzXsi5vlmU/IfJcFNIJA8dpU5UdkFbyDPio8wwb8mAQ/Y7rGtfTgG/t/u49BiyEA+xAgFvow==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.10.tgz", + "integrity": "sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==", "dependencies": { - "@next/env": "12.2.4", - "@swc/helpers": "0.4.3", - "caniuse-lite": "^1.0.30001332", + "@next/env": "13.4.10", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", - "styled-jsx": "5.0.2", - "use-sync-external-store": "1.2.0" + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=12.22.0" + "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-android-arm-eabi": "12.2.4", - "@next/swc-android-arm64": "12.2.4", - "@next/swc-darwin-arm64": "12.2.4", - "@next/swc-darwin-x64": "12.2.4", - "@next/swc-freebsd-x64": "12.2.4", - "@next/swc-linux-arm-gnueabihf": "12.2.4", - "@next/swc-linux-arm64-gnu": "12.2.4", - "@next/swc-linux-arm64-musl": "12.2.4", - "@next/swc-linux-x64-gnu": "12.2.4", - "@next/swc-linux-x64-musl": "12.2.4", - "@next/swc-win32-arm64-msvc": "12.2.4", - "@next/swc-win32-ia32-msvc": "12.2.4", - "@next/swc-win32-x64-msvc": "12.2.4" + "@next/swc-darwin-arm64": "13.4.10", + "@next/swc-darwin-x64": "13.4.10", + "@next/swc-linux-arm64-gnu": "13.4.10", + "@next/swc-linux-arm64-musl": "13.4.10", + "@next/swc-linux-x64-gnu": "13.4.10", + "@next/swc-linux-x64-musl": "13.4.10", + "@next/swc-win32-arm64-msvc": "13.4.10", + "@next/swc-win32-ia32-msvc": "13.4.10", + "@next/swc-win32-x64-msvc": "13.4.10" }, "peerDependencies": { + "@opentelemetry/api": "^1.1.0", "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", - "react": "^17.0.2 || ^18.0.0-0", - "react-dom": "^17.0.2 || ^18.0.0-0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { - "fibers": { + "@opentelemetry/api": { "optional": true }, - "node-sass": { + "fibers": { "optional": true }, "sass": { @@ -916,9 +1179,9 @@ } }, "node_modules/nodemailer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.7.tgz", - "integrity": "sha512-pOLC/s+2I1EXuSqO5Wa34i3kXZG3gugDssH+ZNCevHad65tc8vQlCQpOLaUjopvkRQKm2Cki2aME7fEOPRy3bA==", + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", + "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==", "engines": { "node": ">=6.0.0" } @@ -936,6 +1199,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -950,13 +1214,22 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "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, + "dependencies": { + "wrappy": "1" + } + }, "node_modules/p-throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz", @@ -968,6 +1241,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -1005,6 +1292,15 @@ "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==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", @@ -1029,9 +1325,9 @@ } }, "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", @@ -1039,67 +1335,19 @@ "resolve": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "postcss": "^8.0.0" } }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.6" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" @@ -1113,9 +1361,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -1132,9 +1380,9 @@ "dev": true }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -1165,41 +1413,27 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.2.0" } }, "node_modules/read-cache": { @@ -1224,12 +1458,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -1273,13 +1507,25 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "node_modules/sanitize-html": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.11.0.tgz", + "integrity": "sha512-BG68EDHRaGKqlsNjJ2xUB7gpInPA8gVx/mvjO743hZaeMCZ2DwzW7xvsqZ+KNU4QKwj86HJ3uu2liISf2qBBUA==", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^8.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" } }, "node_modules/side-channel": { @@ -1303,10 +1549,21 @@ "node": ">=0.10.0" } }, + "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/styled-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz", - "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, "engines": { "node": ">= 12.0.0" }, @@ -1322,6 +1579,28 @@ } } }, + "node_modules/sucrase": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.33.0.tgz", + "integrity": "sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/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", @@ -1335,43 +1614,137 @@ } }, "node_modules/tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", "dev": true, "dependencies": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.11", + "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" + "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": ">=12.13.0" + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/tailwindcss/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==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "postcss": "^8.0.9" + "postcss": "^8.4.21" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" } }, "node_modules/three": { @@ -1391,17 +1764,28 @@ "node": ">=8.0" } }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "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==", + "dev": true }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, "node_modules/util-deprecate": { @@ -1410,924 +1794,40 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, "engines": { - "node": ">=0.4" + "node": ">=10.13.0" } }, + "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 + }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@barba/core": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/@barba/core/-/core-2.9.7.tgz", - "integrity": "sha512-GLtpty1fzWnd500AoUHd+hJoSCVElqth20P4W8Bf0IAA9nd1K5e8NbPnCegXC4KzOwV+JHk5DVofAZcoc+I54Q==", - "requires": { - "is-promise": "^2.1.0", - "path-to-regexp": "^3.0.0" + "node": ">= 14" } }, - "@next/env": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-12.2.4.tgz", - "integrity": "sha512-/gApFXWk5CCLFQJL5IYJXxPQuG5tz5nPX4l27A9Zm/+wJxiwFrRSP54AopDxIv4JRp/rGwcgk/lZS/0Clw8jYA==" - }, - "@next/swc-android-arm-eabi": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.2.4.tgz", - "integrity": "sha512-P4YSFNpmXXSnn3P1qsOAqz+MX3On9fHrlc8ovb/CFJJoU+YLCR53iCEwfw39e0IZEgDA7ttgr108plF8mxaX0g==", - "optional": true - }, - "@next/swc-android-arm64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.2.4.tgz", - "integrity": "sha512-4o2n14E18O+8xHlf6dgJsWPXN9gmSmfIe2Z0EqKDIPBBkFt/2CyrH0+vwHnL2l7xkDHhOGfZYcYIWVUR5aNu0A==", - "optional": true - }, - "@next/swc-darwin-arm64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.2.4.tgz", - "integrity": "sha512-DcUO6MGBL9E3jj5o86MUnTOy4WawIJJhyCcFYO4f51sbl7+uPIYIx40eo98A6NwJEXazCqq1hLeqOaNTAIvDiQ==", - "optional": true - }, - "@next/swc-darwin-x64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.2.4.tgz", - "integrity": "sha512-IUlFMqeLjdIzDorrGC2Dt+2Ae3DbKQbRzCzmDq4/CP1+jJGeDXo/2AHnlE+WYnwQAC4KtAz6pbVnd3KstZWsVA==", - "optional": true - }, - "@next/swc-freebsd-x64": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.2.4.tgz", - "integrity": "sha512-475vwyWcjnyDVDWLgAATP0HI8W1rwByc+uXk1B6KkAVFhkoDgH387LW0uNqxavK+VxCzj3avQXX/58XDvxtSlg==", - "optional": true - }, - "@next/swc-linux-arm-gnueabihf": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.2.4.tgz", - "integrity": "sha512-qZW+L3iG3XSGtlOPmD5RRWXyk6ZNdscLV0BQjuDvP+exTg+uixqHXOHz0/GVATIJEBQOF0Kew7jAXVXEP+iRTQ==", - "optional": true - }, - "@next/swc-linux-arm64-gnu": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.2.4.tgz", - "integrity": "sha512-fEPRjItWYaKyyG9N+2HIA59OBHIhk7WC+Rh+LwXsh0pQe870Ykpek3KQs0umjsrEGe57NyMomq3f80/N8taDvA==", - "optional": true - }, - "@next/swc-linux-arm64-musl": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.2.4.tgz", - "integrity": "sha512-rnCTzXII0EBCcFn9P5s/Dho2kPUMSX/bP0iOAj8wEI/IxUEfEElbin89zJoNW30cycHu19xY8YP4K2+hzciPzQ==", - "optional": true - }, - "@next/swc-linux-x64-gnu": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.2.4.tgz", - "integrity": "sha512-PhXX6NSuIuhHInxPY2VkG2Bl7VllsD3Cjx+pQcS1wTym7Zt7UoLvn05PkRrkiyIkvR+UXnqPUM3TYiSbnemXEw==", - "optional": true - }, - "@next/swc-linux-x64-musl": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.2.4.tgz", - "integrity": "sha512-GmC/QROiUZpFirHRfPQqMyCXZ+5+ndbBZrMvL74HtQB/CKXB8K1VM+rvy9Gp/5OaU8Rxp48IcX79NOfI2LiXlA==", - "optional": true - }, - "@next/swc-win32-arm64-msvc": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.2.4.tgz", - "integrity": "sha512-9XKoCXbNZuaMRPtcKQz3+hgVpkMosaLlcxHFXT8/j4w61k7/qvEbrkMDS9WHNrD/xVcLycwhPRgXcns2K1BdBQ==", - "optional": true - }, - "@next/swc-win32-ia32-msvc": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.2.4.tgz", - "integrity": "sha512-hEyRieZKH9iw4AzvXaQ+Fyb98k0G/o9QcRGxA1/O/O/elf1+Qvuwb15phT8GbVtIeNziy66XTPOhKKfdr8KyUg==", - "optional": true - }, - "@next/swc-win32-x64-msvc": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.2.4.tgz", - "integrity": "sha512-5Pl1tdMJWLy4rvzU1ecx0nHWgDPqoYuvYoXE/5X0Clu9si/yOuBIj573F2kOTY7mu0LX2wgCJVSnyK0abHBxIw==", - "optional": true - }, - "@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==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } - }, - "@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==", - "dev": true - }, - "@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==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@swc/helpers": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.3.tgz", - "integrity": "sha512-6JrF+fdUK2zbGpJIlN7G3v966PQjyx/dPt1T9km2wj+EUBqgrxCk3uX4Kct16MIm9gGxfKRcfax2hVf5jvlTzA==", - "requires": { - "tslib": "^2.4.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001374", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz", - "integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==" - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "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==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "contentful": { - "version": "9.1.33", - "resolved": "https://registry.npmjs.org/contentful/-/contentful-9.1.33.tgz", - "integrity": "sha512-iiu2cC/9JvDrTK6cfSHhZ1iW6dOq+NmYMA2p5Thpv+9h2pEOyoHm1Un9Xir5XZSB11bu4POmo6JazGAn9N0tqg==", - "requires": { - "axios": "^0.27.0", - "contentful-resolve-response": "^1.3.0", - "contentful-sdk-core": "^7.0.1", - "fast-copy": "^2.1.0", - "json-stringify-safe": "^5.0.1" - } - }, - "contentful-resolve-response": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/contentful-resolve-response/-/contentful-resolve-response-1.3.8.tgz", - "integrity": "sha512-y3ttLqttxAN8yh3KfXNF+5kbnJa/01VFV/Rr1GNCaTWEVp6S9VGsTa1GH1cSf5czrK4nM4LUG5r6SzgNg3OkWw==", - "requires": { - "fast-copy": "^2.1.3" - } - }, - "contentful-sdk-core": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-7.0.2.tgz", - "integrity": "sha512-HkBzzzJ3UGqOIJiTd4qMEMvn44ccrN7a75gEej28X1srGn05myRgJ/pWbmXJhtgpq/5gU7IURnynyKx/ecsOfg==", - "requires": { - "fast-copy": "^2.1.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "p-throttle": "^4.1.1", - "qs": "^6.9.4" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "fast-copy": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.3.tgz", - "integrity": "sha512-LDzYKNTHhD+XOp8wGMuCkY4eTxFZOOycmpwLBiuF3r3OjOmZnURRD8t2dUAbmKuXGbo/MGggwbSjcBdp8QT0+g==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" - }, - "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==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "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==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "gsap": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.10.4.tgz", - "integrity": "sha512-6QatdkKxXCMfvCW4rM++0RqyLQAzFX5nwl3yHS0XPgkZBkiSEY3VZVbMltrdtsbER/xZonLtyHt684wRp4erlQ==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "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==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "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==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "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==", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "next": { - "version": "12.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-12.2.4.tgz", - "integrity": "sha512-b1xlxEozmAWokAXzXsi5vlmU/IfJcFNIJA8dpU5UdkFbyDPio8wwb8mAQ/Y7rGtfTgG/t/u49BiyEA+xAgFvow==", - "requires": { - "@next/env": "12.2.4", - "@next/swc-android-arm-eabi": "12.2.4", - "@next/swc-android-arm64": "12.2.4", - "@next/swc-darwin-arm64": "12.2.4", - "@next/swc-darwin-x64": "12.2.4", - "@next/swc-freebsd-x64": "12.2.4", - "@next/swc-linux-arm-gnueabihf": "12.2.4", - "@next/swc-linux-arm64-gnu": "12.2.4", - "@next/swc-linux-arm64-musl": "12.2.4", - "@next/swc-linux-x64-gnu": "12.2.4", - "@next/swc-linux-x64-musl": "12.2.4", - "@next/swc-win32-arm64-msvc": "12.2.4", - "@next/swc-win32-ia32-msvc": "12.2.4", - "@next/swc-win32-x64-msvc": "12.2.4", - "@swc/helpers": "0.4.3", - "caniuse-lite": "^1.0.30001332", - "postcss": "8.4.14", - "styled-jsx": "5.0.2", - "use-sync-external-store": "1.2.0" - } - }, - "nodemailer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.7.tgz", - "integrity": "sha512-pOLC/s+2I1EXuSqO5Wa34i3kXZG3gugDssH+ZNCevHad65tc8vQlCQpOLaUjopvkRQKm2Cki2aME7fEOPRy3bA==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "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==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "p-throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz", - "integrity": "sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g==" - }, - "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==", - "dev": true - }, - "path-to-regexp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", - "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "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==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "styled-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz", - "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==", - "requires": {} - }, - "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==", - "dev": true - }, - "tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", - "dev": true, - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - } - }, - "three": { - "version": "0.138.3", - "resolved": "https://registry.npmjs.org/three/-/three-0.138.3.tgz", - "integrity": "sha512-4t1cKC8gimNyJChJbaklg8W/qj3PpsLJUIFm5LIuAy/hVxxNm1ru2FGTSfbTSsuHmC/7ipsyuGKqrSAKLNtkzg==" - }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "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==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true } } } diff --git a/package.json b/package.json index c49a11b..a44dc96 100644 --- a/package.json +++ b/package.json @@ -27,14 +27,19 @@ "dependencies": { "@barba/core": "^2.9.7", "contentful": "^9.1.32", + "datasquirel": "^1.1.82", "gsap": "^3.10.4", - "next": "^12.0.4", + "next": "^13.4.10", "nodemailer": "^6.7.2", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sanitize-html": "^2.11.0", "three": "^0.138.3" }, "devDependencies": { - "tailwindcss": "^3.0.23" + "@types/node": "^20.4.2", + "@types/react": "^18.2.15", + "tailwindcss": "^3.0.23", + "typescript": "^5.1.6" } } diff --git a/pages/404.jsx b/pages/404.jsx deleted file mode 100644 index 627f0bf..0000000 --- a/pages/404.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react' -import TextShuffler from '../components/actions/TextShuffler' -import { textSHuffle } from '../functions/frontend/textShuffle' -import GeneralLayout from '../layouts/general_layout/GeneralLayout' - -const index = () => { - return ( -
-

- - - - -
- ) -} - -export default index diff --git a/pages/_app.js b/pages/_app.tsx similarity index 69% rename from pages/_app.js rename to pages/_app.tsx index d940923..00f91c4 100644 --- a/pages/_app.js +++ b/pages/_app.tsx @@ -2,7 +2,9 @@ import "../styles/main.css"; import "../styles/tw_main.css"; import { Fragment } from "react"; -function MyApp({ Component, pageProps }) { +import type { AppProps } from "next/app"; + +function MyApp({ Component, pageProps }: AppProps) { return ( diff --git a/pages/_document.js b/pages/_document.js index 78cf6fc..4ba5883 100644 --- a/pages/_document.js +++ b/pages/_document.js @@ -5,11 +5,12 @@ export default function Document() { return ( - {/* */} - {/* */} - + - +
diff --git a/pages/about.jsx b/pages/about.jsx deleted file mode 100644 index 947a6dc..0000000 --- a/pages/about.jsx +++ /dev/null @@ -1,139 +0,0 @@ -import React from 'react' -import Head from 'next/head' -import TextShuffler from '../components/actions/TextShuffler' -import GeneralLayout from '../layouts/general_layout/GeneralLayout' -import threeJsAnimations from '../functions/frontend/threeJsAnimations' - -const about = () => { - - return ( - - - About Me - - -

- - - - -
- -
-

-
    -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
-
- -
-

-
    -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
  • -

    - - - -
  • -
-
- - - -
- ) -} - -export default about diff --git a/pages/api/contactForm.js b/pages/api/contactForm.js deleted file mode 100644 index 4829133..0000000 --- a/pages/api/contactForm.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * - * - * Imports - * ------------------------------------------------------------------------------ - * - */ -const fs = require("fs"); -const nodemailer = require("nodemailer"); - -/** ********************* Functions and Other API Imports */ -let transporter = nodemailer.createTransport({ - host: "smtp.gmail.com", - port: 465, - secure: true, - auth: { - user: "benoti.san@gmail.com", - pass: "dkxxbvomzyqfyfuq", - }, -}); - -/** - * - * - * API handler - * ------------------------------------------------------------------------------ - * @param {Object} req - http incoming request - * @param {Object} res - http response - * - */ -export default async function handler(req, res) { - /** ********************* Get Page Data */ - if (req.method === "POST") { - let name = req.body.name; - let email = req.body.email; - let message = req.body.message; - - console.log("Message Sending ..."); - - try { - // send mail with defined transport object - let info = await transporter.sendMail({ - from: email, // sender address - to: "benoti.san@gmail.com, benoti.sanchez@gmail.com", // list of receivers - subject: "Tben.me | Client Message", // Subject line - text: "Hello from tben", - html: `

Message from ${name} | ${email}

Name:

${name}

Email:

${email}

Message:

${message}

`, // html body - }); - - console.log("Message sent: %s", info.messageId); - res.json({ msg: "Success", info: info }); - } catch (error) { - console.log(error); - res.json({ msg: "Failed" }); - } - } -} diff --git a/pages/api/contactForm.ts b/pages/api/contactForm.ts new file mode 100644 index 0000000..4d26856 --- /dev/null +++ b/pages/api/contactForm.ts @@ -0,0 +1,49 @@ +/** + * Imports + */ +const fs = require("fs"); +const sanitizeHtml = require("sanitize-html"); +const nodemailer = require("nodemailer"); + +import sanitizeHtmlOptions from "../../functions/backend/sanitizeHtmlOptions"; +import { NextApiRequest, NextApiResponse } from "next"; + +let transporter = nodemailer.createTransport({ + host: process.env.OUTLOOK_HOST, + port: 587, + auth: { + user: process.env.OUTLOOK_EMAIL, + pass: process.env.OUTLOOK_EMAIL_PASSWORD, + }, +}); + +/** + * API handler + * + */ +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + if (req.method === "POST") { + let name = req.body.name; + let email = req.body.email; + let message = req.body.message; + + const html = `

Message from ${name} | ${email}

Name:

${name}

Email:

${email}

Message:

${message}

`; + const sanitizedHtml = sanitizeHtml(html, sanitizeHtmlOptions); + + try { + let info = await transporter.sendMail({ + from: email, + to: "benoti.san@gmail.com, benoti.sanchez@gmail.com", + subject: "Tben.me | Client Message", + text: "Hello from tben", + html: sanitizedHtml, + }); + + console.log("Message sent: %s", info.messageId); + res.json({ msg: "Success", info: info }); + } catch (error) { + console.log(error); + res.json({ msg: "Failed" }); + } + } +} diff --git a/pages/blog/[single].jsx b/pages/blog/[single].jsx deleted file mode 100644 index 41342b5..0000000 --- a/pages/blog/[single].jsx +++ /dev/null @@ -1,302 +0,0 @@ -/** - * ============================================================================== - * Imports - * ============================================================================== - */ -import React from "react"; -import Head from "next/head"; -const https = require("https"); - -/** ********************************************** */ -/** ********************************************** */ -/** ********************************************** */ - -import GeneralLayout from "../../layouts/general_layout/GeneralLayout"; -import TextShuffler from "../../components/actions/TextShuffler"; - -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ - -/** - * ============================================================================== - * Main Component { Functional } - * ============================================================================== - * @param {Object} props - Server props - */ -export default function BlogIndex({ blogPost }) { - // ## Get Contexts - - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - // ## Javascript Variables - - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - // ## React Hooks { useState, useEffect, useRef, etc ... } - - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - // ## Function Return - return ( - - - { blogPost.title } | Tben.me Blog - - - -
- -

- - - - - - -
- - -
-
- ); - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ -}; - -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ - -/** - * ============================================================================== - * Server Side Props or Static Props - * ============================================================================== - * @param {Object} req - http incoming request object - * @param {Object} res - http response object - * @param {Object} query - queries attached to the url - */ -export async function getStaticProps({ params }) { - // ## Environment processes - - - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - // ## User Authentication - - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - // ## Page/Site Data Data Fetching - const postsResponse = await new Promise((resolve, reject) => { - https - .get( - /** ********************* Get Options object */ - { - host: "datasquirel.com", - path: `/api/query/get?db=tbenme&query=select+*+from+blog_posts+where+slug='${params.single}'`, - headers: { - Authorization: process.env.DATASQUIREL_API_KEY, - }, - }, - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - /** ********************* Callback function */ - (response) => { - var str = ""; - - // ## another chunk of data has been received, so append it to `str` - response.on("data", function (chunk) { - str += chunk; - }); - - // ## the whole response has been received, so we just print it out here - response.on("end", function () { - resolve(JSON.parse(str)) - }); - - response.on("error", (err) => { - console.log(err); - }); - } - ) - .end(); - }); - - // if (!postsResponse.success || !postsResponse.payload[0]) { - // return { - // redirect: { - // destination: "/blog", - // permanent: false - // } - // } - // } - - const post = postsResponse.payload[0]; - - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - // ## Server Props Return - return { - props: { - blogPost: post, - }, - revalidate: 3600 - }; - - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ -} - -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ -/** ****************************************************************************** */ - -/** - * ============================================================================== - * Server Side Props or Static Props - * ============================================================================== - * @param {Object} req - http incoming request object - * @param {Object} res - http response object - * @param {Object} query - queries attached to the url - */ -export async function getStaticPaths() { - /** - * Data fetching - * - * @abstract fetch date from the server or externnal source - */ - const postsResponse = await new Promise((resolve, reject) => { - https - .get( - /** ********************* Get Options object */ - { - host: "datasquirel.com", - path: `/api/query/get?db=tbenme&query=select+slug+from+blog_posts`, - headers: { - Authorization: process.env.DATASQUIREL_API_KEY, - }, - }, - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - /** ********************* Callback function */ - (response) => { - var str = ""; - - // ## another chunk of data has been received, so append it to `str` - response.on("data", function (chunk) { - str += chunk; - }); - - // ## the whole response has been received, so we just print it out here - response.on("end", function () { - resolve(JSON.parse(str)) - }); - - response.on("error", (err) => { - console.log(err); - }); - } - ) - .end(); - }); - - // if (!postsResponse.success) { - // return { - // redirect: { - // destination: "/blog", - // permanent: false - // } - // } - // } - - const posts = postsResponse.payload; - - const paths = posts.map((entry) => { - return { - params: { single: entry.slug } - } - }) - - return { - paths: paths, - fallback: "blocking", - } -} - -// Legacy - -// { blogPost.body.map((element) => { -// reactKey++; - -// if (element.tag.match(/img/i)) { -// return { -// } - -// function construtElement(elementEntry) { -// if (elementEntry.children) { -// return ( -// -// { elementEntry.children.map(child => construtElement(child)) } -// -// ) -// } - -// return ( -// -// { elementEntry.content } -// -// ) -// } - -// return construtElement(element); -// } -// ) } diff --git a/pages/blog/[single].tsx b/pages/blog/[single].tsx new file mode 100644 index 0000000..4cc9def --- /dev/null +++ b/pages/blog/[single].tsx @@ -0,0 +1,178 @@ +/** + * ============================================================================== + * Imports + * ============================================================================== + */ +import React from "react"; +import Head from "next/head"; +import type { InferGetStaticPropsType, GetStaticProps, GetStaticPaths } from "next"; +const datasquirel = require("datasquirel"); + +/** ********************************************** */ +/** ********************************************** */ +/** ********************************************** */ + +import GeneralLayout from "../../layouts/general_layout/GeneralLayout"; +import TextShuffler from "../../components/actions/TextShuffler"; + +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ + +/** + * ============================================================================== + * Main Component { Functional } + * ============================================================================== + * @param {Object} props - Server props + */ +export default function BlogIndex({ blogPost }: InferGetStaticPropsType) { + // ## Get Contexts + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + // ## Javascript Variables + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + // ## React Hooks { useState, useEffect, useRef, etc ... } + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + // ## Function Return + return ( + + + {blogPost.title} | Tben.me Blog + + + +
+ +

+ +

+ + + + + + +
+ + +
+
+ ); + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ +} + +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ + +/** + * Server Side Props or Static Props + * ============================================================================== + */ +export const getStaticProps: GetStaticProps = async ({ params }) => { + // ## Environment processes + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + // ## User Authentication + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + // ## Page/Site Data Data Fetching + const postsResponse = await datasquirel.get({ + key: process.env.DATASQUIREL_API_KEY, + db: "tbenme", + query: `select * from blog_posts WHERE slug='${params?.single}'`, + }); + + const post = postsResponse.payload[0]; + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ + + // ## Server Props Return + return { + props: { + blogPost: post, + }, + revalidate: 3600, + }; + + /** ********************************************** */ + /** ********************************************** */ + /** ********************************************** */ +}; + +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ +/** ****************************************************************************** */ + +/** + * Server Side Props or Static Props + * ============================================================================== + */ +export const getStaticPaths: GetStaticPaths = async () => { + /** + * Data fetching + * + * @abstract fetch date from the server or externnal source + */ + const postsResponse = await datasquirel.get({ + key: process.env.DATASQUIREL_API_KEY, + db: "tbenme", + query: `select slug from blog_posts`, + }); + + const posts: { slug: string }[] | null = postsResponse.payload; + + const paths = posts?.map((entry) => { + return { + params: { single: entry.slug }, + }; + }); + + return { + paths: paths ? paths : [], + fallback: "blocking", + }; +}; diff --git a/pages/blog/index.jsx b/pages/blog/index.tsx similarity index 52% rename from pages/blog/index.jsx rename to pages/blog/index.tsx index af5a2b4..523468e 100644 --- a/pages/blog/index.jsx +++ b/pages/blog/index.tsx @@ -6,9 +6,8 @@ import React from "react"; import Head from "next/head"; - -// const contentful = require('contentful'); -const https = require("https") +import type { InferGetStaticPropsType, GetStaticProps, GetStaticPropsContext } from "next"; +const datasquirel = require("datasquirel"); /** ********************************************** */ /** ********************************************** */ @@ -31,7 +30,7 @@ import TextShuffler from "../../components/actions/TextShuffler"; * ============================================================================== * @param {Object} props - Server props */ -export default function BlogIndex(props) { +export default function BlogIndex(props: InferGetStaticPropsType) { /** * Get Contexts * @@ -65,29 +64,42 @@ export default function BlogIndex(props) { Blog | Tben.me - + -

-
- { props.blogPosts.map(post => - -

- - -
- ) } +
+

+ +

+
+ {props.blogPosts.map((post: { slug: string; title: string; excerpt: string; date_created: string }, index: number) => ( + +

+ +

+ + + + + + +
+ ))} +
); /** ********************************************** */ -}; +} /** ****************************************************************************** */ /** ****************************************************************************** */ @@ -97,27 +109,15 @@ export default function BlogIndex(props) { /** ****************************************************************************** */ /** - * ============================================================================== * Server Side Props or Static Props * ============================================================================== - * @param {Object} req - http incoming request object - * @param {Object} res - http response object - * @param {Object} query - queries attached to the url */ -export async function getStaticProps({ req, res, query }) { +export const getStaticProps: GetStaticProps = async ({ params }: GetStaticPropsContext) => { /** * User Auth * * @abstract grab user */ - // const contentfulClient = contentful.createClient({ - // space: process.env.CONTENTFUL_SPACE_ID, - // accessToken: process.env.CONTENTFUL_API_KEY, - // }); - - // const posts = await contentfulClient.getEntries() - - // console.log(posts); /** ********************************************** */ @@ -126,59 +126,19 @@ export async function getStaticProps({ req, res, query }) { * * @abstract fetch date from the server or externnal source */ - // let blogPosts = await httpFetch({ - // options: { - // method:"DELETE", - // path: "/api/tben-blogs" - // }, - // paradigm:"https" - // }) - - // console.log(blogPosts.data); - const postsResponse = await new Promise((resolve, reject) => { - https - .get( - /** ********************* Get Options object */ - { - host: "datasquirel.com", - path: `/api/query/get?db=tbenme&query=select+title,slug,excerpt,date_created+from+blog_posts+limit+10`, - headers: { - Authorization: process.env.DATASQUIREL_API_KEY, - }, - }, - /** ********************************************** */ - /** ********************************************** */ - /** ********************************************** */ - - /** ********************* Callback function */ - (response) => { - var str = ""; - - // ## another chunk of data has been received, so append it to `str` - response.on("data", function (chunk) { - str += chunk; - }); - - // ## the whole response has been received, so we just print it out here - response.on("end", function () { - resolve(JSON.parse(str)) - }); - - response.on("error", (err) => { - console.log(err); - }); - } - ) - .end(); + const postsResponse = await datasquirel.get({ + key: process.env.DATASQUIREL_API_KEY, + db: "tbenme", + query: "select title,slug,excerpt,date_created from blog_posts limit 10", }); if (!postsResponse.success) { return { redirect: { destination: "/", - permanent: false - } - } + permanent: false, + }, + }; } const posts = postsResponse.payload; @@ -192,10 +152,10 @@ export async function getStaticProps({ req, res, query }) { props: { blogPosts: posts, }, - revalidate: 3600 + revalidate: 3600, }; /** ********************************************** */ /** ********************************************** */ /** ********************************************** */ -} +}; diff --git a/pages/contact.jsx b/pages/contact.jsx index 95ad4ac..304b91a 100644 --- a/pages/contact.jsx +++ b/pages/contact.jsx @@ -1,36 +1,88 @@ -import React from 'react' -import Head from 'next/head' -import TextShuffler from '../components/actions/TextShuffler' -import submitContactForm from '../functions/frontend/submitContactForm' -import GeneralLayout from '../layouts/general_layout/GeneralLayout' -import threeJsAnimations from '../functions/frontend/threeJsAnimations' +import React from "react"; +import Head from "next/head"; +import TextShuffler from "../components/actions/TextShuffler"; +import submitContactForm from "../functions/frontend/submitContactForm"; +import GeneralLayout from "../layouts/general_layout/GeneralLayout"; +import threeJsAnimations from "../functions/frontend/threeJsAnimations"; const contact = () => { - let [success, setSuccess] = React.useState(false); return ( Contact me - + -

- - - +
+

+ +

+ + + -
{ submitContactForm(e, setSuccess) } }> - - - - - { success === "Success" &&
Success!!!
} - { success === "Failed" &&
Failed
} -
+
{ + submitContactForm(e, setSuccess); + }} + > + + + + + {success === "Success" && ( +
+ Success!!!{" "} + +
+ )} + {success === "Failed" && ( +
+ Failed{" "} + +
+ )} +
+
- ) -} + ); +}; -export default contact +export default contact; diff --git a/pages/index.jsx b/pages/index.jsx deleted file mode 100644 index 840b922..0000000 --- a/pages/index.jsx +++ /dev/null @@ -1,35 +0,0 @@ -import Head from 'next/head' -import React from 'react' -import TextShuffler from '../components/actions/TextShuffler' -import threeJsAnimations from '../functions/frontend/threeJsAnimations' -import GeneralLayout from '../layouts/general_layout/GeneralLayout' - -const index = () => { - - return ( - - - Benjamin Toby | Fullstack developer, UI UX designer - - - - -

- - - - -
-
- ) -} - -export default index diff --git a/pages/work.jsx b/pages/work.jsx index cf44c4f..3b30c37 100644 --- a/pages/work.jsx +++ b/pages/work.jsx @@ -1,8 +1,8 @@ -import React from 'react' -import Head from 'next/head' -import TextShuffler from '../components/actions/TextShuffler' -import GeneralLayout from '../layouts/general_layout/GeneralLayout' -import PortfolioEntry from '../components/PortfolioEntry' +import React from "react"; +import Head from "next/head"; +import TextShuffler from "../components/actions/TextShuffler"; +import GeneralLayout from "../layouts/general_layout/GeneralLayout"; +import PortfolioEntry from "../components/PortfolioEntry"; const myWork = () => { const portfolioEntries = require("../components/portfolioEntries.json"); @@ -11,21 +11,40 @@ const myWork = () => { My Work | Tben - + -

- - - -
- { portfolioEntries.map(entry => ) } +
+

+ +

+ + + + +
+ {portfolioEntries.map((entry) => ( + + ))} +
- ) -} + ); +}; -export default myWork +export default myWork; // { // "title": "Stirrmedia Social webapp", diff --git a/public/documents/Benjamin-Toby-CV-7-27-2022.pdf b/public/documents/Benjamin-Toby-CV-7-27-2022.pdf deleted file mode 100644 index ff3e75f..0000000 Binary files a/public/documents/Benjamin-Toby-CV-7-27-2022.pdf and /dev/null differ diff --git a/public/documents/Benjamin_Toby_CV-min.pdf b/public/documents/Benjamin_Toby_CV-min.pdf deleted file mode 100644 index de8af64..0000000 Binary files a/public/documents/Benjamin_Toby_CV-min.pdf and /dev/null differ diff --git a/public/documents/Benjamin_Toby_CV-updated.pdf b/public/documents/Benjamin_Toby_CV-updated.pdf deleted file mode 100644 index f974370..0000000 Binary files a/public/documents/Benjamin_Toby_CV-updated.pdf and /dev/null differ diff --git a/public/documents/Benjamin_Toby_CV.pdf b/public/documents/Benjamin_Toby_CV.pdf deleted file mode 100644 index 5f8a389..0000000 Binary files a/public/documents/Benjamin_Toby_CV.pdf and /dev/null differ diff --git a/public/documents/Resume-Benjamin-Toby-Linkedin.pdf b/public/documents/Resume-Benjamin-Toby-Linkedin.pdf new file mode 100644 index 0000000..ab76d87 Binary files /dev/null and b/public/documents/Resume-Benjamin-Toby-Linkedin.pdf differ diff --git a/public/favicon.ico b/public/favicon.ico index 487dc36..b209400 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..b209400 Binary files /dev/null and b/public/favicon.png differ diff --git a/public/icons/android-chrome-192x192.png b/public/icons/android-chrome-192x192.png new file mode 100644 index 0000000..3e93875 Binary files /dev/null and b/public/icons/android-chrome-192x192.png differ diff --git a/public/icons/apple-touch-icon.png b/public/icons/apple-touch-icon.png new file mode 100644 index 0000000..b3b0988 Binary files /dev/null and b/public/icons/apple-touch-icon.png differ diff --git a/public/icons/icon-192x192.png b/public/icons/icon-192x192.png new file mode 100644 index 0000000..3e93875 Binary files /dev/null and b/public/icons/icon-192x192.png differ diff --git a/public/icons/icon-256x256.png b/public/icons/icon-256x256.png new file mode 100644 index 0000000..73a48e8 Binary files /dev/null and b/public/icons/icon-256x256.png differ diff --git a/public/icons/icon-384x384.png b/public/icons/icon-384x384.png new file mode 100644 index 0000000..c446f29 Binary files /dev/null and b/public/icons/icon-384x384.png differ diff --git a/public/icons/icon-512x512.png b/public/icons/icon-512x512.png new file mode 100644 index 0000000..eddc0fb Binary files /dev/null and b/public/icons/icon-512x512.png differ diff --git a/public/icons/touch-icon-ipad-retina.png b/public/icons/touch-icon-ipad-retina.png new file mode 100644 index 0000000..73a48e8 Binary files /dev/null and b/public/icons/touch-icon-ipad-retina.png differ diff --git a/public/icons/touch-icon-ipad.png b/public/icons/touch-icon-ipad.png new file mode 100644 index 0000000..73a48e8 Binary files /dev/null and b/public/icons/touch-icon-ipad.png differ diff --git a/public/icons/touch-icon-iphone-retina.png b/public/icons/touch-icon-iphone-retina.png new file mode 100644 index 0000000..73a48e8 Binary files /dev/null and b/public/icons/touch-icon-iphone-retina.png differ diff --git a/public/icons/touch-icon-iphone.png b/public/icons/touch-icon-iphone.png new file mode 100644 index 0000000..73a48e8 Binary files /dev/null and b/public/icons/touch-icon-iphone.png differ diff --git a/public/images/logo-icon.svg b/public/images/logo-icon.svg new file mode 100644 index 0000000..0f33876 --- /dev/null +++ b/public/images/logo-icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/images/logo-v3.svg b/public/images/logo-v3.svg new file mode 100644 index 0000000..7c553c0 --- /dev/null +++ b/public/images/logo-v3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/logo-white.svg b/public/images/logo-white.svg new file mode 100644 index 0000000..d165837 --- /dev/null +++ b/public/images/logo-white.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/images/my-photo.png b/public/images/my-photo.png new file mode 100644 index 0000000..c68e19c Binary files /dev/null and b/public/images/my-photo.png differ diff --git a/public/images/rm378-07c-min.png b/public/images/rm378-07c-min.png new file mode 100644 index 0000000..4b441ec Binary files /dev/null and b/public/images/rm378-07c-min.png differ diff --git a/public/styles/main.css b/public/styles/main.css new file mode 100644 index 0000000..f646236 --- /dev/null +++ b/public/styles/main.css @@ -0,0 +1,441 @@ +@import url("https://fonts.googleapis.com/css?family=Source+Code+Pro&display=swap"); + +html { + width: 100%; + /* overflow-x: hidden; */ + scroll-behavior: smooth; + font-family: "Source Code Pro", Helvetica; + font-size: 16px; + line-height: 1.5; + color: #222; + letter-spacing: -0.8px; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +:root { + --main-color: #1668e4; + --main-color-lighter: #5698fc; + --dark-color: #201e1e; + --sec-color-3: #688e26; + --sec-color-4: #adb2d3; + --sec-color-5: #c2a878; + --light-color-1: rgb(64, 37, 216); + --test-color: rgb(113, 116, 255); + --transparent-white: rgba(255, 255, 255, 0.2); +} + +body { + width: 100%; + margin: 0px; + padding: 0px; + top: 0; + justify-content: center; + background-color: var(--dark-color); + color: white; +} + +a { + text-decoration: none; + color: white; + border: 1px solid transparent; +} + +a:hover { + color: var(--sec-color-2); +} + +button { + padding: 10px 25px; + border: none; + cursor: pointer; + font-size: inherit; + border: 1px solid transparent; +} + +hr { + opacity: 0.3; +} + +button:hover { + background-color: var(--dark-color); + /* background-color: #c52532; */ + color: white; + border-color: var(--transparent-white); +} + +form * { + font-family: inherit; + font-size: inherit; +} + +header { + z-index: 1000000; + margin-bottom: 40px; +} + +h1 { + font-size: 52px; + margin-top: 0; + margin-bottom: 10px; +} + +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ + +p a, +span a { + color: var(--main-color-lighter); + /* border-bottom: 1px solid var(--main-color-lighter); */ +} + +p a:hover, +span a:hover { + color: var(--main-color); +} + +/* ################################################# -- Sliders */ +aside, +.side-nav-block { + scrollbar-width: none; +} +/* width */ +aside::-webkit-scrollbar, +.side-nav-block::-webkit-scrollbar { + width: 5px; +} + +/* Track */ +aside::-webkit-scrollbar-track, +.side-nav-block::-webkit-scrollbar-track { + background: #f1f1f1; +} + +/* Handle */ +aside::-webkit-scrollbar-thumb, +.side-nav-block::-webkit-scrollbar-thumb { + background: #dbe1eb; + border-radius: 10px; +} + +/* Handle on hover */ +aside::-webkit-scrollbar-thumb:hover, +.side-nav-block::-webkit-scrollbar-thumb:hover { + background: #555; +} + +/*############################################# -- Common Actions */ + +.visible { + display: flex; +} + +.hidden { + display: none; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.no-pointer-events { + pointer-events: none; +} + +.pointer-events { + pointer-events: visible; +} + +.spacer { + display: block; + width: 100%; + height: 80px; +} + +/*############################################# -- Header */ + +header { + color: white; +} + +.logo-link-block h1 { + font-size: 28px; + margin: 0; + margin-bottom: 5px; +} + +nav { + display: flex; + align-items: center; + gap: 20px; +} + +nav a { + opacity: 0.5; + cursor: pointer; +} + +nav a:hover { + opacity: 1; +} + +.active-page { + opacity: 1; + border-bottom: 2px solid white; +} + +/*############################################# -- Shuffled Text */ + +#__next { + max-width: 1200px; + width: 100%; + height: 100%; + opacity: 0; + animation-name: shuffle; + animation-timing-function: ease-out; + animation-duration: 1s; + animation-fill-mode: forwards; +} + +/* .shuffled-text-span span { + animation-name: shuffle; + animation-timing-function: ease-out; + animation-delay: 0.5s; +} */ + +@keyframes shuffle { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +/*############################################# -- Hero Section */ +.hero-sub-text { + font-size: 24px; + color: rgba(255, 255, 255, 0.7); +} + +.hero-ctas-section { + display: flex; + align-items: center; + margin-top: 40px; + gap: 20px; +} + +.hero-ctas-section a { + padding: 10px 25px; + border: none; + cursor: pointer; + font-size: inherit; + color: var(--dark-color); + background-color: white; + font-size: 18px; +} + +.hero-ctas-section a:hover { + background-color: var(--dark-color); + color: white; + border-color: var(--transparent-white); +} + +/*############################################# -- 404 page */ +.not-found-page-wrapper { + display: flex; + align-items: flex-start; + justify-content: center; + flex-direction: column; + width: 100%; + height: 100%; +} + +/*############################################# -- Portfolio page */ +.portfolio-entries-block { + display: grid; + gap: 40px; + grid-template-columns: 1fr 1fr; + width: 100%; +} + +.portfolio-entry-block { + max-width: 700px; + border: 1px solid rgba(255, 255, 255, 0.3); + padding: 20px; +} +/*############################################# -- Contact Forms */ +form { + margin-top: 40px; + max-width: 1000px; + width: 100%; + display: flex; + flex-direction: column; + gap: 20px; + position: relative; +} + +input, +textarea { + padding: 15px 20px; + background-color: transparent; + color: white; + border: 1px solid rgba(255, 255, 255, 0.2); + width: 100%; + resize: none; +} + +.message-response { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: var(--dark-color); + border: 2px solid #688e26; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: 24px; + gap: 10px; +} + +.message-response.failed { + border: 2px solid #d42222; +} + +#homepage-animation-wrapper { + width: 150%; + height: 100%; + background-color: var(--dark-color); +} + +.tech-stack-header { + color: rgb(113, 116, 255); + margin-bottom: 3px; +} + +.portfolio-image-wrapper { + width: 100%; + height: 300px; + margin-bottom: 15px; + overflow: hidden; +} + +.portfolio-image { + width: 100%; + height: 100%; + object-fit: cover; + width: 100%; + height: 300px; + object-position: left top; + margin-bottom: 20px; +} + +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ + +span img { + width: 100%; + height: auto; + object-fit: contain; +} + +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ +/* * */ + +/* .transition-fade { + transition: 0.4s; + opacity: 1; +} + +html.is-animating .transition-fade { + opacity: 0; +} */ + +/* ############################################################################################### +################################################################################################## +################################################################################################## +################################################################################################## +##################################### -- Mobile Styles -- ######################################## +################################################################################################## +################################################################################################## +################################################################################################## +############################################################################################### */ + +@media (max-width: 1200px) { +} + +@media (max-width: 990px) { + .portfolio-entries-block { + grid-template-columns: 1fr; + } +} + +@media (max-width: 800px) { + h1 { + font-size: 28px; + } + + nav { + flex-wrap: wrap; + gap: 15px; + } + + body { + padding: 20px; + padding-bottom: 80px; + } + + .hero-ctas-section { + flex-wrap: wrap; + } +} + +@media (max-width: 600px) { + .portfolio-image-wrapper { + height: auto; + } + + .portfolio-image { + object-fit: contain; + height: auto; + margin: 0; + } +} + +@media (max-width: 450px) { +} + +@media (max-width: 350px) { +} diff --git a/styles/main.css b/styles/main.css index a4e8595..a5e2bed 100644 --- a/styles/main.css +++ b/styles/main.css @@ -1,10 +1,9 @@ -@import url("https://fonts.googleapis.com/css?family=Source+Code+Pro&display=swap"); +@import url("https://fonts.googleapis.com/css?family=Cutive+Mono&display=swap"); html { width: 100%; - /* overflow-x: hidden; */ scroll-behavior: smooth; - font-family: "Source Code Pro", Helvetica; + font-family: "Cutive Mono", Helvetica; font-size: 16px; line-height: 1.5; color: #222; @@ -18,9 +17,9 @@ html { } :root { - --main-color: #1668e4; - --main-color-lighter: #5698fc; - --dark-color: #201e1e; + --main-color: #7174ff; + --main-color-lighter: #9d9eff; + --dark-color: #181515; --sec-color-3: #688e26; --sec-color-4: #adb2d3; --sec-color-5: #c2a878; @@ -32,7 +31,6 @@ html { body { width: 100%; margin: 0px; - padding: 40px; top: 0; justify-content: center; background-color: var(--dark-color); @@ -49,19 +47,25 @@ a:hover { color: var(--sec-color-2); } -button { +button, +.button { padding: 10px 25px; border: none; cursor: pointer; font-size: inherit; border: 1px solid transparent; + color: var(--dark-color); + background-color: white; + font-size: 18px; + font-weight: 600; } hr { opacity: 0.3; } -button:hover { +button:hover, +.button:hover { background-color: var(--dark-color); /* background-color: #c52532; */ color: white; @@ -75,7 +79,6 @@ form * { header { z-index: 1000000; - margin-bottom: 40px; } h1 { @@ -84,6 +87,18 @@ h1 { margin-bottom: 10px; } +h2 { + font-size: 38px; +} + +h3 { + font-size: 30px; +} + +h4 { + font-size: 22px; +} + /* * */ /* * */ /* * */ @@ -204,9 +219,7 @@ nav a:hover { /*############################################# -- Shuffled Text */ #__next { - max-width: 1200px; width: 100%; - height: 100%; opacity: 0; animation-name: shuffle; animation-timing-function: ease-out; @@ -329,7 +342,7 @@ textarea { } .tech-stack-header { - color: rgb(113, 116, 255); + color: #7174ff; margin-bottom: 3px; } @@ -412,11 +425,6 @@ html.is-animating .transition-fade { gap: 15px; } - body { - padding: 20px; - padding-bottom: 80px; - } - .hero-ctas-section { flex-wrap: wrap; } diff --git a/styles/tw_main.css b/styles/tw_main.css index 034b832..2455d0c 100644 --- a/styles/tw_main.css +++ b/styles/tw_main.css @@ -1,4 +1,6 @@ *, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; @@ -10,6 +12,59 @@ --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; @@ -47,32 +102,56 @@ position: fixed } -.top-0 { - top: 0px +.absolute { + position: absolute +} + +.relative { + position: relative } .left-0 { left: 0px } -.-z-10 { - z-index: -10 +.top-0 { + top: 0px +} + +.z-10 { + z-index: 10 +} + +.z-\[-1\] { + z-index: -1 +} + +.z-\[-2\] { + z-index: -2 } .m-0 { margin: 0px } -.mt-4 { - margin-top: 1rem +.-mb-4 { + margin-bottom: -1rem } -.mt-10 { - margin-top: 2.5rem +.-mt-10 { + margin-top: -2.5rem } -.mb-1 { - margin-bottom: 0.25rem +.-mt-64 { + margin-top: -16rem +} + +.-mt-\[120px\] { + margin-top: -120px +} + +.mb-2 { + margin-bottom: 0.5rem } .mb-4 { @@ -83,34 +162,42 @@ margin-bottom: 2rem } -.mb-0 { - margin-bottom: 0px +.mr-0 { + margin-right: 0px } -.mb-3 { - margin-bottom: 0.75rem +.mt-10 { + margin-top: 2.5rem } -.mb-2 { - margin-bottom: 0.5rem +.mt-20 { + margin-top: 5rem +} + +.mt-4 { + margin-top: 1rem } .flex { display: flex } -.h-6 { - height: 1.5rem +.h-20 { + height: 5rem +} + +.h-44 { + height: 11rem +} + +.h-full { + height: 100% } .w-full { width: 100% } -.max-w-xl { - max-width: 36rem -} - .max-w-2xl { max-width: 42rem } @@ -119,18 +206,66 @@ max-width: 48rem } -.max-w-4xl { - max-width: 56rem +.max-w-6xl { + max-width: 72rem +} + +.max-w-\[450px\] { + max-width: 450px +} + +.grow { + flex-grow: 1 +} + +.cursor-pointer { + cursor: pointer } .flex-col { flex-direction: column } +.flex-col-reverse { + flex-direction: column-reverse +} + +.flex-wrap { + flex-wrap: wrap +} + .items-start { align-items: flex-start } +.items-center { + align-items: center +} + +.items-stretch { + align-items: stretch +} + +.justify-center { + justify-content: center +} + +.justify-between { + justify-content: space-between +} + +.gap-0 { + gap: 0px +} + +.gap-1 { + gap: 0.25rem +} + +.gap-10 { + gap: 2.5rem +} + .gap-2 { gap: 0.5rem } @@ -139,6 +274,22 @@ gap: 1rem } +.gap-8 { + gap: 2rem +} + +.overflow-hidden { + overflow: hidden +} + +.whitespace-nowrap { + white-space: nowrap +} + +.rounded-full { + border-radius: 9999px +} + .border { border-width: 1px } @@ -151,30 +302,23 @@ border-style: solid } -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)) -} - -.border-white\/40 { - border-color: rgb(255 255 255 / 0.4) -} - -.border-white\/20 { - border-color: rgb(255 255 255 / 0.2) -} - -.border-white\/50 { - border-color: rgb(255 255 255 / 0.5) -} - -.bg-blue-600 { +.bg-\[\#343680\] { --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)) + background-color: rgb(52 54 128 / var(--tw-bg-opacity)) } -.bg-transparent { - background-color: transparent +.bg-\[\#3e3f9c\] { + --tw-bg-opacity: 1; + background-color: rgb(62 63 156 / var(--tw-bg-opacity)) +} + +.bg-primary\/10 { + background-color: rgb(113 116 255 / 0.1) +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover } .p-4 { @@ -185,8 +329,58 @@ padding: 2rem } -.text-xl { - font-size: 1.25rem; +.p-\[100px\] { + padding: 100px +} + +.p-\[150px\] { + padding: 150px +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem +} + +.py-20 { + padding-top: 5rem; + padding-bottom: 5rem +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem +} + +.pb-40 { + padding-bottom: 10rem +} + +.pt-\[450px\] { + padding-top: 450px +} + +.text-5xl { + font-size: 3rem; + line-height: 1 +} + +.text-\[300px\] { + font-size: 300px +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem +} + +.text-lg { + font-size: 1.125rem; line-height: 1.75rem } @@ -195,63 +389,66 @@ line-height: 1.25rem } -.text-lg { - font-size: 1.125rem; +.text-\[20px\] { + font-size: 20px +} + +.text-xl { + font-size: 1.25rem; line-height: 1.75rem } -.text-base { - font-size: 1rem; - line-height: 1.5rem +.uppercase { + text-transform: uppercase } -.font-bold { - font-weight: 700 +.leading-snug { + line-height: 1.375 } -.text-white { +.text-primary-light { --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)) -} - -.text-white\/50 { - color: rgb(255 255 255 / 0.5) -} - -.opacity-50 { - opacity: 0.5 -} - -.opacity-40 { - opacity: 0.4 -} - -.opacity-90 { - opacity: 0.9 -} - -.opacity-60 { - opacity: 0.6 + color: rgb(157 158 255 / var(--tw-text-opacity)) } .opacity-20 { opacity: 0.2 } -.opacity-30 { - opacity: 0.3 +.opacity-40 { + opacity: 0.4 } -.opacity-70 { - opacity: 0.7 +.opacity-5 { + opacity: 0.05 +} + +.opacity-50 { + opacity: 0.5 } .opacity-80 { opacity: 0.8 } -.outline { - outline-style: solid +.blur { + --tw-blur: blur(8px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) +} + +.blur-sm { + --tw-blur: blur(4px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) +} + +.contrast-\[140\%\] { + --tw-contrast: contrast(140%); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) +} + +.grayscale { + --tw-grayscale: grayscale(100%); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) } .filter { @@ -264,7 +461,65 @@ transition-duration: 150ms } -.hover\:bg-blue-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)) +.hover\:opacity-60:hover { + opacity: 0.6 +} + +@media (min-width: 600px) { + .md\:relative { + position: relative + } + + .md\:items-start { + align-items: flex-start + } + + .md\:px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem + } + + .md\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem + } + + .md\:py-10 { + padding-top: 2.5rem; + padding-bottom: 2.5rem + } + + .md\:pt-0 { + padding-top: 0px + } +} + +@media (min-width: 1200px) { + .xl\:-mr-14 { + margin-right: -3.5rem + } + + .xl\:-mt-\[160px\] { + margin-top: -160px + } + + .xl\:w-\[120\%\] { + width: 120% + } + + .xl\:w-\[40\%\] { + width: 40% + } + + .xl\:w-\[60\%\] { + width: 60% + } + + .xl\:flex-row { + flex-direction: row + } + + .xl\:flex-col { + flex-direction: column + } } diff --git a/tailwind.config.js b/tailwind.config.js index 16100d9..284a66f 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,5 +1,5 @@ module.exports = { - content: ["./components/**/*.{html,js,jsx}", "./pages/**/*.jsx", , "./layouts/**/*.jsx"], + content: ["./components/**/*.{html,js,jsx}", "./pages/**/*.{jsx,tsx}", "./app/**/*.{html,js,jsx,tsx}", "./layouts/**/*.{jsx,tsx}"], theme: { screens: { xs: "350px", @@ -9,7 +9,10 @@ module.exports = { lg: "976px", xl: "1200px", }, - // colors: {}, + colors: { + primary: "#7174ff", + "primary-light": "#9d9eff", + }, fontFamily: { sans: ["Graphik", "sans-serif"], serif: ["Merriweather", "serif"], diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..01f3ace --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,111 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */ /* Type Checking */, + "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "noEmit": true, + "incremental": true, + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "moduleResolution": "node", + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "pages/_app.js", ".next/types/**/*.ts", "dump/index.jsx", "pages/_document.js"], + "exclude": ["node_modules"] +}