diff --git a/apps/web/app/(base-org)/(root)/page.tsx b/apps/web/app/(base-org)/(root)/page.tsx index eae30c1862..4f87551cd2 100644 --- a/apps/web/app/(base-org)/(root)/page.tsx +++ b/apps/web/app/(base-org)/(root)/page.tsx @@ -28,7 +28,7 @@ export default async function Home() { Base is for everyone.
- + diff --git a/apps/web/app/(base-org)/builders/page.tsx b/apps/web/app/(base-org)/builders/page.tsx new file mode 100644 index 0000000000..dcce2ac0d2 --- /dev/null +++ b/apps/web/app/(base-org)/builders/page.tsx @@ -0,0 +1,39 @@ +import type { Metadata } from 'next'; +import AnalyticsProvider from 'apps/web/contexts/Analytics'; +import Container from 'apps/web/src/components/base-org/Container'; +import { Hero } from 'apps/web/src/components/Builders/Landing/Hero'; +import { UseCases } from 'apps/web/src/components/Builders/Landing/UseCases'; +import { Customers } from 'apps/web/src/components/Builders/Landing/Customers'; +import { Testimonials } from 'apps/web/src/components/Builders/Landing/Testimonials'; +import { Tools } from 'apps/web/src/components/Builders/Landing/Tools'; +import { WhyBase } from 'apps/web/src/components/Builders/Landing/WhyBase'; +import { LiveDemo } from 'apps/web/src/components/Builders/Landing/LiveDemo'; +import { BottomCta } from 'apps/web/src/components/Builders/Landing/BottomCta'; + +export const metadata: Metadata = { + metadataBase: new URL('https://base.org'), + title: `Base | Developers`, + openGraph: { + title: `Base | Developers`, + url: `/developers`, + }, +}; + +export default function Developers() { + return ( + + +
+ + + + + + + + +
+
+
+ ); +} diff --git a/apps/web/app/(base-org)/builders/stories/aly/page.tsx b/apps/web/app/(base-org)/builders/stories/aly/page.tsx new file mode 100644 index 0000000000..872512613e --- /dev/null +++ b/apps/web/app/(base-org)/builders/stories/aly/page.tsx @@ -0,0 +1,70 @@ +import Container from 'apps/web/src/components/base-org/Container'; +import mtsumi from 'apps/web/src/components/Builders/Stories/StoryCards/assets/mtsumi.webp'; +import { Hero } from 'apps/web/src/components/Builders/Stories/StoryPages/Hero'; +import { QABlock } from 'apps/web/src/components/Builders/Stories/StoryPages/QABlock'; +import { Blockquote } from 'apps/web/src/components/Builders/Stories/StoryPages/Blockquote'; +import { ReadMore } from 'apps/web/src/components/Builders/Stories/StoryPages/ReadMore'; +import { BottomCta } from 'apps/web/src/components/Builders/Stories/BottomCta'; + +export default function Aly() { + return ( + +
+ + +
+ + + + + + +
+
+ ); +} diff --git a/apps/web/app/(base-org)/builders/stories/page.tsx b/apps/web/app/(base-org)/builders/stories/page.tsx new file mode 100644 index 0000000000..7d315cde3a --- /dev/null +++ b/apps/web/app/(base-org)/builders/stories/page.tsx @@ -0,0 +1,26 @@ +import AnalyticsProvider from 'apps/web/contexts/Analytics'; +import Container from 'apps/web/src/components/base-org/Container'; +import { Hero } from 'apps/web/src/components/Builders/Stories/Hero'; +import { StoryCards } from 'apps/web/src/components/Builders/Stories/StoryCards'; +// import Image from 'next/image'; +// import baseGlobe from 'apps/web/src/components/Builders/Stories/Hero/assets/base_globe.webp'; + +export default function Stories() { + return ( + + {/*
+ Base Globe */} + +
+ + +
+
+ {/*
*/} +
+ ); +} diff --git a/apps/web/app/(base-org)/build/page.tsx b/apps/web/app/(base-org)/resources/page.tsx similarity index 100% rename from apps/web/app/(base-org)/build/page.tsx rename to apps/web/app/(base-org)/resources/page.tsx diff --git a/apps/web/app/CryptoProviders.dynamic.tsx b/apps/web/app/CryptoProviders.dynamic.tsx index f0049a96fe..e7b23f7726 100644 --- a/apps/web/app/CryptoProviders.dynamic.tsx +++ b/apps/web/app/CryptoProviders.dynamic.tsx @@ -2,10 +2,20 @@ import { useEffect, useState } from 'react'; import { useErrors } from 'apps/web/contexts/Errors'; +import type { CryptoProvidersProps } from './CryptoProviders'; -export function DynamicCryptoProviders({ children }: { children: React.ReactNode }) { - const [CryptoProvidersDynamic, setCryptoProvidersDynamic] = - useState>(); +export function DynamicCryptoProviders({ + children, + mode = 'light', + theme = 'default', +}: CryptoProvidersProps) { + const [CryptoProvidersDynamic, setCryptoProvidersDynamic] = useState< + React.ComponentType<{ + children: React.ReactNode; + mode?: 'light' | 'dark'; + theme?: 'default' | 'base' | 'cyberpunk' | 'hacker'; + }> + >(); const { logError } = useErrors(); useEffect(() => { @@ -18,5 +28,9 @@ export function DynamicCryptoProviders({ children }: { children: React.ReactNode if (!CryptoProvidersDynamic) return null; - return {children}; + return ( + + {children} + + ); } diff --git a/apps/web/app/CryptoProviders.tsx b/apps/web/app/CryptoProviders.tsx index f25e43e6ec..611a8ff39b 100644 --- a/apps/web/app/CryptoProviders.tsx +++ b/apps/web/app/CryptoProviders.tsx @@ -2,10 +2,6 @@ import { AppConfig, OnchainKitProvider } from '@coinbase/onchainkit'; import { connectorsForWallets, RainbowKitProvider } from '@rainbow-me/rainbowkit'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { isDevelopment } from 'apps/web/src/constants'; -import { createConfig, http, WagmiProvider } from 'wagmi'; -import { base, baseSepolia, mainnet } from 'wagmi/chains'; import { coinbaseWallet, metaMaskWallet, @@ -14,6 +10,11 @@ import { uniswapWallet, walletConnectWallet, } from '@rainbow-me/rainbowkit/wallets'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { useMemo } from 'react'; +import { createConfig, http, WagmiProvider } from 'wagmi'; +import { base, baseSepolia, mainnet } from 'wagmi/chains'; +import { isDevelopment } from 'apps/web/src/constants'; const connectors = connectorsForWallets( [ @@ -51,17 +52,27 @@ const config = createConfig({ }); const queryClient = new QueryClient(); -type CryptoProvidersProps = { +export type CryptoProvidersProps = { children: React.ReactNode; + mode?: 'light' | 'dark'; + theme?: 'default' | 'base' | 'cyberpunk' | 'hacker'; }; -const onchainKitConfig: AppConfig = { - appearance: { - mode: 'light', - }, -}; +export default function CryptoProviders({ + children, + mode = 'light', + theme = 'default', +}: CryptoProvidersProps) { + const onchainKitConfig: AppConfig = useMemo( + () => ({ + appearance: { + mode, + theme, + }, + }), + [mode, theme], + ); -export default function CryptoProviders({ children }: CryptoProvidersProps) { return ( diff --git a/apps/web/next.config.js b/apps/web/next.config.js index b6a18e01c1..ae01c7e214 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -120,6 +120,7 @@ const contentSecurityPolicy = { `https://${process.env.NEXT_PUBLIC_PINATA_GATEWAY_URL}`, 'https://usdc-claim-git-master-coinbase-vercel.vercel.app', 'https://eth.merkle.io', // new default viem rpc + 'https://blue-api.morpho.org/graphql', // morpho ], 'frame-src': ['https://p.datadoghq.com'], 'frame-ancestors': ["'self'", baseXYZDomains], @@ -313,6 +314,11 @@ module.exports = extendBaseConfig( destination: '/names', permanent: true, }, + { + source: '/build', + destination: '/resources', + permanent: true, + }, ]; }, }, diff --git a/apps/web/package.json b/apps/web/package.json index d58eb405c1..a18933c702 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -24,6 +24,7 @@ "@heroicons/react": "^2.1.3", "@lottiefiles/dotlottie-react": "^0.8.10", "@monogrid/gainmap-js": "^3.0.6", + "@number-flow/react": "^0.5.5", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-collapsible": "^1.1.0", "@radix-ui/react-popover": "^1.1.1", @@ -73,6 +74,8 @@ "recharts": "^2.12.7", "satori": "^0.10.14", "sharp": "^0.33.4", + "shiki": "^2.1.0", + "tailwindcss-animate": "^1.0.7", "three": "^0.168.0", "three-stdlib": "^2.33.0", "twemoji": "^14.0.2", diff --git a/apps/web/src/components/Builders/Landing/BottomCta/index.tsx b/apps/web/src/components/Builders/Landing/BottomCta/index.tsx new file mode 100644 index 0000000000..f3bd0e179a --- /dev/null +++ b/apps/web/src/components/Builders/Landing/BottomCta/index.tsx @@ -0,0 +1,58 @@ +'use client'; + +import { ButtonVariants } from 'apps/web/src/components/base-org/Button/types'; +import { ButtonWithLinkAndEventLogging } from 'apps/web/src/components/Button/ButtonWithLinkAndEventLogging'; +import { useCallback, useState } from 'react'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import { CtaBanner } from 'apps/web/src/components/Builders/Shared/CtaBanner'; + +export function BottomCta() { + const [hasCopied, setHasCopied] = useState(false); + + const handleCopy = useCallback(() => { + void navigator.clipboard.writeText('npm create onchain'); + setHasCopied(true); + setTimeout(() => setHasCopied(false), 2000); // Reset after 2 seconds + }, []); + + return ( + + + +
+ Documentation +
+ +
+
+
+ + } + /> + ); +} diff --git a/apps/web/src/components/Builders/Landing/Customers/index.tsx b/apps/web/src/components/Builders/Landing/Customers/index.tsx new file mode 100644 index 0000000000..902f008c4e --- /dev/null +++ b/apps/web/src/components/Builders/Landing/Customers/index.tsx @@ -0,0 +1,177 @@ +'use client'; + +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import Image, { StaticImageData } from 'next/image'; + +import b3 from 'apps/web/src/components/Builders/Shared/assets/appchains/b3.svg'; +import blocklords from 'apps/web/src/components/Builders/Shared/assets/appchains/blocklords.svg'; +import illuvium from 'apps/web/src/components/Builders/Shared/assets/appchains/illuvium.svg'; +import metacade from 'apps/web/src/components/Builders/Shared/assets/appchains/metacade.png'; +import proofworks from 'apps/web/src/components/Builders/Shared/assets/appchains/proofworks.svg'; +import superchamps from 'apps/web/src/components/Builders/Shared/assets/appchains/superchamps.svg'; +import aerodrome from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/aerodrome.svg'; +import cattown from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/cattown.svg'; +import cooprecords from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/cooprecords.svg'; +import frenpet from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/frenpet.svg'; +import guild from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/guild.svg'; +import heyelsa from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/heyelsa.svg'; +import kyberswap from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/kyberswap.svg'; +import layer3 from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/layer3.svg'; +import magiceden from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/magiceden.svg'; +import moshicam from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/moshicam.svg'; +import moonwell from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/moonwell.svg'; +import opensea from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/opensea.svg'; +import pancakeswap from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/pancakeswap.svg'; +import seamless from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/seamless.svg'; +import tokeimon from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/tokeimon.svg'; +import uniswap from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/uniswap.svg'; +import virtual from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/virtual.svg'; +import zora from 'apps/web/src/components/Builders/Shared/assets/smart-wallet/zora.svg'; +import Link from 'apps/web/src/components/Link'; + +import { Marquee } from 'apps/web/src/components/Builders/Shared/Marquee'; + +type Customer = { + href: string; + logo: StaticImageData; +}; + +const customers: Customer[] = [ + { + href: 'https://www.b3.fun/', + logo: b3 as StaticImageData, + }, + { + href: 'https://blocklords.com/', + logo: blocklords as StaticImageData, + }, + { + href: 'https://illuvium.io/', + logo: illuvium as StaticImageData, + }, + { + href: 'https://tournaments.metacade.co/', + logo: metacade, + }, + { + href: 'https://proof-8.com/news/introducing-proof-8-new-name-same-spirit', // TO CONFIRM + logo: proofworks as StaticImageData, + }, + { + href: 'https://www.superchamps.com/', + logo: superchamps as StaticImageData, + }, + { + href: 'https://aerodrome.finance/', + logo: aerodrome as StaticImageData, + }, + { + href: 'https://cat.town/', + logo: cattown as StaticImageData, + }, + { + href: 'https://www.cooprecords.xyz/', + logo: cooprecords as StaticImageData, + }, + { + href: '', // TO CONFIRM + logo: frenpet as StaticImageData, + }, + { + href: 'https://guild.xyz/', + logo: guild as StaticImageData, + }, + { + href: 'https://www.heyelsa.ai/', + logo: heyelsa as StaticImageData, + }, + { + href: 'https://kyberswap.com/swap/base', + logo: kyberswap as StaticImageData, + }, + { + href: 'https://app.layer3.xyz/quests', + logo: layer3 as StaticImageData, + }, + { + href: 'https://magiceden.us', + logo: magiceden as StaticImageData, + }, + { + href: 'https://moshi.cam/', + logo: moshicam as StaticImageData, + }, + { + href: 'https://moonwell.fi/', + logo: moonwell as StaticImageData, + }, + { + href: 'https://opensea.io/', + logo: opensea as StaticImageData, + }, + { + href: 'https://pancakeswap.finance/', + logo: pancakeswap as StaticImageData, + }, + { + href: 'https://www.seamlessprotocol.com/', + logo: seamless as StaticImageData, + }, + { + href: 'https://app.tokiemon.io/mint', + logo: tokeimon as StaticImageData, + }, + { + href: 'https://uniswap.org/', + logo: uniswap as StaticImageData, + }, + { + href: 'https://virtuals.io/', + logo: virtual as StaticImageData, + }, + { + href: 'https://zora.co/', + logo: zora as StaticImageData, + }, +]; +const LOGO_WIDTH = 200; // pixels +const LOGO_GAP = 96; // pixels + +const logoStyle = { + width: 'auto', + height: 'auto', + minWidth: '64px', + maxWidth: '100%', + maxHeight: '64px', +}; + +export function Customers() { + return ( +
+ + Powering the most consumer-friendly applications onchain. + + + Powering the most consumer-friendly applications onchain. + + + {customers.map((customer) => ( +
+ + {String(customer.logo.src)} + +
+ ))} +
+
+ ); +} diff --git a/apps/web/src/components/Builders/Landing/Hero/SearchModal.tsx b/apps/web/src/components/Builders/Landing/Hero/SearchModal.tsx new file mode 100644 index 0000000000..d52916c619 --- /dev/null +++ b/apps/web/src/components/Builders/Landing/Hero/SearchModal.tsx @@ -0,0 +1,293 @@ +'use client'; + +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import classNames from 'classnames'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import Input from 'apps/web/src/components/Input'; +import { createPortal } from 'react-dom'; + +type SearchCategory = { + category: string; + subCategories: SubCategory[]; +}; + +type SubCategory = { + label: string; + href: string; + icon: string; + iconRotation?: string; + onClick?: () => void; +}; + +const searchConfig: SearchCategory[] = [ + { + category: 'Quickstart', + subCategories: [ + { + label: 'npm create onchain', + href: '', + icon: 'copy', + onClick: () => { + console.log('clicked'); + const copyCreateOnchain = async () => { + try { + await navigator.clipboard.writeText('npm create onchain'); + } catch (error) { + console.error('Failed to copy to clipboard', error); + } + }; + void copyCreateOnchain(); + }, + }, + ], + }, + { + category: 'Templates', + subCategories: [ + { + label: 'Launch an AI agent', + href: 'https://replit.com/@CoinbaseDev/CDP-AgentKit#README.md', + icon: 'diagonalUpArrow', + }, + { + label: 'Build an onchain store', + href: 'https://onchain-commerce-template.vercel.app/', + icon: 'diagonalUpArrow', + }, + { + label: 'Integrate crypto payments', + href: 'https://replit.com/@KevinLeffew1/buy-me-a-coffee?v=1#README.md', + icon: 'diagonalUpArrow', + }, + ], + }, + { + category: 'Tools', + subCategories: [ + { + label: 'AgentKit', + href: '/developers/agentkit', + icon: 'backArrow', + iconRotation: 'rotate-180', + }, + { + label: 'Base Appchains', + href: '/developers/appchains', + icon: 'backArrow', + iconRotation: 'rotate-180', + }, + { + label: 'MiniKit', + href: '/developers/minikit', + icon: 'backArrow', + iconRotation: 'rotate-180', + }, + { + label: 'OnchainKit', + href: '/developers/onchainkit', + icon: 'backArrow', + iconRotation: 'rotate-180', + }, + { + label: 'Smart Wallet', + href: '/developers/smartwallet', + icon: 'backArrow', + iconRotation: 'rotate-180', + }, + { + label: 'Verifications', + href: '/developers/verifications', + icon: 'backArrow', + iconRotation: 'rotate-180', + }, + ], + }, + { + category: 'Guides', + subCategories: [ + { + label: 'Onboard any users', + href: '/developers/guides/onboarding', + icon: 'diagonalUpArrow', + }, + { + label: 'Accept crypto payments', + href: '/developers/guides/payments', + icon: 'diagonalUpArrow', + }, + { + label: 'Launch AI Agents', + href: '/developers/guides/agents', + icon: 'diagonalUpArrow', + }, + { + label: 'Decentralized social features', + href: '/developers/guides/social', + icon: 'diagonalUpArrow', + }, + { + label: 'Defi your app', + href: '/developers/guides/defi', + icon: 'diagonalUpArrow', + }, + { + label: 'Remove first-timer friction', + href: '/developers/guides/gasless', + icon: 'diagonalUpArrow', + }, + ], + }, +]; + +export function SearchModal({ + isOpen, + setIsOpen, +}: { + isOpen: boolean; + setIsOpen: (isOpen: boolean) => void; +}) { + const searchInputRef = useRef(null); + const [searchQuery, setSearchQuery] = useState(''); + const [activeSearchConfig, setActiveSearchConfig] = useState(searchConfig); + + const debounced = useRef(); + const onSearchInputChange = useCallback( + (e: React.ChangeEvent) => { + clearTimeout(debounced.current); + + const value = e.target.value; + setSearchQuery(value); + }, + [setSearchQuery], + ); + + const clearInput = useCallback(() => { + setSearchQuery(''); + }, [setSearchQuery]); + + useEffect(() => { + if (isOpen) { + searchInputRef.current?.focus(); + } + }, [isOpen]); + + useEffect(() => { + if (isOpen) { + const handleClick = (e: MouseEvent) => { + const modalEl = document.querySelector('[aria-label="search-modal"]'); + if (modalEl && !modalEl.contains(e.target as Node)) { + clearInput(); + setIsOpen(false); + } + }; + document.addEventListener('mousedown', handleClick); + return () => document.removeEventListener('mousedown', handleClick); + } + }, [isOpen, clearInput, setIsOpen]); + + useEffect(() => { + if (searchQuery) { + const filteredCategories = searchConfig.filter((category) => + category.subCategories.some((subCategory) => + subCategory.label.toLowerCase().includes(searchQuery.toLowerCase()), + ), + ); + + const filteredSearchConfig = filteredCategories.map((category) => ({ + category: category.category, + subCategories: category.subCategories.filter((subCategory) => + subCategory.label.toLowerCase().includes(searchQuery.toLowerCase()), + ), + })); + setActiveSearchConfig(filteredSearchConfig); + } else { + setActiveSearchConfig(searchConfig); + } + }, [searchQuery]); + + const handleSearchInputFocus = useCallback(() => { + setIsOpen(true); + }, [setIsOpen]); + + if (!isOpen) { + return null; + } + + return createPortal( +
+
+ + {activeSearchConfig.length > 0 && ( +
+
+ {activeSearchConfig.map((searchCategory) => ( +
+
+ {searchCategory.category} +
+ {searchCategory.subCategories.map((subCategory) => ( + + ))} +
+ ))} +
+
+ )} +
+
, + document.body, + ); +} diff --git a/apps/web/src/components/Builders/Landing/Hero/index.tsx b/apps/web/src/components/Builders/Landing/Hero/index.tsx new file mode 100644 index 0000000000..174092180b --- /dev/null +++ b/apps/web/src/components/Builders/Landing/Hero/index.tsx @@ -0,0 +1,114 @@ +'use client'; + +import classNames from 'classnames'; +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { useCallback, useEffect, useState } from 'react'; +import { SearchModal } from 'apps/web/src/components/Builders/Landing/Hero/SearchModal'; +import Button from 'apps/web/src/components/base-org/Button'; +import { ButtonVariants } from 'apps/web/src/components/base-org/Button/types'; + +export function Hero() { + const [isSearchModalOpen, setIsSearchModalOpen] = useState(false); + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if ((e.metaKey || e.ctrlKey) && e.key === 'b') { + e.preventDefault(); + setIsSearchModalOpen(true); + } else if (e.key === 'Escape') { + setIsSearchModalOpen(false); + } + }; + + document.addEventListener('keydown', handleKeyDown); + return () => { + document.removeEventListener('keydown', handleKeyDown); + }; + }, []); + + const handleSearchClick = useCallback(() => { + setIsSearchModalOpen(true); + }, []); + + const handleLaunchAgent = useCallback(() => { + window.open('https://docs.cdp.coinbase.com/agentkit/docs/welcome', '_blank'); + }, []); + + const handleBuildOnchainStore = useCallback(() => { + window.open('https://onchain-commerce-template.vercel.app/', '_blank'); + }, []); + + const handleIntegrateCryptoPayments = useCallback(() => { + window.open('https://onchainkit.xyz/checkout/checkout', '_blank'); + }, []); + + return ( +
+
+ + What do you want to build? + + +
+
+ + +
+
+ + + +
+
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Landing/LiveDemo/index.tsx b/apps/web/src/components/Builders/Landing/LiveDemo/index.tsx new file mode 100644 index 0000000000..c376da3cbc --- /dev/null +++ b/apps/web/src/components/Builders/Landing/LiveDemo/index.tsx @@ -0,0 +1,655 @@ +'use client'; + +import { Earn } from '@coinbase/onchainkit/earn'; +import { WalletAdvancedDefault } from '@coinbase/onchainkit/wallet'; +import { Buy } from '@coinbase/onchainkit/buy'; +import { Checkout, CheckoutButton } from '@coinbase/onchainkit/checkout'; +import { SwapDefault } from '@coinbase/onchainkit/swap'; +import { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useState } from 'react'; +import sun from 'apps/web/src/components/Builders/Shared/assets/sun.svg'; +import moon from 'apps/web/src/components/Builders/Shared/assets/moon.svg'; +import Image, { StaticImageData } from 'next/image'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import classNames from 'classnames'; +import { DynamicCryptoProviders } from 'apps/web/app/CryptoProviders.dynamic'; +import type { Token } from '@coinbase/onchainkit/token'; +import { CodeSnippet } from 'apps/web/src/components/Builders/Shared/CodeSnippet'; + +type Tab = 'onboard' | 'onramp' | 'pay' | 'swap' | 'earn'; + +const degenToken: Token = { + name: 'DEGEN', + address: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed', + symbol: 'DEGEN', + decimals: 18, + image: + 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/3b/bf/3bbf118b5e6dc2f9e7fc607a6e7526647b4ba8f0bea87125f971446d57b296d2-MDNmNjY0MmEtNGFiZi00N2I0LWIwMTItMDUyMzg2ZDZhMWNm', + chainId: 8453, +}; + +const ethToken: Token = { + name: 'ETH', + address: '', + symbol: 'ETH', + decimals: 18, + image: 'https://wallet-api-production.s3.amazonaws.com/uploads/tokens/eth_288.png', + chainId: 8453, +}; + +const swappableTokens: Token[] = [degenToken, ethToken]; + +const earnVaultAddress = '0x7BfA7C4f149E7415b73bdeDfe609237e29CBF34A'; + +const styles = ` + .code-snippet::-webkit-scrollbar { + width: 10px; + height: 10px; + } + .code-snippet::-webkit-scrollbar-track { + background: transparent; + } + .code-snippet::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + border-radius: 5px; + } + .code-snippet::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.2); + } + .code-snippet { + scrollbar-width: thin; + scrollbar-color: rgba(255, 255, 255, 0.1) transparent; + } + + /* Default theme (light) */ + .shiki, + .shiki span { + color: var(--shiki-light) !important; + background-color: var(--shiki-light-bg) !important; + font-style: var(--shiki-light-font-style) !important; + font-weight: var(--shiki-light-font-weight) !important; + text-decoration: var(--shiki-light-text-decoration) !important; + } + + /* Dark theme overrides */ + .dark .shiki, + .dark .shiki span { + color: var(--shiki-dark) !important; + background-color: var(--shiki-dark-bg) !important; + font-style: var(--shiki-dark-font-style) !important; + font-weight: var(--shiki-dark-font-weight) !important; + text-decoration: var(--shiki-dark-text-decoration) !important; + } +`; + +const codeSnippets = { + onboard: `import { + WalletAdvancedDefault, +} from '@coinbase/onchainkit/wallet'; + +function WalletAdvancedDefaultDemo() { + return +}`, + onramp: `import { Buy } from '@coinbase/onchainkit/buy'; +import type { Token } from '@coinbase/onchainkit/token'; + +function BuyDemo() { + const degenToken: Token = { + name: 'DEGEN', + address: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed', + symbol: 'DEGEN', + decimals: 18, + image: 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/3b/bf/3bbf118b5e6dc2f9e7fc607a6e7526647b4ba8f0bea87125f971446d57b296d2-MDNmNjY0MmEtNGFiZi00N2I0LWIwMTItMDUyMzg2ZDZhMWNm', + chainId: 8453, + }; + + return ( + + ); +}`, + pay: `import { + Checkout, + CheckoutButton, +} from '@coinbase/onchainkit/checkout'; + +function CheckoutDemo() { + return ( + + + + ) +}`, + swap: `import { SwapDefault } from '@coinbase/onchainkit/swap'; +import type { Token } from '@coinbase/onchainkit/token'; + +function SwapDemo() { + const { address } = useAccount(); + const ETHToken: Token = { + address: "", + chainId: 8453, + decimals: 18, + name: "Ethereum", + symbol: "ETH", + image: "", + }; + + const degenToken: Token[] = [{ + name: 'DEGEN', + address: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed', + symbol: 'DEGEN', + decimals: 18, + image: 'https://d3r81g40ycuhqg.cloudfront.net/wallet/wais/3b/bf/3bbf118b5e6dc2f9e7fc607a6e7526647b4ba8f0bea87125f971446d57b296d2-MDNmNjY0MmEtNGFiZi00N2I0LWIwMTItMDUyMzg2ZDZhMWNm', + chainId: 8453, + }]; + + const swappableTokens: Token[] = [ETHToken, USDCToken]; + + return ( + + ) +}`, + earn: `import { Earn } from '@coinbase/onchainkit/earn'; + +function EarnDemo() { + return ( + + ); +}`, +}; + +export function LiveDemo() { + const [theme, setTheme] = useState<'light' | 'dark'>('dark'); + const [isMounted, setIsMounted] = useState(false); + const [content, setContent] = useState<'code' | 'preview'>('code'); + const [isComponentMenuOpen, setIsComponentMenuOpen] = useState(false); + const [activeTab, setActiveTab] = useState('onboard'); + const [copied, setCopied] = useState(false); + + const buttonClasses = useMemo( + () => ({ + active: theme === 'dark' ? 'text-white' : 'text-dark-palette-backgroundAlternate', + inactive: + theme === 'dark' + ? 'text-dark-palette-foregroundMuted hover:text-white' + : 'text-dark-gray-50 hover:text-dark-palette-backgroundAlternate', + }), + [theme], + ); + + const demoComponent = useMemo(() => { + if (!isMounted) { + return null; + } + + switch (activeTab) { + case 'onboard': + return ; + case 'onramp': + return ; + case 'pay': + return ( + + + + ); + case 'swap': + return ; + case 'earn': + return ; + default: + return null; + } + }, [isMounted, activeTab]); + + useEffect(() => { + setIsMounted(true); + }, []); + + const handleCopy = useCallback(() => { + void navigator.clipboard.writeText(codeSnippets[activeTab]); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }, [activeTab]); + + const toggleTheme = useCallback(() => { + setTheme((prev) => (prev === 'dark' ? 'light' : 'dark')); + }, []); + + if (!isMounted) { + return ( +
+
+
+
+
Loading...
+
+
+
+
+ ); + } + + return ( + <> + + + + ); +} + +function DesktopDemo({ + theme, + setActiveTab, + activeTab, + buttonClasses, + handleCopy, + demoComponent, + toggleTheme, + copied, +}: { + theme: 'dark' | 'light'; + setActiveTab: (tab: Tab) => void; + activeTab: Tab; + buttonClasses: { active: string; inactive: string }; + handleCopy: () => void; + demoComponent: React.ReactNode; + toggleTheme: () => void; + copied: boolean; +}) { + return ( +
+ +
+ + Try it out! + + + Experience how easy it is to build on Base. + +
+
+
+
+
+ + + + + +
+
+ +
+ + +
+
+
+ +
+
+ +
+
+
+
+
+ ); +} + +function MobileDemo({ + theme, + isComponentMenuOpen, + setActiveTab, + setIsComponentMenuOpen, + activeTab, + buttonClasses, + content, + demoComponent, + toggleTheme, + setContent, +}: { + theme: 'dark' | 'light'; + isComponentMenuOpen: boolean; + setActiveTab: (tab: Tab) => void; + setIsComponentMenuOpen: Dispatch>; + activeTab: Tab; + buttonClasses: { active: string; inactive: string }; + content: 'code' | 'preview'; + demoComponent: React.ReactNode; + toggleTheme: () => void; + setContent: (content: 'code' | 'preview') => void; +}) { + return ( +
+ +
+ + Try it out!{' '} + <span className="text-dark-palette-foregroundMuted"> + Experience how easy it is to build on Base. + </span> + +
+
+ {isComponentMenuOpen && ( +
+
+
+ + +
+ + + + +
+
+ )} +
+
+
+ + +
+
+
+ + +
+
+ +
+ {content === 'preview' ? ( + + ) : ( +
+
+ +
+
+ )} +
+
+
+ ); +} + +function ComponentDemo({ + theme, + demoComponent, +}: { + theme: 'dark' | 'light'; + demoComponent: React.ReactNode; +}) { + return ( +
+ + {demoComponent} + +
+ ); +} diff --git a/apps/web/src/components/Builders/Landing/Testimonials/index.tsx b/apps/web/src/components/Builders/Landing/Testimonials/index.tsx new file mode 100644 index 0000000000..d9ebfb1bd8 --- /dev/null +++ b/apps/web/src/components/Builders/Landing/Testimonials/index.tsx @@ -0,0 +1,115 @@ +'use client'; + +import { useMemo, useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import classNames from 'classnames'; +import { ButtonWithLinkAndEventLogging } from 'apps/web/src/components/Button/ButtonWithLinkAndEventLogging'; +import { ButtonVariants } from 'apps/web/src/components/base-org/Button/types'; +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; + +type Tab = 'build' | 'scale' | 'monetize'; + +type Testimonial = { + text: string; + author: string; + role: string; + tab: Tab; +}; + +const testimonials: Testimonial[] = [ + { + text: "Base's developer platform helped us launch our NFT marketplace in days instead of months.", + author: 'Sarah Chen', + role: 'CTO at ArtBlock', + tab: 'build', + }, + { + text: 'We scaled from 100 to 100k daily active users without changing our infrastructure.', + author: 'Michael Rodriguez', + role: 'Founder at GameFi', + tab: 'scale', + }, + { + text: 'Implementing Base Pay increased our revenue by 300% in the first month.', + author: 'David Kim', + role: 'CEO at DeFiPro', + tab: 'monetize', + }, +]; + +export function Testimonials() { + const [activeTab, setActiveTab] = useState('build'); + + const testimonialAnimation = useMemo( + () => ({ + initial: { opacity: 0, y: 20 }, + animate: { opacity: 1, y: 0 }, + exit: { opacity: 0, y: -20 }, + transition: { duration: 0.3 }, + }), + [], + ); + + return ( +
+
+
+ {(['build', 'scale', 'monetize'] as const).map((tab) => ( + + ))} +
+ + + {testimonials + .filter((testimonial) => testimonial.tab === activeTab) + .map((testimonial) => ( + +
+ “{testimonial.text}” +
+ {testimonial.author} + {testimonial.role} +
+
+ +
+ More stories +
+ +
+
+
+
+ ))} +
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Landing/Tools/index.tsx b/apps/web/src/components/Builders/Landing/Tools/index.tsx new file mode 100644 index 0000000000..4a3ef90a9c --- /dev/null +++ b/apps/web/src/components/Builders/Landing/Tools/index.tsx @@ -0,0 +1,89 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import Image, { type StaticImageData } from 'next/image'; +import Link from 'next/link'; +import agentKit from 'apps/web/src/components/Builders/Shared/assets/Tools/agentKit.svg'; +import appchains from 'apps/web/src/components/Builders/Shared/assets/Tools/appchains.svg'; +import miniKit from 'apps/web/src/components/Builders/Shared/assets/Tools/miniKit.svg'; +import smartWallet from 'apps/web/src/components/Builders/Shared/assets/Tools/smartWallet.svg'; +import onchainKit from 'apps/web/src/components/Builders/Shared/assets/Tools/onchainKit.svg'; +import verification from 'apps/web/src/components/Builders/Shared/assets/Tools/verification.svg'; + +type ToolCardProps = { + title: string; + description: string; + icon: StaticImageData; + href: string; +}; + +export function Tools() { + return ( +
+ + The easiest and most rewarding way to build world-class onchain products. + + + The easiest and most rewarding way to build world-class onchain products. + +
+ + + + + + +
+
+ ); +} + +function ToolCard({ title, description, icon, href }: ToolCardProps) { + return ( + +
+ {title} +
+ + {title} + + + {description} + +
+
+ + ); +} diff --git a/apps/web/src/components/Builders/Landing/UseCases/UseCaseBlock.tsx b/apps/web/src/components/Builders/Landing/UseCases/UseCaseBlock.tsx new file mode 100644 index 0000000000..949c4c6ddc --- /dev/null +++ b/apps/web/src/components/Builders/Landing/UseCases/UseCaseBlock.tsx @@ -0,0 +1,48 @@ +'use client'; + +import { ButtonWithLinkAndEventLogging } from 'apps/web/src/components/Button/ButtonWithLinkAndEventLogging'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import { ButtonVariants } from 'apps/web/src/components/base-org/Button/types'; +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; + +export function UseCaseBlock({ + children, + title, + description, + href, +}: { + children: React.ReactNode; + title: string; + description: string; + href: string; +}) { + return ( +
+
+ {children} +
+
+ + {title} + + + {description} + +
+ +
+ Get started +
+ +
+
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Landing/UseCases/index.tsx b/apps/web/src/components/Builders/Landing/UseCases/index.tsx new file mode 100644 index 0000000000..d6d15aec3a --- /dev/null +++ b/apps/web/src/components/Builders/Landing/UseCases/index.tsx @@ -0,0 +1,74 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import { UseCaseBlock } from 'apps/web/src/components/Builders/Landing/UseCases/UseCaseBlock'; +import { AnimatedOnboarding } from 'apps/web/src/components/Builders/Shared/assets/UseCases/Onboarding'; +import { AnimatedPayment } from 'apps/web/src/components/Builders/Shared/assets/UseCases/Payments'; +import { AnimatedBaseAgent } from 'apps/web/src/components/Builders/Shared/assets/UseCases/BaseAgent'; +import { AnimatedSocial } from 'apps/web/src/components/Builders/Shared/assets/UseCases/Social'; +import { AnimatedDefi } from 'apps/web/src/components/Builders/Shared/assets/UseCases/Defi'; +import { AnimatedGasless } from 'apps/web/src/components/Builders/Shared/assets/UseCases/Gasless'; + +export function UseCases() { + return ( +
+
+ + Build. Scale. Monetize.{' '} + <span className="text-gray-50">Everything you need to launch onchain products.</span> + +
+
+ + Build. Scale. Monetize.{' '} + <span className="text-gray-50">Everything you need to launch onchain products.</span> + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/apps/web/src/components/Builders/Landing/WhyBase/index.tsx b/apps/web/src/components/Builders/Landing/WhyBase/index.tsx new file mode 100644 index 0000000000..7c447dc179 --- /dev/null +++ b/apps/web/src/components/Builders/Landing/WhyBase/index.tsx @@ -0,0 +1,105 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import Image, { type StaticImageData } from 'next/image'; +import integration from 'apps/web/src/components/Builders/shared/assets/WhyBase/integration.svg'; +import support from 'apps/web/src/components/Builders/shared/assets/WhyBase/support.svg'; +import megaphone from 'apps/web/src/components/Builders/shared/assets/WhyBase/megaphone.svg'; +import security from 'apps/web/src/components/Builders/shared/assets/WhyBase/security.svg'; + +type ValuePropProps = { + title: string; + description: string; + icon: StaticImageData; +}; + +export function WhyBase() { + return ( +
+
+
+ + Build on the fastest growing L2.{' '} + <span className="text-dark-palette-foregroundMuted"> + Grow faster with distribution through Base's social graph and integrations with + Coinbase products. + </span> + + + Build on the fastest growing L2.{' '} + <span className="text-dark-palette-foregroundMuted"> + Grow faster with distribution through Base's social graph and integrations with + Coinbase products. + </span> + +
+
+ + + + +
+
+ + + + +
+
+
+ ); +} + +function ValueProp({ title, description, icon }: ValuePropProps) { + return ( +
+
+ {/*
*/} + {title} + + {title} + + + {description} + +
+
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/CodeSnippet.tsx b/apps/web/src/components/Builders/Shared/CodeSnippet.tsx new file mode 100644 index 0000000000..475e86129d --- /dev/null +++ b/apps/web/src/components/Builders/Shared/CodeSnippet.tsx @@ -0,0 +1,56 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +export function CodeSnippet({ code }: { code: string }) { + const [highlightedCode, setHighlightedCode] = useState(''); + + useEffect(() => { + // Only run on the client side + if (typeof window !== 'undefined') { + async function highlightCode() { + const { createHighlighter } = await import('shiki'); + + const highlighter = await createHighlighter({ + themes: ['github-light', 'github-dark'], + langs: ['typescript'], + }); + + const formattedCode = highlighter.codeToHtml(code, { + lang: 'typescript', + themes: { + light: 'github-light', + dark: 'github-dark', + }, + defaultColor: false, + }); + + // Remove Shiki formatting + const cleanedCode = formattedCode.replace( + /]*class="([^"]*)"[^>]*>/, + (_match: string, className: string) => + `
`,
+        );
+
+        setHighlightedCode(cleanedCode);
+      }
+
+      void highlightCode();
+    }
+  }, [code]);
+
+  if (!highlightedCode) {
+    return (
+      
+
Loading...
+
+ ); + } + + return ( +
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/CtaBanner.tsx b/apps/web/src/components/Builders/Shared/CtaBanner.tsx new file mode 100644 index 0000000000..e104a73cb0 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/CtaBanner.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { ReactNode } from 'react'; +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import classNames from 'classnames'; + +type CtaBannerProps = { + title: string; + description: string; + cta?: ReactNode; + sectionClassName?: string; +}; + +export function CtaBanner({ title, description, cta, sectionClassName }: CtaBannerProps) { + return ( +
+
+
+ + {title} + + + {description} + +
+
+ + {title} + + + {description} + +
+
{cta}
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/Marquee.tsx b/apps/web/src/components/Builders/Shared/Marquee.tsx new file mode 100644 index 0000000000..dbcff3a0fd --- /dev/null +++ b/apps/web/src/components/Builders/Shared/Marquee.tsx @@ -0,0 +1,78 @@ +import classNames from 'classnames'; +import { ComponentPropsWithoutRef } from 'react'; + +export type MarqueeProps = ComponentPropsWithoutRef<'div'> & { + /** + * Optional CSS class name to apply custom styles + */ + className?: string; + /** + * Optional CSS class name to apply custom styles to the children + */ + childrenClassName?: string; + /** + * Whether to reverse the animation direction + * @default false + */ + reverse?: boolean; + /** + * Whether to pause the animation on hover + * @default false + */ + pauseOnHover?: boolean; + /** + * Content to be displayed in the marquee + */ + children: React.ReactNode; + /** + * Whether to animate vertically instead of horizontally + * @default false + */ + vertical?: boolean; + /** + * Number of times to repeat the content + * @default 4 + */ + repeat?: number; +}; + +export function Marquee({ + className, + childrenClassName, + reverse = false, + pauseOnHover = false, + children, + vertical = false, + repeat = 4, + ...props +}: MarqueeProps) { + return ( +
+ {Array(repeat) + .fill(0) + .map(() => ( +
+ {children} +
+ ))} +
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/assets/Tools/agentKit.svg b/apps/web/src/components/Builders/Shared/assets/Tools/agentKit.svg new file mode 100644 index 0000000000..142a285b5a --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/Tools/agentKit.svg @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/Tools/appchains.svg b/apps/web/src/components/Builders/Shared/assets/Tools/appchains.svg new file mode 100644 index 0000000000..18a98dd597 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/Tools/appchains.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/Tools/miniKit.svg b/apps/web/src/components/Builders/Shared/assets/Tools/miniKit.svg new file mode 100644 index 0000000000..1f2af4ac60 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/Tools/miniKit.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/Tools/onchainKit.svg b/apps/web/src/components/Builders/Shared/assets/Tools/onchainKit.svg new file mode 100644 index 0000000000..c4b9a945db --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/Tools/onchainKit.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/Tools/smartWallet.svg b/apps/web/src/components/Builders/Shared/assets/Tools/smartWallet.svg new file mode 100644 index 0000000000..8007f28f9e --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/Tools/smartWallet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/Tools/verification.svg b/apps/web/src/components/Builders/Shared/assets/Tools/verification.svg new file mode 100644 index 0000000000..04c9fb7bf7 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/Tools/verification.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/UseCases/BaseAgent.tsx b/apps/web/src/components/Builders/Shared/assets/UseCases/BaseAgent.tsx new file mode 100644 index 0000000000..8fdab59006 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/UseCases/BaseAgent.tsx @@ -0,0 +1,78 @@ +'use client'; + +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import { motion, useInView } from 'framer-motion'; +import { useMemo, useRef } from 'react'; + +export function AnimatedBaseAgent() { + const ref = useRef(null); + const isInView = useInView(ref, { once: true, amount: 0.4 }); + + const container = useMemo( + () => ({ + hidden: { opacity: 0 }, + show: { + opacity: 1, + transition: { + staggerChildren: 0.3, + delayChildren: 0.3, + }, + }, + }), + [], + ); + + const item = useMemo( + () => ({ + hidden: { opacity: 0, y: 20 }, + show: { opacity: 1, y: 0 }, + }), + [], + ); + + return ( +
+ {/* Header */} + + + + Based Agent + + + + + +
+ + + +
+ + + +
+ + + +
+ + +
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/assets/UseCases/Defi.tsx b/apps/web/src/components/Builders/Shared/assets/UseCases/Defi.tsx new file mode 100644 index 0000000000..06c81c378b --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/UseCases/Defi.tsx @@ -0,0 +1,80 @@ +'use client'; + +import Image, { StaticImageData } from 'next/image'; +import { useState, useEffect } from 'react'; +import NumberFlow from '@number-flow/react'; +import usdc from 'apps/web/public/images/partners/usdc.svg'; + +const initialEarned = 4124.39; +const apy = 6.97; +const numberFlowFormat = { + minimumFractionDigits: 2, + maximumFractionDigits: 2, +}; + +export function AnimatedDefi() { + const [currentEarned, setCurrentEarned] = useState(initialEarned); + + useEffect(() => { + const interval = setInterval(() => { + setCurrentEarned((prev) => { + const tier = Math.random() * 100; + let increment; + + if (tier < 50) { + increment = Math.random() * 15.4 + 0.5; + } else if (tier < 80) { + increment = Math.random() * 8.2 + 1.5; + } else if (tier < 95) { + increment = Math.random() * 5.75 + 2.5; + } else { + increment = Math.random() * 3.0 + 4.0; + } + + return prev + increment; + }); + }, 1000); + + return () => clearInterval(interval); + }, []); + + const percentageIncrease = ((currentEarned - initialEarned) / initialEarned) * 100; + + return ( +
+
+
+ USDC Icon +
+
+
APY
+
{apy}%
+
+
+
+ Total Earned +
+
+ $ + + + +{percentageIncrease.toFixed(2)}% + +
+
+ +
+
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/assets/UseCases/Gasless.tsx b/apps/web/src/components/Builders/Shared/assets/UseCases/Gasless.tsx new file mode 100644 index 0000000000..a281e1bd95 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/UseCases/Gasless.tsx @@ -0,0 +1,52 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +export function AnimatedGasless() { + const [barHeights, setBarHeights] = useState([]); + + useEffect(() => { + const initialHeights = Array(16) + .fill(0) + .map( + () => Math.random() * 40 + 40, // Random values between 40% and 80% for initial state + ); + setBarHeights(initialHeights); + + const interval = setInterval(() => { + setBarHeights( + (prev) => prev.map(() => Math.random() * 100), // Random values between 0 and 100% ($0 to $1.5K) + ); + }, 2000); + + return () => clearInterval(interval); + }, []); + + return ( +
+
+

Gas sponsored

+ +
+
+ $1.5K + $1K + $500 + $0 +
+ +
+ {barHeights.map((height, index) => ( +
+ ))} +
+
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/assets/UseCases/Onboarding.tsx b/apps/web/src/components/Builders/Shared/assets/UseCases/Onboarding.tsx new file mode 100644 index 0000000000..245e9495fc --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/UseCases/Onboarding.tsx @@ -0,0 +1,80 @@ +'use client'; + +import classNames from 'classnames'; +import { useEffect, useState, useRef, useCallback } from 'react'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import './styles.css'; + +export function AnimatedOnboarding() { + const [mousePosition, setMousePosition] = useState<{ x: number; y: number }>({ + x: 0, + y: 0, + }); + const [isVisible, setIsVisible] = useState(false); + const topRectangleRef = useRef(null); + + const updateMousePosition = useCallback((e: React.MouseEvent) => { + const container = e.currentTarget.getBoundingClientRect(); + setMousePosition({ + x: e.clientX - container.left, + y: e.clientY - container.top, + }); + }, []); + + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + setIsVisible(true); + } + }); + }, + { + threshold: 0.5, // Trigger when 50% of the element is visible + }, + ); + + if (topRectangleRef.current) { + observer.observe(topRectangleRef.current); + } + + return () => { + if (topRectangleRef.current) { + observer.unobserve(topRectangleRef.current); + } + }; + }, []); + + return ( +
+
+
+ + Coinbase Wallet +
+
+
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/assets/UseCases/Payments.tsx b/apps/web/src/components/Builders/Shared/assets/UseCases/Payments.tsx new file mode 100644 index 0000000000..6f3d35ff30 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/UseCases/Payments.tsx @@ -0,0 +1,196 @@ +'use client'; + +import { useState, useEffect } from 'react'; + +type ButtonState = 'default' | 'loading' | 'success'; + +export function AnimatedPayment() { + const [buttonState, setButtonState] = useState('default'); + + useEffect(() => { + const animationCycle = () => { + setButtonState('loading'); + setTimeout(() => { + setButtonState('success'); + setTimeout(() => { + setButtonState('default'); + }, 800); + }, 1200); + }; + + const interval = setInterval(animationCycle, 4000); + return () => clearInterval(interval); + }, []); + + return ( +
+
+ + {/* Total amount with justified spacing */} +
+ Total + $69.42 +
+ + + + {/* Pay with crypto button */} + +
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/assets/UseCases/Social.tsx b/apps/web/src/components/Builders/Shared/assets/UseCases/Social.tsx new file mode 100644 index 0000000000..400592149d --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/UseCases/Social.tsx @@ -0,0 +1,76 @@ +'use client'; + +import LottieAnimation from 'apps/web/src/components/LottieAnimation'; +import { getBasenameAnimation } from 'apps/web/src/utils/usernames'; +import { motion } from 'framer-motion'; +import { useMemo } from 'react'; + +export function AnimatedSocial() { + const animation = getBasenameAnimation('basename'); + const heartAnimations = useMemo( + () => ({ + animate: { + scale: [1, 1.2, 1], + }, + transition: { + duration: 1, + times: [0, 0.5, 1], + repeat: Infinity, + repeatDelay: 2, + }, + }), + [], + ); + + const buttonAnimations = useMemo( + () => ({ + initial: { opacity: 0, x: 20 }, + animate: { opacity: 1, x: 0 }, + transition: { + type: 'spring', + stiffness: 100, + delay: 0.1, + }, + }), + [], + ); + return ( +
+
+ +
+
+
+
+ + + + + + + Collect + +
+
+ ); +} diff --git a/apps/web/src/components/Builders/Shared/assets/UseCases/styles.css b/apps/web/src/components/Builders/Shared/assets/UseCases/styles.css new file mode 100644 index 0000000000..35e94c715f --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/UseCases/styles.css @@ -0,0 +1,21 @@ +@keyframes shimmer { + 0% { + background-position: -1000px 0; + } + 100% { + background-position: 1000px 0; + } +} + +.shimmer-effect { + background-image: linear-gradient( + 45deg, + #000000 0%, + rgba(255, 255, 255, 0.3) 25%, + #000000 50%, + #000000 100% + ); + background-repeat: no-repeat; + background-size: 2000px 100%; + animation: shimmer 2s linear infinite; +} diff --git a/apps/web/src/components/Builders/Shared/assets/WhyBase/integration.svg b/apps/web/src/components/Builders/Shared/assets/WhyBase/integration.svg new file mode 100644 index 0000000000..43036132ee --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/WhyBase/integration.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/Builders/Shared/assets/WhyBase/megaphone.svg b/apps/web/src/components/Builders/Shared/assets/WhyBase/megaphone.svg new file mode 100644 index 0000000000..4847c1cddd --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/WhyBase/megaphone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/WhyBase/security.svg b/apps/web/src/components/Builders/Shared/assets/WhyBase/security.svg new file mode 100644 index 0000000000..7194dd824d --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/WhyBase/security.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/Builders/Shared/assets/WhyBase/support.svg b/apps/web/src/components/Builders/Shared/assets/WhyBase/support.svg new file mode 100644 index 0000000000..07e531a4c8 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/WhyBase/support.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/Builders/Shared/assets/appchains/b3.svg b/apps/web/src/components/Builders/Shared/assets/appchains/b3.svg new file mode 100644 index 0000000000..8f218da9b3 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/appchains/b3.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/appchains/blocklords.svg b/apps/web/src/components/Builders/Shared/assets/appchains/blocklords.svg new file mode 100644 index 0000000000..6ba419f30d --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/appchains/blocklords.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/appchains/illuvium.svg b/apps/web/src/components/Builders/Shared/assets/appchains/illuvium.svg new file mode 100644 index 0000000000..c9f745c875 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/appchains/illuvium.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/appchains/metacade.png b/apps/web/src/components/Builders/Shared/assets/appchains/metacade.png new file mode 100644 index 0000000000..53e2d3ae00 Binary files /dev/null and b/apps/web/src/components/Builders/Shared/assets/appchains/metacade.png differ diff --git a/apps/web/src/components/Builders/Shared/assets/appchains/proofworks.svg b/apps/web/src/components/Builders/Shared/assets/appchains/proofworks.svg new file mode 100644 index 0000000000..2aeaae52d5 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/appchains/proofworks.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/appchains/superchamps.svg b/apps/web/src/components/Builders/Shared/assets/appchains/superchamps.svg new file mode 100644 index 0000000000..dc32103f51 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/appchains/superchamps.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/moon.svg b/apps/web/src/components/Builders/Shared/assets/moon.svg new file mode 100644 index 0000000000..5396efa109 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/moon.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/aerodrome.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/aerodrome.svg new file mode 100644 index 0000000000..fa38a72c2a --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/aerodrome.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/cattown.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/cattown.svg new file mode 100644 index 0000000000..66a0e280b1 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/cattown.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/cooprecords.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/cooprecords.svg new file mode 100644 index 0000000000..b59f7d28c7 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/cooprecords.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/frenpet.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/frenpet.svg new file mode 100644 index 0000000000..2385a70ae5 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/frenpet.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/guild.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/guild.svg new file mode 100644 index 0000000000..16202f5309 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/guild.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/heyelsa.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/heyelsa.svg new file mode 100644 index 0000000000..77be6f7447 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/heyelsa.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/kyberswap.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/kyberswap.svg new file mode 100644 index 0000000000..4f8d839cdd --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/kyberswap.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/layer3.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/layer3.svg new file mode 100644 index 0000000000..86e1717d88 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/layer3.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/magiceden.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/magiceden.svg new file mode 100644 index 0000000000..0b3f8a991e --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/magiceden.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/moonwell.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/moonwell.svg new file mode 100644 index 0000000000..64ddd3e232 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/moonwell.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/moshicam.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/moshicam.svg new file mode 100644 index 0000000000..c802876013 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/moshicam.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/opensea.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/opensea.svg new file mode 100644 index 0000000000..2eb971ee15 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/opensea.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/pancakeswap.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/pancakeswap.svg new file mode 100644 index 0000000000..a5312ac16e --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/pancakeswap.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/seamless.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/seamless.svg new file mode 100644 index 0000000000..9bd3c2b883 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/seamless.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/tokeimon.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/tokeimon.svg new file mode 100644 index 0000000000..09ff6083ba --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/tokeimon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/uniswap.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/uniswap.svg new file mode 100644 index 0000000000..1caf89978f --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/uniswap.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/virtual.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/virtual.svg new file mode 100644 index 0000000000..fb45ebf0b4 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/virtual.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/smart-wallet/zora.svg b/apps/web/src/components/Builders/Shared/assets/smart-wallet/zora.svg new file mode 100644 index 0000000000..d47202c0b3 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/smart-wallet/zora.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/web/src/components/Builders/Shared/assets/sun.svg b/apps/web/src/components/Builders/Shared/assets/sun.svg new file mode 100644 index 0000000000..f8d9ed95b2 --- /dev/null +++ b/apps/web/src/components/Builders/Shared/assets/sun.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/apps/web/src/components/Builders/Stories/BottomCta/index.tsx b/apps/web/src/components/Builders/Stories/BottomCta/index.tsx new file mode 100644 index 0000000000..f84795d183 --- /dev/null +++ b/apps/web/src/components/Builders/Stories/BottomCta/index.tsx @@ -0,0 +1,62 @@ +import { ButtonVariants } from 'apps/web/src/components/base-org/Button/types'; +import { ButtonWithLinkAndEventLogging } from 'apps/web/src/components/Button/ButtonWithLinkAndEventLogging'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; + +export function BottomCta() { + return ( +
+
+
+ + Feeling inspired? Start building today. + + + Start building with a starter template or see documentation. + +
+
+ + Feeling inspired? Start building today. + + + Start building with a starter template or see documentation. + +
+
+ +
+ Get Started +
+ +
+
+
+ +
+ Explore Use Cases +
+ +
+
+
+
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Stories/Hero/assets/base_globe.webp b/apps/web/src/components/Builders/Stories/Hero/assets/base_globe.webp new file mode 100644 index 0000000000..8d7d1e4a2d Binary files /dev/null and b/apps/web/src/components/Builders/Stories/Hero/assets/base_globe.webp differ diff --git a/apps/web/src/components/Builders/Stories/Hero/index.tsx b/apps/web/src/components/Builders/Stories/Hero/index.tsx new file mode 100644 index 0000000000..9538b5f55c --- /dev/null +++ b/apps/web/src/components/Builders/Stories/Hero/index.tsx @@ -0,0 +1,17 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; + +export function Hero() { + return ( +
+
+ + Builder Stories + + + Inspirational stories of builders and the new internet they're building on Base. + +
+
+ ); +} diff --git a/apps/web/src/components/Builders/Stories/StoryCards/assets/ivog.webp b/apps/web/src/components/Builders/Stories/StoryCards/assets/ivog.webp new file mode 100644 index 0000000000..ddbaed7a06 Binary files /dev/null and b/apps/web/src/components/Builders/Stories/StoryCards/assets/ivog.webp differ diff --git a/apps/web/src/components/Builders/Stories/StoryCards/assets/kinya.webp b/apps/web/src/components/Builders/Stories/StoryCards/assets/kinya.webp new file mode 100644 index 0000000000..12a55e7f78 Binary files /dev/null and b/apps/web/src/components/Builders/Stories/StoryCards/assets/kinya.webp differ diff --git a/apps/web/src/components/Builders/Stories/StoryCards/assets/mtsumi.webp b/apps/web/src/components/Builders/Stories/StoryCards/assets/mtsumi.webp new file mode 100644 index 0000000000..462d9953df Binary files /dev/null and b/apps/web/src/components/Builders/Stories/StoryCards/assets/mtsumi.webp differ diff --git a/apps/web/src/components/Builders/Stories/StoryCards/assets/nguyen.webp b/apps/web/src/components/Builders/Stories/StoryCards/assets/nguyen.webp new file mode 100644 index 0000000000..4ea3968bb2 Binary files /dev/null and b/apps/web/src/components/Builders/Stories/StoryCards/assets/nguyen.webp differ diff --git a/apps/web/src/components/Builders/Stories/StoryCards/index.tsx b/apps/web/src/components/Builders/Stories/StoryCards/index.tsx new file mode 100644 index 0000000000..c886dc81d9 --- /dev/null +++ b/apps/web/src/components/Builders/Stories/StoryCards/index.tsx @@ -0,0 +1,128 @@ +import Image, { StaticImageData } from 'next/image'; +import mtsumi from 'apps/web/src/components/Builders/Stories/StoryCards/assets/mtsumi.webp'; +import nguyen from 'apps/web/src/components/Builders/Stories/StoryCards/assets/nguyen.webp'; +import kinya from 'apps/web/src/components/Builders/Stories/StoryCards/assets/kinya.webp'; +import ivog from 'apps/web/src/components/Builders/Stories/StoryCards/assets/ivog.webp'; +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import { ButtonWithLinkAndEventLogging } from 'apps/web/src/components/Button/ButtonWithLinkAndEventLogging'; +import { ButtonVariants } from 'apps/web/src/components/base-org/Button/types'; +import classNames from 'classnames'; + +export function StoryCards() { + return ( +
+ + + + +
+ ); +} + +function StoryCard({ + title, + description, + location, + date, + href, + color, + image, +}: { + title: string; + description: string; + location: string; + date: string; + href: string; + color: string; + image: StaticImageData; +}) { + return ( +
+ {title} +
+
+
+ {title} + + {description} + +
+
+ + {title} + + + {description} + +
+
+
+
+ +
+
+ +
+ + {location} + +
+ + {date} + +
+
+ +
+ Read +
+ +
+
+
+
+
+ ); +} diff --git a/apps/web/src/components/Builders/Stories/StoryPages/Blockquote/index.tsx b/apps/web/src/components/Builders/Stories/StoryPages/Blockquote/index.tsx new file mode 100644 index 0000000000..54a78b13bc --- /dev/null +++ b/apps/web/src/components/Builders/Stories/StoryPages/Blockquote/index.tsx @@ -0,0 +1,11 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import classNames from 'classnames'; + +export function Blockquote({ quote, color }: { quote: string; color: string }) { + return ( +
+ "{quote}" +
+ ); +} diff --git a/apps/web/src/components/Builders/Stories/StoryPages/Hero/index.tsx b/apps/web/src/components/Builders/Stories/StoryPages/Hero/index.tsx new file mode 100644 index 0000000000..c54ffacab6 --- /dev/null +++ b/apps/web/src/components/Builders/Stories/StoryPages/Hero/index.tsx @@ -0,0 +1,69 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import { Icon } from 'apps/web/src/components/Icon/Icon'; +import Link from 'next/link'; +import Image, { StaticImageData } from 'next/image'; + +export function Hero({ + date, + title, + description, + region, + project, + onBaseSince, + image, +}: { + date: string; + title: string; + description: string; + region: string; + project: string; + onBaseSince: string; + image: StaticImageData; +}) { + return ( +
+
+ + {date} + +
+ + {title} + + + {description} + +
+
+
+
+ + Region + + {region} +
+
+ + Project + + +
+ {project} +
+ +
+
+ +
+
+ + On Base Since + + {onBaseSince} +
+
+ {title} +
+ ); +} diff --git a/apps/web/src/components/Builders/Stories/StoryPages/QABlock/index.tsx b/apps/web/src/components/Builders/Stories/StoryPages/QABlock/index.tsx new file mode 100644 index 0000000000..92dbe303d7 --- /dev/null +++ b/apps/web/src/components/Builders/Stories/StoryPages/QABlock/index.tsx @@ -0,0 +1,13 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; + +export function QABlock({ question, answer }: { question: string; answer: string }) { + return ( +
+ + {question} + + {answer} +
+ ); +} diff --git a/apps/web/src/components/Builders/Stories/StoryPages/ReadMore/index.tsx b/apps/web/src/components/Builders/Stories/StoryPages/ReadMore/index.tsx new file mode 100644 index 0000000000..6b27af0cd1 --- /dev/null +++ b/apps/web/src/components/Builders/Stories/StoryPages/ReadMore/index.tsx @@ -0,0 +1,42 @@ +import Title from 'apps/web/src/components/base-org/typography/Title'; +import { TitleLevel } from 'apps/web/src/components/base-org/typography/Title/types'; +import Link from 'next/link'; + +export function ReadMore({ + previousLabel, + previousHref, + nextLabel, + nextHref, +}: { + previousLabel: string; + previousHref: string; + nextLabel: string; + nextHref: string; +}) { + return ( +
+
+ + Previous + + + {previousLabel} + +
+
+ + Next + + + {nextLabel} + +
+
+ ); +} diff --git a/apps/web/src/components/ConnectWalletButton/ConnectWalletButton.tsx b/apps/web/src/components/ConnectWalletButton/ConnectWalletButton.tsx index ff7db6a95c..4f34d0816f 100644 --- a/apps/web/src/components/ConnectWalletButton/ConnectWalletButton.tsx +++ b/apps/web/src/components/ConnectWalletButton/ConnectWalletButton.tsx @@ -45,7 +45,7 @@ export function DynamicWrappedConnectWalletButton({ - ) + ); } export function ConnectWalletButton({ @@ -118,17 +118,15 @@ export function ConnectWalletButton({ if (!isConnected) { const baseOrgButton = connectWalletButtonVariant === ConnectWalletButtonVariants.BaseOrg; return baseOrgButton ? ( - - Connect - + Connect ) : ( ); } @@ -139,7 +137,7 @@ export function ConnectWalletButton({ variant={ButtonVariants.Black} size={ButtonSizes.Small} onClick={switchToIntendedNetwork} - rounded + className="rounded-lg" > Connect to Base @@ -150,7 +148,7 @@ export function ConnectWalletButton({
diff --git a/apps/web/src/components/Ecosystem/EcosystemFilters.tsx b/apps/web/src/components/Ecosystem/EcosystemFilters.tsx index 90353f1ce4..a46049f223 100644 --- a/apps/web/src/components/Ecosystem/EcosystemFilters.tsx +++ b/apps/web/src/components/Ecosystem/EcosystemFilters.tsx @@ -121,7 +121,7 @@ export function EcosystemFilters({ - +
{config[category]?.map((subcategory) => { const subcategoryIsSelected = selectedSubcategories.includes(subcategory); diff --git a/apps/web/src/components/Icon/Icon.tsx b/apps/web/src/components/Icon/Icon.tsx index 49e0a5fc45..4310ab5c63 100644 --- a/apps/web/src/components/Icon/Icon.tsx +++ b/apps/web/src/components/Icon/Icon.tsx @@ -591,6 +591,67 @@ const ICONS: Record JSX.Element> = { /> ), + terminal: ({ color, width, height }: SvgProps) => ( + + + + + ), + wallet: ({ color, width, height }: SvgProps) => ( + + + + ), + hamburger: ({ color, width, height }: SvgProps) => ( + + + + + + ), + locationPin: ({ color, width, height }: SvgProps) => ( + + + + ), }; export function Icon({ name, color = 'white', width = '24', height = '24' }: IconProps) { diff --git a/apps/web/src/components/base-org/Button/index.tsx b/apps/web/src/components/base-org/Button/index.tsx index 928a4c1dff..07b421818c 100644 --- a/apps/web/src/components/base-org/Button/index.tsx +++ b/apps/web/src/components/base-org/Button/index.tsx @@ -10,6 +10,7 @@ export type ButtonProps = ButtonHTMLAttributes & { variant?: ButtonVariants; size?: ButtonSizes; iconName?: IconProps['name']; + iconSize?: IconProps['width']; roundedFull?: boolean; fullWidth?: boolean; }; @@ -26,6 +27,9 @@ const variantStyles: Record = { // White outlined [ButtonVariants.Outlined]: 'bg-transparent text-white border border-white hover:bg-white hover:text-black active:bg-[#E3E7E9]', + + // Secondary Outlined + [ButtonVariants.SecondaryOutline]: 'bg-transparent border border-gray-muted/65 hover:bg-white/10', }; const sizeStyles: Record = { @@ -51,13 +55,14 @@ export default function Button({ variant = ButtonVariants.Primary, size = ButtonSizes.Medium, iconName, + iconSize = sizeIconRatio[size], roundedFull = false, className, fullWidth = false, }: ButtonProps) { const buttonClasses = classNames( // Shared - base - 'text-md px-4 py-2 whitespace-nowrap', + 'text-base px-4 py-2 whitespace-nowrap', // Shared - layout 'flex items-center justify-center', @@ -82,8 +87,6 @@ export default function Button({ className, ); - const iconSize = sizeIconRatio[size]; - return (
- +
  • {base.name} diff --git a/apps/web/src/components/base-org/shared/TopNavigation/MenuDesktop.tsx b/apps/web/src/components/base-org/shared/TopNavigation/MenuDesktop.tsx index f04d2b0b42..d13d43f9ef 100644 --- a/apps/web/src/components/base-org/shared/TopNavigation/MenuDesktop.tsx +++ b/apps/web/src/components/base-org/shared/TopNavigation/MenuDesktop.tsx @@ -4,6 +4,7 @@ import { useState, useRef, useEffect, useCallback } from 'react'; import AnimatedIcon from './AnimatedIcon'; import AnalyticsProvider from 'apps/web/contexts/Analytics'; import Link from 'apps/web/src/components/Link'; +import { BuildersDropdown } from 'apps/web/src/components/base-org/shared/TopNavigation/BuildersDropdown'; type MenuDesktopProps = { links: TopNavigationLink[]; @@ -71,7 +72,7 @@ export default function MenuDesktop({ links }: MenuDesktopProps) { href={link.href + '?utm_source=dotorg&utm_medium=nav'} target={link.href.startsWith('https://') ? '_blank' : undefined} onMouseEnter={onMouseEnterNavLink} - className={`rounded-lg bg-opacity-0 px-6 py-1 text-sm opacity-50 transition-all duration-300 hover:bg-opacity-10 hover:opacity-100 ${ + className={`rounded-md bg-opacity-0 px-6 py-1 text-sm opacity-50 transition-all duration-300 hover:bg-opacity-10 hover:opacity-100 ${ hoverIndex === index ? 'bg-opacity-10 opacity-100' : '' }`} > @@ -81,7 +82,7 @@ export default function MenuDesktop({ links }: MenuDesktopProps) { {/* Animated background */}
    -1 ? 'opacity-100' : 'opacity-0' }`} style={{ @@ -95,47 +96,64 @@ export default function MenuDesktop({ links }: MenuDesktopProps) { {/* Sub Menu */}
    - -
    - {links[hoverIndex]?.subItems && ( - -
    - {links[hoverIndex].subItems.map((subItem) => ( - - {subItem.name} - - ↗ - - - ))} -
    -
    - )} - {links[hoverIndex]?.subItems && ( -
    - {links[hoverIndex]?.name && ( -
    - {subActive && ( - - )} + {links[hoverIndex]?.name === 'Builders' ? ( + + ) : ( + +
    + {links[hoverIndex]?.subItems && ( + +
    + {links[hoverIndex].subItems.map((subItem) => ( + +
    + {subItem.name} + {subItem.description && ( + + {subItem.description} + + )} +
    + + ↗ + + + ))}
    - )} -
    - )} -
    - + + )} + {links[hoverIndex]?.subItems && ( +
    + {links[hoverIndex]?.name && ( +
    + {subActive && ( + + )} +
    + )} +
    + )} +
    + + )}
    ); diff --git a/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/blockchain.svg b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/blockchain.svg new file mode 100644 index 0000000000..95d3afacfa --- /dev/null +++ b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/blockchain.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/blog.svg b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/blog.svg new file mode 100644 index 0000000000..d9f9a5f725 --- /dev/null +++ b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/blog.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/bridging.svg b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/bridging.svg new file mode 100644 index 0000000000..5b2337cca1 --- /dev/null +++ b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/bridging.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/bug.svg b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/bug.svg new file mode 100644 index 0000000000..73b75457c4 --- /dev/null +++ b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/bug.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/gitHubLogo.svg b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/gitHubLogo.svg new file mode 100644 index 0000000000..f3204df63a --- /dev/null +++ b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/gitHubLogo.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/options.svg b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/options.svg new file mode 100644 index 0000000000..221ce62d3e --- /dev/null +++ b/apps/web/src/components/base-org/shared/TopNavigation/assets/developers/options.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/web/src/components/base-org/shared/TopNavigation/index.tsx b/apps/web/src/components/base-org/shared/TopNavigation/index.tsx index a7b8bf752a..77a816be2c 100644 --- a/apps/web/src/components/base-org/shared/TopNavigation/index.tsx +++ b/apps/web/src/components/base-org/shared/TopNavigation/index.tsx @@ -2,7 +2,6 @@ import { Suspense } from 'react'; import Image, { StaticImageData } from 'next/image'; -import Link from 'next/link'; import { usePathname } from 'next/navigation'; import AnalyticsProvider from 'apps/web/contexts/Analytics'; import logo from 'apps/web/src/components/base-org/shared/TopNavigation/assets/logo.svg'; @@ -13,9 +12,11 @@ import { ConnectWalletButtonVariants, DynamicWrappedConnectWalletButton, } from 'apps/web/src/components/ConnectWalletButton/ConnectWalletButton'; +import Link from 'apps/web/src/components/Link'; export type SubItem = { name: string; + description?: string; href: string; }; @@ -28,43 +29,106 @@ export type TopNavigationLink = { const links: TopNavigationLink[] = [ { - name: 'Build', - analyticContext: 'build', - href: '/build', + name: 'Explore', + analyticContext: 'explore', + href: '/ecosystem', subItems: [ + { name: 'Apps', description: 'Discover applications on Base', href: '/ecosystem' }, { - name: 'Get Started', - href: '/build', + name: 'Bridge', + description: 'Get started by bridging to Base', + href: 'https://bridge.base.org', }, - { name: 'Docs', href: 'https://docs.base.org' }, - { name: 'Learn', href: 'https://docs.base.org/base-learn/docs/welcome' }, - { name: 'Status Page', href: 'https://status.base.org' }, - { name: 'Block Explorer', href: 'https://base.blockscout.com' }, - { name: 'Bug Bounty', href: 'https://hackerone.com/coinbase' }, - { name: 'Github', href: 'https://github.com/base' }, ], }, { - name: 'Explore', - analyticContext: 'explore', - href: '/ecosystem', + name: 'Builders', + analyticContext: 'builders', + href: '/builders', subItems: [ - { name: 'Apps', href: '/ecosystem' }, - { name: 'Bridge', href: 'https://bridge.base.org' }, + { + name: 'Documentation', + description: '', + href: 'https://docs.base.org', + }, + { + name: 'AgentKit', + description: '', + href: '/agentkit', + }, + { + name: 'Base Appchains', + description: '', + href: '/appchains', + }, + { + name: 'Smart Wallet', + description: '', + href: '/smartwallet', + }, + { + name: 'MiniKit', + description: '', + href: '/minikit', + }, + { + name: 'OnchainKit', + description: '', + href: '/onchainkit', + }, + { + name: 'Verifications', + description: '', + href: '/verify', + }, + { + name: 'Status Page', + description: '', + href: 'https://status.base.org', + }, + { + name: 'Bug Bounty', + description: '', + href: 'https://hackerone.com/base', + }, + { + name: 'Block Explorer', + description: '', + href: 'https://basescan.org', + }, + { + name: 'GitHub', + description: '', + href: 'https://github.com/base-org', + }, + { + name: 'Blog', + description: '', + href: 'https://blog.base.org/', + }, + { + name: 'Builder Stories', + description: '', + href: '/stories', + }, ], }, { name: 'Community', - analyticContext: 'community', - href: '/', + analyticContext: 'communnity', + href: '/resources', subItems: [ + { name: 'Resources', description: 'Everything you need to get started', href: '/resources' }, + { name: 'Grants', description: 'Fund your projects on Base', href: '/resources#GetFunded' }, { - name: 'Grants', - href: 'https://paragraph.xyz/@grants.base.eth/calling-based-builders', + name: 'Events', + description: 'Connect with the Base community', + href: '/resources#GetInvolved', }, { - name: 'Events', - href: 'https://lu.ma/BaseMeetups', + name: 'Media Kit', + description: 'Base brand assets and guides', + href: 'https://github.com/base-org/brand-kit', }, ], }, @@ -73,10 +137,13 @@ const links: TopNavigationLink[] = [ analyticContext: 'about', href: '/about', subItems: [ - { name: 'Vision', href: '/about' }, - { name: 'Blog', href: 'https://base.mirror.xyz/' }, - { name: 'Jobs', href: '/jobs' }, - { name: 'Media Kit', href: 'https://github.com/base/brand-kit' }, + { name: 'Vision', description: "Base's mission, vision, and strategy", href: '/about' }, + { + name: 'Blog', + description: 'Latest updates from the Base core team', + href: 'https://base.mirror.xyz/', + }, + { name: 'Jobs', description: 'Join Base to build a new internet', href: '/jobs' }, ], }, { @@ -118,7 +185,7 @@ export default function TopNavigation() {
    {/* Connect Wallet button */} -
    +
    {showGasDropdownAndConnectWallet && ( = { [TitleLevel.Title3]: 'h3', [TitleLevel.Title4]: 'h4', [TitleLevel.Headline]: 'h5', - [TitleLevel.Big]: 'h1', }; // TODO: Probably scale down for mobile? @@ -31,7 +30,6 @@ export const levelStyles: Record = { [TitleLevel.Title3]: 'font-sans text-[1.25rem] leading-[1.75rem]', [TitleLevel.Title4]: 'font-sans text-[1.125rem] leading-[1.625rem]', [TitleLevel.Headline]: 'font-sans text-[1rem] leading-[1.4375rem] font-bold', - [TitleLevel.Big]: 'font-sans text-[2rem] leading-[1.2em] font-bold', }; type TitleProps = { diff --git a/apps/web/src/components/base-org/typography/Title/types.ts b/apps/web/src/components/base-org/typography/Title/types.ts index e9ae04f036..9f39568115 100644 --- a/apps/web/src/components/base-org/typography/Title/types.ts +++ b/apps/web/src/components/base-org/typography/Title/types.ts @@ -7,7 +7,7 @@ export enum TitleLevel { Title1 = 'title-1', Title2 = 'title-2', Title3 = 'title-3', - Title4 = 'title-5', + Title4 = 'title-4', Headline = 'headline', } diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js index 49610ace7e..da393aa6ce 100644 --- a/apps/web/tailwind.config.js +++ b/apps/web/tailwind.config.js @@ -531,7 +531,14 @@ module.exports = { '0%': { transform: 'translateX(0)' }, '100%': { transform: 'translateX(-50%)' }, }, - + marquee: { + from: { transform: 'translateX(0)' }, + to: { transform: 'translateX(calc(-100% - var(--gap)))' }, + }, + 'marquee-vertical': { + from: { transform: 'translateY(0)' }, + to: { transform: 'translateY(calc(-100% - var(--gap)))' }, + }, progress: { '0%': { width: '0%' }, '100%': { width: '100%' }, @@ -576,6 +583,8 @@ module.exports = { longslide: 'longslide 2s linear infinite', verticalSlide: 'verticalSlide 2s linear infinite', pulsate: 'pulsate 2s linear infinite', + marquee: 'marquee var(--duration) linear infinite', + 'marquee-vertical': 'marquee-vertical var(--duration) linear infinite', }, zIndex: { 1: '1', diff --git a/yarn.lock b/yarn.lock index ed20c604b1..566e4212ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -521,6 +521,7 @@ __metadata: "@heroicons/react": ^2.1.3 "@lottiefiles/dotlottie-react": ^0.8.10 "@monogrid/gainmap-js": ^3.0.6 + "@number-flow/react": ^0.5.5 "@radix-ui/react-accordion": ^1.2.0 "@radix-ui/react-collapsible": ^1.1.0 "@radix-ui/react-popover": ^1.1.1 @@ -590,7 +591,9 @@ __metadata: recharts: ^2.12.7 satori: ^0.10.14 sharp: ^0.33.4 + shiki: ^2.1.0 tailwindcss: ^3.2.4 + tailwindcss-animate: ^1.0.7 three: ^0.168.0 three-stdlib: ^2.33.0 ts-jest: ^29.2.5 @@ -678,39 +681,38 @@ __metadata: linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.6, @babel/core@npm:^7.19.6, @babel/core@npm:^7.22.9, @babel/core@npm:^7.23.9": - version: 7.26.8 - resolution: "@babel/core@npm:7.26.8" + version: 7.26.9 + resolution: "@babel/core@npm:7.26.9" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.26.2 - "@babel/generator": ^7.26.8 + "@babel/generator": ^7.26.9 "@babel/helper-compilation-targets": ^7.26.5 "@babel/helper-module-transforms": ^7.26.0 - "@babel/helpers": ^7.26.7 - "@babel/parser": ^7.26.8 - "@babel/template": ^7.26.8 - "@babel/traverse": ^7.26.8 - "@babel/types": ^7.26.8 - "@types/gensync": ^1.0.0 + "@babel/helpers": ^7.26.9 + "@babel/parser": ^7.26.9 + "@babel/template": ^7.26.9 + "@babel/traverse": ^7.26.9 + "@babel/types": ^7.26.9 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 9d83fb7ad33467fc5ed841d24158d01b7c486ad399d7988232ab9edc6d9f92cd4d60b598ca717aeeb136feb48f7e289c247663c6a28e85dee92a39b2e97cc2e1 + checksum: b6e33bdcbb8a5c929760548be400d18cbde1f07922a784586752fd544fbf13c71331406ffdb4fcfe53f79c69ceae602efdca654ad4e9ac0c2af47efe87e7fccd languageName: node linkType: hard -"@babel/generator@npm:^7.12.5, @babel/generator@npm:^7.18.7, @babel/generator@npm:^7.22.9, @babel/generator@npm:^7.26.8, @babel/generator@npm:^7.7.2": - version: 7.26.8 - resolution: "@babel/generator@npm:7.26.8" +"@babel/generator@npm:^7.12.5, @babel/generator@npm:^7.18.7, @babel/generator@npm:^7.22.9, @babel/generator@npm:^7.26.9, @babel/generator@npm:^7.7.2": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" dependencies: - "@babel/parser": ^7.26.8 - "@babel/types": ^7.26.8 + "@babel/parser": ^7.26.9 + "@babel/types": ^7.26.9 "@jridgewell/gen-mapping": ^0.3.5 "@jridgewell/trace-mapping": ^0.3.25 jsesc: ^3.0.2 - checksum: 15ef65699a556f1c75edba52109e65a597a3e16da2faf117d617e67b667983d5e3cd11399a1d6ff9ff1b0029f8e7c9513975884704b6c2d13bba3d780456823d + checksum: 57d034fb6c77dfd5e0c8ef368ff544e19cb6a27cb70d6ed5ff0552c618153dc6692d31e7d0f3a408e0fec3a519514b846c909316c3078290f3a3c1e463372eae languageName: node linkType: hard @@ -737,19 +739,19 @@ __metadata: linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" + version: 7.26.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.26.9" dependencies: "@babel/helper-annotate-as-pure": ^7.25.9 "@babel/helper-member-expression-to-functions": ^7.25.9 "@babel/helper-optimise-call-expression": ^7.25.9 - "@babel/helper-replace-supers": ^7.25.9 + "@babel/helper-replace-supers": ^7.26.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 - "@babel/traverse": ^7.25.9 + "@babel/traverse": ^7.26.9 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 91dd5f203ed04568c70b052e2f26dfaac7c146447196c00b8ecbb6d3d2f3b517abadb985d3321a19d143adaed6fe17f7f79f8f50e0c20e9d8ad83e1027b42424 + checksum: d445a660d2cdd92e83c04a60f52a304e54e5cc338796b6add9dec00048f1ad12125f78145ab688d029569a9559ef64f8e0de86f456b9e2630ea46f664ffb8e45 languageName: node linkType: hard @@ -850,7 +852,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.25.9": +"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": version: 7.26.5 resolution: "@babel/helper-replace-supers@npm:7.26.5" dependencies: @@ -905,13 +907,13 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.26.7": - version: 7.26.7 - resolution: "@babel/helpers@npm:7.26.7" +"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/helpers@npm:7.26.9" dependencies: - "@babel/template": ^7.25.9 - "@babel/types": ^7.26.7 - checksum: 1c93604c7fd6dbd7aa6f3eb2f9fa56369f9ad02bac8b3afb902de6cd4264beb443cc8589bede3790ca28d7477d4c07801fe6f4943f9833ac5956b72708bbd7ac + "@babel/template": ^7.26.9 + "@babel/types": ^7.26.9 + checksum: 06363f8288a24c1cfda03eccd775ac22f79cba319b533cb0e5d0f2a04a33512881cc3f227a4c46324935504fb92999cc4758b69b5e7b3846107eadcb5ee0abca languageName: node linkType: hard @@ -927,14 +929,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.18.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/parser@npm:7.26.8" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.18.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" dependencies: - "@babel/types": ^7.26.8 + "@babel/types": ^7.26.9 bin: parser: ./bin/babel-parser.js - checksum: 2ede62d2451eaf37f524f2048ca41994466c81bda1f5acec36fbd8931fe77bf365e2b2060972735165e40aec305e04af76dd4d8fa895bc08a250215b32356577 + checksum: 2df965dbf3c67d19dc437412ceef23033b4d39b0dbd7cb498d8ab9ad9e1738338656ee72676199773b37d658edf9f4161cf255515234fed30695d74e73be5514 languageName: node linkType: hard @@ -1464,15 +1466,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-for-of@npm:7.25.9" +"@babel/plugin-transform-for-of@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/plugin-transform-for-of@npm:7.26.9" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-plugin-utils": ^7.26.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 41b56e70256a29fc26ed7fb95ece062d7ec2f3b6ea8f0686349ffd004cd4816132085ee21165b89c502ee7161cb7cfb12510961638851357945dc7bc546475b7 + checksum: 361323cfc1d9e9dc0bf0d68326b5e7f4da5b8a8be8931f6cacda749d39b88ee1b0f9b4d8b771a5a4d52bb881a90da97950c8a9e6fb47f2c9db11d91f6351768e languageName: node linkType: hard @@ -1819,8 +1821,8 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.18.6, @babel/plugin-transform-runtime@npm:^7.22.9": - version: 7.26.8 - resolution: "@babel/plugin-transform-runtime@npm:7.26.8" + version: 7.26.9 + resolution: "@babel/plugin-transform-runtime@npm:7.26.9" dependencies: "@babel/helper-module-imports": ^7.25.9 "@babel/helper-plugin-utils": ^7.26.5 @@ -1830,7 +1832,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: abca71af8a793b4b763cdc92c795726048e208b5d9817589d6f6dfbcceca0b8b86e4b94f7c687b180ff8e8608b7ff27de1c4d3b90b39181ac5ed4b2e5a040ba5 + checksum: 2d32d4c8b2f8b048114bb2b04f65937a35ca5a2dbf3a76a6e53eef78f383262460e8b23bd113b97f30a4ce55e7ef5fafd421f81de602ad7a268fdc058122a184 languageName: node linkType: hard @@ -1953,8 +1955,8 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.18.6, @babel/preset-env@npm:^7.19.4, @babel/preset-env@npm:^7.22.9": - version: 7.26.8 - resolution: "@babel/preset-env@npm:7.26.8" + version: 7.26.9 + resolution: "@babel/preset-env@npm:7.26.9" dependencies: "@babel/compat-data": ^7.26.8 "@babel/helper-compilation-targets": ^7.26.5 @@ -1985,7 +1987,7 @@ __metadata: "@babel/plugin-transform-dynamic-import": ^7.25.9 "@babel/plugin-transform-exponentiation-operator": ^7.26.3 "@babel/plugin-transform-export-namespace-from": ^7.25.9 - "@babel/plugin-transform-for-of": ^7.25.9 + "@babel/plugin-transform-for-of": ^7.26.9 "@babel/plugin-transform-function-name": ^7.25.9 "@babel/plugin-transform-json-strings": ^7.25.9 "@babel/plugin-transform-literals": ^7.25.9 @@ -2027,7 +2029,7 @@ __metadata: semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 409066e5ab77321b0ba7a231509aa75e92ad6ec718b3b1c07dbba7028a223877a65f6472d167942cb30ffac29401b37fa20b6dc724c7e9deba30145714b50680 + checksum: 7a657f947d069b7a27b02258012ce3ceb9383a8c10c249d4a3565c486294c3fe63ed08128ca3d124444d17eb821cfbf64a91fe8160af2e39f70d5cd2232f079e languageName: node linkType: hard @@ -2076,57 +2078,57 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.18.6": - version: 7.26.7 - resolution: "@babel/runtime-corejs3@npm:7.26.7" + version: 7.26.9 + resolution: "@babel/runtime-corejs3@npm:7.26.9" dependencies: core-js-pure: ^3.30.2 regenerator-runtime: ^0.14.0 - checksum: 4e996a89750c232d792a42a0aad417d2e698fefebb723eddc5fdc01733fd93cd1841f23b71d696e6628e54a268eebf6a1d43bdd4fa292c34c7ecc9f0dba4a21d + checksum: f4daeafe995659ebafeb57a5ed8399d8f4e0256cdc9107c9e2f1107b0aed50e93c3dbafb02265b1a707b9b6bbed515b25bf31e8df9a26c8790bc9c48208513a6 languageName: node linkType: hard "@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.8, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": - version: 7.26.7 - resolution: "@babel/runtime@npm:7.26.7" + version: 7.26.9 + resolution: "@babel/runtime@npm:7.26.9" dependencies: regenerator-runtime: ^0.14.0 - checksum: a1664a08f3f4854b895b540cca2f5f5c6c1993b5fb788c9615d70fc201e16bb254df8e0550c83eaf2749a14d87775e11a7c9ded6161203e9da7a4a323d546925 + checksum: 838492d8a925092f9ccfbd82ec183a54f430af3a4ce88fb1337a4570629202d5123bad3097a5b8df53822504d12ccb29f45c0f6842e86094f0164f17a51eec92 languageName: node linkType: hard -"@babel/template@npm:^7.12.7, @babel/template@npm:^7.22.5, @babel/template@npm:^7.25.9, @babel/template@npm:^7.26.8, @babel/template@npm:^7.3.3": - version: 7.26.8 - resolution: "@babel/template@npm:7.26.8" +"@babel/template@npm:^7.12.7, @babel/template@npm:^7.22.5, @babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" dependencies: "@babel/code-frame": ^7.26.2 - "@babel/parser": ^7.26.8 - "@babel/types": ^7.26.8 - checksum: dfa79b33d49b89b2466a660bf299a545dd5fd6680fbf9828d2deca9bd826eb861041a9f5a25a4a0dddf6e4905e6fafac18a6885bf2aeecac6f39407a221e630f + "@babel/parser": ^7.26.9 + "@babel/types": ^7.26.9 + checksum: 32259298c775e543ab994daff0c758b3d6a184349b146d6497aa46cec5907bc47a6bc09e7295a81a5eccfbd023d4811a9777cb5d698d582d09a87cabf5b576e7 languageName: node linkType: hard -"@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.4.5": - version: 7.26.8 - resolution: "@babel/traverse@npm:7.26.8" +"@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9, @babel/traverse@npm:^7.4.5": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" dependencies: "@babel/code-frame": ^7.26.2 - "@babel/generator": ^7.26.8 - "@babel/parser": ^7.26.8 - "@babel/template": ^7.26.8 - "@babel/types": ^7.26.8 + "@babel/generator": ^7.26.9 + "@babel/parser": ^7.26.9 + "@babel/template": ^7.26.9 + "@babel/types": ^7.26.9 debug: ^4.3.1 globals: ^11.1.0 - checksum: f8b2f4d9945932ac6b0a359c322628327514a3e1d356555923dc143f3376d3e01f8f7a56cccb717223fa7420426e077809701175b717d946c622d826a6df7c60 + checksum: d42d3a5e61422d96467f517447b5e254edbd64e4dbf3e13b630704d1f49beaa5209246dc6f45ba53522293bd4760ff720496d2c1ef189ecce52e9e63d9a59aa8 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.7, @babel/types@npm:^7.16.8, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.7, @babel/types@npm:^7.26.8, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.26.8 - resolution: "@babel/types@npm:7.26.8" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.7, @babel/types@npm:^7.16.8, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" dependencies: "@babel/helper-string-parser": ^7.25.9 "@babel/helper-validator-identifier": ^7.25.9 - checksum: 8f0f3bac37cc93d4658df460dc24156c6f1466abca63ef111c9f03128df6c247c672ed89e779ababb41250627c78d8bfcfba616eecb01b6e4ddcfd8ded718996 + checksum: cc124c149615deb30343a4c81ac5b0e3a68bdb4b1bd61a91a2859ee8e5e5f400f6ff65be4740f407c17bfc09baa9c777e7f8f765dccf3284963956b67ac95a38 languageName: node linkType: hard @@ -2492,48 +2494,48 @@ __metadata: languageName: node linkType: hard -"@datadog/browser-core@npm:5.35.0": - version: 5.35.0 - resolution: "@datadog/browser-core@npm:5.35.0" - checksum: a928cc669c155215c7b036c48e3387430266f238863fa5aa6d33f6b10edbba0be50fc9abb841cacded34de5465931acc98806127719df3758b8d76c2171384f4 +"@datadog/browser-core@npm:5.35.1": + version: 5.35.1 + resolution: "@datadog/browser-core@npm:5.35.1" + checksum: f5706a839ed572e59694ac7a13f2d298079f67b9b9fa6ca5e397e1dc72b4c755a90c85d0ed0f4c8f292c38d7e9b8c1e94dbe80dd27fbbd0fe37ecf7aad61a1cb languageName: node linkType: hard "@datadog/browser-logs@npm:^5.23.3": - version: 5.35.0 - resolution: "@datadog/browser-logs@npm:5.35.0" + version: 5.35.1 + resolution: "@datadog/browser-logs@npm:5.35.1" dependencies: - "@datadog/browser-core": 5.35.0 + "@datadog/browser-core": 5.35.1 peerDependencies: - "@datadog/browser-rum": 5.35.0 + "@datadog/browser-rum": 5.35.1 peerDependenciesMeta: "@datadog/browser-rum": optional: true - checksum: 4d6049d4de822eee45b3c7f0fa175489f3a0e6e9dae2e608a910f4578b6cbe06c9f40b0edd183479061f83cec49293bb27cf282d25e27ae6368912d99fb05dba + checksum: 47156dd78f33aa1b6971a8131730bdcd87cd094cfc5ea5bae938107362c86241077a45668f748bb0e70a51d58c1aa4781bbeb4c3b595a04f3ae4a0367da28237 languageName: node linkType: hard -"@datadog/browser-rum-core@npm:5.35.0": - version: 5.35.0 - resolution: "@datadog/browser-rum-core@npm:5.35.0" +"@datadog/browser-rum-core@npm:5.35.1": + version: 5.35.1 + resolution: "@datadog/browser-rum-core@npm:5.35.1" dependencies: - "@datadog/browser-core": 5.35.0 - checksum: e77642a714efc58d7f3cec466b361553b1c347ef8894d06c1f03279a6d77ad4dab4708124ea30b94f3284fccda9e5c275a0889f86e0349541eee6451948b6f71 + "@datadog/browser-core": 5.35.1 + checksum: a115b4927077d5a14c8a928dd78e6c21d98ff547f7b5a90b180576947e3596c46e990715dd42e1a2e7d5c325314ea719c03947bca2b50bd7c56f420b57c768c0 languageName: node linkType: hard "@datadog/browser-rum@npm:^5.23.3": - version: 5.35.0 - resolution: "@datadog/browser-rum@npm:5.35.0" + version: 5.35.1 + resolution: "@datadog/browser-rum@npm:5.35.1" dependencies: - "@datadog/browser-core": 5.35.0 - "@datadog/browser-rum-core": 5.35.0 + "@datadog/browser-core": 5.35.1 + "@datadog/browser-rum-core": 5.35.1 peerDependencies: - "@datadog/browser-logs": 5.35.0 + "@datadog/browser-logs": 5.35.1 peerDependenciesMeta: "@datadog/browser-logs": optional: true - checksum: 800ca7ccc58b39517105ca85b3331e0dff498e48814498b17628c53000f53d486224a360327238d601d8e86c671d7a55d2683589e7ba179609d49f4b01fd26c4 + checksum: bfc0a5c5b0353cee69a355d24ee5e49d62a87e4ef9277a18819a87d2028a18a27e5eb50dcd6a662dbe3f59dd8b8c18fc0402211c3bf931ee4e601665644e5994 languageName: node linkType: hard @@ -5030,9 +5032,9 @@ __metadata: linkType: hard "@mdn/browser-compat-data@npm:^5.3.13, @mdn/browser-compat-data@npm:^5.6.19": - version: 5.6.38 - resolution: "@mdn/browser-compat-data@npm:5.6.38" - checksum: a756673a41118ee07c14ff9b0bdc135c77d0bbed4e81918afda8332992ba9b0bc5e3bf51e0cfcb34b87adadbfc18f1d6c86860947560c9059afe6af463907674 + version: 5.6.39 + resolution: "@mdn/browser-compat-data@npm:5.6.39" + checksum: 110053799cf8ff6bdedd1b3ebffd9f94b4e88793096b52cd3780698f14e649cd992a16a0def494255afe433fa3b693bad34eb1400a4b8b0d2d9e9bc049153d7e languageName: node linkType: hard @@ -5833,6 +5835,19 @@ __metadata: languageName: node linkType: hard +"@number-flow/react@npm:^0.5.5": + version: 0.5.5 + resolution: "@number-flow/react@npm:0.5.5" + dependencies: + esm-env: ^1.1.4 + number-flow: 0.5.3 + peerDependencies: + react: ^18 || ^19 + react-dom: ^18 || ^19 + checksum: bca52861a6dda9e0b0e19ae3f2b909a1e49ba033347865693b73226092fd071f96aafb88b985ecefbc5021894fe89c91531499de547b670bb7b912d6eddad89c + languageName: node + linkType: hard + "@opentelemetry/api@npm:>=1.0.0 <1.9.0": version: 1.8.0 resolution: "@opentelemetry/api@npm:1.8.0" @@ -7038,8 +7053,8 @@ __metadata: linkType: hard "@react-three/drei@npm:^9.113.0": - version: 9.121.4 - resolution: "@react-three/drei@npm:9.121.4" + version: 9.121.5 + resolution: "@react-three/drei@npm:9.121.5" dependencies: "@babel/runtime": ^7.26.0 "@mediapipe/tasks-vision": 0.10.17 @@ -7071,7 +7086,7 @@ __metadata: peerDependenciesMeta: react-dom: optional: true - checksum: ddb6bcc43741c783f07633131f496edf627b6a1ba45fcb07ca6aed85469b1bc367d81252e3c56ef8ddbd8b188db4caed9e2388ca87b7ba2e61cea10775d9f250 + checksum: 9724174836e4a8e9c7fc3864d2b0a4615452c214fb04a4dfa0cdfe36c985d5800f91d0617507e481740e23f282cd5d4c9b05300ef50b342b3d09ed263d81d9c1 languageName: node linkType: hard @@ -7295,6 +7310,76 @@ __metadata: languageName: node linkType: hard +"@shikijs/core@npm:2.3.2": + version: 2.3.2 + resolution: "@shikijs/core@npm:2.3.2" + dependencies: + "@shikijs/engine-javascript": 2.3.2 + "@shikijs/engine-oniguruma": 2.3.2 + "@shikijs/types": 2.3.2 + "@shikijs/vscode-textmate": ^10.0.1 + "@types/hast": ^3.0.4 + hast-util-to-html: ^9.0.4 + checksum: fe7851f11b08f5300925694d69c831c9be41a201820e73bb30ae26a7a7c87bc64c04a59ede23ce78a5c4fe66bd9b096e14e8dcc923a7947ae4922c0a31e488ca + languageName: node + linkType: hard + +"@shikijs/engine-javascript@npm:2.3.2": + version: 2.3.2 + resolution: "@shikijs/engine-javascript@npm:2.3.2" + dependencies: + "@shikijs/types": 2.3.2 + "@shikijs/vscode-textmate": ^10.0.1 + oniguruma-to-es: ^3.1.0 + checksum: f23d3c136a7c25446f1245b28ba45bbaaeda85b581e109d837d31edd56012c00e2bba307f6e212955ac95d5d3f464fec71defee56d9ebbf20a9ea58346028692 + languageName: node + linkType: hard + +"@shikijs/engine-oniguruma@npm:2.3.2": + version: 2.3.2 + resolution: "@shikijs/engine-oniguruma@npm:2.3.2" + dependencies: + "@shikijs/types": 2.3.2 + "@shikijs/vscode-textmate": ^10.0.1 + checksum: 47bc57b3d0d1589d7567202d17223efd297546021056aa4224ef78c1c233dd1e72cd58cab6f718293c3f29e0cc7e26a333f95158069e0ffe2879910eacbad5a9 + languageName: node + linkType: hard + +"@shikijs/langs@npm:2.3.2": + version: 2.3.2 + resolution: "@shikijs/langs@npm:2.3.2" + dependencies: + "@shikijs/types": 2.3.2 + checksum: 2ef72d4dc249cdc59a62175023e792810903e15780fcf75a5ec713459bd56fccf90e2aa5069a739e826d3cbbdc0e5f474ecc700a573debcd95f92158302ec926 + languageName: node + linkType: hard + +"@shikijs/themes@npm:2.3.2": + version: 2.3.2 + resolution: "@shikijs/themes@npm:2.3.2" + dependencies: + "@shikijs/types": 2.3.2 + checksum: cc3c3fe81355c9d1d7f036bae69fc32a8b84e2e309c2086346b04ca85013d55847f03dab88e1e39c6b2c4f51be063c84fb4f713175f7fb5deb65920600295ce0 + languageName: node + linkType: hard + +"@shikijs/types@npm:2.3.2": + version: 2.3.2 + resolution: "@shikijs/types@npm:2.3.2" + dependencies: + "@shikijs/vscode-textmate": ^10.0.1 + "@types/hast": ^3.0.4 + checksum: 177fabbadc978e6627e442952f8f05ebaddceed8c43efd2345e7e7291056abc3c2f2cfef2546cfd5687c9cfb32e5c020a6236ed4490f91d5ba916172522d140e + languageName: node + linkType: hard + +"@shikijs/vscode-textmate@npm:^10.0.1": + version: 10.0.1 + resolution: "@shikijs/vscode-textmate@npm:10.0.1" + checksum: c5a8490417b9439b055844c6c09c3435fc435b1fc3923eb28f05ee346fd68e69df2d93cdaab319a51193970558ff1bf49c5ab047c9ed4fd86c3f9d062457a565 + languageName: node + linkType: hard + "@shuding/opentype.js@npm:1.4.0-beta.0": version: 1.4.0-beta.0 resolution: "@shuding/opentype.js@npm:1.4.0-beta.0" @@ -7713,90 +7798,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-darwin-arm64@npm:1.10.15" +"@swc/core-darwin-arm64@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-darwin-arm64@npm:1.10.16" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-darwin-x64@npm:1.10.15" +"@swc/core-darwin-x64@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-darwin-x64@npm:1.10.16" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.15" +"@swc/core-linux-arm-gnueabihf@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.16" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-linux-arm64-gnu@npm:1.10.15" +"@swc/core-linux-arm64-gnu@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-arm64-gnu@npm:1.10.16" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-linux-arm64-musl@npm:1.10.15" +"@swc/core-linux-arm64-musl@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-arm64-musl@npm:1.10.16" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-linux-x64-gnu@npm:1.10.15" +"@swc/core-linux-x64-gnu@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-x64-gnu@npm:1.10.16" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-linux-x64-musl@npm:1.10.15" +"@swc/core-linux-x64-musl@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-x64-musl@npm:1.10.16" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-win32-arm64-msvc@npm:1.10.15" +"@swc/core-win32-arm64-msvc@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-win32-arm64-msvc@npm:1.10.16" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-win32-ia32-msvc@npm:1.10.15" +"@swc/core-win32-ia32-msvc@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-win32-ia32-msvc@npm:1.10.16" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.10.15": - version: 1.10.15 - resolution: "@swc/core-win32-x64-msvc@npm:1.10.15" +"@swc/core-win32-x64-msvc@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-win32-x64-msvc@npm:1.10.16" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.2.173": - version: 1.10.15 - resolution: "@swc/core@npm:1.10.15" - dependencies: - "@swc/core-darwin-arm64": 1.10.15 - "@swc/core-darwin-x64": 1.10.15 - "@swc/core-linux-arm-gnueabihf": 1.10.15 - "@swc/core-linux-arm64-gnu": 1.10.15 - "@swc/core-linux-arm64-musl": 1.10.15 - "@swc/core-linux-x64-gnu": 1.10.15 - "@swc/core-linux-x64-musl": 1.10.15 - "@swc/core-win32-arm64-msvc": 1.10.15 - "@swc/core-win32-ia32-msvc": 1.10.15 - "@swc/core-win32-x64-msvc": 1.10.15 + version: 1.10.16 + resolution: "@swc/core@npm:1.10.16" + dependencies: + "@swc/core-darwin-arm64": 1.10.16 + "@swc/core-darwin-x64": 1.10.16 + "@swc/core-linux-arm-gnueabihf": 1.10.16 + "@swc/core-linux-arm64-gnu": 1.10.16 + "@swc/core-linux-arm64-musl": 1.10.16 + "@swc/core-linux-x64-gnu": 1.10.16 + "@swc/core-linux-x64-musl": 1.10.16 + "@swc/core-win32-arm64-msvc": 1.10.16 + "@swc/core-win32-ia32-msvc": 1.10.16 + "@swc/core-win32-x64-msvc": 1.10.16 "@swc/counter": ^0.1.3 "@swc/types": ^0.1.17 peerDependencies: @@ -7825,7 +7910,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: ef7bef6e3b5f2bf8c04997e09360443511a22c0d1c4fc34aedc52b13a90ee54283bd185c8502cb74a397a88e6f041d020f2a2819113bfc20ece62b4cba2f4fda + checksum: f76ec3212aad317be38ff2345a5ad4402372017e22adadf211ec2910157d9feeee1304197eefd588de346b9a9106be518b82c25a7dd12dca8a8408a51212211c languageName: node linkType: hard @@ -8381,13 +8466,6 @@ __metadata: languageName: node linkType: hard -"@types/gensync@npm:^1.0.0": - version: 1.0.4 - resolution: "@types/gensync@npm:1.0.4" - checksum: 99c3aa0d3f1198973c7e51bea5947b815f3338ce89ce09a39ac8abb41cd844c5b95189da254ea45e50a395fe25fd215664d8ca76c5438814963597afb01f686e - languageName: node - linkType: hard - "@types/graceful-fs@npm:^4.1.3": version: 4.1.9 resolution: "@types/graceful-fs@npm:4.1.9" @@ -8406,6 +8484,15 @@ __metadata: languageName: node linkType: hard +"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "*" + checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 + languageName: node + linkType: hard + "@types/history@npm:^4.7.11": version: 4.7.11 resolution: "@types/history@npm:4.7.11" @@ -8545,6 +8632,15 @@ __metadata: languageName: node linkType: hard +"@types/mdast@npm:^4.0.0": + version: 4.0.4 + resolution: "@types/mdast@npm:4.0.4" + dependencies: + "@types/unist": "*" + checksum: 20c4e9574cc409db662a35cba52b068b91eb696b3049e94321219d47d34c8ccc99a142be5c76c80a538b612457b03586bc2f6b727a3e9e7530f4c8568f6282ee + languageName: node + linkType: hard + "@types/mime@npm:^1": version: 1.3.5 resolution: "@types/mime@npm:1.3.5" @@ -8576,11 +8672,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=13.7.0": - version: 22.13.1 - resolution: "@types/node@npm:22.13.1" + version: 22.13.4 + resolution: "@types/node@npm:22.13.4" dependencies: undici-types: ~6.20.0 - checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 + checksum: 39ecbd84fc2c6268c57f0479bc095cd304d2e97fee0b4ed7e6a77508aaadb28dc21be0ec91bf866ab2be822bf6c9749945795dbd6ba60e0851b50a967fd784b5 languageName: node linkType: hard @@ -8925,6 +9021,13 @@ __metadata: languageName: node linkType: hard +"@types/unist@npm:*, @types/unist@npm:^3.0.0": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 96e6453da9e075aaef1dc22482463898198acdc1eeb99b465e65e34303e2ec1e3b1ed4469a9118275ec284dc98019f63c3f5d49422f0e4ac707e5ab90fb3b71a + languageName: node + linkType: hard + "@types/unist@npm:^2, @types/unist@npm:^2.0.0, @types/unist@npm:^2.0.2, @types/unist@npm:^2.0.3": version: 2.0.11 resolution: "@types/unist@npm:2.0.11" @@ -9330,7 +9433,7 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" checksum: 64ed518f49c2b31f5b50f8570a1e37bde3b62f2460042c50f132430b2d869c4a6586f13aa33a58a4722715b8158c68cae2827389d6752ac54da2893c83e480fc @@ -12047,6 +12150,13 @@ __metadata: languageName: node linkType: hard +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 + languageName: node + linkType: hard + "chalk@npm:^2.3.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -12092,6 +12202,13 @@ __metadata: languageName: node linkType: hard +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d + languageName: node + linkType: hard + "character-entities-legacy@npm:^1.0.0": version: 1.1.4 resolution: "character-entities-legacy@npm:1.1.4" @@ -12099,6 +12216,13 @@ __metadata: languageName: node linkType: hard +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 + languageName: node + linkType: hard + "character-entities@npm:^1.0.0": version: 1.2.4 resolution: "character-entities@npm:1.2.4" @@ -12483,6 +12607,13 @@ __metadata: languageName: node linkType: hard +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: e3bf9e0332a5c45f49b90e79bcdb4a7a85f28d6a6f0876a94f1bb9b2bfbdbbb9292aac50e1e742d8c0db1e62a0229a106f57917e2d067fca951d81737651700d + languageName: node + linkType: hard + "command-line-args@npm:^5.1.1": version: 5.2.1 resolution: "command-line-args@npm:5.2.1" @@ -13799,6 +13930,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.0": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 + languageName: node + linkType: hard + "des.js@npm:^1.0.0": version: 1.1.0 resolution: "des.js@npm:1.1.0" @@ -13902,6 +14040,15 @@ __metadata: languageName: node linkType: hard +"devlop@npm:^1.0.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: ^2.0.0 + checksum: d2ff650bac0bb6ef08c48f3ba98640bb5fec5cce81e9957eb620408d1bab1204d382a45b785c6b3314dc867bb0684936b84c6867820da6db97cbb5d3c15dd185 + languageName: node + linkType: hard + "didyoumean@npm:^1.2.2": version: 1.2.2 resolution: "didyoumean@npm:1.2.2" @@ -14251,9 +14398,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.73": - version: 1.5.97 - resolution: "electron-to-chromium@npm:1.5.97" - checksum: e41173d90ab1c6b8d4767d7c2533f41545c8a37fbf288197137189773d0b630e00b7c54d0361c2f3357833dd41bfa79a6328cb739b34066abb708eae3c90c0fc + version: 1.5.100 + resolution: "electron-to-chromium@npm:1.5.100" + checksum: 14c54ba03bbe96a7cd9e8ae4eff01e3306e8a6932e643bee2b6543a1a48f5ff7418769736d133542fbf6ec4837e113aeb9b2d8859a3420ddd950d498f7bd2b06 languageName: node linkType: hard @@ -14294,6 +14441,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex-xs@npm:^1.0.0": + version: 1.0.0 + resolution: "emoji-regex-xs@npm:1.0.0" + checksum: c33be159da769836f83281f2802d90169093ebf3c2c1643d6801d891c53beac5ef785fd8279f9b02fa6dc6c47c367818e076949f1e13bd1b3f921b416de4cbea + languageName: node + linkType: hard + "emoji-regex@npm:^10.2.1, emoji-regex@npm:^10.3.0": version: 10.4.0 resolution: "emoji-regex@npm:10.4.0" @@ -14833,17 +14987,16 @@ __metadata: linkType: hard "eslint-import-resolver-typescript@npm:^3.5.2": - version: 3.7.0 - resolution: "eslint-import-resolver-typescript@npm:3.7.0" + version: 3.8.0 + resolution: "eslint-import-resolver-typescript@npm:3.8.0" dependencies: "@nolyfill/is-core-module": 1.0.39 debug: ^4.3.7 enhanced-resolve: ^5.15.0 - fast-glob: ^3.3.2 - get-tsconfig: ^4.7.5 + get-tsconfig: ^4.10.0 is-bun-module: ^1.0.2 - is-glob: ^4.0.3 stable-hash: ^0.0.4 + tinyglobby: ^0.2.10 peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -14853,7 +15006,7 @@ __metadata: optional: true eslint-plugin-import-x: optional: true - checksum: e24659fbd91957c9db8de72243a6ffcf891ffd1175bca54d6993a9ddecc352e76d512c7ee22a48ae7d3ec1ae4c492fd2ab649cde636a993f4a42bf4d1ae4d34a + checksum: 866f7eba778ca7ddbd99a468c7ad94b132d25b5c0426123da242159f4e9a07de0963fb8d68f71d4ddab9a595005acd36b79453efb91370ddf0449f12a551f62b languageName: node linkType: hard @@ -15209,6 +15362,13 @@ __metadata: languageName: node linkType: hard +"esm-env@npm:^1.1.4": + version: 1.2.2 + resolution: "esm-env@npm:1.2.2" + checksum: 3fb28f6f84b33219df8bf15ea0efcb1110512199014072a19e90c2ea37316dccb6309c90230d760c4c28a324ebc5ebecf0af809cefebe7558730bd6d401c93b5 + languageName: node + linkType: hard + "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -15770,6 +15930,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.4.2": + version: 6.4.3 + resolution: "fdir@npm:6.4.3" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: fa53e13c63e8c14add5b70fd47e28267dd5481ebbba4b47720ec25aae7d10a800ef0f2e33de350faaf63c10b3d7b64138925718832220d593f75e724846c736d + languageName: node + linkType: hard + "feed@npm:^4.2.2": version: 4.2.2 resolution: "feed@npm:4.2.2" @@ -16380,7 +16552,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.5": +"get-tsconfig@npm:^4.10.0": version: 4.10.0 resolution: "get-tsconfig@npm:4.10.0" dependencies: @@ -16895,6 +17067,25 @@ __metadata: languageName: node linkType: hard +"hast-util-to-html@npm:^9.0.4": + version: 9.0.4 + resolution: "hast-util-to-html@npm:9.0.4" + dependencies: + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + ccount: ^2.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-whitespace: ^3.0.0 + html-void-elements: ^3.0.0 + mdast-util-to-hast: ^13.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + stringify-entities: ^4.0.0 + zwitch: ^2.0.4 + checksum: 6b97f641bca4c1de66bd74dd5a965bc5fd5c4b8e09328448c4952226ebd691c107cc990ce4e29ccb1e6bfff0278d8956fc8159533456c167f94ae067b4b42b11 + languageName: node + linkType: hard + "hast-util-to-parse5@npm:^6.0.0": version: 6.0.0 resolution: "hast-util-to-parse5@npm:6.0.0" @@ -16908,6 +17099,15 @@ __metadata: languageName: node linkType: hard +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 41d93ccce218ba935dc3c12acdf586193c35069489c8c8f50c2aa824c00dec94a3c78b03d1db40fa75381942a189161922e4b7bca700b3a2cc779634c351a1e4 + languageName: node + linkType: hard + "hastscript@npm:^6.0.0": version: 6.0.0 resolution: "hastscript@npm:6.0.0" @@ -17067,6 +17267,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^3.0.0": + version: 3.0.0 + resolution: "html-void-elements@npm:3.0.0" + checksum: 59be397525465a7489028afa064c55763d9cccd1d7d9f630cca47137317f0e897a9ca26cef7e745e7cff1abc44260cfa407742b243a54261dfacd42230e94fce + languageName: node + linkType: hard + "html-webpack-plugin@npm:^5.5.0": version: 5.6.3 resolution: "html-webpack-plugin@npm:5.6.3" @@ -19819,6 +20026,23 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-hast@npm:^13.0.0": + version: 13.2.0 + resolution: "mdast-util-to-hast@npm:13.2.0" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@ungap/structured-clone": ^1.0.0 + devlop: ^1.0.0 + micromark-util-sanitize-uri: ^2.0.0 + trim-lines: ^3.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + checksum: 7e5231ff3d4e35e1421908437577fd5098141f64918ff5cc8a0f7a8a76c5407f7a3ee88d75f7a1f7afb763989c9f357475fa0ba8296c00aaff1e940098fe86a6 + languageName: node + linkType: hard + "mdast-util-to-string@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-to-string@npm:2.0.0" @@ -19954,6 +20178,48 @@ __metadata: languageName: node linkType: hard +"micromark-util-character@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" + dependencies: + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: e9e409efe4f2596acd44587e8591b722bfc041c1577e8fe0d9c007a4776fb800f9b3637a22862ad2ba9489f4bdf72bb547fce5767dbbfe0a5e6760e2a21c6495 + languageName: node + linkType: hard + +"micromark-util-encode@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: be890b98e78dd0cdd953a313f4148c4692cc2fb05533e56fef5f421287d3c08feee38ca679f318e740530791fc251bfe8c80efa926fcceb4419b269c9343d226 + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: d01517840c17de67aaa0b0f03bfe05fac8a41d99723cd8ce16c62f6810e99cd3695364a34c335485018e5e2c00e69031744630a1b85c6868aa2f2ca1b36daa2f + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: fb7346950550bc85a55793dda94a8b3cb3abc068dbd7570d1162db7aee803411d06c0a5de4ae59cd945f46143bdeadd4bba02a02248fa0d18cc577babaa00044 + languageName: node + linkType: hard + +"micromark-util-types@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-types@npm:2.0.1" + checksum: 630aac466628a360962f478f69421599c53ff8b3080765201b7be3b3a4be7f4c5b73632b9a6dd426b9e06035353c18acccee637d6c43d9b0bf1c31111bbb88a7 + languageName: node + linkType: hard + "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" @@ -20890,6 +21156,15 @@ __metadata: languageName: node linkType: hard +"number-flow@npm:0.5.3": + version: 0.5.3 + resolution: "number-flow@npm:0.5.3" + dependencies: + esm-env: ^1.1.4 + checksum: 308cb8cead83531cdff99419d3f03e698ee46e2766c9dc0720647fe65d7e162677587e704911718159bc6f88cd676a64e11ce311da693aeac2ea0e8a0e25bf22 + languageName: node + linkType: hard + "nwsapi@npm:^2.2.12, nwsapi@npm:^2.2.2": version: 2.2.16 resolution: "nwsapi@npm:2.2.16" @@ -21117,6 +21392,17 @@ __metadata: languageName: node linkType: hard +"oniguruma-to-es@npm:^3.1.0": + version: 3.1.0 + resolution: "oniguruma-to-es@npm:3.1.0" + dependencies: + emoji-regex-xs: ^1.0.0 + regex: ^6.0.1 + regex-recursion: ^6.0.2 + checksum: 2a2783f801cb7cc87f679ea47eecc0911a048417fab3d3117336818c4db5d71001ae492c7804bb52264835ee2c5a6ba44632e7b2c93aecaa51644c1881004ca9 + languageName: node + linkType: hard + "open@npm:^8.0.9, open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" @@ -21699,8 +21985,8 @@ __metadata: linkType: hard "pg@npm:^8.12.0": - version: 8.13.2 - resolution: "pg@npm:8.13.2" + version: 8.13.3 + resolution: "pg@npm:8.13.3" dependencies: pg-cloudflare: ^1.1.1 pg-connection-string: ^2.7.0 @@ -21716,7 +22002,7 @@ __metadata: peerDependenciesMeta: pg-native: optional: true - checksum: 5ff2525cf247917423e0cfd8f41b898e3023c9d435a023f94560c00fffce932668b1c6c39d07cca43d0b76120aa1faf283a48b9ff711d3843162f078a24334ee + checksum: e2e66d1e17addf8a89478b1a2c1c3654bbf006bc39af75b4677a5a4041b9b0e23d2389ccd3037250486afa3d7419d57cb4807409576aa72b1595bb3d65ba5086 languageName: node linkType: hard @@ -21743,6 +22029,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: a7a5188c954f82c6585720e9143297ccd0e35ad8072231608086ca950bee672d51b0ef676254af0788205e59bd4e4deb4e7708769226bed725bf13370a7d1464 + languageName: node + linkType: hard + "pidtree@npm:^0.6.0": version: 0.6.0 resolution: "pidtree@npm:0.6.0" @@ -22741,6 +23034,13 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^6.0.0": + version: 6.5.0 + resolution: "property-information@npm:6.5.0" + checksum: 6e55664e2f64083b715011e5bafaa1e694faf36986c235b0907e95d09259cc37c38382e3cc94a4c3f56366e05336443db12c8a0f0968a8c0a1b1416eebfc8f53 + languageName: node + linkType: hard + "protobufjs@npm:^7.2.5, protobufjs@npm:^7.2.6": version: 7.4.0 resolution: "protobufjs@npm:7.4.0" @@ -23784,6 +24084,31 @@ __metadata: languageName: node linkType: hard +"regex-recursion@npm:^6.0.2": + version: 6.0.2 + resolution: "regex-recursion@npm:6.0.2" + dependencies: + regex-utilities: ^2.3.0 + checksum: 29913751ee2e41d3d66c957136ba386046f5e9f780f4be482ad3b64b04258bbb2cebe87f8762c5247eb8c9fa46a5ecf18aba5d888f7def73ac8dea49165193d4 + languageName: node + linkType: hard + +"regex-utilities@npm:^2.3.0": + version: 2.3.0 + resolution: "regex-utilities@npm:2.3.0" + checksum: 41408777df45cefe1b276281030213235aa1143809c4c10eb5573d2cc27ff2c4aa746c6f4d4c235e3d2f4830eff76b28906ce82fbe72895beca8e15204c2da51 + languageName: node + linkType: hard + +"regex@npm:^6.0.1": + version: 6.0.1 + resolution: "regex@npm:6.0.1" + dependencies: + regex-utilities: ^2.3.0 + checksum: 80de1cd95cc760b609760de2e3831adc77166761315d53cad610f0fc545571403e4d8b3565db65df3a913d50eab59be2ab5b4635e52f363eab7991a76de0f7da + languageName: node + linkType: hard + "regexp-to-ast@npm:0.5.0": version: 0.5.0 resolution: "regexp-to-ast@npm:0.5.0" @@ -24395,7 +24720,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.2.0": +"schema-utils@npm:^3.0.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -24758,6 +25083,22 @@ __metadata: languageName: node linkType: hard +"shiki@npm:^2.1.0": + version: 2.3.2 + resolution: "shiki@npm:2.3.2" + dependencies: + "@shikijs/core": 2.3.2 + "@shikijs/engine-javascript": 2.3.2 + "@shikijs/engine-oniguruma": 2.3.2 + "@shikijs/langs": 2.3.2 + "@shikijs/themes": 2.3.2 + "@shikijs/types": 2.3.2 + "@shikijs/vscode-textmate": ^10.0.1 + "@types/hast": ^3.0.4 + checksum: 452f2cd2693cb46aee186496698cc007c151dea091916ef3ad229c1fd3f7f24ba5cecc5bd911413adf3bd5fcdda4da3d0d85e853decbc06527c603c2ed813ace + languageName: node + linkType: hard + "side-channel-list@npm:^1.0.0": version: 1.0.0 resolution: "side-channel-list@npm:1.0.0" @@ -25027,6 +25368,13 @@ __metadata: languageName: node linkType: hard +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 202e97d7ca1ba0758a0aa4fe226ff98142073bcceeff2da3aad037968878552c3bbce3b3231970025375bbba5aee00c5b8206eda408da837ab2dc9c0f26be990 + languageName: node + linkType: hard + "spdx-correct@npm:^3.0.0": version: 3.2.0 resolution: "spdx-correct@npm:3.2.0" @@ -25436,6 +25784,16 @@ __metadata: languageName: node linkType: hard +"stringify-entities@npm:^4.0.0": + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" + dependencies: + character-entities-html4: ^2.0.0 + character-entities-legacy: ^3.0.0 + checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 + languageName: node + linkType: hard + "stringify-object@npm:^3.3.0": version: 3.3.0 resolution: "stringify-object@npm:3.3.0" @@ -25793,7 +26151,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.3": +"terser-webpack-plugin@npm:^5.3.11, terser-webpack-plugin@npm:^5.3.3": version: 5.3.11 resolution: "terser-webpack-plugin@npm:5.3.11" dependencies: @@ -25816,8 +26174,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.31.1": - version: 5.38.2 - resolution: "terser@npm:5.38.2" + version: 5.39.0 + resolution: "terser@npm:5.39.0" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -25825,7 +26183,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 5e4eeff75533252509dd62b665185e3a37ceb6e04d5302e3a416860b5efbe51dbf1d6c5d5086e8bbc239ff695a38d69f5cddfb32424fd6267578e02aeed45457 + checksum: e39c302aed7a70273c8b03032c37c68c8d9d3b432a7b6abe89caf9d087f7dd94d743c01ee5ba1431a095ad347c4a680b60d258f298a097cf512346d6041eb661 languageName: node linkType: hard @@ -25981,6 +26339,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.10": + version: 0.2.10 + resolution: "tinyglobby@npm:0.2.10" + dependencies: + fdir: ^6.4.2 + picomatch: ^4.0.2 + checksum: 7e2ffe262ebc149036bdef37c56b32d02d52cf09efa7d43dbdab2ea3c12844a4da881058835ce4c74d1891190e5ad5ec5133560a11ec8314849b68ad0d99d3f4 + languageName: node + linkType: hard + "tldts-core@npm:^6.1.77": version: 6.1.77 resolution: "tldts-core@npm:6.1.77" @@ -26096,6 +26464,13 @@ __metadata: languageName: node linkType: hard +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: e241da104682a0e0d807222cc1496b92e716af4db7a002f4aeff33ae6a0024fef93165d49eab11aa07c71e1347c42d46563f91dfaa4d3fb945aa535cdead53ed + languageName: node + linkType: hard + "trim-newlines@npm:^3.0.0": version: 3.0.1 resolution: "trim-newlines@npm:3.0.1" @@ -26523,12 +26898,12 @@ __metadata: linkType: hard "typescript@npm:next": - version: 5.8.0-dev.20250212 - resolution: "typescript@npm:5.8.0-dev.20250212" + version: 5.8.0-dev.20250214 + resolution: "typescript@npm:5.8.0-dev.20250214" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: f1add365a49575f08a741bd83497e299a5e201e5d0eb477959d3ecc2baa1a346d87cc542900aa6b87ec2befd86a469eef09726c4e73003ab016d264043902888 + checksum: 5cb6f6240d4cc45ef7880b9aa14f027d89b5e73f7fb9d7e8157de2032865ea7a69f212fe7b0275cf56a39b181bf89b1908af4cf90e7664e9ea48b989dbc7dc29 languageName: node linkType: hard @@ -26563,12 +26938,12 @@ __metadata: linkType: hard "typescript@patch:typescript@next#~builtin": - version: 5.8.0-dev.20250212 - resolution: "typescript@patch:typescript@npm%3A5.8.0-dev.20250212#~builtin::version=5.8.0-dev.20250212&hash=85af82" + version: 5.8.0-dev.20250214 + resolution: "typescript@patch:typescript@npm%3A5.8.0-dev.20250214#~builtin::version=5.8.0-dev.20250214&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: d023e3de638428a865a5eac0ad55bac074d7f7523a1a62bf7988fe39998d44eff305920e5692bf303b903702afe74ae733ddd9d94c6dc6d487f8266811b2a284 + checksum: 4e735ef67713a9a334bd3578b4980f60a153ad85fa648dd4324f2ac7c0e9897b370c29dc2460578de5467b2c2e4a39ea386c36aac3948691fdc35d0fad4082c7 languageName: node linkType: hard @@ -26848,6 +27223,15 @@ __metadata: languageName: node linkType: hard +"unist-util-is@npm:^6.0.0": + version: 6.0.0 + resolution: "unist-util-is@npm:6.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: f630a925126594af9993b091cf807b86811371e465b5049a6283e08537d3e6ba0f7e248e1e7dab52cfe33f9002606acef093441137181b327f6fe504884b20e2 + languageName: node + linkType: hard + "unist-util-position@npm:^3.0.0": version: 3.1.0 resolution: "unist-util-position@npm:3.1.0" @@ -26855,6 +27239,15 @@ __metadata: languageName: node linkType: hard +"unist-util-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-position@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: f89b27989b19f07878de9579cd8db2aa0194c8360db69e2c99bd2124a480d79c08f04b73a64daf01a8fb3af7cba65ff4b45a0b978ca243226084ad5f5d441dde + languageName: node + linkType: hard + "unist-util-remove-position@npm:^2.0.0": version: 2.0.1 resolution: "unist-util-remove-position@npm:2.0.1" @@ -26882,6 +27275,15 @@ __metadata: languageName: node linkType: hard +"unist-util-stringify-position@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-stringify-position@npm:4.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: e2e7aee4b92ddb64d314b4ac89eef7a46e4c829cbd3ee4aee516d100772b490eb6b4974f653ba0717a0071ca6ea0770bf22b0a2ea62c65fcba1d071285e96324 + languageName: node + linkType: hard + "unist-util-visit-parents@npm:^3.0.0": version: 3.1.1 resolution: "unist-util-visit-parents@npm:3.1.1" @@ -26892,6 +27294,16 @@ __metadata: languageName: node linkType: hard +"unist-util-visit-parents@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-visit-parents@npm:6.0.1" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + checksum: 08927647c579f63b91aafcbec9966dc4a7d0af1e5e26fc69f4e3e6a01215084835a2321b06f3cbe7bf7914a852830fc1439f0fc3d7153d8804ac3ef851ddfa20 + languageName: node + linkType: hard + "unist-util-visit@npm:2.0.3, unist-util-visit@npm:^2.0.0, unist-util-visit@npm:^2.0.3": version: 2.0.3 resolution: "unist-util-visit@npm:2.0.3" @@ -26903,6 +27315,17 @@ __metadata: languageName: node linkType: hard +"unist-util-visit@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-visit@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 9ec42e618e7e5d0202f3c191cd30791b51641285732767ee2e6bcd035931032e3c1b29093f4d7fd0c79175bbc1f26f24f26ee49770d32be76f8730a652a857e6 + languageName: node + linkType: hard + "universalify@npm:^0.1.0, universalify@npm:^0.1.2": version: 0.1.2 resolution: "universalify@npm:0.1.2" @@ -27401,6 +27824,16 @@ __metadata: languageName: node linkType: hard +"vfile-message@npm:^4.0.0": + version: 4.0.2 + resolution: "vfile-message@npm:4.0.2" + dependencies: + "@types/unist": ^3.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 964e7e119f4c0e0270fc269119c41c96da20afa01acb7c9809a88365c8e0c64aa692fafbd952669382b978002ecd7ad31ef4446d85e8a22cdb62f6df20186c2d + languageName: node + linkType: hard + "vfile@npm:^4.0.0": version: 4.2.1 resolution: "vfile@npm:4.2.1" @@ -27413,6 +27846,16 @@ __metadata: languageName: node linkType: hard +"vfile@npm:^6.0.0": + version: 6.0.3 + resolution: "vfile@npm:6.0.3" + dependencies: + "@types/unist": ^3.0.0 + vfile-message: ^4.0.0 + checksum: 152b6729be1af70df723efb65c1a1170fd483d41086557da3651eea69a1dd1f0c22ea4344834d56d30734b9185bcab63e22edc81d3f0e9bed8aa4660d61080af + languageName: node + linkType: hard + "victory-vendor@npm:^36.6.8": version: 36.9.2 resolution: "victory-vendor@npm:36.9.2" @@ -27803,8 +28246,8 @@ __metadata: linkType: hard "webpack@npm:^5.73.0": - version: 5.97.1 - resolution: "webpack@npm:5.97.1" + version: 5.98.0 + resolution: "webpack@npm:5.98.0" dependencies: "@types/eslint-scope": ^3.7.7 "@types/estree": ^1.0.6 @@ -27824,9 +28267,9 @@ __metadata: loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 - schema-utils: ^3.2.0 + schema-utils: ^4.3.0 tapable: ^2.1.1 - terser-webpack-plugin: ^5.3.10 + terser-webpack-plugin: ^5.3.11 watchpack: ^2.4.1 webpack-sources: ^3.2.3 peerDependenciesMeta: @@ -27834,7 +28277,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 649065e2258b495ae41a4088be804b4be2ec07d280aa514ebef43da79caf96fa973d26a08826c3902b5676a098d9b37c589f16be7b4da17b68b08b6c76441196 + checksum: 0de353c694bc4d5af810e4f4d4fd356271b21b2253583a9f618416b5fcbaf8db5a5487c12cc1379778d2a07d56382293334153af6e2ce59ded59488f08015fd1 languageName: node linkType: hard @@ -28495,3 +28938,10 @@ __metadata: checksum: 28a1bebacab3bc60150b6b0a2ba1db2ad033f068e81f05e4892ec0ea13ae63f5d140a1d692062ac0657840c8da076f35b94433b5f1c329d7803b247de80f064a languageName: node linkType: hard + +"zwitch@npm:^2.0.4": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 + languageName: node + linkType: hard