diff --git a/app/Header.tsx b/app/Header.tsx
deleted file mode 100644
index bf089bb..0000000
--- a/app/Header.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-export default function Head() {
- return (
- <>
-
Checks!
-
-
-
- >
- )
- }
-
\ No newline at end of file
diff --git a/app/components/Footer.tsx b/app/components/Footer.tsx
new file mode 100644
index 0000000..237190a
--- /dev/null
+++ b/app/components/Footer.tsx
@@ -0,0 +1,64 @@
+import Link from "next/link";
+
+const Footer = () => {
+ return (
+
+
+
+
Checks!
+
+ Built by{" "}
+
+ @TaiDev
+ {" "}
+ (2023). See source code{" "}
+
+ here.
+
+
+
+ Powered by{" "}
+
+ Vercel
+
+ ,{" "}
+
+ Railway
+ {" "}
+ &{" "}
+
+ AWS S3
+
+ .
+
+
+
+
+
This is not a real e-commerce site.
+
+
+
+ );
+};
+
+export default Footer;
diff --git a/app/components/Header.tsx b/app/components/Header.tsx
new file mode 100644
index 0000000..90bea93
--- /dev/null
+++ b/app/components/Header.tsx
@@ -0,0 +1,60 @@
+"use client";
+
+import { usePathname, useRouter } from "next/navigation";
+import cn from "../helpers/cn";
+import { useUserContext } from "../providers/UserProvider";
+import SearchSection from "./SearchSection/SearchSection";
+import TitleClick from "./TitleClick";
+import AuthButton from "./buttons/AuthButton";
+import CheckoutBtn from "./menus/CartMenu";
+
+const Header = () => {
+ const { isAdmin } = useUserContext();
+ const path = usePathname();
+ const router = useRouter();
+
+ const isInPath = (route: string) => path === route;
+
+ const adminSection = isAdmin && !!path?.startsWith("/admin");
+
+ return (
+
+
+
+ Checks!
+
+ {!adminSection ? (
+
+ ) : (
+
+
router.push("/admin")}
+ >
+ Orders
+
+
router.push("/admin/products")}
+ >
+ Products
+
+
+ )}
+
+
+
+
+ {!adminSection &&
}
+
+
+ );
+};
+
+export default Header;
diff --git a/app/components/SearchSection/SearchSection.tsx b/app/components/SearchSection/SearchSection.tsx
new file mode 100644
index 0000000..fc9c073
--- /dev/null
+++ b/app/components/SearchSection/SearchSection.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+const SearchSection = () => {
+ return SearchSection
;
+};
+
+export default SearchSection;
diff --git a/app/components/TitleClick.tsx b/app/components/TitleClick.tsx
new file mode 100644
index 0000000..418386e
--- /dev/null
+++ b/app/components/TitleClick.tsx
@@ -0,0 +1,30 @@
+"use client";
+
+import { useRouter } from "next/navigation";
+import React from "react";
+import cn from "../helpers/cn";
+
+interface TitleClickProps extends React.HTMLAttributes {
+ route: string;
+}
+
+const TitleClick = ({
+ route,
+ children,
+ className = "",
+ ...props
+}: TitleClickProps) => {
+ const router = useRouter();
+
+ return (
+ router.push(route)}
+ >
+ {children}
+
+ );
+};
+
+export default TitleClick;
diff --git a/app/components/buttons/AuthButton.tsx b/app/components/buttons/AuthButton.tsx
new file mode 100644
index 0000000..f927edb
--- /dev/null
+++ b/app/components/buttons/AuthButton.tsx
@@ -0,0 +1,20 @@
+"use client";
+
+import { useUserContext } from "../../providers/UserProvider";
+import UserMenu from "../menus/UserMenu";
+import { SignInButton } from "./SignInButton";
+const AuthButton = () => {
+ const { user, isAdmin } = useUserContext();
+
+ if (!user) {
+ return ;
+ }
+
+ return (
+
+
+
+ );
+};
+
+export default AuthButton;
diff --git a/app/components/buttons/Button.tsx b/app/components/buttons/Button.tsx
new file mode 100644
index 0000000..56f462e
--- /dev/null
+++ b/app/components/buttons/Button.tsx
@@ -0,0 +1,76 @@
+"use client";
+
+import React, { useState } from "react";
+import { FiLoader } from "react-icons/fi";
+import cn from "../../helpers/cn";
+
+interface ButtonProps extends React.ButtonHTMLAttributes {
+ onClick?: (e: React.MouseEvent) => void;
+ isLoading?: boolean;
+ localLoaderOnClick?: boolean; // default to true
+ disabled?: boolean;
+ children: React.ReactNode;
+ color?: "primary" | "secondary" | "red";
+}
+
+const Button = ({
+ onClick,
+ className = "",
+ isLoading = false,
+ localLoaderOnClick = true,
+ disabled = false,
+ children,
+ color,
+ ...props
+}: ButtonProps) => {
+ const [localLoading, setLocalLoading] = useState(false);
+
+ const loadStatus = isLoading || (localLoaderOnClick && localLoading);
+
+ const baseClassName =
+ "rounded-md ease-in duration-100 flex flex-row items-center justify-center text-[14px]";
+ const primaryClassName = cn(
+ baseClassName,
+ "bg-zinc-700 hover:bg-zinc-900 text-gray-100",
+ loadStatus || (disabled && "bg-zinc-900 cursor-not-allowed")
+ );
+ const secondaryClassName = cn(
+ baseClassName,
+ "border border-zinc-300 hover:bg-zinc-200 text-zinc-600",
+ loadStatus || (disabled && "bg-zinc-200 cursor-not-allowed")
+ );
+ const redClassName = cn(
+ baseClassName,
+ "bg-red-800 hover:bg-red-900 text-gray-100",
+ loadStatus || (disabled && "bg-red-900 cursor-not-allowed")
+ );
+
+ const handleClick = (e: React.MouseEvent) => {
+ if (disabled || loadStatus) return;
+ setLocalLoading(true);
+ if (onClick) {
+ return onClick(e);
+ }
+ };
+
+ return (
+
+ );
+};
+
+export default Button;
diff --git a/app/components/buttons/SignInButton.tsx b/app/components/buttons/SignInButton.tsx
new file mode 100644
index 0000000..ffe6eac
--- /dev/null
+++ b/app/components/buttons/SignInButton.tsx
@@ -0,0 +1,36 @@
+"use client";
+
+import { Menu, MenuHandler, MenuList } from "@material-tailwind/react";
+import Button from "./Button";
+
+export const SignInButton = () => {
+ const handleSignIn = async (provider: "github" | "twitch") => {
+ alert(provider);
+ };
+
+ return (
+
+ );
+};
diff --git a/app/components/menus/CartMenu.tsx b/app/components/menus/CartMenu.tsx
new file mode 100644
index 0000000..da67a53
--- /dev/null
+++ b/app/components/menus/CartMenu.tsx
@@ -0,0 +1,7 @@
+import React from "react";
+
+const CheckoutBtn = () => {
+ return CheckoutBtn
;
+};
+
+export default CheckoutBtn;
diff --git a/app/components/menus/UserMenu.tsx b/app/components/menus/UserMenu.tsx
new file mode 100644
index 0000000..6ce71ce
--- /dev/null
+++ b/app/components/menus/UserMenu.tsx
@@ -0,0 +1,9 @@
+"use client";
+
+import React from "react";
+
+const UserMenu = () => {
+ return UserMenu
;
+};
+
+export default UserMenu;
diff --git a/app/head.tsx b/app/head.tsx
new file mode 100644
index 0000000..15804fa
--- /dev/null
+++ b/app/head.tsx
@@ -0,0 +1,10 @@
+export default function Head() {
+ return (
+ <>
+ Checks!
+
+
+
+ >
+ );
+}
diff --git a/app/helpers/cn.ts b/app/helpers/cn.ts
new file mode 100644
index 0000000..cc89787
--- /dev/null
+++ b/app/helpers/cn.ts
@@ -0,0 +1,6 @@
+import clsx, { ClassValue } from "clsx";
+import { twMerge } from "tailwind-merge";
+
+const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));
+
+export default cn;
diff --git a/app/layout.tsx b/app/layout.tsx
index 844b1b8..aad9ec6 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,23 +1,29 @@
-import './globals.css'
-import type { Metadata } from 'next'
-import { Inter } from 'next/font/google'
+import "./globals.css";
+import type { Metadata } from "next";
+import { Inter } from "next/font/google";
+import Footer from "./components/Footer";
+import Header from "./components/Header";
-const inter = Inter({ subsets: ['latin'] })
+const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });
export const metadata: Metadata = {
- title: 'Create Next App',
- description: 'Generated by create next app',
-}
+ title: "Create Next App",
+ description: "Generated by create next app",
+};
export default function RootLayout({
children,
}: {
- children: React.ReactNode
+ children: React.ReactNode;
}) {
return (
-
+
- {children}
+
+
+ {children}
+
+
- )
+ );
}
diff --git a/app/providers/UserProvider.tsx b/app/providers/UserProvider.tsx
new file mode 100644
index 0000000..6290bd9
--- /dev/null
+++ b/app/providers/UserProvider.tsx
@@ -0,0 +1,45 @@
+"use client";
+
+import React, { createContext, useContext, useState } from "react";
+import { UserSession } from "../types/types";
+
+interface UserContextValues {
+ user: UserSession;
+ setUser: (user: UserSession) => void;
+ isAdmin: boolean;
+}
+export const UserContext = createContext({
+ user: undefined,
+ setUser: () => {},
+ isAdmin: false,
+});
+
+export const useUserContext = () => useContext(UserContext);
+
+interface UserContextProviderProps {
+ children: React.ReactNode;
+ user: UserSession;
+ isAdmin: boolean;
+}
+
+const UserContextProvider = ({
+ children,
+ user,
+ isAdmin,
+}: UserContextProviderProps) => {
+ const [userSession, setUserSession] = useState(user);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default UserContextProvider;
diff --git a/app/types/types.d.ts b/app/types/types.d.ts
new file mode 100644
index 0000000..68f68c3
--- /dev/null
+++ b/app/types/types.d.ts
@@ -0,0 +1,7 @@
+import { User } from "next-auth";
+
+export type UserSession =
+ | (User & {
+ id: string;
+ })
+ | undefined;
diff --git a/next.config.js b/next.config.js
index 44009cc..c84c309 100644
--- a/next.config.js
+++ b/next.config.js
@@ -1,6 +1,9 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
- appDir:true
-}
+ reactStrictMode: false,
+ experimental: {
+ appDir: true,
+ },
+};
-module.exports = nextConfig
+module.exports = nextConfig;
diff --git a/package-lock.json b/package-lock.json
index 15bf0a6..1679135 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,16 +8,20 @@
"name": "next-app",
"version": "0.1.0",
"dependencies": {
+ "@material-tailwind/react": "^1.2.4",
"@types/node": "20.8.6",
"@types/react": "18.2.28",
"@types/react-dom": "18.2.13",
"autoprefixer": "10.4.16",
+ "clsx": "^1.2.1",
"eslint": "8.51.0",
"eslint-config-next": "13.5.5",
"next": "13.5.5",
"postcss": "8.4.31",
"react": "18.2.0",
"react-dom": "18.2.0",
+ "react-icons": "^4.7.1",
+ "tailwind-merge": "^1.8.1",
"tailwindcss": "3.3.3",
"typescript": "5.2.2"
}
@@ -52,6 +56,21 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "optional": true,
+ "dependencies": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "optional": true
+ },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -104,6 +123,54 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
+ "node_modules/@floating-ui/core": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz",
+ "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
+ "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
+ "dependencies": {
+ "@floating-ui/core": "^1.4.2",
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/react": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz",
+ "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==",
+ "dependencies": {
+ "@floating-ui/react-dom": "^1.3.0",
+ "aria-hidden": "^1.1.3",
+ "tabbable": "^6.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz",
+ "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.2.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
+ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.11",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
@@ -177,6 +244,84 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@material-tailwind/react": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@material-tailwind/react/-/react-1.4.2.tgz",
+ "integrity": "sha512-XJ1Ie8xXMV2qZEtm0LgnJNK+8Lh1Si8TvOf0jKWGI2rHleD8U/Zype6k1AyRhBHHUwc6B19w8uR1fCIFvumURQ==",
+ "dependencies": {
+ "@floating-ui/react": "^0.19.0",
+ "classnames": "^2.3.2",
+ "deepmerge": "^4.2.2",
+ "framer-motion": "^6.5.1",
+ "material-ripple-effects": "^2.0.1",
+ "prop-types": "^15.8.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "tailwind-merge": "^1.8.1"
+ },
+ "peerDependencies": {
+ "react": "^16 || ^17 || ^18",
+ "react-dom": "^16 || ^17 || ^18"
+ }
+ },
+ "node_modules/@motionone/animation": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz",
+ "integrity": "sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==",
+ "dependencies": {
+ "@motionone/easing": "^10.16.3",
+ "@motionone/types": "^10.16.3",
+ "@motionone/utils": "^10.16.3",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/dom": {
+ "version": "10.12.0",
+ "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz",
+ "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==",
+ "dependencies": {
+ "@motionone/animation": "^10.12.0",
+ "@motionone/generators": "^10.12.0",
+ "@motionone/types": "^10.12.0",
+ "@motionone/utils": "^10.12.0",
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/easing": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.16.3.tgz",
+ "integrity": "sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==",
+ "dependencies": {
+ "@motionone/utils": "^10.16.3",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/generators": {
+ "version": "10.16.4",
+ "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.16.4.tgz",
+ "integrity": "sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==",
+ "dependencies": {
+ "@motionone/types": "^10.16.3",
+ "@motionone/utils": "^10.16.3",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/types": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.16.3.tgz",
+ "integrity": "sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg=="
+ },
+ "node_modules/@motionone/utils": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.16.3.tgz",
+ "integrity": "sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==",
+ "dependencies": {
+ "@motionone/types": "^10.16.3",
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.3.1"
+ }
+ },
"node_modules/@next/env": {
"version": "13.5.5",
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.5.tgz",
@@ -591,6 +736,17 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
+ "node_modules/aria-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
+ "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/aria-query": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
@@ -971,11 +1127,24 @@
"node": ">= 6"
}
},
+ "node_modules/classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
"node_modules/client-only": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
+ "node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1060,6 +1229,14 @@
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
},
+ "node_modules/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/define-data-property": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
@@ -1797,6 +1974,34 @@
"url": "https://github.com/sponsors/rawify"
}
},
+ "node_modules/framer-motion": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz",
+ "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==",
+ "dependencies": {
+ "@motionone/dom": "10.12.0",
+ "framesync": "6.0.1",
+ "hey-listen": "^1.0.8",
+ "popmotion": "11.0.3",
+ "style-value-types": "5.0.0",
+ "tslib": "^2.1.0"
+ },
+ "optionalDependencies": {
+ "@emotion/is-prop-valid": "^0.8.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.8 || ^17.0.0 || ^18.0.0",
+ "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/framesync": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz",
+ "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -2062,6 +2267,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hey-listen": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
+ "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="
+ },
"node_modules/ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@@ -2593,6 +2803,11 @@
"node": ">=10"
}
},
+ "node_modules/material-ripple-effects": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/material-ripple-effects/-/material-ripple-effects-2.0.1.tgz",
+ "integrity": "sha512-hHlUkZAuXbP94lu02VgrPidbZ3hBtgXBtjlwR8APNqOIgDZMV8MCIcsclL8FmGJQHvnORyvoQgC965vPsiyXLQ=="
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -2984,6 +3199,17 @@
"node": ">= 6"
}
},
+ "node_modules/popmotion": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz",
+ "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==",
+ "dependencies": {
+ "framesync": "6.0.1",
+ "hey-listen": "^1.0.8",
+ "style-value-types": "5.0.0",
+ "tslib": "^2.1.0"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -3176,6 +3402,14 @@
"react": "^18.2.0"
}
},
+ "node_modules/react-icons": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz",
+ "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -3529,6 +3763,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/style-value-types": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz",
+ "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==",
+ "dependencies": {
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.1.0"
+ }
+ },
"node_modules/styled-jsx": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
@@ -3613,6 +3856,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
+ },
+ "node_modules/tailwind-merge": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz",
+ "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
"node_modules/tailwindcss": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
@@ -4027,6 +4284,21 @@
"regenerator-runtime": "^0.14.0"
}
},
+ "@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "optional": true,
+ "requires": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "optional": true
+ },
"@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -4061,6 +4333,46 @@
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz",
"integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg=="
},
+ "@floating-ui/core": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz",
+ "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==",
+ "requires": {
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "@floating-ui/dom": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
+ "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
+ "requires": {
+ "@floating-ui/core": "^1.4.2",
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "@floating-ui/react": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz",
+ "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==",
+ "requires": {
+ "@floating-ui/react-dom": "^1.3.0",
+ "aria-hidden": "^1.1.3",
+ "tabbable": "^6.0.1"
+ }
+ },
+ "@floating-ui/react-dom": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz",
+ "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==",
+ "requires": {
+ "@floating-ui/dom": "^1.2.1"
+ }
+ },
+ "@floating-ui/utils": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
+ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
+ },
"@humanwhocodes/config-array": {
"version": "0.11.11",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
@@ -4115,6 +4427,80 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "@material-tailwind/react": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@material-tailwind/react/-/react-1.4.2.tgz",
+ "integrity": "sha512-XJ1Ie8xXMV2qZEtm0LgnJNK+8Lh1Si8TvOf0jKWGI2rHleD8U/Zype6k1AyRhBHHUwc6B19w8uR1fCIFvumURQ==",
+ "requires": {
+ "@floating-ui/react": "^0.19.0",
+ "classnames": "^2.3.2",
+ "deepmerge": "^4.2.2",
+ "framer-motion": "^6.5.1",
+ "material-ripple-effects": "^2.0.1",
+ "prop-types": "^15.8.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "tailwind-merge": "^1.8.1"
+ }
+ },
+ "@motionone/animation": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz",
+ "integrity": "sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==",
+ "requires": {
+ "@motionone/easing": "^10.16.3",
+ "@motionone/types": "^10.16.3",
+ "@motionone/utils": "^10.16.3",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@motionone/dom": {
+ "version": "10.12.0",
+ "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz",
+ "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==",
+ "requires": {
+ "@motionone/animation": "^10.12.0",
+ "@motionone/generators": "^10.12.0",
+ "@motionone/types": "^10.12.0",
+ "@motionone/utils": "^10.12.0",
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@motionone/easing": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.16.3.tgz",
+ "integrity": "sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==",
+ "requires": {
+ "@motionone/utils": "^10.16.3",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@motionone/generators": {
+ "version": "10.16.4",
+ "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.16.4.tgz",
+ "integrity": "sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==",
+ "requires": {
+ "@motionone/types": "^10.16.3",
+ "@motionone/utils": "^10.16.3",
+ "tslib": "^2.3.1"
+ }
+ },
+ "@motionone/types": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.16.3.tgz",
+ "integrity": "sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg=="
+ },
+ "@motionone/utils": {
+ "version": "10.16.3",
+ "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.16.3.tgz",
+ "integrity": "sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==",
+ "requires": {
+ "@motionone/types": "^10.16.3",
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.3.1"
+ }
+ },
"@next/env": {
"version": "13.5.5",
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.5.tgz",
@@ -4367,6 +4753,14 @@
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
+ "aria-hidden": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
+ "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
+ "requires": {
+ "tslib": "^2.0.0"
+ }
+ },
"aria-query": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
@@ -4609,11 +5003,21 @@
}
}
},
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
"client-only": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
+ "clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
+ },
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -4675,6 +5079,11 @@
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
},
+ "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=="
+ },
"define-data-property": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
@@ -5241,6 +5650,28 @@
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="
},
+ "framer-motion": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz",
+ "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==",
+ "requires": {
+ "@emotion/is-prop-valid": "^0.8.2",
+ "@motionone/dom": "10.12.0",
+ "framesync": "6.0.1",
+ "hey-listen": "^1.0.8",
+ "popmotion": "11.0.3",
+ "style-value-types": "5.0.0",
+ "tslib": "^2.1.0"
+ }
+ },
+ "framesync": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz",
+ "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==",
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -5415,6 +5846,11 @@
"has-symbols": "^1.0.2"
}
},
+ "hey-listen": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
+ "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="
+ },
"ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@@ -5790,6 +6226,11 @@
"yallist": "^4.0.0"
}
},
+ "material-ripple-effects": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/material-ripple-effects/-/material-ripple-effects-2.0.1.tgz",
+ "integrity": "sha512-hHlUkZAuXbP94lu02VgrPidbZ3hBtgXBtjlwR8APNqOIgDZMV8MCIcsclL8FmGJQHvnORyvoQgC965vPsiyXLQ=="
+ },
"merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -6051,6 +6492,17 @@
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="
},
+ "popmotion": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz",
+ "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==",
+ "requires": {
+ "framesync": "6.0.1",
+ "hey-listen": "^1.0.8",
+ "style-value-types": "5.0.0",
+ "tslib": "^2.1.0"
+ }
+ },
"postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
@@ -6152,6 +6604,12 @@
"scheduler": "^0.23.0"
}
},
+ "react-icons": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz",
+ "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==",
+ "requires": {}
+ },
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -6391,6 +6849,15 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
},
+ "style-value-types": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz",
+ "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==",
+ "requires": {
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.1.0"
+ }
+ },
"styled-jsx": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
@@ -6441,6 +6908,16 @@
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
+ "tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
+ },
+ "tailwind-merge": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz",
+ "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ=="
+ },
"tailwindcss": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
diff --git a/package.json b/package.json
index 66a8094..4be5513 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,10 @@
"react": "18.2.0",
"react-dom": "18.2.0",
"tailwindcss": "3.3.3",
- "typescript": "5.2.2"
+ "typescript": "5.2.2",
+ "tailwind-merge": "^1.8.1",
+ "clsx": "^1.2.1",
+ "@material-tailwind/react": "^1.2.4",
+ "react-icons": "^4.7.1"
}
}