From d67bd13e91d2d72e3bc9fb9623e7e18541aca0d3 Mon Sep 17 00:00:00 2001 From: Sachintha Lakmin <68807141+sachintha-lk@users.noreply.github.com> Date: Sun, 24 Nov 2024 14:50:34 +0530 Subject: [PATCH 01/14] add company data aggregation and refactor aggregation code --- functions/.eslintrc.js | 1 + functions/src/companyDataAggregator.ts | 109 +++++++++++++++++++++++++ functions/src/firebaseSetup.ts | 6 ++ functions/src/index.ts | 78 +++++------------- functions/src/infoAggregator.ts | 56 +++++++++++++ 5 files changed, 191 insertions(+), 59 deletions(-) create mode 100644 functions/src/companyDataAggregator.ts create mode 100644 functions/src/firebaseSetup.ts create mode 100644 functions/src/infoAggregator.ts diff --git a/functions/.eslintrc.js b/functions/.eslintrc.js index e9fb34e..d3aee75 100644 --- a/functions/.eslintrc.js +++ b/functions/.eslintrc.js @@ -34,5 +34,6 @@ module.exports = { "import/no-commonjs": "off", // Allow 'require' in ESM, commonjs modules // Change linebreak-style from error to warning "linebreak-style": ["warn", "unix"], + "max-len": ["error", {"code": 120}], }, }; diff --git a/functions/src/companyDataAggregator.ts b/functions/src/companyDataAggregator.ts new file mode 100644 index 0000000..371d0b2 --- /dev/null +++ b/functions/src/companyDataAggregator.ts @@ -0,0 +1,109 @@ +import {db} from "./firebaseSetup"; +import {FieldValue} from "firebase-admin/firestore"; +import { + onDocumentCreated, + onDocumentUpdated, + onDocumentDeleted, +} from "firebase-functions/v2/firestore"; +import {https, logger} from "firebase-functions"; + +const AGGREGATED_COMPANIES_DOC_PATH = "metadata/agregatedCompanies"; +const COMPANIES_COLLECTION_PATH = "campaigns/rur-25/companies"; + + +// Fields to be aggregated +const SELECTED_FIELDS = [ + "companyId", + "name", + "description", + "logoUrl", + "preferredFields", + "qualitiesToLook", + "dataConfirmed", +]; + + +const filterSelectedFields = (data: Record): Record => + Object.fromEntries( + Object.entries(data).filter(([key]) => SELECTED_FIELDS.includes(key)) + ); + + +export const manualAggregateCompanies = https.onRequest(async (req, res) => { + try { + const aggregatedCompanies: Record = {}; + const companiesSnapshot = await db.collection(COMPANIES_COLLECTION_PATH).get(); + + companiesSnapshot.forEach((doc) => { + // Include only if dataConfirmed is true + if (doc.data().dataConfirmed) { + aggregatedCompanies[doc.id] = filterSelectedFields(doc.data()); + } + }); + + await db.doc(AGGREGATED_COMPANIES_DOC_PATH) + .set({companies: aggregatedCompanies}); + + logger.info("Manual aggregation completed:", AGGREGATED_COMPANIES_DOC_PATH); + res.status(200).send({message: "Manual aggregation completed."}); + } catch (error) { + logger.error("Error during manual aggregation:", error); + res.status(500).send({error: "Internal Server Error"}); + } +}); + + +export const incrementalAggregateCompanies = { + onCreate: onDocumentCreated(COMPANIES_COLLECTION_PATH + "/{docId}", async (event) => { + try { + const newData = event.data?.data(); + if (!newData?.dataConfirmed) return; + + const newDoc = filterSelectedFields(newData); + const docId = event.params.docId; + + // Update the aggregated document with the new data + await db.doc(AGGREGATED_COMPANIES_DOC_PATH).update({ + [`companies.${docId}`]: newDoc, + }); + + logger.info(`Incrementally added document: ${docId}`); + } catch (error) { + logger.error("Error during onCreate incremental update:", error); + } + }), + + onUpdate: onDocumentUpdated(COMPANIES_COLLECTION_PATH + "/{docId}", async (event) => { + try { + const updatedData = event.data?.after.data(); + if (!updatedData?.dataConfirmed) return; + + const updatedDoc = filterSelectedFields(updatedData); + const docId = event.params.docId; + + // Update the aggregated document with the updated data + await db.doc(AGGREGATED_COMPANIES_DOC_PATH).update({ + [`companies.${docId}`]: updatedDoc, + }); + + logger.info(`Incrementally updated document: ${docId}`); + } catch (error) { + logger.error("Error during onUpdate incremental update:", error); + } + }), + + onDelete: onDocumentDeleted(COMPANIES_COLLECTION_PATH + "/{docId}", async (event) => { + try { + const docId = event.params.docId; + + // Remove the deleted document from the aggregated document + await db.doc(AGGREGATED_COMPANIES_DOC_PATH).update({ + [`companies.${docId}`]: FieldValue.delete(), + }); + + logger.info(`Incrementally deleted document: ${docId}`); + } catch (error) { + logger.error("Error during onDelete incremental update:", error); + } + }), +}; diff --git a/functions/src/firebaseSetup.ts b/functions/src/firebaseSetup.ts new file mode 100644 index 0000000..cea585a --- /dev/null +++ b/functions/src/firebaseSetup.ts @@ -0,0 +1,6 @@ +import {initializeApp} from "firebase-admin/app"; +import {getFirestore} from "firebase-admin/firestore"; + +// Initialize Firebase +initializeApp(); +export const db = getFirestore(); diff --git a/functions/src/index.ts b/functions/src/index.ts index 08004d4..f3879f9 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -1,66 +1,26 @@ -import {initializeApp} from "firebase-admin/app"; -import {getFirestore} from "firebase-admin/firestore"; +import {createInfoTriggers} from "./infoAggregator"; import { - onDocumentCreated, - onDocumentUpdated, - onDocumentDeleted, -} from "firebase-functions/v2/firestore"; -import {logger} from "firebase-functions"; + incrementalAggregateCompanies, + manualAggregateCompanies, +} from "./companyDataAggregator"; -initializeApp(); -const db = getFirestore(); +// Exporting triggers for /info-sponsors and /info-timeline collections +const sponsorsTriggers = createInfoTriggers("info-sponsors"); +const timelineTriggers = createInfoTriggers("info-timeline"); -// Path for the aggregated document -const AGGREGATED_DOC_PATH = "metadata/aggregatedInfo"; +export const infoSponsorsOnCreate = sponsorsTriggers.onCreate; +export const infoSponsorsOnUpdate = sponsorsTriggers.onUpdate; +export const infoSponsorsOnDelete = sponsorsTriggers.onDelete; -// Aggregates data from /info-sponsors and /info-timeline into a single document -const aggregateData = async () => { - try { - const aggregatedData: { - "info-sponsors": Record; - "info-timeline": Record; - } = {"info-sponsors": {}, "info-timeline": {}}; +export const infoTimelineOnCreate = timelineTriggers.onCreate; +export const infoTimelineOnUpdate = timelineTriggers.onUpdate; +export const infoTimelineOnDelete = timelineTriggers.onDelete; - // Aggregate data from info-sponsors - const sponsorsSnapshot = await db.collection("info-sponsors").get(); - sponsorsSnapshot.forEach((doc) => { - aggregatedData["info-sponsors"][doc.id] = doc.data(); - }); - // Aggregate data from info-timeline - const timelineSnapshot = await db.collection("info-timeline").get(); - timelineSnapshot.forEach((doc) => { - aggregatedData["info-timeline"][doc.id] = doc.data(); - }); +// Exporting Firestore triggers for incremental company aggregation +export const companyOnCreate = incrementalAggregateCompanies.onCreate; +export const companyOnUpdate = incrementalAggregateCompanies.onUpdate; +export const companyOnDelete = incrementalAggregateCompanies.onDelete; - // Save the aggregated data to the Firestore document - await db.doc(AGGREGATED_DOC_PATH).set(aggregatedData); - logger.info("Successfully aggregated data into:", AGGREGATED_DOC_PATH); - } catch (error) { - logger.error("Error aggregating data:", error); - } -}; - -// Helper to create triggers for a given collection -const createTriggers = (collectionPath: string) => { - return { - onCreate: onDocumentCreated(`${collectionPath}/{docId}`, async (event) => { - logger.info(`Document created in ${collectionPath}:`, event.params.docId); - await aggregateData(); - }), - onUpdate: onDocumentUpdated(`${collectionPath}/{docId}`, async (event) => { - logger.info(`Document updated in ${collectionPath}:`, event.params.docId); - await aggregateData(); - }), - onDelete: onDocumentDeleted(`${collectionPath}/{docId}`, async (event) => { - logger.info(`Document deleted in ${collectionPath}:`, event.params.docId); - await aggregateData(); - }), - }; -}; - -// Export triggers for /info-sponsors -export const aggregateInfoSponsors = createTriggers("info-sponsors"); - -// Export triggers for /info-timeline -export const aggregateInfoTimeline = createTriggers("info-timeline"); +// Exporting HTTP function for manual aggregation +export const aggregateCompaniesManually = manualAggregateCompanies; diff --git a/functions/src/infoAggregator.ts b/functions/src/infoAggregator.ts new file mode 100644 index 0000000..89b6e25 --- /dev/null +++ b/functions/src/infoAggregator.ts @@ -0,0 +1,56 @@ +import {db} from "./firebaseSetup"; +import { + onDocumentCreated, + onDocumentUpdated, + onDocumentDeleted, +} from "firebase-functions/v2/firestore"; +import {logger} from "firebase-functions"; + +// Path for the aggregated document +const AGGREGATED_DOC_PATH = "metadata/aggregatedInfo"; + +// Aggregates data from /info-sponsors and /info-timeline into a single document +const aggregateData = async () => { + try { + const aggregatedData: { + "info-sponsors": Record; + "info-timeline": Record; + } = {"info-sponsors": {}, "info-timeline": {}}; + + // Aggregate data from info-sponsors + const sponsorsSnapshot = await db.collection("info-sponsors").get(); + sponsorsSnapshot.forEach((doc) => { + aggregatedData["info-sponsors"][doc.id] = doc.data(); + }); + + // Aggregate data from info-timeline + const timelineSnapshot = await db.collection("info-timeline").get(); + timelineSnapshot.forEach((doc) => { + aggregatedData["info-timeline"][doc.id] = doc.data(); + }); + + // Save the aggregated data to the Firestore document + await db.doc(AGGREGATED_DOC_PATH).set(aggregatedData); + logger.info("Successfully aggregated data into:", AGGREGATED_DOC_PATH); + } catch (error) { + logger.error("Error aggregating data:", error); + } +}; + +// Helper to create triggers for a given collection +export const createInfoTriggers = (collectionPath: string) => { + return { + onCreate: onDocumentCreated(`${collectionPath}/{docId}`, async (event) => { + logger.info(`Document created in ${collectionPath}:`, event.params.docId); + await aggregateData(); + }), + onUpdate: onDocumentUpdated(`${collectionPath}/{docId}`, async (event) => { + logger.info(`Document updated in ${collectionPath}:`, event.params.docId); + await aggregateData(); + }), + onDelete: onDocumentDeleted(`${collectionPath}/{docId}`, async (event) => { + logger.info(`Document deleted in ${collectionPath}:`, event.params.docId); + await aggregateData(); + }), + }; +}; From 778d21ccedddcf596a75faa98c3b5dd0b55f75f7 Mon Sep 17 00:00:00 2001 From: Sachintha Lakmin <68807141+sachintha-lk@users.noreply.github.com> Date: Sun, 24 Nov 2024 15:55:03 +0530 Subject: [PATCH 02/14] Add region to functions --- functions/src/companyDataAggregator.ts | 21 +++++++++++++++---- functions/src/infoAggregator.ts | 29 +++++++++++++++----------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/functions/src/companyDataAggregator.ts b/functions/src/companyDataAggregator.ts index 371d0b2..ad78caa 100644 --- a/functions/src/companyDataAggregator.ts +++ b/functions/src/companyDataAggregator.ts @@ -7,6 +7,8 @@ import { } from "firebase-functions/v2/firestore"; import {https, logger} from "firebase-functions"; +const REGION = "asia-southeast1"; + const AGGREGATED_COMPANIES_DOC_PATH = "metadata/agregatedCompanies"; const COMPANIES_COLLECTION_PATH = "campaigns/rur-25/companies"; @@ -29,7 +31,9 @@ const filterSelectedFields = (data: Record): Record => ); -export const manualAggregateCompanies = https.onRequest(async (req, res) => { +export const manualAggregateCompanies = https.onRequest({ + region: REGION, +}, async (req, res) => { try { const aggregatedCompanies: Record = {}; const companiesSnapshot = await db.collection(COMPANIES_COLLECTION_PATH).get(); @@ -54,7 +58,10 @@ export const manualAggregateCompanies = https.onRequest(async (req, res) => { export const incrementalAggregateCompanies = { - onCreate: onDocumentCreated(COMPANIES_COLLECTION_PATH + "/{docId}", async (event) => { + onCreate: onDocumentCreated({ + document: COMPANIES_COLLECTION_PATH + "/{docId}", + region: REGION, + }, async (event) => { try { const newData = event.data?.data(); if (!newData?.dataConfirmed) return; @@ -73,7 +80,10 @@ export const incrementalAggregateCompanies = { } }), - onUpdate: onDocumentUpdated(COMPANIES_COLLECTION_PATH + "/{docId}", async (event) => { + onUpdate: onDocumentUpdated({ + document: COMPANIES_COLLECTION_PATH + "/{docId}", + region: REGION, + }, async (event) => { try { const updatedData = event.data?.after.data(); if (!updatedData?.dataConfirmed) return; @@ -92,7 +102,10 @@ export const incrementalAggregateCompanies = { } }), - onDelete: onDocumentDeleted(COMPANIES_COLLECTION_PATH + "/{docId}", async (event) => { + onDelete: onDocumentDeleted({ + document: COMPANIES_COLLECTION_PATH + "/{docId}", + region: REGION, + }, async (event) => { try { const docId = event.params.docId; diff --git a/functions/src/infoAggregator.ts b/functions/src/infoAggregator.ts index 89b6e25..8bd0d1a 100644 --- a/functions/src/infoAggregator.ts +++ b/functions/src/infoAggregator.ts @@ -6,6 +6,8 @@ import { } from "firebase-functions/v2/firestore"; import {logger} from "firebase-functions"; +const REGION = "asia-southeast1"; + // Path for the aggregated document const AGGREGATED_DOC_PATH = "metadata/aggregatedInfo"; @@ -40,17 +42,20 @@ const aggregateData = async () => { // Helper to create triggers for a given collection export const createInfoTriggers = (collectionPath: string) => { return { - onCreate: onDocumentCreated(`${collectionPath}/{docId}`, async (event) => { - logger.info(`Document created in ${collectionPath}:`, event.params.docId); - await aggregateData(); - }), - onUpdate: onDocumentUpdated(`${collectionPath}/{docId}`, async (event) => { - logger.info(`Document updated in ${collectionPath}:`, event.params.docId); - await aggregateData(); - }), - onDelete: onDocumentDeleted(`${collectionPath}/{docId}`, async (event) => { - logger.info(`Document deleted in ${collectionPath}:`, event.params.docId); - await aggregateData(); - }), + onCreate: onDocumentCreated({document: `${collectionPath}/{docId}`, region: REGION}, + async (event) => { + logger.info(`Document created in ${collectionPath}:`, event.params.docId); + await aggregateData(); + }), + onUpdate: onDocumentUpdated({document: `${collectionPath}/{docId}`, region: REGION}, + async (event) => { + logger.info(`Document updated in ${collectionPath}:`, event.params.docId); + await aggregateData(); + }), + onDelete: onDocumentDeleted({document: `${collectionPath}/{docId}`, region: REGION}, + async (event) => { + logger.info(`Document deleted in ${collectionPath}:`, event.params.docId); + await aggregateData(); + }), }; }; From 1ec1db91b76d8a5b712e4fd13d13d4e22a7180c4 Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sun, 24 Nov 2024 20:34:54 +0530 Subject: [PATCH 03/14] fix navbar, add animations --- src/components/ui/floating-navbar.tsx | 169 +++++++++++--------------- 1 file changed, 74 insertions(+), 95 deletions(-) diff --git a/src/components/ui/floating-navbar.tsx b/src/components/ui/floating-navbar.tsx index ae6e81f..e73846f 100644 --- a/src/components/ui/floating-navbar.tsx +++ b/src/components/ui/floating-navbar.tsx @@ -1,12 +1,7 @@ 'use client'; -import React, { useContext, useState, useEffect } from "react"; -import { - motion, - AnimatePresence, - useScroll, - useMotionValueEvent, -} from "framer-motion"; +import React, { useContext, useState } from "react"; + import { cn } from "@/lib/utils"; import Link from "next/link"; import { MoonIcon, SunIcon } from "@heroicons/react/24/solid"; @@ -14,41 +9,23 @@ import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline"; import { ThemeContext } from "@/app/layout"; import Image from "next/image"; import { IThemeContextType } from "@/interfaces/IThemeContext"; +import SMALL_LOGO from "../../../public/Images/logo/RUR20_small.png" +import { AnimatePresence, motion } from "framer-motion"; + export const FloatingNav = ({ navItems, className, }: { - navItems: { - name: string; - link: string; - icon?: JSX.Element; - }[]; - className?: string; + navItems: { + name: string; + link: string; + icon?: JSX.Element; + }[]; + className?: string; }) => { - const { scrollYProgress } = useScroll(); - const [visible, setVisible] = useState(true); // Set default to true for initial visibility const [isMenuOpen, setIsMenuOpen] = useState(false); - useEffect(() => { - setVisible(true); // Ensure the navbar is visible on load - }, []); - - useMotionValueEvent(scrollYProgress, "change", (current) => { - if (typeof current === "number") { - const direction = current! - scrollYProgress.getPrevious()!; - if (scrollYProgress.get() < 0.05) { - setVisible(true); // Keep visible if near the top of the page - } else { - if (direction < 0) { - setVisible(true); // Show navbar on upward scroll - } else { - setVisible(false); // Hide navbar on downward scroll - } - } - } - }); - const themeContext = useContext(ThemeContext); if (!themeContext) { @@ -60,101 +37,103 @@ export const FloatingNav = ({ const { toggleTheme, theme } = themeContext; return ( - - +
+
+
+
logo {/* Desktop Navigation */}
{navItems.map((navItem, idx) => ( - - {navItem.name} - + + {navItem.name} + ))}
{/* Mobile Menu Button */}
{/* Mobile Navigation Menu */} - - {isMenuOpen && ( + +
+
+ + + {isMenuOpen && ( +
-
- {navItems.map((navItem, idx) => ( - setIsMenuOpen(false)} - className="relative dark:text-neutral-50 flex items-center space-x-2 text-neutral-600 dark:hover:text-neutral-300 hover:text-neutral-500" - > - {navItem.icon && {navItem.icon}} - {navItem.name} - - ))} -
+ {navItems.map((navItem, idx) => ( + + setIsMenuOpen(false)} + className="relative dark:text-neutral-50 flex items-center space-x-2 space-y-4 text-neutral-600 dark:hover:text-neutral-300 hover:text-neutral-500" + style={{transform:"translateX(-50%)"}} + > + {navItem.icon && {navItem.icon}} + {navItem.name} + + + + ))}
- )} - - - +
+ )} +
+ +
); }; From 454e14e318b11137aa726f3ad94ce06463f54e9e Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sun, 24 Nov 2024 21:02:23 +0530 Subject: [PATCH 04/14] social media link fix (mobile) --- src/components/blocks/footer.tsx | 2 +- src/components/ui/floating-dock.tsx | 74 ++++------------------------- 2 files changed, 11 insertions(+), 65 deletions(-) diff --git a/src/components/blocks/footer.tsx b/src/components/blocks/footer.tsx index b5e7ecf..531a0c4 100644 --- a/src/components/blocks/footer.tsx +++ b/src/components/blocks/footer.tsx @@ -63,7 +63,7 @@ const Footer = () => {
-
+

diff --git a/src/components/ui/floating-dock.tsx b/src/components/ui/floating-dock.tsx index b3d1962..8f5faa5 100644 --- a/src/components/ui/floating-dock.tsx +++ b/src/components/ui/floating-dock.tsx @@ -19,77 +19,18 @@ import { useRef, useState } from "react"; export const FloatingDock = ({ items, - desktopClassName, - mobileClassName, + classNames, }: { items: { title: string; icon: React.ReactNode; href: string }[]; - desktopClassName?: string; - mobileClassName?: string; + classNames?: string; }) => { return ( <> - - + ); }; -const FloatingDockMobile = ({ - items, - className, -}: { - items: { title: string; icon: React.ReactNode; href: string }[]; - className?: string; -}) => { - const [open, setOpen] = useState(false); - return ( -
- - {open && ( - - {items.map((item, idx) => ( - - -
{item.icon}
- -
- ))} -
- )} -
- -
- ); -}; const FloatingDockDesktop = ({ items, @@ -104,7 +45,7 @@ const FloatingDockDesktop = ({ onMouseMove={(e) => mouseX.set(e.pageX)} onMouseLeave={() => mouseX.set(Infinity)} className={cn( - "mx-auto hidden md:flex h-16 gap-4 items-end rounded-2xl px-4 pb-3", + "mx-auto flex h-auto gap-2 item-center rounded-2xl px-4 md:gap-4", className )} > @@ -183,7 +124,12 @@ function IconContainer({ initial={{ opacity: 0, y: 10, x: "-50%" }} animate={{ opacity: 1, y: 0, x: "-50%" }} exit={{ opacity: 0, y: 2, x: "-50%" }} - className="px-2 py-0.5 whitespace-pre rounded-md bg-gray-100 border dark:bg-neutral-800 dark:border-neutral-900 dark:text-white border-gray-200 text-neutral-700 absolute left-1/2 -translate-x-1/2 -top-8 w-fit text-xs" + className=" + px-2 py-0.5 whitespace-pre rounded-md bg-gray-100 border + dark:bg-neutral-800 dark:border-neutral-900 dark:text-white + border-gray-200 text-neutral-700 absolute left-1/2 + -translate-x-1/2 -top-8 w-fit text-xs + " > {title} From 4d5bb0a2cb091553657ab6b34e4a4cd0fbdc616e Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sun, 24 Nov 2024 21:25:26 +0530 Subject: [PATCH 05/14] add html code eveluate component --- package-lock.json | 29 ++++++++++++++++++++++++++++ package.json | 1 + src/app/page.tsx | 3 ++- src/components/ui/code-evel-para.tsx | 8 ++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/components/ui/code-evel-para.tsx diff --git a/package-lock.json b/package-lock.json index c82dc78..f9fdbeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cobe": "^0.6.3", + "dompurify": "^3.2.1", "firebase": "^11.0.1", "firebase-admin": "^13.0.1", "firebase-functions": "^6.1.1", @@ -2098,6 +2099,12 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "node_modules/@types/webxr": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz", @@ -4468,6 +4475,14 @@ "node": ">=6.0.0" } }, + "node_modules/dompurify": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.1.tgz", + "integrity": "sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -13884,6 +13899,12 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "optional": true + }, "@types/webxr": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz", @@ -15590,6 +15611,14 @@ "esutils": "^2.0.2" } }, + "dompurify": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.1.tgz", + "integrity": "sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==", + "requires": { + "@types/trusted-types": "^2.0.7" + } + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", diff --git a/package.json b/package.json index 782df4e..8c74cc3 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cobe": "^0.6.3", + "dompurify": "^3.2.1", "firebase": "^11.0.1", "firebase-admin": "^13.0.1", "firebase-functions": "^6.1.1", diff --git a/src/app/page.tsx b/src/app/page.tsx index ad81281..1543d22 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -42,6 +42,7 @@ import Lottie from "react-lottie-player"; import { IContact } from "@/interfaces/IContacts"; import { getReachUs } from "@/services/reachus.service"; import RegistrationStatus from "@/components/ui/google-gemini-effect"; +import CodeEvelPara from "@/components/ui/code-evel-para"; export const products = [ { @@ -261,7 +262,7 @@ export default function Home() { const events = timeline.map((t) => ({ title: t.title, - content: t.description, + content: , eventDate: t.eventDate.toDate(), btnLink: t.btnLink, image: t.imgURL, diff --git a/src/components/ui/code-evel-para.tsx b/src/components/ui/code-evel-para.tsx new file mode 100644 index 0000000..949ac73 --- /dev/null +++ b/src/components/ui/code-evel-para.tsx @@ -0,0 +1,8 @@ +import DOMPurify from 'dompurify'; + +const CodeEvelPara = ({ htmlContent }:{htmlContent:string}) => { + const sanitizedHTML = DOMPurify.sanitize(htmlContent, { ALLOWED_TAGS: ['br', 'strong' , 'b' , 'h1','h2','h3','h4','h5','h6','i','u'] }); + return
; +}; + +export default CodeEvelPara; \ No newline at end of file From 1a971dc5599ac7f6f026ea41a12ef37f1a362b10 Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sun, 24 Nov 2024 21:51:19 +0530 Subject: [PATCH 06/14] timeline btn text & disable --- src/app/page.tsx | 2 ++ src/components/ui/hover-border-gradient.tsx | 5 ++++- src/components/ui/timeline.tsx | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 1543d22..d7eb966 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -266,6 +266,8 @@ export default function Home() { eventDate: t.eventDate.toDate(), btnLink: t.btnLink, image: t.imgURL, + btnText: t.btnText, + isBtnDisabled: t.isBtnDisabled, })); const ErrorMessage = ({ message }: { message: string }) => ( diff --git a/src/components/ui/hover-border-gradient.tsx b/src/components/ui/hover-border-gradient.tsx index d11b35c..a2d1610 100644 --- a/src/components/ui/hover-border-gradient.tsx +++ b/src/components/ui/hover-border-gradient.tsx @@ -13,6 +13,7 @@ export function HoverBorderGradient({ as: Tag = "button", duration = 1, clockwise = true, + isDisabled = false, ...props }: React.PropsWithChildren< { @@ -21,6 +22,7 @@ export function HoverBorderGradient({ className?: string; duration?: number; clockwise?: boolean; + isDisabled?: boolean; } & React.HTMLAttributes >) { const [hovered, setHovered] = useState(false); @@ -62,9 +64,10 @@ export function HoverBorderGradient({ }} onMouseLeave={() => setHovered(false)} className={cn( - "relative flex rounded-full border content-center bg-black/20 hover:bg-black/10 transition duration-500 dark:bg-white/20 items-center flex-col flex-nowrap gap-10 h-min justify-center overflow-visible p-px decoration-clone w-fit", + "relative flex rounded-full border content-center bg-black/20 hover:bg-black/10 transition duration-500 dark:bg-white/20 items-center flex-col flex-nowrap gap-10 h-min justify-center overflow-visible p-px decoration-clone w-fit disabled:cursor-not-allowed", containerClassName )} + disabled={isDisabled} {...props} >
{ @@ -86,7 +88,7 @@ export const Timeline = ({ data }: { data: ITimelineEntry[] }) => {
- router.push(item.btnLink)}>Stay Tuned + router.push(item.btnLink)} isDisabled={item.isBtnDisabled} >{item.btnText}
From 0b1bb57e2f3a27dc8baca8ca28621a6b78ee22e9 Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Mon, 25 Nov 2024 01:05:01 +0530 Subject: [PATCH 07/14] sponsor card design fix --- src/app/page.tsx | 21 ++++++++++++--------- src/components/ui/card-design.tsx | 2 +- src/components/ui/hero-parallax.tsx | 2 +- tailwind.config.ts | 8 +++++++- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index d7eb966..590a6c2 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -173,9 +173,10 @@ const Loading =()=> { const Para = ({ level, name, imgURL, loadCallback }: { level: string, name: string, imgURL: string | undefined, loadCallback?: (count: number) => void }): React.ReactNode => { + const color = level ==="Gold"?"custom-color-gold dark:custom-dark-color-gold":(level ==="Silver"?"custom-color-silver dark:custom-dark-color-silver":"custom-color-bronze dark:custom-dark-color-bronze") return ( -
-
+
+
{`${level} Sponsor`}
Sponsor
{name} @@ -335,18 +336,21 @@ export default function Home() { ) : isSponsorsLoading ? ( ) : sponsors.length > 0 ? ( - + {sponsors .filter((sponsor) => ["Gold", "Silver", "Bronze"].includes(sponsor.level)) - .map((sponsor, index) => ( + .map((sponsor, index) => { + + return ( - ))} + )} + )} ) : ( @@ -354,8 +358,7 @@ export default function Home() {
+ className="scroll-mt-20 relative py-16 w-full">
diff --git a/src/components/ui/card-design.tsx b/src/components/ui/card-design.tsx index 1059301..9143d29 100644 --- a/src/components/ui/card-design.tsx +++ b/src/components/ui/card-design.tsx @@ -80,7 +80,7 @@ export const CardDesign: React.FC = ({ )} /> -
+
{children}
diff --git a/src/components/ui/hero-parallax.tsx b/src/components/ui/hero-parallax.tsx index 737b3df..6f6fe6e 100644 --- a/src/components/ui/hero-parallax.tsx +++ b/src/components/ui/hero-parallax.tsx @@ -143,7 +143,7 @@ export const ProductCard = ({ src={product.thumbnail} height="600" width="600" - className="object-cover object-left-top absolute h-full w-full inset-0" + className="object-cover object-left-top absolute h-full w-full inset-0 rounded-xl" alt={product.title} // onLoad={(e) => { // // addResourceCount(1); diff --git a/tailwind.config.ts b/tailwind.config.ts index b2b22eb..2345546 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -22,7 +22,7 @@ module.exports = { extend: { backgroundImage:{ 'dark-gradient': 'linear-gradient(75deg, rgba(0,8,21,1) 0%, rgba(0,19,30,1) 30%, rgba(3,49,62,1) 45%, rgba(0,16,41,1) 60%, rgba(0,5,40,1) 100%)', - 'light-gradient': ' linear-gradient(55deg, rgba(151,219,245,1) 0%, rgba(255,255,255,1) 30%, rgba(243,253,255,1) 45%, rgba(255,255,255,1) 60%, rgba(156,225,251,1) 100%)', + 'light-gradient': 'linear-gradient(55deg, rgba(247,254,255,1) 0%, rgba(230,238,238,1) 20%, rgba(255,255,255,1) 45%, rgba(230,238,238,1) 70%, rgba(247,254,255,1) 100%);', }, colors:{ @@ -50,6 +50,12 @@ module.exports = { 'dark-dots-color': '#696969', 'glow-dots-color': '#0000AB', 'dots-color': '#ADD8E6', + 'custom-color-gold': '#AF9500', + 'custom-color-silver':'#D7D7D7', + 'custom-color-bronze':'#BE7936', + 'custom-dark-color-gold': '#FFD700', + 'custom-dark-color-silver': '#C0C0C0', + 'custom-dark-color-bronze': '#CD7F32', } }, animation: { From 48a1192995f81a21e011573aac2a7c4051229d3f Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sat, 30 Nov 2024 07:08:40 +0530 Subject: [PATCH 08/14] trace beam design fixs --- src/components/ui/tracing-beam.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/ui/tracing-beam.tsx b/src/components/ui/tracing-beam.tsx index d3ebbc4..c56ba45 100644 --- a/src/components/ui/tracing-beam.tsx +++ b/src/components/ui/tracing-beam.tsx @@ -35,17 +35,17 @@ export const TracingBeam = ({ }, []); const y1 = useSpring( - useTransform(scrollYProgress, [0, 0.8], [50, svgHeight]), + useTransform(scrollYProgress, [0, 0.1], [50, svgHeight]), { stiffness: 500, - damping: 90, + damping: 100, } ); const y2 = useSpring( useTransform(scrollYProgress, [0, 1], [50, svgHeight - 200]), { stiffness: 500, - damping: 90, + damping: 100, } ); @@ -126,7 +126,7 @@ export const TracingBeam = ({
{children}
From 2c7ee28c9ae6c8dc268e1cc88638d7c5d02d54f7 Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sat, 30 Nov 2024 07:09:44 +0530 Subject: [PATCH 09/14] mobile hero section --- src/components/ui/responsiveHero.tsx | 76 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/src/components/ui/responsiveHero.tsx b/src/components/ui/responsiveHero.tsx index 1bf6644..443a5af 100644 --- a/src/components/ui/responsiveHero.tsx +++ b/src/components/ui/responsiveHero.tsx @@ -3,81 +3,83 @@ import { HeroParallax } from "./hero-parallax"; const MobileHero = () => { return ( -
+
{/* Background Images Container */}
{/* Large circle image 1 */} -
-
+
Bread making
-
{/* Large circle image 2 */} -
-
-
+
+
Bread making
-
{/* Small circle image */} -
+
Bread making
-
- +
{/* Gradient overlay */} -
+
{/* Content */}
- {/* Pricing */} -

- STARTING AT -

{/* Main Title */} -

- Are - You - Ready? +

+ Are + You + Ready?

{/* Description */} -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Eu penatibus pellentesque dolor consequat liqula egestas massa gravida. Porttitor venenatis enim praesent. +

+

+ The Virtual Odyssey in Corporate Arena

+
{/* Buttons */} -
- - + {/* */}
From fe1c6d1faed58ea1c8dec7914c62b6ebf4e4543e Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sat, 30 Nov 2024 07:10:27 +0530 Subject: [PATCH 10/14] custom screen break point --- tailwind.config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tailwind.config.ts b/tailwind.config.ts index 2345546..ba05823 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -19,6 +19,10 @@ module.exports = { ], darkMode: "class", theme: { + screens: { + 'sm1': '570px', + 'sm2': '700px', + }, extend: { backgroundImage:{ 'dark-gradient': 'linear-gradient(75deg, rgba(0,8,21,1) 0%, rgba(0,19,30,1) 30%, rgba(3,49,62,1) 45%, rgba(0,16,41,1) 60%, rgba(0,5,40,1) 100%)', From 30e98c2749debe81e407d0584183585f2a2daf30 Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sat, 30 Nov 2024 07:11:53 +0530 Subject: [PATCH 11/14] minor changes --- src/app/page.tsx | 6 ++-- src/components/ui/google-gemini-effect.tsx | 41 ++++++++++++++-------- src/components/ui/timeline.tsx | 2 +- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 590a6c2..b012af1 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -184,7 +184,7 @@ const Para = ({ level, name, imgURL, loadCallback }: { level: string, name: stri width={300} height={100} alt="Sponsor" - className="p-2 my-2 rounded-lg dark:bg-black bg-white h-auto min-w-[250px] max-w-[250px] md:max-w-[300px]" + className="p-2 my-2 rounded-lg dark:bg-custom-dark-color-600 bg-custom-color-600 h-auto min-w-[250px] max-w-[250px] md:max-w-[300px]" />
{name} @@ -359,8 +359,8 @@ export default function Home() {
-
-
+
+
diff --git a/src/components/ui/google-gemini-effect.tsx b/src/components/ui/google-gemini-effect.tsx index 972bc1a..70f9d15 100644 --- a/src/components/ui/google-gemini-effect.tsx +++ b/src/components/ui/google-gemini-effect.tsx @@ -1,6 +1,6 @@ 'use client'; import React, { useState, useEffect, useRef } from 'react'; -import { motion, useScroll, useTransform } from 'framer-motion'; +import { AnimatePresence, motion, useScroll, useTransform } from 'framer-motion'; import { getRegistrationStatus } from '../../services/notice.service'; import { RegistrationStatus as RegistrationStatusType } from '../../interfaces/IRegistration'; import { cn } from "@/lib/utils"; @@ -18,10 +18,13 @@ interface StatusCardProps { } const StatusCard: React.FC = ({ title, signUp, signIn, className }) => ( + = ({ title, signUp, signIn, classNam initial={{ scale: 0 }} animate={{ scale: 1 }} transition={{ delay: 0.4 }} + viewport={{ once: false }} + exit={{ scale: 0 }} className={`w-3 h-3 rounded-full mr-2 ${ signUp ? 'bg-green-500' : 'bg-red-500' }`} @@ -47,6 +52,8 @@ const StatusCard: React.FC = ({ title, signUp, signIn, classNam initial={{ scale: 0 }} animate={{ scale: 1 }} transition={{ delay: 0.6 }} + viewport={{ once: false }} + exit={{ scale: 0 }} className={`w-3 h-3 rounded-full mr-2 ${ signIn ? 'bg-green-500' : 'bg-red-500' }`} @@ -57,6 +64,7 @@ const StatusCard: React.FC = ({ title, signUp, signIn, classNam
+ ); const WaveBackground = () => { @@ -77,6 +85,7 @@ const WaveBackground = () => { ]; return ( +
{
+
); }; @@ -221,13 +231,14 @@ const RegistrationStatus = () => { if (loading) { return ( +
+ className="rounded-full h-8 w-8 border-b-2 border-white" />
+
); } @@ -244,41 +255,43 @@ const RegistrationStatus = () => { ref={containerRef} className="relative min-h-screen bg-gradient-to-b from-gray-900 to-blue-950 overflow-auto" > + + viewport={{ once: false }} + className="max-w-4xl mx-auto p-4 relative z-10" > + + viewport={{ once: false }} + className="text-4xl md:text-7xl font-bold text-center mb-8 bg-clip-text text-transparent bg-gradient-to-b from-neutral-100 to-neutral-300"> Registration Status + viewport={{ once: false }} + className="text-xs md:text-xl font-normal text-center text-neutral-400 mt-4 max-w-lg mx-auto mb-12"> Check the current registration status for companies and students
+ signIn={status.company.signIn} /> + signIn={status.student.signIn} />
+
+
); diff --git a/src/components/ui/timeline.tsx b/src/components/ui/timeline.tsx index a1e4a22..f6ec7d2 100644 --- a/src/components/ui/timeline.tsx +++ b/src/components/ui/timeline.tsx @@ -34,7 +34,7 @@ export const Timeline = ({ data }: { data: ITimelineEntry[] }) => { const { scrollYProgress } = useScroll({ target: containerRef, - offset: ["start 10%", "end 50%"], + offset: ["start 10%", "end 70%"], }); const heightTransform = useTransform(scrollYProgress, [0, 1], [0, height]); From f7996d809ed314f1c2e9ec760f7e285bfd539abd Mon Sep 17 00:00:00 2001 From: Sakindu Ransindu Date: Sun, 1 Dec 2024 07:46:28 +0530 Subject: [PATCH 12/14] hero section revision- remove animations --- src/components/ui/hero-highlight.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/hero-highlight.tsx b/src/components/ui/hero-highlight.tsx index e8443a6..918499c 100644 --- a/src/components/ui/hero-highlight.tsx +++ b/src/components/ui/hero-highlight.tsx @@ -29,7 +29,7 @@ export const HeroHighlight = ({ return (
Date: Sun, 1 Dec 2024 15:42:45 +0530 Subject: [PATCH 13/14] design fixes - navbar,footer,gemini effect hero-video --- .gitignore | 8 +- next.config.ts | 2 +- package.json | 3 + public/animations/RUR_Loading.json | 1 + src/app/page.tsx | 38 +++++--- src/components/blocks/footer.tsx | 2 +- src/components/ui/floating-navbar.tsx | 12 +-- src/components/ui/google-gemini-effect.tsx | 100 ++++++++++----------- src/components/ui/hero-parallax.tsx | 63 ++++--------- src/components/ui/hero-video.tsx | 59 ++++++++++++ src/components/ui/timeline.tsx | 1 + tailwind.config.ts | 2 + 12 files changed, 167 insertions(+), 124 deletions(-) create mode 100644 public/animations/RUR_Loading.json create mode 100644 src/components/ui/hero-video.tsx diff --git a/.gitignore b/.gitignore index 2f37e3a..12f5516 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,10 @@ next-env.d.ts # firebase emulator logs ui-debug.log firebase-debug.log -firestore-debug.log \ No newline at end of file +firestore-debug.log +# next-video +public/videos/* +!public/videos/*.json +!public/videos/*.js +!public/videos/*.ts +public/_next-video diff --git a/next.config.ts b/next.config.ts index f8f0e1e..98c5163 100644 --- a/next.config.ts +++ b/next.config.ts @@ -35,4 +35,4 @@ const nextConfig: NextConfig = { }, }; -export default nextConfig; +export default nextConfig; \ No newline at end of file diff --git a/package.json b/package.json index 8c74cc3..d00d682 100644 --- a/package.json +++ b/package.json @@ -45,5 +45,8 @@ "postcss": "^8.4.47", "tailwindcss": "^3.4.14", "typescript": "^5.6.3" + }, + "resolutions": { + "typescript": "5.6.3" } } diff --git a/public/animations/RUR_Loading.json b/public/animations/RUR_Loading.json new file mode 100644 index 0000000..fa9617a --- /dev/null +++ b/public/animations/RUR_Loading.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":31.0000012626559,"w":500,"h":500,"nm":"Loading ","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":5,"ty":4,"nm":"Rectangle_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[250,157.375,0],"to":[15.448,15.438,0],"ti":[0.031,-0.052,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[342.688,250,0],"to":[-0.059,0.098,0],"ti":[15.448,-15.427,0]},{"t":30.0000012219251,"s":[250,342.563,0]}],"ix":2},"a":{"a":0,"k":[-125,-107,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[57,-57],[57,57],[-57,57],[-57,-57]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.38823529411764707,0.6941176470588235,0.9372549019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-125,-107],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Rectangle_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[342.688,250,0],"to":[0.052,-0.073,0],"ti":[-0.01,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[250,342.563,0],"to":[0.104,0,0],"ti":[0.198,-0.073,0]},{"t":30.0000012219251,"s":[157.313,250,0]}],"ix":2},"a":{"a":0,"k":[-125,-107,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[57,-57],[57,57],[-57,57],[-57,-57]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3843137254901961,0.47843137254901963,0.8784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-125,-107],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Rectangle_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[250,342.563,0],"to":[0.052,0.198,0],"ti":[0.04,-0.012,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[157.313,250,0],"to":[-0.492,0.145,0],"ti":[0.052,-0.563,0]},{"t":30.0000012219251,"s":[250,157.375,0]}],"ix":2},"a":{"a":0,"k":[-125,-107,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[57,-57],[57,57],[-57,57],[-57,-57]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.38823529411764707,0.6941176470588235,0.9372549019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-125,-107],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Rectangle_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[157.313,250,0],"to":[15.448,-15.438,0],"ti":[-0.079,0.525,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[250,157.375,0],"to":[0.019,-0.125,0],"ti":[-15.448,-15.438,0]},{"t":30.0000012219251,"s":[342.688,250,0]}],"ix":2},"a":{"a":0,"k":[-125,-107,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[57,-57],[57,57],[-57,57],[-57,-57]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3843137254901961,0.47843137254901963,0.8784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-125,-107],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index b012af1..dbe99d3 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -19,10 +19,12 @@ import RUR_IMG12 from "../../public/Images/RUR (12).jpg" import RUR_IMG13 from "../../public/Images/RUR (13).jpg" import RUR_IMG14 from "../../public/Images/RUR (14).jpg" import RUR_IMG15 from "../../public/Images/RUR (15).jpg" + import SPONSOR from "../../public/Images/partners/the-ai-team.png" -import LoadingAnimation from "../../public/animations/RUR.json" -import { Timeline } from "@/components/ui/timeline"; +// import LoadingAnimation from "../../public/animations/RUR.json" +import LoadingAnimation from "../../public/animations/RUR_Loading.json" +import { Timeline } from "@/components/ui/timeline"; import LampLighting from "@/components/ui/lamp"; import { GlareCard } from "@/components/ui/glare-card"; import Image from "next/image"; @@ -43,6 +45,7 @@ import { IContact } from "@/interfaces/IContacts"; import { getReachUs } from "@/services/reachus.service"; import RegistrationStatus from "@/components/ui/google-gemini-effect"; import CodeEvelPara from "@/components/ui/code-evel-para"; +import { HeroVideo } from "@/components/ui/hero-video"; export const products = [ { @@ -195,8 +198,8 @@ const Para = ({ level, name, imgURL, loadCallback }: { level: string, name: stri const AboutSection = ({ content }: { content: string }) => { return ( -
-
+
+

About Are You Ready?

@@ -219,10 +222,14 @@ export default function Home() { const [grid, setGrid] = useState([] as IContact[]); const [isGridLoading, setGridLoading] = useState(true); - const loadingTimeout = ()=>{setTimeout(() => setIsLoadingAnimComplete(true), 1000);} + const loadingTimeout = ()=>{ + console.log("Loading animation timeout"); + setTimeout(() => { + setIsLoadingAnimComplete(true); + }, 2000); +} - useEffect(() => { const fetchData = async () => { @@ -255,6 +262,7 @@ export default function Home() { setTimelineLoading(false); setSponsorsLoading(false); setIsLoading(false); + console.log("Data fetched end"); } }; @@ -272,7 +280,7 @@ export default function Home() { })); const ErrorMessage = ({ message }: { message: string }) => ( -
+
@@ -280,7 +288,7 @@ export default function Home() { ); const EmptyStateMessage = ({ message }: { message: string }) => ( -
+
@@ -296,21 +304,23 @@ export default function Home() { return ( - { ( isLoading || !isLoadingAnimComplete ) && ( + { ( !isLoadingAnimComplete ) && (
)}
+ { + setIsLoadingAnimComplete(true); + }} />
@@ -328,7 +338,7 @@ export default function Home() {
- + {/* */}
{error ? ( diff --git a/src/components/blocks/footer.tsx b/src/components/blocks/footer.tsx index 531a0c4..16ee7c2 100644 --- a/src/components/blocks/footer.tsx +++ b/src/components/blocks/footer.tsx @@ -67,7 +67,7 @@ const Footer = () => {

- © 2024 Rotaract Mora. All Rights Reserved. + © 2024 Rotaract Mora. All Rights Reserved.
); diff --git a/src/components/ui/floating-navbar.tsx b/src/components/ui/floating-navbar.tsx index e73846f..abb07d3 100644 --- a/src/components/ui/floating-navbar.tsx +++ b/src/components/ui/floating-navbar.tsx @@ -46,22 +46,22 @@ export const FloatingNav = ({ logo {/* Desktop Navigation */} -
+
{navItems.map((navItem, idx) => ( - - {navItem.name} - + > + {navItem.name} + ))}
diff --git a/src/components/ui/google-gemini-effect.tsx b/src/components/ui/google-gemini-effect.tsx index 70f9d15..57f9f5d 100644 --- a/src/components/ui/google-gemini-effect.tsx +++ b/src/components/ui/google-gemini-effect.tsx @@ -19,51 +19,48 @@ interface StatusCardProps { const StatusCard: React.FC = ({ title, signUp, signIn, className }) => ( - -

{title}

-
-
- - - Sign Up is {signUp ? 'Open' : 'Closed'} - -
-
- - - Sign In is {signIn ? 'Open' : 'Closed'} - -
-
-
+ +

{title}

+
+
+ + + Sign Up is {signUp ? 'Open' : 'Closed'} + +
+
+ + + Sign In is {signIn ? 'Open' : 'Closed'} + +
+
+
); @@ -73,7 +70,7 @@ const WaveBackground = () => { // Use the container ref for scroll tracking const { scrollYProgress } = useScroll({ target: containerRef, - offset: ["start start", "end end"] + offset: ["start 50%", "end 30%"] }); // Create transformed values for each wave const pathLengths = [ @@ -88,11 +85,10 @@ const WaveBackground = () => {
{ return (
- { initial={{ y: -20, opacity: 0 }} animate={{ y: 0, opacity: 1 }} transition={{ delay: 0.2 }} - viewport={{ once: false }} className="text-4xl md:text-7xl font-bold text-center mb-8 bg-clip-text text-transparent bg-gradient-to-b from-neutral-100 to-neutral-300"> Registration Status @@ -290,8 +284,6 @@ const RegistrationStatus = () => { signIn={status.student.signIn} />
- -
); diff --git a/src/components/ui/hero-parallax.tsx b/src/components/ui/hero-parallax.tsx index 6f6fe6e..a01983b 100644 --- a/src/components/ui/hero-parallax.tsx +++ b/src/components/ui/hero-parallax.tsx @@ -9,7 +9,6 @@ import { } from "framer-motion"; import Image, { StaticImageData } from "next/image"; - export const HeroParallax = ({ products, }: { @@ -28,7 +27,7 @@ export const HeroParallax = ({ offset: ["start start", "end start"], }); - const springConfig = { stiffness: 110, damping: 15, bounce: 100 }; + const springConfig = { stiffness: 110, damping: 15 }; const translateX = useSpring( useTransform(scrollYProgress, [0, 1], [0, 1000]), @@ -38,39 +37,14 @@ export const HeroParallax = ({ useTransform(scrollYProgress, [0, 1], [0, -1000]), springConfig ); - const rotateX = useSpring( - useTransform(scrollYProgress, [0, 0.2], [15, 0]), - springConfig - ); - const opacity = useSpring( - useTransform(scrollYProgress, [0, 0.3], [0.3, 1]), - springConfig - ); - const rotateZ = useSpring( - useTransform(scrollYProgress, [0, 0.2], [20, 0]), - springConfig - ); - const translateY = useSpring( - useTransform(scrollYProgress, [0, 0.2], [-700, 300]), - springConfig - ); - return (
- +
{firstRow.map((product,index) => ( ))} - + {secondRow.map((product,index) => ( ))} - +
); }; export const Header = () => { return ( -
+

Are You Ready?
2025

- The Virtual Odyssey in Corporate Arena + The Virtual Odyssey in Corporate Arena

); @@ -126,7 +100,6 @@ export const ProductCard = ({ }; translate: MotionValue; }) => { - return ( - - {product.title} { - // // addResourceCount(1); - // }} - loading="eager" - /> + {product.title}

{product.title}

); -}; +}; \ No newline at end of file diff --git a/src/components/ui/hero-video.tsx b/src/components/ui/hero-video.tsx new file mode 100644 index 0000000..eb59d4f --- /dev/null +++ b/src/components/ui/hero-video.tsx @@ -0,0 +1,59 @@ +"use client"; +import React, { useEffect, useRef } from 'react'; + + +interface HeroVideoProps { + videoSrc: string; + play: boolean; + onLoadedVideo?: () => void; + title?: string; + subtitle?: string; + overlayOpacity?: number; +} + +export const HeroVideo: React.FC = ({ + videoSrc, + play, + onLoadedVideo, + title = "Are You Ready?", + subtitle = "The Virtual Odyssey in Corporate Arena", + overlayOpacity = 0.5 +}) => { + const videoRef = useRef(null); + + useEffect(() => { + if (play) { + videoRef.current?.play(); + } else { + videoRef.current?.pause(); + } + }, [play]); + + return ( +
+
+ + + ); +}; \ No newline at end of file diff --git a/src/components/ui/timeline.tsx b/src/components/ui/timeline.tsx index f6ec7d2..fa5acb1 100644 --- a/src/components/ui/timeline.tsx +++ b/src/components/ui/timeline.tsx @@ -107,6 +107,7 @@ export const Timeline = ({ data }: { data: ITimelineEntry[] }) => { style={{ height: heightTransform, opacity: opacityTransform, + }} className="absolute inset-x-0 top-0 w-[2px] bg-gradient-to-t from-purple-500 via-blue-500 to-transparent from-[0%] via-[10%] rounded-full" /> diff --git a/tailwind.config.ts b/tailwind.config.ts index ba05823..aa51b2e 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -22,6 +22,8 @@ module.exports = { screens: { 'sm1': '570px', 'sm2': '700px', + 'md': '768px', + 'lg': '1024px', }, extend: { backgroundImage:{ From 3499fb8dcbce2c825f8f38e4cee74191cb6d4153 Mon Sep 17 00:00:00 2001 From: nethmalgunawardhana Date: Sun, 1 Dec 2024 20:51:49 +0530 Subject: [PATCH 14/14] add animated button component for registration prompt --- package-lock.json | 201 +++++++-------------- src/components/ui/google-gemini-effect.tsx | 39 ++++ 2 files changed, 100 insertions(+), 140 deletions(-) diff --git a/package-lock.json b/package-lock.json index f9fdbeb..41baa3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -1358,7 +1357,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1372,7 +1370,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -1381,7 +1378,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -1389,14 +1385,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1554,7 +1548,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1567,7 +1560,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1576,7 +1568,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2652,8 +2643,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -3393,7 +3383,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -4224,7 +4213,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -4449,8 +4437,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/discontinuous-range": { "version": "1.0.0", @@ -4460,8 +4447,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -5548,7 +5534,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5564,7 +5549,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5628,7 +5612,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -6341,7 +6324,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -7039,7 +7021,6 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -7509,7 +7490,6 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -7835,7 +7815,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -7848,8 +7827,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/locate-path": { "version": "6.0.0", @@ -8193,7 +8171,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -8216,7 +8193,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -9222,8 +9198,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -9351,7 +9326,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9360,7 +9334,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -9407,7 +9380,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -9435,7 +9407,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -9452,7 +9423,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -9471,7 +9441,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -9506,7 +9475,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, "engines": { "node": ">=14" }, @@ -9518,7 +9486,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -9543,7 +9510,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -9555,8 +9521,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postgres-array": { "version": "2.0.0", @@ -9798,7 +9763,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -9996,7 +9960,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -10140,7 +10103,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10221,7 +10183,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -10300,7 +10261,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -11052,7 +11012,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -11074,7 +11033,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -11083,7 +11041,6 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -11103,7 +11060,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11221,7 +11177,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11259,7 +11214,6 @@ "version": "3.4.14", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -11618,8 +11572,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tsconfig-paths": { "version": "3.15.0", @@ -12477,8 +12430,7 @@ "@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" }, "@apidevtools/json-schema-ref-parser": { "version": "9.1.2", @@ -12700,7 +12652,8 @@ "@firebase/auth-types": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz", - "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==" + "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==", + "requires": {} }, "@firebase/component": { "version": "0.6.10", @@ -12799,7 +12752,8 @@ "@firebase/firestore-types": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz", - "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==" + "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==", + "requires": {} }, "@firebase/functions": { "version": "0.11.9", @@ -12857,7 +12811,8 @@ "@firebase/installations-types": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz", - "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==" + "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==", + "requires": {} }, "@firebase/logger": { "version": "0.4.3", @@ -12981,7 +12936,8 @@ "@firebase/storage-types": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", - "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==" + "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", + "requires": {} }, "@firebase/util": { "version": "1.10.1", @@ -13139,7 +13095,8 @@ "@heroicons/react": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.5.tgz", - "integrity": "sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==" + "integrity": "sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==", + "requires": {} }, "@humanwhocodes/config-array": { "version": "0.13.0", @@ -13337,7 +13294,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -13347,26 +13303,22 @@ "@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" }, "@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -13448,7 +13400,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -13457,14 +13408,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -14093,7 +14042,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "agent-base": { "version": "7.1.1", @@ -14279,8 +14229,7 @@ "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "2.0.1", @@ -14798,8 +14747,7 @@ "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "caniuse-lite": { "version": "1.0.30001679", @@ -15431,8 +15379,7 @@ "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "csstype": { "version": "3.1.3", @@ -15588,8 +15535,7 @@ "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "discontinuous-range": { "version": "1.0.0", @@ -15599,8 +15545,7 @@ "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "doctrine": { "version": "3.0.0", @@ -16191,7 +16136,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "7.2.2", @@ -16455,7 +16401,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -16468,7 +16413,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -16519,7 +16463,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -17056,7 +16999,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "requires": { "is-glob": "^4.0.3" } @@ -17548,7 +17490,6 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, "requires": { "hasown": "^2.0.2" } @@ -17858,8 +17799,7 @@ "jiti": { "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==" }, "jju": { "version": "1.4.0", @@ -18147,8 +18087,7 @@ "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" }, "limiter": { "version": "1.1.5", @@ -18158,8 +18097,7 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "locate-path": { "version": "6.0.0", @@ -18342,7 +18280,8 @@ "lucide-react": { "version": "0.456.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.456.0.tgz", - "integrity": "sha512-DIIGJqTT5X05sbAsQ+OhA8OtJYyD4NsEMCA/HQW/Y6ToPQ7gwbtujIoeAaup4HpHzV35SQOarKAWH8LYglB6eA==" + "integrity": "sha512-DIIGJqTT5X05sbAsQ+OhA8OtJYyD4NsEMCA/HQW/Y6ToPQ7gwbtujIoeAaup4HpHzV35SQOarKAWH8LYglB6eA==", + "requires": {} }, "make-dir": { "version": "3.1.0", @@ -18431,8 +18370,7 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "meshoptimizer": { "version": "0.18.1", @@ -18449,7 +18387,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "requires": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -19156,8 +19093,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-scurry": { "version": "1.11.1", @@ -19205,7 +19141,8 @@ "pg-pool": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==" + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "requires": {} }, "pg-protocol": { "version": "1.7.0", @@ -19250,14 +19187,12 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, "pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" }, "portfinder": { "version": "1.0.32", @@ -19297,7 +19232,6 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", @@ -19308,7 +19242,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "requires": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -19319,7 +19252,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "requires": { "camelcase-css": "^2.0.1" } @@ -19328,7 +19260,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "requires": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -19337,8 +19268,7 @@ "lilconfig": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==" } } }, @@ -19346,7 +19276,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "requires": { "postcss-selector-parser": "^6.1.1" } @@ -19355,7 +19284,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19364,8 +19292,7 @@ "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "postgres-array": { "version": "2.0.0", @@ -19552,8 +19479,7 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "queue-tick": { "version": "1.0.1", @@ -19661,7 +19587,8 @@ "react-icons": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", - "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==" + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "requires": {} }, "react-is": { "version": "16.13.1", @@ -19702,7 +19629,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "requires": { "pify": "^2.3.0" } @@ -19815,7 +19741,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -19873,8 +19798,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rfdc": { "version": "1.4.1", @@ -19938,7 +19862,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -20480,7 +20403,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -20495,7 +20417,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -20504,7 +20425,6 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -20518,7 +20438,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -20607,13 +20526,13 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "suspend-react": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==" + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "requires": {} }, "sweetalert2": { "version": "11.14.5", @@ -20629,7 +20548,6 @@ "version": "3.4.14", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", - "dev": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -20658,7 +20576,8 @@ "tailwindcss-animate": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==" + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "requires": {} }, "tapable": { "version": "2.2.1", @@ -20914,13 +20833,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", - "dev": true + "dev": true, + "requires": {} }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "tsconfig-paths": { "version": "3.15.0", @@ -21455,7 +21374,8 @@ "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==" + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "requires": {} }, "xdg-basedir": { "version": "4.0.0", @@ -21536,7 +21456,8 @@ "zustand": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==" + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "requires": {} } } } diff --git a/src/components/ui/google-gemini-effect.tsx b/src/components/ui/google-gemini-effect.tsx index 3c5a601..83bf8ef 100644 --- a/src/components/ui/google-gemini-effect.tsx +++ b/src/components/ui/google-gemini-effect.tsx @@ -54,6 +54,42 @@ return ( ); }; +const AnimatedButton2 = ({ children }: { children: React.ReactNode }) => { + const [isHovered, setIsHovered] = useState(false); + + return ( + setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + whileHover={{ scale: 1.05 }} + whileTap={{ scale: 0.95 }} + > + + + {children} + + + ); +}; + + const StatusCard: React.FC = ({ title, signUp, signIn, registrationUrl, className }) => ( = ({ title, signUp, signIn, registra > {title.split(" ")[0]} Registration Opening Soon + + Registration Opening Soon +
)}