My Photo Book
-
+
A collection of moments and memories captured during my journeys around the world.
+ My Photo Book
+
+
- {image.caption} -
-{image.category}
+{image.caption}
+@@ -161,32 +162,32 @@ export default function PhotoGallery({ galleryItems }: PhotoGalleryProps) { {/* Modal */} {isModalOpen && (
+
+
{modalImageDetails.caption || "Image Preview"}
-
+
{modalImageLoading && (
-
-
+
+
)}
setModalImageLoading(false)}
style={modalImageLoading ? { visibility: "hidden" } : {}}
/>
- {modalImageDetails.caption}
+ {modalImageDetails.caption}
{filteredImages[currentImageIndex]?.location && (
- {filteredImages[currentImageIndex].location}
+ {filteredImages[currentImageIndex].location}
)}
-
-
+
+
← Previous
-
-
+
+
Next →
-
+
diff --git a/components/layout/Layout.tsx b/components/layout/Layout.tsx
index 163fa29..d1bcf54 100644
--- a/components/layout/Layout.tsx
+++ b/components/layout/Layout.tsx
@@ -2,35 +2,31 @@ import React from "react";
import { Header } from "../header/header";
import Footer from "../../sections/footer/footer";
import Meta from "../meta/meta";
+import { SmoothScroll } from "../smooth-scroll";
interface LayoutProps {
children: React.ReactNode;
data: {
- meta?: any; // Make meta optional on data if it can sometimes be missing
- header?: any; // Make header optional on data if it can sometimes be missing
+ meta?: any;
+ header?: any;
};
- about: { // Expecting an object that contains a profiles property
- profiles?: any[]; // Make profiles optional on about if it can sometimes be missing
+ about: {
+ profiles?: any[];
};
}
-const Layout: React.FC = ({
- children,
- data,
- about,
-}) => {
- // Destructure with safety for potentially undefined props
+const Layout: React.FC = ({ children, data, about }) => {
const meta = data?.meta;
const header = data?.header;
const profiles = about?.profiles;
return (
- <>
+
{meta && }
{header && }
{children}
{profiles && }
- >
+
);
};
diff --git a/components/profile/profile.tsx b/components/profile/profile.tsx
index 421388f..f02af90 100644
--- a/components/profile/profile.tsx
+++ b/components/profile/profile.tsx
@@ -35,6 +35,10 @@ const Profile = ({url, name, className}: ProfileProps) => {
};
return (
+
{
{getProfileIcon(name)}
+
);
};
diff --git a/components/smooth-scroll.tsx b/components/smooth-scroll.tsx
new file mode 100644
index 0000000..98d7f70
--- /dev/null
+++ b/components/smooth-scroll.tsx
@@ -0,0 +1,59 @@
+"use client";
+
+import { useRouter } from "next/router";
+import { useEffect, useRef, ReactNode } from "react";
+
+interface SmoothScrollProps {
+ children: ReactNode;
+}
+
+export function SmoothScroll({ children }: SmoothScrollProps) {
+ const router = useRouter();
+ const lenisRef = useRef | null>(null);
+ const rafRef = useRef(0);
+
+ useEffect(() => {
+ const isReducedMotion =
+ typeof window !== "undefined" &&
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches;
+ if (isReducedMotion) return;
+
+ let lenis: InstanceType | null = null;
+
+ const init = async () => {
+ if (typeof window !== "undefined") window.scrollTo(0, 0);
+ const Lenis = (await import("lenis")).default;
+ lenis = new Lenis({
+ duration: 1.1,
+ easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
+ orientation: "vertical",
+ gestureOrientation: "vertical",
+ smoothWheel: true,
+ touchMultiplier: 2,
+ });
+ lenisRef.current = lenis;
+ lenis.scrollTo(0, { immediate: true });
+
+ function raf(time: number) {
+ lenis?.raf(time);
+ rafRef.current = requestAnimationFrame(raf);
+ }
+ rafRef.current = requestAnimationFrame(raf);
+ };
+ init();
+
+ const handleRouteChange = () => {
+ lenisRef.current?.scrollTo(0, { immediate: true });
+ };
+ router.events.on("routeChangeComplete", handleRouteChange);
+
+ return () => {
+ router.events.off("routeChangeComplete", handleRouteChange);
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
+ lenis?.destroy();
+ lenisRef.current = null;
+ };
+ }, [router.events]);
+
+ return <>{children}>;
+}
diff --git a/components/tailwind/badge.tsx b/components/tailwind/badge.tsx
deleted file mode 100644
index a3aa728..0000000
--- a/components/tailwind/badge.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function Badge({text, className} : {text: string, className?: string}) {
- return (
-
- {text}
-
- );
-}
diff --git a/components/tailwind/button.tsx b/components/tailwind/button.tsx
deleted file mode 100644
index e91625f..0000000
--- a/components/tailwind/button.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { ReactNode } from "react";
-import { Button as MantineButton, ButtonVariant } from "@mantine/core";
-
-interface ButtonProps {
- children: ReactNode;
- variant: ButtonVariant;
- fullWidth?: boolean;
- onClick?: () => void;
-}
-
-export default function Button({ children, variant, fullWidth, onClick }: ButtonProps) {
- return (
-
- {children}
-
- );
-}
diff --git a/components/tailwind/section.tsx b/components/tailwind/section.tsx
index 7476fa5..c92b3e9 100644
--- a/components/tailwind/section.tsx
+++ b/components/tailwind/section.tsx
@@ -8,19 +8,26 @@ interface SectionProps {
heading?: string;
}
-const Section = ({children, id, background, container, heading}: SectionProps) => {
- return (
-
- {heading && {heading}
}
- {children}
-
- );
+const Section = ({ children, id, background, container, heading }: SectionProps) => {
+ return (
+
+ {heading && (
+
+ {heading}
+
+ )}
+ {children}
+
+ );
};
export default Section;
diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx
new file mode 100644
index 0000000..5aa2b88
--- /dev/null
+++ b/components/ui/accordion.tsx
@@ -0,0 +1,56 @@
+"use client";
+
+import * as AccordionPrimitive from "@radix-ui/react-accordion";
+import { ChevronDown } from "lucide-react";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+const Accordion = AccordionPrimitive.Root;
+
+const AccordionItem = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+AccordionItem.displayName = "AccordionItem";
+
+const AccordionTrigger = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className,
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+));
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
+
+const AccordionContent = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+));
+AccordionContent.displayName = AccordionPrimitive.Content.displayName;
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
diff --git a/components/ui/avatar.tsx b/components/ui/avatar.tsx
new file mode 100644
index 0000000..ca076e5
--- /dev/null
+++ b/components/ui/avatar.tsx
@@ -0,0 +1,49 @@
+"use client";
+
+import * as AvatarPrimitive from "@radix-ui/react-avatar";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+const Avatar = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+Avatar.displayName = AvatarPrimitive.Root.displayName;
+
+const AvatarImage = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+AvatarImage.displayName = AvatarPrimitive.Image.displayName;
+
+const AvatarFallback = React.forwardRef<
+ React.ComponentRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
+
+export { Avatar, AvatarImage, AvatarFallback };
diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx
new file mode 100644
index 0000000..b3c0b41
--- /dev/null
+++ b/components/ui/badge.tsx
@@ -0,0 +1,39 @@
+import { Slot } from "@radix-ui/react-slot";
+import { cva, type VariantProps } from "class-variance-authority";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+const badgeVariants = cva(
+ "inline-flex items-center justify-center rounded-base border-2 border-border px-2.5 py-0.5 text-xs font-base w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] overflow-hidden",
+ {
+ variants: {
+ variant: {
+ default: "bg-main text-main-foreground",
+ neutral: "bg-secondary-background text-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ },
+);
+
+function Badge({
+ className,
+ variant,
+ asChild = false,
+ ...props
+}: React.ComponentProps<"span"> &
+ VariantProps & {
+ asChild?: boolean;
+ }) {
+ const Comp = asChild ? Slot : "span";
+ return (
+
+ );
+}
+
+export { Badge, badgeVariants };
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
new file mode 100644
index 0000000..ac3d7fd
--- /dev/null
+++ b/components/ui/button.tsx
@@ -0,0 +1,54 @@
+import { Slot } from "@radix-ui/react-slot";
+import { cva, type VariantProps } from "class-variance-authority";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-base border-solid font-semibold ring-offset-white transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-black focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 min-h-11 min-w-11 md:min-h-0 md:min-w-0 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default:
+ "border-3 border-border bg-main text-main-foreground shadow-shadow hover:translate-x-boxShadowX hover:translate-y-boxShadowY hover:shadow-none",
+ noShadow:
+ "border-3 border-border bg-main text-main-foreground",
+ neutral:
+ "border-3 border-border bg-white text-foreground shadow-shadow hover:translate-x-boxShadowX hover:translate-y-boxShadowY hover:shadow-none",
+ reverse:
+ "border-3 border-border bg-main text-main-foreground hover:translate-x-reverseBoxShadowX hover:translate-y-reverseBoxShadowY hover:shadow-shadow",
+ },
+ size: {
+ default: "h-11 px-6 py-3 text-base",
+ sm: "h-9 px-4 py-2 text-sm",
+ lg: "h-12 px-8 py-3 text-base",
+ icon: "size-10",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+);
+
+function Button({
+ className,
+ variant = "default",
+ size = "default",
+ asChild = false,
+ ...props
+}: React.ComponentProps<"button"> &
+ VariantProps & {
+ asChild?: boolean;
+ }) {
+ const Comp = asChild ? Slot : "button";
+ const variantClasses = buttonVariants({ variant, size });
+ return (
+
+ );
+}
+
+export { Button, buttonVariants };
diff --git a/components/ui/card.tsx b/components/ui/card.tsx
new file mode 100644
index 0000000..81b6611
--- /dev/null
+++ b/components/ui/card.tsx
@@ -0,0 +1,65 @@
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+function Card({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardAction({ className, ...props }: React.ComponentProps<"div">) {
+ return ;
+}
+
+function CardContent({ className, ...props }: React.ComponentProps<"div">) {
+ return ;
+}
+
+function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+export {
+ Card,
+ CardHeader,
+ CardFooter,
+ CardTitle,
+ CardDescription,
+ CardContent,
+ CardAction,
+};
diff --git a/components/ui/carousel.tsx b/components/ui/carousel.tsx
new file mode 100644
index 0000000..495b0b3
--- /dev/null
+++ b/components/ui/carousel.tsx
@@ -0,0 +1,240 @@
+"use client";
+
+import useEmblaCarousel, {
+ type UseEmblaCarouselType,
+} from "embla-carousel-react";
+import { ArrowLeft, ArrowRight } from "lucide-react";
+import * as React from "react";
+import { Button } from "@/components/ui/button";
+import { cn } from "@/lib/utils";
+
+type CarouselApi = UseEmblaCarouselType[1];
+type UseCarouselParameters = Parameters;
+type CarouselOptions = UseCarouselParameters[0];
+type CarouselPlugin = UseCarouselParameters[1];
+
+type CarouselProps = {
+ opts?: CarouselOptions;
+ plugins?: CarouselPlugin;
+ orientation?: "horizontal" | "vertical";
+ setApi?: (api: CarouselApi) => void;
+};
+
+type CarouselContextProps = {
+ carouselRef: ReturnType[0];
+ api: ReturnType[1];
+ scrollPrev: () => void;
+ scrollNext: () => void;
+ canScrollPrev: boolean;
+ canScrollNext: boolean;
+ plugins?: CarouselPlugin;
+} & CarouselProps;
+
+const CarouselContext = React.createContext(null);
+
+function useCarousel() {
+ const context = React.useContext(CarouselContext);
+
+ if (!context) {
+ throw new Error("useCarousel must be used within a ");
+ }
+
+ return context;
+}
+
+function Carousel({
+ orientation = "horizontal",
+ opts,
+ setApi,
+ plugins,
+ className,
+ children,
+ ...props
+}: React.ComponentProps<"div"> & CarouselProps) {
+ const [carouselRef, api] = useEmblaCarousel(
+ {
+ ...opts,
+ axis: orientation === "horizontal" ? "x" : "y",
+ },
+ plugins,
+ );
+ const [canScrollPrev, setCanScrollPrev] = React.useState(false);
+ const [canScrollNext, setCanScrollNext] = React.useState(false);
+
+ const onSelect = React.useCallback((api: CarouselApi) => {
+ if (!api) return;
+ setCanScrollPrev(api.canScrollPrev());
+ setCanScrollNext(api.canScrollNext());
+ }, []);
+
+ const scrollPrev = React.useCallback(() => {
+ api?.scrollPrev();
+ }, [api]);
+
+ const scrollNext = React.useCallback(() => {
+ api?.scrollNext();
+ }, [api]);
+
+ const handleKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (event.key === "ArrowLeft") {
+ event.preventDefault();
+ scrollPrev();
+ } else if (event.key === "ArrowRight") {
+ event.preventDefault();
+ scrollNext();
+ }
+ },
+ [scrollPrev, scrollNext],
+ );
+
+ React.useEffect(() => {
+ if (!api || !setApi) return;
+ setApi(api);
+ }, [api, setApi]);
+
+ React.useEffect(() => {
+ if (!api) return;
+ onSelect(api);
+ api.on("reInit", onSelect);
+ api.on("select", onSelect);
+ return () => {
+ api.off("select", onSelect);
+ };
+ }, [api, onSelect]);
+
+ return (
+
+
+ {children}
+
+
+ );
+}
+
+function CarouselContent({
+ className,
+ children,
+ ...props
+}: React.ComponentProps<"div">) {
+ const { carouselRef, orientation } = useCarousel();
+
+ return (
+
+
+ {children}
+
+
+ );
+}
+
+function CarouselItem({
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ const { orientation } = useCarousel();
+
+ return (
+
+ );
+}
+
+function CarouselPrevious({
+ className,
+ variant = "noShadow",
+ size = "icon",
+ ...props
+}: React.ComponentProps) {
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel();
+
+ return (
+
+
+
+ );
+}
+
+function CarouselNext({
+ className,
+ variant = "noShadow",
+ size = "icon",
+ ...props
+}: React.ComponentProps) {
+ const { orientation, scrollNext, canScrollNext } = useCarousel();
+
+ return (
+
+
+
+ );
+}
+
+export {
+ type CarouselApi,
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselPrevious,
+ CarouselNext,
+};
diff --git a/components/ui/sheet.tsx b/components/ui/sheet.tsx
new file mode 100644
index 0000000..e79ffce
--- /dev/null
+++ b/components/ui/sheet.tsx
@@ -0,0 +1,125 @@
+"use client";
+
+import * as SheetPrimitive from "@radix-ui/react-dialog";
+import { X } from "lucide-react";
+import * as React from "react";
+import { cn } from "@/lib/utils";
+
+const Sheet = SheetPrimitive.Root;
+const SheetTrigger = SheetPrimitive.Trigger;
+const SheetClose = SheetPrimitive.Close;
+const SheetPortal = SheetPrimitive.Portal;
+
+function SheetOverlay({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function SheetContent({
+ className,
+ children,
+ side = "right",
+ ...props
+}: React.ComponentProps & {
+ side?: "top" | "bottom" | "left" | "right";
+}) {
+ const sideClasses = {
+ top: "inset-x-0 top-0 border-b-2 border-border data-[state=closed]:-translate-y-full data-[state=open]:translate-y-0",
+ bottom:
+ "inset-x-0 bottom-0 border-t-2 border-border data-[state=closed]:translate-y-full data-[state=open]:translate-y-0",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r-2 border-border data-[state=closed]:-translate-x-full data-[state=open]:translate-x-0 sm:max-w-sm",
+ right:
+ "inset-y-0 right-0 h-full w-3/4 border-l-2 border-border data-[state=closed]:translate-x-full data-[state=open]:translate-x-0 sm:max-w-sm",
+ };
+ return (
+
+
+
+ {children}
+
+
+
+
+
+ );
+}
+
+function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function SheetTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function SheetDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+export {
+ Sheet,
+ SheetPortal,
+ SheetOverlay,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+};
diff --git a/lib/utils.ts b/lib/utils.ts
new file mode 100644
index 0000000..a5ef193
--- /dev/null
+++ b/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from "clsx";
+import { twMerge } from "tailwind-merge";
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/next-env.d.ts b/next-env.d.ts
index 1970904..7996d35 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import "./.next/types/routes.d.ts";
+import "./.next/dev/types/routes.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.
diff --git a/package-lock.json b/package-lock.json
index 86845f3..d667f84 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,13 +9,18 @@
"version": "0.5.6",
"dependencies": {
"@emotion/react": "^11.14.0",
- "@emotion/server": "^11.11.0",
- "@mantine/carousel": "^8.0.1",
- "@mantine/core": "^8.0.1",
- "@mantine/hooks": "^8.0.1",
+ "@radix-ui/react-accordion": "^1.2.12",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-slot": "^1.2.4",
"@tabler/icons-react": "^3.33.0",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
"embla-carousel-react": "^8.6.0",
"eslint-config-next": "^16.1.6",
+ "framer-motion": "^12.34.0",
+ "lenis": "^1.3.17",
+ "lucide-react": "^0.564.0",
"next": "^16.1.6",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@@ -23,7 +28,8 @@
"react-markdown": "^10.1.0",
"react-simple-maps": "^3.0.0",
"rehype-raw": "^7.0.0",
- "sass": "^1.32.8"
+ "sass": "^1.32.8",
+ "tailwind-merge": "^3.4.0"
},
"devDependencies": {
"@commitlint/cli": "^19.8.1",
@@ -39,7 +45,6 @@
"eslint-config-prettier": "^9.1.0",
"husky": "^5.1.3",
"postcss": "^8.4.40",
- "postcss-preset-mantine": "^1.17.0",
"postcss-simple-vars": "^7.0.1",
"standard-version": "^9.1.1",
"tailwindcss": "^3.4.7",
@@ -240,9 +245,10 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
- "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
@@ -860,6 +866,7 @@
"version": "11.13.5",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
"integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
+ "license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.16.7",
"@babel/runtime": "^7.18.3",
@@ -877,12 +884,14 @@
"node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
},
"node_modules/@emotion/babel-plugin/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==",
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -894,6 +903,7 @@
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
@@ -902,6 +912,7 @@
"version": "11.14.0",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
"integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
+ "license": "MIT",
"dependencies": {
"@emotion/memoize": "^0.9.0",
"@emotion/sheet": "^1.4.0",
@@ -913,17 +924,20 @@
"node_modules/@emotion/hash": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
- "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
+ "license": "MIT"
},
"node_modules/@emotion/memoize": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
- "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
},
"node_modules/@emotion/react": {
"version": "11.14.0",
"resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
"integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
"@emotion/babel-plugin": "^11.13.5",
@@ -947,6 +961,7 @@
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
"integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
+ "license": "MIT",
"dependencies": {
"@emotion/hash": "^0.9.2",
"@emotion/memoize": "^0.9.0",
@@ -955,39 +970,23 @@
"csstype": "^3.0.2"
}
},
- "node_modules/@emotion/server": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/server/-/server-11.11.0.tgz",
- "integrity": "sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==",
- "dependencies": {
- "@emotion/utils": "^1.2.1",
- "html-tokenize": "^2.0.0",
- "multipipe": "^1.0.2",
- "through": "^2.3.8"
- },
- "peerDependencies": {
- "@emotion/css": "^11.0.0-rc.0"
- },
- "peerDependenciesMeta": {
- "@emotion/css": {
- "optional": true
- }
- }
- },
"node_modules/@emotion/sheet": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
- "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
+ "license": "MIT"
},
"node_modules/@emotion/unitless": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
- "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
+ "license": "MIT"
},
"node_modules/@emotion/use-insertion-effect-with-fallbacks": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
"integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
+ "license": "MIT",
"peerDependencies": {
"react": ">=16.8.0"
}
@@ -995,12 +994,14 @@
"node_modules/@emotion/utils": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
- "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
+ "license": "MIT"
},
"node_modules/@emotion/weak-memoize": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
- "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
+ "license": "MIT"
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.9.1",
@@ -1852,59 +1853,6 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@mantine/carousel": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@mantine/carousel/-/carousel-8.3.1.tgz",
- "integrity": "sha512-iPl4UZd2W6rJVmYIV3RkJDoax84xhR56TCqNu4ORj46MBccNBb2bHW5h3KJHzZIYws+yK+p0yOpF9vEAVGxqCg==",
- "license": "MIT",
- "peerDependencies": {
- "@mantine/core": "8.3.1",
- "@mantine/hooks": "8.3.1",
- "embla-carousel": ">=8.0.0",
- "embla-carousel-react": ">=8.0.0",
- "react": "^18.x || ^19.x",
- "react-dom": "^18.x || ^19.x"
- }
- },
- "node_modules/@mantine/core": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.1.tgz",
- "integrity": "sha512-OYfxn9cTv+K6RZ8+Ozn/HDQXkB8Fmn+KJJt5lxyFDP9F09EHnC59Ldadv1LyUZVBGtNqz4sn6b3vBShbxwAmYw==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/react": "^0.27.16",
- "clsx": "^2.1.1",
- "react-number-format": "^5.4.4",
- "react-remove-scroll": "^2.7.1",
- "react-textarea-autosize": "8.5.9",
- "type-fest": "^4.41.0"
- },
- "peerDependencies": {
- "@mantine/hooks": "8.3.1",
- "react": "^18.x || ^19.x",
- "react-dom": "^18.x || ^19.x"
- }
- },
- "node_modules/@mantine/core/node_modules/type-fest": {
- "version": "4.41.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
- "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@mantine/hooks": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.1.tgz",
- "integrity": "sha512-lQutBS+Q0iz/cNFvdrsYassPWo3RtWcmDGJeOtKfHigLzFOhxUuLOkQgepDbMf3WcVMB/tist6Px1PQOv57JTw==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^18.x || ^19.x"
- }
- },
"node_modules/@next/env": {
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz",
@@ -2103,6 +2051,576 @@
"node": ">=14"
}
},
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
+ "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collapsible": "1.1.12",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-avatar": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz",
+ "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-context": "1.1.3",
+ "@radix-ui/react-primitive": "2.1.4",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz",
+ "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
+ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.4"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collapsible": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
+ "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-is-hydrated": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
+ "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "^1.5.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -2266,7 +2784,8 @@
"node_modules/@types/parse-json": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
},
"node_modules/@types/react": {
"version": "19.2.11",
@@ -2677,6 +3196,18 @@
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true
},
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/array-buffer-byte-length": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
@@ -2940,6 +3471,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
"integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5",
"cosmiconfig": "^7.0.0",
@@ -2954,6 +3486,7 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
"integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
"dependencies": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1",
@@ -2969,6 +3502,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2977,6 +3511,7 @@
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "license": "ISC",
"engines": {
"node": ">= 6"
}
@@ -3261,10 +3796,22 @@
"node": ">= 8.10.0"
},
"funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://polar.sh/cva"
}
},
"node_modules/cli-cursor": {
@@ -3326,6 +3873,8 @@
},
"node_modules/clsx": {
"version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"license": "MIT",
"engines": {
"node": ">=6"
@@ -3652,6 +4201,7 @@
},
"node_modules/core-util-is": {
"version": "1.0.3",
+ "dev": true,
"license": "MIT"
},
"node_modules/cosmiconfig": {
@@ -4221,46 +4771,6 @@
"node": ">= 0.4"
}
},
- "node_modules/duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
- "dependencies": {
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/duplexer2/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "node_modules/duplexer2/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/duplexer2/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/duplexer2/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -4276,12 +4786,14 @@
"node_modules/embla-carousel": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
- "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA=="
+ "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
+ "license": "MIT"
},
"node_modules/embla-carousel-react": {
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz",
"integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==",
+ "license": "MIT",
"dependencies": {
"embla-carousel": "8.6.0",
"embla-carousel-reactive-utils": "8.6.0"
@@ -4294,6 +4806,7 @@
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz",
"integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==",
+ "license": "MIT",
"peerDependencies": {
"embla-carousel": "8.6.0"
}
@@ -5373,6 +5886,33 @@
"url": "https://github.com/sponsors/rawify"
}
},
+ "node_modules/framer-motion": {
+ "version": "12.34.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.0.tgz",
+ "integrity": "sha512-+/H49owhzkzQyxtn7nZeF4kdH++I2FWrESQ184Zbcw5cEqNHYkE5yxWxcTLSj5lNx3NWdbIRy5FHqUvetD8FWg==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.34.0",
+ "motion-utils": "^12.29.2",
+ "tslib": "^2.4.0"
+ },
+ "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
+ }
+ }
+ },
"node_modules/fs-extra": {
"version": "9.1.0",
"dev": true,
@@ -6369,15 +6909,11 @@
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
"integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
"dependencies": {
"react-is": "^16.7.0"
}
},
- "node_modules/hoist-non-react-statics/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
"node_modules/homedir-polyfill": {
"version": "1.0.3",
"dev": true,
@@ -6416,72 +6952,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/html-tokenize": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/html-tokenize/-/html-tokenize-2.0.1.tgz",
- "integrity": "sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==",
- "dependencies": {
- "buffer-from": "~0.1.1",
- "inherits": "~2.0.1",
- "minimist": "~1.2.5",
- "readable-stream": "~1.0.27-1",
- "through2": "~0.4.1"
- },
- "bin": {
- "html-tokenize": "bin/cmd.js"
- }
- },
- "node_modules/html-tokenize/node_modules/buffer-from": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz",
- "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg=="
- },
- "node_modules/html-tokenize/node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
- },
- "node_modules/html-tokenize/node_modules/object-keys": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
- "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="
- },
- "node_modules/html-tokenize/node_modules/readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/html-tokenize/node_modules/string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
- },
- "node_modules/html-tokenize/node_modules/through2": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz",
- "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==",
- "dependencies": {
- "readable-stream": "~1.0.17",
- "xtend": "~2.1.1"
- }
- },
- "node_modules/html-tokenize/node_modules/xtend": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
- "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==",
- "dependencies": {
- "object-keys": "~0.4.0"
- },
- "engines": {
- "node": ">=0.4"
- }
- },
"node_modules/html-url-attributes": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
@@ -6614,6 +7084,7 @@
},
"node_modules/inherits": {
"version": "2.0.4",
+ "dev": true,
"license": "ISC"
},
"node_modules/ini": {
@@ -7374,6 +7845,32 @@
"node": ">=0.10"
}
},
+ "node_modules/lenis": {
+ "version": "1.3.17",
+ "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.17.tgz",
+ "integrity": "sha512-k9T9rgcxne49ggJOvXCraWn5dt7u2mO+BNkhyu6yxuEnm9c092kAW5Bus5SO211zUvx7aCCEtzy9UWr0RB+oJw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/darkroomengineering"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": ">=3.0.0",
+ "react": ">=17.0.0",
+ "vue": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"dev": true,
@@ -7630,6 +8127,15 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/lucide-react": {
+ "version": "0.564.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.564.0.tgz",
+ "integrity": "sha512-JJ8GVTQqFwuliifD48U6+h7DXEHdkhJ/E87kksGByII3qHxtPciVb8T8woQONHBQgHVOl7rSMrrip3SeVNy7Fg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/map-obj": {
"version": "4.3.0",
"dev": true,
@@ -8962,21 +9468,27 @@
"node": ">=0.10.0"
}
},
+ "node_modules/motion-dom": {
+ "version": "12.34.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.0.tgz",
+ "integrity": "sha512-Lql3NuEcScRDxTAO6GgUsRHBZOWI/3fnMlkMcH5NftzcN37zJta+bpbMAV9px4Nj057TuvRooMK7QrzMCgtz6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.29.2"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.29.2",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
+ "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
+ "license": "MIT"
+ },
"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==",
"license": "MIT"
},
- "node_modules/multipipe": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
- "integrity": "sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==",
- "dependencies": {
- "duplexer2": "^0.1.2",
- "object-assign": "^4.1.0"
- }
- },
"node_modules/mute-stream": {
"version": "0.0.8",
"dev": true,
@@ -9730,35 +10242,6 @@
"url": "https://github.com/sponsors/antonk52"
}
},
- "node_modules/postcss-mixins": {
- "version": "12.1.2",
- "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-12.1.2.tgz",
- "integrity": "sha512-90pSxmZVfbX9e5xCv7tI5RV1mnjdf16y89CJKbf/hD7GyOz1FCxcYMl8ZYA8Hc56dbApTKKmU9HfvgfWdCxlwg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "postcss-js": "^4.0.1",
- "postcss-simple-vars": "^7.0.1",
- "sugarss": "^5.0.0",
- "tinyglobby": "^0.2.14"
- },
- "engines": {
- "node": "^20.0 || ^22.0 || >=24.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
"node_modules/postcss-nested": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
@@ -9784,60 +10267,6 @@
"postcss": "^8.2.14"
}
},
- "node_modules/postcss-preset-mantine": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/postcss-preset-mantine/-/postcss-preset-mantine-1.18.0.tgz",
- "integrity": "sha512-sP6/s1oC7cOtBdl4mw/IRKmKvYTuzpRrH/vT6v9enMU/EQEQ31eQnHcWtFghOXLH87AAthjL/Q75rLmin1oZoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "postcss-mixins": "^12.0.0",
- "postcss-nested": "^7.0.2"
- },
- "peerDependencies": {
- "postcss": ">=8.0.0"
- }
- },
- "node_modules/postcss-preset-mantine/node_modules/postcss-nested": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz",
- "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^7.0.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
- "node_modules/postcss-preset-mantine/node_modules/postcss-selector-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
- "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/postcss-selector-parser": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
@@ -9883,6 +10312,7 @@
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
+ "dev": true,
"license": "MIT"
},
"node_modules/prop-types": {
@@ -9894,10 +10324,6 @@
"react-is": "^16.13.1"
}
},
- "node_modules/prop-types/node_modules/react-is": {
- "version": "16.13.1",
- "license": "MIT"
- },
"node_modules/punycode": {
"version": "2.3.1",
"dev": true,
@@ -9987,6 +10413,12 @@
"react": "^18.0.0 || ^19.0.0"
}
},
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
"node_modules/react-markdown": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
@@ -10266,16 +10698,6 @@
"url": "https://opencollective.com/unified"
}
},
- "node_modules/react-number-format": {
- "version": "5.4.4",
- "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz",
- "integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
"node_modules/react-remove-scroll": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz",
@@ -10360,22 +10782,6 @@
}
}
},
- "node_modules/react-textarea-autosize": {
- "version": "8.5.9",
- "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz",
- "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==",
- "dependencies": {
- "@babel/runtime": "^7.20.13",
- "use-composed-ref": "^1.3.0",
- "use-latest": "^1.2.1"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -11669,7 +12075,8 @@
"node_modules/stylis": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
+ "license": "MIT"
},
"node_modules/sucrase": {
"version": "3.35.0",
@@ -11746,29 +12153,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/sugarss": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-5.0.1.tgz",
- "integrity": "sha512-ctS5RYCBVvPoZAnzIaX5QSShK8ZiZxD5HUqSxlusvEMC+QZQIPCPOIJg6aceFX+K2rf4+SH89eu++h1Zmsr2nw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.3.3"
- }
- },
"node_modules/supports-color": {
"version": "5.5.0",
"dev": true,
@@ -11796,6 +12180,16 @@
"integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==",
"license": "MIT"
},
+ "node_modules/tailwind-merge": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
+ "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
"node_modules/tailwindcss": {
"version": "3.4.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz",
@@ -11883,6 +12277,7 @@
},
"node_modules/through": {
"version": "2.3.8",
+ "dev": true,
"license": "MIT"
},
"node_modules/through2": {
@@ -12284,56 +12679,14 @@
"integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
"license": "MIT",
"dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-composed-ref": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz",
- "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-isomorphic-layout-effect": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz",
- "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-latest": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz",
- "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==",
- "dependencies": {
- "use-isomorphic-layout-effect": "^1.1.1"
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -12363,8 +12716,18 @@
}
}
},
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
+ "dev": true,
"license": "MIT"
},
"node_modules/validate-npm-package-license": {
@@ -12888,9 +13251,9 @@
}
},
"@babel/runtime": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
- "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog=="
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="
},
"@babel/template": {
"version": "7.28.6",
@@ -13384,17 +13747,6 @@
"csstype": "^3.0.2"
}
},
- "@emotion/server": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/server/-/server-11.11.0.tgz",
- "integrity": "sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==",
- "requires": {
- "@emotion/utils": "^1.2.1",
- "html-tokenize": "^2.0.0",
- "multipipe": "^1.0.2",
- "through": "^2.3.8"
- }
- },
"@emotion/sheet": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
@@ -13871,36 +14223,6 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "@mantine/carousel": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@mantine/carousel/-/carousel-8.3.1.tgz",
- "integrity": "sha512-iPl4UZd2W6rJVmYIV3RkJDoax84xhR56TCqNu4ORj46MBccNBb2bHW5h3KJHzZIYws+yK+p0yOpF9vEAVGxqCg=="
- },
- "@mantine/core": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.3.1.tgz",
- "integrity": "sha512-OYfxn9cTv+K6RZ8+Ozn/HDQXkB8Fmn+KJJt5lxyFDP9F09EHnC59Ldadv1LyUZVBGtNqz4sn6b3vBShbxwAmYw==",
- "requires": {
- "@floating-ui/react": "^0.27.16",
- "clsx": "^2.1.1",
- "react-number-format": "^5.4.4",
- "react-remove-scroll": "^2.7.1",
- "react-textarea-autosize": "8.5.9",
- "type-fest": "^4.41.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "4.41.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
- "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="
- }
- }
- },
- "@mantine/hooks": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.3.1.tgz",
- "integrity": "sha512-lQutBS+Q0iz/cNFvdrsYassPWo3RtWcmDGJeOtKfHigLzFOhxUuLOkQgepDbMf3WcVMB/tist6Px1PQOv57JTw=="
- },
"@next/env": {
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz",
@@ -14000,6 +14322,258 @@
"dev": true,
"optional": true
},
+ "@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="
+ },
+ "@radix-ui/react-accordion": {
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
+ "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
+ "requires": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collapsible": "1.1.12",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ }
+ },
+ "@radix-ui/react-avatar": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz",
+ "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==",
+ "requires": {
+ "@radix-ui/react-context": "1.1.3",
+ "@radix-ui/react-primitive": "2.1.4",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-is-hydrated": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "dependencies": {
+ "@radix-ui/react-context": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz",
+ "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="
+ },
+ "@radix-ui/react-primitive": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
+ "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
+ "requires": {
+ "@radix-ui/react-slot": "1.2.4"
+ }
+ }
+ }
+ },
+ "@radix-ui/react-collapsible": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
+ "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
+ "requires": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ }
+ },
+ "@radix-ui/react-collection": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
+ "requires": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "dependencies": {
+ "@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "requires": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ }
+ }
+ }
+ },
+ "@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="
+ },
+ "@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="
+ },
+ "@radix-ui/react-dialog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+ "requires": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "dependencies": {
+ "@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "requires": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ }
+ }
+ }
+ },
+ "@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="
+ },
+ "@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "requires": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ }
+ },
+ "@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="
+ },
+ "@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "requires": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ }
+ },
+ "@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "requires": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ }
+ },
+ "@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "requires": {
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ }
+ },
+ "@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "requires": {
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ }
+ },
+ "@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "requires": {
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "dependencies": {
+ "@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "requires": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ }
+ }
+ }
+ },
+ "@radix-ui/react-slot": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+ "requires": {
+ "@radix-ui/react-compose-refs": "1.1.2"
+ }
+ },
+ "@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="
+ },
+ "@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "requires": {
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ }
+ },
+ "@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "requires": {
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ }
+ },
+ "@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "requires": {
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ }
+ },
+ "@radix-ui/react-use-is-hydrated": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
+ "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
+ "requires": {
+ "use-sync-external-store": "^1.5.0"
+ }
+ },
+ "@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="
+ },
"@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -14385,6 +14959,14 @@
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true
},
+ "aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "requires": {
+ "tslib": "^2.0.0"
+ }
+ },
"array-buffer-byte-length": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
@@ -14719,6 +15301,14 @@
"readdirp": "~3.6.0"
}
},
+ "class-variance-authority": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+ "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+ "requires": {
+ "clsx": "^2.1.1"
+ }
+ },
"cli-cursor": {
"version": "3.1.0",
"dev": true,
@@ -14753,7 +15343,9 @@
"dev": true
},
"clsx": {
- "version": "2.1.1"
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="
},
"color-convert": {
"version": "1.9.3",
@@ -14981,7 +15573,8 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
},
"core-util-is": {
- "version": "1.0.3"
+ "version": "1.0.3",
+ "dev": true
},
"cosmiconfig": {
"version": "9.0.0",
@@ -15350,48 +15943,6 @@
"gopd": "^1.2.0"
}
},
- "duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
- "requires": {
- "readable-stream": "^2.0.2"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
"eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -16142,6 +16693,16 @@
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"dev": true
},
+ "framer-motion": {
+ "version": "12.34.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.0.tgz",
+ "integrity": "sha512-+/H49owhzkzQyxtn7nZeF4kdH++I2FWrESQ184Zbcw5cEqNHYkE5yxWxcTLSj5lNx3NWdbIRy5FHqUvetD8FWg==",
+ "requires": {
+ "motion-dom": "^12.34.0",
+ "motion-utils": "^12.29.2",
+ "tslib": "^2.4.0"
+ }
+ },
"fs-extra": {
"version": "9.1.0",
"dev": true,
@@ -16821,13 +17382,6 @@
"integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
"requires": {
"react-is": "^16.7.0"
- },
- "dependencies": {
- "react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- }
}
},
"homedir-polyfill": {
@@ -16857,68 +17411,6 @@
}
}
},
- "html-tokenize": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/html-tokenize/-/html-tokenize-2.0.1.tgz",
- "integrity": "sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==",
- "requires": {
- "buffer-from": "~0.1.1",
- "inherits": "~2.0.1",
- "minimist": "~1.2.5",
- "readable-stream": "~1.0.27-1",
- "through2": "~0.4.1"
- },
- "dependencies": {
- "buffer-from": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz",
- "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg=="
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
- },
- "object-keys": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
- "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
- },
- "through2": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz",
- "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==",
- "requires": {
- "readable-stream": "~1.0.17",
- "xtend": "~2.1.1"
- }
- },
- "xtend": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
- "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==",
- "requires": {
- "object-keys": "~0.4.0"
- }
- }
- }
- },
"html-url-attributes": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
@@ -16983,7 +17475,8 @@
}
},
"inherits": {
- "version": "2.0.4"
+ "version": "2.0.4",
+ "dev": true
},
"ini": {
"version": "4.1.1",
@@ -17438,6 +17931,11 @@
"language-subtag-registry": "^0.3.20"
}
},
+ "lenis": {
+ "version": "1.3.17",
+ "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.17.tgz",
+ "integrity": "sha512-k9T9rgcxne49ggJOvXCraWn5dt7u2mO+BNkhyu6yxuEnm9c092kAW5Bus5SO211zUvx7aCCEtzy9UWr0RB+oJw=="
+ },
"levn": {
"version": "0.4.1",
"dev": true,
@@ -17615,6 +18113,11 @@
"yallist": "^3.0.2"
}
},
+ "lucide-react": {
+ "version": "0.564.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.564.0.tgz",
+ "integrity": "sha512-JJ8GVTQqFwuliifD48U6+h7DXEHdkhJ/E87kksGByII3qHxtPciVb8T8woQONHBQgHVOl7rSMrrip3SeVNy7Fg=="
+ },
"map-obj": {
"version": "4.3.0",
"dev": true
@@ -18476,20 +18979,24 @@
"version": "1.0.1",
"dev": true
},
+ "motion-dom": {
+ "version": "12.34.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.0.tgz",
+ "integrity": "sha512-Lql3NuEcScRDxTAO6GgUsRHBZOWI/3fnMlkMcH5NftzcN37zJta+bpbMAV9px4Nj057TuvRooMK7QrzMCgtz6Q==",
+ "requires": {
+ "motion-utils": "^12.29.2"
+ }
+ },
+ "motion-utils": {
+ "version": "12.29.2",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
+ "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="
+ },
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
- "multipipe": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
- "integrity": "sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==",
- "requires": {
- "duplexer2": "^0.1.2",
- "object-assign": "^4.1.0"
- }
- },
"mute-stream": {
"version": "0.0.8",
"dev": true
@@ -18920,18 +19427,6 @@
}
}
},
- "postcss-mixins": {
- "version": "12.1.2",
- "resolved": "https://registry.npmjs.org/postcss-mixins/-/postcss-mixins-12.1.2.tgz",
- "integrity": "sha512-90pSxmZVfbX9e5xCv7tI5RV1mnjdf16y89CJKbf/hD7GyOz1FCxcYMl8ZYA8Hc56dbApTKKmU9HfvgfWdCxlwg==",
- "dev": true,
- "requires": {
- "postcss-js": "^4.0.1",
- "postcss-simple-vars": "^7.0.1",
- "sugarss": "^5.0.0",
- "tinyglobby": "^0.2.14"
- }
- },
"postcss-nested": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
@@ -18941,37 +19436,6 @@
"postcss-selector-parser": "^6.1.1"
}
},
- "postcss-preset-mantine": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/postcss-preset-mantine/-/postcss-preset-mantine-1.18.0.tgz",
- "integrity": "sha512-sP6/s1oC7cOtBdl4mw/IRKmKvYTuzpRrH/vT6v9enMU/EQEQ31eQnHcWtFghOXLH87AAthjL/Q75rLmin1oZoA==",
- "dev": true,
- "requires": {
- "postcss-mixins": "^12.0.0",
- "postcss-nested": "^7.0.2"
- },
- "dependencies": {
- "postcss-nested": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz",
- "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^7.0.0"
- }
- },
- "postcss-selector-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
- "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- }
- }
- }
- },
"postcss-selector-parser": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
@@ -18999,7 +19463,8 @@
"dev": true
},
"process-nextick-args": {
- "version": "2.0.1"
+ "version": "2.0.1",
+ "dev": true
},
"prop-types": {
"version": "15.8.1",
@@ -19007,11 +19472,6 @@
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
- },
- "dependencies": {
- "react-is": {
- "version": "16.13.1"
- }
}
},
"punycode": {
@@ -19059,6 +19519,11 @@
"react-activity-calendar": "^3.0.6"
}
},
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
"react-markdown": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz",
@@ -19260,11 +19725,6 @@
}
}
},
- "react-number-format": {
- "version": "5.4.4",
- "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz",
- "integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA=="
- },
"react-remove-scroll": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz",
@@ -19304,16 +19764,6 @@
"tslib": "^2.0.0"
}
},
- "react-textarea-autosize": {
- "version": "8.5.9",
- "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz",
- "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==",
- "requires": {
- "@babel/runtime": "^7.20.13",
- "use-composed-ref": "^1.3.0",
- "use-latest": "^1.2.1"
- }
- },
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -20232,12 +20682,6 @@
}
}
},
- "sugarss": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-5.0.1.tgz",
- "integrity": "sha512-ctS5RYCBVvPoZAnzIaX5QSShK8ZiZxD5HUqSxlusvEMC+QZQIPCPOIJg6aceFX+K2rf4+SH89eu++h1Zmsr2nw==",
- "dev": true
- },
"supports-color": {
"version": "5.5.0",
"dev": true,
@@ -20253,6 +20697,11 @@
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz",
"integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="
},
+ "tailwind-merge": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
+ "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="
+ },
"tailwindcss": {
"version": "3.4.7",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz",
@@ -20320,7 +20769,8 @@
}
},
"through": {
- "version": "2.3.8"
+ "version": "2.3.8",
+ "dev": true
},
"through2": {
"version": "4.0.2",
@@ -20555,24 +21005,6 @@
"tslib": "^2.0.0"
}
},
- "use-composed-ref": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz",
- "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w=="
- },
- "use-isomorphic-layout-effect": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz",
- "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA=="
- },
- "use-latest": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz",
- "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==",
- "requires": {
- "use-isomorphic-layout-effect": "^1.1.1"
- }
- },
"use-sidecar": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
@@ -20582,8 +21014,14 @@
"tslib": "^2.0.0"
}
},
+ "use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="
+ },
"util-deprecate": {
- "version": "1.0.2"
+ "version": "1.0.2",
+ "dev": true
},
"validate-npm-package-license": {
"version": "3.0.4",
diff --git a/package.json b/package.json
index d1e8447..bd43177 100644
--- a/package.json
+++ b/package.json
@@ -20,13 +20,18 @@
},
"dependencies": {
"@emotion/react": "^11.14.0",
- "@emotion/server": "^11.11.0",
- "@mantine/carousel": "^8.0.1",
- "@mantine/core": "^8.0.1",
- "@mantine/hooks": "^8.0.1",
+ "@radix-ui/react-accordion": "^1.2.12",
+ "@radix-ui/react-avatar": "^1.1.11",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-slot": "^1.2.4",
"@tabler/icons-react": "^3.33.0",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
"embla-carousel-react": "^8.6.0",
"eslint-config-next": "^16.1.6",
+ "framer-motion": "^12.34.0",
+ "lenis": "^1.3.17",
+ "lucide-react": "^0.564.0",
"next": "^16.1.6",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@@ -34,7 +39,8 @@
"react-markdown": "^10.1.0",
"react-simple-maps": "^3.0.0",
"rehype-raw": "^7.0.0",
- "sass": "^1.32.8"
+ "sass": "^1.32.8",
+ "tailwind-merge": "^3.4.0"
},
"devDependencies": {
"@commitlint/cli": "^19.8.1",
@@ -50,7 +56,6 @@
"eslint-config-prettier": "^9.1.0",
"husky": "^5.1.3",
"postcss": "^8.4.40",
- "postcss-preset-mantine": "^1.17.0",
"postcss-simple-vars": "^7.0.1",
"standard-version": "^9.1.1",
"tailwindcss": "^3.4.7",
diff --git a/pages/_app.tsx b/pages/_app.tsx
index 5211554..fd52136 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -1,13 +1,15 @@
import "../styles/global.scss";
-import "@mantine/core/styles.css";
-import "@mantine/carousel/styles.css";
+import { Space_Grotesk } from "next/font/google";
import { useRouter } from "next/router";
import { useEffect } from "react";
import * as gtag from "../lib/gtag";
-import { MantineProvider } from "@mantine/core";
-import { theme } from "../styles/theme";
import Layout from "../components/layout/Layout";
+const spaceGrotesk = Space_Grotesk({
+ subsets: ["latin"],
+ variable: "--font-space-grotesk",
+});
+
const isProduction = process.env.NODE_ENV === "production";
export default function Portfolio({ Component, pageProps }) {
@@ -25,13 +27,10 @@ export default function Portfolio({ Component, pageProps }) {
const { siteData, aboutData, ...restPageProps } = pageProps;
return (
-
-
+
+
-
+
);
}
diff --git a/pages/_document.tsx b/pages/_document.tsx
index b6eee1a..cc4af7e 100644
--- a/pages/_document.tsx
+++ b/pages/_document.tsx
@@ -1,5 +1,4 @@
import { Html, Head, Main, NextScript } from "next/document";
-import { ColorSchemeScript, mantineHtmlProps } from "@mantine/core";
import { GA_TRACKING_ID } from "../lib/gtag";
@@ -7,9 +6,8 @@ const isProduction = process.env.NODE_ENV === "production";
export default function Document() {
return (
-
+
-
)}
-
+
diff --git a/pages/index.tsx b/pages/index.tsx
index 0bfb883..4d68c76 100644
--- a/pages/index.tsx
+++ b/pages/index.tsx
@@ -1,7 +1,8 @@
import Banner from "../sections/banner/banner";
import About from "../sections/about/about";
+import Experience from "../sections/experience/experience";
import Interests from "../sections/interests/interests";
-import BlogSection from "../sections/blog/blog";
+import BlogSection from "../sections/blog/blog";
import { Map } from "../sections/map/map";
import { Blog as tBlog } from "../interfaces/blog";
@@ -60,10 +61,15 @@ export default function IndexPage({
return (
<>
{bannerData && }
- {pageSpecificAboutData && }
+
+ {pageSpecificAboutData && }
+ {pageSpecificAboutData?.experience?.length > 0 && (
+
+ )}
{interests && }
{blogs && }
{countriesVisited && }
+
>
);
}
diff --git a/postcss.config.js b/postcss.config.js
index b466557..3f82780 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -1,8 +1,7 @@
module.exports = {
plugins: {
"tailwindcss/nesting": {},
- "tailwindcss": {},
- "postcss-preset-mantine": {},
+ tailwindcss: {},
"postcss-simple-vars": {
variables: {
// Optional: define Mantine breakpoints here if needed by your setup,
diff --git a/sections/about/about.tsx b/sections/about/about.tsx
index f2fbd29..5323f33 100644
--- a/sections/about/about.tsx
+++ b/sections/about/about.tsx
@@ -1,402 +1,276 @@
+"use client";
+
+import { useState } from "react";
import Image from "next/image";
+import {
+ Briefcase,
+ MapPin,
+ Code,
+ User,
+ ChevronDown,
+ ChevronUp,
+ GraduationCap,
+} from "lucide-react";
+import { motion, AnimatePresence } from "framer-motion";
import Section from "../../components/tailwind/section";
import Profile from "../../components/profile/profile";
-import { Text, Title, Group, Timeline, ThemeIcon, Badge as MantineBadge, Box, SimpleGrid, Card, Stack } from "@mantine/core";
-import { IconBriefcase, IconMapPin, IconCalendarEvent, IconCode, IconUser, IconChevronDown, IconChevronUp } from "@tabler/icons-react";
-import { useState } from "react";
+import {
+ Card,
+ CardContent,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
interface AboutProps {
- about: string;
- skills: { logo: string; name: string }[];
- experience: {
- logo: string;
- designation: string;
- company: string;
- from: string;
- to: string;
- location: string;
- technologies: string[];
- }[];
- imageUrl: string;
- name: string;
- location: string;
- designation: string;
- education: string;
- stats: { count: number; label: string }[];
- profiles: { name: string; url: string }[];
-
+ about: string;
+ skills: { logo: string; name: string }[];
+ imageUrl: string;
+ name: string;
+ location: string;
+ designation: string;
+ education: string;
+ stats: { count: number; label: string }[];
+ profiles: { name: string; url: string }[];
}
const About = ({
- name, about, imageUrl, location, designation, experience, education, skills, stats, profiles,
- }: AboutProps) => {
+ name,
+ about,
+ imageUrl,
+ location,
+ designation,
+ education,
+ skills,
+ stats,
+ profiles,
+}: AboutProps) => {
+ const [expandedCard, setExpandedCard] = useState(null);
- const [expandedCard, setExpandedCard] = useState(null);
-
- const toggleCard = (cardType: string) => {
- const newExpandedCard = expandedCard === cardType ? null : cardType;
- setExpandedCard(newExpandedCard);
-
- // Scroll to the about section when expanding a card
- if (newExpandedCard) {
- setTimeout(() => {
- const aboutSection = document.getElementById("about");
- if (aboutSection) {
- aboutSection.scrollIntoView({
- behavior: "smooth",
- block: "start",
- });
- }
- }, 100); // Small delay to allow the layout to update
+ const toggleCard = (cardType: string) => {
+ const newExpandedCard = expandedCard === cardType ? null : cardType;
+ setExpandedCard(newExpandedCard);
+ if (newExpandedCard) {
+ setTimeout(() => {
+ const aboutSection = document.getElementById("about");
+ if (aboutSection) {
+ aboutSection.scrollIntoView({ behavior: "smooth", block: "start" });
}
- };
+ }, 100);
+ }
+ };
+
+ const cardTypes = [
+ { id: "about", icon: User, label: "About Me" },
+ { id: "skills", icon: Code, label: "Skills" },
+ ] as const;
- const AboutPreview = () => (
-
- 200 ? about.substring(0, 200) + "..." : about,
- }} />
-
- Click to read more
-
+ return (
+
+
+
+
+
+
+ Profile
+
+
+
+
+ {stats.map((stat) => (
+
+ {stat.count}
+ {stat.label}
+
+ ))}
+
+
+
+
+ {profiles.map((profile) => (
+
+ ))}
+
+
- );
- const AboutExpanded = () => (
-
-
+
+ {name}
+
+
+ {location}
+
+
+
+ {designation}
+
+
+
+ {education}
+
- );
- const ExperiencePreview = () => (
-
-
- {experience.slice(0, 2).map((company, index) => (
-
-
- {company.logo && (
+
+
+ {expandedCard && (
+
+ {expandedCard === "about" && (
+ toggleCard("about")}
+ >
+
+
+
+ About Me
+
+
+
+
+
+
+
+ )}
+ {expandedCard === "skills" && (
+ toggleCard("skills")}
+ >
+
+
+
+ Skills
+
+
+
+
+
+ {skills.map((skill) => (
+
- )}
-
-
- {company.designation}
-
-
- {company.company} • {company.from} - {company.to}
-
-
-
-
- ))}
-
- {experience.length > 2 && (
-
- +{experience.length - 2} more positions. Click to see all
-
- )}
-
- );
-
- const ExperienceExpanded = () => (
-
-
- {experience.map((company, index) => (
- {`${company.designation} @ ${company.company}`}}
- bullet={
-
-
-
- }
- >
- {company.logo && (
-
- )}
-
-
- {company.from} - {company.to}
-
-
-
- {company.location}
-
-
- {company.technologies && company.technologies.map((technology) =>
- {technology} )}
-
-
+
+ {skill.name}
+
+
))}
-
-
- );
-
- const SkillsPreview = () => (
-
-
- {skills.slice(0, 8).map((skill) => (
-
-
-
- {skill.name}
-
-
- ))}
-
- {skills.length > 8 && (
-
- +{skills.length - 8} more skills. Click to see all
-
+
+
+
+ )}
+
)}
-
- );
-
- const SkillsExpanded = () => (
-
-
- {skills.map((skill) => (
-
-
-
- {skill.name}
-
-
- ))}
-
-
- );
+
- return (
-
-
- {/* Profile Header Section */}
-
-
-
-
-
-
- {stats.length && stats.map((stat) => (
-
- {stat.count}
- {stat.label}
-
- ))}
-
-
-
-
- {profiles.length && profiles.map((profile) => (
-
+
+ {cardTypes.map(({ id, icon: Icon, label }) => {
+ if (expandedCard === id) return null;
+ return (
+
+ toggleCard(id)}
+ >
+
+
+
+ {label}
+
+
+
+
+ {id === "about" && (
+ <>
+ 200
+ ? about.substring(0, 200) + "..."
+ : about,
+ }}
+ />
+
+ Click to read more
+
+ >
+ )}
+ {id === "skills" && (
+ <>
+
+ {skills.slice(0, 8).map((skill) => (
+
+
+
+ {skill.name}
+
+
))}
-
-
-
-
- {/* Name and Basic Info */}
-
- {name}
-
-
-
- {location}
-
-
-
- {designation}
-
-
-
- {education}
-
-
-
- {/* Expandable Cards Section */}
-
-
- {/* Expanded Card - Full Width */}
-
- {expandedCard === "about" && (
- toggleCard("about")}
- >
-
-
-
- About Me
-
-
-
-
-
-
-
- )}
-
- {expandedCard === "experience" && (
- toggleCard("experience")}
- >
-
-
-
- Experience
-
-
-
-
-
-
-
- )}
-
- {expandedCard === "skills" && (
- toggleCard("skills")}
- >
-
-
-
- Skills
-
-
-
-
-
-
-
- )}
-
-
- {/* Collapsed Cards - Side by Side */}
-
- {/* About Card */}
- {expandedCard !== "about" && (
-
- toggleCard("about")}
- >
-
-
-
- About Me
-
-
-
-
-
-
-
-
- )}
-
- {/* Experience Card */}
- {expandedCard !== "experience" && (
-
- toggleCard("experience")}
- >
-
-
-
- Experience
-
-
-
-
-
-
-
-
- )}
-
- {/* Skills Card */}
- {expandedCard !== "skills" && (
-
- toggleCard("skills")}
- >
-
-
-
- Skills
-
-
-
-
-
-
-
-
- )}
-
-
-
-
-
- );
+
+ {skills.length > 8 && (
+
+ +{skills.length - 8} more. Click to see all
+
+ )}
+ >
+ )}
+
+
+
+ );
+ })}
+
+
+
+
+ );
};
export default About;
diff --git a/sections/banner/banner.tsx b/sections/banner/banner.tsx
index d709871..a46860e 100644
--- a/sections/banner/banner.tsx
+++ b/sections/banner/banner.tsx
@@ -1,110 +1,154 @@
-import {useEffect} from "react";
-import Image from "next/image";
+"use client";
+
+import { useEffect } from "react";
import Link from "next/link";
-import Button from "../../components/tailwind/button";
+import { motion } from "framer-motion";
+import { ArrowUpRight } from "lucide-react";
+import { Button } from "@/components/ui/button";
interface BannerProps {
- illustration: string;
- texts: string[];
- ctaLabel: string;
- ctaUrl: string;
- downloadable: boolean;
-
+ illustration: string;
+ texts: string[];
+ ctaLabel: string;
+ ctaUrl: string;
+ downloadable: boolean;
}
const Banner = ({
- illustration, texts, ctaLabel, ctaUrl, downloadable,
- }: BannerProps) => {
-
- useEffect(() => {
- let toRotate: string | null;
- let el: HTMLElement | null;
- let loopNum: number;
- let period: string | null;
- let txt: string;
- let isDeleting: boolean;
- const tick = () => {
- if (!el || !toRotate) return;
- const i = loopNum % (JSON.parse(toRotate) as string[]).length;
- const fullTxt = (JSON.parse(toRotate) as string[])[i];
- if (isDeleting) {
- txt = fullTxt.substring(0, txt.length - 1);
- } else {
- txt = fullTxt.substring(0, txt.length + 1);
- }
- el.innerHTML = `${txt}`;
- let delta = 200 - Math.random() * 100;
- if (isDeleting) {
- delta /= 2;
- }
- if (!isDeleting && txt === fullTxt) {
- delta = parseInt(period || "2000", 10);
- isDeleting = true;
- } else if (isDeleting && txt === "") {
- isDeleting = false;
- loopNum += 1;
- delta = 500;
- }
- setTimeout(() => {
- tick();
- }, delta);
- };
- const TxtType = (elL: HTMLElement, toRotateL: string, periodL: string | null) => {
- toRotate = toRotateL;
- el = elL;
- loopNum = 0;
- period = periodL;
- txt = "";
- tick();
- isDeleting = false;
- };
- const elements = document.querySelectorAll("#typewrite");
- elements.forEach(currentEl => {
- const dataType = currentEl.getAttribute("data-type");
- const dataPeriod = currentEl.getAttribute("data-period");
- if (dataType) {
- TxtType(currentEl, dataType, dataPeriod);
- }
- });
- const css = document.createElement("style");
- css.type = "text/css";
- css.innerHTML = "#typewrite > span { border-right: 0.08em solid currentColor; }";
- document.body.appendChild(css);
- return () => {
- document.body.removeChild(css);
- };
- }, []);
- return (
-
-
-
-
-
-
-
-
- Hi, I'm
-
-
-
-
-
-
- {ctaLabel && (
-
-
- {ctaLabel}
-
-
- )}
-
-
-
-
-
- );
+ texts,
+ ctaLabel,
+ ctaUrl,
+ downloadable,
+}: BannerProps) => {
+ useEffect(() => {
+ let toRotate: string | null;
+ let el: HTMLElement | null;
+ let loopNum: number;
+ let period: string | null;
+ let txt: string;
+ let isDeleting: boolean;
+ const tick = () => {
+ if (!el || !toRotate) return;
+ const i = loopNum % (JSON.parse(toRotate) as string[]).length;
+ const fullTxt = (JSON.parse(toRotate) as string[])[i];
+ if (isDeleting) {
+ txt = fullTxt.substring(0, txt.length - 1);
+ } else {
+ txt = fullTxt.substring(0, txt.length + 1);
+ }
+ el.innerHTML = `${txt}`;
+ let delta = 200 - Math.random() * 100;
+ if (isDeleting) {
+ delta /= 2;
+ }
+ if (!isDeleting && txt === fullTxt) {
+ delta = parseInt(period || "2000", 10);
+ isDeleting = true;
+ } else if (isDeleting && txt === "") {
+ isDeleting = false;
+ loopNum += 1;
+ delta = 500;
+ }
+ setTimeout(() => {
+ tick();
+ }, delta);
+ };
+ const TxtType = (
+ elL: HTMLElement,
+ toRotateL: string,
+ periodL: string | null,
+ ) => {
+ toRotate = toRotateL;
+ el = elL;
+ loopNum = 0;
+ period = periodL;
+ txt = "";
+ tick();
+ isDeleting = false;
+ };
+ const elements = document.querySelectorAll("#typewrite");
+ elements.forEach((currentEl) => {
+ const dataType = currentEl.getAttribute("data-type");
+ const dataPeriod = currentEl.getAttribute("data-period");
+ if (dataType) {
+ TxtType(currentEl, dataType, dataPeriod);
+ }
+ });
+ const css = document.createElement("style");
+ css.type = "text/css";
+ css.innerHTML =
+ "#typewrite > span { border-right: 0.08em solid currentColor; }";
+ document.body.appendChild(css);
+ return () => {
+ document.body.removeChild(css);
+ };
+ }, []);
+
+ return (
+
+
+
+
+ Hi, I'm{" "}
+
+
+
+
+
+
+
+
+
+ {ctaLabel && (
+
+
+ {ctaLabel}
+
+
+
+ )}
+
+
+
+ );
};
export default Banner;
diff --git a/sections/blog/blog.tsx b/sections/blog/blog.tsx
index 8ed84e9..f8cb96c 100644
--- a/sections/blog/blog.tsx
+++ b/sections/blog/blog.tsx
@@ -1,93 +1,73 @@
-import { Carousel } from "@mantine/carousel";
-import { useMediaQuery } from "@mantine/hooks";
-import { useMantineTheme } from "@mantine/core";
+"use client";
+
import Card from "../../components/card/card";
import Section from "../../components/tailwind/section";
+import {
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselNext,
+ CarouselPrevious,
+} from "@/components/ui/carousel";
import { Blog as BlogType } from "../../interfaces/blog";
-const Blog = ({blogs}: { blogs: BlogType[] }) => {
- const theme = useMantineTheme();
- const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`);
- const isSmallScreen = useMediaQuery(`(min-width: ${theme.breakpoints.sm})`); // Technikally, sm and up
- const isMediumScreen = useMediaQuery(`(min-width: ${theme.breakpoints.md})`);
- const isLargeScreen = useMediaQuery(`(min-width: ${theme.breakpoints.lg})`);
- const isXLargeScreen = useMediaQuery(`(min-width: ${theme.breakpoints.xl})`);
-
- const sortedBlogs = blogs
- .filter(blog => !blog.hidden)
- .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
-
-
- const groupBy = (xs: BlogType[], f: (blog: BlogType) => string) =>
- xs.reduce((r, v) => {
- const k = f(v);
- (r[k] || (r[k] = [])).push(v);
- return r;
- }, {} as Record);
-
- const kebabCaseToSentenceCase = (str: string) =>
- str.split("-").map((word) => word[0].toUpperCase() + word.substring(1)).join(" ");
-
- const result = groupBy(sortedBlogs, (c) => c.type);
+const Blog = ({ blogs }: { blogs: BlogType[] }) => {
+ const sortedBlogs = blogs
+ .filter((blog) => !blog.hidden)
+ .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
- let slidesToScrollValue = 1;
- let visibleSlides = 1;
+ const groupBy = (xs: BlogType[], f: (blog: BlogType) => string) =>
+ xs.reduce((r, v) => {
+ const k = f(v);
+ (r[k] || (r[k] = [])).push(v);
+ return r;
+ }, {} as Record);
- if (isXLargeScreen) {
- slidesToScrollValue = 5;
- visibleSlides = 5;
- } else if (isLargeScreen) {
- slidesToScrollValue = 4;
- visibleSlides = 4;
- } else if (isMediumScreen) {
- slidesToScrollValue = 3;
- visibleSlides = 3;
- } else if (isSmallScreen) { // This is sm (since mobile is sm and down, and md,lg,xl are covered)
- slidesToScrollValue = 2;
- visibleSlides = 2;
- }
- // For mobile (base screen size), slidesToScrollValue and visibleSlides remain 1
+ const kebabCaseToSentenceCase = (str: string) =>
+ str
+ .split("-")
+ .map((word) => word[0].toUpperCase() + word.substring(1))
+ .join(" ");
- return (
- <>
- {Object.keys(result).length > 0 && Object.keys(result).map((sectionName) => {
- const slidesInSection = result[sectionName]?.length || 0;
- const showIndicators = mobile && slidesInSection > 1;
- const showControls = !mobile && slidesInSection > visibleSlides;
+ const result = groupBy(sortedBlogs, (c) => c.type);
- return (
-
-
- {result[sectionName]?.length > 0 && result[sectionName].map((blog, index) => {
- return (
-
-
-
- );
- })}
-
-
- );
- })}
- >
- );
+ return (
+ <>
+ {Object.keys(result).length > 0 &&
+ Object.keys(result).map((sectionName) => (
+
+
+
+ {result[sectionName]?.map((blog, index) => (
+
+
+
+ ))}
+
+
+
+
+
+ ))}
+ >
+ );
};
export default Blog;
diff --git a/sections/experience/experience.tsx b/sections/experience/experience.tsx
new file mode 100644
index 0000000..9ea17a2
--- /dev/null
+++ b/sections/experience/experience.tsx
@@ -0,0 +1,83 @@
+"use client";
+
+import Image from "next/image";
+import { motion } from "framer-motion";
+import Section from "../../components/tailwind/section";
+import { Badge } from "@/components/ui/badge";
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion";
+
+export interface ExperienceItem {
+ logo: string;
+ designation: string;
+ company: string;
+ from: string;
+ to: string;
+ location: string;
+ technologies: string[];
+}
+
+interface ExperienceProps {
+ experience: ExperienceItem[];
+}
+
+const Experience = ({ experience }: ExperienceProps) => {
+ return (
+
+
+
+ {experience.map((entry, index) => (
+
+
+
+
+ {entry.logo ? (
+
+ ) : (
+ —
+ )}
+
+
+
+ {entry.designation} @ {entry.company}
+
+
+ {entry.from} – {entry.to}
+
+
+
+
+
+
+ {entry.technologies?.map((tech) => (
+
+ {tech}
+
+ ))}
+
+
+
+ ))}
+
+
+
+ );
+};
+
+export default Experience;
diff --git a/sections/footer/footer.tsx b/sections/footer/footer.tsx
index 5f13c0d..e08c2cb 100644
--- a/sections/footer/footer.tsx
+++ b/sections/footer/footer.tsx
@@ -1,32 +1,65 @@
-import Profile from "../../components/profile/profile";
-
-const Footer = ({profiles}) => (
-
+const Footer = ({
+ profiles,
+}: {
+ profiles: { name: string; url: string }[];
+}) => (
+
+
+
+
+ Thank you for stopping by!
+
+
+ Let's get in touch on any of these platforms.
+
+
+
+ {profiles.length > 0 &&
+ profiles.map((profile) => (
+
+
+ ))}
+
+
+
+
+
+ © {new Date().getFullYear()}{" "}
+
+ Prasheel
+
+
+
+ License
+
+
+
);
export default Footer;
diff --git a/sections/interests/interests.tsx b/sections/interests/interests.tsx
index b441db1..8c75fd9 100644
--- a/sections/interests/interests.tsx
+++ b/sections/interests/interests.tsx
@@ -1,111 +1,142 @@
+"use client";
+
import Image from "next/image";
-import Section from "../../components/tailwind/section";
import Link from "next/link";
+import { motion } from "framer-motion";
+import Section from "../../components/tailwind/section";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Button } from "@/components/ui/button";
interface InterestsProps {
- illustration: string;
- interests: {
- title: string;
- description: string;
- }[];
+ illustration: string;
+ interests: {
+ title: string;
+ description: string;
+ }[];
}
-const Interests = ({ illustration, interests }: InterestsProps) => {
+const container = {
+ hidden: { opacity: 0 },
+ show: {
+ opacity: 1,
+ transition: { staggerChildren: 0.1 },
+ },
+};
- const getInterestType = (title: string): "blogging" | "photography" | "coding" | "other" => {
- const lowerTitle = title.toLowerCase();
- if (lowerTitle.includes("blog") || lowerTitle.includes("writing")) {
- return "blogging";
- }
- if (lowerTitle.includes("photo") || lowerTitle.includes("camera") || lowerTitle.includes("image")) {
- return "photography";
- }
- if (lowerTitle.includes("coding") || lowerTitle.includes("programming") || lowerTitle.includes("development")) {
- return "coding";
- }
- return "other";
- };
+const item = {
+ hidden: { opacity: 0, x: -16 },
+ show: { opacity: 1, x: 0 },
+};
+const Interests = ({ illustration, interests }: InterestsProps) => {
+ const getInterestType = (
+ title: string,
+ ): "blogging" | "photography" | "coding" | "other" => {
+ const lowerTitle = title.toLowerCase();
+ if (lowerTitle.includes("blog") || lowerTitle.includes("writing"))
+ return "blogging";
+ if (
+ lowerTitle.includes("photo") ||
+ lowerTitle.includes("camera") ||
+ lowerTitle.includes("image")
+ )
+ return "photography";
+ if (
+ lowerTitle.includes("coding") ||
+ lowerTitle.includes("programming") ||
+ lowerTitle.includes("development")
+ )
+ return "coding";
+ return "other";
+ };
- const getCTAButton = (interest: { title: string; description: string }) => {
- const type = getInterestType(interest.title);
- switch (type) {
- case "blogging":
- return (
-
- 📝 View My Blog Posts
-
- );
- case "photography":
- return (
-
- 📸 Explore Photo Gallery
-
- );
- case "coding":
- return (
-
- 💻 View My GitHub
-
- );
- default:
- return (
-
- 🔗 Coming Soon
-
- );
- }
- };
+ const getCTA = (interest: { title: string; description: string }) => {
+ const type = getInterestType(interest.title);
+ switch (type) {
+ case "blogging":
+ return (
+
+
+ View My Blog Posts
+
+
+ );
+ case "photography":
+ return (
+
+
+ Explore Photo Gallery
+
+
+ );
+ case "coding":
+ return (
+
+
+ View My GitHub
+
+
+ );
+ default:
+ return (
+
+ Coming Soon
+
+ );
+ }
+ };
- return (
-
-
-
- {interests.length && interests.map((interest) => (
-
-
-
-
-
- {interest.title}
-
-
- {interest.description}
-
-
- {/* CTA Button */}
-
- {getCTAButton(interest)}
-
-
-
-
-
- ))}
-
-
-
-
-
-
- );
+ return (
+
+
+
+ {interests.length > 0 &&
+ interests.map((interest) => (
+
+
+
+
+ {interest.title}
+
+
+
+ {interest.description}
+ {getCTA(interest)}
+
+
+
+ ))}
+
+
+
+
+
+
+ );
};
export default Interests;
diff --git a/sections/map/map.tsx b/sections/map/map.tsx
index 6c54550..1f5829e 100644
--- a/sections/map/map.tsx
+++ b/sections/map/map.tsx
@@ -1,53 +1,69 @@
-import React, {memo} from "react";
+"use client";
+
+import React, { memo } from "react";
import {
- ComposableMap,
- Geographies,
- Geography,
+ ComposableMap,
+ Geographies,
+ Geography,
} from "react-simple-maps";
-import { Tooltip } from "@mantine/core";
+import { motion } from "framer-motion";
import Section from "../../components/tailwind/section";
+import { Card } from "@/components/ui/card";
-// Type assertion to fix React 19 compatibility
-const ComposableMapComponent = ComposableMap as React.ComponentType;
+const ComposableMapComponent = ComposableMap as React.ComponentType<{
+ projection?: string;
+ projectionConfig?: { center: [number, number]; scale: number };
+ children?: React.ReactNode;
+}>;
-export const Map = ({countriesVisited}) => {
- return (
-
-
- How much of the World I've seen so
- far?
-
-
-
- {({geographies}) =>
- geographies.map((geo) => (
-
-
-
- ))
- }
-
-
-
-
-
- );
+const Map = ({ countriesVisited }: { countriesVisited: string[] }) => {
+ return (
+
+
+
+
+
+ {({ geographies }) =>
+ geographies.map((geo) => (
+
+ {geo.properties.name}
+
+
+ ))
+ }
+
+
+
+
+
+ );
};
export default memo(Map);
+export { Map };
diff --git a/styles/global.scss b/styles/global.scss
index 050eb2c..e279985 100644
--- a/styles/global.scss
+++ b/styles/global.scss
@@ -2,35 +2,122 @@
@tailwind components;
@tailwind utilities;
+@layer base {
+ html,
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ :root {
+ --background: #dfe5f2;
+ --foreground: #000000;
+ --main: #6C90FF;
+ --main-foreground: #000000;
+ --border: #000000;
+ --secondary-background: #e8ecf4;
+ --ring: #000000;
+ --radius: 5px;
+ --muted-foreground: #374151;
+ }
+ .dark {
+ --background: #272933;
+ --foreground: #eeefe9;
+ --main: #6C90FF;
+ --main-foreground: #000000;
+ --border: #000000;
+ --secondary-background: #212121;
+ --ring: #eeefe9;
+ --muted-foreground: #9ca3af;
+ }
+}
+
@layer components {
- .markdown-body h1, .markdown-body h2, .markdown-body h3 {
- @apply font-bold mt-8 mb-4 text-2xl dark:text-white;
+ .markdown-body h1,
+ .markdown-body h2,
+ .markdown-body h3 {
+ font-weight: 700;
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+ font-size: 1.5rem;
+ line-height: 2rem;
+ }
+ .dark .markdown-body h1,
+ .dark .markdown-body h2,
+ .dark .markdown-body h3 {
+ color: #fafafa;
+ }
+ .markdown-body h4,
+ .markdown-body h5,
+ .markdown-body h6 {
+ font-weight: 600;
+ margin-top: 1.5rem;
+ margin-bottom: 0.5rem;
+ font-size: 1.25rem;
+ line-height: 1.75rem;
}
- .markdown-body h4, .markdown-body h5, .markdown-body h6 {
- @apply font-semibold mt-6 mb-2 text-xl dark:text-white;
+ .dark .markdown-body h4,
+ .dark .markdown-body h5,
+ .dark .markdown-body h6 {
+ color: #fafafa;
}
.markdown-body p {
- @apply mb-4 leading-relaxed;
+ margin-bottom: 1rem;
+ line-height: 1.625;
}
- .markdown-body ul, .markdown-body ol {
- @apply pl-6 mb-4;
+ .markdown-body ul,
+ .markdown-body ol {
+ padding-left: 1.5rem;
+ margin-bottom: 1rem;
}
.markdown-body li {
- @apply list-disc;
+ list-style-type: disc;
}
.markdown-body a {
- @apply text-brandMutedYellow-700 underline hover:text-brandMutedYellow-900 dark:text-brandMutedYellow-300 dark:hover:text-brandMutedYellow-100;
+ color: #4d80e6;
+ text-decoration: underline;
+ }
+ .markdown-body a:hover {
+ color: #2563eb;
+ }
+ .dark .markdown-body a {
+ color: #88aaee;
+ }
+ .dark .markdown-body a:hover {
+ color: #a5c4ff;
}
.markdown-body img {
- @apply my-4 rounded max-w-full h-auto;
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border-radius: 0.25rem;
+ max-width: 100%;
+ height: auto;
}
.markdown-body blockquote {
- @apply border-l-4 border-brandMutedYellow-500 pl-4 italic text-neutralGray-700 dark:text-neutralGray-300 mb-4;
+ border-left: 4px solid #88aaee;
+ padding-left: 1rem;
+ font-style: italic;
+ color: #495057;
+ margin-bottom: 1rem;
+ }
+ .dark .markdown-body blockquote {
+ color: #dee2e6;
}
.markdown-body pre {
- @apply bg-neutralGray-100 dark:bg-neutralGray-800 p-4 rounded mb-4 overflow-x-auto;
+ background-color: #f1f3f5;
+ padding: 1rem;
+ border-radius: 0.25rem;
+ margin-bottom: 1rem;
+ overflow-x: auto;
+ }
+ .dark .markdown-body pre {
+ background-color: #495057;
}
.markdown-body code {
- @apply bg-neutralGray-200 dark:bg-neutralGray-700 px-1 py-0.5 rounded;
+ background-color: #e9ecef;
+ padding: 0.125rem 0.25rem;
+ border-radius: 0.25rem;
+ }
+ .dark .markdown-body code {
+ background-color: #495057;
}
}
diff --git a/styles/theme.ts b/styles/theme.ts
deleted file mode 100644
index e669d99..0000000
--- a/styles/theme.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { createTheme, MantineColorsTuple } from "@mantine/core";
-import { themeValues } from "./theme-values";
-
-const colors = themeValues.colors as unknown as Record;
-
-export const theme = createTheme({
- colors,
- primaryColor: themeValues.primaryColor,
- white: themeValues.white,
- black: themeValues.black,
- headings: themeValues.headings,
- fontFamily: themeValues.fontFamily,
- other: themeValues.other,
-});
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
index e091e9a..a7be6e4 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -18,6 +18,8 @@ module.exports = {
"./components/**/*.*",
"./sections/**/*.*",
"./pages/**/*.*",
+ "./lib/**/*.*",
+ "./styles/**/*.scss",
],
theme: {
container: {
@@ -49,11 +51,53 @@ module.exports = {
},
// You can also map other theme values like fontSize, spacing, borderRadius
// For example, for heading font sizes (this is a simplified example):
- // fontSize: {
- // 'h1-mantine': mantineColorsTheme.headings.sizes.h1.fontSize,
- // 'h2-mantine': mantineColorsTheme.headings.sizes.h2.fontSize,
- // // ... and so on
- // },
+ borderRadius: {
+ base: "5px",
+ },
+ borderWidth: {
+ "3": "3px",
+ },
+ boxShadow: {
+ shadow: "4px 4px 0px 0px #000",
+ "shadow-sm": "2px 2px 0px 0px #000",
+ },
+ translate: {
+ boxShadowX: "4px",
+ boxShadowY: "4px",
+ reverseBoxShadowX: "-4px",
+ reverseBoxShadowY: "-4px",
+ },
+ colors: {
+ main: "var(--main)",
+ "main-foreground": "var(--main-foreground)",
+ border: "var(--border)",
+ foreground: "var(--foreground)",
+ background: "var(--background)",
+ "secondary-background": "var(--secondary-background)",
+ ring: "var(--ring)",
+ "muted-foreground": "var(--muted-foreground)",
+ },
+ fontWeight: {
+ base: "500",
+ heading: "700",
+ },
+ fontFamily: {
+ heading: ["var(--font-space-grotesk)", "var(--font-sans)", "sans-serif"],
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: "0" },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ },
},
},
plugins: [],
diff --git a/tsconfig.json b/tsconfig.json
index 265ea94..b4201d6 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,11 +1,7 @@
{
"compilerOptions": {
"target": "es5",
- "lib": [
- "dom",
- "dom.iterable",
- "esnext"
- ],
+ "lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
@@ -17,14 +13,12 @@
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "react-jsx",
- "incremental": true
+ "incremental": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./*"]
+ }
},
- "include": [
- "next-env.d.ts",
- "**/*.ts",
- "**/*.tsx"
- ],
- "exclude": [
- "node_modules"
- ]
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
}
{modalImageDetails.caption || "Image Preview"}
{modalImageDetails.caption}
+{modalImageDetails.caption}
{filteredImages[currentImageIndex]?.location && ( -{filteredImages[currentImageIndex].location}
+{filteredImages[currentImageIndex].location}
)}{heading}
} - {children} -+ {heading} +
+ )} + {children} +{name}
+
+
+
+
+ Skills
+ + Click to read more +
+ > + )} + {id === "skills" && ( + <> ++ +{skills.length - 8} more. Click to see all +
+ )} + > + )} + + + + ); + })} +Hi, I'm
-- - -
-+ Hi, I'm{" "} + + + + + +
++ Thank you for stopping by! +
++ Let's get in touch on any of these platforms. +
++
- {interest.title} -
-- {interest.description} -
- - {/* CTA Button */} -{interest.description}
+