diff --git a/apps/web/package.json b/apps/web/package.json index 55eed01f9..d8271767c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -47,6 +47,7 @@ "embla-carousel": "8.1.7", "embla-carousel-react": "8.1.7", "lucide-react": "^0.411.0", + "motion": "^12.38.0", "nanoid": "^5.0.7", "next": "14.2.35", "next-safe-action": "^7.9.3", diff --git a/apps/web/public/img/assets/about/about.webp b/apps/web/public/img/assets/about/about.webp new file mode 100644 index 000000000..19b91989e Binary files /dev/null and b/apps/web/public/img/assets/about/about.webp differ diff --git a/apps/web/public/img/assets/about/about1.webp b/apps/web/public/img/assets/about/about1.webp new file mode 100644 index 000000000..0afca06b5 Binary files /dev/null and b/apps/web/public/img/assets/about/about1.webp differ diff --git a/apps/web/public/img/assets/about/about2.webp b/apps/web/public/img/assets/about/about2.webp new file mode 100644 index 000000000..a55928f2b Binary files /dev/null and b/apps/web/public/img/assets/about/about2.webp differ diff --git a/apps/web/public/img/assets/about/about_photos.webp b/apps/web/public/img/assets/about/about_photos.webp new file mode 100644 index 000000000..b10703b25 Binary files /dev/null and b/apps/web/public/img/assets/about/about_photos.webp differ diff --git a/apps/web/public/img/assets/about/confidential.svg b/apps/web/public/img/assets/about/confidential.svg new file mode 100644 index 000000000..3be79477c --- /dev/null +++ b/apps/web/public/img/assets/about/confidential.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/img/assets/background.webp b/apps/web/public/img/assets/background.webp new file mode 100644 index 000000000..78588958f Binary files /dev/null and b/apps/web/public/img/assets/background.webp differ diff --git a/apps/web/public/img/assets/buttons/blank-tape-stickers1.webp b/apps/web/public/img/assets/buttons/blank-tape-stickers1.webp new file mode 100644 index 000000000..a216030dd Binary files /dev/null and b/apps/web/public/img/assets/buttons/blank-tape-stickers1.webp differ diff --git a/apps/web/public/img/assets/buttons/blank-tape-stickers2.webp b/apps/web/public/img/assets/buttons/blank-tape-stickers2.webp new file mode 100644 index 000000000..69ebe0066 Binary files /dev/null and b/apps/web/public/img/assets/buttons/blank-tape-stickers2.webp differ diff --git a/apps/web/public/img/assets/faq/FAQ.svg b/apps/web/public/img/assets/faq/FAQ.svg new file mode 100644 index 000000000..d81364c37 --- /dev/null +++ b/apps/web/public/img/assets/faq/FAQ.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/public/img/assets/faq/classified.svg b/apps/web/public/img/assets/faq/classified.svg new file mode 100644 index 000000000..3c28ea320 --- /dev/null +++ b/apps/web/public/img/assets/faq/classified.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/img/assets/faq/finger-print.svg b/apps/web/public/img/assets/faq/finger-print.svg new file mode 100644 index 000000000..0621837d8 --- /dev/null +++ b/apps/web/public/img/assets/faq/finger-print.svg @@ -0,0 +1,3233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/img/assets/faq/marker-circle4.svg b/apps/web/public/img/assets/faq/marker-circle4.svg new file mode 100644 index 000000000..a7ffd681d --- /dev/null +++ b/apps/web/public/img/assets/faq/marker-circle4.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/apps/web/public/img/assets/footer/discord_icon.svg b/apps/web/public/img/assets/footer/discord_icon.svg new file mode 100644 index 000000000..7f9a31f02 --- /dev/null +++ b/apps/web/public/img/assets/footer/discord_icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/img/assets/footer/rh-city-logo-black.svg b/apps/web/public/img/assets/footer/rh-city-logo-black.svg new file mode 100644 index 000000000..e19810763 --- /dev/null +++ b/apps/web/public/img/assets/footer/rh-city-logo-black.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/web/public/img/assets/hero/hero.webp b/apps/web/public/img/assets/hero/hero.webp new file mode 100644 index 000000000..233f3bf79 Binary files /dev/null and b/apps/web/public/img/assets/hero/hero.webp differ diff --git a/apps/web/public/img/assets/hero/logo-background.webp b/apps/web/public/img/assets/hero/logo-background.webp new file mode 100644 index 000000000..8c5252af0 Binary files /dev/null and b/apps/web/public/img/assets/hero/logo-background.webp differ diff --git a/apps/web/public/img/assets/hero/marker-circle3.svg b/apps/web/public/img/assets/hero/marker-circle3.svg new file mode 100644 index 000000000..42ee55847 --- /dev/null +++ b/apps/web/public/img/assets/hero/marker-circle3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/img/assets/hero/register/blank-tape-stickers3.webp b/apps/web/public/img/assets/hero/register/blank-tape-stickers3.webp new file mode 100644 index 000000000..1fc26a561 Binary files /dev/null and b/apps/web/public/img/assets/hero/register/blank-tape-stickers3.webp differ diff --git a/apps/web/public/img/assets/hero/rh-logo.svg b/apps/web/public/img/assets/hero/rh-logo.svg new file mode 100644 index 000000000..e19810763 --- /dev/null +++ b/apps/web/public/img/assets/hero/rh-logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/web/public/img/assets/hero/top-secret.svg b/apps/web/public/img/assets/hero/top-secret.svg new file mode 100644 index 000000000..9c6497885 --- /dev/null +++ b/apps/web/public/img/assets/hero/top-secret.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web/public/img/assets/logo_stamp.webp b/apps/web/public/img/assets/logo_stamp.webp new file mode 100644 index 000000000..c6216b40f Binary files /dev/null and b/apps/web/public/img/assets/logo_stamp.webp differ diff --git a/apps/web/public/img/assets/map/SP1.webp b/apps/web/public/img/assets/map/SP1.webp new file mode 100644 index 000000000..1256d12e6 Binary files /dev/null and b/apps/web/public/img/assets/map/SP1.webp differ diff --git a/apps/web/public/img/assets/map/main-campus.webp b/apps/web/public/img/assets/map/main-campus.webp new file mode 100644 index 000000000..ede72a3f2 Binary files /dev/null and b/apps/web/public/img/assets/map/main-campus.webp differ diff --git a/apps/web/public/img/assets/map/map-background.webp b/apps/web/public/img/assets/map/map-background.webp new file mode 100644 index 000000000..f21f2d98a Binary files /dev/null and b/apps/web/public/img/assets/map/map-background.webp differ diff --git a/apps/web/public/img/assets/map/pin4.webp b/apps/web/public/img/assets/map/pin4.webp new file mode 100644 index 000000000..6e743e0ca Binary files /dev/null and b/apps/web/public/img/assets/map/pin4.webp differ diff --git a/apps/web/public/img/assets/map/pin5.webp b/apps/web/public/img/assets/map/pin5.webp new file mode 100644 index 000000000..43c3f3988 Binary files /dev/null and b/apps/web/public/img/assets/map/pin5.webp differ diff --git a/apps/web/public/img/assets/map/red-circle1.svg b/apps/web/public/img/assets/map/red-circle1.svg new file mode 100644 index 000000000..2115c8d6c --- /dev/null +++ b/apps/web/public/img/assets/map/red-circle1.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/apps/web/public/img/assets/menu/menu.webp b/apps/web/public/img/assets/menu/menu.webp new file mode 100644 index 000000000..15773359c Binary files /dev/null and b/apps/web/public/img/assets/menu/menu.webp differ diff --git a/apps/web/public/img/assets/menu/pin1.webp b/apps/web/public/img/assets/menu/pin1.webp new file mode 100644 index 000000000..e65003604 Binary files /dev/null and b/apps/web/public/img/assets/menu/pin1.webp differ diff --git a/apps/web/public/img/assets/red-thread.svg b/apps/web/public/img/assets/red-thread.svg new file mode 100644 index 000000000..941cb588f --- /dev/null +++ b/apps/web/public/img/assets/red-thread.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/web/public/img/assets/silver-pin.svg b/apps/web/public/img/assets/silver-pin.svg new file mode 100644 index 000000000..79e8976d7 --- /dev/null +++ b/apps/web/public/img/assets/silver-pin.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/img/logo/rh-logo-black.svg b/apps/web/public/img/logo/rh-logo-black.svg new file mode 100644 index 000000000..6f130b5e3 --- /dev/null +++ b/apps/web/public/img/logo/rh-logo-black.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/public/img/partner-logos/HEB.svg b/apps/web/public/img/partner-logos/HEB.svg new file mode 100644 index 000000000..0a43d02b7 --- /dev/null +++ b/apps/web/public/img/partner-logos/HEB.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/apps/web/public/img/powered-by-vercel.svg b/apps/web/public/img/powered-by-vercel.svg deleted file mode 100644 index 877828684..000000000 --- a/apps/web/public/img/powered-by-vercel.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/web/public/img/sponsors/empty-paper.svg b/apps/web/public/img/sponsors/empty-paper.svg new file mode 100644 index 000000000..bd7b012cb --- /dev/null +++ b/apps/web/public/img/sponsors/empty-paper.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/img/sponsors/sponsors-background.png b/apps/web/public/img/sponsors/sponsors-background.png new file mode 100644 index 000000000..72e17df98 Binary files /dev/null and b/apps/web/public/img/sponsors/sponsors-background.png differ diff --git a/apps/web/public/img/sponsors/sponsors-background.svg b/apps/web/public/img/sponsors/sponsors-background.svg new file mode 100644 index 000000000..b1220ae65 --- /dev/null +++ b/apps/web/public/img/sponsors/sponsors-background.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/img/sponsors/sponsors-header-background.svg b/apps/web/public/img/sponsors/sponsors-header-background.svg new file mode 100644 index 000000000..35ccf396d --- /dev/null +++ b/apps/web/public/img/sponsors/sponsors-header-background.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css index 69b2adacf..56f554646 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -4,40 +4,40 @@ @layer base { :root { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; + --gradient-color-stops: hsl(var(--hackathon-primary)), transparent; + --bg-image: url("/img/assets/background.webp"); + --background: 28 43% 47%; + --foreground: 0 0% 0%; + --border: 0 0% 0%; + --input: 0 0% 0%; - --nav: 255, 255, 255; - --hackathon-primary: 206 86% 52%; - - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; + --popover: 43.33, 37.5%, 90.59%; + --popover-foreground: 0 0% 0%; - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; + --accent: 7.81, 96.57%, 34.31%; + --accent-foreground: 0 0% 0%; - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; + --primary: 0 0% 0%; + --primary-foreground: 43.33, 37.5%, 90.59%; - --primary: 240 5.9% 10%; - --primary-foreground: 0 0% 98%; + --muted: 7.81, 96.57%, 34.31%; + --muted-foreground: 37.5, 20.51%, 15.29%; - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; + --secondary: 0 0% 0%; + --secondary-foreground: 242 86% 52%; - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; + --radius: 0.5rem; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; + --card: 43.33, 37.5%, 90.59%; + --card-foreground: 0 0% 0%; - --ring: 240 5% 64.9%; + --ring: 7.81, 96.57%, 34.31%; - --radius: 0.5rem; + --destructive: 7.81, 96.57%, 34.31%; + --destructive-foreground: 0 0% 0%; + --nav: 255, 255, 255; + --hackathon-primary: 7.81, 96.57%, 34.31%; --gradient-color-1: #668cff; --gradient-color-2: #3366ff; --gradient-color-3: #002db3; @@ -53,35 +53,40 @@ } .dark { - --background: 240 10% 3.9%; - --foreground: 0 0% 98%; + --gradient-color-stops: hsl(var(--hackathon-primary)), transparent; + --bg-image: url("/img/assets/background.webp"); + --background: 28 43% 47%; + --foreground: 0 0% 0%; + --border: 0 0% 0%; + --input: 0 0% 0%; - --nav: 240 10% 3.9%; + --popover: 43.33, 37.5%, 90.59%; + --popover-foreground: 0 0% 0%; - --muted: 240 3.7% 15.9%; - --muted-foreground: 240 5% 64.9%; + --accent: 7.81, 96.57%, 34.31%; + --accent-foreground: 0 0% 0%; - --popover: 240 10% 3.9%; - --popover-foreground: 0 0% 98%; + --primary: 0 0% 0%; + --primary-foreground: 43.33, 37.5%, 90.59%; - --card: 240 10% 3.9%; - --card-foreground: 0 0% 98%; + --muted: 7.81, 96.57%, 34.31%; + --muted-foreground: 37.5, 20.51%, 15.29%; - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; + --secondary: 0 0% 0%; + --secondary-foreground: 242 86% 52%; - --primary: 0 0% 98%; - --primary-foreground: 240 5.9% 10%; + --radius: 0.5rem; - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; + --card: 43.33, 37.5%, 90.59%; + --card-foreground: 0 0% 0%; - --accent: 240 3.7% 15.9%; - --accent-foreground: 0 0% 98%; + --ring: 7.81, 96.57%, 34.31%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 85.7% 97.3%; + --destructive: 7.81, 96.57%, 34.31%; + --destructive-foreground: 0 0% 0%; + --nav: 255, 255, 255; + --hackathon-primary: 7.81, 96.57%, 34.31%; --ring: 240 3.7% 15.9%; --sidebar-background: 240 5.9% 10%; @@ -109,6 +114,10 @@ body { @apply bg-background text-foreground; + + background-image: var(--bg-image); + background-size: contain; + background-position: center; } } @@ -172,3 +181,7 @@ transform: scale(1.1); } } + +.pin { + z-index: 40 !important; +} diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 71707548c..ca3a3befc 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -1,11 +1,13 @@ import Navbar from "@/components/shared/Navbar"; import Hero from "@/components/landing/Hero"; import About from "@/components/landing/About"; +import Map from "@/components/landing/Map"; import Partners from "@/components/landing/Partners"; import Footer from "@/components/landing/Footer"; import MLHBadge from "@/components/landing/MLHBadge"; - +import FAQ from "@/components/landing/faq"; +import LandingThread from "@/components/landing/LandingThread"; import { Oswald } from "next/font/google"; import WorkWithUs from "@/components/landing/WorkWithUs"; @@ -17,16 +19,19 @@ const oswald = Oswald({ export default function Home() { return (
+ -
+ {/*
*/} - + + {/* */} - +
+ + {/*
*/}
); } diff --git a/apps/web/src/components/landing/About.tsx b/apps/web/src/components/landing/About.tsx index 407df687b..2cda86b2f 100644 --- a/apps/web/src/components/landing/About.tsx +++ b/apps/web/src/components/landing/About.tsx @@ -1,29 +1,189 @@ -import Balancer from "react-wrap-balancer"; -import Image from "next/image"; -import D1 from "../../../public/img/landing/d1.svg"; -import D2 from "../../../public/img/landing/d2.svg"; -import D3 from "../../../public/img/landing/d3.svg"; -import D4 from "../../../public/img/landing/d4.svg"; -import Dino_Coding from "../../../public/img/landing/dinos_coding.png"; +"use client"; +import { Manuale, Shadows_Into_Light } from "next/font/google"; +import { motion } from "motion/react"; +import Pin from "./Pin"; + +const manuale = Manuale({ + subsets: ["latin"], + display: "swap", +}); +const shadow = Shadows_Into_Light({ + subsets: ["latin"], + weight: "400", +}); + +function DossierPins() { + return ( + <> + + + + + + ); +} + export default function About() { - const d1_stylesheet = { - width: "25rem", - height: "auto", - sm: "width: 30rem", - }; return ( -
-
-

- About Section -

-

- Introduce the hackathon and its purpose! Make it sound - enticing -

+
+ +
+
+
+ + + RowdyHacks XII About Us Section + +
+
+

+ What is RowdyHacks? +

+ +
+

+ RowdyHacks is UTSA's annual hackathon, hosted by + the Association for Computing Machinery (ACM) at + UTSA. +
+ It's a weekend-long event where students, tech + enthusiasts, and creative minds from all + backgrounds come together to collaborate, + innovate, and build real-world projects in 24 + hours. +

+ +
+
+ + {/* ===== Desktop ===== */} +
+
+ + + RowdyHacks XII About Us Section + +
+
+

+ What is RowdyHacks? +

+ +
+

+ RowdyHacks is UTSA's annual hackathon, + hosted by the Association for Computing + Machinery (ACM) at UTSA. +
+ It's a weekend-long event where students, + tech enthusiasts, and creative minds from + all backgrounds come together to + collaborate, innovate, and build real-world + projects in 24 hours. +

+ +
+
+ +
+ RowdyHacks XII About Us Section + +
+ +

+ Whether you’ve a seasoned hackathon vet or + you’re just getting started, you’ll feel + right at home at RowdyHacks. Come hang out, + try something new, team up with others, and + bring your ideas to life. There’s plenty of + room to explore, learn as you go, and get + help when you need it. You don’t need to be + an expert, just curious and ready to build. + By the end, you’ll have something real to + show for it, and a few new friends along the + way. +

+ + +
+
+
+
); diff --git a/apps/web/src/components/landing/CreatedWithHackkit.tsx b/apps/web/src/components/landing/CreatedWithHackkit.tsx index 553ded28e..076120a94 100644 --- a/apps/web/src/components/landing/CreatedWithHackkit.tsx +++ b/apps/web/src/components/landing/CreatedWithHackkit.tsx @@ -1,18 +1,26 @@ import Image from "next/image"; import Link from "next/link"; + +import { Shadows_Into_Light } from "next/font/google"; + +const shadowsIntoLight = Shadows_Into_Light({ + weight: "400", + subsets: ["latin"], +}); + export default function CreatedWithHackkit() { return ( -
- + {/* HackKit Logo -
+ /> */} +
Created with HackKit diff --git a/apps/web/src/components/landing/Footer.tsx b/apps/web/src/components/landing/Footer.tsx index 2e801f2ee..55c1491eb 100644 --- a/apps/web/src/components/landing/Footer.tsx +++ b/apps/web/src/components/landing/Footer.tsx @@ -1,32 +1,79 @@ "use client"; -import { type FunctionComponent, useState } from "react"; import Image from "next/image"; +import FooterLinks, { footerSections } from "./FooterLinks"; + +import { Shadows_Into_Light } from "next/font/google"; import Link from "next/link"; -import { Instagram, Facebook, Twitter, Github, Disc } from "lucide-react"; -import Discord from "../../../public/img/landing/discord_icon.svg"; -import CreatedWithHackkit from "@/components/landing/CreatedWithHackkit"; +import { Facebook, Github, Instagram, Twitter } from "lucide-react"; +import CreatedWithHackkit from "./CreatedWithHackkit"; -interface Props { - className?: string; -} +const shadowsIntoLight = Shadows_Into_Light({ + weight: "400", + subsets: ["latin"], +}); export default function Footer() { - const [showResources, setShowResources] = useState(false); - const [showLinks, setShowLinks] = useState(false); - const [showHackathons, setShowHackathons] = useState(false); - return ( -
-
-

- {" "} - Your Footer Here -

-
-
+
+
+
+ RowdyHacks Logo +
+ + {/* links, resources, other hackatons */} +
+ {footerSections.map((section) => ( + + ))} +
+ + {/* icons */} + +
+ + + + + + + + + + + + + + Discord logo + +
+ + +

+ Made with </> & ♥ @ RowdyHacks +
© RowdyHacks & Association of Computing Machinery + at UTSA 2026. All Rights Reserved. +

-
+ ); } diff --git a/apps/web/src/components/landing/FooterLinks.tsx b/apps/web/src/components/landing/FooterLinks.tsx new file mode 100644 index 000000000..82d56610e --- /dev/null +++ b/apps/web/src/components/landing/FooterLinks.tsx @@ -0,0 +1,104 @@ +"use client"; + +import { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuItem, + DropdownMenuContent, +} from "../shadcn/ui/dropdown-menu"; +import Link from "next/link"; + +import { Shadows_Into_Light } from "next/font/google"; + +const shadowsIntoLight = Shadows_Into_Light({ + weight: "400", + subsets: ["latin"], +}); + +const resources = [ + { name: "Register", link: "/auth" }, + { name: "FAQ", link: "/faq" }, + { name: "Code of Conduct", link: "https://mlh.io/code-of-conduct" }, + { name: "Contact Us", link: "/contact" }, + { name: "ACM-W", link: "https://acmutsa.org/suborg_acmw/" }, + { name: "ACM UTSA", link: "https://acmutsa.org/" }, +] as const; + +const links = [ + { name: "Open Source", link: "https://github.com/acmutsa/rowdyHacksXI" }, +] as const; + +const hackathons = [ + { name: "CodeQuantum", link: "https://cqhacks.org/" }, + { name: "RowdyDatathon", link: "https://rowdydatathon.org/" }, + { name: "TAMUhack", link: "https://tamuhack.com/" }, + { name: "WEHack", link: "https://wehackutd.com/" }, + { name: "HackUTD", link: "https://hackutd.co/" }, + { name: "HackTX", link: "https://hacktx.com/" }, + { name: "HackUNT", link: "https://unthackathon.com/#/" }, + { name: "HackUTA", link: "https://hackuta.org/" }, + { name: "Hacklahoma", link: "https://hacklahoma.org/" }, +] as const; + +export default function FooterLinks({ + title, + data, +}: { + title: string; + data: Readonly<{ name: string; link: string }[]>; +}) { + return ( + <> + {/* mobile */} +
+ + + + {title} + + + + {data.map(({ name, link }, idx) => ( + + + {name} + + + ))} + + +
+ + {/* desktop */} +
+

+ {title} +

+ {data.map(({ link, name }, idx) => ( + + + {name} + + + ))} +
+ + ); +} + +export const footerSections = [ + { title: "Resources", data: resources }, + { title: "Links", data: links }, + { title: "Other Hackathons", data: hackathons }, +] as const; diff --git a/apps/web/src/components/landing/Hero.tsx b/apps/web/src/components/landing/Hero.tsx index 59d5c7da8..18e2cf853 100644 --- a/apps/web/src/components/landing/Hero.tsx +++ b/apps/web/src/components/landing/Hero.tsx @@ -1,56 +1,187 @@ -import Image from "next/image"; -import Link from "next/link"; -import { Button } from "../shadcn/ui/button"; +"use client"; + +import { Manuale, Shadows_Into_Light } from "next/font/google"; +import { motion } from "motion/react"; +import Pin from "@/components/landing/Pin"; + +const line1 = "Heist"; +const line2 = "starts at 9:00"; + +const shadows = Shadows_Into_Light({ + subsets: ["latin"], + variable: "--font-shadows", + weight: "400", +}); +const manuale = Manuale({ + subsets: ["latin"], + weight: "500", +}); + + +function DossierPins() { + return ( + <> + + + + + + + + ); +} export default function Hero() { return ( -
-
-
-
-
-
-
- HackKit Logo -
-
-

- Hack -
- Kit -

-
+ <> +
+ + +
+ + + {/* top-secret: animated pop-in (moved from commented code) */} +
+ +
+ +
+
-

- Feature-packed Hackathon managment software{" "} - that just works. -

+
+ +
+
+ +
+ + {/* Heist / starts at 9:00: per-character fade-up (moved from commented code) */} +
+

+ {line1.split("").map((char, i) => ( + + {char} + + ))} +

+

+ {line2.split("").map((char, i) => ( + + {char} + + ))} +

+
+
+ +
+ +

+ Help Wanted +

-
-
- - - - - - - - - -
-
-
-
+
+ +

+ Register +

+
+
+ +

+ Mentors +

+
+
+ +

+ Judges +

+
+
+ +

+ Volunteers +

+
+ +
+ ); } diff --git a/apps/web/src/components/landing/LandingThread.tsx b/apps/web/src/components/landing/LandingThread.tsx new file mode 100644 index 000000000..6ab1a71e4 --- /dev/null +++ b/apps/web/src/components/landing/LandingThread.tsx @@ -0,0 +1,9 @@ +"use client"; + +import { useEffect } from "react"; +import { mountLandingThread } from "@/lib/utils/client/thread"; + +export default function LandingThread() { + useEffect(() => mountLandingThread(), []); + return null; +} diff --git a/apps/web/src/components/landing/MLHBadge.tsx b/apps/web/src/components/landing/MLHBadge.tsx index 7c0e49c6d..874c4d2d7 100644 --- a/apps/web/src/components/landing/MLHBadge.tsx +++ b/apps/web/src/components/landing/MLHBadge.tsx @@ -4,11 +4,13 @@ import Image from "next/image"; export default function MLHBadge() { return ( <> -
+
@@ -22,24 +24,6 @@ export default function MLHBadge() { />
-
- - Major League Hacking 2025 Hackathon Season - -
); } diff --git a/apps/web/src/components/landing/Map.tsx b/apps/web/src/components/landing/Map.tsx new file mode 100644 index 000000000..6f4e56969 --- /dev/null +++ b/apps/web/src/components/landing/Map.tsx @@ -0,0 +1,284 @@ +"use client"; +import Image from "next/image"; +import { useRef } from "react"; +import { Shadows_Into_Light } from "next/font/google"; +import Pin from "@/components/landing/Pin"; +import { findPosition } from "@/hooks/findPosition"; +import { motion } from "motion/react"; + +const line1 = "CONNECTED?"; +const line2_1 = "UTSA"; +const line2_2 = "Main Campus"; +const line3_1 = "UTSA"; +const line3_2 = "San Pedro 1"; +const line3_3 = "(Place of action)"; + +const shadowsIntoLight = Shadows_Into_Light({ + weight: "400", + subsets: ["latin"], + variable: "--font-shadows", +}); + +export default function Map() { + const mapContainerRef = useRef(null); + const mapImgRef = useRef(null); + const mainCampusCardRef = useRef(null); + const mainCampusImgRef = useRef(null); + const sp1CardRef = useRef(null); + const sp1CampusImgRef = useRef(null); + + const sp1PinStyle = findPosition( + mapContainerRef, + mapImgRef, + { x: 0.54, y: 0.75 }, + 20, + ); + const sp1TextStyle = findPosition( + mapContainerRef, + mapImgRef, + { x: 0.46, y: 0.82 }, + 10, + ); + const sp1CircleStyle = findPosition( + mapContainerRef, + mapImgRef, + { x: 0.54, y: 0.77 }, + 10, + ); + const sp1CardTextStyle = findPosition( + sp1CardRef, + sp1CampusImgRef, + { x: 0.3, y: 0.87 }, + 20, + ); + + const mainCampusPinStyle = findPosition( + mapContainerRef, + mapImgRef, + { x: 0.31, y: 0.22 }, + 20, + ); + const mainCampusTextStyle = findPosition( + mapContainerRef, + mapImgRef, + { x: 0.3, y: 0.29 }, + 10, + ); + const mainCampusCircleStyle = findPosition( + mapContainerRef, + mapImgRef, + { x: 0.31, y: 0.24 }, + 10, + ); + const mainCampusCardTextStyle = findPosition( + mainCampusCardRef, + mainCampusImgRef, + { x: 0.4, y: 0.87 }, + 20, + ); + + const connectedStyle = findPosition( + mapContainerRef, + mapImgRef, + { x: 0.48, y: 0.5 }, + 10, + ); + + return ( +
+
+
+ {/* Pictures */} + +
+
+
+ main campus +
+ +
+
+

+ Target 2 +

+
+
+
+ +
+
+ sp1 +
+ +
+ +
+

+ SP1 - Target 1 +

+
+
+
+
+ + +
+
+
+ ); +} diff --git a/apps/web/src/components/landing/PartnerCard.tsx b/apps/web/src/components/landing/PartnerCard.tsx index 436873b92..32a70c657 100644 --- a/apps/web/src/components/landing/PartnerCard.tsx +++ b/apps/web/src/components/landing/PartnerCard.tsx @@ -1,6 +1,8 @@ import React from "react"; import Link from "next/link"; import Image from "next/image"; +import { Manuale } from "next/font/google"; +import Pin from "./Pin"; type Partner = { name: string; @@ -9,78 +11,60 @@ type Partner = { tier: string; }; -type colorMap = { - key: string; - value: string; -}; - -// const tierBorderMap = { -// [Tier.Title]: "w-[15rem] sm:w-72 md:w-72 lg:w-80 2xl:w-[19rem]", -// [Tier.Gold]: "w-[12.75rem] sm:w-[14.75rem] md:w-[16rem] lg:w-72 2xl:w-[19rem]", -// [Tier.Silver]: "w-[11rem] sm:w-52 md:w-60 lg:w-[16rem] 2xl:w-[17rem] ", -// [Tier.Bronze]: "w-32 sm:w-40 md:w-[12rem] lg:w-[14rem] 2xl:w-[16rem]", -// [Tier.Rowdy_Partner]: "w-[7rem] sm:w-32 md:w-40 lg:w-[11rem] 2xl:w-[13rem]", -// [Tier.In_Kind_Partner]: "w-[6rem] sm:w-[7rem] md:w-32 lg:w-40 2xl:w-52", -// }; - -const tierColorMap: { [key: string]: string } = { - ["Title Sponsor"]: "text-purple-500", - ["Gold Sponsor"]: "text-yellow-600", - ["Silver Sponsor"]: "text-gray-400", - ["Bronze Sponsor"]: "text-amber-800", - ["Rowdy Partner"]: "text-blue-500", - ["Rowdy In-Kind"]: "text-red-500", -}; +const manuale = Manuale({ + weight: ["300", "400", "500", "600", "700", "800"], + subsets: ["latin"], + variable: "--font-manuale", +}); function PartnerCard({ partner, is_title, + index, }: { partner: Partner; is_title: boolean; + index: number; }) { - const text: string = is_title - ? "text-2xl sm:text-3xl xl:text-4xl 2xl:text-[3rem]" - : "text-md sm:text-lg lg:text-xl xl:text-2xl 2xl:text-3xl"; - - const height: string = is_title - ? "h-[15rem] sm:h-[15rem] md:h-[16rem] lg:h-[20rem] xl:h-[20rem] 2xl:h-[22rem]" - : "h-[9rem] sm:h-[11rem] md:h-[11rem] lg:h-[12rem] xl:h-[14rem] 2xl:h-[17rem]"; - const image: string = is_title - ? "w-[17rem] sm:w-[17rem] md:w-[18rem] xl:w-[20rem] 2xl:w-[24rem]" - : "w-[8rem] sm:w-[10rem] md:w-[14rem] lg:w-48 xl:w-[16rem]"; - + const padding: string[] = [ + "pl-[15vh] pt-[0vh] pb-[2vh] lg:pt-[0vh] xl:pt-[5vh] xl:pb-[0vh] 2xl:pl-[3vh] 2xl:pt-[7vh] 2xl:pb-[0vh]", + "pl-[1vh] pr-[30vw] pt-[0vh] pb-[2vh] lg:pt-[0vh] lg:pr-[2vw] xl:pt-[2vh] xl:pr-[2vw] 2xl:pl-[0vw] 2xl:pr-[0vw] ", + "pl-[1vh] pr-[30vw] pt-[0vh] pb-[0vh] md:pr-[2vw] lg:pr-[30vw] xl:pr-[40vw] xl:pt-[0vh] xl:pb-[2vh] 2xl:pr-[0vw] 2xl:pb-[7vh]", + "pl-[1vh] pt-[5vh] pb-[0vh] md:pt-[15vh] lg:pt-[5vh] lg:pb-[0vh] lg:pb-[4vh] xl:pr-[3vw] xl:pt-[0vh] xl:pb-[6vh] 2xl:pl-[0vw] 2xl:pr-[0vw]", + "pl-[1vh] pt-[0vh] pb-[6vh] md:pr-[4vw] lg:pt-[0vh] lg:pb-[5vh] lg:pr-[4vw] xl:pr-[4vw] xl:pt-[6vh] xl:pb-[0vh] 2xl:pr-[33vw]", + "pl-[1vh] pt-[0vh] pb-[4vh] xl:pt-[5vh] 2xl:pb-[0vh] 2xl:pt-[7vh]", + "pl-[1vh] pb-[2vh]", + ]; return ( -
- {`${partner?.name} +
+ +
+
+ {partner.logo ? ( + {`${partner.name} + ) : ( + + Logo + + )} +
+ +
+
-

- {partner?.name} -

-

- {partner?.tier} -

); } diff --git a/apps/web/src/components/landing/Partners.tsx b/apps/web/src/components/landing/Partners.tsx index 9b8bb203b..44ab7f922 100644 --- a/apps/web/src/components/landing/Partners.tsx +++ b/apps/web/src/components/landing/Partners.tsx @@ -1,6 +1,19 @@ import partnerData from "./partners.json"; import PartnerCard from "./PartnerCard"; import Image from "next/image"; +import { Manuale, Shadows_Into_Light } from "next/font/google"; +import Pin from "./Pin"; + +const shadowsIntoLight = Shadows_Into_Light({ + weight: "400", + subsets: ["latin"], + variable: "--font-shadows", +}); + +const manuale = Manuale({ + subsets: ["latin"], + display: "swap", +}); type Partner = { name: string; @@ -9,41 +22,88 @@ type Partner = { tier: string; }; -export default async function Partners() { - // Christian Walker: Aware of weird bug from 1280px to 1286 px where background dissapears - const marathon: Partner = { - name: "Marathon", - logo: "marathon_logo.svg", - url: "https://www.marathonpetroleum.com/", - tier: "Title Sponsor", - }; +function DossierPins() { + return ( + <> + + + + + + ); +} + +export default async function Partners() { return ( -
-
-

- Partners Sections -

-

- { - "See the Partners Component inside components/landing/Partners for an example" - } -

+
+ + +
+ +
+ +

+ Sponsors +

+
+ +
+ +

+ Coming Soon +

+
+ + {/*
+
+ sponsors-background +
+ +
+ {partnerData.partners.map( + (partner: Partner, index: number) => ( + + ), + )} + {Array.from({ length: 6 }, (_, index) => ( + + ))} +
+
*/}
- {/* Example Code of what our previous partner section looked like */} - {/*

- A Huge Thanks To Our Rowdyhacks Partners! -

- -
- -
- -
- {partnerData.partners.map((partner: Partner) => ( - - ))} -
*/}
); } diff --git a/apps/web/src/components/landing/Pin.tsx b/apps/web/src/components/landing/Pin.tsx new file mode 100644 index 000000000..e496d07b7 --- /dev/null +++ b/apps/web/src/components/landing/Pin.tsx @@ -0,0 +1,26 @@ +import Image from "next/image"; + +export default function Pin({ + name = "/img/assets/silver-pin.svg", + size = 25, + className = "", + no_thread = false, +}: { + name?: string; + size?: number; + className?: string; + no_thread?: boolean; + maxSize?: number; +}) { + return ( + + ); +} diff --git a/apps/web/src/components/landing/WorkWithUs.tsx b/apps/web/src/components/landing/WorkWithUs.tsx index 842c6e243..563db0ccc 100644 --- a/apps/web/src/components/landing/WorkWithUs.tsx +++ b/apps/web/src/components/landing/WorkWithUs.tsx @@ -1,6 +1,6 @@ export default function WorkWithUs() { return ( -
+

Work With Us Section

diff --git a/apps/web/src/components/landing/faq.json b/apps/web/src/components/landing/faq.json new file mode 100644 index 000000000..4a2fdac3d --- /dev/null +++ b/apps/web/src/components/landing/faq.json @@ -0,0 +1,28 @@ +{ + "faq": [ + { + "question": "Who can attend?", + "answer": "All students can sign up to be a hacker. Regardless of your experience, education, or background, as long as you are excited about learning, building, and having fun, we'd love for you to attend." + }, + { + "question": "When is the deadline to apply?", + "answer": "The deadline for registration is , at 23:59." + }, + { + "question": "How much experience do I need?", + "answer": "Absolutely zero! We want you here because you have a passion for creating, not because you're the most experienced hacker on the block. We'll have lots of resources including workshops and a bunch of mentors to help beginners get started. There'll also be plenty of people to learn from and help out!" + }, + { + "question": "How much does it cost?", + "answer": "Nothing. Nada. Zilch. It's completely free for all accepted hackers. To make it even better, we'll be giving out a ton of swag to every hacker, and prizes to our winners." + }, + { + "question": "What should I bring?", + "answer": "Please bring a valid ID in addition to anything that would help you with creating your hack or making you comfortable. A laptop, charger, mouse, keyboard, hardware, light jacket, and any hygienic products should be helpful. Don't bring anything you wouldn't bring on an airplane." + }, + { + "question": "How do teams work?", + "answer": "Teams are limited to 1-4 hackers. If you have a team in mind, make sure all members submit an application before the deadline. If you don't have a team and would like to be a part of one, no worries! We'll have a dedicated time for team formation after the opening ceremony." + } + ] +} diff --git a/apps/web/src/components/landing/faq.tsx b/apps/web/src/components/landing/faq.tsx new file mode 100644 index 000000000..8d1090502 --- /dev/null +++ b/apps/web/src/components/landing/faq.tsx @@ -0,0 +1,167 @@ +"use client"; +import { Manuale } from "next/font/google"; +import faqData from "./faq.json"; +import { motion } from "motion/react"; +import Pin from "./Pin"; + +const manuale = Manuale({ + subsets: ["latin"], + display: "swap", +}); + +type Faq = { question: string; answer: string }; + +const LEFT_COUNT = 4; +const allFaqs = faqData.faq as Faq[]; +const leftFaqs = allFaqs.slice(0, LEFT_COUNT); +const rightFaqs = allFaqs.slice(LEFT_COUNT); + +function DossierPins() { + return ( + <> + + + + + ); +} + +function PaperBg() { + return ( + + ); +} + +function FaqHeader() { + return ( +
+ +

+ FAQ +

+
+ ); +} + +function ClassifiedStamp({ + wrapperClassName = "relative flex justify-end pr-[5%] pb-[5%]", +}: { + wrapperClassName?: string; +}) { + return ( +
+ +
+ ); +} + +function FaqItem({ item }: { item: Faq }) { + return ( + +
+

+ {item.question} +

+ +
+

+ {item.answer} +

+
+ ); +} + +/* ---------- Page ---------- */ + +export default function FAQ() { + return ( +
+ +
+ {/* ===== Desktop & Tablet ===== */} +
+ {/* Left paper */} +
+
+ + + {leftFaqs.map((item, index) => ( + + ))} +
+
+ + {/* Right paper */} +
+
+ + + {rightFaqs.map((item, index) => ( + + ))} +
+
+
+ + {/* ===== Mobile ===== */} +
+
+ + +
+ + +
+ + {allFaqs.map((item, index) => ( + + ))} +
+
+
+
+ ); +} diff --git a/apps/web/src/components/landing/partners.json b/apps/web/src/components/landing/partners.json index fc654015b..17ec4b4b7 100644 --- a/apps/web/src/components/landing/partners.json +++ b/apps/web/src/components/landing/partners.json @@ -1,142 +1,28 @@ { "partners": [ { - "name": "Cymanii", - "logo": "CyManII_Logo.svg", - "url": "https://cymanii.org/", - "tier": "Gold Sponsor" - }, - { - "name": "UTSA DS Dept.", - "logo": "UTSADS.svg", - "url": "https://sds.utsa.edu/", - "tier": "Gold Sponsor" - }, - { - "name": "Swivel", - "logo": "swivel_logo.svg", - "url": "https://www.getswivel.io/", - "tier": "Silver Sponsor" - }, - { - "name": "UTSA CS Dept.", - "logo": "UTSA_CS.svg", - "url": "https://sciences.utsa.edu/computer-science/", - "tier": "Silver Sponsor" - }, - { - "name": "Frost Bank", - "logo": "FrostBank.svg", - "url": "https://www.frostbank.com/", - "tier": "Silver Sponsor" - }, - { - "name": "Valero", - "logo": "ValeroLogo.svg", - "url": "https://www.valero.com/", - "tier": "Silver Sponsor" - }, - { - "name": "Google", - "logo": "Google_Icon.svg", - "url": "https://about.google/", - "tier": "Bronze Sponsor" - }, - { - "name": "Paycom", - "logo": "PaycomLogo.svg", - "url": "https://www.paycom.com/", - "tier": "Bronze Sponsor" + "name": "H-E-B", + "logo": "HEB.svg", + "url": "https://www.heb.com/", + "tier": "title" }, { "name": "Dell", - "logo": "Dell_Tech_Logo.svg", + "logo": "dell.svg", "url": "https://www.dell.com/", - "tier": "Bronze Sponsor" - }, - { - "name": "S + S", - "logo": "Students_and_Startups.svg", - "url": "https://studentsstartups.com/", - "tier": "Bronze Sponsor" - }, - { - "name": "AFCS", - "logo": "AFCSLogo.svg", - "url": "https://afciviliancareers.com/", - "tier": "Bronze Sponsor" - }, - { - "name": "Accenture", - "logo": "Accenture-logo.svg", - "url": "https://www.accenture.com/", - "tier": "Rowdy Partner" - }, - { - "name": "UTSA COE", - "logo": "UTSA_COE.svg", - "url": "https://klesse.utsa.edu/", - "tier": "Rowdy Partner" - }, - { - "name": "UTSA Tech Store", - "logo": "rowdy_tech_logo.svg", - "url": "https://campustechnologystore.com/campustechnologystore/", - "tier": "Rowdy Partner" - }, - { - "name": "TD Synnex", - "logo": "TD_Synnex_logo.svg", - "url": "https://www.tdsynnex.com/", - "tier": "Rowdy Partner" - }, - { - "name": "Wolfram Alpha", - "logo": "wolfram_logo.svg", - "url": "https://www.wolframalpha.com/", - "tier": "Rowdy Partner" - }, - { - "name": "CodePath", - "logo": "Codepath_logo.svg", - "url": "https://www.codepath.org/", - "tier": "Rowdy Partner" + "tier": "golden" }, { - "name": "ACM", - "logo": "ACM_logo.svg", - "url": "https://www.acm.org/", - "tier": "Rowdy Partner" - }, - { - "name": "Artea", - "logo": "Artea_logo.svg", - "url": "https://www.drinkartea.com/", - "tier": "Rowdy In-Kind" - }, - { - "name": "Pho Thien An", - "logo": "Pho_logo.svg", - "url": "https://www.phothienan.com/", - "tier": "Rowdy In-Kind" - }, - { - "name": "Bunz Burgers", - "logo": "Bunz_logo.svg", - "url": "https://www.tastybunz.com/", - "tier": "Rowdy In-Kind" - }, - { - "name": "H-E-B", - "logo": "HEB.svg", - "url": "https://www.heb.com/", - "tier": "Rowdy In-Kind" + "name": "Apple", + "logo": "apple.svg", + "url": "https://www.apple.com/", + "tier": "silver" }, { - "name": "Six Flags", - "logo": "Six_Flags_logo.svg", - "url": "https://www.sixflags.com/fiestatexas", - "tier": "Rowdy In-Kind" + "name": "google", + "logo": "google.svg", + "url": "https://www.google.com/", + "tier": "bronze" } ] } diff --git a/apps/web/src/components/shared/MobileNavbarMenu.tsx b/apps/web/src/components/shared/MobileNavbarMenu.tsx new file mode 100644 index 000000000..cf7855198 --- /dev/null +++ b/apps/web/src/components/shared/MobileNavbarMenu.tsx @@ -0,0 +1,51 @@ +import Link from "next/link"; +import { Menu } from "lucide-react"; +import { Button } from "../shadcn/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "../shadcn/ui/dropdown-menu"; +import MobileNavBarLinks from "./MobileNavBarLinks"; + +export default function MobileNavbarMenu({ + isLoggedIn, +}: { + isLoggedIn: boolean; +}) { + return ( +
+ + + + + + + {!isLoggedIn && ( + <> + + + Sign In + + + Register + + + )} + + +
+ ); +} diff --git a/apps/web/src/components/shared/Navbar.tsx b/apps/web/src/components/shared/Navbar.tsx index b4ea48a85..d8e295198 100644 --- a/apps/web/src/components/shared/Navbar.tsx +++ b/apps/web/src/components/shared/Navbar.tsx @@ -8,6 +8,17 @@ import NavBarLinksGrouper from "./NavBarLinksGrouper"; import { Oswald } from "next/font/google"; import { cn } from "@/lib/utils/client/cn"; import { getUser } from "db/functions"; +import { Manuale, Shadows_Into_Light } from "next/font/google"; +import MobileNavbarMenu from "./MobileNavbarMenu"; + +const manuale = Manuale({ + subsets: ["latin"], + display: "swap", +}); +const shadow = Shadows_Into_Light({ + subsets: ["latin"], + weight: "400", +}); const oswald = Oswald({ variable: "--font-oswald", @@ -23,37 +34,44 @@ export default async function Navbar({ className }: NavbarProps) { const registrationIsComplete = user != null && (await getUser(user.id)) != undefined; return ( -
+
-
-
+
+
+ {c.hackathonName +
+ +
- {c.hackathonName - {/*
*/} -

- {c.hackathonName} -

+ {/* TODO: add rh logo */} -
+ +
-
-
+
+ +
{user ? ( <> - + )}
- + {user && } +
+ right side pin +
diff --git a/apps/web/src/components/shared/NavbarItem.tsx b/apps/web/src/components/shared/NavbarItem.tsx index 5741787ce..bb3bfc207 100644 --- a/apps/web/src/components/shared/NavbarItem.tsx +++ b/apps/web/src/components/shared/NavbarItem.tsx @@ -9,7 +9,7 @@ export default function NavbarItem({ children, link }: NavbarItemProps) { return ( {children} diff --git a/apps/web/src/hooks/findPosition.ts b/apps/web/src/hooks/findPosition.ts new file mode 100644 index 000000000..231d67cab --- /dev/null +++ b/apps/web/src/hooks/findPosition.ts @@ -0,0 +1,61 @@ +import { useLayoutEffect, useState, RefObject } from "react"; + +export function findPosition( + containerRef: RefObject, + imageRef: RefObject, + item: { x: number; y: number }, + zIndex: number, +) { + const [style, setStyle] = useState({}); + + useLayoutEffect(() => { + const img = imageRef.current; + const el = containerRef.current; + if (!img || !el) return; + + const calculate = () => { + const ratio = img.naturalWidth / img.naturalHeight; + if (!ratio) return; + + const { width: cw, height: ch } = el.getBoundingClientRect(); + const containerRatio = cw / ch; + + let imgW: number, imgH: number, offsetX: number, offsetY: number; + if (containerRatio > ratio) { + imgH = ch; + imgW = ch * ratio; + offsetX = (cw - imgW) / 2; + offsetY = 0; + } else { + imgW = cw; + imgH = cw / ratio; + offsetX = 0; + offsetY = (ch - imgH) / 2; + } + + setStyle({ + position: "absolute" as const, + left: offsetX + imgW * item.x, + top: offsetY + imgH * item.y, + transform: "translate(-50%, -100%)", + zIndex: zIndex, + }); + }; + + if (img.complete) { + calculate(); + } else { + img.addEventListener("load", calculate); + } + + const observer = new ResizeObserver(calculate); + observer.observe(el); + + return () => { + img.removeEventListener("load", calculate); + observer.disconnect(); + }; + }, [containerRef]); + + return style; +} diff --git a/apps/web/src/lib/utils/client/thread.ts b/apps/web/src/lib/utils/client/thread.ts new file mode 100644 index 000000000..f0de29dbb --- /dev/null +++ b/apps/web/src/lib/utils/client/thread.ts @@ -0,0 +1,196 @@ +type ThreadOptions = { + threadSrc?: string; + segmentWidth?: number; + segmentHeight?: number; + stepRatio?: number; + extraTrim?: number; + opacity?: number; + blur?: number; +}; + +export function connectElementsWithThread( + className: string, + options: ThreadOptions = {}, +): void { + "use client"; + const { + threadSrc = "./thread.svg", + segmentWidth = 32, + segmentHeight = 12, + stepRatio = 0.55, + extraTrim = 1, + opacity = 0.95, + blur = 0, + } = options; + + let svg = document.getElementById( + "pixel-string-overlay", + ) as SVGSVGElement | null; + + if (!svg) { + svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + svg.setAttribute("id", "pixel-string-overlay"); + + Object.assign(svg.style, { + position: "absolute", + left: "0", + top: "0", + pointerEvents: "none", + zIndex: "39", + overflow: "visible", + }); + + document.body.appendChild(svg); + } + + const documentWidth = document.documentElement.scrollWidth; + const documentHeight = document.documentElement.scrollHeight; + const dropShadow = "drop-shadow(6px 8px 3px rgba(0, 0, 0, 0.45))"; + svg.setAttribute("viewBox", `0 0 ${documentWidth} ${documentHeight}`); + svg.setAttribute("width", String(documentWidth)); + svg.setAttribute("height", String(documentHeight)); + svg.style.width = `${documentWidth}px`; + svg.style.height = `${documentHeight}px`; + svg.innerHTML = ""; + svg.style.filter = blur > 0 ? `blur(${blur}px) ${dropShadow}` : dropShadow; + + const elements = [ + ...document.querySelectorAll(`.${className}`), + ].filter((element) => { + const style = window.getComputedStyle(element); + const rect = element.getBoundingClientRect(); + return ( + style.display !== "none" && + style.visibility !== "hidden" && + rect.width > 0 && + rect.height > 0 + ); + }); + if (elements.length < 2) return; + + const points = elements.map((el) => { + const rect = el.getBoundingClientRect(); + return { + x: rect.left + window.scrollX + rect.width / 2, + y: rect.top + window.scrollY + rect.height / 2, + r: Math.max(rect.width, rect.height) / 2, + }; + }); + + for (let i = 0; i < points.length - 1; i++) { + const a = points[i]; + const b = points[i + 1]; + + let dx = b.x - a.x; + let dy = b.y - a.y; + let length = Math.hypot(dx, dy); + if (!length) continue; + + const ux = dx / length; + const uy = dy / length; + const angle = (Math.atan2(dy, dx) * 180) / Math.PI; + + // Trim only to the dot edge, plus a tiny extra amount + const trimStart = a.r + extraTrim; + const trimEnd = b.r + extraTrim; + + if (length <= trimStart + trimEnd) continue; + + const startX = a.x + ux * trimStart; + const startY = a.y + uy * trimStart; + const endX = b.x - ux * trimEnd; + const endY = b.y - uy * trimEnd; + + dx = endX - startX; + dy = endY - startY; + length = Math.hypot(dx, dy); + + const step = segmentWidth * stepRatio; + const count = Math.max(1, Math.ceil(length / step)); + + for (let j = 0; j <= count; j++) { + const dist = Math.min(j * step, length); + const t = dist / length; + + const x = startX + dx * t; + const y = startY + dy * t; + + const img = document.createElementNS( + "http://www.w3.org/2000/svg", + "image", + ); + img.setAttributeNS( + "http://www.w3.org/1999/xlink", + "href", + threadSrc, + ); + img.setAttribute("href", threadSrc); + img.setAttribute("width", segmentWidth as unknown as string); + img.setAttribute("height", segmentHeight as unknown as string); + img.setAttribute("preserveAspectRatio", "none"); + img.setAttribute("opacity", String(opacity)); + + // Center each thread segment on the sampled point + img.setAttribute( + "transform", + `translate(${x}, ${y}) rotate(${angle}) translate(${-segmentWidth / 2}, ${-segmentHeight / 2})`, + ); + + svg.appendChild(img); + } + } +} + +function responsiveSegmentHeight(): number { + const w = window.innerWidth; + if (w >= 1024) return 18; // lg + if (w >= 768) return 14; // md + if (w >= 640) return 11; // sm + return 8; // base +} + +export function redrawThread(): void { + connectElementsWithThread("pin", { + threadSrc: "/img/assets/red-thread.svg", + segmentWidth: 32, + segmentHeight: responsiveSegmentHeight(), + stepRatio: 0.5, + extraTrim: 7, + opacity: 0.95, + blur: 0, + }); +} + +//! This is how to use it +export function mountLandingThread(): () => void { + let animationFrame: number | null = null; + let mounted = true; + const scheduleRedraw = () => { + if (animationFrame !== null) return; + animationFrame = window.requestAnimationFrame(() => { + animationFrame = null; + redrawThread(); + }); + }; + + scheduleRedraw(); + window.addEventListener("resize", scheduleRedraw); + + const resizeObserver = new ResizeObserver(scheduleRedraw); + resizeObserver.observe(document.documentElement); + document + .querySelectorAll(".pin") + .forEach((pin) => resizeObserver.observe(pin)); + document.fonts.ready.then(() => { + if (mounted) scheduleRedraw(); + }); + + return () => { + mounted = false; + window.removeEventListener("resize", scheduleRedraw); + resizeObserver.disconnect(); + if (animationFrame !== null) + window.cancelAnimationFrame(animationFrame); + document.getElementById("pixel-string-overlay")?.remove(); + }; +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..47c69040c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2688 @@ +{ + "name": "hackkit", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hackkit", + "hasInstallScript": true, + "dependencies": { + "@libsql/client": "^0.14.0", + "prettier-plugin-tailwindcss": "^0.6.5" + }, + "devDependencies": { + "@turbo/gen": "^2.0.9", + "dotenv-cli": "^7.4.2", + "eslint": "^9.7.0", + "prettier": "^3.3.3", + "turbo": "^2.0.9" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@libsql/client": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@libsql/client/-/client-0.14.0.tgz", + "integrity": "sha512-/9HEKfn6fwXB5aTEEoMeFh4CtG0ZzbncBb1e++OCdVpgKZ/xyMsIVYXm0w7Pv4RUel803vE6LwniB3PqD72R0Q==", + "license": "MIT", + "dependencies": { + "@libsql/core": "^0.14.0", + "@libsql/hrana-client": "^0.7.0", + "js-base64": "^3.7.5", + "libsql": "^0.4.4", + "promise-limit": "^2.7.0" + } + }, + "node_modules/@libsql/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@libsql/core/-/core-0.14.0.tgz", + "integrity": "sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==", + "license": "MIT", + "dependencies": { + "js-base64": "^3.7.5" + } + }, + "node_modules/@libsql/darwin-arm64": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@libsql/darwin-arm64/-/darwin-arm64-0.4.7.tgz", + "integrity": "sha512-yOL742IfWUlUevnI5PdnIT4fryY3LYTdLm56bnY0wXBw7dhFcnjuA7jrH3oSVz2mjZTHujxoITgAE7V6Z+eAbg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@libsql/darwin-x64": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@libsql/darwin-x64/-/darwin-x64-0.4.7.tgz", + "integrity": "sha512-ezc7V75+eoyyH07BO9tIyJdqXXcRfZMbKcLCeF8+qWK5nP8wWuMcfOVywecsXGRbT99zc5eNra4NEx6z5PkSsA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@libsql/hrana-client": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@libsql/hrana-client/-/hrana-client-0.7.0.tgz", + "integrity": "sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==", + "license": "MIT", + "dependencies": { + "@libsql/isomorphic-fetch": "^0.3.1", + "@libsql/isomorphic-ws": "^0.1.5", + "js-base64": "^3.7.5", + "node-fetch": "^3.3.2" + } + }, + "node_modules/@libsql/isomorphic-fetch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@libsql/isomorphic-fetch/-/isomorphic-fetch-0.3.1.tgz", + "integrity": "sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@libsql/isomorphic-ws": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@libsql/isomorphic-ws/-/isomorphic-ws-0.1.5.tgz", + "integrity": "sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==", + "license": "MIT", + "dependencies": { + "@types/ws": "^8.5.4", + "ws": "^8.13.0" + } + }, + "node_modules/@libsql/linux-arm64-gnu": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-gnu/-/linux-arm64-gnu-0.4.7.tgz", + "integrity": "sha512-WlX2VYB5diM4kFfNaYcyhw5y+UJAI3xcMkEUJZPtRDEIu85SsSFrQ+gvoKfcVh76B//ztSeEX2wl9yrjF7BBCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-arm64-musl": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-musl/-/linux-arm64-musl-0.4.7.tgz", + "integrity": "sha512-6kK9xAArVRlTCpWeqnNMCoXW1pe7WITI378n4NpvU5EJ0Ok3aNTIC2nRPRjhro90QcnmLL1jPcrVwO4WD1U0xw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-x64-gnu": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@libsql/linux-x64-gnu/-/linux-x64-gnu-0.4.7.tgz", + "integrity": "sha512-CMnNRCmlWQqqzlTw6NeaZXzLWI8bydaXDke63JTUCvu8R+fj/ENsLrVBtPDlxQ0wGsYdXGlrUCH8Qi9gJep0yQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-x64-musl": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@libsql/linux-x64-musl/-/linux-x64-musl-0.4.7.tgz", + "integrity": "sha512-nI6tpS1t6WzGAt1Kx1n1HsvtBbZ+jHn0m7ogNNT6pQHZQj7AFFTIMeDQw/i/Nt5H38np1GVRNsFe99eSIMs9XA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/win32-x64-msvc": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@libsql/win32-x64-msvc/-/win32-x64-msvc-0.4.7.tgz", + "integrity": "sha512-7pJzOWzPm6oJUxml+PCDRzYQ4A1hTMHAciTAHfFK4fkbDZX33nWPVG7Y3vqdKtslcwAzwmrNDc6sXy2nwWnbiw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@neon-rs/load": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@neon-rs/load/-/load-0.0.4.tgz", + "integrity": "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==", + "license": "MIT" + }, + "node_modules/@turbo/darwin-64": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@turbo/darwin-64/-/darwin-64-2.9.18.tgz", + "integrity": "sha512-9f27peFu16ur8c0v9nUFUEyBnbKuuFsUTjHFWfmwGfzySBXbHwzU44QhZon6Mznz0cHsIr3984NQj/bVrnGSRw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@turbo/darwin-arm64": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@turbo/darwin-arm64/-/darwin-arm64-2.9.18.tgz", + "integrity": "sha512-9A6TMRq/Ib+QnbhLlgkhOm+624wO4pzSQ/yQviQfWHOlFvaYxdnIAYmu2H6TS6y7kSVL0DvzNe04NbESTOzFVQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@turbo/gen": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@turbo/gen/-/gen-2.9.18.tgz", + "integrity": "sha512-9Ry3V2eqFANYI7A5dyjehq2EOuLTY30XQSg4aDR7F3cJOuiP/Ad2KXwrxD3AnwNDkuSDVbJjlbES7yfJ0y7dhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.10.1", + "esbuild": "^0.25.0" + }, + "bin": { + "gen": "dist/cli.js" + } + }, + "node_modules/@turbo/linux-64": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@turbo/linux-64/-/linux-64-2.9.18.tgz", + "integrity": "sha512-zCdIDtz69AnbYh913elJRRoF3QY5aa2HNnf+4rAkc7bQ+tWujiDkCNV7stazOUPggaDvhKIf2Z87qHftTeXSkw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@turbo/linux-arm64": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@turbo/linux-arm64/-/linux-arm64-2.9.18.tgz", + "integrity": "sha512-Va1kXI04naMgYwqv/5Dfa36dTDx8015U7oaQAjrXa45ua9OoFjSV4OmvkML4EmXvUclQHCiBRbY8bvd0jV7eAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@turbo/windows-64": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@turbo/windows-64/-/windows-64-2.9.18.tgz", + "integrity": "sha512-m0kDhZANxSNz9ck1ybogFscHabriAsp4eDFNrN/1H5WrgTF7b3VlcPZnhuO3v2+E2KnCbeAc+UUT10BZZHdDKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@turbo/windows-arm64": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/@turbo/windows-arm64/-/windows-arm64-2.9.18.tgz", + "integrity": "sha512-nUdR8WqoomUys9iIQmG45TMiizJ+5BV8egSeLLZba/AWblyp3fVBcIH1kSE58OtK4g2YzbMJEth6Ttv9w5rqMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.0.tgz", + "integrity": "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==", + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-7.4.4.tgz", + "integrity": "sha512-XkBYCG0tPIes+YZr4SpfFv76SQrV/LeCE8CI7JSEMi3VR9MvTihCGTOtbIexD6i2mXF+6px7trb1imVCXSNMDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-base64": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", + "license": "BSD-3-Clause" + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libsql": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/libsql/-/libsql-0.4.7.tgz", + "integrity": "sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==", + "cpu": [ + "x64", + "arm64", + "wasm32" + ], + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32" + ], + "dependencies": { + "@neon-rs/load": "^0.0.4", + "detect-libc": "2.0.2" + }, + "optionalDependencies": { + "@libsql/darwin-arm64": "0.4.7", + "@libsql/darwin-x64": "0.4.7", + "@libsql/linux-arm64-gnu": "0.4.7", + "@libsql/linux-arm64-musl": "0.4.7", + "@libsql/linux-x64-gnu": "0.4.7", + "@libsql/linux-x64-musl": "0.4.7", + "@libsql/win32-x64-msvc": "0.4.7" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz", + "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", + "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/promise-limit": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/promise-limit/-/promise-limit-2.7.0.tgz", + "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==", + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/turbo": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.9.18.tgz", + "integrity": "sha512-bwabv6PupzeavybzEoArBAkwq5fnzwf8OFnRtpHwnviFWuwJPFxtyH+aVp36TmIqK3aYYgtTJ3J0m2ysxxSzQg==", + "dev": true, + "license": "MIT", + "bin": { + "turbo": "bin/turbo" + }, + "optionalDependencies": { + "@turbo/darwin-64": "2.9.18", + "@turbo/darwin-arm64": "2.9.18", + "@turbo/linux-64": "2.9.18", + "@turbo/linux-arm64": "2.9.18", + "@turbo/windows-64": "2.9.18", + "@turbo/windows-arm64": "2.9.18" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50b464c0a..d425a8845 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,6 +165,9 @@ importers: lucide-react: specifier: ^0.411.0 version: 0.411.0(react@18.3.1) + motion: + specifier: ^12.38.0 + version: 12.38.0(react-dom@18.3.1)(react@18.3.1) nanoid: specifier: ^5.0.7 version: 5.0.7 @@ -7183,6 +7186,27 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /framer-motion@12.38.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + motion-dom: 12.38.0 + motion-utils: 12.36.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + dev: false + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -7883,6 +7907,36 @@ packages: minimist: 1.2.8 dev: true + /motion-dom@12.38.0: + resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} + dependencies: + motion-utils: 12.36.0 + dev: false + + /motion-utils@12.36.0: + resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} + dev: false + + /motion@12.38.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + framer-motion: 12.38.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false