+
Registration Is Currently Closed
If you believe this is a mistake or have any questions, feel free to reach out to us at{" "}
{c.issueEmail}!
@@ -76,9 +77,9 @@ export default async function Page() {
Return Home
-
+
Already registered?
-
+
Sign-in.
diff --git a/apps/web/src/app/settings/account/page.tsx b/apps/web/src/app/settings/account/page.tsx
index dc9b46a5..3602f6e0 100644
--- a/apps/web/src/app/settings/account/page.tsx
+++ b/apps/web/src/app/settings/account/page.tsx
@@ -1,5 +1,18 @@
import AccountSettings from "@/components/settings/AccountSettings";
+import { users } from "db/schema";
+import { eq } from "db/drizzle";
+import { auth } from "@clerk/nextjs";
+import { db } from "db";
+import { redirect } from "next/navigation";
-export default function Page() {
- return
;
+export default async function Page() {
+ const { userId } = auth();
+ const user = await db.query.users.findFirst({
+ with: { registrationData: true },
+ where: eq(users.clerkID, userId!),
+ });
+ if (!user) return redirect("/sign-in");
+ return
;
}
+
+export const runtime = "edge";
diff --git a/apps/web/src/app/settings/layout.tsx b/apps/web/src/app/settings/layout.tsx
index 8ca128b8..248f704c 100644
--- a/apps/web/src/app/settings/layout.tsx
+++ b/apps/web/src/app/settings/layout.tsx
@@ -1,4 +1,4 @@
-import { auth } from "@clerk/nextjs";
+import { auth, currentUser } from "@clerk/nextjs";
import { redirect } from "next/navigation";
import type { ReactNode } from "react";
import SettingsSection from "@/components/settings/SettingsSection";
@@ -7,36 +7,39 @@ import { Settings } from "lucide-react";
import ClientToast from "@/components/shared/ClientToast";
export default async function ({ children }: { children: ReactNode }) {
- const { userId, user } = await auth();
+ const { userId } = await auth();
+ const user = await currentUser();
- if (!user || !userId) return redirect("/sign-in");
+ if (!user || !userId) {
+ return redirect("/sign-in");
+ }
- if (!user.publicMetadata.registrationComplete) {
- return redirect("/register");
- }
+ if (!user.publicMetadata.registrationComplete) {
+ return redirect("/register");
+ }
- return (
- <>
-
-
-
-
-
-
-
-
-
-
{children}
-
- >
- );
+ return (
+ <>
+
+
+
+
+
+ {/* */}
+
+
+
+
{children}
+
+ >
+ );
}
diff --git a/apps/web/src/app/settings/profile/page.tsx b/apps/web/src/app/settings/profile/page.tsx
index 65e8ba0a..3e243c50 100644
--- a/apps/web/src/app/settings/profile/page.tsx
+++ b/apps/web/src/app/settings/profile/page.tsx
@@ -5,16 +5,22 @@ import { eq } from "db/drizzle";
import { auth } from "@clerk/nextjs";
export default async function Page() {
- const { userId } = auth();
- if (!userId) throw new Error("User not found");
- const user = await db.query.users.findFirst({
- where: eq(users.clerkID, userId),
- with: {
- profileData: true,
- },
- });
- if (!user) throw new Error("User not found");
- return
;
+ const { userId } = auth();
+ if (!userId) throw new Error("User not found");
+ const user = await db.query.users.findFirst({
+ where: eq(users.clerkID, userId),
+ with: {
+ profileData: true,
+ registrationData: true,
+ },
+ });
+ if (!user) throw new Error("User not found");
+ return (
+
+ );
}
export const runtime = "edge";
diff --git a/apps/web/src/app/sign-up/[[...sign-up]]/page.tsx b/apps/web/src/app/sign-up/[[...sign-up]]/page.tsx
index 87a3245a..7be35932 100644
--- a/apps/web/src/app/sign-up/[[...sign-up]]/page.tsx
+++ b/apps/web/src/app/sign-up/[[...sign-up]]/page.tsx
@@ -28,7 +28,7 @@ export default async function Page() {
Registration
-
Registration Is Currently Closed
+
Registration Is Currently Closed
If you believe this is a mistake or have any questions, feel free to reach out to us at{" "}
{c.issueEmail}!
@@ -39,7 +39,7 @@ export default async function Page() {
Already registered?{" "}
-
+
Sign-in.
diff --git a/apps/web/src/components/dash/admin/events/EventColumns.tsx b/apps/web/src/components/admin/events/EventColumns.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/events/EventColumns.tsx
rename to apps/web/src/components/admin/events/EventColumns.tsx
diff --git a/apps/web/src/components/dash/admin/events/EventDataTable.tsx b/apps/web/src/components/admin/events/EventDataTable.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/events/EventDataTable.tsx
rename to apps/web/src/components/admin/events/EventDataTable.tsx
diff --git a/apps/web/src/components/dash/admin/events/NewEventForm.tsx b/apps/web/src/components/admin/events/NewEventForm.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/events/NewEventForm.tsx
rename to apps/web/src/components/admin/events/NewEventForm.tsx
diff --git a/apps/web/src/components/dash/admin/landing/Overview.tsx b/apps/web/src/components/admin/landing/Overview.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/landing/Overview.tsx
rename to apps/web/src/components/admin/landing/Overview.tsx
diff --git a/apps/web/src/components/admin/scanner/CheckinScanner.tsx b/apps/web/src/components/admin/scanner/CheckinScanner.tsx
new file mode 100644
index 00000000..b21542a4
--- /dev/null
+++ b/apps/web/src/components/admin/scanner/CheckinScanner.tsx
@@ -0,0 +1,198 @@
+"use client";
+
+import { useState, useEffect } from "react";
+import { QrScanner } from "@yudiel/react-qr-scanner";
+import superjson from "superjson";
+import { getScan, checkInUser } from "@/actions/admin/scanner-admin-actions";
+import { useAction, useOptimisticAction } from "next-safe-action/hook";
+import { type QRDataInterface } from "@/lib/utils/shared/qr";
+import type { scansType, userType, eventType } from "@/lib/utils/shared/types";
+
+import {
+ Drawer,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/components/shadcn/ui/drawer";
+import { Button } from "@/components/shadcn/ui/button";
+import Link from "next/link";
+import { useRouter, usePathname, useSearchParams } from "next/navigation";
+import { toast } from "sonner";
+
+/*
+
+Pass Scanner Props:
+
+eventName: name of the event that the user is scanning into
+hasScanned: if the state has eventered one in which a QR has been scanned (whether that scan has scanned before or not)
+scan: the scan object that has been scanned. If they have not scanned before scan will be null leading to a new record or if they have then it will incriment the scan count.
+
+*/
+
+interface CheckinScannerProps {
+ // event: eventType;
+ hasScanned: boolean;
+ // scan: scansType | null;
+ checkedIn: boolean | null;
+ scanUser: userType | null;
+ hasRSVP: boolean | null;
+}
+
+export default function CheckinScanner({
+ // event,
+ hasScanned,
+ checkedIn,
+ scanUser,
+ hasRSVP
+}: CheckinScannerProps) {
+ const [scanLoading, setScanLoading] = useState(false);
+ const { execute: runScanAction } = useAction(checkInUser, {});
+ const [proceed,setProceed] = useState(hasRSVP);
+ useEffect(() => {
+ if (hasScanned) {
+ setScanLoading(false);
+ }
+ }, [hasScanned]);
+
+ const searchParams = useSearchParams();
+ const path = usePathname();
+ const router = useRouter();
+
+ function handleScanCreate() {
+ const params = new URLSearchParams(searchParams.toString());
+ const timestamp = parseInt(params.get("createdAt") as string);
+ if (isNaN(timestamp)) {
+ return alert("Invalid QR Code Data (Field: createdAt)");
+ }
+ if (checkedIn) {
+ return alert("User Already Checked in!");
+ } else {
+ // TODO: make this a little more typesafe
+ runScanAction(scanUser?.clerkID!);
+ }
+ toast.success("Successfully Scanned User In");
+ router.replace(`${path}`);
+ }
+
+ return (
+ <>
+
+
+
+ {
+ const params = new URLSearchParams(searchParams.toString());
+ if (!params.has("user")) {
+ setScanLoading(true);
+ const qrParsedData = superjson.parse(result);
+ params.set("user", qrParsedData.userID);
+ params.set(
+ "createdAt",
+ qrParsedData.createdAt.getTime().toString()
+ );
+ router.replace(`${path}?${params.toString()}`);
+ }
+ }}
+ onError={(error) => console.log(error?.message)}
+ containerStyle={{
+ width: "100vw",
+ maxWidth: "500px",
+ margin: "0",
+ }}
+ />
+
+ {/*
+
+ Return To Events
+
+
*/}
+
+
+
router.replace(path)}
+ open={hasScanned || scanLoading}>
+
+ {scanLoading ? (
+ <>
+
+ Loading Scan...
+ {/* */}
+
+
+ router.replace(path)} variant="outline">
+ Cancel
+
+
+ >
+ ) : (
+ <>
+
+ {checkedIn ? (
+
+ User already checked in!
+
+ ) : (
+ <>
+ {!proceed ? (
+ <>
+
+ Warning!
+
+
+ {scanUser?.firstName} {scanUser?.lastName} Is not
+ RSVP'd
+
+
+ Do you wish to proceed?
+ {
+ setProceed(true);
+ }}
+ variant="outline">
+ Proceed
+
+ router.replace(path)}
+ variant="outline">
+ Cancel
+
+
+ >
+ ) : (
+ <>
+ New Scan
+
+ New scan for {scanUser?.firstName}{" "}
+ {scanUser?.lastName}
+
+ >
+ )}
+ >
+ )}
+
+ {
+ proceed ?
+ <>
+
+ {!checkedIn && (
+ handleScanCreate()}>
+ {"Scan User In"}
+
+ )}
+ router.replace(path)} variant="outline">
+ Cancel
+
+
+ >:
+ <>>
+ }
+ >
+ )}
+
+
+ >
+ );
+}
diff --git a/apps/web/src/components/dash/admin/scanner/PassScanner.tsx b/apps/web/src/components/admin/scanner/PassScanner.tsx
similarity index 84%
rename from apps/web/src/components/dash/admin/scanner/PassScanner.tsx
rename to apps/web/src/components/admin/scanner/PassScanner.tsx
index 4b04023c..98b2f67d 100644
--- a/apps/web/src/components/dash/admin/scanner/PassScanner.tsx
+++ b/apps/web/src/components/admin/scanner/PassScanner.tsx
@@ -7,6 +7,9 @@ import { getScan, createScan } from "@/actions/admin/scanner-admin-actions";
import { useAction, useOptimisticAction } from "next-safe-action/hook";
import { type QRDataInterface } from "@/lib/utils/shared/qr";
import type { scansType, userType, eventType } from "@/lib/utils/shared/types";
+import c from "config";
+
+
import {
Drawer,
DrawerClose,
@@ -58,6 +61,12 @@ export default function PassScanner({
const path = usePathname();
const router = useRouter();
+ const register = (scanUser?.checkedIn) ? "Checked in!" : "Not Checked In";
+ const guild = Object.keys(c.groups)[scanUser?.group || 0] ?? "None";
+ const role = (scanUser?.role) ? scanUser?.role : "Not Found";
+
+
+
function handleScanCreate() {
const params = new URLSearchParams(searchParams.toString());
const timestamp = parseInt(params.get("createdAt") as string);
@@ -123,8 +132,7 @@ export default function PassScanner({
router.replace(path)}
- open={hasScanned || scanLoading}
- >
+ open={hasScanned || scanLoading}>
{scanLoading ? (
<>
@@ -142,16 +150,26 @@ export default function PassScanner({
<>
New Scan for {event.title}
-
- New scan for {scanUser?.firstName} {scanUser?.lastName}
+
+ <>
+ {scanUser?.firstName} {scanUser?.lastName}
+ >
+
+ Role: {role}
+
+
+ Status: {register}
+
+ Guild: {guild}
handleScanCreate()}>
{scan ? "Add Additional Scan" : "Scan User In"}
-
- Cancel
+ router.replace(path)} variant="outline">
+ Cancel
+
>
)}
diff --git a/apps/web/src/components/dash/admin/toggles/NavItemsManager.tsx b/apps/web/src/components/admin/toggles/NavItemsManager.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/toggles/NavItemsManager.tsx
rename to apps/web/src/components/admin/toggles/NavItemsManager.tsx
diff --git a/apps/web/src/components/dash/admin/toggles/RegistrationSettings.tsx b/apps/web/src/components/admin/toggles/RegistrationSettings.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/toggles/RegistrationSettings.tsx
rename to apps/web/src/components/admin/toggles/RegistrationSettings.tsx
diff --git a/apps/web/src/components/dash/admin/toggles/ToggleItem.tsx b/apps/web/src/components/admin/toggles/ToggleItem.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/toggles/ToggleItem.tsx
rename to apps/web/src/components/admin/toggles/ToggleItem.tsx
diff --git a/apps/web/src/components/admin/users/DefaultPagination.tsx b/apps/web/src/components/admin/users/DefaultPagination.tsx
new file mode 100644
index 00000000..0bc0ed47
--- /dev/null
+++ b/apps/web/src/components/admin/users/DefaultPagination.tsx
@@ -0,0 +1,74 @@
+"use client"
+
+import {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+} from "@/components/shadcn/ui/pagination";
+import { useEffect, useRef, useState } from "react";
+import {usePathname,useSearchParams } from "next/navigation";
+import { createPath } from "@/lib/utils/shared/pageParams";
+
+export function DefaultPagination({maxPages}:{maxPages:number}) {
+ // FIXME: Come back and change after done testing
+
+ const path = usePathname();
+ const params = useSearchParams();
+
+
+ const page = params.get("page") ?? "1";
+
+ const [currPage,setCurrPage] = useState(+page);
+ const pageRef = useRef(1);
+
+
+ function incPage(){
+ pageRef.current = Math.min(maxPages,pageRef.current + 1);
+ setCurrPage(Math.min(maxPages,currPage+1));
+ }
+
+ function decPage() {
+ pageRef.current = Math.max(1, pageRef.current - 1);
+ setCurrPage(Math.max(1, currPage - 1));
+ }
+
+ function createPaginationPath(reqPage:string){
+ const url = `${path}?${reqPage}&user=${
+ params.get("user") ?? ""
+ }&checkedBoxes=${params.get("checkedBoxes") ?? ""}`;
+ console.log("Pagination",url);
+ return url;
+ }
+
+
+ return (
+
+
+
+ {
+ decPage();
+ }}
+ />
+
+ {currPage}
+
+ {
+ incPage();
+ }}
+ />
+
+
+
+ );
+}
diff --git a/apps/web/src/components/admin/users/FilterCategory.tsx b/apps/web/src/components/admin/users/FilterCategory.tsx
new file mode 100644
index 00000000..ee0fd2f2
--- /dev/null
+++ b/apps/web/src/components/admin/users/FilterCategory.tsx
@@ -0,0 +1,30 @@
+"use client";
+
+import {
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/shadcn/ui/accordion";
+import FilterItem from "./FilterItem";
+
+export default function FilterCategory({
+ name,
+ items,
+}: {
+ name: string;
+ items: string[];
+}) {
+ console.log("data:", items);
+
+
+
+ return (
+ <>
+
+ {name}
+ {items.map((item: string) => (
+
+ ))}
+
+ >
+ );
+}
diff --git a/apps/web/src/components/admin/users/FilterItem.tsx b/apps/web/src/components/admin/users/FilterItem.tsx
new file mode 100644
index 00000000..d40915fb
--- /dev/null
+++ b/apps/web/src/components/admin/users/FilterItem.tsx
@@ -0,0 +1,53 @@
+"use client"
+
+import {
+ AccordionContent,
+} from "@/components/shadcn/ui/accordion";
+
+import { Checkbox } from "@/components/shadcn/ui/checkbox";
+import { useSearchParams, usePathname, useRouter } from "next/navigation";
+import { useRef } from "react";
+import { createPath } from "@/lib/utils/shared/pageParams";
+
+
+export default function FilterItem({parentName,item}:{parentName:string,item:string}){
+ const isClicked = useRef(false);
+ const path = usePathname();
+ const params = useSearchParams();
+ const router = useRouter();
+
+
+ function handleClick(){
+ if (isClicked.current) {
+ isClicked.current = false;
+ // router.push(createPath(path, '1', user, checkedBoxes));
+
+ const url = `${path}?${params}`;
+ console.log("Flipping off!");
+ router.push(url);
+ } else {
+ isClicked.current = true;
+ console.log("Flipping on!");
+ const user = params.get("user") ?? "";
+ const checkedBoxes = params.get("checkedBoxes") ?? [];
+ // We want to filter basically
+
+ const url = `${path}?user=${user}&checkedBoxes=${item}`;
+ console.log("Filter item",url);
+ router.push(url);
+ }
+ }
+
+
+ return(
+
+
+
+
{item}
+
+
+ )
+}
\ No newline at end of file
diff --git a/apps/web/src/components/admin/users/Filters.tsx b/apps/web/src/components/admin/users/Filters.tsx
new file mode 100644
index 00000000..0d89ffb5
--- /dev/null
+++ b/apps/web/src/components/admin/users/Filters.tsx
@@ -0,0 +1,48 @@
+"use client";
+
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "@/components/shadcn/ui/card";
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/shadcn/ui/accordion";
+import FilterCategory from "./FilterCategory";
+
+type categoryMap = {
+ [key: string]: string[];
+};
+
+const categoriesMap: categoryMap = {
+ Role: ["Hacker", "Volunteer", "Mentor"],
+ Alphabetically: ["A-Z", "Z-A"],
+ Timestamp: ["Most Recent", "Less Recent"],
+};
+
+export default function Filters() {
+ return (
+
+
+ Filters
+
+
+
+ {Object.keys(categoriesMap).map((name, index, category) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/web/src/components/admin/users/SearchBar.tsx b/apps/web/src/components/admin/users/SearchBar.tsx
new file mode 100644
index 00000000..5bd0db45
--- /dev/null
+++ b/apps/web/src/components/admin/users/SearchBar.tsx
@@ -0,0 +1,45 @@
+"use client";
+
+import { Input } from "@/components/shadcn/ui/input";
+import {useRouter,useSearchParams,usePathname } from "next/navigation";
+import { useRef, useState } from "react";
+import { useDebouncedCallback } from "use-debounce";
+
+
+import { X } from "lucide-react";
+export default function SearchBar(){
+ const searchParams = useSearchParams();
+ const { replace } = useRouter();
+ const pathname = usePathname();
+
+ // We use a debouncing strategy to prevent the search from querying every single keystroke and instead will run a time after the user completes typing
+ const handleSearch = useDebouncedCallback((term) => {
+ // @ts-ignore Works perfectly fine and is apprporiate accoriding to the docs. Might be a version issue?
+ const params = new URLSearchParams(searchParams);
+ if (term) {
+ params.set("user", term);
+ } else {
+ params.delete("user");
+ }
+ replace(`${pathname}?${params.toString()}`);
+ }, 100);
+
+ return (
+
+ {/* Needs to clear text */}
+ handleSearch(e.target.value)}
+ />
+ {
+ handleSearch("");
+ }}>
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/web/src/components/dash/admin/users/ServerSections.tsx b/apps/web/src/components/admin/users/ServerSections.tsx
similarity index 91%
rename from apps/web/src/components/dash/admin/users/ServerSections.tsx
rename to apps/web/src/components/admin/users/ServerSections.tsx
index 14bf63e9..70d49ad9 100644
--- a/apps/web/src/components/dash/admin/users/ServerSections.tsx
+++ b/apps/web/src/components/admin/users/ServerSections.tsx
@@ -1,4 +1,4 @@
-import UserInfoSection from "@/components/dash/admin/users/UserInfoSection";
+import UserInfoSection from "@/components/admin/users/UserInfoSection";
import type { UserWithAllData } from "@/lib/utils/server/types";
import { titleCase } from "title-case";
import { Button } from "@/components/shadcn/ui/button";
@@ -45,23 +45,23 @@ export async function AccountInfo({ user }: { user: UserWithAllData }) {
const clerkUser = await clerkClient.users.getUser(user.clerkID);
if (!clerkUser) return null;
- const signInMethods = clerkUser.externalAccounts.map((account) =>
- titleCase(account.provider.split("_").slice(-1)[0])
- );
+ // const signInMethods = clerkUser.externalAccounts.map((account) =>
+ // titleCase(account.provider.split("_").slice(-1)[0])
+ // );
- if (clerkUser.passwordEnabled) {
- signInMethods.push("Password");
- }
+ // if (clerkUser.passwordEnabled) {
+ // signInMethods.push("Password");
+ // }
return (
|
|
- 1 ? "s" : ""}`}
value={signInMethods.join(", ")}
- />
+ /> */}
|
);
diff --git a/apps/web/src/components/dash/admin/users/UpdateRoleDialog.tsx b/apps/web/src/components/admin/users/UpdateRoleDialog.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/users/UpdateRoleDialog.tsx
rename to apps/web/src/components/admin/users/UpdateRoleDialog.tsx
diff --git a/apps/web/src/components/dash/admin/users/UserColumns.tsx b/apps/web/src/components/admin/users/UserColumns.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/users/UserColumns.tsx
rename to apps/web/src/components/admin/users/UserColumns.tsx
diff --git a/apps/web/src/components/dash/admin/users/UserDataTable.tsx b/apps/web/src/components/admin/users/UserDataTable.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/users/UserDataTable.tsx
rename to apps/web/src/components/admin/users/UserDataTable.tsx
diff --git a/apps/web/src/components/dash/admin/users/UserInfoSection.tsx b/apps/web/src/components/admin/users/UserInfoSection.tsx
similarity index 100%
rename from apps/web/src/components/dash/admin/users/UserInfoSection.tsx
rename to apps/web/src/components/admin/users/UserInfoSection.tsx
diff --git a/apps/web/src/components/dash/admin/scanner/CheckinScanner.tsx b/apps/web/src/components/dash/admin/scanner/CheckinScanner.tsx
deleted file mode 100644
index 585ee24d..00000000
--- a/apps/web/src/components/dash/admin/scanner/CheckinScanner.tsx
+++ /dev/null
@@ -1,147 +0,0 @@
-"use client";
-
-import { useState, useEffect } from "react";
-import { QrScanner } from "@yudiel/react-qr-scanner";
-import superjson from "superjson";
-import { getScan, checkInUser } from "@/actions/admin/scanner-admin-actions";
-import { useAction, useOptimisticAction } from "next-safe-action/hook";
-import { type QRDataInterface } from "@/lib/utils/shared/qr";
-import type { scansType, userType, eventType } from "@/lib/utils/shared/types";
-import {
- Drawer,
- DrawerClose,
- DrawerContent,
- DrawerDescription,
- DrawerFooter,
- DrawerHeader,
- DrawerTitle,
- DrawerTrigger,
-} from "@/components/shadcn/ui/drawer";
-import { Button } from "@/components/shadcn/ui/button";
-import Link from "next/link";
-import { useRouter, usePathname, useSearchParams } from "next/navigation";
-import { toast } from "sonner";
-
-/*
-
-Pass Scanner Props:
-
-eventName: name of the event that the user is scanning into
-hasScanned: if the state has eventered one in which a QR has been scanned (whether that scan has scanned before or not)
-scan: the scan object that has been scanned. If they have not scanned before scan will be null leading to a new record or if they have then it will incriment the scan count.
-
-*/
-
-interface CheckinScannerProps {
- // event: eventType;
- hasScanned: boolean;
- // scan: scansType | null;
- checkedIn: boolean | null;
- scanUser: userType | null;
-}
-
-export default function CheckinScanner({
- // event,
- hasScanned,
- checkedIn,
- scanUser,
-}: CheckinScannerProps) {
- const [scanLoading, setScanLoading] = useState(false);
- const { execute: runScanAction } = useAction(checkInUser, {});
-
- useEffect(() => {
- if (hasScanned) {
- setScanLoading(false);
- }
- }, [hasScanned]);
-
- const searchParams = useSearchParams();
- const path = usePathname();
- const router = useRouter();
-
- function handleScanCreate() {
- const params = new URLSearchParams(searchParams.toString());
- const timestamp = parseInt(params.get("createdAt") as string);
- if (isNaN(timestamp)) {
- return alert("Invalid QR Code Data (Field: createdAt)");
- }
- if (checkedIn) {
- return alert("User Already Checked in!");
- } else {
- // TODO: make this a little more typesafe
- runScanAction(scanUser?.clerkID!);
- }
- toast.success("Successfully Scanned User In");
- router.replace(`${path}`);
- }
-
- return (
- <>
-
-
-
- {
- const params = new URLSearchParams(searchParams.toString());
- if (!params.has("user")) {
- setScanLoading(true);
- const qrParsedData = superjson.parse(result);
- params.set("user", qrParsedData.userID);
- params.set("createdAt", qrParsedData.createdAt.getTime().toString());
- router.replace(`${path}?${params.toString()}`);
- }
- }}
- onError={(error) => console.log(error?.message)}
- containerStyle={{
- width: "100vw",
- maxWidth: "500px",
- margin: "0",
- }}
- />
-
- {/*
-
- Return To Events
-
-
*/}
-
-
- router.replace(path)} open={hasScanned || scanLoading}>
-
- {scanLoading ? (
- <>
-
- Loading Scan...
- {/* */}
-
-
- router.replace(path)} variant="outline">
- Cancel
-
-
- >
- ) : (
- <>
-
- {checkedIn ? (
- User already checked in!
- ) : (
- <>
- New Scan
-
- New scan for {scanUser?.firstName} {scanUser?.lastName}
-
- >
- )}
-
-
- {!checkedIn && handleScanCreate()}>{"Scan User In"} }
- Cancel
-
- >
- )}
-
-
- >
- );
-}
diff --git a/apps/web/src/components/dash/overview/ServerBubbles.tsx b/apps/web/src/components/dash/overview/ServerBubbles.tsx
index b2ce66e4..8149a4a3 100644
--- a/apps/web/src/components/dash/overview/ServerBubbles.tsx
+++ b/apps/web/src/components/dash/overview/ServerBubbles.tsx
@@ -33,7 +33,7 @@ export function Questions() {
export function TitleBubble() {
return (
-
+
{c.hackathonName}
diff --git a/apps/web/src/components/dash/shared/DashNavItem.tsx b/apps/web/src/components/dash/shared/DashNavItem.tsx
index d6ee0439..bfeaf579 100644
--- a/apps/web/src/components/dash/shared/DashNavItem.tsx
+++ b/apps/web/src/components/dash/shared/DashNavItem.tsx
@@ -15,7 +15,7 @@ export default function DashNavItem({ name, path }: DashNavItemProps) {
diff --git a/apps/web/src/components/dash/shared/DefaultDropDownTrigger.tsx b/apps/web/src/components/dash/shared/DefaultDropDownTrigger.tsx
new file mode 100644
index 00000000..f41c4ad8
--- /dev/null
+++ b/apps/web/src/components/dash/shared/DefaultDropDownTrigger.tsx
@@ -0,0 +1,10 @@
+"use client";
+import { UserRound } from "lucide-react";
+
+export default function DefaultDropdownTrigger() {
+ return (
+
+
+
+ );
+}
diff --git a/apps/web/src/components/landing/About.tsx b/apps/web/src/components/landing/About.tsx
new file mode 100644
index 00000000..524dfc0e
--- /dev/null
+++ b/apps/web/src/components/landing/About.tsx
@@ -0,0 +1,28 @@
+import Balancer from "react-wrap-balancer";
+import Image from "next/image";
+import D1 from "../../../public/img/landing/d1.svg";
+import D2 from "../../../public/img/landing/d2.svg"
+import D3 from "../../../public/img/landing/d3.svg";
+import D4 from "../../../public/img/landing/d4.svg";
+import Dino_Coding from "../../../public/img/landing/dinos_coding.png"
+export default function About() {
+ const d1_stylesheet = {
+ width:'25rem',
+ height: "auto",
+ sm:"width: 30rem"
+ };
+ return (
+
+
+
+ About Section
+
+
+ Introduce the hackathon and its purpose! Make it sound enticing
+
+
+
+ );
+}
diff --git a/apps/web/src/components/landing/Footer.tsx b/apps/web/src/components/landing/Footer.tsx
new file mode 100644
index 00000000..e8f2a719
--- /dev/null
+++ b/apps/web/src/components/landing/Footer.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import { type FunctionComponent, useState } from "react";
+import Image from "next/image";
+import Link from "next/link";
+import { Instagram, Facebook, Twitter, Github, Disc } from "lucide-react";
+import Discord from "../../../public/img/landing/discord_icon.svg";
+
+interface Props {
+ className?: string;
+}
+
+export default function Footer() {
+ const [showResources, setShowResources] = useState(false);
+ const [showLinks, setShowLinks] = useState(false);
+ const [showHackathons, setShowHackathons] = useState(false);
+
+ return (
+
+ );
+}
diff --git a/apps/web/src/components/landing/Hero.tsx b/apps/web/src/components/landing/Hero.tsx
new file mode 100644
index 00000000..7e006535
--- /dev/null
+++ b/apps/web/src/components/landing/Hero.tsx
@@ -0,0 +1,65 @@
+import Image from "next/image";
+import Link from "next/link";
+import { Button } from "../shadcn/ui/button";
+
+export default function Hero() {
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ Hack
+
+ Kit
+
+
+
+
+ Feature-packed Hackathon managment software that just works .
+
+
+
+
+
+
+ GitHub
+
+
+
+
+ Docs
+
+
+
+
+ Channel Log
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/components/landing/MLHBadge.tsx b/apps/web/src/components/landing/MLHBadge.tsx
new file mode 100644
index 00000000..16cba9e1
--- /dev/null
+++ b/apps/web/src/components/landing/MLHBadge.tsx
@@ -0,0 +1,45 @@
+import Link from "next/link";
+import Image from "next/image";
+
+export default function MLHBadge() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/apps/web/src/components/landing/PartnerCard.tsx b/apps/web/src/components/landing/PartnerCard.tsx
new file mode 100644
index 00000000..3cb268a7
--- /dev/null
+++ b/apps/web/src/components/landing/PartnerCard.tsx
@@ -0,0 +1,84 @@
+import React from "react";
+import Link from "next/link";
+import Image from "next/image";
+
+
+type Partner = {
+ name: string;
+ logo: string;
+ url: string;
+ tier: string;
+};
+
+type colorMap = {
+ key:string,
+ value:string
+}
+
+// const tierBorderMap = {
+// [Tier.Title]: "w-[15rem] sm:w-72 md:w-72 lg:w-80 2xl:w-[19rem]",
+// [Tier.Gold]: "w-[12.75rem] sm:w-[14.75rem] md:w-[16rem] lg:w-72 2xl:w-[19rem]",
+// [Tier.Silver]: "w-[11rem] sm:w-52 md:w-60 lg:w-[16rem] 2xl:w-[17rem] ",
+// [Tier.Bronze]: "w-32 sm:w-40 md:w-[12rem] lg:w-[14rem] 2xl:w-[16rem]",
+// [Tier.Rowdy_Partner]: "w-[7rem] sm:w-32 md:w-40 lg:w-[11rem] 2xl:w-[13rem]",
+// [Tier.In_Kind_Partner]: "w-[6rem] sm:w-[7rem] md:w-32 lg:w-40 2xl:w-52",
+// };
+
+
+
+const tierColorMap:{[key:string]:string} = {
+ ["Title Sponsor"]: "text-purple-500",
+ [ "Gold Sponsor"]: "text-yellow-600",
+ ["Silver Sponsor"]: "text-gray-400",
+ ["Bronze Sponsor"]: "text-amber-800",
+ ["Rowdy Partner"]: "text-blue-500",
+ ["Rowdy In-Kind"]: "text-red-500",
+};
+
+
+function PartnerCard({partner,is_title}:{partner:Partner,is_title:boolean}) {
+
+ const text: string = is_title
+ ? "text-2xl sm:text-3xl xl:text-4xl 2xl:text-[3rem]"
+ : "text-md sm:text-lg lg:text-xl xl:text-2xl 2xl:text-3xl";
+
+ const height: string = is_title
+ ? "h-[15rem] sm:h-[15rem] md:h-[16rem] lg:h-[20rem] xl:h-[20rem] 2xl:h-[22rem]"
+ : "h-[9rem] sm:h-[11rem] md:h-[11rem] lg:h-[12rem] xl:h-[14rem] 2xl:h-[17rem]";
+ const image: string = is_title
+ ? "w-[17rem] sm:w-[17rem] md:w-[18rem] xl:w-[20rem] 2xl:w-[24rem]"
+ : "w-[8rem] sm:w-[10rem] md:w-[14rem] lg:w-48 xl:w-[16rem]";
+
+ return (
+
+
+
+
+
+ {partner?.name}
+
+
+ {partner?.tier}
+
+
+ );
+}
+
+export default PartnerCard;
diff --git a/apps/web/src/components/landing/Partners.tsx b/apps/web/src/components/landing/Partners.tsx
new file mode 100644
index 00000000..7ec187cd
--- /dev/null
+++ b/apps/web/src/components/landing/Partners.tsx
@@ -0,0 +1,52 @@
+import partnerData from "./partners.json";
+import PartnerCard from "./PartnerCard";
+import Image from "next/image";
+
+
+
+type Partner = {
+ name: string;
+ logo: string;
+ url: string;
+ tier: string;
+};
+
+
+export default async function Partners() {
+ // Christian Walker: Aware of weird bug from 1280px to 1286 px where background dissapears
+ const marathon: Partner = {
+ name: "Marathon",
+ logo: "marathon_logo.svg",
+ url: "https://www.marathonpetroleum.com/",
+ tier: "Title Sponsor",
+ };
+
+ return (
+
+
+
+ Partners Sections
+
+
+ {
+ "See the Partners Component inside components/landing/Partners for an example"
+ }
+
+
+ {/* Example Code of what our previous partner section looked like */}
+ {/*
+ A Huge Thanks To Our Rowdyhacks Partners!
+
+
+
+
+
+ {partnerData.partners.map((partner: Partner) => (
+
+ ))}
+
*/}
+
+ );
+}
diff --git a/apps/web/src/components/landing/Person.tsx b/apps/web/src/components/landing/Person.tsx
new file mode 100644
index 00000000..12adef30
--- /dev/null
+++ b/apps/web/src/components/landing/Person.tsx
@@ -0,0 +1,9 @@
+export type Person = {
+ fname: string; //picture file name must match name with .png
+ lname: string;
+ imgLink: string;
+ role: string;
+ linkedin: string;
+ website: string;
+ github: string;
+};
diff --git a/apps/web/src/components/landing/Team.tsx b/apps/web/src/components/landing/Team.tsx
new file mode 100644
index 00000000..0c8961b7
--- /dev/null
+++ b/apps/web/src/components/landing/Team.tsx
@@ -0,0 +1,230 @@
+"use client";
+import React from "react";
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "../shadcn/ui/carousel";
+import { Person } from "./Person";
+import TeamMember from "./TeamMember";
+import { Oswald } from "next/font/google";
+import { useState, useEffect } from "react";
+import Autoplay from "embla-carousel-autoplay";
+import { ArrowRight } from "lucide-react";
+import c from "config"
+
+const oswald = Oswald({
+ variable: "--font-oswald",
+ subsets: ["latin"],
+});
+
+/**
+ * Creates our person and makes it seamless
+ * @param fname First Name
+ * @param lname Last Name
+ * @param role Role
+ * @param linkedin LinkedIn
+ * @param website Website
+ * @param github Github
+ * @returns Person
+ * */
+function createPerson(
+ fname: string,
+ lname: string,
+ role: string,
+ linkedin: string,
+ website: string,
+ github: string
+): Person {
+ return {
+ fname: fname,
+ lname: lname,
+ imgLink: CreateImgLink(fname, lname),
+ role: role,
+ linkedin: linkedin,
+ website: website,
+ github: github,
+ };
+}
+/**
+ * Helper function to find each team member's image in the public img landing folder
+ * @param firstname
+ * @param lastname
+ * @returns Image Link
+ *
+ */
+function CreateImgLink(firstname: string, lastname: string):string {
+ return `/img/landing/team/${firstname}_${lastname}.jpg`;
+}
+
+// Insert whatever roles that you want here and add them to the roles object
+const roles = {
+ director: "Director",
+ media: "Media/Design",
+ experience: "Experience",
+ logistics: "Logistics",
+ tech: "Tech",
+ pr: "PR",
+};
+
+
+
+let team: Array = [
+ // add each person here. if no website, leave empty string
+ createPerson(
+ "First Name",
+ "Last Name",
+ "Position of Person",
+ "https://www.linkedin.com/",
+ "https://www.google.com/",
+ "https://www.github.com/"
+ ),
+ createPerson(
+ "First Name",
+ "Last Name",
+ roles.director,
+ "https://www.linkedin.com/",
+ "https://www.google.com/",
+ "https://www.github.com/"
+ ),
+ createPerson(
+ "First Name",
+ "Last Name",
+ roles.media,
+ "https://www.linkedin.com/",
+ "https://www.google.com/",
+ "https://www.github.com/"
+ ),
+ createPerson(
+ "First Name",
+ "Last Name",
+ roles.experience,
+ "https://www.linkedin.com/",
+ "https://www.google.com/",
+ "https://www.github.com/"
+ ),
+ createPerson(
+ "First Name",
+ "Last Name",
+ roles.logistics,
+ "https://www.linkedin.com/",
+ "https://www.google.com/",
+ "https://www.github.com/"
+ ),
+ createPerson(
+ "First Name",
+ "Last Name",
+ roles.tech,
+ "https://www.linkedin.com/",
+ "https://www.google.com/",
+ "https://www.github.com/"
+ ),
+ createPerson(
+ "First Name",
+ "Last Name",
+ roles.pr,
+ "https://www.linkedin.com/",
+ "https://www.google.com/",
+ "https://www.github.com/"
+ ),
+];
+
+function CarouselDefault() {
+ const [data_rendered, setData_rendered] = useState(false);
+ const plugin = React.useRef(
+ Autoplay({ delay: 2500, stopOnInteraction: true })
+ );
+ useEffect(() => {
+ // Basic use effect hook to check if the page has rendered
+ setData_rendered(true);
+ }, []);
+
+
+ return (
+
+ <>
+ {data_rendered ? (
+
+
+ {team.map((p: Person, index: React.Key) => (
+
+
+
+ ))}
+
+ {/* NOTE: Source image of carousel previous and next are modified with color prop */}
+
+
+
+ ) : (
+
+
Loading...
+
+ )}
+ >
+ );
+}
+
+function MobileTeam() {
+ const [data_rendered, setData_rendered] = useState(false);
+
+ useEffect(() => {
+ // Basic use effect hook to check if the page has rendered
+ setData_rendered(true);
+ }, []);
+
+ return (
+ <>
+ {data_rendered ? (
+
+
+ {team.map((p: Person, index: React.Key) => (
+
+ ))}
+
+ {/* Change directiom */}
+
+
+ More Organizers
+
+
+
+
+ ) : (
+ Loading...
+ )}
+ >
+ );
+}
+
+export default function Team() {
+ return (
+
+
+
+ Demo Responsive Team Section
+
+
+ {`Meet The Team That Made ${c.hackathonName} Possible!`}
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/web/src/components/landing/TeamMember.tsx b/apps/web/src/components/landing/TeamMember.tsx
new file mode 100644
index 00000000..9d8488a4
--- /dev/null
+++ b/apps/web/src/components/landing/TeamMember.tsx
@@ -0,0 +1,126 @@
+"use client"
+
+import { Person } from "./Person";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardFooter,
+ CardHeader,
+ CardTitle,
+} from "../shadcn/ui/card"
+import { Oswald } from "next/font/google";
+import Image from "next/image";
+import { useState } from "react";
+const oswald = Oswald({
+ variable: "--font-oswald",
+ subsets: ["latin"],
+});
+
+
+// Using the raw svg tag is inefficient. Will need to change later
+function LinkedIn({ fillColor }: {fillColor:string}) {
+ return (
+
+
+
+ );
+}
+
+
+function Website({fillColor}:{fillColor:string}) {
+ return (
+
+
+
+ )
+}
+
+
+function Github({ fillColor }:{fillColor:string}) {
+ return (
+
+
+
+ )
+}
+
+
+export default function TeamMember({person}:{person:Person}) {
+ // Edit the max width and height and then set the height to auto in the styling
+
+ const [src,setSrc] = useState(person.imgLink);
+ const [styling, setStyling] = useState(
+ "max-w-[110px] md:max-w-[140px] lg:max-w-[160px] 2xl:max-w-[200px] h-auto rounded-lg"
+ );
+
+ const FallBackStyling = "max-w-[105px] md:max-w-[132px] lg:max-w-[150px] xl:max-w-[151px] 2xl:max-w-[188px] rounded-lg";
+
+
+ return (
+
+
+
+
+ {`${person.fname}\u00A0${person.lname}`}
+
+
+ {person.role}
+
+
+
+ {/* This also needs to be fixed */}
+ {
+ setSrc("/img/logo/hackkit.svg");
+ setStyling(FallBackStyling);
+ }}
+ />
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/apps/web/src/components/landing/WorkWithUs.tsx b/apps/web/src/components/landing/WorkWithUs.tsx
new file mode 100644
index 00000000..da93db66
--- /dev/null
+++ b/apps/web/src/components/landing/WorkWithUs.tsx
@@ -0,0 +1,15 @@
+
+
+export default function WorkWithUs() {
+ return (
+
+
+ Work With Us Section
+
+
+ Incentivize companies to monetarily support and other students to
+ volunteer to help out!{" "}
+
+
+ );
+}
diff --git a/apps/web/src/components/landing/partners.json b/apps/web/src/components/landing/partners.json
new file mode 100644
index 00000000..f76186c7
--- /dev/null
+++ b/apps/web/src/components/landing/partners.json
@@ -0,0 +1,143 @@
+
+{
+ "partners": [
+ {
+ "name": "Cymanii",
+ "logo": "CyManII_Logo.svg",
+ "url": "https://cymanii.org/",
+ "tier":"Gold Sponsor"
+ },
+ {
+ "name":"UTSA DS Dept.",
+ "logo":"UTSADS.svg",
+ "url":"https://sds.utsa.edu/",
+ "tier":"Gold Sponsor"
+ },
+ {
+ "name":"Swivel",
+ "logo":"swivel_logo.svg",
+ "url":"https://www.getswivel.io/",
+ "tier":"Silver Sponsor"
+ },
+ {
+ "name":"UTSA CS Dept.",
+ "logo":"UTSA_CS.svg",
+ "url":"https://sciences.utsa.edu/computer-science/",
+ "tier":"Silver Sponsor"
+ },
+ {
+ "name":"Frost Bank",
+ "logo":"FrostBank.svg",
+ "url":"https://www.frostbank.com/",
+ "tier":"Silver Sponsor"
+ },
+ {
+ "name":"Valero",
+ "logo":"ValeroLogo.svg",
+ "url":"https://www.valero.com/",
+ "tier":"Silver Sponsor"
+ },
+ {
+ "name":"Google",
+ "logo":"Google_Icon.svg",
+ "url":"https://about.google/",
+ "tier":"Bronze Sponsor"
+ },
+ {
+ "name":"Paycom",
+ "logo":"PaycomLogo.svg",
+ "url":"https://www.paycom.com/",
+ "tier":"Bronze Sponsor"
+ },
+ {
+ "name":"Dell",
+ "logo":"Dell_Tech_Logo.svg",
+ "url":"https://www.dell.com/",
+ "tier":"Bronze Sponsor"
+ },
+ {
+ "name":"S + S",
+ "logo":"Students_and_Startups.svg",
+ "url":"https://studentsstartups.com/",
+ "tier":"Bronze Sponsor"
+ },
+ {
+ "name":"AFCS",
+ "logo":"AFCSLogo.svg",
+ "url":"https://afciviliancareers.com/",
+ "tier":"Bronze Sponsor"
+ },
+ {
+ "name":"Accenture",
+ "logo":"Accenture-logo.svg",
+ "url":"https://www.accenture.com/",
+ "tier":"Rowdy Partner"
+ },
+ {
+ "name":"UTSA COE",
+ "logo":"UTSA_COE.svg",
+ "url":"https://klesse.utsa.edu/",
+ "tier":"Rowdy Partner"
+ },
+ {
+ "name":"UTSA Tech Store",
+ "logo":"rowdy_tech_logo.svg",
+ "url":"https://campustechnologystore.com/campustechnologystore/",
+ "tier":"Rowdy Partner"
+ },
+ {
+ "name":"TD Synnex",
+ "logo":"TD_Synnex_logo.svg",
+ "url":"https://www.tdsynnex.com/",
+ "tier":"Rowdy Partner"
+ },
+ {
+ "name":"Wolfram Alpha",
+ "logo":"wolfram_logo.svg",
+ "url":"https://www.wolframalpha.com/",
+ "tier":"Rowdy Partner"
+ },
+ {
+ "name":"CodePath",
+ "logo":"Codepath_logo.svg",
+ "url":"https://www.codepath.org/",
+ "tier":"Rowdy Partner"
+ },
+ {
+ "name":"ACM",
+ "logo":"ACM_logo.svg",
+ "url":"https://www.acm.org/",
+ "tier":"Rowdy Partner"
+ },
+ {
+ "name":"Artea",
+ "logo":"Artea_logo.svg",
+ "url":"https://www.drinkartea.com/",
+ "tier":"Rowdy In-Kind"
+ },
+ {
+ "name":"Pho Thien An",
+ "logo":"Pho_logo.svg",
+ "url":"https://www.phothienan.com/",
+ "tier":"Rowdy In-Kind"
+ },
+ {
+ "name":"Bunz Burgers",
+ "logo":"Bunz_logo.svg",
+ "url":"https://www.tastybunz.com/",
+ "tier":"Rowdy In-Kind"
+ },
+ {
+ "name":"H-E-B",
+ "logo":"HEB.svg",
+ "url":"https://www.heb.com/",
+ "tier":"Rowdy In-Kind"
+ },
+ {
+ "name":"Six Flags",
+ "logo":"Six_Flags_logo.svg",
+ "url":"https://www.sixflags.com/fiestatexas",
+ "tier":"Rowdy In-Kind"
+ }
+ ]
+}
diff --git a/apps/web/src/components/settings/AccountSettings.tsx b/apps/web/src/components/settings/AccountSettings.tsx
index b38df915..5e8ff13f 100644
--- a/apps/web/src/components/settings/AccountSettings.tsx
+++ b/apps/web/src/components/settings/AccountSettings.tsx
@@ -3,24 +3,76 @@
import { Input } from "@/components/shadcn/ui/input";
import { Button } from "@/components/shadcn/ui/button";
import { Label } from "@/components/shadcn/ui/label";
+import { toast } from "sonner";
+import { useState } from "react";
+import { users } from "db/schema";
+import { z } from "zod";
+import { useAction } from "next-safe-action/hook";
+import { modifyAccountSettings } from "@/actions/user-profile-mod";
-export default function AccountSettings() {
- return (
-
-
-
Personal Information
-
-
- First Name
-
-
-
- Last Name
-
-
-
Update
-
-
-
- );
+interface UserProps {
+ firstName: string;
+ lastName: string;
+}
+interface AccountSettingsProps {
+ user: UserProps;
+}
+
+export default function AccountSettings({ user }: AccountSettingsProps) {
+ const [newFirstName, setNewFirstName] = useState(user.firstName);
+ const [newLastName, setNewLastName] = useState(user.lastName);
+
+ const { execute: runModifyAccountSettings } = useAction(
+ modifyAccountSettings,
+ {
+ onSuccess: () => {
+ toast.dismiss();
+ toast.success("Name updated successfully!");
+ },
+ onError: () => {
+ toast.dismiss();
+ toast.error("An error occurred while updating your name!");
+ },
+ }
+ );
+
+ return (
+
+
+
Personal Information
+
+
+ First Name
+ setNewFirstName(e.target.value)}
+ />
+
+
+ Last Name
+ setNewLastName(e.target.value)}
+ />
+
+
{
+ toast.loading("Updating name...");
+ runModifyAccountSettings({
+ firstName: newFirstName,
+ lastName: newLastName,
+ });
+ }}
+ >
+ Update
+
+
+
+
+ );
}
diff --git a/apps/web/src/components/settings/ProfileSettings.tsx b/apps/web/src/components/settings/ProfileSettings.tsx
index dea56a72..f6b5ceee 100644
--- a/apps/web/src/components/settings/ProfileSettings.tsx
+++ b/apps/web/src/components/settings/ProfileSettings.tsx
@@ -4,7 +4,10 @@ import { Input } from "@/components/shadcn/ui/input";
import { Button } from "@/components/shadcn/ui/button";
import { Label } from "@/components/shadcn/ui/label";
import { Textarea } from "@/components/shadcn/ui/textarea";
-import { modifyUserBioAndSkills, updateProfileImage } from "@/actions/user-profile-mod";
+import {
+ modifyRegistrationData,
+ updateProfileImage,
+} from "@/actions/user-profile-mod";
import { useUser } from "@clerk/nextjs";
import { useAction } from "next-safe-action/hook";
import { toast } from "sonner";
@@ -12,101 +15,124 @@ import { useState } from "react";
import { encodeFileAsBase64 } from "@/lib/utils/shared/files";
interface ProfileSettingsProps {
- bio: string;
+ bio: string;
+ university: string;
}
-export default function ProfileSettings({ bio }: ProfileSettingsProps) {
- const [newBio, setNewBio] = useState(bio);
- const [newProfileImage, setNewProfileImage] = useState(null);
- const { user } = useUser();
+export default function ProfileSettings({
+ bio,
+ university,
+}: ProfileSettingsProps) {
+ const [newBio, setNewBio] = useState(bio);
+ const [newUniversity, setNewUniversity] = useState(university);
+ const [newProfileImage, setNewProfileImage] = useState(null);
+ const { user } = useUser();
- const { execute: runUpdateBioAndSkills } = useAction(modifyUserBioAndSkills, {
- onSuccess: () => {
- toast.dismiss();
- toast.success("Profile updated successfully!");
- },
- onError: () => {
- toast.dismiss();
- toast.error("An error occurred while updating your profile!");
- },
- });
+ const { execute: runModifyRegistrationData } = useAction(
+ modifyRegistrationData,
+ {
+ onSuccess: () => {
+ toast.dismiss();
+ toast.success("Profile updated successfully!");
+ },
+ onError: () => {
+ toast.dismiss();
+ toast.error("An error occurred while updating your profile!");
+ },
+ }
+ );
- const { execute: runUpdateProfileImage } = useAction(updateProfileImage, {
- onSuccess: async () => {
- toast.dismiss();
- await user?.setProfileImage({ file: newProfileImage });
- toast.success("Profile Photo updated successfully!");
- },
- onError: (err) => {
- toast.dismiss();
- toast.error("An error occurred while updating your profile photo!");
- console.error(err);
- },
- });
+ const { execute: runUpdateProfileImage } = useAction(updateProfileImage, {
+ onSuccess: async () => {
+ toast.dismiss();
+ await user?.setProfileImage({ file: newProfileImage });
+ toast.success("Profile Photo updated successfully!");
+ },
+ onError: (err) => {
+ toast.dismiss();
+ toast.error("An error occurred while updating your profile photo!");
+ console.error(err);
+ },
+ });
- const handleFileChange = (event: React.ChangeEvent) => {
- const file = event.target.files ? event.target.files[0] : null;
- setNewProfileImage(file);
- };
+ const handleFileChange = (event: React.ChangeEvent) => {
+ const file = event.target.files ? event.target.files[0] : null;
+ setNewProfileImage(file);
+ };
- return (
-
-
-
Profile Photo
-
-
- Profile Photo
-
-
-
{
- console.log("Button clicked");
- if (!newProfileImage) {
- return toast.error("Please select a Profile Photo to upload!");
- }
- toast.loading("Updating Profile Photo...", { duration: 0 });
- const b64 = await encodeFileAsBase64(newProfileImage);
- runUpdateProfileImage({ fileBase64: b64, fileName: newProfileImage.name });
- }}
- className="mt-5"
- >
- Update
-
-
-
-
-
Profile Data
-
-
- Bio
-
-
- Skills
-
-
-
{
- toast.loading("Updating Profile...", { duration: 0 });
- runUpdateBioAndSkills({ bio: newBio, skills: "" });
- }}
- className="mt-5"
- >
- Update
-
-
-
-
- );
+ return (
+
+
+
Profile Photo
+
+
+ Profile Photo
+
+
+
{
+ console.log("Button clicked");
+ if (!newProfileImage) {
+ return toast.error("Please select a Profile Photo to upload!");
+ }
+ toast.loading("Updating Profile Photo...", { duration: 0 });
+ const b64 = await encodeFileAsBase64(newProfileImage);
+ runUpdateProfileImage({
+ fileBase64: b64,
+ fileName: newProfileImage.name,
+ });
+ }}
+ className="mt-5"
+ >
+ Update
+
+
+
+
+
Profile Data
+
+ {/*
+ University
+ setNewUniversity(e.target.value)}
+ />
+
*/}
+
+ Bio
+
+
+ Skills
+
+
+
{
+ toast.loading("Updating Profile...", { duration: 0 });
+ runModifyRegistrationData({
+ bio: newBio,
+ skills: "",
+ });
+ }}
+ className="mt-5"
+ >
+ Update
+
+
+
+
+ );
}
diff --git a/apps/web/src/components/shadcn/ui/accordion.tsx b/apps/web/src/components/shadcn/ui/accordion.tsx
new file mode 100644
index 00000000..6c7b6eba
--- /dev/null
+++ b/apps/web/src/components/shadcn/ui/accordion.tsx
@@ -0,0 +1,58 @@
+"use client"
+
+import * as React from "react"
+import * as AccordionPrimitive from "@radix-ui/react-accordion"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils/client/cn"
+
+const Accordion = AccordionPrimitive.Root
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AccordionItem.displayName = "AccordionItem"
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+))
+
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/apps/web/src/components/shadcn/ui/carousel.tsx b/apps/web/src/components/shadcn/ui/carousel.tsx
new file mode 100644
index 00000000..ac37f655
--- /dev/null
+++ b/apps/web/src/components/shadcn/ui/carousel.tsx
@@ -0,0 +1,266 @@
+"use client"
+
+import * as React from "react"
+import useEmblaCarousel, {
+ type UseEmblaCarouselType,
+} from "embla-carousel-react"
+import { ArrowLeft, ArrowRight } from "lucide-react"
+
+import { cn } from "@/lib/utils/client/cn"
+import { Button } from "@/components/shadcn/ui/button"
+
+type CarouselApi = UseEmblaCarouselType[1]
+type UseCarouselParameters = Parameters
+type CarouselOptions = UseCarouselParameters[0]
+type CarouselPlugin = UseCarouselParameters[1]
+
+type CarouselProps = {
+ opts?: CarouselOptions
+ plugins?: CarouselPlugin
+ orientation?: "horizontal" | "vertical"
+ setApi?: (api: CarouselApi) => void
+}
+
+type CarouselContextProps = {
+ carouselRef: ReturnType[0]
+ api: ReturnType[1]
+ scrollPrev: () => void
+ scrollNext: () => void
+ canScrollPrev: boolean
+ canScrollNext: boolean
+} & CarouselProps
+
+const CarouselContext = React.createContext(null)
+
+function useCarousel() {
+ const context = React.useContext(CarouselContext)
+
+ if (!context) {
+ throw new Error("useCarousel must be used within a ")
+ }
+
+ return context
+}
+
+const Carousel = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes & CarouselProps
+>(
+ (
+ {
+ orientation = "horizontal",
+ opts,
+ setApi,
+ plugins,
+ className,
+ children,
+ ...props
+ },
+ ref
+ ) => {
+ const [carouselRef, api] = useEmblaCarousel(
+ {
+ ...opts,
+ axis: orientation === "horizontal" ? "x" : "y",
+ },
+ plugins
+ )
+ const [canScrollPrev, setCanScrollPrev] = React.useState(false)
+ const [canScrollNext, setCanScrollNext] = React.useState(false)
+
+ const onSelect = React.useCallback((api: CarouselApi) => {
+ if (!api) {
+ return
+ }
+
+ setCanScrollPrev(api.canScrollPrev())
+ setCanScrollNext(api.canScrollNext())
+ }, [])
+
+ const scrollPrev = React.useCallback(() => {
+ api?.scrollPrev()
+ }, [api])
+
+ const scrollNext = React.useCallback(() => {
+ api?.scrollNext()
+ }, [api])
+
+ const handleKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (event.key === "ArrowLeft") {
+ event.preventDefault()
+ scrollPrev()
+ } else if (event.key === "ArrowRight") {
+ event.preventDefault()
+ scrollNext()
+ }
+ },
+ [scrollPrev, scrollNext]
+ )
+
+ React.useEffect(() => {
+ if (!api || !setApi) {
+ return
+ }
+
+ setApi(api)
+ }, [api, setApi])
+
+ React.useEffect(() => {
+ if (!api) {
+ return
+ }
+
+ onSelect(api)
+ api.on("reInit", onSelect)
+ api.on("select", onSelect)
+
+ return () => {
+ api?.off("select", onSelect)
+ }
+ }, [api, onSelect])
+
+ return (
+
+
+ {children}
+
+
+ )
+ }
+)
+Carousel.displayName = "Carousel"
+
+const CarouselContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { carouselRef, orientation } = useCarousel()
+
+ return (
+
+ )
+})
+CarouselContent.displayName = "CarouselContent"
+
+const CarouselItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { orientation } = useCarousel()
+
+ return (
+
+ )
+})
+CarouselItem.displayName = "CarouselItem"
+
+const CarouselPrevious = React.forwardRef<
+ HTMLButtonElement,
+ React.ComponentProps
+>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel()
+ // NOTE: Modified source code to make arrows white
+ return (
+
+
+ Previous slide
+
+ );
+})
+CarouselPrevious.displayName = "CarouselPrevious"
+
+const CarouselNext = React.forwardRef<
+ HTMLButtonElement,
+ React.ComponentProps
+>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
+ const { orientation, scrollNext, canScrollNext } = useCarousel()
+
+ return (
+
+
+ Next slide
+
+ );
+})
+CarouselNext.displayName = "CarouselNext"
+
+export {
+ type CarouselApi,
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselPrevious,
+ CarouselNext,
+}
diff --git a/apps/web/src/components/shadcn/ui/pagination.tsx b/apps/web/src/components/shadcn/ui/pagination.tsx
new file mode 100644
index 00000000..fbcf2a2a
--- /dev/null
+++ b/apps/web/src/components/shadcn/ui/pagination.tsx
@@ -0,0 +1,117 @@
+import * as React from "react"
+import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react"
+import Link from "next/link";
+import { cn } from "@/lib/utils/client/cn"
+import { ButtonProps, buttonVariants } from "@/components/shadcn/ui/button"
+
+const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (
+
+)
+Pagination.displayName = "Pagination"
+
+const PaginationContent = React.forwardRef<
+ HTMLUListElement,
+ React.ComponentProps<"ul">
+>(({ className, ...props }, ref) => (
+
+))
+PaginationContent.displayName = "PaginationContent"
+
+const PaginationItem = React.forwardRef<
+ HTMLLIElement,
+ React.ComponentProps<"li">
+>(({ className, ...props }, ref) => (
+
+))
+PaginationItem.displayName = "PaginationItem"
+
+type PaginationLinkProps = {
+ isActive?: boolean
+} & Pick &
+ React.ComponentProps
+
+const PaginationLink = ({
+ className,
+ isActive,
+ size = "icon",
+ ...props
+}: PaginationLinkProps) => (
+
+)
+PaginationLink.displayName = "PaginationLink"
+
+const PaginationPrevious = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+
+ Previous
+
+)
+PaginationPrevious.displayName = "PaginationPrevious"
+
+const PaginationNext = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+ Next
+
+
+)
+PaginationNext.displayName = "PaginationNext"
+
+const PaginationEllipsis = ({
+ className,
+ ...props
+}: React.ComponentProps<"span">) => (
+
+
+ More pages
+
+)
+PaginationEllipsis.displayName = "PaginationEllipsis"
+
+export {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+}
diff --git a/apps/web/src/components/shared/Loading.tsx b/apps/web/src/components/shared/Loading.tsx
index ff3658c7..5fec4690 100644
--- a/apps/web/src/components/shared/Loading.tsx
+++ b/apps/web/src/components/shared/Loading.tsx
@@ -2,7 +2,7 @@ import { cn } from "@/lib/utils/client/cn";
import { Loader2 } from "lucide-react";
interface LoadingProps {
- className?: string;
+ className?: string;
}
export default function Loading({ className }: LoadingProps) {
diff --git a/apps/web/src/components/shared/MobileNavBarLinks.tsx b/apps/web/src/components/shared/MobileNavBarLinks.tsx
new file mode 100644
index 00000000..b8880716
--- /dev/null
+++ b/apps/web/src/components/shared/MobileNavBarLinks.tsx
@@ -0,0 +1,28 @@
+import { getAllNavItems } from "@/lib/utils/server/redis";
+import {
+ DropdownMenuItem,
+ DropdownMenuSeparator,
+} from "@/components/shadcn/ui/dropdown-menu";
+import Link from "next/link";
+export default async function MobileNavBarLinks() {
+ const navLinks = await getAllNavItems();
+
+ return (
+
+ {navLinks.items.map((nav, key) => {
+ return (
+
+ {nav.enabled ? (
+
+ {nav.name}
+
+ ) : null}
+
+ );
+ })}
+
+ );
+}
+
+export const runtime = "edge";
+export const revalidate = 30;
diff --git a/apps/web/src/components/shared/Navbar.tsx b/apps/web/src/components/shared/Navbar.tsx
index 1eb6944b..7b69d569 100644
--- a/apps/web/src/components/shared/Navbar.tsx
+++ b/apps/web/src/components/shared/Navbar.tsx
@@ -2,55 +2,89 @@ import Link from "next/link";
import Image from "next/image";
import c from "config";
import { Button } from "../shadcn/ui/button";
-import ProfileButton from "../dash/shared/ProfileButton";
+import ProfileButton from "./ProfileButton";
import { auth, currentUser } from "@clerk/nextjs";
import NavBarLinksGrouper from "./NavBarLinksGrouper";
+import { Oswald } from "next/font/google";
+import { cn } from "@/lib/utils/client/cn";
-export default async function Navbar() {
- const user = await currentUser();
- return (
-
-
-
-
-
- {/*
*/}
-
{c.hackathonName}
-
+const oswald = Oswald({
+ variable: "--font-oswald",
+ subsets: ["latin"],
+});
-
-
-
- {user ? (
- <>
-
-
- {user.publicMetadata.registrationComplete ? "Dashboard" : "Complete Registration"}
-
-
-
- >
- ) : (
- <>
-
-
- Sign In
-
-
-
-
Register
-
- >
- )}
-
-
-
- );
+interface NavbarProps {
+ className?: string;
+}
+
+export default async function Navbar({ className }: NavbarProps) {
+ const user = await currentUser();
+ return (
+
+
+
+
+
+
+ {/*
*/}
+
+ {c.hackathonName}
+
+
+
+
+
+
+
+
+
+ {user ? (
+ <>
+
+
+ {user.publicMetadata.registrationComplete
+ ? "Dashboard"
+ : "Complete Registration"}
+
+
+ >
+ ) : (
+ <>
+
+
+ Sign In
+
+
+
+ Register
+
+ >
+ )}
+
+
+
+
+
+
+ );
}
export const runtime = "edge";
diff --git a/apps/web/src/components/shared/ProfileButton.tsx b/apps/web/src/components/shared/ProfileButton.tsx
new file mode 100644
index 00000000..2e33e95a
--- /dev/null
+++ b/apps/web/src/components/shared/ProfileButton.tsx
@@ -0,0 +1,185 @@
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuTrigger,
+} from "@/components/shadcn/ui/dropdown-menu";
+import {
+ Avatar,
+ AvatarFallback,
+ AvatarImage,
+} from "@/components/shadcn/ui/avatar";
+import { Button } from "@/components/shadcn/ui/button";
+import { auth, SignOutButton } from "@clerk/nextjs";
+import { db } from "db";
+import { users } from "db/schema";
+import { eq } from "db/drizzle";
+import Link from "next/link";
+import { DropdownSwitcher } from "@/components/shared/ThemeSwitcher";
+import DefaultDropdownTrigger from "../dash/shared/DefaultDropDownTrigger";
+import MobileNavBarLinks from "./MobileNavBarLinks";
+
+export default async function ProfileButton() {
+ const clerkUser = await auth();
+ const { userId } = clerkUser;
+
+ // This is our default component if there is no user data
+ if (!userId) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ Sign In
+
+
+
+
+ Register
+
+
+
+
+
+
+
+ Report a Bug
+
+
+
+
+
+ );
+ }
+
+ // Make request with the clerk data that we may or may not have
+ const user = await db.query.users.findFirst({
+ where: eq(users.clerkID, userId),
+ with: { profileData: true },
+ });
+
+ // If we do not have a fully fledged user, encourage them to complete registration
+ if (!user) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ Complete Registration
+
+
+
+
+
+ Report a Bug
+
+
+
+
+
+
+
+ Log out
+
+
+
+
+ );
+ }
+
+ // Returns only if there is a full user
+ return (
+
+
+
+
+
+
+ {user.firstName.charAt(0) + user.lastName.charAt(0)}
+
+
+
+
+
+
+
+
{`${user.firstName} ${user.lastName}`}
+
+ @{user.hackerTag}
+
+
+
+
+
+
+
+ Profile
+
+
+
+
+ Event Pass
+
+
+ {user.role === "admin" || user.role === "super_admin" && (
+
+
+ Admin
+
+
+ )}
+
+
+
+
+ Report a Bug
+
+
+
+
+ Settings
+
+
+
+
+
+
+
+ Log out
+
+
+
+
+ );
+}
+
+export const runtime = "edge";
diff --git a/apps/web/src/components/shared/ThemeSwitcher.tsx b/apps/web/src/components/shared/ThemeSwitcher.tsx
index 9819fde1..11ff64ce 100644
--- a/apps/web/src/components/shared/ThemeSwitcher.tsx
+++ b/apps/web/src/components/shared/ThemeSwitcher.tsx
@@ -1,5 +1,4 @@
"use client";
-// import { BsFillMoonFill, BsFillSunFill } from "react-icons/bs";
import { DropdownMenuItem } from "@/components/shadcn/ui/dropdown-menu";
function toggleTheme() {
@@ -7,22 +6,6 @@ function toggleTheme() {
setCookie("hk_theme", [...document.body.classList].includes("dark") ? "dark" : "light", 365);
}
-// function getCookie(cname: string) {
-// let name = cname + "=";
-// let decodedCookie = decodeURIComponent(document.cookie);
-// let ca = decodedCookie.split(";");
-// for (let i = 0; i < ca.length; i++) {
-// let c = ca[i];
-// while (c.charAt(0) == " ") {
-// c = c.substring(1);
-// }
-// if (c.indexOf(name) == 0) {
-// return c.substring(name.length, c.length);
-// }
-// }
-// return "";
-// }
-
function setCookie(cname: string, cvalue: string, exdays: number) {
const d = new Date();
d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
diff --git a/apps/web/src/lib/utils/shared/pageParams.ts b/apps/web/src/lib/utils/shared/pageParams.ts
new file mode 100644
index 00000000..3670f8bf
--- /dev/null
+++ b/apps/web/src/lib/utils/shared/pageParams.ts
@@ -0,0 +1,18 @@
+type SearchParams = {
+ [key:string]: string | undefined | string[]
+}
+
+
+export function createPath(path:string,params:SearchParams){
+
+
+ const pathCreated = `${path}?${params}`;
+
+}
+
+export function parseCheckBoxParams(params:string){
+ if (!params || params.length < 1)return "";
+
+ return params.split('&');
+}
+
diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts
index 7ca05710..83f47ac4 100644
--- a/apps/web/src/middleware.ts
+++ b/apps/web/src/middleware.ts
@@ -4,7 +4,7 @@ import { publicRoutes } from "config";
export default authMiddleware({
publicRoutes,
- afterAuth: (auth, req, evt) => {
+ beforeAuth: (req) => {
if (req.nextUrl.pathname.startsWith("/@")) {
return NextResponse.rewrite(
new URL(`/user/${req.nextUrl.pathname.replace("/@", "")}`, req.url)
diff --git a/apps/web/src/validators/shared/RegisterForm.ts b/apps/web/src/validators/shared/RegisterForm.ts
index 3c860036..2c894a4a 100644
--- a/apps/web/src/validators/shared/RegisterForm.ts
+++ b/apps/web/src/validators/shared/RegisterForm.ts
@@ -2,15 +2,15 @@ import { z } from "zod";
import c from "config";
const defaultPrettyError = {
- errorMap: () => ({ message: "Please select a value" }),
+ errorMap: () => ({ message: "Please select a value" }),
};
export const RegisterFormValidator = z.object({
- firstName: z
- .string()
- .min(1, { message: "Firstname must be at least one character" })
- .max(50, { message: "Firstname must be less than 50 characters" }),
- lastName: z
+ firstName: z
+ .string()
+ .min(1, { message: "Firstname must be at least one character" })
+ .max(50, { message: "Firstname must be less than 50 characters" }),
+ lastName: z
.string()
.min(1, { message: "Lastname must be at least 1 character" })
diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js
index f3c6832c..c9f1d113 100644
--- a/apps/web/tailwind.config.js
+++ b/apps/web/tailwind.config.js
@@ -1,6 +1,7 @@
/** @type {import('tailwindcss').Config} */
const plugin = require("tailwindcss/plugin");
+
module.exports = {
darkMode: ["class"],
content: [
@@ -10,6 +11,7 @@ module.exports = {
"./src/**/*.{ts,tsx}",
],
theme: {
+
container: {
center: true,
padding: "2rem",
@@ -31,7 +33,7 @@ module.exports = {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
- nav: "rgb(var(--nav))",
+ nav: "hsl(var(--nav))",
hackathon: "hsl(var(--hackathon-primary))",
secondary: {
DEFAULT: "hsl(var(--secondary))",
@@ -77,6 +79,9 @@ module.exports = {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
},
+ fontFamily: {
+ oswald: ["var(--font-oswald)"],
+ },
},
},
plugins: [
diff --git a/bot.nixpacks.toml b/bot.nixpacks.toml
index 39d62521..5693b1ae 100644
--- a/bot.nixpacks.toml
+++ b/bot.nixpacks.toml
@@ -2,6 +2,10 @@
nixpkgsArchive = 'e99651a836b162b48fbf4195e0c8d3028b6b32a8'
nixPkgs = ['...', 'bun']
+[phases.install]
+cmds = ["npm install -g corepack@0.24.1 && corepack enable"]
+dependsOn = ["setup"]
+
[phases.build]
cmds = ['pnpm install --filter db', 'pnpm install --filter config', 'pnpm install --filter bot']
diff --git a/contributions.md b/contributions.md
new file mode 100644
index 00000000..c140ff0a
--- /dev/null
+++ b/contributions.md
@@ -0,0 +1,11 @@
+# 📣❤️ Contributions ❤️📣
+**Thanks to the following awesome people for supporting the development of the project in various ways! Without y'all it would not have been possible!**
+
+* [Vercel](https://vercel.com/)
+* RowdyHacks Tech Team
+* RowdyHacks Design Team
+* UTSA Hackkit Team
+* [Google Fonts](https://fonts.google.com/)
+* [Shadcn](https://ui.shadcn.com/)
+
+
diff --git a/packages/config/hackkit.config.ts b/packages/config/hackkit.config.ts
index 34bc13de..0e1ecb4b 100644
--- a/packages/config/hackkit.config.ts
+++ b/packages/config/hackkit.config.ts
@@ -1,13 +1,14 @@
export const defaultTheme = "dark";
export default {
- hackathonName: "HackKit",
- itteration: "2023",
- siteUrl: "https://hack-kit-web.vercel.app", // Do not have a trailing slash
+ hackathonName: "Hackkit",
+ itteration: "Your Iteration",
+ siteUrl: "https://rowdyhacks.org", // Do not have a trailing slash
+ defaultMetaDataDescription:
+ "RowdyHacks is a free, weekend-long, overnight hackathon hosted at UTSA! Students can join us to network, code, collaborate, and compete. We welcome hackers from all disciplines, backgrounds, & technical levels!",
botName: "HackKit",
- botParticipantRole: "HackKit User",
+ botParticipantRole: "RH24 Participant",
hackathonTimezone: "America/Chicago",
- defaultMetaDataDescription: "Powerful and easy to use hackathon managment platform.",
localUniversityName: "The University of Texas at San Antonio",
localUniversityShortIDName: "ABC123",
localUniversityShortIDMaxLength: 6,
@@ -22,22 +23,48 @@ export default {
"Halal",
],
groups: {
- "Group A": {
- discordRole: "Group A",
+ "Guild A | Group A": {
+ discordRole: "Guild A Role",
},
- "Group B": {
- discordRole: "Group B",
+ "Guild A | Group B": {
+ discordRole: "Guild A Role",
},
- "Group C": {
- discordRole: "Group C",
+ "Guild B | Group A": {
+ discordRole: "Guild B Role",
+ },
+ "Guild B | Group B": {
+ discordRole: "Guild B Role",
+ },
+ "Guild C | Group A": {
+ discordRole: "Guild C Role ",
+ },
+ "Guild C | Group B": {
+ discordRole: "Guild C Role",
+ },
+ "Guild D | Group A": {
+ discordRole: "Guild D Role",
+ },
+ "Guild D | Group B": {
+ discordRole: "Guild D Role",
+ },
+ "Guild E | Group A": {
+ discordRole: "Guild E Role",
+ },
+ "Guild E | Group B": {
+ discordRole: "Guild E Role",
},
},
- issueEmail: "team@acmutsa.org",
+ issueEmail: "team@rowdyhacks.org",
links: {
- discord: "https://go.acmutsa.org/discord",
+ discord: "https://go.rowdyhacks.org/discord",
+ instagram: "https://instagram.com/rowdyhacks",
+ facebook: "https://facebook.com/rowdyhacks",
+ twitter: "https://twitter.com/rowdyhacks",
+ github: "https://github.com/acmutsa",
+ guide: "https://go.rowdyhacks.org/discord",
},
icon: {
- sm: "/img/logo/hackkit-sm.png",
+ sm: "/img/logo/hackkit.svg",
md: "/img/logo/hackkit-md.png",
lg: "/img/logo/hackkit-lg.png",
svg: "/img/logo/hackkit.svg",
@@ -45,9 +72,9 @@ export default {
dashPaths: {
dash: {
Overview: "/dash",
- "Event Pass": "/dash/pass",
Schedule: "/dash/schedule",
- Team: "/dash/team",
+ "Event Pass": "/dash/pass",
+ // Team: "/dash/team",
},
admin: {
Overview: "/admin",
@@ -57,6 +84,7 @@ export default {
"Check-in": "/admin/check-in",
Toggles: "/admin/toggles",
},
+ // TODO: Can remove days? Pretty sure they're dynamic now.
},
eventTypes: {
Meal: "#FFC107",
@@ -65,18 +93,18 @@ export default {
Social: "#2196F3",
Other: "#795548",
},
- // TODO: Can remove days? Pretty sure they're dynamic now.
days: {
Saturday: new Date(2023, 6, 15),
- Sunday: new Date(2023, 6, 16),
},
+ Sunday: new Date(2023, 6, 16),
maxResumeSizeInBytes: 4194304,
- maxFileSizeInBytes: 4194304,
maxProfilePhotoSizeInBytes: 3145728,
- noResumeProvidedURL: "https://static.acmutsa.org/No%20Resume%20Provided.pdf",
+ maxFileSizeInBytes: 4194304,
eventPassBgImage: "/img/dash/pass/bg.png",
+ noResumeProvidedURL: "https://static.acmutsa.org/No%20Resume%20Provided.pdf",
+ // Come in and change this date to whenever the hackathon starts
startDate: new Date(new Date(2024, 1, 24).setHours(9)),
- prettyLocation: "San Pedro I, UTSA",
+ prettyLocation: "Location of Hackathon",
roleBadges: {
hacker: {
title: "Hacker",
@@ -86,9 +114,9 @@ export default {
},
volunteer: {
title: "Volunteer",
- color: "#4CAF50",
foreground: "#ffffff",
checked: false,
+ color: "#4CAF50",
},
mentor: {
title: "Mentor",
@@ -110,8 +138,8 @@ export default {
},
super_admin: {
title: "Organizer",
- color: "#f59e0b",
foreground: "#ffffff",
+ color: "#f59e0b",
checked: true,
},
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a05bec17..ddb30722 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,7 +18,7 @@ importers:
version: 2.8.8
turbo:
specifier: latest
- version: 1.11.3
+ version: 1.13.3
apps/backup:
dependencies:
@@ -78,6 +78,9 @@ importers:
'@clerk/nextjs':
specifier: ^4.29.4
version: 4.29.4(next@14.0.4)(react-dom@18.2.0)(react@18.2.0)
+ '@gsap/react':
+ specifier: ^2.0.2
+ version: 2.0.2(react@18.2.0)
'@hookform/resolvers':
specifier: ^3.1.1
version: 3.1.1(react-hook-form@7.44.3)
@@ -87,6 +90,9 @@ importers:
'@planetscale/database':
specifier: ^1.8.0
version: 1.8.0
+ '@radix-ui/react-accordion':
+ specifier: ^1.1.2
+ version: 1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-avatar':
specifier: ^1.0.3
version: 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
@@ -132,6 +138,9 @@ importers:
'@types/react-dom':
specifier: 18.2.6
version: 18.2.6
+ '@vercel/analytics':
+ specifier: ^1.1.1
+ version: 1.1.1
'@vercel/blob':
specifier: ^0.10.0
version: 0.10.0
@@ -177,6 +186,21 @@ importers:
drizzle-zod:
specifier: ^0.5.1
version: 0.5.1(drizzle-orm@0.29.3)(zod@3.21.4)
+ embla-carousel:
+ specifier: 8.0.0-rc22
+ version: 8.0.0-rc22
+ embla-carousel-autoplay:
+ specifier: 8.0.0-rc22
+ version: 8.0.0-rc22(embla-carousel@8.0.0-rc22)
+ embla-carousel-react:
+ specifier: 8.0.0-rc20
+ version: 8.0.0-rc20(react@18.2.0)
+ framer-motion:
+ specifier: ^10.18.0
+ version: 10.18.0(react-dom@18.2.0)(react@18.2.0)
+ gsap:
+ specifier: ^3.12.4
+ version: 3.12.4
lucide-react:
specifier: ^0.317.0
version: 0.317.0(react@18.2.0)
@@ -204,6 +228,9 @@ importers:
react-aria:
specifier: ^3.26.0
version: 3.26.0(react-dom@18.2.0)(react@18.2.0)
+ react-bootstrap:
+ specifier: ^2.10.0
+ version: 2.10.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
react-confetti:
specifier: ^6.1.0
version: 6.1.0(react@18.2.0)
@@ -216,6 +243,9 @@ importers:
react-email:
specifier: ^1.10.0
version: 1.10.0
+ react-fast-marquee:
+ specifier: ^1.6.2
+ version: 1.6.2(react-dom@18.2.0)(react@18.2.0)
react-hook-form:
specifier: 7.44.3
version: 7.44.3(react@18.2.0)
@@ -261,6 +291,9 @@ importers:
typescript:
specifier: 5.1.6
version: 5.1.6
+ use-debounce:
+ specifier: ^10.0.1
+ version: 10.0.1(react@18.2.0)
usehooks-ts:
specifier: ^2.14.0
version: 2.14.0(react@18.2.0)
@@ -684,7 +717,7 @@ packages:
'@smithy/util-retry': 2.0.9
'@smithy/util-utf8': 2.0.2
fast-xml-parser: 4.2.5
- tslib: 2.5.0
+ tslib: 2.6.2
transitivePeerDependencies:
- aws-crt
dev: false
@@ -748,7 +781,7 @@ packages:
'@smithy/signature-v4': 2.0.19
'@smithy/smithy-client': 2.2.1
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/core@3.511.0:
@@ -850,7 +883,7 @@ packages:
'@smithy/property-provider': 2.0.17
'@smithy/shared-ini-file-loader': 2.2.8
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
transitivePeerDependencies:
- aws-crt
dev: false
@@ -996,7 +1029,7 @@ packages:
'@aws-sdk/types': 3.485.0
'@smithy/protocol-http': 3.0.12
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/middleware-host-header@3.511.0:
@@ -1024,7 +1057,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.485.0
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/middleware-logger@3.511.0:
@@ -1043,7 +1076,7 @@ packages:
'@aws-sdk/types': 3.485.0
'@smithy/protocol-http': 3.0.12
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/middleware-recursion-detection@3.511.0:
@@ -1081,7 +1114,7 @@ packages:
'@smithy/signature-v4': 2.0.19
'@smithy/types': 2.8.0
'@smithy/util-middleware': 2.0.9
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/middleware-signing@3.511.0:
@@ -1114,7 +1147,7 @@ packages:
'@aws-sdk/util-endpoints': 3.485.0
'@smithy/protocol-http': 3.0.12
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/middleware-user-agent@3.511.0:
@@ -1136,7 +1169,7 @@ packages:
'@smithy/types': 2.8.0
'@smithy/util-config-provider': 2.1.0
'@smithy/util-middleware': 2.0.9
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/region-config-resolver@3.511.0:
@@ -1228,7 +1261,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/types@3.511.0:
@@ -1252,7 +1285,7 @@ packages:
dependencies:
'@aws-sdk/types': 3.485.0
'@smithy/util-endpoints': 1.0.8
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/util-endpoints@3.511.0:
@@ -1278,7 +1311,7 @@ packages:
'@aws-sdk/types': 3.485.0
'@smithy/types': 2.8.0
bowser: 2.11.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/util-user-agent-browser@3.511.0:
@@ -1302,7 +1335,7 @@ packages:
'@aws-sdk/types': 3.485.0
'@smithy/node-config-provider': 2.1.9
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@aws-sdk/util-user-agent-node@3.511.0:
@@ -1574,12 +1607,26 @@ packages:
superjson: 2.2.1
dev: false
+ /@emotion/is-prop-valid@0.8.8:
+ resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
+ requiresBuild: true
+ dependencies:
+ '@emotion/memoize': 0.7.4
+ dev: false
+ optional: true
+
/@emotion/is-prop-valid@1.2.1:
resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==}
dependencies:
'@emotion/memoize': 0.8.1
dev: false
+ /@emotion/memoize@0.7.4:
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
/@emotion/memoize@0.8.1:
resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
dev: false
@@ -2251,6 +2298,14 @@ packages:
tslib: 2.6.2
dev: false
+ /@gsap/react@2.0.2(react@18.2.0):
+ resolution: {integrity: sha512-Uo2lOBlGcwmkIE9EcPdsyDfg+DRAoboVvuWgvVIrsJ2tIZHcpFab82YNV0iWj9CNfTzIqGP44ziXqsCMkc8OEw==}
+ peerDependencies:
+ react: '>=16'
+ dependencies:
+ react: 18.2.0
+ dev: false
+
/@hono/node-server@1.7.0:
resolution: {integrity: sha512-W+Gy16xWZMgB8hYU4XInCwE746y8V3VDTH1J3+EhUBqbCzk4zEXo1p6dv3BiCD5O6Z4aHuoCW+mRKoJgUn3ZCA==}
engines: {node: '>=18.14.1'}
@@ -2690,6 +2745,10 @@ packages:
engines: {node: '>=16'}
dev: false
+ /@popperjs/core@2.11.8:
+ resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
+ dev: false
+
/@radix-ui/number@1.0.1:
resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
dependencies:
@@ -2705,7 +2764,36 @@ packages:
/@radix-ui/primitive@1.0.1:
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
+ dev: false
+
+ /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.23.7
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-direction': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@types/react': 18.2.14
+ '@types/react-dom': 18.2.6
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0):
@@ -2781,6 +2869,34 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0
+ react-dom: ^16.8 || ^17.0 || ^18.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.23.7
+ '@radix-ui/primitive': 1.0.1
+ '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-id': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
+ '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0)
+ '@types/react': 18.2.14
+ '@types/react-dom': 18.2.6
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==}
peerDependencies:
@@ -2794,7 +2910,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.14)(react@18.2.0)
'@radix-ui/react-context': 1.0.1(@types/react@18.2.14)(react@18.2.0)
'@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.6)(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0)
@@ -2823,7 +2939,7 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@types/react': 18.2.14
react: 18.2.0
dev: false
@@ -2846,7 +2962,7 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@types/react': 18.2.14
react: 18.2.0
dev: false
@@ -2921,7 +3037,7 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@types/react': 18.2.14
react: 18.2.0
dev: false
@@ -3073,7 +3189,7 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.14)(react@18.2.0)
'@types/react': 18.2.14
react: 18.2.0
@@ -3296,7 +3412,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@radix-ui/react-slot': 1.0.2(@types/react@18.2.14)(react@18.2.0)
'@types/react': 18.2.14
'@types/react-dom': 18.2.6
@@ -3468,7 +3584,7 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0)
'@types/react': 18.2.14
react: 18.2.0
@@ -3493,7 +3609,7 @@ packages:
'@types/react':
optional: true
dependencies:
- '@babel/runtime': 7.21.5
+ '@babel/runtime': 7.23.7
'@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.14)(react@18.2.0)
'@types/react': 18.2.14
react: 18.2.0
@@ -5007,6 +5123,34 @@ packages:
react: 18.2.0
dev: false
+ /@restart/hooks@0.4.15(react@18.2.0):
+ resolution: {integrity: sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ dequal: 2.0.3
+ react: 18.2.0
+ dev: false
+
+ /@restart/ui@1.6.6(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==}
+ peerDependencies:
+ react: '>=16.14.0'
+ react-dom: '>=16.14.0'
+ dependencies:
+ '@babel/runtime': 7.23.7
+ '@popperjs/core': 2.11.8
+ '@react-aria/ssr': 3.7.0(react@18.2.0)
+ '@restart/hooks': 0.4.15(react@18.2.0)
+ '@types/warning': 3.0.3
+ dequal: 2.0.3
+ dom-helpers: 5.2.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ uncontrollable: 8.0.4(react@18.2.0)
+ warning: 4.0.3
+ dev: false
+
/@sapphire/async-queue@1.5.1:
resolution: {integrity: sha512-1RdpsmDQR/aWfp8oJzPtn4dNQrbpqSL5PIA0uAB/XwerPXUf994Ug1au1e7uGcD7ei8/F63UDjr5GWps1g/HxQ==}
engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
@@ -5090,7 +5234,7 @@ packages:
'@smithy/types': 2.8.0
'@smithy/util-config-provider': 2.1.0
'@smithy/util-middleware': 2.0.9
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/config-resolver@2.1.1:
@@ -5115,7 +5259,7 @@ packages:
'@smithy/smithy-client': 2.2.1
'@smithy/types': 2.8.0
'@smithy/util-middleware': 2.0.9
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/core@1.3.2:
@@ -5214,7 +5358,7 @@ packages:
'@smithy/querystring-builder': 2.0.16
'@smithy/types': 2.8.0
'@smithy/util-base64': 2.0.1
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/fetch-http-handler@2.4.1:
@@ -5243,7 +5387,7 @@ packages:
'@smithy/types': 2.8.0
'@smithy/util-buffer-from': 2.0.0
'@smithy/util-utf8': 2.0.2
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/hash-node@2.1.1:
@@ -5269,7 +5413,7 @@ packages:
resolution: {integrity: sha512-apEHakT/kmpNo1VFHP4W/cjfeP9U0x5qvfsLJubgp7UM/gq4qYp0GbqdE7QhsjUaYvEnrftRqs7+YrtWreV0wA==}
dependencies:
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/invalid-dependency@2.1.1:
@@ -5307,7 +5451,7 @@ packages:
dependencies:
'@smithy/protocol-http': 3.0.12
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/middleware-content-length@2.1.1:
@@ -5329,7 +5473,7 @@ packages:
'@smithy/types': 2.8.0
'@smithy/url-parser': 2.0.16
'@smithy/util-middleware': 2.0.9
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/middleware-endpoint@2.4.1:
@@ -5356,7 +5500,7 @@ packages:
'@smithy/types': 2.8.0
'@smithy/util-middleware': 2.0.9
'@smithy/util-retry': 2.0.9
- tslib: 2.5.0
+ tslib: 2.6.2
uuid: 8.3.2
dev: false
@@ -5380,7 +5524,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/middleware-serde@2.1.1:
@@ -5396,7 +5540,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/middleware-stack@2.1.1:
@@ -5414,7 +5558,7 @@ packages:
'@smithy/property-provider': 2.0.17
'@smithy/shared-ini-file-loader': 2.2.8
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/node-config-provider@2.2.1:
@@ -5435,7 +5579,7 @@ packages:
'@smithy/protocol-http': 3.0.12
'@smithy/querystring-builder': 2.0.16
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/node-http-handler@2.3.1:
@@ -5470,7 +5614,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/protocol-http@3.1.1:
@@ -5582,7 +5726,7 @@ packages:
'@smithy/protocol-http': 3.0.12
'@smithy/types': 2.8.0
'@smithy/util-stream': 2.0.24
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/smithy-client@2.3.1:
@@ -5601,7 +5745,7 @@ packages:
resolution: {integrity: sha512-h9sz24cFgt/W1Re22OlhQKmUZkNh244ApgRsUDYinqF8R+QgcsBIX344u2j61TPshsTz3CvL6HYU1DnQdsSrHA==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/types@2.9.1:
@@ -5616,7 +5760,7 @@ packages:
dependencies:
'@smithy/querystring-parser': 2.0.16
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/url-parser@2.1.1:
@@ -5632,7 +5776,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/util-buffer-from': 2.0.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-base64@2.1.1:
@@ -5646,7 +5790,7 @@ packages:
/@smithy/util-body-length-browser@2.0.1:
resolution: {integrity: sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==}
dependencies:
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-body-length-browser@2.1.1:
@@ -5659,7 +5803,7 @@ packages:
resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==}
engines: {node: '>=14.0.0'}
dependencies:
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-body-length-node@2.2.1:
@@ -5707,7 +5851,7 @@ packages:
'@smithy/smithy-client': 2.2.1
'@smithy/types': 2.8.0
bowser: 2.11.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-defaults-mode-browser@2.1.1:
@@ -5731,7 +5875,7 @@ packages:
'@smithy/property-provider': 2.0.17
'@smithy/smithy-client': 2.2.1
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-defaults-mode-node@2.2.0:
@@ -5753,7 +5897,7 @@ packages:
dependencies:
'@smithy/node-config-provider': 2.1.9
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-endpoints@1.1.1:
@@ -5801,7 +5945,7 @@ packages:
dependencies:
'@smithy/service-error-classification': 2.0.9
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-retry@2.1.1:
@@ -5860,7 +6004,7 @@ packages:
engines: {node: '>=14.0.0'}
dependencies:
'@smithy/util-buffer-from': 2.0.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-utf8@2.1.1:
@@ -5877,7 +6021,7 @@ packages:
dependencies:
'@smithy/abort-controller': 2.0.16
'@smithy/types': 2.8.0
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@smithy/util-waiter@2.1.1:
@@ -5892,7 +6036,7 @@ packages:
/@swc/helpers@0.5.1:
resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==}
dependencies:
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/@swc/helpers@0.5.2:
@@ -6189,6 +6333,12 @@ packages:
'@types/react': 18.2.14
dev: false
+ /@types/react-transition-group@4.4.10:
+ resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==}
+ dependencies:
+ '@types/react': 18.2.14
+ dev: false
+
/@types/react@18.2.14:
resolution: {integrity: sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==}
dependencies:
@@ -6234,6 +6384,10 @@ packages:
resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==}
dev: false
+ /@types/warning@3.0.3:
+ resolution: {integrity: sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==}
+ dev: false
+
/@types/ws@8.5.9:
resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==}
dependencies:
@@ -6255,6 +6409,12 @@ packages:
crypto-js: 4.2.0
dev: false
+ /@vercel/analytics@1.1.1:
+ resolution: {integrity: sha512-+NqgNmSabg3IFfxYhrWCfB/H+RCUOCR5ExRudNG2+pcRehq628DJB5e1u1xqwpLtn4pAYii4D98w7kofORAGQA==}
+ dependencies:
+ server-only: 0.0.1
+ dev: false
+
/@vercel/blob@0.10.0:
resolution: {integrity: sha512-ypRO1Q0mil2FjvNCZDGmOBrdARuuR+FpV4MKkQvFvHiyc2K6EB16XmrFOdmHojPiof172NL4b1Y6hpfbUtq5IA==}
engines: {node: '>=16.14'}
@@ -6478,7 +6638,7 @@ packages:
resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==}
engines: {node: '>=10'}
dependencies:
- tslib: 2.5.0
+ tslib: 2.6.2
dev: false
/array-union@2.1.0:
@@ -6799,6 +6959,10 @@ packages:
clsx: 1.2.1
dev: false
+ /classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+ dev: false
+
/clean-stack@2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
@@ -7242,6 +7406,11 @@ packages:
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
dev: false
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+ dev: false
+
/detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
dev: false
@@ -7536,6 +7705,40 @@ packages:
resolution: {integrity: sha512-sxX0LXh+uL41hSJsujAN86PjhrV/6c79XmpY0TvjZStV6VxIgarf8SRkUoUTuYmFcZQTemsoqo8qXOGw5npWfw==}
dev: false
+ /embla-carousel-autoplay@8.0.0-rc22(embla-carousel@8.0.0-rc22):
+ resolution: {integrity: sha512-UFR9ocKapxuYwcAOv8mb6Rmy7TENpzzHTymKADzB1L5dAJJxjUtOci/OpE3KrZedQaniLMz3HIO9hHqgj1h/3w==}
+ peerDependencies:
+ embla-carousel: 8.0.0-rc22
+ dependencies:
+ embla-carousel: 8.0.0-rc22
+ dev: false
+
+ /embla-carousel-react@8.0.0-rc20(react@18.2.0):
+ resolution: {integrity: sha512-02xhtl/qd5VQtzRbG3jQKVXy/YzP4J3nxQcJhz7cIY73nK3aPwxoZL+Fjk0VdS5eUIWowRBH5qIv3nVNsqeYZQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.1 || ^18.0.0
+ dependencies:
+ embla-carousel: 8.0.0-rc20
+ embla-carousel-reactive-utils: 8.0.0-rc20(embla-carousel@8.0.0-rc20)
+ react: 18.2.0
+ dev: false
+
+ /embla-carousel-reactive-utils@8.0.0-rc20(embla-carousel@8.0.0-rc20):
+ resolution: {integrity: sha512-fE7IeSS8HqwDnTDMP8eo0i4pcYQAemmJq53zCLXnp3Yj/p5+IpB1nC7aKQjd2ug1dGOSwwNRFaPI3shlAVVW/A==}
+ peerDependencies:
+ embla-carousel: 8.0.0-rc20
+ dependencies:
+ embla-carousel: 8.0.0-rc20
+ dev: false
+
+ /embla-carousel@8.0.0-rc20:
+ resolution: {integrity: sha512-fhzhbIAcsjSpUsg5jWsg0+zVyJhY5x2SPXtuS4MPAWQWoVQpvkcbX9r0FvPBn6emTbgNFRtAcWczstJy2msdUw==}
+ dev: false
+
+ /embla-carousel@8.0.0-rc22:
+ resolution: {integrity: sha512-MeXnPT1LShfgAu8qXj3CskayV0R6OkHx7w3cPTx+Q5ZWKyShKpIuu7qVQJ5BoFegalE4n6yxqoQaRuGFbK9pYw==}
+ dev: false
+
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -8045,6 +8248,24 @@ packages:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: false
+ /framer-motion@10.18.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.5.0
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+ dev: false
+
/fs-extra@10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
@@ -8223,6 +8444,10 @@ packages:
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ /gsap@3.12.4:
+ resolution: {integrity: sha512-1ByAq8dD0W4aBZ/JArgaQvc0gyUfkGkP8mgAQa0qZGdpOKlSOhOf+WNXjoLimKaKG3Z4Iu6DKZtnyszqQeyqWQ==}
+ dev: false
+
/handlebars@4.7.7:
resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==}
engines: {node: '>=0.4.7'}
@@ -9693,6 +9918,16 @@ packages:
engines: {node: '>=0.4.0'}
dev: true
+ /prop-types-extra@1.1.1(react@18.2.0):
+ resolution: {integrity: sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==}
+ peerDependencies:
+ react: '>=0.14.0'
+ dependencies:
+ react: 18.2.0
+ react-is: 16.13.1
+ warning: 4.0.3
+ dev: false
+
/prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
dependencies:
@@ -9814,6 +10049,33 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /react-bootstrap@2.10.0(@types/react@18.2.14)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-87gRP69VAfeU2yKgp8RI3HvzhPNrnYIV2QNranYXataz3ef+k7OhvKGGdxQLQfUsQ2RTmlY66tn4pdFrZ94hNg==}
+ peerDependencies:
+ '@types/react': '>=16.14.8'
+ react: '>=16.14.0'
+ react-dom: '>=16.14.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@babel/runtime': 7.23.7
+ '@restart/hooks': 0.4.15(react@18.2.0)
+ '@restart/ui': 1.6.6(react-dom@18.2.0)(react@18.2.0)
+ '@types/react': 18.2.14
+ '@types/react-transition-group': 4.4.10
+ classnames: 2.5.1
+ dom-helpers: 5.2.1
+ invariant: 2.2.4
+ prop-types: 15.8.1
+ prop-types-extra: 1.1.1(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0)
+ uncontrollable: 7.2.1(react@18.2.0)
+ warning: 4.0.3
+ dev: false
+
/react-confetti@6.1.0(react@18.2.0):
resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==}
engines: {node: '>=10.18'}
@@ -9871,6 +10133,16 @@ packages:
- encoding
dev: false
+ /react-fast-marquee@1.6.2(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-bXUuW1r+Yzd8ZjsPmMDy8WJMubHAZd/7n0W/IzUQHtd0iBfxWohP6hzCFnEHWMCOtC9wxSAq/BiEnig4kdI2Vw==}
+ peerDependencies:
+ react: '>= 16.8.0 || 18.0.0'
+ react-dom: '>= 16.8.0 || 18.0.0'
+ dependencies:
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
/react-hook-form@7.44.3(react@18.2.0):
resolution: {integrity: sha512-/tHId6p2ViAka1wECMw8FEPn/oz/w226zehHrJyQ1oIzCBNMIJCaj6ZkQcv+MjDxYh9MWR7RQic7Qqwe4a5nkw==}
engines: {node: '>=12.22.0'}
@@ -9888,6 +10160,10 @@ packages:
resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
dev: false
+ /react-lifecycles-compat@3.0.4:
+ resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
+ dev: false
+
/react-loader-spinner@6.1.6(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-x5h1Jcit7Qn03MuKlrWcMG9o12cp9SNDVHVJTNRi9TgtGPKcjKiXkou4NRfLAtXaFB3+Z8yZsVzONmPzhv2ErA==}
engines: {node: '>= 12'}
@@ -9974,7 +10250,7 @@ packages:
react: 18.2.0
react-remove-scroll-bar: 2.3.4(@types/react@18.2.14)(react@18.2.0)
react-style-singleton: 2.2.1(@types/react@18.2.14)(react@18.2.0)
- tslib: 2.5.0
+ tslib: 2.6.2
use-callback-ref: 1.3.0(@types/react@18.2.14)(react@18.2.0)
use-sidecar: 1.1.2(@types/react@18.2.14)(react@18.2.0)
dev: false
@@ -10331,6 +10607,10 @@ packages:
upper-case-first: 1.1.2
dev: true
+ /server-only@0.0.1:
+ resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
+ dev: false
+
/shallowequal@1.1.0:
resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
dev: false
@@ -10435,6 +10715,7 @@ packages:
/source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ requiresBuild: true
/spdx-correct@3.2.0:
resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
@@ -10886,64 +11167,64 @@ packages:
/tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
- /turbo-darwin-64@1.11.3:
- resolution: {integrity: sha512-IsOOg2bVbIt3o/X8Ew9fbQp5t1hTHN3fGNQYrPQwMR2W1kIAC6RfbVD4A9OeibPGyEPUpwOH79hZ9ydFH5kifw==}
+ /turbo-darwin-64@1.13.3:
+ resolution: {integrity: sha512-glup8Qx1qEFB5jerAnXbS8WrL92OKyMmg5Hnd4PleLljAeYmx+cmmnsmLT7tpaVZIN58EAAwu8wHC6kIIqhbWA==}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
- /turbo-darwin-arm64@1.11.3:
- resolution: {integrity: sha512-FsJL7k0SaPbJzI/KCnrf/fi3PgCDCjTliMc/kEFkuWVA6Httc3Q4lxyLIIinz69q6JTx8wzh6yznUMzJRI3+dg==}
+ /turbo-darwin-arm64@1.13.3:
+ resolution: {integrity: sha512-/np2xD+f/+9qY8BVtuOQXRq5f9LehCFxamiQnwdqWm5iZmdjygC5T3uVSYuagVFsZKMvX3ycySwh8dylGTl6lg==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
- /turbo-linux-64@1.11.3:
- resolution: {integrity: sha512-SvW7pvTVRGsqtSkII5w+wriZXvxqkluw5FO/MNAdFw0qmoov+PZ237+37/NgArqE3zVn1GX9P6nUx9VO+xcQAg==}
+ /turbo-linux-64@1.13.3:
+ resolution: {integrity: sha512-G+HGrau54iAnbXLfl+N/PynqpDwi/uDzb6iM9hXEDG+yJnSJxaHMShhOkXYJPk9offm9prH33Khx2scXrYVW1g==}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
- /turbo-linux-arm64@1.11.3:
- resolution: {integrity: sha512-YhUfBi1deB3m+3M55X458J6B7RsIS7UtM3P1z13cUIhF+pOt65BgnaSnkHLwETidmhRh8Dl3GelaQGrB3RdCDw==}
+ /turbo-linux-arm64@1.13.3:
+ resolution: {integrity: sha512-qWwEl5VR02NqRyl68/3pwp3c/olZuSp+vwlwrunuoNTm6JXGLG5pTeme4zoHNnk0qn4cCX7DFrOboArlYxv0wQ==}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
- /turbo-windows-64@1.11.3:
- resolution: {integrity: sha512-s+vEnuM2TiZuAUUUpmBHDr6vnNbJgj+5JYfnYmVklYs16kXh+EppafYQOAkcRIMAh7GjV3pLq5/uGqc7seZeHA==}
+ /turbo-windows-64@1.13.3:
+ resolution: {integrity: sha512-Nudr4bRChfJzBPzEmpVV85VwUYRCGKecwkBFpbp2a4NtrJ3+UP1VZES653ckqCu2FRyRuS0n03v9euMbAvzH+Q==}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
- /turbo-windows-arm64@1.11.3:
- resolution: {integrity: sha512-ZR5z5Zpc7cASwfdRAV5yNScCZBsgGSbcwiA/u3farCacbPiXsfoWUkz28iyrx21/TRW0bi6dbsB2v17swa8bjw==}
+ /turbo-windows-arm64@1.13.3:
+ resolution: {integrity: sha512-ouJCgsVLd3icjRLmRvHQDDZnmGzT64GBupM1Y+TjtYn2LVaEBoV6hicFy8x5DUpnqdLy+YpCzRMkWlwhmkX7sQ==}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
- /turbo@1.11.3:
- resolution: {integrity: sha512-RCJOUFcFMQNIGKSjC9YmA5yVP1qtDiBA0Lv9VIgrXraI5Da1liVvl3VJPsoDNIR9eFMyA/aagx1iyj6UWem5hA==}
+ /turbo@1.13.3:
+ resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==}
hasBin: true
optionalDependencies:
- turbo-darwin-64: 1.11.3
- turbo-darwin-arm64: 1.11.3
- turbo-linux-64: 1.11.3
- turbo-linux-arm64: 1.11.3
- turbo-windows-64: 1.11.3
- turbo-windows-arm64: 1.11.3
+ turbo-darwin-64: 1.13.3
+ turbo-darwin-arm64: 1.13.3
+ turbo-linux-64: 1.13.3
+ turbo-linux-arm64: 1.13.3
+ turbo-windows-64: 1.13.3
+ turbo-windows-arm64: 1.13.3
dev: true
/tween-functions@1.2.0:
@@ -11012,6 +11293,26 @@ packages:
dev: true
optional: true
+ /uncontrollable@7.2.1(react@18.2.0):
+ resolution: {integrity: sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==}
+ peerDependencies:
+ react: '>=15.0.0'
+ dependencies:
+ '@babel/runtime': 7.23.7
+ '@types/react': 18.2.14
+ invariant: 2.2.4
+ react: 18.2.0
+ react-lifecycles-compat: 3.0.4
+ dev: false
+
+ /uncontrollable@8.0.4(react@18.2.0):
+ resolution: {integrity: sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==}
+ peerDependencies:
+ react: '>=16.14.0'
+ dependencies:
+ react: 18.2.0
+ dev: false
+
/undici-types@5.28.2:
resolution: {integrity: sha512-W71OLwDqzIO0d3k07qg1xc7d4cX8SsSwuCO4bQ4V7ITwduXXie/lcImofabP5VV+NvuvSe8ovKvHVJcizVc1JA==}
dev: true
@@ -11104,6 +11405,15 @@ packages:
tslib: 2.6.2
dev: false
+ /use-debounce@10.0.1(react@18.2.0):
+ resolution: {integrity: sha512-0uUXjOfm44e6z4LZ/woZvkM8FwV1wiuoB6xnrrOmeAEjRDDzTLQNRFtYHvqUsJdrz1X37j0rVGIVp144GLHGKg==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ react: 18.2.0
+ dev: false
+
/use-sidecar@1.1.2(@types/react@18.2.14)(react@18.2.0):
resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
engines: {node: '>=10'}
@@ -11216,6 +11526,12 @@ packages:
xml-name-validator: 4.0.0
dev: false
+ /warning@4.0.3:
+ resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
/watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}