diff --git a/package.json b/package.json
index 7644d40..d99fda8 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
"format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}'"
},
"dependencies": {
+ "@headlessui/react": "^1.7.18",
"next": "14.1.0",
"react": "^18",
"react-dom": "^18",
diff --git a/src/app/(routes)/layout.tsx b/src/app/(routes)/layout.tsx
index 27b2db7..ccf3634 100644
--- a/src/app/(routes)/layout.tsx
+++ b/src/app/(routes)/layout.tsx
@@ -2,7 +2,7 @@ import type { Metadata } from "next";
import { twMerge } from "tailwind-merge";
import { Barlow } from "next/font/google";
-import HeaderNav from "@/app/_components/header-nav";
+import { HeaderNav } from "@/app/_components/header-nav";
import "./globals.css";
@@ -23,8 +23,10 @@ export default function RootLayout({
return (
-
- {children}
+
+
+ {children}
+
);
diff --git a/src/app/_components/button.tsx b/src/app/_components/button.tsx
new file mode 100644
index 0000000..aedc0bd
--- /dev/null
+++ b/src/app/_components/button.tsx
@@ -0,0 +1,18 @@
+import { ComponentProps } from "react";
+import { twMerge } from "tailwind-merge";
+
+type ButtonProps = ComponentProps<"button">;
+
+export function Button({ className, children, ...props }: ButtonProps) {
+ return (
+
+ );
+}
diff --git a/src/app/_components/header-nav.tsx b/src/app/_components/header-nav.tsx
deleted file mode 100644
index 5039acd..0000000
--- a/src/app/_components/header-nav.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import Link from "next/link";
-
-import { AcrossIcon } from "./icons/across";
-
-export default function HeaderNav() {
- return (
-
-
-
-
-
-
- );
-}
diff --git a/src/app/_components/header-nav/flyout-menu.tsx b/src/app/_components/header-nav/flyout-menu.tsx
new file mode 100644
index 0000000..26c2e98
--- /dev/null
+++ b/src/app/_components/header-nav/flyout-menu.tsx
@@ -0,0 +1,76 @@
+import { Fragment } from "react";
+import { Popover, Transition } from "@headlessui/react";
+import Link from "next/link";
+import { twMerge } from "tailwind-merge";
+
+import { ChevronDownIcon } from "../icons";
+import { IconBox } from "../icon-box";
+
+import { NavItem } from "./types";
+
+type Props = {
+ buttonLabel: string;
+ menuItems: NavItem[];
+ className?: string;
+ useExternalLinks?: boolean;
+};
+
+export function FlyoutMenu({
+ useExternalLinks,
+ buttonLabel,
+ menuItems,
+ className,
+}: Props) {
+ return (
+
+
+ {buttonLabel}
+
+
+
+
+
+
+ {menuItems.map((item) => (
+
+
+
+
+
+
+
{item.label}
+
+ {item.description}
+
+
+
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/src/app/_components/header-nav/index.tsx b/src/app/_components/header-nav/index.tsx
new file mode 100644
index 0000000..5f68062
--- /dev/null
+++ b/src/app/_components/header-nav/index.tsx
@@ -0,0 +1,158 @@
+"use client";
+
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import { useState } from "react";
+import { twMerge } from "tailwind-merge";
+
+import {
+ AcrossIcon,
+ MenuIcon,
+ MinusIcon,
+ BridgeIcon,
+ PlusIcon,
+ CheckmarkSimpleIcon,
+ DiscordIcon,
+ TwitterIcon,
+ MediumIcon,
+} from "../icons";
+import { Button } from "../button";
+
+import { FlyoutMenu } from "./flyout-menu";
+import { MobileMenu } from "./mobile-menu";
+import { ProductsSubNav } from "./products-sub-nav";
+
+const productsNavigationItems = [
+ {
+ label: "Across Bridge",
+ description: "Bridge Without Compromise",
+ href: "/across-bridge",
+ Icon: BridgeIcon,
+ iconClassName: "group-hover:drop-shadow-aqua h-4 w-4",
+ iconContainerClassName: "bg-aqua-100/[.05]",
+ containerClassName: "group-hover:bg-aqua-100/[.05]",
+ },
+ {
+ label: "Across+",
+ description: "Cross-chain Bridge hooks to Fullfill User intents",
+ href: "/across-plus",
+ Icon: PlusIcon,
+ iconClassName: "group-hover:drop-shadow-teal h-5 w-5",
+ iconContainerClassName: "bg-teal-100/[.05]",
+ containerClassName: "group-hover:bg-teal-100/[.05]",
+ },
+ {
+ label: "Across Settlement",
+ description: "Cross-chain Intents Settlement Layer",
+ href: "/across-settlement",
+ Icon: CheckmarkSimpleIcon,
+ iconClassName: "group-hover:drop-shadow-purple h-4 w-5",
+ iconContainerClassName: "bg-purple-100/[.05]",
+ containerClassName: "group-hover:bg-purple-100/[.05]",
+ },
+];
+
+const communityNavigationItems = [
+ {
+ label: "Discord",
+ description: "Access support and chat with community members",
+ href: "https://discord.com/invite/sKSkhTtu8s",
+ Icon: DiscordIcon,
+ iconClassName: "h-4 w-5",
+ iconContainerClassName: "bg-light-100/[.05]",
+ containerClassName: "group-hover:bg-light-100/[.05]",
+ },
+ {
+ label: "Twitter",
+ description: "Follow for the latest updates on Across",
+ href: "https://twitter.com/AcrossProtocol",
+ Icon: TwitterIcon,
+ iconClassName: "h-4 w-4",
+ iconContainerClassName: "bg-light-100/[.05]",
+ containerClassName: "group-hover:bg-light-100/[.05]",
+ },
+ {
+ label: "Medium",
+ description: "Read deep dives on Across infra and campaigns",
+ href: "https://medium.com/across-protocol",
+ Icon: MediumIcon,
+ iconClassName: "h-3 w-5",
+ iconContainerClassName: "bg-light-100/[.05]",
+ containerClassName: "group-hover:bg-light-100/[.05]",
+ },
+];
+
+export function HeaderNav() {
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
+
+ const pathname = usePathname();
+ const isProductsPath = productsNavigationItems.some((item) =>
+ pathname.startsWith(item.href),
+ );
+
+ return (
+
+ );
+}
diff --git a/src/app/_components/header-nav/mobile-menu.tsx b/src/app/_components/header-nav/mobile-menu.tsx
new file mode 100644
index 0000000..4811602
--- /dev/null
+++ b/src/app/_components/header-nav/mobile-menu.tsx
@@ -0,0 +1,82 @@
+import Link from "next/link";
+import { Fragment } from "react";
+import { twMerge } from "tailwind-merge";
+import { Transition } from "@headlessui/react";
+
+import { UmaIcon } from "../icons";
+import { Button } from "../button";
+import { IconBox } from "../icon-box";
+
+import { NavItem } from "./types";
+
+export function MobileMenu(props: {
+ productsNavItems: NavItem[];
+ communityNavItems: NavItem[];
+ isMenuOpen: boolean;
+ onClickItem: () => void;
+ pathname: string;
+}) {
+ return (
+
+
+
+ {props.productsNavItems.map((item) => (
+
+
+
+
+
+
+
{item.label}
+
+ {item.description}
+
+
+
+
+ ))}
+
+
+ {props.communityNavItems.map((item) => (
+
+
+
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/src/app/_components/header-nav/products-sub-nav.tsx b/src/app/_components/header-nav/products-sub-nav.tsx
new file mode 100644
index 0000000..b32dc8b
--- /dev/null
+++ b/src/app/_components/header-nav/products-sub-nav.tsx
@@ -0,0 +1,78 @@
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import { twMerge } from "tailwind-merge";
+
+import { IconBox } from "../icon-box";
+
+import { NavItem } from "./types";
+
+const classNameOverrides: Record<
+ string,
+ {
+ iconClassName: string;
+ currentPathIconClassName: string;
+ }
+> & {} = {
+ "/across-bridge": {
+ iconClassName: "h-2 w-2 sm:h-4 sm:w-4",
+ currentPathIconClassName: "drop-shadow-aqua-sm sm:drop-shadow-aqua",
+ },
+ "/across-plus": {
+ iconClassName: "h-3 w-3 sm:h-4 sm:w-4",
+ currentPathIconClassName: "drop-shadow-teal-sm sm:drop-shadow-teal",
+ },
+ "/across-settlement": {
+ iconClassName: "h-2 w-3 sm:h-4 sm:w-4",
+ currentPathIconClassName: "drop-shadow-purple-sm sm:drop-shadow-purple",
+ },
+};
+
+export function ProductsSubNav(props: { navItems: NavItem[] }) {
+ const pathname = usePathname();
+ const isCurrentPath = (href: string) => pathname.startsWith(href);
+
+ return (
+
+
+ {props.navItems.map((item) => (
+
+
+
+
+
+
+ {item.label}
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/src/app/_components/header-nav/types.ts b/src/app/_components/header-nav/types.ts
new file mode 100644
index 0000000..92f92d2
--- /dev/null
+++ b/src/app/_components/header-nav/types.ts
@@ -0,0 +1,11 @@
+import { SVGProps } from "react";
+
+export type NavItem = {
+ label: string;
+ description: string;
+ href: string;
+ Icon: (props: SVGProps) => React.ReactNode;
+ iconClassName: string;
+ iconContainerClassName: string;
+ containerClassName: string;
+};
diff --git a/src/app/_components/icon-box.tsx b/src/app/_components/icon-box.tsx
new file mode 100644
index 0000000..34527b2
--- /dev/null
+++ b/src/app/_components/icon-box.tsx
@@ -0,0 +1,16 @@
+import { ComponentProps } from "react";
+import { twMerge } from "tailwind-merge";
+
+type Props = ComponentProps<"div">;
+
+export function IconBox({ className, ...props }: Props) {
+ return (
+
+ );
+}
diff --git a/src/app/_components/icons/across.tsx b/src/app/_components/icons/across.tsx
index f30e08d..239d6cf 100644
--- a/src/app/_components/icons/across.tsx
+++ b/src/app/_components/icons/across.tsx
@@ -14,8 +14,8 @@ export function AcrossIcon({ className, ...props }: SVGProps) {
>
diff --git a/src/app/_components/icons/chevron-down.tsx b/src/app/_components/icons/chevron-down.tsx
new file mode 100644
index 0000000..89b7de1
--- /dev/null
+++ b/src/app/_components/icons/chevron-down.tsx
@@ -0,0 +1,21 @@
+import { SVGProps } from "react";
+
+export function ChevronDownIcon(props: SVGProps) {
+ return (
+
+ );
+}
diff --git a/src/app/_components/icons/discord.tsx b/src/app/_components/icons/discord.tsx
new file mode 100644
index 0000000..79825fb
--- /dev/null
+++ b/src/app/_components/icons/discord.tsx
@@ -0,0 +1,19 @@
+import { SVGProps } from "react";
+
+export function DiscordIcon(props: SVGProps) {
+ return (
+
+ );
+}
diff --git a/src/app/_components/icons/gradient/arrow-up.tsx b/src/app/_components/icons/gradient/arrow-up.tsx
index dd02336..2d402e4 100644
--- a/src/app/_components/icons/gradient/arrow-up.tsx
+++ b/src/app/_components/icons/gradient/arrow-up.tsx
@@ -10,7 +10,7 @@ export function ArrowUpIcon(props: SVGProps) {
xmlns="http://www.w3.org/2000/svg"
{...props}
>
-
+
) {
height="25.7143"
rx="6"
fill="#44D2FF"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.7143"
rx="6"
fill="#44D2FF"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
) {
y2="57.7152"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="57.7152"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="70.7153"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="70.7153"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/blocks-connected.tsx b/src/app/_components/icons/gradient/blocks-connected.tsx
index a506132..4d04998 100644
--- a/src/app/_components/icons/gradient/blocks-connected.tsx
+++ b/src/app/_components/icons/gradient/blocks-connected.tsx
@@ -10,7 +10,7 @@ export function BlocksConnectedIcon(props: SVGProps) {
xmlns="http://www.w3.org/2000/svg"
{...props}
>
-
+
) {
height="25.7143"
rx="6"
fill="#AA81FF"
- fill-opacity="0.2"
+ fillOpacity="0.2"
/>
) {
height="25.7143"
rx="6"
fill="#AA81FF"
- fill-opacity="0.2"
+ fillOpacity="0.2"
/>
) {
fill="url(#paint0_linear_564_7341)"
/>
@@ -67,13 +67,13 @@ export function BlocksConnectedIcon(props: SVGProps) {
y2="41.7141"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="67.4272"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="78.8557"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/blocks-diagonal.tsx b/src/app/_components/icons/gradient/blocks-diagonal.tsx
index f90a0ba..9b2dd2e 100644
--- a/src/app/_components/icons/gradient/blocks-diagonal.tsx
+++ b/src/app/_components/icons/gradient/blocks-diagonal.tsx
@@ -16,7 +16,7 @@ export function BlocksDiagonalIcon(props: SVGProps) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
y2="96"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="96"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="60.75"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="60.75"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="25.5"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="25.5"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/bridge.tsx b/src/app/_components/icons/gradient/bridge.tsx
index a32e625..a3c151a 100644
--- a/src/app/_components/icons/gradient/bridge.tsx
+++ b/src/app/_components/icons/gradient/bridge.tsx
@@ -2,18 +2,11 @@ import { SVGProps } from "react";
export function BridgeIcon(props: SVGProps) {
return (
-
diff --git a/src/app/_components/icons/gradient/checkmark-simple.tsx b/src/app/_components/icons/gradient/checkmark-simple.tsx
index 84a21b0..e7e18e3 100644
--- a/src/app/_components/icons/gradient/checkmark-simple.tsx
+++ b/src/app/_components/icons/gradient/checkmark-simple.tsx
@@ -2,18 +2,11 @@ import { SVGProps } from "react";
export function CheckmarkSimpleIcon(props: SVGProps) {
return (
-
-
+
+
@@ -27,13 +20,13 @@ export function CheckmarkSimpleIcon(props: SVGProps) {
y2="22.9333"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/checkmark.tsx b/src/app/_components/icons/gradient/checkmark.tsx
index 37cfe97..3aa7239 100644
--- a/src/app/_components/icons/gradient/checkmark.tsx
+++ b/src/app/_components/icons/gradient/checkmark.tsx
@@ -15,11 +15,11 @@ export function CheckmarkIcon(props: SVGProps) {
height="96"
rx="48"
fill="url(#paint0_linear_564_7350)"
- fill-opacity="0.2"
+ fillOpacity="0.2"
/>
@@ -32,8 +32,8 @@ export function CheckmarkIcon(props: SVGProps) {
y2="96"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
) {
y2="82.2859"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/code.tsx b/src/app/_components/icons/gradient/code.tsx
index a5b02e5..b1e1410 100644
--- a/src/app/_components/icons/gradient/code.tsx
+++ b/src/app/_components/icons/gradient/code.tsx
@@ -16,7 +16,7 @@ export function CodeIcon(props: SVGProps) {
height="25.7143"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="24"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.7143"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
@@ -66,9 +66,9 @@ export function CodeIcon(props: SVGProps) {
width="101.08"
height="88.2525"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
) {
y2="77.3025"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/cross-chain.tsx b/src/app/_components/icons/gradient/cross-chain.tsx
index c74c331..c83bc77 100644
--- a/src/app/_components/icons/gradient/cross-chain.tsx
+++ b/src/app/_components/icons/gradient/cross-chain.tsx
@@ -9,7 +9,7 @@ export function CrossChainIcon(props: SVGProps) {
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
-
+
) {
height="25.5"
rx="6"
fill="#AA81FF"
- fill-opacity="0.2"
+ fillOpacity="0.2"
/>
) {
height="25.5"
rx="6"
fill="#AA81FF"
- fill-opacity="0.2"
- />
-
+
) {
height="25.5"
rx="6"
fill="#AA81FF"
- fill-opacity="0.2"
+ fillOpacity="0.2"
/>
) {
height="25.5"
rx="6"
fill="#AA81FF"
- fill-opacity="0.2"
+ fillOpacity="0.2"
/>
-
+
) {
height="25.5"
rx="6"
fill="#AA81FF"
- fill-opacity="0.2"
+ fillOpacity="0.2"
/>
) {
y2="60.75"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="82.2859"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/dollar.tsx b/src/app/_components/icons/gradient/dollar.tsx
index f840eff..86513a0 100644
--- a/src/app/_components/icons/gradient/dollar.tsx
+++ b/src/app/_components/icons/gradient/dollar.tsx
@@ -10,7 +10,7 @@ export function DollarIcon(props: SVGProps) {
xmlns="http://www.w3.org/2000/svg"
{...props}
>
-
+
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.7143"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
@@ -60,13 +60,13 @@ export function DollarIcon(props: SVGProps) {
y2="81.4292"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/double-chevron-right.tsx b/src/app/_components/icons/gradient/double-chevron-right.tsx
index 9b759cc..b06e54f 100644
--- a/src/app/_components/icons/gradient/double-chevron-right.tsx
+++ b/src/app/_components/icons/gradient/double-chevron-right.tsx
@@ -16,7 +16,7 @@ export function DoubleChevronRightIcon(props: SVGProps) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
height="25.5"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
y2="48.001"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="48.001"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/feather.tsx b/src/app/_components/icons/gradient/feather.tsx
index 0002218..1839ac2 100644
--- a/src/app/_components/icons/gradient/feather.tsx
+++ b/src/app/_components/icons/gradient/feather.tsx
@@ -13,10 +13,10 @@ export function FeatherIcon(props: SVGProps) {
) {
fill="url(#paint2_linear_564_7302)"
/>
) {
y2="90.8574"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
) {
y2="66.0018"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="66.0018"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="90.8574"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
diff --git a/src/app/_components/icons/gradient/logos/arbitrum.tsx b/src/app/_components/icons/gradient/logos/arbitrum.tsx
index 73748c4..71c375e 100644
--- a/src/app/_components/icons/gradient/logos/arbitrum.tsx
+++ b/src/app/_components/icons/gradient/logos/arbitrum.tsx
@@ -13,8 +13,8 @@ export function ArbitrumIcon({ variant = "aqua", ...props }: LogoIconProps) {
>
@@ -27,9 +27,9 @@ export function ArbitrumIcon({ variant = "aqua", ...props }: LogoIconProps) {
width="70"
height="75"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/logos/base.tsx b/src/app/_components/icons/gradient/logos/base.tsx
index fb09f1c..d197625 100644
--- a/src/app/_components/icons/gradient/logos/base.tsx
+++ b/src/app/_components/icons/gradient/logos/base.tsx
@@ -11,7 +11,7 @@ export function BaseIcon({ variant = "aqua", ...props }: LogoIconProps) {
fill="none"
{...props}
>
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/logos/ethereum.tsx b/src/app/_components/icons/gradient/logos/ethereum.tsx
index b78c959..7876867 100644
--- a/src/app/_components/icons/gradient/logos/ethereum.tsx
+++ b/src/app/_components/icons/gradient/logos/ethereum.tsx
@@ -45,9 +45,9 @@ export function EthereumIcon({ variant = "aqua", ...props }: LogoIconProps) {
width="58"
height="80"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/logos/optimism.tsx b/src/app/_components/icons/gradient/logos/optimism.tsx
index 326a013..5caf079 100644
--- a/src/app/_components/icons/gradient/logos/optimism.tsx
+++ b/src/app/_components/icons/gradient/logos/optimism.tsx
@@ -29,9 +29,9 @@ export function OptimismIcon({ variant = "aqua", ...props }: LogoIconProps) {
width="88"
height="58"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/logos/polygon.tsx b/src/app/_components/icons/gradient/logos/polygon.tsx
index 07e9c0f..2b0d685 100644
--- a/src/app/_components/icons/gradient/logos/polygon.tsx
+++ b/src/app/_components/icons/gradient/logos/polygon.tsx
@@ -25,9 +25,9 @@ export function PolygonIcon({ variant = "aqua", ...props }: LogoIconProps) {
width="76"
height="71"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/logos/zksync.tsx b/src/app/_components/icons/gradient/logos/zksync.tsx
index 0da0e1b..efc8c32 100644
--- a/src/app/_components/icons/gradient/logos/zksync.tsx
+++ b/src/app/_components/icons/gradient/logos/zksync.tsx
@@ -11,26 +11,26 @@ export function ZkSyncIcon({ variant = "aqua", ...props }: LogoIconProps) {
fill="none"
{...props}
>
-
+
@@ -43,9 +43,9 @@ export function ZkSyncIcon({ variant = "aqua", ...props }: LogoIconProps) {
width="72"
height="73"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/plus.tsx b/src/app/_components/icons/gradient/plus.tsx
index af0ea13..9da1d4f 100644
--- a/src/app/_components/icons/gradient/plus.tsx
+++ b/src/app/_components/icons/gradient/plus.tsx
@@ -2,24 +2,17 @@ import { SVGProps } from "react";
export function PlusIcon(props: SVGProps) {
return (
-
-
+
+
@@ -32,9 +25,9 @@ export function PlusIcon(props: SVGProps) {
width="65"
height="64"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
) {
y2="39.8076"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="40"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/shield-large.tsx b/src/app/_components/icons/gradient/shield-large.tsx
index d5a56ca..024f2ab 100644
--- a/src/app/_components/icons/gradient/shield-large.tsx
+++ b/src/app/_components/icons/gradient/shield-large.tsx
@@ -10,14 +10,14 @@ export function ShieldLargeIcon(props: SVGProps) {
xmlns="http://www.w3.org/2000/svg"
{...props}
>
-
+
) {
height="25.7143"
rx="6"
fill="#6CF9D8"
- fill-opacity="0.15"
+ fillOpacity="0.15"
/>
) {
width="76.8659"
height="89.7819"
filterUnits="userSpaceOnUse"
- color-interpolation-filters="sRGB"
+ colorInterpolationFilters="sRGB"
>
-
+
) {
y2="81.2573"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) {
y2="81.2573"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/gradient/shield-small.tsx b/src/app/_components/icons/gradient/shield-small.tsx
index da4bacd..c757dd0 100644
--- a/src/app/_components/icons/gradient/shield-small.tsx
+++ b/src/app/_components/icons/gradient/shield-small.tsx
@@ -16,11 +16,11 @@ export function ShieldIcon(props: SVGProps) {
height="87.4286"
rx="43.7143"
stroke="url(#paint0_linear_564_7328)"
- stroke-opacity="0.15"
- stroke-width="8.57143"
- stroke-linecap="round"
- stroke-linejoin="round"
- stroke-dasharray="44.57 44.57"
+ strokeOpacity="0.15"
+ strokeWidth="8.57143"
+ strokeLinecap="round"
+ strokeLinejoin="round"
+ strokeDasharray="44.57 44.57"
/>
) {
y2="96"
gradientUnits="userSpaceOnUse"
>
-
-
+
+
) {
y2="73.7144"
gradientUnits="userSpaceOnUse"
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/app/_components/icons/index.tsx b/src/app/_components/icons/index.tsx
index 7671471..016a27a 100644
--- a/src/app/_components/icons/index.tsx
+++ b/src/app/_components/icons/index.tsx
@@ -1,4 +1,11 @@
export { AcrossIcon } from "./across";
+export { UmaIcon } from "./uma";
+export { MenuIcon } from "./menu";
+export { MinusIcon } from "./minus";
+export { DiscordIcon } from "./discord";
+export { MediumIcon } from "./medium";
+export { TwitterIcon } from "./twitter";
+export { ChevronDownIcon } from "./chevron-down";
// Gradient icons
export { ArrowUpIcon } from "./gradient/arrow-up";
diff --git a/src/app/_components/icons/medium.tsx b/src/app/_components/icons/medium.tsx
new file mode 100644
index 0000000..4e8ef75
--- /dev/null
+++ b/src/app/_components/icons/medium.tsx
@@ -0,0 +1,19 @@
+import { SVGProps } from "react";
+
+export function MediumIcon(props: SVGProps) {
+ return (
+
+
+
+ );
+}
diff --git a/src/app/_components/icons/menu.tsx b/src/app/_components/icons/menu.tsx
new file mode 100644
index 0000000..c1ffb8a
--- /dev/null
+++ b/src/app/_components/icons/menu.tsx
@@ -0,0 +1,18 @@
+import { SVGProps } from "react";
+
+export function MenuIcon(props: SVGProps) {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/app/_components/icons/minus.tsx b/src/app/_components/icons/minus.tsx
new file mode 100644
index 0000000..d316b25
--- /dev/null
+++ b/src/app/_components/icons/minus.tsx
@@ -0,0 +1,16 @@
+import { SVGProps } from "react";
+
+export function MinusIcon(props: SVGProps) {
+ return (
+
+
+
+ );
+}
diff --git a/src/app/_components/icons/twitter.tsx b/src/app/_components/icons/twitter.tsx
new file mode 100644
index 0000000..b073d48
--- /dev/null
+++ b/src/app/_components/icons/twitter.tsx
@@ -0,0 +1,26 @@
+import { SVGProps } from "react";
+
+export function TwitterIcon(props: SVGProps) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/_components/icons/uma.tsx b/src/app/_components/icons/uma.tsx
new file mode 100644
index 0000000..67828eb
--- /dev/null
+++ b/src/app/_components/icons/uma.tsx
@@ -0,0 +1,51 @@
+import { SVGProps } from "react";
+
+export function UmaIcon(props: SVGProps) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/tailwind.config.ts b/tailwind.config.ts
index bddb2f4..1debaef 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -14,8 +14,10 @@ const config: Config = {
300: "#C5D5E0",
},
grey: {
+ light: "#313237",
dark: "#2D2E33",
400: "#9DAAB3",
+ 600: "#3E4047",
},
aqua: {
100: "#6CF9D8",
@@ -47,12 +49,40 @@ const config: Config = {
"tight-4": "-0.12rem", // -1.92px
"tight-5": "-0.04rem", // -0.64px
"tight-6": "-0.03rem", // -0.48px
+ "wide-4": "0.12rem", // 1.92px
},
extend: {
- backgroundImage: {
- "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
- "gradient-conic":
- "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
+ dropShadow: {
+ "aqua-sm": [
+ "0px 0px 8.286px #6CF9D8",
+ "0px 0px 5.919px #00A27C",
+ "0px 0px 1.578px rgba(0, 0, 0, 0.25)",
+ ],
+ aqua: [
+ "0px 0px 13.811px #6CF9D8",
+ "0px 0px 9.865px #00A27C",
+ "0px 0px 2.631px rgba(0, 0, 0, 0.25)",
+ ],
+ "teal-sm": [
+ "0px 0px 8.286px #7FE9E1",
+ "0px 0px 5.919px #7FBCE9",
+ "0px 0px 1.578px rgba(0, 0, 0, 0.25)",
+ ],
+ teal: [
+ "0px 0px 13.811px #7FE9E1",
+ "0px 0px 9.865px #7FBCE9",
+ "0px 0px 2.631px rgba(0, 0, 0, 0.25)",
+ ],
+ "purple-sm": [
+ "0px 0px 8.286px #E66DFA",
+ "0px 0px 5.919px #974AE4",
+ "0px 0px 1.578px rgba(0, 0, 0, 0.25)",
+ ],
+ purple: [
+ "0px 0px 13.811px #E66DFA",
+ "0px 0px 9.865px #974AE4",
+ "0px 0px 2.631px rgba(0, 0, 0, 0.25)",
+ ],
},
},
},
diff --git a/yarn.lock b/yarn.lock
index 1e26e44..327a6c0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -51,6 +51,14 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
+"@headlessui/react@^1.7.18":
+ version "1.7.18"
+ resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.18.tgz#30af4634d2215b2ca1aa29d07f33d02bea82d9d7"
+ integrity sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==
+ dependencies:
+ "@tanstack/react-virtual" "^3.0.0-beta.60"
+ client-only "^0.0.1"
+
"@humanwhocodes/config-array@^0.11.13":
version "0.11.14"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
@@ -209,6 +217,18 @@
dependencies:
tslib "^2.4.0"
+"@tanstack/react-virtual@^3.0.0-beta.60":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.0.4.tgz#32a90aa6faa2eeebb5f4ca561d26bae9f3435e45"
+ integrity sha512-tiqKW/e2MJVCr7/pRUXulpkyxllaOclkHNfhKTo4pmHjJIqnhMfwIjc1Q1R0Un3PI3kQywywu/791c8z9u0qeA==
+ dependencies:
+ "@tanstack/virtual-core" "3.0.0"
+
+"@tanstack/virtual-core@3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.0.0.tgz#637bee36f0cabf96a1d436887c90f138a7e9378b"
+ integrity sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==
+
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@@ -586,7 +606,7 @@ chokidar@^3.5.3:
optionalDependencies:
fsevents "~2.3.2"
-client-only@0.0.1:
+client-only@0.0.1, client-only@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==