Hey is a decentralized and permissionless social media app built with Lens Protocol ๐ŸŒฟ

๐Ÿš€ Migrate to Vite from Next.js (#vite)

Summary: Migrated from Next.js to Vite, updated routing, and adjusted styles.

Highlights:

โ€ข Removed Next.js dependencies and added Vite configuration in `vite.config.ts`.
โ€ข Consolidated routing logic into `routes.tsx` using `react-router`.
โ€ข Updated `styles.css` to change the font family to "SofiaPro".

Read more: https://pierre.co/yo/hey/vite

authored by yoginth.com and committed by

Pierre 242abb18 1630f8a8

+1537 -788
+1 -1
apps/web/.env.example
··· 1 - NEXT_PUBLIC_IS_PRODUCTION=false 1 + VITE_IS_PRODUCTION=false 2 2 NEXT_PUBLIC_LENS_NETWORK="testnet" # mainnet, testnet
+1 -2
apps/web/.prettierignore
··· 1 - .next 2 - out 1 + dist
+23
apps/web/index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 + <link rel="icon" type="image/png" href="/favicon.ico"> 7 + <link rel="preload" href="/assets/fonts/SofiaProSoftReg.woff2" type="font/woff2" as="font" /> 8 + <link rel="preload" href="/assets/fonts/SofiaProSoftMed.woff2" type="font/woff2" as="font" /> 9 + <link rel="preload" href="/assets/fonts/SofiaProSoftBold.woff2" type="font/woff2" as="font" /> 10 + <link rel="stylesheet" href="/src/font.css" /> 11 + <link rel="stylesheet" href="/src/styles.css" /> 12 + <script 13 + async 14 + data-hostname="hey.xyz" 15 + src="https://scripts.simpleanalyticscdn.com/latest.dev.js" 16 + ></script> 17 + <title>Hey</title> 18 + </head> 19 + <body> 20 + <main id="_hey_"></main> 21 + <script type="module" src="/src/main.tsx"></script> 22 + </body> 23 + </html>
-5
apps/web/next-env.d.ts
··· 1 - /// <reference types="next" /> 2 - /// <reference types="next/image-types/global" /> 3 - 4 - // NOTE: This file should not be edited 5 - // see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.
-88
apps/web/next.config.mjs
··· 1 - import bundleAnalyzer from "@next/bundle-analyzer"; 2 - 3 - const withBundleAnalyzer = bundleAnalyzer({ 4 - enabled: process.env.ANALYZE === "true" 5 - }); 6 - 7 - const allowedBots = 8 - ".*(bot|telegram|baidu|bing|yandex|iframely|whatsapp|facebook).*"; 9 - 10 - // Remove data-testid from production 11 - const isDevelopment = process.env.NODE_ENV === "development"; 12 - const compilerOptions = isDevelopment 13 - ? {} 14 - : { compiler: { reactRemoveProperties: { properties: ["^data-testid$"] } } }; 15 - 16 - /** @type {import('next').NextConfig} */ 17 - const nextConfig = { 18 - ...compilerOptions, 19 - poweredByHeader: false, 20 - productionBrowserSourceMaps: true, 21 - reactStrictMode: false, 22 - devIndicators: false, 23 - webpack(config) { 24 - config.optimization.splitChunks = { 25 - chunks: "all", 26 - minSize: 100 * 1024, // 100KB 27 - maxSize: 180 * 1024, // 180KB 28 - automaticNameDelimiter: ".", 29 - cacheGroups: { 30 - defaultVendors: { 31 - test: /[\\/]node_modules[\\/]/, 32 - priority: -10, 33 - reuseExistingChunk: true 34 - }, 35 - default: { minChunks: 2, priority: -20, reuseExistingChunk: true } 36 - } 37 - }; 38 - 39 - return config; 40 - }, 41 - images: { 42 - remotePatterns: [{ hostname: "static.hey.xyz" }] 43 - }, 44 - headers() { 45 - return [ 46 - { 47 - headers: [ 48 - { key: "Referrer-Policy", value: "strict-origin" }, 49 - { key: "X-Content-Type-Options", value: "nosniff" }, 50 - { key: "X-XSS-Protection", value: "1; mode=block" } 51 - ], 52 - source: "/(.*)" 53 - } 54 - ]; 55 - }, 56 - redirects() { 57 - return [ 58 - { 59 - destination: "https://discord.com/invite/B8eKhSSUwX", 60 - permanent: true, 61 - source: "/discord" 62 - }, 63 - { 64 - destination: 65 - "https://explorer.gitcoin.co/#/round/42161/608/6?utm_source=hey.xyz", 66 - permanent: true, 67 - source: "/gitcoin" 68 - } 69 - ]; 70 - }, 71 - rewrites() { 72 - return [ 73 - { 74 - destination: "https://og.hey.xyz/u/:match*", 75 - has: [{ key: "user-agent", type: "header", value: allowedBots }], 76 - source: "/u/:match*" 77 - }, 78 - { 79 - destination: "https://og.hey.xyz/posts/:match*", 80 - has: [{ key: "user-agent", type: "header", value: allowedBots }], 81 - source: "/posts/:match*" 82 - } 83 - ]; 84 - }, 85 - transpilePackages: ["data"] 86 - }; 87 - 88 - export default withBundleAnalyzer(nextConfig);
+11 -7
apps/web/package.json
··· 4 4 "private": true, 5 5 "license": "AGPL-3.0", 6 6 "scripts": { 7 - "build": "next build", 8 - "dev": "next dev --port 4783", 9 - "start": "next start --port 4783", 10 - "typecheck": "tsc --pretty" 7 + "build": "vite build", 8 + "dev": "vite dev --port 4783", 9 + "start": "vite start --port 4783", 10 + "typecheck": "tsc --pretty", 11 + "preview": "vite preview --port 4783" 11 12 }, 12 13 "dependencies": { 13 14 "@apollo/client": "^3.13.5", ··· 24 25 "@lens-chain/storage-client": "^1.0.3", 25 26 "@lens-protocol/metadata": "next", 26 27 "@livepeer/react": "^4.3.0", 27 - "@next/bundle-analyzer": "^15.2.4", 28 28 "@radix-ui/react-hover-card": "^1.1.6", 29 29 "@radix-ui/react-slider": "^1.2.3", 30 30 "@radix-ui/react-switch": "^1.1.3", ··· 38 38 "clsx": "^2.1.1", 39 39 "connectkit": "^1.8.2", 40 40 "esbuild": "^0.25.1", 41 - "next": "^15.2.4", 42 41 "next-themes": "^0.4.6", 43 42 "plur": "^5.1.0", 44 43 "plyr-react": "^5.3.0", ··· 51 50 "react-hook-form": "^7.54.2", 52 51 "react-hot-toast": "^2.5.2", 53 52 "react-markdown": "^10.1.0", 53 + "react-router": "^7.4.0", 54 + "react-scan": "^0.3.3", 54 55 "react-tracked": "^2.0.1", 55 56 "react-virtuoso": "^4.12.5", 56 57 "rehype-parse": "^9.0.1", ··· 65 66 "unified": "^11.0.5", 66 67 "unist-util-visit-parents": "^6.0.1", 67 68 "viem": "^2.23.15", 69 + "vite": "^6.2.3", 68 70 "wagmi": "^2.14.15", 69 71 "zod": "^3.24.2", 70 72 "zustand": "5.0.3" ··· 77 79 "@types/node": "^22.13.13", 78 80 "@types/react": "^19.0.12", 79 81 "@types/react-dom": "^19.0.4", 82 + "@vitejs/plugin-react": "^4.3.4", 80 83 "autoprefixer": "^10.4.21", 81 84 "postcss": "^8.5.3", 82 85 "tailwindcss": "3.4.17", 83 - "typescript": "^5.7.3" 86 + "typescript": "^5.7.3", 87 + "vite-plugin-environment": "^1.1.3" 84 88 } 85 89 }
apps/web/public/fonts/SofiaProSoftBold.woff2 apps/web/src/assets/fonts/SofiaProSoftBold.woff2
apps/web/public/fonts/SofiaProSoftMed.woff2 apps/web/src/assets/fonts/SofiaProSoftMed.woff2
apps/web/public/fonts/SofiaProSoftReg.woff2 apps/web/src/assets/fonts/SofiaProSoftReg.woff2
+5 -6
apps/web/src/components/Account/Details.tsx
··· 20 20 import getMentions from "@hey/helpers/getMentions"; 21 21 import type { AccountFragment } from "@hey/indexer"; 22 22 import { useTheme } from "next-themes"; 23 - import Link from "next/link"; 24 - import { useRouter } from "next/router"; 25 23 import type { ReactNode } from "react"; 26 24 import { useState } from "react"; 25 + import { Link, useNavigate } from "react-router"; 27 26 import Followerings from "./Followerings"; 28 27 import FollowersYouKnowOverview from "./FollowersYouKnowOverview"; 29 28 import InternalTools from "./InternalTools"; ··· 36 35 } 37 36 38 37 const Details = ({ isSuspended = false, account }: DetailsProps) => { 39 - const { push } = useRouter(); 38 + const navigate = useNavigate(); 40 39 const { currentAccount } = useAccountStore(); 41 40 const [expandedImage, setExpandedImage] = useState<null | string>(null); 42 41 const isStaff = hasAccess(Features.Staff); ··· 52 51 return ( 53 52 <MetaDetails icon={icon}> 54 53 <Link 55 - href={ 54 + to={ 56 55 attribute === "website" 57 56 ? `https://${value.replace(/https?:\/\//, "")}` 58 57 : `https://x.com/${value.replace("https://x.com/", "")}` ··· 114 113 {currentAccount?.address === account.address ? ( 115 114 <Button 116 115 icon={<Cog6ToothIcon className="size-5" />} 117 - onClick={() => push("/settings")} 116 + onClick={() => navigate("/settings")} 118 117 outline 119 118 > 120 119 Edit Account ··· 138 137 > 139 138 <Link 140 139 className="text-yellow-600" 141 - href={`/staff/accounts/${account.address}`} 140 + to={`/staff/accounts/${account.address}`} 142 141 > 143 142 Open in Staff Tools 144 143 </Link>
+10 -8
apps/web/src/components/Account/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 2 import NewPost from "@/components/Composer/NewPost"; 3 + import Custom404 from "@/components/Shared/404"; 4 + import Custom500 from "@/components/Shared/500"; 3 5 import Cover from "@/components/Shared/Cover"; 4 6 import { 5 7 EmptyState, ··· 9 11 } from "@/components/Shared/UI"; 10 12 import hasAccess from "@/helpers/hasAccess"; 11 13 import { trpc } from "@/helpers/trpc"; 12 - import Custom404 from "@/pages/404"; 13 - import Custom500 from "@/pages/500"; 14 14 import { useAccountStore } from "@/store/persisted/useAccountStore"; 15 15 import { NoSymbolIcon } from "@heroicons/react/24/outline"; 16 16 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; ··· 20 20 import isAccountDeleted from "@hey/helpers/isAccountDeleted"; 21 21 import { useAccountQuery } from "@hey/indexer"; 22 22 import { useQuery } from "@tanstack/react-query"; 23 - import { useRouter } from "next/router"; 23 + import { useParams } from "react-router"; 24 24 import AccountFeed from "./AccountFeed"; 25 25 import DeletedDetails from "./DeletedDetails"; 26 26 import Details from "./Details"; ··· 29 29 import SuspendedDetails from "./SuspendedDetails"; 30 30 31 31 const ViewProfile = () => { 32 - const { 33 - isReady, 34 - query: { username, address, type } 35 - } = useRouter(); 32 + const { address, username, type } = useParams<{ 33 + address: string; 34 + username: string; 35 + type: string; 36 + }>(); 37 + 36 38 const { currentAccount } = useAccountStore(); 37 39 const isStaff = hasAccess(Features.Staff); 38 40 ··· 71 73 ) 72 74 ); 73 75 74 - if (!isReady || loading) { 76 + if ((!username && !address) || loading) { 75 77 return <AccountPageShimmer />; 76 78 } 77 79
+1 -1
apps/web/src/components/Common/ErrorBoundary.tsx
··· 1 - import Custom500 from "@/pages/500"; 1 + import Custom500 from "@/components/Shared/500"; 2 2 import type { ErrorInfo, ReactNode } from "react"; 3 3 import { Component } from "react"; 4 4
+4 -10
apps/web/src/components/Common/Layout.tsx
··· 11 11 import { useMeQuery } from "@hey/indexer"; 12 12 import { useIsClient } from "@uidotdev/usehooks"; 13 13 import { useTheme } from "next-themes"; 14 - import { useRouter } from "next/router"; 15 - import type { ReactNode } from "react"; 16 14 import { useEffect } from "react"; 17 15 import { Toaster } from "react-hot-toast"; 16 + import { Outlet } from "react-router"; 18 17 import GlobalModals from "../Shared/GlobalModals"; 19 18 import Navbar from "../Shared/Navbar"; 20 19 21 - interface LayoutProps { 22 - children: ReactNode; 23 - } 24 - 25 - const Layout = ({ children }: LayoutProps) => { 26 - const { reload } = useRouter(); 20 + const Layout = () => { 27 21 const { resolvedTheme } = useTheme(); 28 22 const { currentAccount, setCurrentAccount } = useAccountStore(); 29 23 const { resetPreferences } = usePreferencesStore(); ··· 36 30 resetStatus(); 37 31 signOut(); 38 32 if (shouldReload) { 39 - reload(); 33 + location.reload(); 40 34 } 41 35 }; 42 36 ··· 71 65 <Navbar /> 72 66 <GlobalBanners /> 73 67 <BottomNavigation /> 74 - {children} 68 + <Outlet /> 75 69 </div> 76 70 </main> 77 71 );
+3 -15
apps/web/src/components/Common/MetaTags.tsx
··· 1 - import { 2 - APP_NAME, 3 - APP_URL, 4 - DEFAULT_OG, 5 - DESCRIPTION 6 - } from "@hey/data/constants"; 7 - import Head from "next/head"; 8 - import { useRouter } from "next/router"; 1 + import { APP_NAME, DEFAULT_OG, DESCRIPTION } from "@hey/data/constants"; 9 2 10 3 interface MetaTagsProps { 11 4 creator?: string; ··· 18 11 description = DESCRIPTION, 19 12 title = APP_NAME 20 13 }: MetaTagsProps) => { 21 - const { asPath } = useRouter(); 22 - const url = `${APP_URL}${asPath}`; 23 - 24 14 return ( 25 - <Head> 15 + <head> 26 16 <title>{title}</title> 27 17 <meta content={description} name="description" /> 28 18 <meta 29 19 content="width=device-width, initial-scale=1, maximum-scale=5, viewport-fit=cover" 30 20 name="viewport" 31 21 /> 32 - <link href={url} rel="canonical" /> 33 22 34 - <meta content={url} property="og:url" /> 35 23 <meta content={APP_NAME} property="og:site_name" /> 36 24 <meta content={title} property="og:title" /> 37 25 <meta content={description} property="og:description" /> ··· 52 40 <meta content={creator} property="publisher" /> 53 41 </> 54 42 )} 55 - </Head> 43 + </head> 56 44 ); 57 45 }; 58 46
+1 -2
apps/web/src/components/Common/Providers/Web3Provider.tsx
··· 1 - import { heyFont } from "@/helpers/fonts"; 2 1 import { 3 2 APP_NAME, 4 3 APP_URL, ··· 39 38 theme="soft" 40 39 options={{ hideNoWalletCTA: true, hideQuestionMarkCTA: true }} 41 40 customTheme={{ 42 - "--ck-font-family": heyFont.style.fontFamily, 41 + "--ck-font-family": "SofiaPro", 43 42 "--ck-border-radius": "12px", 44 43 "--ck-body-background": "#ffffff", 45 44 "--ck-focus-color": BRAND_COLOR
+1 -2
apps/web/src/components/Common/Providers/index.tsx
··· 6 6 import { ThemeProvider } from "next-themes"; 7 7 import type { ReactNode } from "react"; 8 8 import ErrorBoundary from "../ErrorBoundary"; 9 - import Layout from "../Layout"; 10 9 import OptimisticPublicationProvider from "./OptimisticPublicationProvider"; 11 10 import PreferencesProvider from "./PreferencesProvider"; 12 11 import Web3Provider from "./Web3Provider"; ··· 27 26 <OptimisticPublicationProvider /> 28 27 <PreferencesProvider /> 29 28 <ThemeProvider attribute="class" defaultTheme="light"> 30 - <Layout>{children}</Layout> 29 + {children} 31 30 </ThemeProvider> 32 31 </ApolloProvider> 33 32 </Web3Provider>
+2 -2
apps/web/src/components/Composer/LicensePicker.tsx
··· 2 2 import getAssetLicense from "@/helpers/getAssetLicense"; 3 3 import { usePostLicenseStore } from "@/store/non-persisted/post/usePostLicenseStore"; 4 4 import { MetadataLicenseType } from "@hey/indexer"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 7 7 const LicensePicker = () => { 8 8 const { license, setLicense } = usePostLicenseStore(); ··· 52 52 "You are not granting a license to the collector and retain all rights."} 53 53 <Link 54 54 className="ml-1.5" 55 - href="https://yoginth.notion.site/60f9d82c5a274a88b8444611c7a8a94a" 55 + to="https://yoginth.notion.site/60f9d82c5a274a88b8444611c7a8a94a" 56 56 target="_blank" 57 57 > 58 58 Learn more.
+11 -5
apps/web/src/components/Composer/NewPost.tsx
··· 2 2 import { usePostStore } from "@/store/non-persisted/post/usePostStore"; 3 3 import { useAccountStore } from "@/store/persisted/useAccountStore"; 4 4 import getAvatar from "@hey/helpers/getAvatar"; 5 - import { useRouter } from "next/router"; 6 5 import { useEffect, useState } from "react"; 6 + import { useLocation } from "react-router"; 7 7 import NewPublication from "./NewPublication"; 8 8 9 9 interface NewPostProps { ··· 11 11 } 12 12 13 13 const NewPost = ({ feed }: NewPostProps) => { 14 - const { isReady, query } = useRouter(); 14 + const location = useLocation(); 15 + 16 + const searchParams = new URLSearchParams(location.search); 17 + const text = searchParams.get("text"); 18 + const hashtags = searchParams.get("hashtags"); 19 + const url = searchParams.get("url"); 20 + const via = searchParams.get("via"); 21 + 15 22 const { currentAccount } = useAccountStore(); 16 23 const { setPostContent } = usePostStore(); 17 24 const [showComposer, setShowComposer] = useState(false); ··· 21 28 }; 22 29 23 30 useEffect(() => { 24 - if (isReady && query.text) { 25 - const { hashtags, text, url, via } = query; 31 + if (text) { 26 32 let processedHashtags: string | undefined; 27 33 28 34 if (hashtags) { ··· 39 45 handleOpenModal(); 40 46 setPostContent(content); 41 47 } 42 - }, [query]); 48 + }, [text, hashtags, url, via]); 43 49 44 50 if (showComposer) { 45 51 return <NewPublication feed={feed} />;
+12 -8
apps/web/src/components/Explore/index.tsx
··· 10 10 import { useAccountStore } from "@/store/persisted/useAccountStore"; 11 11 import { Tab, TabGroup, TabList, TabPanel, TabPanels } from "@headlessui/react"; 12 12 import { MainContentFocus } from "@hey/indexer"; 13 - import { useRouter } from "next/router"; 14 13 import { useState } from "react"; 14 + import { useLocation, useNavigate } from "react-router"; 15 15 import ExploreFeed from "./ExploreFeed"; 16 16 import ImageFeed from "./ImageFeed"; 17 17 18 18 const Explore = () => { 19 - const router = useRouter(); 19 + const navigate = useNavigate(); 20 + const location = useLocation(); 21 + const searchParams = new URLSearchParams(location.search); 22 + const tab = Number(searchParams.get("tab")) || 0; 23 + 20 24 const { currentAccount } = useAccountStore(); 21 25 const [focus, setFocus] = useState<MainContentFocus>(); 22 26 ··· 34 38 <GridLayout> 35 39 <GridItemEight className="space-y-5"> 36 40 <TabGroup 37 - defaultIndex={Number(router.query.tab)} 41 + defaultIndex={Number(tab)} 38 42 onChange={(index) => { 39 - router.replace( 40 - { query: { ...router.query, tab: index } }, 41 - undefined, 42 - { shallow: true } 43 - ); 43 + const params = new URLSearchParams(location.search); 44 + params.set("tab", index.toString()); 45 + navigate(`${location.pathname}?${params.toString()}`, { 46 + replace: true 47 + }); 44 48 }} 45 49 > 46 50 <TabList className="divider space-x-8">
+3 -3
apps/web/src/components/Group/Details.tsx
··· 6 6 import getAvatar from "@hey/helpers/getAvatar"; 7 7 import getMentions from "@hey/helpers/getMentions"; 8 8 import type { GroupFragment } from "@hey/indexer"; 9 - import { useRouter } from "next/router"; 10 9 import { useState } from "react"; 10 + import { useNavigate } from "react-router"; 11 11 import MembersCount from "./MembersCount"; 12 12 13 13 interface DetailsProps { ··· 15 15 } 16 16 17 17 const Details = ({ group }: DetailsProps) => { 18 - const { push } = useRouter(); 18 + const navigate = useNavigate(); 19 19 const { currentAccount } = useAccountStore(); 20 20 const [expandedImage, setExpandedImage] = useState<null | string>(null); 21 21 ··· 47 47 <> 48 48 <Button 49 49 icon={<Cog6ToothIcon className="size-5" />} 50 - onClick={() => push(`/g/${group.address}/settings`)} 50 + onClick={() => navigate(`/g/${group.address}/settings`)} 51 51 outline 52 52 > 53 53 Edit Group
+5 -8
apps/web/src/components/Group/Settings/Overview/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 + import Custom404 from "@/components/Shared/404"; 3 + import Custom500 from "@/components/Shared/500"; 2 4 import NotLoggedIn from "@/components/Shared/NotLoggedIn"; 3 5 import { 4 6 GridItemEight, ··· 6 8 GridLayout, 7 9 PageLoading 8 10 } from "@/components/Shared/UI"; 9 - import Custom404 from "@/pages/404"; 10 - import Custom500 from "@/pages/500"; 11 11 import { useAccountStore } from "@/store/persisted/useAccountStore"; 12 12 import { APP_NAME } from "@hey/data/constants"; 13 13 import { useGroupQuery } from "@hey/indexer"; 14 - import { useRouter } from "next/router"; 14 + import { useParams } from "react-router"; 15 15 import SettingsSidebar from "../Sidebar"; 16 16 import GroupSettingsForm from "./Form"; 17 17 18 18 const GroupSettings = () => { 19 - const { 20 - isReady, 21 - query: { address } 22 - } = useRouter(); 19 + const { address } = useParams<{ address: string }>(); 23 20 const { currentAccount } = useAccountStore(); 24 21 25 22 const { data, loading, error } = useGroupQuery({ ··· 27 24 skip: !address 28 25 }); 29 26 30 - if (!isReady || loading) { 27 + if (!address || loading) { 31 28 return <PageLoading />; 32 29 } 33 30
+1 -3
apps/web/src/components/Group/Settings/Rules/SuperJoin.tsx
··· 27 27 type GroupRules, 28 28 useUpdateGroupRulesMutation 29 29 } from "@hey/indexer"; 30 - import { useRouter } from "next/router"; 31 30 import { type RefObject, useEffect, useRef, useState } from "react"; 32 31 import toast from "react-hot-toast"; 33 32 ··· 36 35 } 37 36 38 37 const SuperJoin = ({ group }: SuperJoinProps) => { 39 - const { reload } = useRouter(); 40 38 const { isSuspended } = useAccountStatus(); 41 39 const [isSubmitting, setIsSubmitting] = useState(false); 42 40 const [amount, setAmount] = useState(0); ··· 60 58 const onCompleted = (hash: string) => { 61 59 trackEvent(Events.Group.UpdateSettings, { type: "simple_payment_rule" }); 62 60 pollTransactionStatus(hash, () => { 63 - reload(); 61 + location.reload(); 64 62 }); 65 63 }; 66 64
+5 -8
apps/web/src/components/Group/Settings/Rules/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 + import Custom404 from "@/components/Shared/404"; 3 + import Custom500 from "@/components/Shared/500"; 2 4 import NotLoggedIn from "@/components/Shared/NotLoggedIn"; 3 5 import { 4 6 GridItemEight, ··· 6 8 GridLayout, 7 9 PageLoading 8 10 } from "@/components/Shared/UI"; 9 - import Custom404 from "@/pages/404"; 10 - import Custom500 from "@/pages/500"; 11 11 import { useAccountStore } from "@/store/persisted/useAccountStore"; 12 12 import { APP_NAME } from "@hey/data/constants"; 13 13 import { useGroupQuery } from "@hey/indexer"; 14 - import { useRouter } from "next/router"; 14 + import { useParams } from "react-router"; 15 15 import SettingsSidebar from "../Sidebar"; 16 16 import ApprovalRule from "./ApprovalRule"; 17 17 import SuperJoin from "./SuperJoin"; 18 18 19 19 const RulesSettings = () => { 20 - const { 21 - isReady, 22 - query: { address } 23 - } = useRouter(); 20 + const { address } = useParams<{ address: string }>(); 24 21 const { currentAccount } = useAccountStore(); 25 22 26 23 const { data, loading, error } = useGroupQuery({ ··· 28 25 skip: !address 29 26 }); 30 27 31 - if (!isReady || loading) { 28 + if (!address || loading) { 32 29 return <PageLoading />; 33 30 } 34 31
+3 -5
apps/web/src/components/Group/Settings/Sidebar.tsx
··· 2 2 import SingleGroup from "@/components/Shared/SingleGroup"; 3 3 import { LockClosedIcon, UserGroupIcon } from "@heroicons/react/24/outline"; 4 4 import type { GroupFragment } from "@hey/indexer"; 5 - import { useRouter } from "next/router"; 5 + import { useLocation, useParams } from "react-router"; 6 6 7 7 interface SettingsSidebarProps { 8 8 group: GroupFragment; 9 9 } 10 10 11 11 const SettingsSidebar = ({ group }: SettingsSidebarProps) => { 12 - const { 13 - pathname, 14 - query: { address } 15 - } = useRouter(); 12 + const { pathname } = useLocation(); 13 + const { address } = useParams<{ address: string }>(); 16 14 17 15 const sidebarItems = [ 18 16 {
+5 -8
apps/web/src/components/Group/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 2 import NewPost from "@/components/Composer/NewPost"; 3 + import Custom404 from "@/components/Shared/404"; 4 + import Custom500 from "@/components/Shared/500"; 3 5 import Cover from "@/components/Shared/Cover"; 4 6 import { 5 7 GridItemEight, ··· 7 9 GridLayout, 8 10 WarningMessage 9 11 } from "@/components/Shared/UI"; 10 - import Custom404 from "@/pages/404"; 11 - import Custom500 from "@/pages/500"; 12 12 import { useAccountStore } from "@/store/persisted/useAccountStore"; 13 13 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; 14 14 import { useGroupQuery } from "@hey/indexer"; 15 - import { useRouter } from "next/router"; 15 + import { useParams } from "react-router"; 16 16 import Details from "./Details"; 17 17 import GroupFeed from "./GroupFeed"; 18 18 import GroupPageShimmer from "./Shimmer"; 19 19 20 20 const ViewGroup = () => { 21 - const { 22 - isReady, 23 - query: { address } 24 - } = useRouter(); 21 + const { address } = useParams<{ address: string }>(); 25 22 const { currentAccount } = useAccountStore(); 26 23 27 24 const { data, loading, error } = useGroupQuery({ ··· 29 26 skip: !address 30 27 }); 31 28 32 - if (!isReady || loading) { 29 + if (!address || loading) { 33 30 return <GroupPageShimmer />; 34 31 } 35 32
+11 -13
apps/web/src/components/Groups/List.tsx
··· 79 79 } 80 80 81 81 return ( 82 - <Card> 83 - <Virtuoso 84 - className="virtual-divider-list-window" 85 - data={groups} 86 - endReached={onEndReached} 87 - itemContent={(_, group) => ( 88 - <div className="p-5"> 89 - <SingleGroup group={group} showDescription isBig /> 90 - </div> 91 - )} 92 - useWindowScroll 93 - /> 94 - </Card> 82 + <Virtuoso 83 + className="virtual-divider-list-window" 84 + data={groups} 85 + endReached={onEndReached} 86 + itemContent={(_, group) => ( 87 + <div className="p-5"> 88 + <SingleGroup group={group} showDescription isBig /> 89 + </div> 90 + )} 91 + useWindowScroll 92 + /> 95 93 ); 96 94 }; 97 95
+1 -8
apps/web/src/components/Groups/Sidebar/Create/CreateGroupModal.tsx
··· 86 86 }) 87 87 ); 88 88 89 - return await createGroup({ 90 - variables: { 91 - request: { 92 - metadataUri, 93 - rules: { required: [{ banAccountRule: { enable: true } }] } 94 - } 95 - } 96 - }); 89 + return await createGroup({ variables: { request: { metadataUri } } }); 97 90 }; 98 91 99 92 return (
+5 -7
apps/web/src/components/Groups/Sidebar/Create/Success.tsx
··· 1 - import { H4 } from "@/components/Shared/UI"; 1 + import { H4, Image } from "@/components/Shared/UI"; 2 2 import { STATIC_IMAGES_URL } from "@hey/data/constants"; 3 - import Image from "next/image"; 4 - import { useRouter } from "next/router"; 5 3 import { useEffect } from "react"; 4 + import { useNavigate } from "react-router"; 6 5 import { useCreateGroupStore } from "./CreateGroup"; 7 6 8 7 const Success = () => { 9 - const { push } = useRouter(); 8 + const navigate = useNavigate(); 10 9 const { groupAddress, setScreen } = useCreateGroupStore(); 11 10 12 11 useEffect(() => { 13 12 setTimeout(() => { 14 13 if (groupAddress) { 15 - push(`/g/${groupAddress}`).then(() => { 16 - setScreen("details"); 17 - }); 14 + navigate(`/g/${groupAddress}`); 15 + setScreen("details"); 18 16 } 19 17 }, 3000); 20 18 }, [groupAddress]);
+4 -1
apps/web/src/components/Groups/index.tsx
··· 2 2 import Footer from "@/components/Shared/Footer"; 3 3 import NotLoggedIn from "@/components/Shared/NotLoggedIn"; 4 4 import { 5 + Card, 5 6 GridItemEight, 6 7 GridItemFour, 7 8 GridLayout ··· 31 32 <MetaTags title={`Groups โ€ข ${APP_NAME}`} /> 32 33 <GridItemEight className="space-y-5"> 33 34 <ListFocusType focus={focus} setFocus={setFocus} /> 34 - <List focus={focus} /> 35 + <Card> 36 + <List focus={focus} /> 37 + </Card> 35 38 </GridItemEight> 36 39 <GridItemFour> 37 40 <CreateGroup />
+1 -1
apps/web/src/components/Home/Hero.tsx
··· 1 + import { Image } from "@/components/Shared/UI"; 1 2 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; 2 - import Image from "next/image"; 3 3 4 4 const Hero = () => { 5 5 return (
+4 -8
apps/web/src/components/Home/Sidebar/Gitcoin.tsx
··· 1 1 import CountdownTimer from "@/components/Shared/CountdownTimer"; 2 - import { Button, Card } from "@/components/Shared/UI"; 3 - import { rubikMonoOneFont } from "@/helpers/fonts"; 2 + import { Button, Card, Image } from "@/components/Shared/UI"; 4 3 import { APP_NAME, APP_URL, STATIC_IMAGES_URL } from "@hey/data/constants"; 5 - import Image from "next/image"; 6 - import Link from "next/link"; 4 + import { Link } from "react-router"; 7 5 8 6 const Gitcoin = () => { 9 7 return ( ··· 20 18 /> 21 19 <div className="space-y-3 text-center"> 22 20 <b>Support {APP_NAME} on Gitcoin Grants Round 22</b> 23 - <div className={rubikMonoOneFont.className}> 24 - <CountdownTimer targetDate="2024-11-07T00:59:00+00:00" /> 25 - </div> 21 + <CountdownTimer targetDate="2024-11-07T00:59:00+00:00" /> 26 22 <div> 27 23 <Link 28 24 className="font-bold underline" 29 - href={`${APP_URL}/gitcoin`} 25 + to={`${APP_URL}/gitcoin`} 30 26 target="_blank" 31 27 > 32 28 <Button size="lg">Contribute now</Button>
+2 -2
apps/web/src/components/Home/Sidebar/SetAccount.tsx
··· 3 3 import { MinusCircleIcon } from "@heroicons/react/24/outline"; 4 4 import { CheckCircleIcon } from "@heroicons/react/24/solid"; 5 5 import { APP_NAME } from "@hey/data/constants"; 6 - import Link from "next/link"; 6 + import { Link } from "react-router"; 7 7 8 8 interface StatusProps { 9 9 finished: boolean; ··· 51 51 /> 52 52 </div> 53 53 <div className="font-bold"> 54 - <Link href="/settings">Update account now</Link> 54 + <Link to="/settings">Update account now</Link> 55 55 </div> 56 56 </Card> 57 57 );
+3 -3
apps/web/src/components/Notification/Account.tsx
··· 5 5 import getAvatar from "@hey/helpers/getAvatar"; 6 6 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 7 7 import type { AccountFragment } from "@hey/indexer"; 8 - import Link from "next/link"; 8 + import { Link } from "react-router"; 9 9 10 10 interface NotificationProfileProps { 11 11 account: AccountFragment; ··· 21 21 > 22 22 <Link 23 23 className="rounded-full outline-offset-2" 24 - href={getAccount(account).link} 24 + to={getAccount(account).link} 25 25 onClick={stopEventPropagation} 26 26 > 27 27 <Image ··· 48 48 > 49 49 <Link 50 50 className="inline-flex items-center space-x-1 font-bold outline-none hover:underline focus:underline" 51 - href={profileLink} 51 + to={profileLink} 52 52 onClick={stopEventPropagation} 53 53 > 54 54 <span>{getAccount(account).name}</span>
+2 -2
apps/web/src/components/Notification/AggregatedNotificationTitle.tsx
··· 1 1 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 2 2 import type { AccountFragment } from "@hey/indexer"; 3 - import Link from "next/link"; 3 + import { Link } from "react-router"; 4 4 import { NotificationAccountName } from "./Account"; 5 5 6 6 interface AggregatedNotificationTitleProps { ··· 23 23 {type && ( 24 24 <Link 25 25 className="outline-none hover:underline focus:underline" 26 - href={linkToType} 26 + to={linkToType} 27 27 onClick={stopEventPropagation} 28 28 > 29 29 {type.toLowerCase()}
+2 -2
apps/web/src/components/Notification/NotificationIcon.tsx
··· 1 1 import { Tooltip } from "@/components/Shared/UI"; 2 2 import { BellIcon } from "@heroicons/react/24/outline"; 3 - import Link from "next/link"; 3 + import { Link } from "react-router"; 4 4 5 5 const NotificationIcon = () => { 6 6 return ( 7 7 <Tooltip content="Notifications" placement="bottom"> 8 8 <Link 9 9 className="hidden rounded-md px-2 py-1 hover:bg-gray-300/20 md:flex" 10 - href="/notifications" 10 + to="/notifications" 11 11 > 12 12 <BellIcon className="size-5 sm:size-6" /> 13 13 </Link>
+2 -2
apps/web/src/components/Notification/Type/ActedNotification.tsx
··· 2 2 import { ShoppingBagIcon } from "@heroicons/react/24/outline"; 3 3 import getPostData from "@hey/helpers/getPostData"; 4 4 import { isRepost } from "@hey/helpers/postHelpers"; 5 - import Link from "next/link"; 6 5 import plur from "plur"; 6 + import { Link } from "react-router"; 7 7 import { NotificationAccountAvatar } from "../Account"; 8 8 import AggregatedNotificationTitle from "../AggregatedNotificationTitle"; 9 9 ··· 47 47 /> 48 48 <Link 49 49 className="ld-text-gray-500 linkify mt-2 line-clamp-2" 50 - href={`/posts/${notification.post.id}`} 50 + to={`/posts/${notification.post.id}`} 51 51 > 52 52 <Markup mentions={targetPost.mentions}>{filteredContent}</Markup> 53 53 </Link>
+2 -2
apps/web/src/components/Notification/Type/CommentNotification.tsx
··· 2 2 import { ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; 3 3 import getPostData from "@hey/helpers/getPostData"; 4 4 import type { CommentNotificationFragment } from "@hey/indexer"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 import { NotificationAccountAvatar } from "../Account"; 7 7 import AggregatedNotificationTitle from "../AggregatedNotificationTitle"; 8 8 ··· 35 35 /> 36 36 <Link 37 37 className="ld-text-gray-500 linkify mt-2 line-clamp-2" 38 - href={`/posts/${notification.comment.id}`} 38 + to={`/posts/${notification.comment.id}`} 39 39 > 40 40 <Markup mentions={notification.comment.mentions}> 41 41 {filteredContent}
+2 -2
apps/web/src/components/Notification/Type/MentionNotification.tsx
··· 2 2 import { AtSymbolIcon } from "@heroicons/react/24/outline"; 3 3 import getPostData from "@hey/helpers/getPostData"; 4 4 import type { MentionNotificationFragment } from "@hey/indexer"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 import { NotificationAccountAvatar } from "../Account"; 7 7 import AggregatedNotificationTitle from "../AggregatedNotificationTitle"; 8 8 ··· 35 35 /> 36 36 <Link 37 37 className="ld-text-gray-500 linkify mt-2 line-clamp-2" 38 - href={`/posts/${notification.post.id}`} 38 + to={`/posts/${notification.post.id}`} 39 39 > 40 40 <Markup mentions={notification.post.mentions}> 41 41 {filteredContent}
+2 -2
apps/web/src/components/Notification/Type/QuoteNotification.tsx
··· 2 2 import { ChatBubbleBottomCenterTextIcon } from "@heroicons/react/24/outline"; 3 3 import getPostData from "@hey/helpers/getPostData"; 4 4 import type { QuoteNotificationFragment } from "@hey/indexer"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 import { NotificationAccountAvatar } from "../Account"; 7 7 import AggregatedNotificationTitle from "../AggregatedNotificationTitle"; 8 8 ··· 35 35 /> 36 36 <Link 37 37 className="ld-text-gray-500 linkify mt-2 line-clamp-2" 38 - href={`/posts/${notification.quote.id}`} 38 + to={`/posts/${notification.quote.id}`} 39 39 > 40 40 <Markup mentions={notification.quote.mentions}> 41 41 {filteredContent}
+2 -2
apps/web/src/components/Notification/Type/ReactionNotification.tsx
··· 2 2 import { HeartIcon } from "@heroicons/react/24/outline"; 3 3 import getPostData from "@hey/helpers/getPostData"; 4 4 import type { ReactionNotificationFragment } from "@hey/indexer"; 5 - import Link from "next/link"; 6 5 import plur from "plur"; 6 + import { Link } from "react-router"; 7 7 import { NotificationAccountAvatar } from "../Account"; 8 8 import AggregatedNotificationTitle from "../AggregatedNotificationTitle"; 9 9 ··· 45 45 /> 46 46 <Link 47 47 className="ld-text-gray-500 linkify mt-2 line-clamp-2" 48 - href={`/posts/${notification.post.id}`} 48 + to={`/posts/${notification.post.id}`} 49 49 > 50 50 <Markup mentions={notification.post.mentions}> 51 51 {filteredContent}
+2 -2
apps/web/src/components/Notification/Type/RepostNotification.tsx
··· 2 2 import { ArrowsRightLeftIcon } from "@heroicons/react/24/solid"; 3 3 import getPostData from "@hey/helpers/getPostData"; 4 4 import type { RepostNotificationFragment } from "@hey/indexer"; 5 - import Link from "next/link"; 6 5 import plur from "plur"; 6 + import { Link } from "react-router"; 7 7 import { NotificationAccountAvatar } from "../Account"; 8 8 import AggregatedNotificationTitle from "../AggregatedNotificationTitle"; 9 9 ··· 45 45 /> 46 46 <Link 47 47 className="ld-text-gray-500 linkify mt-2 line-clamp-2" 48 - href={`/posts/${notification.post.id}`} 48 + to={`/posts/${notification.post.id}`} 49 49 > 50 50 <Markup mentions={notification.post.mentions}> 51 51 {filteredContent}
+2 -4
apps/web/src/components/Notification/index.tsx
··· 3 3 import { useAccountStore } from "@/store/persisted/useAccountStore"; 4 4 import { APP_NAME } from "@hey/data/constants"; 5 5 import { NotificationFeedType } from "@hey/data/enums"; 6 - import { useRouter } from "next/router"; 6 + import { useParams } from "react-router"; 7 7 import FeedType from "./FeedType"; 8 8 import List from "./List"; 9 9 import Settings from "./Settings"; 10 10 11 11 const Notification = () => { 12 - const { 13 - query: { type } 14 - } = useRouter(); 12 + const { type } = useParams<{ type: string }>(); 15 13 const { currentAccount } = useAccountStore(); 16 14 17 15 const lowerCaseNotificationFeedType = [
+3 -3
apps/web/src/components/Pages/Copyright.tsx
··· 1 1 import Footer from "@/components/Shared/Footer"; 2 2 import { H2, H4 } from "@/components/Shared/UI"; 3 3 import { APP_NAME } from "@hey/data/constants"; 4 - import Link from "next/link"; 4 + import { Link } from "react-router"; 5 5 6 6 const Copyright = () => { 7 7 const updatedAt = "October 22, 2024"; ··· 40 40 1998, the text of which may be found on the U.S. Copyright 41 41 Office website at{" "} 42 42 <Link 43 - href="http://www.copyright.gov/legislation/dmca.pdf" 43 + to="http://www.copyright.gov/legislation/dmca.pdf" 44 44 target="_blank" 45 45 > 46 46 http://www.copyright.gov/legislation/dmca.pdf ··· 122 122 </p> 123 123 <p className="linkify leading-7"> 124 124 Email:{" "} 125 - <Link href="mailto:copyright@hey.xyz">copyright@hey.xyz</Link> 125 + <Link to="mailto:copyright@hey.xyz">copyright@hey.xyz</Link> 126 126 </p> 127 127 </div> 128 128 {/* DMCA Notice of Alleged Infringement ("Notice") ends */}
+2 -2
apps/web/src/components/Pages/Guidelines.tsx
··· 1 1 import Footer from "@/components/Shared/Footer"; 2 2 import { H2, H4 } from "@/components/Shared/UI"; 3 3 import { APP_NAME } from "@hey/data/constants"; 4 - import Link from "next/link"; 4 + import { Link } from "react-router"; 5 5 6 6 const Guidelines = () => { 7 7 return ( ··· 116 116 <H4 className="mt-8 mb-5">Feedback</H4> 117 117 <p className="linkify leading-7"> 118 118 If you have any feedback on these rules or if you have any 119 - questions, please <Link href="/support">Contact us</Link>. 119 + questions, please <Link to="/support">Contact us</Link>. 120 120 </p> 121 121 {/* Feedback ends */} 122 122 </div>
+2 -2
apps/web/src/components/Pages/Privacy.tsx
··· 1 1 import Footer from "@/components/Shared/Footer"; 2 2 import { H2, H4 } from "@/components/Shared/UI"; 3 3 import { APP_NAME } from "@hey/data/constants"; 4 - import Link from "next/link"; 4 + import { Link } from "react-router"; 5 5 6 6 const Privacy = () => { 7 7 const updatedAt = "October 30, 2023"; ··· 157 157 or take action with respect to โ€œDo Not Trackโ€ signals. For 158 158 more information on โ€œDo Not Track,โ€ visit{" "} 159 159 <Link 160 - href="https://allaboutdnt.com" 160 + to="https://allaboutdnt.com" 161 161 rel="noreferrer" 162 162 target="_blank" 163 163 >
+3 -3
apps/web/src/components/Pages/Terms.tsx
··· 1 1 import Footer from "@/components/Shared/Footer"; 2 2 import { H2, H4 } from "@/components/Shared/UI"; 3 - import Link from "next/link"; 3 + import { Link } from "react-router"; 4 4 5 5 const Terms = () => { 6 6 const updatedAt = "March 21, 2025"; ··· 186 186 <H4 className="mt-8 mb-5">7. Personal Information</H4> 187 187 <p className="linkify leading-7"> 188 188 Your submission of personal information through the Site is 189 - governed by our <Link href="/privacy">Privacy Policy</Link>. 189 + governed by our <Link to="/privacy">Privacy Policy</Link>. 190 190 </p> 191 191 {/* 7. Personal Information ends */} 192 192 {/* 8. Prohibited Usage begins */} ··· 264 264 <b>Refunds for Failed Minting:</b> In the event that account 265 265 minting fails, customers are eligible to request a refund. To 266 266 request a refund, please visit our{" "} 267 - <Link href="/support">support center</Link>. 267 + <Link to="/support">support center</Link>. 268 268 </p> 269 269 <p className="leading-7"> 270 270 This policy is concise and designed to be clear and
+3 -5
apps/web/src/components/Post/Actions/Comment.tsx
··· 3 3 import humanize from "@hey/helpers/humanize"; 4 4 import nFormatter from "@hey/helpers/nFormatter"; 5 5 import type { PostFragment } from "@hey/indexer"; 6 - import { useRouter } from "next/router"; 6 + import { useNavigate } from "react-router"; 7 7 8 8 interface CommentProps { 9 9 post: PostFragment; ··· 11 11 } 12 12 13 13 const Comment = ({ post, showCount }: CommentProps) => { 14 - const { push } = useRouter(); 14 + const navigate = useNavigate(); 15 15 const count = post.stats.comments; 16 16 const iconClassName = showCount 17 17 ? "w-[17px] sm:w-[20px]" ··· 22 22 <button 23 23 aria-label="Comment" 24 24 className="rounded-full p-1.5 outline-offset-2 hover:bg-gray-300/20" 25 - onClick={() => { 26 - push(`/posts/${post.id}`); 27 - }} 25 + onClick={() => navigate(`/posts/${post.id}`)} 28 26 type="button" 29 27 > 30 28 <Tooltip
+2 -2
apps/web/src/components/Post/Actions/Menu/Bookmark.tsx
··· 11 11 useBookmarkPostMutation, 12 12 useUndoBookmarkPostMutation 13 13 } from "@hey/indexer"; 14 - import { useRouter } from "next/router"; 15 14 import { toast } from "react-hot-toast"; 15 + import { useLocation } from "react-router"; 16 16 17 17 interface BookmarkProps { 18 18 post: PostFragment; 19 19 } 20 20 21 21 const Bookmark = ({ post }: BookmarkProps) => { 22 - const { pathname } = useRouter(); 22 + const { pathname } = useLocation(); 23 23 const hasBookmarked = post.operations?.hasBookmarked; 24 24 25 25 const updateCache = (cache: ApolloCache<any>, hasBookmarked: boolean) => {
+2 -2
apps/web/src/components/Post/OpenAction/CollectAction/CollectActionBody.tsx
··· 33 33 useCollectActionQuery 34 34 } from "@hey/indexer"; 35 35 import { useCounter } from "@uidotdev/usehooks"; 36 - import Link from "next/link"; 37 36 import plur from "plur"; 38 37 import { type Dispatch, type SetStateAction, useState } from "react"; 38 + import { Link } from "react-router"; 39 39 import CollectActionButton from "./CollectActionButton"; 40 40 import Splits from "./Splits"; 41 41 ··· 205 205 <span>Token:</span> 206 206 <Link 207 207 className="font-bold text-gray-600" 208 - href={`${BLOCK_EXPLORER_URL}/address/${collectAction.address}`} 208 + to={`${BLOCK_EXPLORER_URL}/address/${collectAction.address}`} 209 209 rel="noreferrer noopener" 210 210 target="_blank" 211 211 >
+3 -3
apps/web/src/components/Post/OpenAction/CollectAction/Splits.tsx
··· 5 5 import getAccount from "@hey/helpers/getAccount"; 6 6 import getAvatar from "@hey/helpers/getAvatar"; 7 7 import { type RecipientPercent, useAccountsBulkQuery } from "@hey/indexer"; 8 - import Link from "next/link"; 8 + import { Link } from "react-router"; 9 9 10 10 interface SplitsProps { 11 11 recipients: RecipientPercent[]; ··· 56 56 src={getAvatar(account)} 57 57 /> 58 58 {account ? ( 59 - <Link href={getAccount(account).link}> 59 + <Link to={getAccount(account).link}> 60 60 <Slug slug={getAccount(account).usernameWithPrefix} /> 61 61 </Link> 62 62 ) : ( 63 63 <Link 64 - href={`${BLOCK_EXPLORER_URL}/address/${address}`} 64 + to={`${BLOCK_EXPLORER_URL}/address/${address}`} 65 65 rel="noreferrer noopener" 66 66 target="_blank" 67 67 >
+5 -9
apps/web/src/components/Post/PostAccount.tsx
··· 4 4 import getAccount from "@hey/helpers/getAccount"; 5 5 import getAvatar from "@hey/helpers/getAvatar"; 6 6 import type { AccountFragment, PostGroupInfoFragment } from "@hey/indexer"; 7 - import Link from "next/link"; 8 - import { useRouter } from "next/router"; 9 7 import type { ReactNode } from "react"; 10 8 import { memo } from "react"; 9 + import { Link, useLocation } from "react-router"; 11 10 import AccountPreview from "../Shared/AccountPreview"; 12 11 import Slug from "../Shared/Slug"; 13 12 ··· 24 23 postSlug, 25 24 timestamp 26 25 }: PostAccountProps) => { 27 - const { pathname } = useRouter(); 26 + const { pathname } = useLocation(); 28 27 29 28 const CustomLink = ({ children }: { children: ReactNode }) => ( 30 29 <Link 31 30 className="outline-none hover:underline focus:underline" 32 - href={getAccount(account).link} 31 + to={getAccount(account).link} 33 32 > 34 33 <AccountPreview 35 34 username={account.username?.localName} ··· 57 56 {timestamp ? ( 58 57 <span className="ld-text-gray-500"> 59 58 <span className="mr-1">ยท</span> 60 - <Link 61 - className="text-xs hover:underline" 62 - href={`/posts/${postSlug}`} 63 - > 59 + <Link className="text-xs hover:underline" to={`/posts/${postSlug}`}> 64 60 {formatRelativeOrAbsolute(timestamp)} 65 61 </Link> 66 62 </span> ··· 69 65 {group?.metadata && pathname !== "/g/[address]" ? ( 70 66 <Link 71 67 className="mt-0.5 mb-2 flex w-fit max-w-sm items-center gap-x-1 text-xs hover:underline focus:underline" 72 - href={`/g/${group.address}`} 68 + to={`/g/${group.address}`} 73 69 > 74 70 <Image 75 71 src={getAvatar(group)}
+4 -5
apps/web/src/components/Post/PostAvatar.tsx
··· 5 5 import { isRepost } from "@hey/helpers/postHelpers"; 6 6 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 7 7 import type { AnyPostFragment, TimelineItemFragment } from "@hey/indexer"; 8 - import Link from "next/link"; 9 - import { useRouter } from "next/router"; 10 8 import { memo } from "react"; 9 + import { Link, useNavigate } from "react-router"; 11 10 12 11 interface PostAvatarProps { 13 12 timelineItem?: TimelineItemFragment; ··· 20 19 post, 21 20 quoted = false 22 21 }: PostAvatarProps) => { 23 - const { push } = useRouter(); 22 + const navigate = useNavigate(); 24 23 const targetPost = isRepost(post) ? post?.repostOf : post; 25 24 const rootPost = timelineItem ? timelineItem?.primary : targetPost; 26 25 const account = timelineItem ? rootPost.author : targetPost.author; ··· 28 27 return ( 29 28 <Link 30 29 className="contents" 31 - href={getAccount(account).link} 30 + to={getAccount(account).link} 32 31 onClick={stopEventPropagation} 33 32 > 34 33 <Image ··· 39 38 )} 40 39 height={quoted ? 25 : 44} 41 40 loading="lazy" 42 - onClick={() => push(getAccount(account).link)} 41 + onClick={() => navigate(getAccount(account).link)} 43 42 src={getAvatar(account)} 44 43 width={quoted ? 25 : 44} 45 44 />
+2 -2
apps/web/src/components/Post/PostBody.tsx
··· 11 11 import { isRepost } from "@hey/helpers/postHelpers"; 12 12 import type { AnyPostFragment } from "@hey/indexer"; 13 13 import { getSrc } from "@livepeer/react/external"; 14 - import Link from "next/link"; 15 14 import { memo } from "react"; 16 15 import { isIOS, isMobile } from "react-device-detect"; 16 + import { Link } from "react-router"; 17 17 import Metadata from "./Metadata"; 18 18 19 19 interface PostBodyProps { ··· 78 78 {canShowMore ? ( 79 79 <H6 className="ld-text-gray-500 mt-4 flex items-center space-x-1"> 80 80 <EyeIcon className="size-4" /> 81 - <Link href={`/posts/${id}`}>Show more</Link> 81 + <Link to={`/posts/${id}`}>Show more</Link> 82 82 </H6> 83 83 ) : null} 84 84 {/* Attachments and Quotes */}
+2 -2
apps/web/src/components/Post/PostStats.tsx
··· 4 4 import { Modal } from "@/components/Shared/UI"; 5 5 import nFormatter from "@hey/helpers/nFormatter"; 6 6 import type { PostFragment } from "@hey/indexer"; 7 - import Link from "next/link"; 8 7 import plur from "plur"; 9 8 import { memo, useState } from "react"; 9 + import { Link } from "react-router"; 10 10 11 11 interface PostStatsProps { 12 12 post: PostFragment; ··· 54 54 </button> 55 55 ) : null} 56 56 {quotes > 0 ? ( 57 - <Link className="outline-offset-2" href={`/posts/${post.id}/quotes`}> 57 + <Link className="outline-offset-2" to={`/posts/${post.id}/quotes`}> 58 58 <b className="text-black dark:text-white">{nFormatter(quotes)}</b>{" "} 59 59 {plur("Quote", quotes)} 60 60 </Link>
+2 -2
apps/web/src/components/Post/Quotes.tsx
··· 11 11 type PostReferencesRequest, 12 12 usePostReferencesQuery 13 13 } from "@hey/indexer"; 14 - import Link from "next/link"; 14 + import { Link } from "react-router"; 15 15 import { Virtuoso } from "react-virtuoso"; 16 16 import SinglePost from "./SinglePost"; 17 17 ··· 63 63 return ( 64 64 <Card> 65 65 <div className="flex items-center space-x-3 p-5"> 66 - <Link href={`/posts/${post.id}`}> 66 + <Link to={`/posts/${post.id}`}> 67 67 <ArrowLeftIcon className="size-5" /> 68 68 </Link> 69 69 <H5>Quotes</H5>
+2 -2
apps/web/src/components/Post/SingleImagePost.tsx
··· 2 2 import getPostData from "@hey/helpers/getPostData"; 3 3 import { isRepost } from "@hey/helpers/postHelpers"; 4 4 import type { AnyPostFragment } from "@hey/indexer"; 5 - import Link from "next/link"; 6 5 import { memo } from "react"; 6 + import { Link } from "react-router"; 7 7 8 8 interface SingleImagePostProps { 9 9 post: AnyPostFragment; ··· 18 18 19 19 return ( 20 20 <Link 21 - href={`/posts/${post.id}`} 21 + to={`/posts/${post.id}`} 22 22 key={post.id} 23 23 className="relative h-80 overflow-hidden rounded-xl bg-center bg-cover" 24 24 style={{
+2 -2
apps/web/src/components/Post/Type/index.tsx
··· 1 1 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 2 2 import type { AnyPostFragment } from "@hey/indexer"; 3 - import { useRouter } from "next/router"; 3 + import { useLocation } from "react-router"; 4 4 import Commented from "./Commented"; 5 5 import Reposted from "./Reposted"; 6 6 ··· 11 11 } 12 12 13 13 const PostType = ({ post, showThread = false, showType }: PostTypeProps) => { 14 - const { pathname } = useRouter(); 14 + const { pathname } = useLocation(); 15 15 const type = post.__typename; 16 16 17 17 if (!showType) {
+6 -9
apps/web/src/components/Post/index.tsx
··· 2 2 import NoneRelevantFeed from "@/components/Comment/NoneRelevantFeed"; 3 3 import MetaTags from "@/components/Common/MetaTags"; 4 4 import NewPublication from "@/components/Composer/NewPublication"; 5 + import Custom404 from "@/components/Shared/404"; 6 + import Custom500 from "@/components/Shared/500"; 5 7 import Footer from "@/components/Shared/Footer"; 6 8 import SingleAccount from "@/components/Shared/SingleAccount"; 7 9 import { ··· 11 13 GridLayout, 12 14 WarningMessage 13 15 } from "@/components/Shared/UI"; 14 - import Custom404 from "@/pages/404"; 15 - import Custom500 from "@/pages/500"; 16 16 import { useAccountStatus } from "@/store/non-persisted/useAccountStatus"; 17 17 import { useAccountStore } from "@/store/persisted/useAccountStore"; 18 18 import { APP_NAME } from "@hey/data/constants"; ··· 26 26 usePostQuery, 27 27 usePostReferencesQuery 28 28 } from "@hey/indexer"; 29 - import { useRouter } from "next/router"; 29 + import { useLocation, useParams } from "react-router"; 30 30 import { createTrackedSelector } from "react-tracked"; 31 31 import { create } from "zustand"; 32 32 import FullPost from "./FullPost"; ··· 47 47 export const useHiddenCommentFeedStore = createTrackedSelector(store); 48 48 49 49 const ViewPost = () => { 50 - const { 51 - isReady, 52 - pathname, 53 - query: { id } 54 - } = useRouter(); 50 + const { pathname } = useLocation(); 51 + const { id } = useParams<{ id: string }>(); 55 52 56 53 const { currentAccount } = useAccountStore(); 57 54 const { isSuspended } = useAccountStatus(); ··· 77 74 78 75 const hasHiddenComments = (comments?.postReferences.items.length || 0) > 0; 79 76 80 - if (!isReady || loading) { 77 + if (!id || loading) { 81 78 return <PublicationPageShimmer publicationList={showQuotes} />; 82 79 } 83 80
+15 -13
apps/web/src/components/Search/index.tsx
··· 1 + import Custom404 from "@/components/Shared/404"; 1 2 import Sidebar from "@/components/Shared/Sidebar"; 2 3 import { 3 4 GridItemEight, 4 5 GridItemFour, 5 6 GridLayout 6 7 } from "@/components/Shared/UI"; 7 - import Custom404 from "@/pages/404"; 8 8 import { PencilSquareIcon, UsersIcon } from "@heroicons/react/24/outline"; 9 - import { useRouter } from "next/router"; 9 + import { useLocation } from "react-router"; 10 10 import Accounts from "./Accounts"; 11 11 import Posts from "./Posts"; 12 12 13 13 const Search = () => { 14 - const { query } = useRouter(); 15 - const searchText = Array.isArray(query.q) 16 - ? encodeURIComponent(query.q.join(" ")) 17 - : encodeURIComponent(query.q || ""); 14 + const location = useLocation(); 15 + const searchParams = new URLSearchParams(location.search); 16 + const q = searchParams.get("q"); 17 + const type = searchParams.get("type"); 18 18 19 - if (!query.q || !["accounts", "posts"].includes(query.type as string)) { 19 + const searchText = Array.isArray(q) 20 + ? encodeURIComponent(q.join(" ")) 21 + : encodeURIComponent(q || ""); 22 + 23 + if (!q || !["accounts", "posts"].includes(type as string)) { 20 24 return <Custom404 />; 21 25 } 22 26 23 27 const settingsSidebarItems = [ 24 28 { 25 - active: query.type === "posts", 29 + active: type === "posts", 26 30 icon: <PencilSquareIcon className="size-4" />, 27 31 title: "Publications", 28 32 url: `/search?q=${searchText}&type=posts` 29 33 }, 30 34 { 31 - active: query.type === "accounts", 35 + active: type === "accounts", 32 36 icon: <UsersIcon className="size-4" />, 33 37 title: "Accounts", 34 38 url: `/search?q=${searchText}&type=accounts` ··· 41 45 <Sidebar items={settingsSidebarItems} /> 42 46 </GridItemFour> 43 47 <GridItemEight> 44 - {query.type === "accounts" ? ( 45 - <Accounts query={query.q as string} /> 46 - ) : null} 47 - {query.type === "posts" ? <Posts query={query.q as string} /> : null} 48 + {type === "accounts" ? <Accounts query={q as string} /> : null} 49 + {type === "posts" ? <Posts query={q as string} /> : null} 48 50 </GridItemEight> 49 51 </GridLayout> 50 52 );
+1 -3
apps/web/src/components/Settings/Account/SuperFollow.tsx
··· 29 29 useMeLazyQuery, 30 30 useUpdateAccountFollowRulesMutation 31 31 } from "@hey/indexer"; 32 - import { useRouter } from "next/router"; 33 32 import { type RefObject, useEffect, useRef, useState } from "react"; 34 33 import toast from "react-hot-toast"; 35 34 36 35 const SuperFollow = () => { 37 - const { reload } = useRouter(); 38 36 const { currentAccount, setCurrentAccount } = useAccountStore(); 39 37 const { isSuspended } = useAccountStatus(); 40 38 const [isSubmitting, setIsSubmitting] = useState(false); ··· 65 63 pollTransactionStatus(hash, async () => { 66 64 const accountData = await getCurrentAccountDetails(); 67 65 setCurrentAccount(accountData?.data?.me.loggedInAs.account); 68 - reload(); 66 + location.reload(); 69 67 }); 70 68 }; 71 69
+2 -2
apps/web/src/components/Settings/Danger/Delete.tsx
··· 18 18 } from "@hey/data/constants"; 19 19 import { Errors } from "@hey/data/errors"; 20 20 import type { AccountFragment } from "@hey/indexer"; 21 - import Link from "next/link"; 22 21 import { useState } from "react"; 23 22 import toast from "react-hot-toast"; 23 + import { Link } from "react-router"; 24 24 25 25 const DeleteSettings = () => { 26 26 const { currentAccount } = useAccountStore(); ··· 72 72 </p> 73 73 <p className="linkify py-3"> 74 74 Your account will be transferred to a{" "} 75 - <Link href={`${BLOCK_EXPLORER_URL}/address/${NULL_ADDRESS}`}> 75 + <Link to={`${BLOCK_EXPLORER_URL}/address/${NULL_ADDRESS}`}> 76 76 null address 77 77 </Link>{" "} 78 78 after deletion.
+1 -2
apps/web/src/components/Settings/Preferences/AppIcon.tsx
··· 1 - import { Card, CardHeader, Tooltip } from "@/components/Shared/UI"; 1 + import { Card, CardHeader, Image, Tooltip } from "@/components/Shared/UI"; 2 2 import trackEvent from "@/helpers/analytics"; 3 3 import errorToast from "@/helpers/errorToast"; 4 4 import { trpc } from "@/helpers/trpc"; ··· 8 8 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; 9 9 import { Events } from "@hey/data/events"; 10 10 import { useMutation } from "@tanstack/react-query"; 11 - import Image from "next/image"; 12 11 import toast from "react-hot-toast"; 13 12 14 13 const icons = [
+1 -3
apps/web/src/components/Shared/Auth/Login.tsx
··· 13 13 useAuthenticateMutation, 14 14 useChallengeMutation 15 15 } from "@hey/indexer"; 16 - import { useRouter } from "next/router"; 17 16 import type { Dispatch, SetStateAction } from "react"; 18 17 import { useState } from "react"; 19 18 import toast from "react-hot-toast"; ··· 28 27 } 29 28 30 29 const Login = ({ setHasAccounts }: LoginProps) => { 31 - const { reload } = useRouter(); 32 30 const [isSubmitting, setIsSubmitting] = useState(false); 33 31 const [loggingInAccountId, setLoggingInAccountId] = useState<null | string>( 34 32 null ··· 88 86 const idToken = auth.data?.authenticate.idToken; 89 87 signIn({ accessToken, idToken, refreshToken }); 90 88 trackEvent(Events.Account.Login); 91 - return reload(); 89 + return location.reload(); 92 90 } 93 91 94 92 return toast.error(Errors.SomethingWentWrong);
+2 -5
apps/web/src/components/Shared/Auth/Signup/Success.tsx
··· 1 - import { H4 } from "@/components/Shared/UI"; 1 + import { H4, Image } from "@/components/Shared/UI"; 2 2 import { signIn } from "@/store/persisted/useAuthStore"; 3 3 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; 4 4 import { Errors } from "@hey/data/errors"; 5 5 import { useSwitchAccountMutation } from "@hey/indexer"; 6 - import Image from "next/image"; 7 - import { useRouter } from "next/router"; 8 6 import { useEffect } from "react"; 9 7 import toast from "react-hot-toast"; 10 8 import { useSignupStore } from "."; 11 9 12 10 const Success = () => { 13 - const { reload } = useRouter(); 14 11 const { accountAddress, onboardingToken } = useSignupStore(); 15 12 const [switchAccount] = useSwitchAccountMutation(); 16 13 ··· 26 23 const refreshToken = auth.data?.switchAccount.refreshToken; 27 24 const idToken = auth.data?.switchAccount.idToken; 28 25 signIn({ accessToken, idToken, refreshToken }); 29 - return reload(); 26 + return location.reload(); 30 27 } 31 28 32 29 return toast.error(Errors.SomethingWentWrong);
+1 -2
apps/web/src/components/Shared/Auth/SignupCard.tsx
··· 1 - import { Button, Card } from "@/components/Shared/UI"; 1 + import { Button, Card, Image } from "@/components/Shared/UI"; 2 2 import { useAuthModalStore } from "@/store/non-persisted/modal/useAuthModalStore"; 3 3 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; 4 - import Image from "next/image"; 5 4 import { useSignupStore } from "./Signup"; 6 5 7 6 const SignupCard = () => {
+3 -3
apps/web/src/components/Shared/Auth/WalletSelector.tsx
··· 1 1 import { KeyIcon } from "@heroicons/react/24/outline"; 2 2 import { STATIC_IMAGES_URL } from "@hey/data/constants"; 3 3 import { useModal } from "connectkit"; 4 - import Link from "next/link"; 4 + import { Link } from "react-router"; 5 5 import { useAccount, useDisconnect } from "wagmi"; 6 6 7 7 const WalletSelector = () => { ··· 36 36 </button> 37 37 <div className="linkify text-gray-500 text-sm"> 38 38 By connecting wallet, you agree to our{" "} 39 - <Link href="/terms" target="_blank"> 39 + <Link to="/terms" target="_blank"> 40 40 Terms 41 41 </Link>{" "} 42 42 and{" "} 43 - <Link href="/privacy" target="_blank"> 43 + <Link to="/privacy" target="_blank"> 44 44 Policy 45 45 </Link> 46 46 .
+2 -2
apps/web/src/components/Shared/FallbackAccountName.tsx
··· 1 1 import cn from "@/helpers/cn"; 2 2 import getAccount from "@hey/helpers/getAccount"; 3 3 import type { AccountFragment } from "@hey/indexer"; 4 - import Link from "next/link"; 5 4 import type { ReactNode } from "react"; 5 + import { Link } from "react-router"; 6 6 import Slug from "./Slug"; 7 7 8 8 interface FallbackAccountNameProps { ··· 33 33 "max-w-sm truncate outline-none hover:underline focus:underline", 34 34 className 35 35 )} 36 - href={link} 36 + to={link} 37 37 > 38 38 <b className="whitespace-nowrap">{accountName}</b> 39 39 </Link>
+2 -2
apps/web/src/components/Shared/Footer.tsx
··· 1 1 import { APP_NAME, APP_URL } from "@hey/data/constants"; 2 - import Link from "next/link"; 2 + import { Link } from "react-router"; 3 3 const currentYear = new Date().getFullYear(); 4 4 5 5 const links = [ ··· 22 22 {links.map((link) => ( 23 23 <Link 24 24 className="outline-offset-4" 25 - href={link.href} 25 + to={link.href} 26 26 key={link.href} 27 27 rel="noreferrer noopener" 28 28 target={link.href.startsWith("http") ? "_blank" : undefined}
+1 -1
apps/web/src/components/Shared/FullPageLoader.tsx
··· 1 + import { Image } from "@/components/Shared/UI"; 1 2 import { STATIC_IMAGES_URL } from "@hey/data/constants"; 2 3 import isPrideMonth from "@hey/helpers/isPrideMonth"; 3 - import Image from "next/image"; 4 4 5 5 const FullPageLoader = () => { 6 6 const logoSrc = isPrideMonth()
+2 -2
apps/web/src/components/Shared/GlobalBanners/Suspended.tsx
··· 2 2 import { useAccountStatus } from "@/store/non-persisted/useAccountStatus"; 3 3 import { NoSymbolIcon } from "@heroicons/react/24/outline"; 4 4 import { APP_NAME } from "@hey/data/constants"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 7 7 const Suspended = () => { 8 8 const { isSuspended } = useAccountStatus(); ··· 24 24 <div className="text-gray-500 text-sm"> 25 25 Because of that, your account may limit your ability to interact 26 26 with {APP_NAME} and other users.{" "} 27 - <Link href="/support">Contact us</Link> if you think this is a 27 + <Link to="/support">Contact us</Link> if you think this is a 28 28 mistake. 29 29 </div> 30 30 </GridItemEight>
+9 -5
apps/web/src/components/Shared/GlobalModalsFromUrl.tsx
··· 1 1 import { useAuthModalStore } from "@/store/non-persisted/modal/useAuthModalStore"; 2 2 import { useAccountStore } from "@/store/persisted/useAccountStore"; 3 - import { useRouter } from "next/router"; 4 3 import { useEffect } from "react"; 4 + import { useLocation, useNavigate } from "react-router"; 5 5 import { useSignupStore } from "./Auth/Signup"; 6 6 7 7 const GlobalModalsFromUrl = () => { 8 - const { isReady, push, query } = useRouter(); 8 + const navigate = useNavigate(); 9 + const location = useLocation(); 10 + const searchParams = new URLSearchParams(location.search); 11 + const signup = searchParams.get("signup"); 12 + 9 13 const { currentAccount } = useAccountStore(); 10 14 const { setShowAuthModal } = useAuthModalStore(); 11 15 const { setScreen } = useSignupStore(); 12 16 13 17 useEffect(() => { 14 - if (isReady && query.signup && !currentAccount?.address) { 18 + if (signup && !currentAccount?.address) { 15 19 setScreen("choose"); 16 20 setShowAuthModal(true, "signup"); 17 21 18 22 // Remove query param 19 - push({ pathname: "/" }, undefined, { shallow: true }); 23 + navigate({ pathname: "/" }); 20 24 } 21 - }, [isReady, query, currentAccount, setScreen, setShowAuthModal, push]); 25 + }, [signup, currentAccount, setScreen, setShowAuthModal, navigate]); 22 26 23 27 return null; 24 28 };
+2 -2
apps/web/src/components/Shared/Markup/MarkupLink/ExternalLink.tsx
··· 1 1 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 2 2 import truncateUrl from "@hey/helpers/truncateUrl"; 3 3 import type { MarkupLinkProps } from "@hey/types/misc"; 4 - import Link from "next/link"; 4 + import { Link } from "react-router"; 5 5 6 6 const ExternalLink = ({ title }: MarkupLinkProps) => { 7 7 let href = title; ··· 16 16 17 17 return ( 18 18 <Link 19 - href={href} 19 + to={href} 20 20 onClick={stopEventPropagation} 21 21 rel="noopener" 22 22 target={href.includes(location.host) ? "_self" : "_blank"}
+2 -2
apps/web/src/components/Shared/Markup/MarkupLink/Hashtag.tsx
··· 1 1 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 2 2 import type { MarkupLinkProps } from "@hey/types/misc"; 3 - import Link from "next/link"; 3 + import { Link } from "react-router"; 4 4 5 5 const Hashtag = ({ title }: MarkupLinkProps) => { 6 6 if (!title) { ··· 12 12 <span> 13 13 <Link 14 14 className="outline-none focus:underline" 15 - href={`/search?q=${title}&src=link_click&type=posts`} 15 + to={`/search?q=${title}&src=link_click&type=posts`} 16 16 onClick={stopEventPropagation} 17 17 > 18 18 {title}
+2 -2
apps/web/src/components/Shared/Markup/MarkupLink/Mention.tsx
··· 2 2 import Slug from "@/components/Shared/Slug"; 3 3 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 4 4 import type { MarkupLinkProps } from "@hey/types/misc"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 7 7 const Mention = ({ mentions, title }: MarkupLinkProps) => { 8 8 const username = title; ··· 46 46 return canShowUserPreview(username) ? ( 47 47 <Link 48 48 className="outline-none focus:underline" 49 - href={`/u/${getNameFromMention(username)}`} 49 + to={`/u/${getNameFromMention(username)}`} 50 50 onClick={stopEventPropagation} 51 51 > 52 52 <AccountPreview
+7 -8
apps/web/src/components/Shared/Navbar/BottomNavigation.tsx
··· 13 13 } from "@heroicons/react/24/solid"; 14 14 import getAccount from "@hey/helpers/getAccount"; 15 15 import getAvatar from "@hey/helpers/getAvatar"; 16 - import Link from "next/link"; 17 - import { useRouter } from "next/router"; 16 + import { Link, useLocation } from "react-router"; 18 17 19 18 const BottomNavigation = () => { 20 19 const { currentAccount } = useAccountStore(); 21 - const router = useRouter(); 20 + const { pathname } = useLocation(); 22 21 23 - const isActivePath = (path: string) => router.pathname === path; 22 + const isActivePath = (path: string) => pathname === path; 24 23 25 24 return ( 26 25 <div className="fixed inset-x-0 bottom-0 z-[5] border-gray-200 border-t bg-white pb-safe md:hidden dark:border-gray-800 dark:bg-black"> 27 26 <div 28 27 className={cn("grid", currentAccount ? "grid-cols-4" : "grid-cols-3")} 29 28 > 30 - <Link aria-label="Home" className="mx-auto my-3" href="/"> 29 + <Link aria-label="Home" className="mx-auto my-3" to="/"> 31 30 {isActivePath("/") ? ( 32 31 <HomeIconSolid className="size-6" /> 33 32 ) : ( 34 33 <HomeIcon className="size-6" /> 35 34 )} 36 35 </Link> 37 - <Link aria-label="Explore" className="mx-auto my-3" href="/explore"> 36 + <Link aria-label="Explore" className="mx-auto my-3" to="/explore"> 38 37 {isActivePath("/explore") ? ( 39 38 <Squares2X2IconSolid className="size-6" /> 40 39 ) : ( ··· 44 43 <Link 45 44 aria-label="Notifications" 46 45 className="mx-auto my-3" 47 - href="/notifications" 46 + to="/notifications" 48 47 > 49 48 {isActivePath("/notifications") ? ( 50 49 <BellIconSolid className="size-6" /> ··· 56 55 <Link 57 56 aria-label="Your account" 58 57 className="mx-auto my-3" 59 - href={getAccount(currentAccount).link} 58 + to={getAccount(currentAccount).link} 60 59 > 61 60 <Image 62 61 alt={currentAccount.address}
+3 -3
apps/web/src/components/Shared/Navbar/MenuItems.tsx
··· 1 1 import { useAccountStore } from "@/store/persisted/useAccountStore"; 2 - import Link from "next/link"; 2 + import { Link } from "react-router"; 3 3 import LoginButton from "../LoginButton"; 4 4 import SignedAccount from "./SignedAccount"; 5 5 import SignupButton from "./SignupButton"; 6 6 7 - export const NextLink = ({ children, href, ...rest }: Record<string, any>) => ( 8 - <Link href={href} {...rest}> 7 + export const NextLink = ({ children, to, ...rest }: Record<string, any>) => ( 8 + <Link to={to} {...rest}> 9 9 {children} 10 10 </Link> 11 11 );
+5 -5
apps/web/src/components/Shared/Navbar/MobileDrawerMenu.tsx
··· 7 7 import { Features } from "@hey/data/features"; 8 8 import getAccount from "@hey/helpers/getAccount"; 9 9 import getAvatar from "@hey/helpers/getAvatar"; 10 - import Link from "next/link"; 10 + import { Link } from "react-router"; 11 11 import Slug from "../Slug"; 12 12 import Bookmarks from "./NavItems/Bookmarks"; 13 13 import Groups from "./NavItems/Groups"; ··· 38 38 <div className="w-full space-y-2"> 39 39 <Link 40 40 className="mt-2 flex items-center space-x-2 px-5 py-3 hover:bg-gray-200 dark:hover:bg-gray-800" 41 - href={getAccount(currentAccount).link} 41 + to={getAccount(currentAccount).link} 42 42 onClick={handleCloseDrawer} 43 43 > 44 44 <div className="flex w-full space-x-1.5"> ··· 67 67 <div className="divider" /> 68 68 <div> 69 69 <Link 70 - href={getAccount(currentAccount).link} 70 + to={getAccount(currentAccount).link} 71 71 onClick={handleCloseDrawer} 72 72 > 73 73 <YourAccount className={cn(itemClass, "px-4")} /> 74 74 </Link> 75 - <Link href="/settings" onClick={handleCloseDrawer}> 75 + <Link to="/settings" onClick={handleCloseDrawer}> 76 76 <Settings className={cn(itemClass, "px-4")} /> 77 77 </Link> 78 78 {isStaff ? ( 79 - <Link href="/staff" onClick={handleCloseDrawer}> 79 + <Link to="/staff" onClick={handleCloseDrawer}> 80 80 <StaffTools className={cn(itemClass, "px-4")} /> 81 81 </Link> 82 82 ) : null}
+2 -2
apps/web/src/components/Shared/Navbar/NavItems/Bookmarks.tsx
··· 1 1 import cn from "@/helpers/cn"; 2 2 import { BookmarkIcon } from "@heroicons/react/24/outline"; 3 - import Link from "next/link"; 3 + import { Link } from "react-router"; 4 4 5 5 interface BookmarksProps { 6 6 className?: string; ··· 14 14 "flex w-full items-center space-x-1.5 px-2 py-1.5 text-gray-700 text-sm dark:text-gray-200", 15 15 className 16 16 )} 17 - href="/bookmarks" 17 + to="/bookmarks" 18 18 onClick={onClick} 19 19 > 20 20 <BookmarkIcon className="size-4" />
+2 -2
apps/web/src/components/Shared/Navbar/NavItems/Groups.tsx
··· 1 1 import cn from "@/helpers/cn"; 2 2 import { UserGroupIcon } from "@heroicons/react/24/outline"; 3 - import Link from "next/link"; 3 + import { Link } from "react-router"; 4 4 5 5 interface GroupsProps { 6 6 className?: string; ··· 14 14 "flex w-full items-center space-x-1.5 px-2 py-1.5 text-gray-700 text-sm dark:text-gray-200", 15 15 className 16 16 )} 17 - href="/groups" 17 + to="/groups" 18 18 onClick={onClick} 19 19 > 20 20 <UserGroupIcon className="size-4" />
+1 -3
apps/web/src/components/Shared/Navbar/NavItems/Logout.tsx
··· 5 5 import { usePreferencesStore } from "@/store/persisted/usePreferencesStore"; 6 6 import { ArrowRightStartOnRectangleIcon } from "@heroicons/react/24/outline"; 7 7 import { useRevokeAuthenticationMutation } from "@hey/indexer"; 8 - import { useRouter } from "next/router"; 9 8 import { useState } from "react"; 10 9 import toast from "react-hot-toast"; 11 10 ··· 15 14 } 16 15 17 16 const Logout = ({ className = "", onClick }: LogoutProps) => { 18 - const { reload } = useRouter(); 19 17 const { resetPreferences } = usePreferencesStore(); 20 18 const [revoking, setRevoking] = useState(false); 21 19 const { authenticationId } = getCurrentSession(); ··· 36 34 onCompleted: () => { 37 35 resetPreferences(); 38 36 signOut(); 39 - reload(); 37 + location.reload(); 40 38 } 41 39 }), 42 40 {
+2 -2
apps/web/src/components/Shared/Navbar/NavItems/Support.tsx
··· 1 1 import cn from "@/helpers/cn"; 2 2 import { HandRaisedIcon } from "@heroicons/react/24/outline"; 3 - import Link from "next/link"; 3 + import { Link } from "react-router"; 4 4 5 5 interface SupportProps { 6 6 className?: string; ··· 13 13 "flex w-full items-center space-x-1.5 px-2 py-1.5 text-gray-700 text-sm dark:text-gray-200", 14 14 className 15 15 )} 16 - href="/support" 16 + to="/support" 17 17 > 18 18 <HandRaisedIcon className="size-4" /> 19 19 <div>Support</div>
+3 -3
apps/web/src/components/Shared/Navbar/Search/RecentAccounts.tsx
··· 6 6 import getAccount from "@hey/helpers/getAccount"; 7 7 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 8 8 import { useAccountsBulkQuery } from "@hey/indexer"; 9 - import { useRouter } from "next/router"; 9 + import { useNavigate } from "react-router"; 10 10 11 11 interface RecentAccountsProps { 12 12 onAccountClick: () => void; 13 13 } 14 14 15 15 const RecentAccounts = ({ onAccountClick }: RecentAccountsProps) => { 16 - const { push } = useRouter(); 16 + const navigate = useNavigate(); 17 17 const { 18 18 addAccount, 19 19 clearAccount, ··· 50 50 key={account.address} 51 51 onClick={() => { 52 52 addAccount(account.address); 53 - push(getAccount(account).link); 53 + navigate(getAccount(account).link); 54 54 onAccountClick(); 55 55 }} 56 56 >
+10 -5
apps/web/src/components/Shared/Navbar/Search/index.tsx
··· 12 12 useAccountsLazyQuery 13 13 } from "@hey/indexer"; 14 14 import { useClickAway, useDebounce } from "@uidotdev/usehooks"; 15 - import { useRouter } from "next/router"; 16 15 import type { ChangeEvent, MutableRefObject } from "react"; 17 16 import { useEffect, useState } from "react"; 17 + import { useLocation, useNavigate } from "react-router"; 18 18 import RecentAccounts from "./RecentAccounts"; 19 19 20 20 interface SearchProps { ··· 22 22 } 23 23 24 24 const Search = ({ placeholder = "Searchโ€ฆ" }: SearchProps) => { 25 - const { pathname, push, query } = useRouter(); 25 + const { pathname } = useLocation(); 26 + const navigate = useNavigate(); 27 + const location = useLocation(); 28 + const searchParams = new URLSearchParams(location.search); 29 + const type = searchParams.get("type"); 30 + 26 31 const { addAccount } = useSearchStore(); 27 32 const [showDropdown, setShowDropdown] = useState(false); 28 33 const [searchText, setSearchText] = useState(""); ··· 48 53 const handleKeyDown = (evt: ChangeEvent<HTMLFormElement>) => { 49 54 evt.preventDefault(); 50 55 if (pathname === "/search") { 51 - push(`/search?q=${encodeURIComponent(searchText)}&type=${query.type}`); 56 + navigate(`/search?q=${encodeURIComponent(searchText)}&type=${type}`); 52 57 } else { 53 - push(`/search?q=${encodeURIComponent(searchText)}&type=accounts`); 58 + navigate(`/search?q=${encodeURIComponent(searchText)}&type=accounts`); 54 59 } 55 60 handleReset(); 56 61 }; ··· 111 116 key={account.address} 112 117 onClick={() => { 113 118 addAccount(account.address); 114 - push(getAccount(account).link); 119 + navigate(getAccount(account).link); 115 120 handleReset(); 116 121 }} 117 122 >
+4 -4
apps/web/src/components/Shared/Navbar/SignedAccount.tsx
··· 57 57 <MenuItem 58 58 as={NextLink} 59 59 className="m-2 flex items-center rounded-lg px-4 py-2 text-gray-700 text-sm hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-800" 60 - href={getAccount(currentAccount).link} 60 + to={getAccount(currentAccount).link} 61 61 > 62 62 <div className="flex w-full flex-col"> 63 63 <div>Logged in as</div> ··· 87 87 className={({ focus }: { focus: boolean }) => 88 88 cn({ "dropdown-active": focus }, "menu-item") 89 89 } 90 - href={getAccount(currentAccount).link} 90 + to={getAccount(currentAccount).link} 91 91 > 92 92 <YourAccount /> 93 93 </MenuItem> ··· 96 96 className={({ focus }: { focus: boolean }) => 97 97 cn({ "dropdown-active": focus }, "menu-item") 98 98 } 99 - href="/settings" 99 + to="/settings" 100 100 > 101 101 <Settings /> 102 102 </MenuItem> ··· 106 106 className={({ focus }: { focus: boolean }) => 107 107 cn({ "dropdown-active": focus }, "menu-item") 108 108 } 109 - href="/staff" 109 + to="/staff" 110 110 > 111 111 <StaffTools /> 112 112 </MenuItem>
+6 -8
apps/web/src/components/Shared/Navbar/index.tsx
··· 1 1 import NotificationIcon from "@/components/Notification/NotificationIcon"; 2 - import { H6 } from "@/components/Shared/UI"; 2 + import { H6, Image } from "@/components/Shared/UI"; 3 3 import cn from "@/helpers/cn"; 4 4 import { useAccountStore } from "@/store/persisted/useAccountStore"; 5 5 import { usePreferencesStore } from "@/store/persisted/usePreferencesStore"; 6 6 import { MagnifyingGlassIcon, XMarkIcon } from "@heroicons/react/24/outline"; 7 7 import { STATIC_IMAGES_URL } from "@hey/data/constants"; 8 - import Image from "next/image"; 9 - import Link from "next/link"; 10 - import { useRouter } from "next/router"; 11 8 import { useState } from "react"; 9 + import { Link, useLocation } from "react-router"; 12 10 import MenuItems from "./MenuItems"; 13 11 import MoreNavItems from "./MoreNavItems"; 14 12 import Search from "./Search"; ··· 35 33 !current 36 34 } 37 35 )} 38 - href={url} 36 + to={url} 39 37 > 40 38 <H6>{name}</H6> 41 39 </Link> ··· 43 41 }; 44 42 45 43 const NavItems = () => { 46 - const { pathname } = useRouter(); 44 + const { pathname } = useLocation(); 47 45 48 46 return ( 49 47 <> ··· 77 75 </button> 78 76 <Link 79 77 className="hidden rounded-full outline-offset-8 md:block" 80 - href="/" 78 + to="/" 81 79 > 82 80 <Image 83 81 alt="Logo" ··· 98 96 </div> 99 97 <Link 100 98 className={cn("md:hidden", !currentAccount?.address && "ml-[60px]")} 101 - href="/" 99 + to="/" 102 100 > 103 101 <Image 104 102 alt="Logo"
+1 -2
apps/web/src/components/Shared/NotLoggedIn.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 2 import LoginButton from "@/components/Shared/LoginButton"; 3 - import { H2 } from "@/components/Shared/UI"; 3 + import { H2, Image } from "@/components/Shared/UI"; 4 4 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; 5 - import Image from "next/image"; 6 5 7 6 const NotLoggedIn = () => { 8 7 return (
+2 -2
apps/web/src/components/Shared/Oembed/Embed.tsx
··· 3 3 import { ATTACHMENT } from "@hey/data/constants"; 4 4 import imageKit from "@hey/helpers/imageKit"; 5 5 import stopEventPropagation from "@hey/helpers/stopEventPropagation"; 6 - import Link from "next/link"; 6 + import { Link } from "react-router"; 7 7 8 8 interface EmbedProps { 9 9 og: OembedRouterOutput["get"]; ··· 17 17 return ( 18 18 <div className="mt-4 w-full text-sm md:w-4/6"> 19 19 <Link 20 - href={og.url} 20 + to={og.url} 21 21 onClick={stopEventPropagation} 22 22 rel="noreferrer noopener" 23 23 target={og.url.includes(location.host) ? "_self" : "_blank"}
+3 -3
apps/web/src/components/Shared/PostWrapper.tsx
··· 1 1 import type { AnyPostFragment } from "@hey/indexer"; 2 - import { useRouter } from "next/router"; 3 2 import type { ReactNode } from "react"; 3 + import { useNavigate } from "react-router"; 4 4 5 5 interface PostWrapperProps { 6 6 children: ReactNode | ReactNode[]; ··· 9 9 } 10 10 11 11 const PostWrapper = ({ children, className = "", post }: PostWrapperProps) => { 12 - const { push } = useRouter(); 12 + const navigate = useNavigate(); 13 13 14 14 const handleClick = () => { 15 15 const selection = window.getSelection(); 16 16 if (!selection || selection.toString().length === 0) { 17 - push(`/posts/${post.id}`); 17 + navigate(`/posts/${post.id}`); 18 18 } 19 19 }; 20 20
+3 -3
apps/web/src/components/Shared/Sidebar/SidebarMenu.tsx
··· 1 1 import { Card } from "@/components/Shared/UI"; 2 2 import cn from "@/helpers/cn"; 3 3 import { Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/react"; 4 - import { useRouter } from "next/router"; 5 4 import { useState } from "react"; 5 + import { useLocation } from "react-router"; 6 6 import type { SidebarProps } from "."; 7 7 import MenuTransition from "../MenuTransition"; 8 8 import { NextLink } from "../Navbar/MenuItems"; 9 9 10 10 const SidebarMenu = ({ items }: SidebarProps) => { 11 - const { pathname } = useRouter(); 11 + const { pathname } = useLocation(); 12 12 const menuItems = items.filter((item) => item?.enabled !== false); 13 13 const [selectedItem, setSelectedItem] = useState( 14 14 menuItems.find((item) => item.url === pathname) || menuItems[0] ··· 47 47 "m-2 flex items-center space-x-2 rounded-lg p-2" 48 48 ) 49 49 } 50 - href={item.url} 50 + to={item.url} 51 51 key={item.url} 52 52 onClick={() => setSelectedItem(item)} 53 53 >
+3 -4
apps/web/src/components/Shared/Sidebar/SidebarTabs.tsx
··· 1 1 import cn from "@/helpers/cn"; 2 - import Link from "next/link"; 3 - import { useRouter } from "next/router"; 4 2 import type { ReactNode } from "react"; 3 + import { Link, useLocation } from "react-router"; 5 4 6 5 interface MenuProps { 7 6 children: ReactNode; ··· 30 29 "hover:text-black hover:dark:text-white", 31 30 "flex items-center space-x-2 rounded-lg px-3 py-2" 32 31 )} 33 - href={url} 32 + to={url} 34 33 > 35 34 {children} 36 35 </Link> 37 36 ); 38 37 39 38 const SidebarTabs = ({ items }: SidebarProps) => { 40 - const { pathname } = useRouter(); 39 + const { pathname } = useLocation(); 41 40 const menuItems = items.filter((item) => item.enabled !== false); 42 41 43 42 return (
+2 -2
apps/web/src/components/Shared/SingleAccount.tsx
··· 4 4 import getAvatar from "@hey/helpers/getAvatar"; 5 5 import getMentions from "@hey/helpers/getMentions"; 6 6 import type { AccountFragment } from "@hey/indexer"; 7 - import Link from "next/link"; 8 7 import { memo } from "react"; 8 + import { Link } from "react-router"; 9 9 import FollowUnfollowButton from "./Account/FollowUnfollowButton"; 10 10 import Verified from "./Account/Icons/Verified"; 11 11 import AccountPreview from "./AccountPreview"; ··· 91 91 return ( 92 92 <div className="flex items-center justify-between"> 93 93 {linkToAccount && account.address ? ( 94 - <Link href={getAccount(account).link}> 94 + <Link to={getAccount(account).link}> 95 95 <AccountInfo /> 96 96 </Link> 97 97 ) : (
+2 -2
apps/web/src/components/Shared/SingleGroup.tsx
··· 3 3 import getAvatar from "@hey/helpers/getAvatar"; 4 4 import getMentions from "@hey/helpers/getMentions"; 5 5 import type { GroupFragment } from "@hey/indexer"; 6 - import Link from "next/link"; 7 6 import { memo } from "react"; 7 + import { Link } from "react-router"; 8 8 import JoinLeaveButton from "./Group/JoinLeaveButton"; 9 9 import Markup from "./Markup"; 10 10 ··· 61 61 return ( 62 62 <div className="flex items-center justify-between"> 63 63 {linkToGroup ? ( 64 - <Link href={`/g/${group.address}`}> 64 + <Link to={`/g/${group.address}`}> 65 65 <GroupInfo /> 66 66 </Link> 67 67 ) : (
+2 -2
apps/web/src/components/Shared/SmallSingleAccount.tsx
··· 4 4 import getAccount from "@hey/helpers/getAccount"; 5 5 import getAvatar from "@hey/helpers/getAvatar"; 6 6 import type { AccountFragment } from "@hey/indexer"; 7 - import Link from "next/link"; 8 7 import { memo } from "react"; 8 + import { Link } from "react-router"; 9 9 import Verified from "./Account/Icons/Verified"; 10 10 import Slug from "./Slug"; 11 11 ··· 67 67 ); 68 68 69 69 return linkToAccount ? ( 70 - <Link href={getAccount(account).link}> 70 + <Link to={getAccount(account).link}> 71 71 <AccountInfo /> 72 72 </Link> 73 73 ) : (
+1 -3
apps/web/src/components/Shared/SwitchAccounts.tsx
··· 13 13 useAccountsAvailableQuery, 14 14 useSwitchAccountMutation 15 15 } from "@hey/indexer"; 16 - import { useRouter } from "next/router"; 17 16 import { useState } from "react"; 18 17 import toast from "react-hot-toast"; 19 18 import Loader from "./Loader"; 20 19 21 20 const SwitchAccounts = () => { 22 - const { reload } = useRouter(); 23 21 const { currentAccount } = useAccountStore(); 24 22 const [isSubmitting, setIsSubmitting] = useState(false); 25 23 const [loggingInAccountId, setLoggingInAccountId] = useState<null | string>( ··· 59 57 signOut(); 60 58 signIn({ accessToken, idToken, refreshToken }); 61 59 trackEvent(Events.Account.Switch); 62 - return reload(); 60 + return location.reload(); 63 61 } 64 62 65 63 return toast.error(Errors.SomethingWentWrong);
+13 -7
apps/web/src/components/Shared/UI/TabButton.tsx
··· 1 1 import cn from "@/helpers/cn"; 2 - import { useRouter } from "next/router"; 3 2 import type { ReactNode } from "react"; 3 + import { useLocation, useNavigate } from "react-router"; 4 4 5 5 interface TabButtonProps { 6 6 active: boolean; ··· 23 23 showOnSm = false, 24 24 type 25 25 }: TabButtonProps) => { 26 - const router = useRouter(); 26 + const navigate = useNavigate(); 27 + const location = useLocation(); 28 + 29 + const updateQuery = (type: string) => { 30 + const params = new URLSearchParams(location.search); 31 + params.set("type", type); 32 + 33 + navigate(`${location.pathname}?${params.toString()}`, { 34 + replace: true 35 + }); 36 + }; 27 37 28 38 return ( 29 39 <button ··· 37 47 className 38 48 )} 39 49 onClick={() => { 40 - if (type) { 41 - router.replace({ query: { ...router.query, type } }, undefined, { 42 - shallow: true 43 - }); 44 - } 50 + updateQuery(type || ""); 45 51 onClick?.(); 46 52 }} 47 53 type="button"
+2 -2
apps/web/src/components/Shared/WalletAccount.tsx
··· 2 2 import { ArrowTopRightOnSquareIcon } from "@heroicons/react/24/outline"; 3 3 import { BLOCK_EXPLORER_URL, DEFAULT_AVATAR } from "@hey/data/constants"; 4 4 import formatAddress from "@hey/helpers/formatAddress"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 import type { Address } from "viem"; 7 7 import { useEnsName } from "wagmi"; 8 8 import Slug from "./Slug"; ··· 22 22 <div className="flex items-center justify-between"> 23 23 <Link 24 24 className="flex items-center space-x-3" 25 - href={`${BLOCK_EXPLORER_URL}/address/${address}`} 25 + to={`${BLOCK_EXPLORER_URL}/address/${address}`} 26 26 rel="noreferrer noopener" 27 27 target="_blank" 28 28 >
+1 -2
apps/web/src/components/Staff/Accounts/Overview/Tool/AccountPreferences.tsx
··· 1 1 import MetaDetails from "@/components/Shared/MetaDetails"; 2 - import { H5 } from "@/components/Shared/UI"; 2 + import { H5, Image } from "@/components/Shared/UI"; 3 3 import { BellIcon, CursorArrowRaysIcon } from "@heroicons/react/24/outline"; 4 4 import { 5 5 CheckCircleIcon, ··· 8 8 } from "@heroicons/react/24/solid"; 9 9 import type { PreferencesRouterOutput } from "@hey/api/src/routers/preferences"; 10 10 import { STATIC_IMAGES_URL } from "@hey/data/constants"; 11 - import Image from "next/image"; 12 11 13 12 interface AccountPreferencesProps { 14 13 preferences: PreferencesRouterOutput["get"];
+3 -3
apps/web/src/components/Staff/Accounts/Overview/Tool/ManagedAccounts.tsx
··· 2 2 import { H5 } from "@/components/Shared/UI"; 3 3 import { UsersIcon } from "@heroicons/react/24/outline"; 4 4 import { useAccountsAvailableQuery } from "@hey/indexer"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 7 7 interface ManagedAccountsProps { 8 8 address: string; ··· 30 30 {data?.lastLoggedInAccount ? ( 31 31 <div> 32 32 <Link 33 - href={`/staff/accounts/${data?.lastLoggedInAccount?.address}`} 33 + to={`/staff/accounts/${data?.lastLoggedInAccount?.address}`} 34 34 > 35 35 <SmallSingleAccount account={data?.lastLoggedInAccount} /> 36 36 </Link> ··· 40 40 {data?.accountsAvailable.items.map((accountAvailable) => ( 41 41 <div key={accountAvailable.account.address}> 42 42 <Link 43 - href={`/staff/accounts/${accountAvailable.account.address}`} 43 + to={`/staff/accounts/${accountAvailable.account.address}`} 44 44 > 45 45 <SmallSingleAccount account={accountAvailable.account} /> 46 46 </Link>
+6 -9
apps/web/src/components/Staff/Accounts/Overview/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 + import Custom404 from "@/components/Shared/404"; 2 3 import Loader from "@/components/Shared/Loader"; 3 4 import { 4 5 Card, ··· 11 12 import AccountStaffTool from "@/components/Staff/Accounts/Overview/Tool"; 12 13 import StaffSidebar from "@/components/Staff/Sidebar"; 13 14 import hasAccess from "@/helpers/hasAccess"; 14 - import Custom404 from "@/pages/404"; 15 15 import { useAccountStore } from "@/store/persisted/useAccountStore"; 16 16 import { UserIcon } from "@heroicons/react/24/outline"; 17 17 import { APP_NAME } from "@hey/data/constants"; 18 18 import { Features } from "@hey/data/features"; 19 19 import { useAccountQuery } from "@hey/indexer"; 20 - import { useRouter } from "next/router"; 20 + import { useParams } from "react-router"; 21 21 22 - const Overview = () => { 23 - const { 24 - isReady, 25 - query: { address } 26 - } = useRouter(); 22 + const StaffAccountOverview = () => { 23 + const { address } = useParams<{ address: string }>(); 27 24 const { currentAccount } = useAccountStore(); 28 25 const isStaff = hasAccess(Features.Staff); 29 26 30 27 const { data, error, loading } = useAccountQuery({ 31 - skip: !address || !isReady, 28 + skip: !address, 32 29 variables: { request: { address: address } } 33 30 }); 34 31 ··· 67 64 ); 68 65 }; 69 66 70 - export default Overview; 67 + export default StaffAccountOverview;
+1 -1
apps/web/src/components/Staff/Accounts/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 + import Custom404 from "@/components/Shared/404"; 2 3 import { 3 4 GridItemEight, 4 5 GridItemFour, 5 6 GridLayout 6 7 } from "@/components/Shared/UI"; 7 8 import hasAccess from "@/helpers/hasAccess"; 8 - import Custom404 from "@/pages/404"; 9 9 import { useAccountStore } from "@/store/persisted/useAccountStore"; 10 10 import { APP_NAME } from "@hey/data/constants"; 11 11 import { Features } from "@hey/data/features";
+2 -2
apps/web/src/components/Staff/Overview/App.tsx
··· 6 6 NumberedStat 7 7 } from "@/components/Shared/UI"; 8 8 import { BLOCK_EXPLORER_URL, HEY_APP, HEY_TREASURY } from "@hey/data/constants"; 9 - import Link from "next/link"; 9 + import { Link } from "react-router"; 10 10 import { formatEther } from "viem"; 11 11 import { useBalance } from "wagmi"; 12 12 ··· 28 28 <div className="space-y-5"> 29 29 <div className="linkify font-bold"> 30 30 <Link 31 - href={`${BLOCK_EXPLORER_URL}/address/${HEY_APP}`} 31 + to={`${BLOCK_EXPLORER_URL}/address/${HEY_APP}`} 32 32 target="_blank" 33 33 > 34 34 Open App Contract in Explorer
+2 -2
apps/web/src/components/Staff/Overview/Sponsorship.tsx
··· 6 6 NumberedStat 7 7 } from "@/components/Shared/UI"; 8 8 import { BLOCK_EXPLORER_URL, HEY_SPONSOR } from "@hey/data/constants"; 9 - import Link from "next/link"; 9 + import { Link } from "react-router"; 10 10 import { formatEther } from "viem"; 11 11 import { useBalance } from "wagmi"; 12 12 ··· 28 28 <div className="space-y-5"> 29 29 <div className="linkify font-bold"> 30 30 <Link 31 - href={`${BLOCK_EXPLORER_URL}/address/${HEY_SPONSOR}`} 31 + to={`${BLOCK_EXPLORER_URL}/address/${HEY_SPONSOR}`} 32 32 target="_blank" 33 33 > 34 34 Open Sponsorship Contract in Explorer
+3 -3
apps/web/src/components/Staff/Overview/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 + import Custom404 from "@/components/Shared/404"; 2 3 import { 3 4 GridItemEight, 4 5 GridItemFour, 5 6 GridLayout 6 7 } from "@/components/Shared/UI"; 7 8 import hasAccess from "@/helpers/hasAccess"; 8 - import Custom404 from "@/pages/404"; 9 9 import { useAccountStore } from "@/store/persisted/useAccountStore"; 10 10 import { APP_NAME } from "@hey/data/constants"; 11 11 import { Features } from "@hey/data/features"; ··· 13 13 import App from "./App"; 14 14 import Sponsorship from "./Sponsorship"; 15 15 16 - const Overview = () => { 16 + const StaffOverview = () => { 17 17 const { currentAccount } = useAccountStore(); 18 18 const isStaff = hasAccess(Features.Staff); 19 19 ··· 35 35 ); 36 36 }; 37 37 38 - export default Overview; 38 + export default StaffOverview;
+1 -1
apps/web/src/components/Staff/Permissions/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 + import Custom404 from "@/components/Shared/404"; 2 3 import { 3 4 GridItemEight, 4 5 GridItemFour, 5 6 GridLayout 6 7 } from "@/components/Shared/UI"; 7 8 import hasAccess from "@/helpers/hasAccess"; 8 - import Custom404 from "@/pages/404"; 9 9 import { useAccountStore } from "@/store/persisted/useAccountStore"; 10 10 import { APP_NAME } from "@hey/data/constants"; 11 11 import { Features } from "@hey/data/features";
+8 -8
apps/web/src/components/Support/index.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 2 import { Card, GridItemTwelve, GridLayout, H3 } from "@/components/Shared/UI"; 3 3 import { APP_NAME } from "@hey/data/constants"; 4 - import Link from "next/link"; 4 + import { Link } from "react-router"; 5 5 6 6 const Support = () => { 7 7 return ( ··· 13 13 <H3>Support</H3> 14 14 <p className="mt-3"> 15 15 For assistance, please email us at{" "} 16 - <Link href="mailto:support@hey.xyz">support@hey.xyz</Link> with a 16 + <Link to="mailto:support@hey.xyz">support@hey.xyz</Link> with a 17 17 detailed description of your issue and how we can assist you. 18 18 </p> 19 19 <ul className="my-5 space-y-2"> 20 20 <li> 21 - <Link href="/guidelines">Community Guidelines</Link> 21 + <Link to="/guidelines">Community Guidelines</Link> 22 22 </li> 23 23 <li> 24 - <Link href="/terms">Terms of Service</Link> 24 + <Link to="/terms">Terms of Service</Link> 25 25 </li> 26 26 <li> 27 - <Link href="/privacy">Hey Privacy Policy</Link> 27 + <Link to="/privacy">Hey Privacy Policy</Link> 28 28 </li> 29 29 <li> 30 30 <Link 31 - href="https://www.lens.xyz/legal/lens.xyz-privacy-policy.pdf" 31 + to="https://www.lens.xyz/legal/lens.xyz-privacy-policy.pdf" 32 32 target="_blank" 33 33 > 34 34 Lens Protocol Privacy Policy 35 35 </Link> 36 36 </li> 37 37 <li> 38 - <Link href="/copyright">Copyright Policy</Link> 38 + <Link to="/copyright">Copyright Policy</Link> 39 39 </li> 40 40 </ul> 41 41 <p className="mt-3 text-gray-500 text-sm"> 42 42 Send any legal requests to{" "} 43 - <Link href="mailto:legal@hey.xyz">legal@hey.xyz</Link> 43 + <Link to="mailto:legal@hey.xyz">legal@hey.xyz</Link> 44 44 </p> 45 45 </div> 46 46 </Card>
+20
apps/web/src/font.css
··· 1 + @font-face { 2 + font-family: "SofiaPro"; 3 + src: url("./assets/fonts/SofiaProSoftReg.woff2") format("woff2"); 4 + font-weight: 400; /* Regular */ 5 + font-style: normal; 6 + } 7 + 8 + @font-face { 9 + font-family: "SofiaPro"; 10 + src: url("./assets/fonts/SofiaProSoftMed.woff2") format("woff2"); 11 + font-weight: 500; /* Medium */ 12 + font-style: normal; 13 + } 14 + 15 + @font-face { 16 + font-family: "SofiaPro"; 17 + src: url("./assets/fonts/SofiaProSoftBold.woff2") format("woff2"); 18 + font-weight: 700; /* Bold */ 19 + font-style: normal; 20 + }
-31
apps/web/src/helpers/fonts.ts
··· 1 - import { Rubik_Mono_One } from "next/font/google"; 2 - import localFont from "next/font/local"; 3 - 4 - export const heyFont = localFont({ 5 - display: "swap", 6 - fallback: ["sans-serif"], 7 - preload: true, 8 - src: [ 9 - { 10 - path: "../../public/fonts/SofiaProSoftReg.woff2", 11 - style: "normal", 12 - weight: "400" 13 - }, 14 - { 15 - path: "../../public/fonts/SofiaProSoftMed.woff2", 16 - style: "medium", 17 - weight: "600" 18 - }, 19 - { 20 - path: "../../public/fonts/SofiaProSoftBold.woff2", 21 - style: "bold", 22 - weight: "700" 23 - } 24 - ], 25 - style: "normal" 26 - }); 27 - 28 - export const rubikMonoOneFont = Rubik_Mono_One({ 29 - subsets: ["latin"], 30 - weight: "400" 31 - });
+20
apps/web/src/main.tsx
··· 1 + import "./font.css"; 2 + import "./styles.css"; 3 + 4 + import { StrictMode } from "react"; 5 + import { createRoot } from "react-dom/client"; 6 + import { scan } from "react-scan"; 7 + import Providers from "./components/Common/Providers"; 8 + import { Routes } from "./routes"; 9 + 10 + scan({ 11 + enabled: true 12 + }); 13 + 14 + createRoot(document.getElementById("_hey_") as HTMLElement).render( 15 + <StrictMode> 16 + <Providers> 17 + <Routes /> 18 + </Providers> 19 + </StrictMode> 20 + );
+2 -2
apps/web/src/pages/404.tsx apps/web/src/components/Shared/404.tsx
··· 2 2 import { Button, H2 } from "@/components/Shared/UI"; 3 3 import { HomeIcon } from "@heroicons/react/24/outline"; 4 4 import { APP_NAME, STATIC_IMAGES_URL } from "@hey/data/constants"; 5 - import Link from "next/link"; 5 + import { Link } from "react-router"; 6 6 7 7 const Custom404 = () => { 8 8 return ( ··· 17 17 <div className="py-10 text-center"> 18 18 <H2 className="mb-4">Oops, Lostโ€ฝ</H2> 19 19 <div className="mb-4">This page could not be found.</div> 20 - <Link href="/"> 20 + <Link to="/"> 21 21 <Button 22 22 className="mx-auto flex items-center" 23 23 icon={<HomeIcon className="size-4" />}
+3 -5
apps/web/src/pages/500.tsx apps/web/src/components/Shared/500.tsx
··· 1 1 import MetaTags from "@/components/Common/MetaTags"; 2 2 import { Button, H2 } from "@/components/Shared/UI"; 3 - import cn from "@/helpers/cn"; 4 - import { heyFont } from "@/helpers/fonts"; 5 3 import { HomeIcon } from "@heroicons/react/24/outline"; 6 4 import { APP_NAME } from "@hey/data/constants"; 7 - import Link from "next/link"; 5 + import { Link } from "react-router"; 8 6 9 7 const Custom500 = () => { 10 8 return ( 11 - <div className={cn("page-center flex-col", heyFont.className)}> 9 + <div className="page-center flex-col"> 12 10 <MetaTags title={`500 โ€ข ${APP_NAME}`} /> 13 11 <div className="py-10 text-center"> 14 12 <H2 className="mb-4">Looks like something went wrong!</H2> ··· 16 14 We track these errors automatically, but if the problem persists feel 17 15 free to contact us. In the meantime, try refreshing. 18 16 </div> 19 - <Link href="/"> 17 + <Link to="/"> 20 18 <Button 21 19 className="mx-auto flex items-center" 22 20 icon={<HomeIcon className="size-4" />}
-19
apps/web/src/pages/_app.tsx
··· 1 - import Providers from "@/components/Common/Providers"; 2 - import { heyFont } from "@/helpers/fonts"; 3 - import type { AppProps } from "next/app"; 4 - import "../styles.css"; 5 - 6 - const App = ({ Component, pageProps }: AppProps) => { 7 - return ( 8 - <Providers> 9 - <style global jsx>{` 10 - body { 11 - font-family: ${heyFont.style.fontFamily}; 12 - } 13 - `}</style> 14 - <Component {...pageProps} /> 15 - </Providers> 16 - ); 17 - }; 18 - 19 - export default App;
-32
apps/web/src/pages/_document.tsx
··· 1 - import Document, { Head, Html, Main, NextScript } from "next/document"; 2 - import Script from "next/script"; 3 - 4 - class HeyDocument extends Document { 5 - render() { 6 - return ( 7 - <Html lang="en"> 8 - <Head> 9 - <meta charSet="utf-8" /> 10 - <meta content="IE=edge" httpEquiv="X-UA-Compatible" /> 11 - 12 - {/* Prefetch and Preconnect */} 13 - <link href="https://hey-assets.b-cdn.net" rel="preconnect" /> 14 - <link href="https://hey-assets.b-cdn.net" rel="dns-prefetch" /> 15 - 16 - {/* Simple Analytics */} 17 - <Script 18 - async 19 - data-hostname="hey.xyz" 20 - src="https://scripts.simpleanalyticscdn.com/latest.dev.js" 21 - /> 22 - </Head> 23 - <body> 24 - <Main /> 25 - <NextScript /> 26 - </body> 27 - </Html> 28 - ); 29 - } 30 - } 31 - 32 - export default HeyDocument;
-3
apps/web/src/pages/account/[address].tsx
··· 1 - import ViewProfile from "@/components/Account"; 2 - 3 - export default ViewProfile;
-3
apps/web/src/pages/bookmarks.tsx
··· 1 - import Bookmarks from "@/components/Bookmarks"; 2 - 3 - export default Bookmarks;
-3
apps/web/src/pages/copyright.tsx
··· 1 - import Copyright from "@/components/Pages/Copyright"; 2 - 3 - export default Copyright;
-3
apps/web/src/pages/explore.tsx
··· 1 - import Explore from "@/components/Explore"; 2 - 3 - export default Explore;
-3
apps/web/src/pages/g/[address]/index.tsx
··· 1 - import ViewGroup from "@/components/Group"; 2 - 3 - export default ViewGroup;
-3
apps/web/src/pages/g/[address]/settings/index.tsx
··· 1 - import GroupSettings from "@/components/Group/Settings/Overview"; 2 - 3 - export default GroupSettings;
-3
apps/web/src/pages/g/[address]/settings/rules.tsx
··· 1 - import RulesSettings from "@/components/Group/Settings/Rules"; 2 - 3 - export default RulesSettings;
-3
apps/web/src/pages/groups.tsx
··· 1 - import Groups from "@/components/Groups"; 2 - 3 - export default Groups;
-3
apps/web/src/pages/guidelines.tsx
··· 1 - import Guidelines from "@/components/Pages/Guidelines"; 2 - 3 - export default Guidelines;
-3
apps/web/src/pages/index.tsx
··· 1 - import Home from "@/components/Home"; 2 - 3 - export default Home;
-3
apps/web/src/pages/notifications.tsx
··· 1 - import Notification from "@/components/Notification"; 2 - 3 - export default Notification;
-3
apps/web/src/pages/posts/[id]/index.tsx
··· 1 - import ViewPost from "@/components/Post"; 2 - 3 - export default ViewPost;
-3
apps/web/src/pages/posts/[id]/quotes.tsx
··· 1 - import ViewPost from "@/components/Post"; 2 - 3 - export default ViewPost;
-3
apps/web/src/pages/privacy.tsx
··· 1 - import Privacy from "@/components/Pages/Privacy"; 2 - 3 - export default Privacy;
-3
apps/web/src/pages/search.tsx
··· 1 - import Search from "@/components/Search"; 2 - 3 - export default Search;
-3
apps/web/src/pages/settings/account.tsx
··· 1 - import AccountSettings from "@/components/Settings/Account"; 2 - 3 - export default AccountSettings;
-3
apps/web/src/pages/settings/blocked.tsx
··· 1 - import BlockedSettings from "@/components/Settings/Blocked"; 2 - 3 - export default BlockedSettings;
-3
apps/web/src/pages/settings/danger.tsx
··· 1 - import DangerSettings from "@/components/Settings/Danger"; 2 - 3 - export default DangerSettings;
-3
apps/web/src/pages/settings/developer.tsx
··· 1 - import DeveloperSettings from "@/components/Settings/Developer"; 2 - 3 - export default DeveloperSettings;
-3
apps/web/src/pages/settings/funds.tsx
··· 1 - import FundsSettings from "@/components/Settings/Funds"; 2 - 3 - export default FundsSettings;
-3
apps/web/src/pages/settings/index.tsx
··· 1 - import ProfileSettings from "@/components/Settings/Profile"; 2 - 3 - export default ProfileSettings;
-3
apps/web/src/pages/settings/manager.tsx
··· 1 - import ManagerSettings from "@/components/Settings/Manager"; 2 - 3 - export default ManagerSettings;
-3
apps/web/src/pages/settings/preferences.tsx
··· 1 - import PreferencesSettings from "@/components/Settings/Preferences"; 2 - 3 - export default PreferencesSettings;
-3
apps/web/src/pages/settings/sessions.tsx
··· 1 - import SessionsSettings from "@/components/Settings/Sessions"; 2 - 3 - export default SessionsSettings;
-3
apps/web/src/pages/settings/username.tsx
··· 1 - import UsernameSettings from "@/components/Settings/Username"; 2 - 3 - export default UsernameSettings;
-3
apps/web/src/pages/staff/accounts/[address].tsx
··· 1 - import Overview from "@/components/Staff/Accounts/Overview"; 2 - 3 - export default Overview;
-3
apps/web/src/pages/staff/accounts/index.tsx
··· 1 - import Accounts from "@/components/Staff/Accounts"; 2 - 3 - export default Accounts;
-3
apps/web/src/pages/staff/index.tsx
··· 1 - import Overview from "@/components/Staff/Overview"; 2 - 3 - export default Overview;
-3
apps/web/src/pages/staff/permissions.tsx
··· 1 - import Permissions from "@/components/Staff/Permissions"; 2 - 3 - export default Permissions;
-3
apps/web/src/pages/support.tsx
··· 1 - import Support from "@/components/Support"; 2 - 3 - export default Support;
-3
apps/web/src/pages/terms.tsx
··· 1 - import Terms from "@/components/Pages/Terms"; 2 - 3 - export default Terms;
-3
apps/web/src/pages/u/[username].tsx
··· 1 - import ViewProfile from "@/components/Account"; 2 - 3 - export default ViewProfile;
+89
apps/web/src/routes.tsx
··· 1 + import ViewGroup from "@/components/Group"; 2 + import GroupSettings from "@/components/Group/Settings/Overview"; 3 + import RulesSettings from "@/components/Group/Settings/Rules"; 4 + import Groups from "@/components/Groups"; 5 + import Home from "@/components/Home"; 6 + import Notification from "@/components/Notification"; 7 + import Terms from "@/components/Pages/Terms"; 8 + import Search from "@/components/Search"; 9 + import Accounts from "@/components/Staff/Accounts"; 10 + import StaffAccountOverview from "@/components/Staff/Accounts/Overview"; 11 + import StaffOverview from "@/components/Staff/Overview"; 12 + import Permissions from "@/components/Staff/Permissions"; 13 + import Support from "@/components/Support"; 14 + import { BrowserRouter, Route, Routes as RouterRoutes } from "react-router"; 15 + import ViewProfile from "./components/Account"; 16 + import Bookmarks from "./components/Bookmarks"; 17 + import Layout from "./components/Common/Layout"; 18 + import Explore from "./components/Explore"; 19 + import Copyright from "./components/Pages/Copyright"; 20 + import Guidelines from "./components/Pages/Guidelines"; 21 + import Privacy from "./components/Pages/Privacy"; 22 + import ViewPost from "./components/Post"; 23 + import AccountSettings from "./components/Settings/Account"; 24 + import BlockedSettings from "./components/Settings/Blocked"; 25 + import DangerSettings from "./components/Settings/Danger"; 26 + import DeveloperSettings from "./components/Settings/Developer"; 27 + import FundsSettings from "./components/Settings/Funds"; 28 + import ManagerSettings from "./components/Settings/Manager"; 29 + import PreferencesSettings from "./components/Settings/Preferences"; 30 + import ProfileSettings from "./components/Settings/Profile"; 31 + import SessionsSettings from "./components/Settings/Sessions"; 32 + import UsernameSettings from "./components/Settings/Username"; 33 + import Custom404 from "./components/Shared/404"; 34 + 35 + export const Routes = () => { 36 + return ( 37 + <BrowserRouter> 38 + <RouterRoutes> 39 + <Route path="/" element={<Layout />}> 40 + <Route index element={<Home />} /> 41 + <Route path="account/:address" element={<ViewProfile />} /> 42 + <Route path="explore" element={<Explore />} /> 43 + <Route path="search" element={<Search />} /> 44 + <Route path="groups" element={<Groups />} /> 45 + <Route path="bookmarks" element={<Bookmarks />} /> 46 + <Route path="notifications" element={<Notification />} /> 47 + <Route path="u/:username" element={<ViewProfile />} /> 48 + <Route path="g/:username"> 49 + <Route index element={<ViewGroup />} /> 50 + <Route path="settings"> 51 + <Route index element={<GroupSettings />} /> 52 + <Route path="rules" element={<RulesSettings />} /> 53 + </Route> 54 + </Route> 55 + <Route path="posts/:id"> 56 + <Route index element={<ViewPost />} /> 57 + <Route path="quotes" element={<ViewPost />} /> 58 + </Route> 59 + <Route path="settings"> 60 + <Route index element={<ProfileSettings />} /> 61 + <Route path="account" element={<AccountSettings />} /> 62 + <Route path="blocked" element={<BlockedSettings />} /> 63 + <Route path="danger" element={<DangerSettings />} /> 64 + <Route path="developer" element={<DeveloperSettings />} /> 65 + <Route path="funds" element={<FundsSettings />} /> 66 + <Route path="manager" element={<ManagerSettings />} /> 67 + <Route path="preferences" element={<PreferencesSettings />} /> 68 + <Route path="sessions" element={<SessionsSettings />} /> 69 + <Route path="username" element={<UsernameSettings />} /> 70 + </Route> 71 + <Route path="staff"> 72 + <Route index element={<StaffOverview />} /> 73 + <Route path="permissions" element={<Permissions />} /> 74 + <Route path="accounts"> 75 + <Route index element={<Accounts />} /> 76 + <Route path=":address" element={<StaffAccountOverview />} /> 77 + </Route> 78 + </Route> 79 + <Route path="support" element={<Support />} /> 80 + <Route path="terms" element={<Terms />} /> 81 + <Route path="privacy" element={<Privacy />} /> 82 + <Route path="guidelines" element={<Guidelines />} /> 83 + <Route path="copyright" element={<Copyright />} /> 84 + <Route path="*" element={<Custom404 />} /> 85 + </Route> 86 + </RouterRoutes> 87 + </BrowserRouter> 88 + ); 89 + };
+1
apps/web/src/styles.css
··· 7 7 } 8 8 9 9 body { 10 + font-family: "SofiaPro", system-ui, sans-serif; 10 11 @apply bg-gray-50; 11 12 @apply dark:bg-black; 12 13 }
+1 -1
apps/web/tsconfig.json
··· 7 7 "@/*": ["./src/*"] 8 8 } 9 9 }, 10 - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"] 10 + "include": ["**/*.ts", "**/*.tsx"] 11 11 }
+52
apps/web/vite.config.ts
··· 1 + import react from "@vitejs/plugin-react"; 2 + import path from "node:path"; 3 + import { defineConfig } from "vite"; 4 + import EnvironmentPlugin from "vite-plugin-environment"; 5 + 6 + const getUniqueChunkName = (facadeModuleId: string) => { 7 + const modulePathParts = facadeModuleId.split("/"); 8 + const moduleName = modulePathParts[modulePathParts.length - 2] || "module"; 9 + return `assets/${moduleName}-[name].[hash].js`; 10 + }; 11 + 12 + export default defineConfig({ 13 + plugins: [ 14 + react(), 15 + EnvironmentPlugin(["VITE_IS_PRODUCTION", "NEXT_PUBLIC_LENS_NETWORK"]) 16 + ], 17 + build: { 18 + target: "esnext", 19 + rollupOptions: { 20 + output: { 21 + entryFileNames: (chunkInfo) => { 22 + if ("facadeModuleId" in chunkInfo && chunkInfo.facadeModuleId) { 23 + return getUniqueChunkName(chunkInfo.facadeModuleId); 24 + } 25 + return "assets/[name].hash-[hash].js"; 26 + }, 27 + chunkFileNames: (chunkInfo) => { 28 + if ("facadeModuleId" in chunkInfo && chunkInfo.facadeModuleId) { 29 + return getUniqueChunkName(chunkInfo.facadeModuleId); 30 + } 31 + return "assets/[name].[hash].js"; 32 + }, 33 + assetFileNames: "assets/[name].[hash].[ext]", 34 + manualChunks: { 35 + viem: ["viem"], 36 + react: ["react"], 37 + dom: ["react-dom"], 38 + wagmi: ["wagmi"], 39 + virtual: ["react-virtuoso"], 40 + indexer: ["@hey/indexer"], 41 + connectkit: ["connectkit"], 42 + livepeer: ["@livepeer/react"] 43 + } 44 + } 45 + } 46 + }, 47 + resolve: { 48 + alias: { 49 + "@": path.resolve(__dirname, "./src") 50 + } 51 + } 52 + });
+1 -1
packages/data/constants.ts
··· 2 2 import getEnvConfig from "./utils/getEnvConfig"; 3 3 4 4 // Environments 5 - export const IS_PRODUCTION = process.env.NEXT_PUBLIC_IS_PRODUCTION === "true"; 5 + export const IS_PRODUCTION = process.env.VITE_IS_PRODUCTION === "true"; 6 6 7 7 // Lens and Hey Env Config 8 8 export const LENS_NETWORK = process.env.NEXT_PUBLIC_LENS_NETWORK || "mainnet";
+992 -127
pnpm-lock.yaml
··· 16 16 version: 9.1.7 17 17 pierre: 18 18 specifier: ^2.1.14 19 - version: 2.1.14(@types/node@22.13.13)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) 19 + version: 2.1.14(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10) 20 20 21 21 apps/api: 22 22 dependencies: ··· 92 92 version: 6.5.0(typescript@5.8.2) 93 93 ts-node: 94 94 specifier: ^10.9.2 95 - version: 10.9.2(@types/node@22.13.13)(typescript@5.8.2) 95 + version: 10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2) 96 96 typescript: 97 97 specifier: ^5.7.3 98 98 version: 5.8.2 ··· 172 172 '@livepeer/react': 173 173 specifier: ^4.3.0 174 174 version: 4.3.0(@types/react-dom@19.0.4(@types/react@19.0.12))(@types/react@19.0.12)(immer@10.1.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 175 - '@next/bundle-analyzer': 176 - specifier: ^15.2.4 177 - version: 15.2.4(bufferutil@4.0.9)(utf-8-validate@5.0.10) 178 175 '@radix-ui/react-hover-card': 179 176 specifier: ^1.1.6 180 177 version: 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.12))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ··· 214 211 esbuild: 215 212 specifier: ^0.25.1 216 213 version: 0.25.1 217 - next: 218 - specifier: ^15.2.4 219 - version: 15.2.4(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 220 214 next-themes: 221 215 specifier: ^0.4.6 222 216 version: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ··· 253 247 react-markdown: 254 248 specifier: ^10.1.0 255 249 version: 10.1.0(@types/react@19.0.12)(react@19.0.0) 250 + react-router: 251 + specifier: ^7.4.0 252 + version: 7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 253 + react-scan: 254 + specifier: ^0.3.3 255 + version: 0.3.3(@types/react@19.0.12)(next@15.2.4(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react-router@7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(rollup@4.37.0) 256 256 react-tracked: 257 257 specifier: ^2.0.1 258 258 version: 2.0.1(react@19.0.0)(scheduler@0.25.0) ··· 295 295 viem: 296 296 specifier: ^2.23.15 297 297 version: 2.23.15(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) 298 + vite: 299 + specifier: ^6.2.3 300 + version: 6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0) 298 301 wagmi: 299 302 specifier: ^2.14.15 300 303 version: 2.14.15(@tanstack/query-core@5.69.0)(@tanstack/react-query@5.69.0(react@19.0.0))(@types/react@19.0.12)(bufferutil@4.0.9)(immer@10.1.1)(react@19.0.0)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.23.15(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2) ··· 313 316 version: link:../../packages/types 314 317 '@tailwindcss/aspect-ratio': 315 318 specifier: ^0.4.2 316 - version: 0.4.2(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2))) 319 + version: 0.4.2(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2))) 317 320 '@tailwindcss/forms': 318 321 specifier: ^0.5.10 319 - version: 0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2))) 322 + version: 0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2))) 320 323 '@types/node': 321 324 specifier: ^22.13.13 322 325 version: 22.13.13 ··· 326 329 '@types/react-dom': 327 330 specifier: ^19.0.4 328 331 version: 19.0.4(@types/react@19.0.12) 332 + '@vitejs/plugin-react': 333 + specifier: ^4.3.4 334 + version: 4.3.4(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)) 329 335 autoprefixer: 330 336 specifier: ^10.4.21 331 337 version: 10.4.21(postcss@8.5.3) ··· 334 340 version: 8.5.3 335 341 tailwindcss: 336 342 specifier: 3.4.17 337 - version: 3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)) 343 + version: 3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)) 338 344 typescript: 339 345 specifier: ^5.7.3 340 346 version: 5.8.2 347 + vite-plugin-environment: 348 + specifier: ^1.1.3 349 + version: 1.1.3(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)) 341 350 342 351 packages/config: {} 343 352 ··· 940 949 peerDependencies: 941 950 '@babel/core': ^7.0.0-0 942 951 952 + '@babel/plugin-transform-react-jsx-self@7.25.9': 953 + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} 954 + engines: {node: '>=6.9.0'} 955 + peerDependencies: 956 + '@babel/core': ^7.0.0-0 957 + 958 + '@babel/plugin-transform-react-jsx-source@7.25.9': 959 + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} 960 + engines: {node: '>=6.9.0'} 961 + peerDependencies: 962 + '@babel/core': ^7.0.0-0 963 + 943 964 '@babel/plugin-transform-react-jsx@7.25.9': 944 965 resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} 945 966 engines: {node: '>=6.9.0'} ··· 1033 1054 cpu: [x64] 1034 1055 os: [win32] 1035 1056 1057 + '@clack/core@0.3.5': 1058 + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} 1059 + 1060 + '@clack/prompts@0.8.2': 1061 + resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} 1062 + 1036 1063 '@coinbase/wallet-sdk@3.9.3': 1037 1064 resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} 1038 1065 ··· 1050 1077 '@dabh/diagnostics@2.0.3': 1051 1078 resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} 1052 1079 1053 - '@discoveryjs/json-ext@0.5.7': 1054 - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} 1055 - engines: {node: '>=10.0.0'} 1056 - 1057 1080 '@ecies/ciphers@0.2.3': 1058 1081 resolution: {integrity: sha512-tapn6XhOueMwht3E2UzY0ZZjYokdaw9XtL9kEyjhQ/Fb9vL9xTFbOaI+fV0AWvTpYu4BNloC6getKW6NtSg4mA==} 1059 1082 engines: {bun: '>=1', deno: '>=2', node: '>=16'} ··· 1093 1116 resolution: {integrity: sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==} 1094 1117 engines: {node: '>=18.0.0'} 1095 1118 1119 + '@esbuild/aix-ppc64@0.24.2': 1120 + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 1121 + engines: {node: '>=18'} 1122 + cpu: [ppc64] 1123 + os: [aix] 1124 + 1096 1125 '@esbuild/aix-ppc64@0.25.1': 1097 1126 resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 1098 1127 engines: {node: '>=18'} 1099 1128 cpu: [ppc64] 1100 1129 os: [aix] 1101 1130 1131 + '@esbuild/android-arm64@0.24.2': 1132 + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 1133 + engines: {node: '>=18'} 1134 + cpu: [arm64] 1135 + os: [android] 1136 + 1102 1137 '@esbuild/android-arm64@0.25.1': 1103 1138 resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 1104 1139 engines: {node: '>=18'} 1105 1140 cpu: [arm64] 1106 1141 os: [android] 1107 1142 1143 + '@esbuild/android-arm@0.24.2': 1144 + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 1145 + engines: {node: '>=18'} 1146 + cpu: [arm] 1147 + os: [android] 1148 + 1108 1149 '@esbuild/android-arm@0.25.1': 1109 1150 resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 1110 1151 engines: {node: '>=18'} 1111 1152 cpu: [arm] 1112 1153 os: [android] 1113 1154 1155 + '@esbuild/android-x64@0.24.2': 1156 + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 1157 + engines: {node: '>=18'} 1158 + cpu: [x64] 1159 + os: [android] 1160 + 1114 1161 '@esbuild/android-x64@0.25.1': 1115 1162 resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 1116 1163 engines: {node: '>=18'} 1117 1164 cpu: [x64] 1118 1165 os: [android] 1119 1166 1167 + '@esbuild/darwin-arm64@0.24.2': 1168 + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 1169 + engines: {node: '>=18'} 1170 + cpu: [arm64] 1171 + os: [darwin] 1172 + 1120 1173 '@esbuild/darwin-arm64@0.25.1': 1121 1174 resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 1122 1175 engines: {node: '>=18'} 1123 1176 cpu: [arm64] 1124 1177 os: [darwin] 1125 1178 1179 + '@esbuild/darwin-x64@0.24.2': 1180 + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 1181 + engines: {node: '>=18'} 1182 + cpu: [x64] 1183 + os: [darwin] 1184 + 1126 1185 '@esbuild/darwin-x64@0.25.1': 1127 1186 resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 1128 1187 engines: {node: '>=18'} 1129 1188 cpu: [x64] 1130 1189 os: [darwin] 1131 1190 1191 + '@esbuild/freebsd-arm64@0.24.2': 1192 + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 1193 + engines: {node: '>=18'} 1194 + cpu: [arm64] 1195 + os: [freebsd] 1196 + 1132 1197 '@esbuild/freebsd-arm64@0.25.1': 1133 1198 resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 1134 1199 engines: {node: '>=18'} 1135 1200 cpu: [arm64] 1136 1201 os: [freebsd] 1137 1202 1203 + '@esbuild/freebsd-x64@0.24.2': 1204 + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 1205 + engines: {node: '>=18'} 1206 + cpu: [x64] 1207 + os: [freebsd] 1208 + 1138 1209 '@esbuild/freebsd-x64@0.25.1': 1139 1210 resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 1140 1211 engines: {node: '>=18'} 1141 1212 cpu: [x64] 1142 1213 os: [freebsd] 1143 1214 1215 + '@esbuild/linux-arm64@0.24.2': 1216 + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 1217 + engines: {node: '>=18'} 1218 + cpu: [arm64] 1219 + os: [linux] 1220 + 1144 1221 '@esbuild/linux-arm64@0.25.1': 1145 1222 resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 1146 1223 engines: {node: '>=18'} 1147 1224 cpu: [arm64] 1148 1225 os: [linux] 1149 1226 1227 + '@esbuild/linux-arm@0.24.2': 1228 + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 1229 + engines: {node: '>=18'} 1230 + cpu: [arm] 1231 + os: [linux] 1232 + 1150 1233 '@esbuild/linux-arm@0.25.1': 1151 1234 resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 1152 1235 engines: {node: '>=18'} 1153 1236 cpu: [arm] 1154 1237 os: [linux] 1155 1238 1239 + '@esbuild/linux-ia32@0.24.2': 1240 + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 1241 + engines: {node: '>=18'} 1242 + cpu: [ia32] 1243 + os: [linux] 1244 + 1156 1245 '@esbuild/linux-ia32@0.25.1': 1157 1246 resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 1158 1247 engines: {node: '>=18'} 1159 1248 cpu: [ia32] 1160 1249 os: [linux] 1161 1250 1251 + '@esbuild/linux-loong64@0.24.2': 1252 + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 1253 + engines: {node: '>=18'} 1254 + cpu: [loong64] 1255 + os: [linux] 1256 + 1162 1257 '@esbuild/linux-loong64@0.25.1': 1163 1258 resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 1164 1259 engines: {node: '>=18'} 1165 1260 cpu: [loong64] 1166 1261 os: [linux] 1167 1262 1263 + '@esbuild/linux-mips64el@0.24.2': 1264 + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 1265 + engines: {node: '>=18'} 1266 + cpu: [mips64el] 1267 + os: [linux] 1268 + 1168 1269 '@esbuild/linux-mips64el@0.25.1': 1169 1270 resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 1170 1271 engines: {node: '>=18'} 1171 1272 cpu: [mips64el] 1172 1273 os: [linux] 1173 1274 1275 + '@esbuild/linux-ppc64@0.24.2': 1276 + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 1277 + engines: {node: '>=18'} 1278 + cpu: [ppc64] 1279 + os: [linux] 1280 + 1174 1281 '@esbuild/linux-ppc64@0.25.1': 1175 1282 resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 1176 1283 engines: {node: '>=18'} 1177 1284 cpu: [ppc64] 1178 1285 os: [linux] 1179 1286 1287 + '@esbuild/linux-riscv64@0.24.2': 1288 + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 1289 + engines: {node: '>=18'} 1290 + cpu: [riscv64] 1291 + os: [linux] 1292 + 1180 1293 '@esbuild/linux-riscv64@0.25.1': 1181 1294 resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 1182 1295 engines: {node: '>=18'} 1183 1296 cpu: [riscv64] 1184 1297 os: [linux] 1185 1298 1299 + '@esbuild/linux-s390x@0.24.2': 1300 + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 1301 + engines: {node: '>=18'} 1302 + cpu: [s390x] 1303 + os: [linux] 1304 + 1186 1305 '@esbuild/linux-s390x@0.25.1': 1187 1306 resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 1188 1307 engines: {node: '>=18'} 1189 1308 cpu: [s390x] 1190 1309 os: [linux] 1191 1310 1311 + '@esbuild/linux-x64@0.24.2': 1312 + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 1313 + engines: {node: '>=18'} 1314 + cpu: [x64] 1315 + os: [linux] 1316 + 1192 1317 '@esbuild/linux-x64@0.25.1': 1193 1318 resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 1194 1319 engines: {node: '>=18'} 1195 1320 cpu: [x64] 1196 1321 os: [linux] 1197 1322 1323 + '@esbuild/netbsd-arm64@0.24.2': 1324 + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 1325 + engines: {node: '>=18'} 1326 + cpu: [arm64] 1327 + os: [netbsd] 1328 + 1198 1329 '@esbuild/netbsd-arm64@0.25.1': 1199 1330 resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 1200 1331 engines: {node: '>=18'} 1201 1332 cpu: [arm64] 1202 1333 os: [netbsd] 1203 1334 1335 + '@esbuild/netbsd-x64@0.24.2': 1336 + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 1337 + engines: {node: '>=18'} 1338 + cpu: [x64] 1339 + os: [netbsd] 1340 + 1204 1341 '@esbuild/netbsd-x64@0.25.1': 1205 1342 resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 1206 1343 engines: {node: '>=18'} 1207 1344 cpu: [x64] 1208 1345 os: [netbsd] 1209 1346 1347 + '@esbuild/openbsd-arm64@0.24.2': 1348 + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 1349 + engines: {node: '>=18'} 1350 + cpu: [arm64] 1351 + os: [openbsd] 1352 + 1210 1353 '@esbuild/openbsd-arm64@0.25.1': 1211 1354 resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 1212 1355 engines: {node: '>=18'} 1213 1356 cpu: [arm64] 1214 1357 os: [openbsd] 1215 1358 1359 + '@esbuild/openbsd-x64@0.24.2': 1360 + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 1361 + engines: {node: '>=18'} 1362 + cpu: [x64] 1363 + os: [openbsd] 1364 + 1216 1365 '@esbuild/openbsd-x64@0.25.1': 1217 1366 resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 1218 1367 engines: {node: '>=18'} 1219 1368 cpu: [x64] 1220 1369 os: [openbsd] 1221 1370 1371 + '@esbuild/sunos-x64@0.24.2': 1372 + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 1373 + engines: {node: '>=18'} 1374 + cpu: [x64] 1375 + os: [sunos] 1376 + 1222 1377 '@esbuild/sunos-x64@0.25.1': 1223 1378 resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 1224 1379 engines: {node: '>=18'} 1225 1380 cpu: [x64] 1226 1381 os: [sunos] 1227 1382 1383 + '@esbuild/win32-arm64@0.24.2': 1384 + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 1385 + engines: {node: '>=18'} 1386 + cpu: [arm64] 1387 + os: [win32] 1388 + 1228 1389 '@esbuild/win32-arm64@0.25.1': 1229 1390 resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 1230 1391 engines: {node: '>=18'} 1231 1392 cpu: [arm64] 1232 1393 os: [win32] 1233 1394 1395 + '@esbuild/win32-ia32@0.24.2': 1396 + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 1397 + engines: {node: '>=18'} 1398 + cpu: [ia32] 1399 + os: [win32] 1400 + 1234 1401 '@esbuild/win32-ia32@0.25.1': 1235 1402 resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 1236 1403 engines: {node: '>=18'} 1237 1404 cpu: [ia32] 1405 + os: [win32] 1406 + 1407 + '@esbuild/win32-x64@0.24.2': 1408 + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 1409 + engines: {node: '>=18'} 1410 + cpu: [x64] 1238 1411 os: [win32] 1239 1412 1240 1413 '@esbuild/win32-x64@0.25.1': ··· 1864 2037 resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} 1865 2038 deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion 1866 2039 1867 - '@next/bundle-analyzer@15.2.4': 1868 - resolution: {integrity: sha512-72OXS/+r3Q6PW9oCBlkxogsEJ9DIoD64dGe8OZc2nKcHu3HbKKaXoDkutC8u7cxmBFd+ERt3D0/MoP7eZkhhog==} 1869 - 1870 2040 '@next/env@15.2.4': 1871 2041 resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==} 1872 2042 ··· 2080 2250 resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} 2081 2251 deprecated: 'The package is now available as "qr": npm install qr' 2082 2252 2253 + '@pivanov/utils@0.0.2': 2254 + resolution: {integrity: sha512-q9CN0bFWxWgMY5hVVYyBgez1jGiLBa6I+LkG37ycylPhFvEGOOeaADGtUSu46CaZasPnlY8fCdVJZmrgKb1EPA==} 2255 + peerDependencies: 2256 + react: '>=18' 2257 + react-dom: '>=18' 2258 + 2083 2259 '@pkgjs/parseargs@0.11.0': 2084 2260 resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 2085 2261 engines: {node: '>=14'} 2086 - 2087 - '@polka/url@1.0.0-next.28': 2088 - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} 2089 2262 2090 2263 '@preact/signals-core@1.8.0': 2091 2264 resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} 2265 + 2266 + '@preact/signals@1.3.2': 2267 + resolution: {integrity: sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg==} 2268 + peerDependencies: 2269 + preact: 10.x 2092 2270 2093 2271 '@prisma/client@6.5.0': 2094 2272 resolution: {integrity: sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==} ··· 2620 2798 '@repeaterjs/repeater@3.0.6': 2621 2799 resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} 2622 2800 2801 + '@rollup/pluginutils@5.1.4': 2802 + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 2803 + engines: {node: '>=14.0.0'} 2804 + peerDependencies: 2805 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 2806 + peerDependenciesMeta: 2807 + rollup: 2808 + optional: true 2809 + 2810 + '@rollup/rollup-android-arm-eabi@4.37.0': 2811 + resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} 2812 + cpu: [arm] 2813 + os: [android] 2814 + 2815 + '@rollup/rollup-android-arm64@4.37.0': 2816 + resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} 2817 + cpu: [arm64] 2818 + os: [android] 2819 + 2820 + '@rollup/rollup-darwin-arm64@4.37.0': 2821 + resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} 2822 + cpu: [arm64] 2823 + os: [darwin] 2824 + 2825 + '@rollup/rollup-darwin-x64@4.37.0': 2826 + resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} 2827 + cpu: [x64] 2828 + os: [darwin] 2829 + 2830 + '@rollup/rollup-freebsd-arm64@4.37.0': 2831 + resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} 2832 + cpu: [arm64] 2833 + os: [freebsd] 2834 + 2835 + '@rollup/rollup-freebsd-x64@4.37.0': 2836 + resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} 2837 + cpu: [x64] 2838 + os: [freebsd] 2839 + 2840 + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 2841 + resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} 2842 + cpu: [arm] 2843 + os: [linux] 2844 + 2845 + '@rollup/rollup-linux-arm-musleabihf@4.37.0': 2846 + resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} 2847 + cpu: [arm] 2848 + os: [linux] 2849 + 2850 + '@rollup/rollup-linux-arm64-gnu@4.37.0': 2851 + resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} 2852 + cpu: [arm64] 2853 + os: [linux] 2854 + 2855 + '@rollup/rollup-linux-arm64-musl@4.37.0': 2856 + resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} 2857 + cpu: [arm64] 2858 + os: [linux] 2859 + 2860 + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 2861 + resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} 2862 + cpu: [loong64] 2863 + os: [linux] 2864 + 2865 + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 2866 + resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} 2867 + cpu: [ppc64] 2868 + os: [linux] 2869 + 2870 + '@rollup/rollup-linux-riscv64-gnu@4.37.0': 2871 + resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} 2872 + cpu: [riscv64] 2873 + os: [linux] 2874 + 2875 + '@rollup/rollup-linux-riscv64-musl@4.37.0': 2876 + resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} 2877 + cpu: [riscv64] 2878 + os: [linux] 2879 + 2880 + '@rollup/rollup-linux-s390x-gnu@4.37.0': 2881 + resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} 2882 + cpu: [s390x] 2883 + os: [linux] 2884 + 2885 + '@rollup/rollup-linux-x64-gnu@4.37.0': 2886 + resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} 2887 + cpu: [x64] 2888 + os: [linux] 2889 + 2890 + '@rollup/rollup-linux-x64-musl@4.37.0': 2891 + resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} 2892 + cpu: [x64] 2893 + os: [linux] 2894 + 2895 + '@rollup/rollup-win32-arm64-msvc@4.37.0': 2896 + resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} 2897 + cpu: [arm64] 2898 + os: [win32] 2899 + 2900 + '@rollup/rollup-win32-ia32-msvc@4.37.0': 2901 + resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} 2902 + cpu: [ia32] 2903 + os: [win32] 2904 + 2905 + '@rollup/rollup-win32-x64-msvc@4.37.0': 2906 + resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} 2907 + cpu: [x64] 2908 + os: [win32] 2909 + 2623 2910 '@safe-global/safe-apps-provider@0.18.5': 2624 2911 resolution: {integrity: sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g==} 2625 2912 ··· 2909 3196 '@supabase/supabase-js@2.49.3': 2910 3197 resolution: {integrity: sha512-42imTuAm9VEQGlXT0O6zrSwNnsIblU1eieqrAWj8HSmFaYkxepk/IuUVw1M5hKelk0ZYlqDKNwRErI1rF1EL4w==} 2911 3198 3199 + '@swc/core-darwin-arm64@1.11.13': 3200 + resolution: {integrity: sha512-loSERhLaQ9XDS+5Kdx8cLe2tM1G0HLit8MfehipAcsdctpo79zrRlkW34elOf3tQoVPKUItV0b/rTuhjj8NtHg==} 3201 + engines: {node: '>=10'} 3202 + cpu: [arm64] 3203 + os: [darwin] 3204 + 3205 + '@swc/core-darwin-x64@1.11.13': 3206 + resolution: {integrity: sha512-uSA4UwgsDCIysUPfPS8OrQTH2h9spO7IYFd+1NB6dJlVGUuR6jLKuMBOP1IeLeax4cGHayvkcwSJ3OvxHwgcZQ==} 3207 + engines: {node: '>=10'} 3208 + cpu: [x64] 3209 + os: [darwin] 3210 + 3211 + '@swc/core-linux-arm-gnueabihf@1.11.13': 3212 + resolution: {integrity: sha512-boVtyJzS8g30iQfe8Q46W5QE/cmhKRln/7NMz/5sBP/am2Lce9NL0d05NnFwEWJp1e2AMGHFOdRr3Xg1cDiPKw==} 3213 + engines: {node: '>=10'} 3214 + cpu: [arm] 3215 + os: [linux] 3216 + 3217 + '@swc/core-linux-arm64-gnu@1.11.13': 3218 + resolution: {integrity: sha512-+IK0jZ84zHUaKtwpV+T+wT0qIUBnK9v2xXD03vARubKF+eUqCsIvcVHXmLpFuap62dClMrhCiwW10X3RbXNlHw==} 3219 + engines: {node: '>=10'} 3220 + cpu: [arm64] 3221 + os: [linux] 3222 + 3223 + '@swc/core-linux-arm64-musl@1.11.13': 3224 + resolution: {integrity: sha512-+ukuB8RHD5BHPCUjQwuLP98z+VRfu+NkKQVBcLJGgp0/+w7y0IkaxLY/aKmrAS5ofCNEGqKL+AOVyRpX1aw+XA==} 3225 + engines: {node: '>=10'} 3226 + cpu: [arm64] 3227 + os: [linux] 3228 + 3229 + '@swc/core-linux-x64-gnu@1.11.13': 3230 + resolution: {integrity: sha512-q9H3WI3U3dfJ34tdv60zc8oTuWvSd5fOxytyAO9Pc5M82Hic3jjWaf2xBekUg07ubnMZpyfnv+MlD+EbUI3Llw==} 3231 + engines: {node: '>=10'} 3232 + cpu: [x64] 3233 + os: [linux] 3234 + 3235 + '@swc/core-linux-x64-musl@1.11.13': 3236 + resolution: {integrity: sha512-9aaZnnq2pLdTbAzTSzy/q8dr7Woy3aYIcQISmw1+Q2/xHJg5y80ZzbWSWKYca/hKonDMjIbGR6dp299I5J0aeA==} 3237 + engines: {node: '>=10'} 3238 + cpu: [x64] 3239 + os: [linux] 3240 + 3241 + '@swc/core-win32-arm64-msvc@1.11.13': 3242 + resolution: {integrity: sha512-n3QZmDewkHANcoHvtwvA6yJbmS4XJf0MBMmwLZoKDZ2dOnC9D/jHiXw7JOohEuzYcpLoL5tgbqmjxa3XNo9Oow==} 3243 + engines: {node: '>=10'} 3244 + cpu: [arm64] 3245 + os: [win32] 3246 + 3247 + '@swc/core-win32-ia32-msvc@1.11.13': 3248 + resolution: {integrity: sha512-wM+Nt4lc6YSJFthCx3W2dz0EwFNf++j0/2TQ0Js9QLJuIxUQAgukhNDVCDdq8TNcT0zuA399ALYbvj5lfIqG6g==} 3249 + engines: {node: '>=10'} 3250 + cpu: [ia32] 3251 + os: [win32] 3252 + 3253 + '@swc/core-win32-x64-msvc@1.11.13': 3254 + resolution: {integrity: sha512-+X5/uW3s1L5gK7wAo0E27YaAoidJDo51dnfKSfU7gF3mlEUuWH8H1bAy5OTt2mU4eXtfsdUMEVXSwhDlLtQkuA==} 3255 + engines: {node: '>=10'} 3256 + cpu: [x64] 3257 + os: [win32] 3258 + 3259 + '@swc/core@1.11.13': 3260 + resolution: {integrity: sha512-9BXdYz12Wl0zWmZ80PvtjBWeg2ncwJ9L5WJzjhN6yUTZWEV/AwAdVdJnIEp4pro3WyKmAaMxcVOSbhuuOZco5g==} 3261 + engines: {node: '>=10'} 3262 + peerDependencies: 3263 + '@swc/helpers': '*' 3264 + peerDependenciesMeta: 3265 + '@swc/helpers': 3266 + optional: true 3267 + 2912 3268 '@swc/counter@0.1.3': 2913 3269 resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 2914 3270 2915 3271 '@swc/helpers@0.5.15': 2916 3272 resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} 2917 3273 3274 + '@swc/types@0.1.20': 3275 + resolution: {integrity: sha512-/rlIpxwKrhz4BIplXf6nsEHtqlhzuNN34/k3kMAXH4/lvVoA3cdq+60aqVNnyvw2uITEaCi0WV3pxBe4dQqoXQ==} 3276 + 2918 3277 '@tailwindcss/aspect-ratio@0.4.2': 2919 3278 resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==} 2920 3279 peerDependencies: ··· 2992 3351 '@types/aws-lambda@8.10.148': 2993 3352 resolution: {integrity: sha512-JL+2cfkY9ODQeE06hOxSFNkafjNk4JRBgY837kpoq1GHDttq2U3BA9IzKOWxS4DLjKoymGB4i9uBrlCkjUl1yg==} 2994 3353 3354 + '@types/babel__core@7.20.5': 3355 + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 3356 + 3357 + '@types/babel__generator@7.6.8': 3358 + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 3359 + 3360 + '@types/babel__template@7.4.4': 3361 + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 3362 + 3363 + '@types/babel__traverse@7.20.7': 3364 + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 3365 + 2995 3366 '@types/body-parser@1.19.5': 2996 3367 resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} 2997 3368 ··· 3001 3372 '@types/connect@3.4.38': 3002 3373 resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 3003 3374 3375 + '@types/cookie@0.6.0': 3376 + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 3377 + 3004 3378 '@types/cors@2.8.17': 3005 3379 resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} 3006 3380 ··· 3009 3383 3010 3384 '@types/estree-jsx@1.0.5': 3011 3385 resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} 3386 + 3387 + '@types/estree@1.0.6': 3388 + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 3012 3389 3013 3390 '@types/estree@1.0.7': 3014 3391 resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} ··· 3040 3417 '@types/ms@2.1.0': 3041 3418 resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 3042 3419 3420 + '@types/node@20.17.28': 3421 + resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==} 3422 + 3043 3423 '@types/node@22.13.13': 3044 3424 resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} 3045 3425 ··· 3059 3439 resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} 3060 3440 peerDependencies: 3061 3441 '@types/react': ^19.0.0 3442 + 3443 + '@types/react-reconciler@0.28.9': 3444 + resolution: {integrity: sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==} 3445 + peerDependencies: 3446 + '@types/react': '*' 3062 3447 3063 3448 '@types/react@19.0.12': 3064 3449 resolution: {integrity: sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==} ··· 3093 3478 3094 3479 '@ungap/structured-clone@1.3.0': 3095 3480 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 3481 + 3482 + '@vitejs/plugin-react@4.3.4': 3483 + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} 3484 + engines: {node: ^14.18.0 || >=16.0.0} 3485 + peerDependencies: 3486 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 3096 3487 3097 3488 '@wagmi/connectors@5.7.11': 3098 3489 resolution: {integrity: sha512-vJWOXMeYWmczvlsEZHq52yOoC2qu5kU8Saj6Bo+BtyfYcX1tJODZTKed3TMIoKhUx0W3vna1UIwG7GskmxGKKA==} ··· 3400 3791 binary-extensions@2.3.0: 3401 3792 resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 3402 3793 engines: {node: '>=8'} 3794 + 3795 + bippy@0.3.8: 3796 + resolution: {integrity: sha512-0ou8fJWxUXK/+eRjUz5unbtX8Mrn0OYRs6QQwwUJtU6hsFDTSmSeI1fJC/2nrPA4G6GWcxwT+O6TbHyGhl4fEg==} 3797 + peerDependencies: 3798 + react: '>=17.0.1' 3403 3799 3404 3800 bl@4.1.0: 3405 3801 resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} ··· 3657 4053 resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 3658 4054 engines: {node: '>= 6'} 3659 4055 3660 - commander@7.2.0: 3661 - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 3662 - engines: {node: '>= 10'} 3663 - 3664 4056 common-tags@1.8.2: 3665 4057 resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} 3666 4058 engines: {node: '>=4.0.0'} ··· 3701 4093 cookie@0.7.1: 3702 4094 resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} 3703 4095 engines: {node: '>= 0.6'} 4096 + 4097 + cookie@1.0.2: 4098 + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} 4099 + engines: {node: '>=18'} 3704 4100 3705 4101 core-js@3.41.0: 3706 4102 resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} ··· 3942 4338 resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 3943 4339 engines: {node: '>= 0.4'} 3944 4340 3945 - duplexer@0.1.2: 3946 - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} 3947 - 3948 4341 duplexify@4.1.3: 3949 4342 resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} 3950 4343 ··· 4038 4431 peerDependencies: 4039 4432 esbuild: '>=0.12 <1' 4040 4433 4434 + esbuild@0.24.2: 4435 + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 4436 + engines: {node: '>=18'} 4437 + hasBin: true 4438 + 4041 4439 esbuild@0.25.1: 4042 4440 resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 4043 4441 engines: {node: '>=18'} ··· 4054 4452 resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 4055 4453 engines: {node: '>=0.8.0'} 4056 4454 4057 - escape-string-regexp@4.0.0: 4058 - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 4059 - engines: {node: '>=10'} 4060 - 4061 4455 escape-string-regexp@5.0.0: 4062 4456 resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 4063 4457 engines: {node: '>=12'} 4064 4458 4065 4459 estree-util-is-identifier-name@3.0.0: 4066 4460 resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} 4461 + 4462 + estree-walker@2.0.2: 4463 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 4464 + 4465 + estree-walker@3.0.3: 4466 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 4067 4467 4068 4468 etag@1.8.1: 4069 4469 resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} ··· 4231 4631 fs.realpath@1.0.0: 4232 4632 resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 4233 4633 4634 + fsevents@2.3.2: 4635 + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 4636 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 4637 + os: [darwin] 4638 + 4234 4639 fsevents@2.3.3: 4235 4640 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 4236 4641 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} ··· 4347 4752 graphql@16.10.0: 4348 4753 resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} 4349 4754 engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} 4350 - 4351 - gzip-size@6.0.0: 4352 - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} 4353 - engines: {node: '>=10'} 4354 4755 4355 4756 h3@1.15.1: 4356 4757 resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==} ··· 4452 4853 hoist-non-react-statics@3.3.2: 4453 4854 resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} 4454 4855 4455 - html-escaper@2.0.2: 4456 - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 4457 - 4458 4856 html-escaper@3.0.3: 4459 4857 resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} 4460 4858 ··· 4650 5048 4651 5049 is-plain-object@2.0.4: 4652 5050 resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 4653 - engines: {node: '>=0.10.0'} 4654 - 4655 - is-plain-object@5.0.0: 4656 - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} 4657 5051 engines: {node: '>=0.10.0'} 4658 5052 4659 5053 is-regex@1.2.1: ··· 5108 5502 motion@10.16.2: 5109 5503 resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} 5110 5504 5111 - mrmime@2.0.1: 5112 - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 5113 - engines: {node: '>=10'} 5505 + mri@1.2.0: 5506 + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 5507 + engines: {node: '>=4'} 5114 5508 5115 5509 ms@2.0.0: 5116 5510 resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ··· 5299 5693 open@9.1.0: 5300 5694 resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} 5301 5695 engines: {node: '>=14.16'} 5302 - 5303 - opener@1.5.2: 5304 - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} 5305 - hasBin: true 5306 5696 5307 5697 optimism@0.18.1: 5308 5698 resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} ··· 5437 5827 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 5438 5828 engines: {node: '>=8.6'} 5439 5829 5830 + picomatch@4.0.2: 5831 + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 5832 + engines: {node: '>=12'} 5833 + 5440 5834 pierre@2.1.14: 5441 5835 resolution: {integrity: sha512-d4JOTRyS4GymQUqxGmro3ge1K4ZE2IfYX8xm5sB9RDKdkOOGEqLu8pyfC6CQupfQUG4DO9GQgwF+LJNO34EBWg==} 5442 5836 hasBin: true ··· 5466 5860 pirates@4.0.6: 5467 5861 resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 5468 5862 engines: {node: '>= 6'} 5863 + 5864 + playwright-core@1.51.1: 5865 + resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} 5866 + engines: {node: '>=18'} 5867 + hasBin: true 5868 + 5869 + playwright@1.51.1: 5870 + resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} 5871 + engines: {node: '>=18'} 5872 + hasBin: true 5469 5873 5470 5874 plur@5.1.0: 5471 5875 resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} ··· 5812 6216 react-merge-refs@2.1.1: 5813 6217 resolution: {integrity: sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag==} 5814 6218 6219 + react-refresh@0.14.2: 6220 + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} 6221 + engines: {node: '>=0.10.0'} 6222 + 5815 6223 react-remove-scroll-bar@2.3.8: 5816 6224 resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} 5817 6225 engines: {node: '>=10'} ··· 5832 6240 '@types/react': 5833 6241 optional: true 5834 6242 6243 + react-router@7.4.0: 6244 + resolution: {integrity: sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==} 6245 + engines: {node: '>=20.0.0'} 6246 + peerDependencies: 6247 + react: '>=18' 6248 + react-dom: '>=18' 6249 + peerDependenciesMeta: 6250 + react-dom: 6251 + optional: true 6252 + 6253 + react-scan@0.3.3: 6254 + resolution: {integrity: sha512-ntYe380/WhKaSpHcu6tFmW0bH0epOGmNcX+bjodBGRXCkbi6o3pkJWNZHIAlo928r/YQ99icRhV5NA6XiqOWZg==} 6255 + hasBin: true 6256 + peerDependencies: 6257 + '@remix-run/react': '>=1.0.0' 6258 + next: '>=13.0.0' 6259 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 6260 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 6261 + react-router: ^5.0.0 || ^6.0.0 || ^7.0.0 6262 + react-router-dom: ^5.0.0 || ^6.0.0 || ^7.0.0 6263 + peerDependenciesMeta: 6264 + '@remix-run/react': 6265 + optional: true 6266 + next: 6267 + optional: true 6268 + react-router: 6269 + optional: true 6270 + react-router-dom: 6271 + optional: true 6272 + 5835 6273 react-style-singleton@2.2.3: 5836 6274 resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} 5837 6275 engines: {node: '>=10'} ··· 5997 6435 5998 6436 rfdc@1.4.1: 5999 6437 resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 6438 + 6439 + rollup@4.37.0: 6440 + resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} 6441 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 6442 + hasBin: true 6000 6443 6001 6444 rope-sequence@1.3.4: 6002 6445 resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} ··· 6064 6507 set-blocking@2.0.0: 6065 6508 resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 6066 6509 6510 + set-cookie-parser@2.7.1: 6511 + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} 6512 + 6067 6513 set-function-length@1.2.2: 6068 6514 resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 6069 6515 engines: {node: '>= 0.4'} ··· 6131 6577 6132 6578 simple-swizzle@0.2.2: 6133 6579 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 6134 - 6135 - sirv@2.0.4: 6136 - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} 6137 - engines: {node: '>= 10'} 6138 6580 6139 6581 sisteransi@1.0.5: 6140 6582 resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} ··· 6366 6808 resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 6367 6809 engines: {node: '>=0.6'} 6368 6810 6369 - totalist@3.0.1: 6370 - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 6371 - engines: {node: '>=6'} 6372 - 6373 6811 tr46@0.0.3: 6374 6812 resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 6375 6813 ··· 6427 6865 engines: {node: '>=18.0.0'} 6428 6866 hasBin: true 6429 6867 6868 + turbo-stream@2.4.0: 6869 + resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} 6870 + 6430 6871 type-fest@0.21.3: 6431 6872 resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 6432 6873 engines: {node: '>=10'} ··· 6463 6904 6464 6905 uncrypto@0.1.3: 6465 6906 resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 6907 + 6908 + undici-types@6.19.8: 6909 + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 6466 6910 6467 6911 undici-types@6.20.0: 6468 6912 resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} ··· 6515 6959 resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 6516 6960 engines: {node: '>= 0.8'} 6517 6961 6962 + unplugin@2.1.0: 6963 + resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==} 6964 + engines: {node: '>=18.12.0'} 6965 + 6518 6966 unset-value@0.1.2: 6519 6967 resolution: {integrity: sha512-yhv5I4TsldLdE3UcVQn0hD2T5sNCPv4+qm/CTUpRKIpwthYRIipsAPdsrNpOI79hPQa0rTTeW22Fq6JWRcTgNg==} 6520 6968 engines: {node: '>=0.10.0'} ··· 6705 7153 typescript: 6706 7154 optional: true 6707 7155 7156 + vite-plugin-environment@1.1.3: 7157 + resolution: {integrity: sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA==} 7158 + peerDependencies: 7159 + vite: '>= 2.7' 7160 + 7161 + vite@6.2.3: 7162 + resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} 7163 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 7164 + hasBin: true 7165 + peerDependencies: 7166 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 7167 + jiti: '>=1.21.0' 7168 + less: '*' 7169 + lightningcss: ^1.21.0 7170 + sass: '*' 7171 + sass-embedded: '*' 7172 + stylus: '*' 7173 + sugarss: '*' 7174 + terser: ^5.16.0 7175 + tsx: ^4.8.1 7176 + yaml: ^2.4.2 7177 + peerDependenciesMeta: 7178 + '@types/node': 7179 + optional: true 7180 + jiti: 7181 + optional: true 7182 + less: 7183 + optional: true 7184 + lightningcss: 7185 + optional: true 7186 + sass: 7187 + optional: true 7188 + sass-embedded: 7189 + optional: true 7190 + stylus: 7191 + optional: true 7192 + sugarss: 7193 + optional: true 7194 + terser: 7195 + optional: true 7196 + tsx: 7197 + optional: true 7198 + yaml: 7199 + optional: true 7200 + 6708 7201 w3c-keyname@2.2.8: 6709 7202 resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} 6710 7203 ··· 6735 7228 webidl-conversions@3.0.1: 6736 7229 resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 6737 7230 6738 - webpack-bundle-analyzer@4.10.1: 6739 - resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} 6740 - engines: {node: '>= 10.13.0'} 6741 - hasBin: true 7231 + webpack-virtual-modules@0.6.2: 7232 + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} 6742 7233 6743 7234 whatwg-mimetype@4.0.0: 6744 7235 resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} ··· 7927 8418 '@babel/core': 7.26.10 7928 8419 '@babel/helper-plugin-utils': 7.26.5 7929 8420 8421 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': 8422 + dependencies: 8423 + '@babel/core': 7.26.10 8424 + '@babel/helper-plugin-utils': 7.26.5 8425 + 8426 + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': 8427 + dependencies: 8428 + '@babel/core': 7.26.10 8429 + '@babel/helper-plugin-utils': 7.26.5 8430 + 7930 8431 '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': 7931 8432 dependencies: 7932 8433 '@babel/core': 7.26.10 ··· 8018 8519 '@biomejs/cli-win32-x64@1.9.4': 8019 8520 optional: true 8020 8521 8522 + '@clack/core@0.3.5': 8523 + dependencies: 8524 + picocolors: 1.1.1 8525 + sisteransi: 1.0.5 8526 + 8527 + '@clack/prompts@0.8.2': 8528 + dependencies: 8529 + '@clack/core': 0.3.5 8530 + picocolors: 1.1.1 8531 + sisteransi: 1.0.5 8532 + 8021 8533 '@coinbase/wallet-sdk@3.9.3': 8022 8534 dependencies: 8023 8535 bn.js: 5.2.1 ··· 8051 8563 enabled: 2.0.0 8052 8564 kuler: 2.0.0 8053 8565 8054 - '@discoveryjs/json-ext@0.5.7': {} 8055 - 8056 8566 '@ecies/ciphers@0.2.3(@noble/ciphers@1.2.1)': 8057 8567 dependencies: 8058 8568 '@noble/ciphers': 1.2.1 ··· 8097 8607 '@whatwg-node/promise-helpers': 1.3.0 8098 8608 tslib: 2.8.1 8099 8609 8610 + '@esbuild/aix-ppc64@0.24.2': 8611 + optional: true 8612 + 8100 8613 '@esbuild/aix-ppc64@0.25.1': 8101 8614 optional: true 8102 8615 8616 + '@esbuild/android-arm64@0.24.2': 8617 + optional: true 8618 + 8103 8619 '@esbuild/android-arm64@0.25.1': 8104 8620 optional: true 8105 8621 8622 + '@esbuild/android-arm@0.24.2': 8623 + optional: true 8624 + 8106 8625 '@esbuild/android-arm@0.25.1': 8107 8626 optional: true 8108 8627 8628 + '@esbuild/android-x64@0.24.2': 8629 + optional: true 8630 + 8109 8631 '@esbuild/android-x64@0.25.1': 8632 + optional: true 8633 + 8634 + '@esbuild/darwin-arm64@0.24.2': 8110 8635 optional: true 8111 8636 8112 8637 '@esbuild/darwin-arm64@0.25.1': 8113 8638 optional: true 8114 8639 8640 + '@esbuild/darwin-x64@0.24.2': 8641 + optional: true 8642 + 8115 8643 '@esbuild/darwin-x64@0.25.1': 8116 8644 optional: true 8117 8645 8646 + '@esbuild/freebsd-arm64@0.24.2': 8647 + optional: true 8648 + 8118 8649 '@esbuild/freebsd-arm64@0.25.1': 8119 8650 optional: true 8120 8651 8652 + '@esbuild/freebsd-x64@0.24.2': 8653 + optional: true 8654 + 8121 8655 '@esbuild/freebsd-x64@0.25.1': 8122 8656 optional: true 8123 8657 8658 + '@esbuild/linux-arm64@0.24.2': 8659 + optional: true 8660 + 8124 8661 '@esbuild/linux-arm64@0.25.1': 8125 8662 optional: true 8126 8663 8664 + '@esbuild/linux-arm@0.24.2': 8665 + optional: true 8666 + 8127 8667 '@esbuild/linux-arm@0.25.1': 8128 8668 optional: true 8129 8669 8670 + '@esbuild/linux-ia32@0.24.2': 8671 + optional: true 8672 + 8130 8673 '@esbuild/linux-ia32@0.25.1': 8674 + optional: true 8675 + 8676 + '@esbuild/linux-loong64@0.24.2': 8131 8677 optional: true 8132 8678 8133 8679 '@esbuild/linux-loong64@0.25.1': 8134 8680 optional: true 8135 8681 8682 + '@esbuild/linux-mips64el@0.24.2': 8683 + optional: true 8684 + 8136 8685 '@esbuild/linux-mips64el@0.25.1': 8137 8686 optional: true 8138 8687 8688 + '@esbuild/linux-ppc64@0.24.2': 8689 + optional: true 8690 + 8139 8691 '@esbuild/linux-ppc64@0.25.1': 8140 8692 optional: true 8141 8693 8694 + '@esbuild/linux-riscv64@0.24.2': 8695 + optional: true 8696 + 8142 8697 '@esbuild/linux-riscv64@0.25.1': 8143 8698 optional: true 8144 8699 8700 + '@esbuild/linux-s390x@0.24.2': 8701 + optional: true 8702 + 8145 8703 '@esbuild/linux-s390x@0.25.1': 8146 8704 optional: true 8147 8705 8706 + '@esbuild/linux-x64@0.24.2': 8707 + optional: true 8708 + 8148 8709 '@esbuild/linux-x64@0.25.1': 8149 8710 optional: true 8150 8711 8712 + '@esbuild/netbsd-arm64@0.24.2': 8713 + optional: true 8714 + 8151 8715 '@esbuild/netbsd-arm64@0.25.1': 8716 + optional: true 8717 + 8718 + '@esbuild/netbsd-x64@0.24.2': 8152 8719 optional: true 8153 8720 8154 8721 '@esbuild/netbsd-x64@0.25.1': 8155 8722 optional: true 8156 8723 8724 + '@esbuild/openbsd-arm64@0.24.2': 8725 + optional: true 8726 + 8157 8727 '@esbuild/openbsd-arm64@0.25.1': 8158 8728 optional: true 8159 8729 8730 + '@esbuild/openbsd-x64@0.24.2': 8731 + optional: true 8732 + 8160 8733 '@esbuild/openbsd-x64@0.25.1': 8734 + optional: true 8735 + 8736 + '@esbuild/sunos-x64@0.24.2': 8161 8737 optional: true 8162 8738 8163 8739 '@esbuild/sunos-x64@0.25.1': 8740 + optional: true 8741 + 8742 + '@esbuild/win32-arm64@0.24.2': 8164 8743 optional: true 8165 8744 8166 8745 '@esbuild/win32-arm64@0.25.1': 8167 8746 optional: true 8168 8747 8748 + '@esbuild/win32-ia32@0.24.2': 8749 + optional: true 8750 + 8169 8751 '@esbuild/win32-ia32@0.25.1': 8752 + optional: true 8753 + 8754 + '@esbuild/win32-x64@0.24.2': 8170 8755 optional: true 8171 8756 8172 8757 '@esbuild/win32-x64@0.25.1': ··· 9163 9748 '@motionone/dom': 10.18.0 9164 9749 tslib: 2.8.1 9165 9750 9166 - '@next/bundle-analyzer@15.2.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': 9167 - dependencies: 9168 - webpack-bundle-analyzer: 4.10.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) 9169 - transitivePeerDependencies: 9170 - - bufferutil 9171 - - utf-8-validate 9172 - 9173 9751 '@next/env@15.2.4': {} 9174 9752 9175 9753 '@next/swc-darwin-arm64@15.2.4': ··· 9395 9973 9396 9974 '@paulmillr/qr@0.2.1': {} 9397 9975 9976 + '@pivanov/utils@0.0.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': 9977 + dependencies: 9978 + react: 19.0.0 9979 + react-dom: 19.0.0(react@19.0.0) 9980 + 9398 9981 '@pkgjs/parseargs@0.11.0': 9399 9982 optional: true 9400 9983 9401 - '@polka/url@1.0.0-next.28': {} 9984 + '@preact/signals-core@1.8.0': {} 9402 9985 9403 - '@preact/signals-core@1.8.0': {} 9986 + '@preact/signals@1.3.2(preact@10.26.4)': 9987 + dependencies: 9988 + '@preact/signals-core': 1.8.0 9989 + preact: 10.26.4 9404 9990 9405 9991 '@prisma/client@6.5.0(prisma@6.5.0(typescript@5.8.2))(typescript@5.8.2)': 9406 9992 optionalDependencies: ··· 10105 10691 10106 10692 '@repeaterjs/repeater@3.0.6': {} 10107 10693 10694 + '@rollup/pluginutils@5.1.4(rollup@4.37.0)': 10695 + dependencies: 10696 + '@types/estree': 1.0.7 10697 + estree-walker: 2.0.2 10698 + picomatch: 4.0.2 10699 + optionalDependencies: 10700 + rollup: 4.37.0 10701 + 10702 + '@rollup/rollup-android-arm-eabi@4.37.0': 10703 + optional: true 10704 + 10705 + '@rollup/rollup-android-arm64@4.37.0': 10706 + optional: true 10707 + 10708 + '@rollup/rollup-darwin-arm64@4.37.0': 10709 + optional: true 10710 + 10711 + '@rollup/rollup-darwin-x64@4.37.0': 10712 + optional: true 10713 + 10714 + '@rollup/rollup-freebsd-arm64@4.37.0': 10715 + optional: true 10716 + 10717 + '@rollup/rollup-freebsd-x64@4.37.0': 10718 + optional: true 10719 + 10720 + '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 10721 + optional: true 10722 + 10723 + '@rollup/rollup-linux-arm-musleabihf@4.37.0': 10724 + optional: true 10725 + 10726 + '@rollup/rollup-linux-arm64-gnu@4.37.0': 10727 + optional: true 10728 + 10729 + '@rollup/rollup-linux-arm64-musl@4.37.0': 10730 + optional: true 10731 + 10732 + '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 10733 + optional: true 10734 + 10735 + '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 10736 + optional: true 10737 + 10738 + '@rollup/rollup-linux-riscv64-gnu@4.37.0': 10739 + optional: true 10740 + 10741 + '@rollup/rollup-linux-riscv64-musl@4.37.0': 10742 + optional: true 10743 + 10744 + '@rollup/rollup-linux-s390x-gnu@4.37.0': 10745 + optional: true 10746 + 10747 + '@rollup/rollup-linux-x64-gnu@4.37.0': 10748 + optional: true 10749 + 10750 + '@rollup/rollup-linux-x64-musl@4.37.0': 10751 + optional: true 10752 + 10753 + '@rollup/rollup-win32-arm64-msvc@4.37.0': 10754 + optional: true 10755 + 10756 + '@rollup/rollup-win32-ia32-msvc@4.37.0': 10757 + optional: true 10758 + 10759 + '@rollup/rollup-win32-x64-msvc@4.37.0': 10760 + optional: true 10761 + 10108 10762 '@safe-global/safe-apps-provider@0.18.5(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2)': 10109 10763 dependencies: 10110 10764 '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) ··· 10563 11217 - bufferutil 10564 11218 - utf-8-validate 10565 11219 11220 + '@swc/core-darwin-arm64@1.11.13': 11221 + optional: true 11222 + 11223 + '@swc/core-darwin-x64@1.11.13': 11224 + optional: true 11225 + 11226 + '@swc/core-linux-arm-gnueabihf@1.11.13': 11227 + optional: true 11228 + 11229 + '@swc/core-linux-arm64-gnu@1.11.13': 11230 + optional: true 11231 + 11232 + '@swc/core-linux-arm64-musl@1.11.13': 11233 + optional: true 11234 + 11235 + '@swc/core-linux-x64-gnu@1.11.13': 11236 + optional: true 11237 + 11238 + '@swc/core-linux-x64-musl@1.11.13': 11239 + optional: true 11240 + 11241 + '@swc/core-win32-arm64-msvc@1.11.13': 11242 + optional: true 11243 + 11244 + '@swc/core-win32-ia32-msvc@1.11.13': 11245 + optional: true 11246 + 11247 + '@swc/core-win32-x64-msvc@1.11.13': 11248 + optional: true 11249 + 11250 + '@swc/core@1.11.13(@swc/helpers@0.5.15)': 11251 + dependencies: 11252 + '@swc/counter': 0.1.3 11253 + '@swc/types': 0.1.20 11254 + optionalDependencies: 11255 + '@swc/core-darwin-arm64': 1.11.13 11256 + '@swc/core-darwin-x64': 1.11.13 11257 + '@swc/core-linux-arm-gnueabihf': 1.11.13 11258 + '@swc/core-linux-arm64-gnu': 1.11.13 11259 + '@swc/core-linux-arm64-musl': 1.11.13 11260 + '@swc/core-linux-x64-gnu': 1.11.13 11261 + '@swc/core-linux-x64-musl': 1.11.13 11262 + '@swc/core-win32-arm64-msvc': 1.11.13 11263 + '@swc/core-win32-ia32-msvc': 1.11.13 11264 + '@swc/core-win32-x64-msvc': 1.11.13 11265 + '@swc/helpers': 0.5.15 11266 + optional: true 11267 + 10566 11268 '@swc/counter@0.1.3': {} 10567 11269 10568 11270 '@swc/helpers@0.5.15': 10569 11271 dependencies: 10570 11272 tslib: 2.8.1 10571 11273 10572 - '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)))': 11274 + '@swc/types@0.1.20': 11275 + dependencies: 11276 + '@swc/counter': 0.1.3 11277 + optional: true 11278 + 11279 + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)))': 10573 11280 dependencies: 10574 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)) 11281 + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)) 10575 11282 10576 - '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)))': 11283 + '@tailwindcss/forms@0.5.10(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)))': 10577 11284 dependencies: 10578 11285 mini-svg-data-uri: 1.4.4 10579 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)) 11286 + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)) 10580 11287 10581 11288 '@tanstack/query-core@5.69.0': {} 10582 11289 ··· 10630 11337 10631 11338 '@types/aws-lambda@8.10.148': {} 10632 11339 11340 + '@types/babel__core@7.20.5': 11341 + dependencies: 11342 + '@babel/parser': 7.27.0 11343 + '@babel/types': 7.27.0 11344 + '@types/babel__generator': 7.6.8 11345 + '@types/babel__template': 7.4.4 11346 + '@types/babel__traverse': 7.20.7 11347 + 11348 + '@types/babel__generator@7.6.8': 11349 + dependencies: 11350 + '@babel/types': 7.27.0 11351 + 11352 + '@types/babel__template@7.4.4': 11353 + dependencies: 11354 + '@babel/parser': 7.27.0 11355 + '@babel/types': 7.27.0 11356 + 11357 + '@types/babel__traverse@7.20.7': 11358 + dependencies: 11359 + '@babel/types': 7.27.0 11360 + 10633 11361 '@types/body-parser@1.19.5': 10634 11362 dependencies: 10635 11363 '@types/connect': 3.4.38 ··· 10640 11368 '@types/connect@3.4.38': 10641 11369 dependencies: 10642 11370 '@types/node': 22.13.13 11371 + 11372 + '@types/cookie@0.6.0': {} 10643 11373 10644 11374 '@types/cors@2.8.17': 10645 11375 dependencies: ··· 10652 11382 '@types/estree-jsx@1.0.5': 10653 11383 dependencies: 10654 11384 '@types/estree': 1.0.7 11385 + 11386 + '@types/estree@1.0.6': {} 10655 11387 10656 11388 '@types/estree@1.0.7': {} 10657 11389 ··· 10689 11421 10690 11422 '@types/ms@2.1.0': {} 10691 11423 11424 + '@types/node@20.17.28': 11425 + dependencies: 11426 + undici-types: 6.19.8 11427 + 10692 11428 '@types/node@22.13.13': 10693 11429 dependencies: 10694 11430 undici-types: 6.20.0 ··· 10702 11438 '@types/range-parser@1.2.7': {} 10703 11439 10704 11440 '@types/react-dom@19.0.4(@types/react@19.0.12)': 11441 + dependencies: 11442 + '@types/react': 19.0.12 11443 + 11444 + '@types/react-reconciler@0.28.9(@types/react@19.0.12)': 10705 11445 dependencies: 10706 11446 '@types/react': 19.0.12 10707 11447 ··· 10738 11478 react-dom: 19.0.0(react@19.0.0) 10739 11479 10740 11480 '@ungap/structured-clone@1.3.0': {} 11481 + 11482 + '@vitejs/plugin-react@4.3.4(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0))': 11483 + dependencies: 11484 + '@babel/core': 7.26.10 11485 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) 11486 + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) 11487 + '@types/babel__core': 7.20.5 11488 + react-refresh: 0.14.2 11489 + vite: 6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0) 11490 + transitivePeerDependencies: 11491 + - supports-color 10741 11492 10742 11493 '@wagmi/connectors@5.7.11(@types/react@19.0.12)(@wagmi/core@2.16.7(@tanstack/query-core@5.69.0)(@types/react@19.0.12)(immer@10.1.1)(react@19.0.0)(typescript@5.8.2)(use-sync-external-store@1.4.0(react@19.0.0))(viem@2.23.15(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2)))(bufferutil@4.0.9)(react@19.0.0)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.23.15(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2)': 10743 11494 dependencies: ··· 11373 12124 11374 12125 binary-extensions@2.3.0: {} 11375 12126 12127 + bippy@0.3.8(@types/react@19.0.12)(react@19.0.0): 12128 + dependencies: 12129 + '@types/react-reconciler': 0.28.9(@types/react@19.0.12) 12130 + react: 19.0.0 12131 + transitivePeerDependencies: 12132 + - '@types/react' 12133 + 11376 12134 bl@4.1.0: 11377 12135 dependencies: 11378 12136 buffer: 5.7.1 ··· 11683 12441 11684 12442 commander@4.1.1: {} 11685 12443 11686 - commander@7.2.0: {} 11687 - 11688 12444 common-tags@1.8.2: {} 11689 12445 11690 12446 concat-map@0.0.1: {} ··· 11728 12484 11729 12485 cookie@0.7.1: {} 11730 12486 12487 + cookie@1.0.2: {} 12488 + 11731 12489 core-js@3.41.0: {} 11732 12490 11733 12491 core-util-is@1.0.3: {} ··· 11936 12694 es-errors: 1.3.0 11937 12695 gopd: 1.2.0 11938 12696 11939 - duplexer@0.1.2: {} 11940 - 11941 12697 duplexify@4.1.3: 11942 12698 dependencies: 11943 12699 end-of-stream: 1.4.4 ··· 12038 12794 transitivePeerDependencies: 12039 12795 - supports-color 12040 12796 12797 + esbuild@0.24.2: 12798 + optionalDependencies: 12799 + '@esbuild/aix-ppc64': 0.24.2 12800 + '@esbuild/android-arm': 0.24.2 12801 + '@esbuild/android-arm64': 0.24.2 12802 + '@esbuild/android-x64': 0.24.2 12803 + '@esbuild/darwin-arm64': 0.24.2 12804 + '@esbuild/darwin-x64': 0.24.2 12805 + '@esbuild/freebsd-arm64': 0.24.2 12806 + '@esbuild/freebsd-x64': 0.24.2 12807 + '@esbuild/linux-arm': 0.24.2 12808 + '@esbuild/linux-arm64': 0.24.2 12809 + '@esbuild/linux-ia32': 0.24.2 12810 + '@esbuild/linux-loong64': 0.24.2 12811 + '@esbuild/linux-mips64el': 0.24.2 12812 + '@esbuild/linux-ppc64': 0.24.2 12813 + '@esbuild/linux-riscv64': 0.24.2 12814 + '@esbuild/linux-s390x': 0.24.2 12815 + '@esbuild/linux-x64': 0.24.2 12816 + '@esbuild/netbsd-arm64': 0.24.2 12817 + '@esbuild/netbsd-x64': 0.24.2 12818 + '@esbuild/openbsd-arm64': 0.24.2 12819 + '@esbuild/openbsd-x64': 0.24.2 12820 + '@esbuild/sunos-x64': 0.24.2 12821 + '@esbuild/win32-arm64': 0.24.2 12822 + '@esbuild/win32-ia32': 0.24.2 12823 + '@esbuild/win32-x64': 0.24.2 12824 + 12041 12825 esbuild@0.25.1: 12042 12826 optionalDependencies: 12043 12827 '@esbuild/aix-ppc64': 0.25.1 ··· 12072 12856 12073 12857 escape-string-regexp@1.0.5: {} 12074 12858 12075 - escape-string-regexp@4.0.0: {} 12076 - 12077 12859 escape-string-regexp@5.0.0: {} 12078 12860 12079 12861 estree-util-is-identifier-name@3.0.0: {} 12862 + 12863 + estree-walker@2.0.2: {} 12864 + 12865 + estree-walker@3.0.3: 12866 + dependencies: 12867 + '@types/estree': 1.0.7 12080 12868 12081 12869 etag@1.8.1: {} 12082 12870 ··· 12328 13116 12329 13117 fs.realpath@1.0.0: {} 12330 13118 13119 + fsevents@2.3.2: 13120 + optional: true 13121 + 12331 13122 fsevents@2.3.3: 12332 13123 optional: true 12333 13124 ··· 12461 13252 ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) 12462 13253 12463 13254 graphql@16.10.0: {} 12464 - 12465 - gzip-size@6.0.0: 12466 - dependencies: 12467 - duplexer: 0.1.2 12468 13255 12469 13256 h3@1.15.1: 12470 13257 dependencies: ··· 12660 13447 hoist-non-react-statics@3.3.2: 12661 13448 dependencies: 12662 13449 react-is: 16.13.1 12663 - 12664 - html-escaper@2.0.2: {} 12665 13450 12666 13451 html-escaper@3.0.3: {} 12667 13452 ··· 12845 13630 dependencies: 12846 13631 isobject: 3.0.1 12847 13632 12848 - is-plain-object@5.0.0: {} 12849 - 12850 13633 is-regex@1.2.1: 12851 13634 dependencies: 12852 13635 call-bound: 1.0.4 ··· 13413 14196 '@motionone/utils': 10.18.0 13414 14197 '@motionone/vue': 10.16.4 13415 14198 13416 - mrmime@2.0.1: {} 14199 + mri@1.2.0: {} 13417 14200 13418 14201 ms@2.0.0: {} 13419 14202 ··· 13596 14379 is-inside-container: 1.0.0 13597 14380 is-wsl: 2.2.0 13598 14381 13599 - opener@1.5.2: {} 13600 - 13601 14382 optimism@0.18.1: 13602 14383 dependencies: 13603 14384 '@wry/caches': 1.0.1 ··· 13758 14539 13759 14540 picomatch@2.3.1: {} 13760 14541 13761 - pierre@2.1.14(@types/node@22.13.13)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10): 14542 + picomatch@4.0.2: {} 14543 + 14544 + pierre@2.1.14(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10): 13762 14545 dependencies: 13763 14546 '@fat/prompts': 0.0.3 13764 14547 '@supabase/supabase-js': 2.49.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) ··· 13771 14554 open: 9.1.0 13772 14555 ora: 7.0.1 13773 14556 simple-git: 3.27.0 13774 - ts-node: 10.9.2(@types/node@22.13.13)(typescript@5.8.2) 14557 + ts-node: 10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2) 13775 14558 transitivePeerDependencies: 13776 14559 - '@swc/core' 13777 14560 - '@swc/wasm' ··· 13810 14593 13811 14594 pirates@4.0.6: {} 13812 14595 14596 + playwright-core@1.51.1: {} 14597 + 14598 + playwright@1.51.1: 14599 + dependencies: 14600 + playwright-core: 1.51.1 14601 + optionalDependencies: 14602 + fsevents: 2.3.2 14603 + 13813 14604 plur@5.1.0: 13814 14605 dependencies: 13815 14606 irregular-plurals: 3.5.0 ··· 13854 14645 camelcase-css: 2.0.1 13855 14646 postcss: 8.5.3 13856 14647 13857 - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)): 14648 + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)): 13858 14649 dependencies: 13859 14650 lilconfig: 3.1.3 13860 14651 yaml: 2.7.0 13861 14652 optionalDependencies: 13862 14653 postcss: 8.5.3 13863 - ts-node: 10.9.2(@types/node@22.13.13)(typescript@5.8.2) 14654 + ts-node: 10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2) 13864 14655 13865 14656 postcss-nested@6.2.0(postcss@8.5.3): 13866 14657 dependencies: ··· 14164 14955 14165 14956 react-merge-refs@2.1.1: {} 14166 14957 14958 + react-refresh@0.14.2: {} 14959 + 14167 14960 react-remove-scroll-bar@2.3.8(@types/react@19.0.12)(react@19.0.0): 14168 14961 dependencies: 14169 14962 react: 19.0.0 ··· 14183 14976 optionalDependencies: 14184 14977 '@types/react': 19.0.12 14185 14978 14979 + react-router@7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): 14980 + dependencies: 14981 + '@types/cookie': 0.6.0 14982 + cookie: 1.0.2 14983 + react: 19.0.0 14984 + set-cookie-parser: 2.7.1 14985 + turbo-stream: 2.4.0 14986 + optionalDependencies: 14987 + react-dom: 19.0.0(react@19.0.0) 14988 + 14989 + react-scan@0.3.3(@types/react@19.0.12)(next@15.2.4(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react-router@7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(rollup@4.37.0): 14990 + dependencies: 14991 + '@babel/core': 7.26.10 14992 + '@babel/generator': 7.27.0 14993 + '@babel/types': 7.27.0 14994 + '@clack/core': 0.3.5 14995 + '@clack/prompts': 0.8.2 14996 + '@pivanov/utils': 0.0.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 14997 + '@preact/signals': 1.3.2(preact@10.26.4) 14998 + '@rollup/pluginutils': 5.1.4(rollup@4.37.0) 14999 + '@types/node': 20.17.28 15000 + bippy: 0.3.8(@types/react@19.0.12)(react@19.0.0) 15001 + esbuild: 0.24.2 15002 + estree-walker: 3.0.3 15003 + kleur: 4.1.5 15004 + mri: 1.2.0 15005 + playwright: 1.51.1 15006 + preact: 10.26.4 15007 + react: 19.0.0 15008 + react-dom: 19.0.0(react@19.0.0) 15009 + tsx: 4.19.3 15010 + optionalDependencies: 15011 + next: 15.2.4(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 15012 + react-router: 7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 15013 + unplugin: 2.1.0 15014 + transitivePeerDependencies: 15015 + - '@types/react' 15016 + - rollup 15017 + - supports-color 15018 + 14186 15019 react-style-singleton@2.2.3(@types/react@19.0.12)(react@19.0.0): 14187 15020 dependencies: 14188 15021 get-nonce: 1.0.1 ··· 14369 15202 14370 15203 rfdc@1.4.1: {} 14371 15204 15205 + rollup@4.37.0: 15206 + dependencies: 15207 + '@types/estree': 1.0.6 15208 + optionalDependencies: 15209 + '@rollup/rollup-android-arm-eabi': 4.37.0 15210 + '@rollup/rollup-android-arm64': 4.37.0 15211 + '@rollup/rollup-darwin-arm64': 4.37.0 15212 + '@rollup/rollup-darwin-x64': 4.37.0 15213 + '@rollup/rollup-freebsd-arm64': 4.37.0 15214 + '@rollup/rollup-freebsd-x64': 4.37.0 15215 + '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 15216 + '@rollup/rollup-linux-arm-musleabihf': 4.37.0 15217 + '@rollup/rollup-linux-arm64-gnu': 4.37.0 15218 + '@rollup/rollup-linux-arm64-musl': 4.37.0 15219 + '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 15220 + '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 15221 + '@rollup/rollup-linux-riscv64-gnu': 4.37.0 15222 + '@rollup/rollup-linux-riscv64-musl': 4.37.0 15223 + '@rollup/rollup-linux-s390x-gnu': 4.37.0 15224 + '@rollup/rollup-linux-x64-gnu': 4.37.0 15225 + '@rollup/rollup-linux-x64-musl': 4.37.0 15226 + '@rollup/rollup-win32-arm64-msvc': 4.37.0 15227 + '@rollup/rollup-win32-ia32-msvc': 4.37.0 15228 + '@rollup/rollup-win32-x64-msvc': 4.37.0 15229 + fsevents: 2.3.3 15230 + 14372 15231 rope-sequence@1.3.4: {} 14373 15232 14374 15233 run-applescript@5.0.0: ··· 14445 15304 '@lit-labs/ssr-dom-shim': 1.3.0 14446 15305 14447 15306 set-blocking@2.0.0: {} 15307 + 15308 + set-cookie-parser@2.7.1: {} 14448 15309 14449 15310 set-function-length@1.2.2: 14450 15311 dependencies: ··· 14558 15419 dependencies: 14559 15420 is-arrayish: 0.3.2 14560 15421 14561 - sirv@2.0.4: 14562 - dependencies: 14563 - '@polka/url': 1.0.0-next.28 14564 - mrmime: 2.0.1 14565 - totalist: 3.0.1 14566 - 14567 15422 sisteransi@1.0.5: {} 14568 15423 14569 15424 slash@3.0.0: {} ··· 14765 15620 14766 15621 tailwind-merge@3.0.2: {} 14767 15622 14768 - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)): 15623 + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)): 14769 15624 dependencies: 14770 15625 '@alloc/quick-lru': 5.2.0 14771 15626 arg: 5.0.2 ··· 14784 15639 postcss: 8.5.3 14785 15640 postcss-import: 15.1.0(postcss@8.5.3) 14786 15641 postcss-js: 4.0.1(postcss@8.5.3) 14787 - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2)) 15642 + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2)) 14788 15643 postcss-nested: 6.2.0(postcss@8.5.3) 14789 15644 postcss-selector-parser: 6.1.2 14790 15645 resolve: 1.22.10 ··· 14826 15681 14827 15682 toidentifier@1.0.1: {} 14828 15683 14829 - totalist@3.0.1: {} 14830 - 14831 15684 tr46@0.0.3: {} 14832 15685 14833 15686 trim-lines@3.0.1: {} ··· 14846 15699 14847 15700 ts-log@2.2.7: {} 14848 15701 14849 - ts-node@10.9.2(@types/node@22.13.13)(typescript@5.8.2): 15702 + ts-node@10.9.2(@swc/core@1.11.13(@swc/helpers@0.5.15))(@types/node@22.13.13)(typescript@5.8.2): 14850 15703 dependencies: 14851 15704 '@cspotcode/source-map-support': 0.8.1 14852 15705 '@tsconfig/node10': 1.0.11 ··· 14863 15716 typescript: 5.8.2 14864 15717 v8-compile-cache-lib: 3.0.1 14865 15718 yn: 3.1.1 15719 + optionalDependencies: 15720 + '@swc/core': 1.11.13(@swc/helpers@0.5.15) 14866 15721 14867 15722 tslib@1.14.1: {} 14868 15723 ··· 14879 15734 optionalDependencies: 14880 15735 fsevents: 2.3.3 14881 15736 15737 + turbo-stream@2.4.0: {} 15738 + 14882 15739 type-fest@0.21.3: {} 14883 15740 14884 15741 type-fest@4.38.0: {} ··· 14903 15760 unc-path-regex@0.1.2: {} 14904 15761 14905 15762 uncrypto@0.1.3: {} 15763 + 15764 + undici-types@6.19.8: {} 14906 15765 14907 15766 undici-types@6.20.0: {} 14908 15767 ··· 14967 15826 14968 15827 unpipe@1.0.0: {} 14969 15828 15829 + unplugin@2.1.0: 15830 + dependencies: 15831 + acorn: 8.14.1 15832 + webpack-virtual-modules: 0.6.2 15833 + optional: true 15834 + 14970 15835 unset-value@0.1.2: 14971 15836 dependencies: 14972 15837 has-value: 0.3.1 ··· 15116 15981 - utf-8-validate 15117 15982 - zod 15118 15983 15984 + vite-plugin-environment@1.1.3(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)): 15985 + dependencies: 15986 + vite: 6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0) 15987 + 15988 + vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0): 15989 + dependencies: 15990 + esbuild: 0.25.1 15991 + postcss: 8.5.3 15992 + rollup: 4.37.0 15993 + optionalDependencies: 15994 + '@types/node': 22.13.13 15995 + fsevents: 2.3.3 15996 + jiti: 2.4.2 15997 + tsx: 4.19.3 15998 + yaml: 2.7.0 15999 + 15119 16000 w3c-keyname@2.2.8: {} 15120 16001 15121 16002 wagmi@2.14.15(@tanstack/query-core@5.69.0)(@tanstack/react-query@5.69.0(react@19.0.0))(@types/react@19.0.12)(bufferutil@4.0.9)(immer@10.1.1)(react@19.0.0)(typescript@5.8.2)(utf-8-validate@5.0.10)(viem@2.23.15(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2))(zod@3.24.2): ··· 15168 16049 15169 16050 webidl-conversions@3.0.1: {} 15170 16051 15171 - webpack-bundle-analyzer@4.10.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): 15172 - dependencies: 15173 - '@discoveryjs/json-ext': 0.5.7 15174 - acorn: 8.14.1 15175 - acorn-walk: 8.3.4 15176 - commander: 7.2.0 15177 - debounce: 1.2.1 15178 - escape-string-regexp: 4.0.0 15179 - gzip-size: 6.0.0 15180 - html-escaper: 2.0.2 15181 - is-plain-object: 5.0.0 15182 - opener: 1.5.2 15183 - picocolors: 1.1.1 15184 - sirv: 2.0.4 15185 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) 15186 - transitivePeerDependencies: 15187 - - bufferutil 15188 - - utf-8-validate 16052 + webpack-virtual-modules@0.6.2: 16053 + optional: true 15189 16054 15190 16055 whatwg-mimetype@4.0.0: {} 15191 16056