From b826adf661e68d56e5ce37c77e7b60017edfbad4 Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Wed, 23 Oct 2024 15:14:55 -0700 Subject: [PATCH] move landing page to framer --- apps/dashboard/framer-rewrites.js | 7 + apps/dashboard/next-sitemap.config.js | 9 + apps/dashboard/next.config.js | 17 +- apps/dashboard/package.json | 1 - .../components/homepage/CodeBlock/index.tsx | 262 ------------------ .../components/homepage/sections/AnyEVM.tsx | 85 ------ .../homepage/sections/HeroSection.tsx | 175 ------------ .../homepage/sections/HomePageCard.tsx | 125 --------- .../homepage/sections/Solutions.tsx | 146 ---------- .../sections/WithoutThirdwebSection.tsx | 154 ---------- .../key-features/KeyFeatureLayout.tsx | 64 ----- .../src/components/partners/carousel.tsx | 92 ------ .../product-pages/common/nav/data.ts | 72 ----- apps/dashboard/src/page-id.ts | 2 - apps/dashboard/src/pages/index.tsx | 121 -------- apps/dashboard/src/tw-components/heading.tsx | 2 +- pnpm-lock.yaml | 18 -- 17 files changed, 25 insertions(+), 1327 deletions(-) create mode 100644 apps/dashboard/framer-rewrites.js delete mode 100644 apps/dashboard/src/components/homepage/CodeBlock/index.tsx delete mode 100644 apps/dashboard/src/components/homepage/sections/AnyEVM.tsx delete mode 100644 apps/dashboard/src/components/homepage/sections/HeroSection.tsx delete mode 100644 apps/dashboard/src/components/homepage/sections/HomePageCard.tsx delete mode 100644 apps/dashboard/src/components/homepage/sections/Solutions.tsx delete mode 100644 apps/dashboard/src/components/homepage/sections/WithoutThirdwebSection.tsx delete mode 100644 apps/dashboard/src/components/homepage/sections/key-features/KeyFeatureLayout.tsx delete mode 100644 apps/dashboard/src/components/partners/carousel.tsx delete mode 100644 apps/dashboard/src/pages/index.tsx diff --git a/apps/dashboard/framer-rewrites.js b/apps/dashboard/framer-rewrites.js new file mode 100644 index 00000000000..4d63379d6ca --- /dev/null +++ b/apps/dashboard/framer-rewrites.js @@ -0,0 +1,7 @@ +// add framer paths here +module.exports = [ + "/", + "/connect/sign-in", + "/contracts/modular-contracts", + "/unlimited-wallets", +]; diff --git a/apps/dashboard/next-sitemap.config.js b/apps/dashboard/next-sitemap.config.js index 80ee8ed639b..d7abcd76c5b 100644 --- a/apps/dashboard/next-sitemap.config.js +++ b/apps/dashboard/next-sitemap.config.js @@ -1,4 +1,5 @@ // @ts-check + /** * */ @@ -77,8 +78,16 @@ module.exports = { }; }, additionalPaths: async (config) => { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const FRAMER_PATHS = require("./framer-rewrites"); const allChains = await fetchChainsFromApi(); return [ + ...FRAMER_PATHS.map((path) => ({ + loc: path, + changefreq: config.changefreq, + priority: config.priority, + lastmod: config.autoLastmod ? new Date().toISOString() : undefined, + })), ...allChains.map((chain) => { return { loc: `/${chain.slug}`, diff --git a/apps/dashboard/next.config.js b/apps/dashboard/next.config.js index 227373c9556..b8d7e4509a1 100644 --- a/apps/dashboard/next.config.js +++ b/apps/dashboard/next.config.js @@ -6,7 +6,7 @@ const ContentSecurityPolicy = ` media-src * data: blob:; object-src 'none'; style-src 'self' 'unsafe-inline' vercel.live; - font-src 'self' vercel.live assets.vercel.com framerusercontent.com; + font-src 'self' vercel.live assets.vercel.com framerusercontent.com fonts.gstatic.com; frame-src * data:; script-src 'self' 'unsafe-eval' 'unsafe-inline' 'wasm-unsafe-eval' 'inline-speculation-rules' *.thirdweb.com *.thirdweb-dev.com vercel.live js.stripe.com framerusercontent.com events.framer.com challenges.cloudflare.com; connect-src * data: blob:; @@ -38,13 +38,7 @@ const securityHeaders = [ ]; const redirects = require("./redirects"); - -// add framer paths here -const FRAMER_PATHS = [ - "/connect/sign-in", - "/contracts/modular-contracts", - "/unlimited-wallets", -]; +const FRAMER_PATHS = require("./framer-rewrites"); /** * @returns {import('next').RemotePattern[]} @@ -135,6 +129,11 @@ const moduleExports = { source: "/thirdweb.eth/:path*", destination: "/deployer.thirdweb.eth/:path*", }, + // re-write /home to / (this is so that logged in users will be able to go to /home and NOT be redirected to the logged in app) + { + source: "/home", + destination: "/", + }, ...FRAMER_PATHS.map((path) => ({ source: path, destination: `https://landing.thirdweb.com${path}`, @@ -191,7 +190,7 @@ module.exports = withBundleAnalyzer( // An auth token is required for uploading source maps. authToken: process.env.SENTRY_AUTH_TOKEN, // Suppresses source map uploading logs during build - silent: false, + silent: true, // For all available options, see: // https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/ diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 31cb53a4a13..df6098dd4b5 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -87,7 +87,6 @@ "react-dropzone": "^14.2.9", "react-error-boundary": "^4.1.2", "react-hook-form": "7.52.0", - "react-intersection-observer": "^9.10.3", "react-markdown": "^9.0.1", "react-responsive-carousel": "^3.2.23", "react-table": "^7.8.0", diff --git a/apps/dashboard/src/components/homepage/CodeBlock/index.tsx b/apps/dashboard/src/components/homepage/CodeBlock/index.tsx deleted file mode 100644 index 56ad10d80f4..00000000000 --- a/apps/dashboard/src/components/homepage/CodeBlock/index.tsx +++ /dev/null @@ -1,262 +0,0 @@ -import { - Box, - Code, - type CodeProps, - Flex, - IconButton, - useColorModeValue, - useTheme, -} from "@chakra-ui/react"; -import { useClipboard } from "hooks/useClipboard"; -import { CheckIcon, CopyIcon, ZapIcon } from "lucide-react"; -import { Highlight, themes } from "prism-react-renderer"; -import { useEffect, useRef, useState } from "react"; -import { useInView } from "react-intersection-observer"; -import { Text } from "tw-components"; - -const darkThemeDefault = themes.vsDark; -const lightThemeDefault = themes.vsLight; - -type PrismTheme = typeof darkThemeDefault; - -interface CodeBlockProps extends Omit { - code: string; - language: string; - canCopy?: boolean; - wrap?: boolean; - prefix?: string; - darkTheme?: PrismTheme; - lightTheme?: PrismTheme; - autoType?: boolean; - typingSpeed?: number; - title?: string; - titleColor?: string; - // biome-ignore lint/suspicious/noExplicitAny: FIXME - containerHeight?: any; -} -export const HomePageCodeBlock: React.FC = ({ - code, - language, - px = 4, - py = 2, - w = "full", - borderRadius = "md", - borderColor = "borderColor", - borderWidth = "1px", - fontFamily = "mono", - backgroundColor, - prefix, - canCopy = true, - wrap = true, - darkTheme = themes.vsDark, - lightTheme, - autoType = false, - typingSpeed = 50, - title, - titleColor, - ...restCodeProps -}) => { - const { ref, inView } = useInView({ - threshold: 0.1, - triggerOnce: true, - }); - - const theme = useColorModeValue( - lightTheme || lightThemeDefault, - darkTheme || darkThemeDefault, - ); - const { onCopy, hasCopied } = useClipboard(code); - const [speedUpEnabled, setSpeedUpEnabled] = useState(false); - const [currentCodeIndex, setCurrentCodeIndex] = useState(0); - const [currentTypingSpeed] = useState(typingSpeed); - const containerRef = useRef(null); - - const chakraTheme = useTheme(); - - // legitimate use-case - // eslint-disable-next-line no-restricted-syntax - useEffect(() => { - if (!inView) { - return; - } - const interval = setInterval(() => { - if (currentCodeIndex < code.length) { - setCurrentCodeIndex((prev) => prev + 1); - } else { - // clear the interval when the code is fully typed - clearInterval(interval); - } - }, currentTypingSpeed); - - return () => clearInterval(interval); - }, [currentCodeIndex, currentTypingSpeed, code, inView]); - - // legitimate use-case - // eslint-disable-next-line no-restricted-syntax - useEffect(() => { - if (containerRef.current) { - containerRef.current.scrollTop = containerRef.current.scrollHeight; - } - }, []); - - return ( - - - - {canCopy && code && autoType && currentCodeIndex < code.length ? ( - { - setSpeedUpEnabled((prev) => { - setCurrentCodeIndex(code.length); - return !prev; - }); - }} - aria-label="Copy" - borderRadius="md" - variant="ghost" - colorScheme="gray" - size="sm" - icon={} - /> - ) : ( - - )} - {title && ( - - {title} - - )} - {canCopy && code && ( - - ) : ( - - ) - } - /> - )} - - - {({ className, style, tokens, getLineProps, getTokenProps }) => ( - -
- - {tokens.map((line, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: FIXME - - - {line.map((token, key) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: FIXME - - ))} - - ))} - -
-
- )} -
-
-
- ); -}; - -interface LineNumbersProps { - lineNumber: number; - lineHeight: string | number; - totalLines: number; -} - -const LineNumbers: React.FC = ({ - lineNumber, - lineHeight, - totalLines, -}) => { - const maxLineNumber = totalLines.toString().length; - const filledLineNumber = lineNumber.toString().padStart(maxLineNumber, " "); - return ( - - {filledLineNumber} - - ); -}; diff --git a/apps/dashboard/src/components/homepage/sections/AnyEVM.tsx b/apps/dashboard/src/components/homepage/sections/AnyEVM.tsx deleted file mode 100644 index e4634774d37..00000000000 --- a/apps/dashboard/src/components/homepage/sections/AnyEVM.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { Box, Flex, Image } from "@chakra-ui/react"; -import { HomepageSection } from "components/product-pages/homepage/HomepageSection"; -import { ZapIcon } from "lucide-react"; -import { Heading, LinkButton, Text } from "tw-components"; - -export const AnyEVMSection = () => { - return ( - - - - Build on 1,000+ EVM chains - - - Our tools work with any contract deployed on any EVM-compatible chain. - - - - } - color="black" - flexShrink={0} - background="rgba(255,255,255,1)" - _hover={{ - background: "rgba(255,255,255,0.9)!important", - }} - maxW="320px" - width="100%" - > - See the Chainlist - - - - - - - - ); -}; diff --git a/apps/dashboard/src/components/homepage/sections/HeroSection.tsx b/apps/dashboard/src/components/homepage/sections/HeroSection.tsx deleted file mode 100644 index 34db3393790..00000000000 --- a/apps/dashboard/src/components/homepage/sections/HeroSection.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import { Flex, SimpleGrid } from "@chakra-ui/react"; -import { ChakraNextImage } from "components/Image"; -import { HomepageSection } from "components/product-pages/homepage/HomepageSection"; -import { ZapIcon } from "lucide-react"; -import { useEffect, useState } from "react"; -import { Heading, Text, TrackedLink, TrackedLinkButton } from "tw-components"; -import { getCookie } from "../../../stores/SyncStoreToCookies"; -import { Aurora } from "../Aurora"; -import styles from "../category/categories.module.css"; -import { OpenSource } from "../open-source/OpenSource"; - -interface HeroSectionProps { - TRACKING_CATEGORY: string; -} - -export const HeroSection = ({ TRACKING_CATEGORY }: HeroSectionProps) => { - return ( - - {/* top */} - - - - - - - Full-stack, {" "} - web3 development platform - - - - Frontend, backend, and onchain tools to build complete web3 apps — - on every EVM chain. - - - - - - - See the docs - - - - - - - - - - - - - - - - - - - - - - - ); -}; - -function GetStartedButtonLink(props: { - trackingCategory: string; - showTeamLayout?: boolean; -}) { - // using state+effect here to avoid hydration errors - const [showTeamLayout, setShowTeamLayout] = useState(false); - // eslint-disable-next-line no-restricted-syntax - useEffect(() => { - if (getCookie("x-dashboard-type") === "team") { - setShowTeamLayout(true); - } - }, []); - - return ( - } - py={6} - px={8} - w="full" - bgColor="white" - _hover={{ - bgColor: "white", - opacity: 0.8, - }} - color="black" - href={showTeamLayout ? "/team" : "/dashboard"} - category={props.trackingCategory} - label="get-started" - fontWeight="bold" - maxW={{ base: "full", sm: "fit-content" }} - > - Get started - - ); -} diff --git a/apps/dashboard/src/components/homepage/sections/HomePageCard.tsx b/apps/dashboard/src/components/homepage/sections/HomePageCard.tsx deleted file mode 100644 index 625053c3b43..00000000000 --- a/apps/dashboard/src/components/homepage/sections/HomePageCard.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { Container, Flex, SimpleGrid } from "@chakra-ui/react"; -import { ChakraNextImage } from "components/Image"; -import { LandingDesktopMobileImage } from "components/landing-pages/desktop-mobile-image"; -import { ZapIcon } from "lucide-react"; -import type { StaticImageData } from "next/image"; -import type { ReactNode } from "react"; -import { Heading, Text, TrackedLinkButton } from "tw-components"; - -interface HomePageCardProps { - title: string; - description: string; - miniImage: StaticImageData; - miniTitle: string; - ctaLink: string; - ctaText: string; - label: string; - customContactUsComponent?: ReactNode; - image: StaticImageData; - mobileImage?: StaticImageData; - TRACKING_CATEGORY: string; -} - -const HomePageCard = ({ - title, - description, - miniImage, - miniTitle, - image, - mobileImage, - ctaLink, - customContactUsComponent, - ctaText, - label, - TRACKING_CATEGORY, -}: HomePageCardProps) => { - return ( - - - - - - - - - - {miniTitle} - - - - - {title} - - - - {description} - - - - } - > - {ctaText} - - - {customContactUsComponent && customContactUsComponent} - - - - - - - - - ); -}; - -export default HomePageCard; diff --git a/apps/dashboard/src/components/homepage/sections/Solutions.tsx b/apps/dashboard/src/components/homepage/sections/Solutions.tsx deleted file mode 100644 index e7ad8db16f0..00000000000 --- a/apps/dashboard/src/components/homepage/sections/Solutions.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { - Flex, - Image, - LinkBox, - LinkOverlay, - SimpleGrid, -} from "@chakra-ui/react"; -import { HomepageSection } from "components/product-pages/homepage/HomepageSection"; -import { Heading, Text, TrackedLink } from "tw-components"; -import { Aurora } from "../Aurora"; - -interface SolutionCardProps { - title: string; - description: React.ReactNode; - img: string; - gradient: string; - href: string; - hoverBorderColor: string; -} - -const solutions: SolutionCardProps[] = [ - { - title: "Gaming", - gradient: "linear-gradient(90deg, #A79AF9, #7AA8D2)", - description: - "The complete web3 game development toolkit — with wallets to onboard users, contracts for onchain assets, fiat & crypto payments, infrastructure to scale your game. Cross-platform support.", - img: "/assets/landingpage/GamingKit.png", - href: "/solutions/gaming", - hoverBorderColor: "hsl(248deg 89% 79% / 15%)", - }, - { - title: "Chains", - gradient: "linear-gradient(90deg, #E8B3E0, #A45B99)", - description: - "Launch a production-ready L2, L3, or appchain and bring developers to your ecosystem — with account abstraction, payments, & RPCs handled for you.", - img: "/assets/landingpage/chains-solutions.png", - href: "/solutions/chains", - hoverBorderColor: "hsl(309deg 54% 81% / 15%)", - }, - { - title: "Minting", - gradient: "linear-gradient(90deg, #8e0eff, #16bdf0)", - description: - "Mint and distribute NFTs at scale — with frontend UI components, smart contracts for every use case, and robust APIs with backend wallets & nonce management.", - img: "/assets/solutions-pages/minting/hero.png", - href: "/solutions/minting", - hoverBorderColor: "hsl(309deg 54% 81% / 15%)", - }, -]; - -const SolutionCard: React.FC = ({ - title, - description, - img, - gradient, - href, - hoverBorderColor, -}) => { - return ( - - - -
- - - {title} - - - - {description} - -
-
-
- ); -}; - -export const SolutionsSection: React.FC = () => { - return ( - - - - - - - Solutions for every web3 app - - - {solutions.map((feature) => ( - - ))} - - - ); -}; diff --git a/apps/dashboard/src/components/homepage/sections/WithoutThirdwebSection.tsx b/apps/dashboard/src/components/homepage/sections/WithoutThirdwebSection.tsx deleted file mode 100644 index c9241924e73..00000000000 --- a/apps/dashboard/src/components/homepage/sections/WithoutThirdwebSection.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import { GridItem, SimpleGrid } from "@chakra-ui/react"; -import { themes } from "prism-react-renderer"; -import { HomePageCodeBlock } from "../CodeBlock"; -import { KeyFeatureLayout } from "./key-features/KeyFeatureLayout"; - -const darkTheme = themes.vsDark; - -const withThirdwebCode = `// Fetch all nfts from a erc721 contract on polygon. -import { createThirdwebClient, getContract } from "thirdweb"; -import { polygon } from "thirdweb/chains"; -import { getNFTs } from "thirdweb/extensions/erc721"; - -const client = createThirdwebClient({ clientId }); -const contract = getContract({ client, chain: polygon, address: "0x..." }); -const nfts = await getNFTs({ contract });`; - -const withoutThirdwebCode = `// Fetch all nfts from a erc721 contract on polygon. - -import { ethers, BigNumberish, BigNumber } from "ethers"; - -const provider = ethers.providers.getDefaultProvider( - "https://polygon-rpc.com/" -); -const contractAddress = "0x..."; - -// copy pasted from etherscan or contract project -const contractAbi = [ ... ]; - -const contract = new ethers.Contract(contractAddress, contractAbi, provider); - -async function ownerOf(tokenId: BigNumberish): Promise { - return await contract.ownerOf(tokenId); -} - -async function fetchTokenMetadata(tokenId: BigNumberish, tokenUri: string) { - const parsedUri = tokenUri.replace( - "{id}", - ethers.utils.hexZeroPad(BigNumber.from(tokenId).toHexString(), 32).slice(2) - ); - let jsonMetadata; - try { - const res = await fetch( - \`https://ipfs.io/ipfs/\${parsedUri.replace("ipfs://", "")}\` - ); - jsonMetadata = await res.json(); - } catch (err) { - const unparsedTokenIdUri = tokenUri.replace( - "{id}", - BigNumber.from(tokenId).toString() - ); - try { - const res = await fetch( - \`https://ipfs.io/ipfs/\${unparsedTokenIdUri.replace("ipfs://", "")}\` - ); - jsonMetadata = await res.json(); - } catch (e: any) { - console.warn( - \`failed to get token metadata: \${JSON.stringify({ - tokenId: tokenId.toString(), - tokenUri, - })} -- falling back to default metadata\` - ); - jsonMetadata = {}; - } - } - - return { - ...jsonMetadata, - id: BigNumber.from(tokenId).toString(), - uri: tokenUri, - }; -} - -async function getTokenMetadata(tokenId: BigNumberish) { - const tokenUri = await contract.tokenURI(tokenId); - if (!tokenUri) { - throw new Error("no token URI"); - } - return fetchTokenMetadata(tokenId, tokenUri); -} - -async function get(tokenId: BigNumberish) { - const [owner, metadata] = await Promise.all([ - ownerOf(tokenId).catch(() => ethers.constants.AddressZero), - getTokenMetadata(tokenId).catch(() => ({ - id: tokenId.toString(), - uri: "", - })), - ]); - return { owner, metadata, type: "ERC721", supply: 1 }; -} - -async function getAll(paginationStart?: number, pageCount?: number) { - const start = BigNumber.from(paginationStart || 0).toNumber(); - const count = BigNumber.from(pageCount || 1000).toNumber(); - - const maxSupply = await contract.totalSupply(); - const maxId = Math.min(maxSupply.toNumber(), start + count); - return await Promise.all( - [...Array(maxId - start).keys()].map((i) => get((start + i).toString())) - ); -} - -const nfts = await getAll();`; - -export const WithoutThirdwebSection: React.FC = () => { - return ( - - - -
- -
-
- -
- -
-
-
-
- ); -}; diff --git a/apps/dashboard/src/components/homepage/sections/key-features/KeyFeatureLayout.tsx b/apps/dashboard/src/components/homepage/sections/key-features/KeyFeatureLayout.tsx deleted file mode 100644 index b257d20fa16..00000000000 --- a/apps/dashboard/src/components/homepage/sections/key-features/KeyFeatureLayout.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { Flex } from "@chakra-ui/react"; -import { Heading, type HeadingProps, Text } from "tw-components"; -import type { ComponentWithChildren } from "types/component-with-children"; - -type LayoutProps = { - title: string; - titleGradient: HeadingProps["bgGradient"]; - headline: string; - description: string; -}; - -export const KeyFeatureLayout: ComponentWithChildren = ({ - title, - titleGradient, - headline, - description, - children, -}) => { - return ( - - - - {title} - - - {headline} - - - {description} - - - {children} - - ); -}; diff --git a/apps/dashboard/src/components/partners/carousel.tsx b/apps/dashboard/src/components/partners/carousel.tsx deleted file mode 100644 index e5c98af0ce6..00000000000 --- a/apps/dashboard/src/components/partners/carousel.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { Box, Flex, type LayoutProps } from "@chakra-ui/react"; -import type { ComponentWithChildren } from "types/component-with-children"; -import { PartnerLogo } from "./partner-logo"; -import styles from "./partner-logo.module.css"; - -const gap = { base: "40px", lg: "60px" }; - -const MarqueeGroup: ComponentWithChildren<{ - ariaHidden: boolean; - animationDirection?: "normal" | "reverse"; -}> = ({ ariaHidden, children, animationDirection = "normal" }) => { - return ( - - {children} - - ); -}; - -const Marquee: ComponentWithChildren<{ - animationDirection?: "normal" | "reverse"; - display?: LayoutProps["display"]; -}> = ({ children, display, animationDirection }) => { - return ( - - - {children} - - - {children} - - - ); -}; - -export const PartnerCarousel: React.FC = () => { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; diff --git a/apps/dashboard/src/components/product-pages/common/nav/data.ts b/apps/dashboard/src/components/product-pages/common/nav/data.ts index 677198e7940..c8eb8a7a509 100644 --- a/apps/dashboard/src/components/product-pages/common/nav/data.ts +++ b/apps/dashboard/src/components/product-pages/common/nav/data.ts @@ -396,75 +396,3 @@ export const DEVELOPER_RESOURCES: SectionItemProps[] = [ section: "tools", }, ]; - -export const metrics = [ - { - title: "Pixels", - description: - "Building a web3 game with a thriving ecosystem — with VIP memberships, in-game tokens, and digital assets that users own, on the blockchain.", - image: require("../../../../../public/assets/landingpage/pixels.png"), - mobileImage: require("../../../../../public/assets/landingpage/mobile-pixels.png"), - items: [ - { - title: "100k+", - description: "Daily Users", - }, - { - title: "1.5M+", - description: "Monthly Transactions", - colSpan: 2, - }, - { - title: "11k+", - description: "VIP Members", - }, - ], - href: "https://blog.thirdweb.com/case-studies/pixels-builds-an-onchain-ecosystem-for-its-web3-game", - hoverBackground: "#622AFF", - }, - { - title: "Coinbase", - description: - "Bringing onchain experiences to the real world — with seamless NFT creation, delivery, & transaction management via the Coinbase Wallet app.", - image: require("../../../../../public/assets/landingpage/coinbase.png"), - mobileImage: require("../../../../../public/assets/landingpage/mobile-coinbase.png"), - items: [ - { - title: "1,000+", - description: "Real-World Transactions", - colSpan: 2, - }, - { - title: "4 Weeks", - description: "Total Development Time", - colSpan: 2, - }, - ], - href: "https://blog.thirdweb.com/case-studies/coinbase-brings-onchain-experiences-to-life", - hoverBackground: "#0053FF", - }, - { - title: "Mirror", - description: - "Empowering creators to build engaged audiences with 'Subscribe to Mint' NFTs — rewarding loyal fans for subscribing to their publication.", - image: require("../../../../../public/assets/landingpage/mirror.png"), - mobileImage: require("../../../../../public/assets/landingpage/mobile-mirror.png"), - items: [ - { - title: "2M+", - description: "NFTs Minted", - }, - { - title: "1M+", - description: "New Subscribers", - colSpan: 2, - }, - { - title: "120+", - description: "Publications", - }, - ], - href: "https://blog.thirdweb.com/case-studies/mirror-creators-build-loyal-audiences-with-subscriber-nfts", - hoverBackground: "#007CFF", - }, -]; diff --git a/apps/dashboard/src/page-id.ts b/apps/dashboard/src/page-id.ts index 9db6c4ca7c3..ca8652985a1 100644 --- a/apps/dashboard/src/page-id.ts +++ b/apps/dashboard/src/page-id.ts @@ -6,8 +6,6 @@ export enum PageId { // --------------------------------------------------------------------------- // marketing / growth pages // --------------------------------------------------------------------------- - // thirdweb.com - Homepage = "homepage-landing", // thirdweb.com/contact-us ContactUs = "contact-us-page", diff --git a/apps/dashboard/src/pages/index.tsx b/apps/dashboard/src/pages/index.tsx deleted file mode 100644 index 0383ee66183..00000000000 --- a/apps/dashboard/src/pages/index.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { useForceDarkTheme } from "@/components/theme-provider"; -import { Box, Flex } from "@chakra-ui/react"; -import { HomepageFooter } from "components/footer/Footer"; -import { GetStartedSection } from "components/homepage/sections/GetStartedSection"; -import { HeroSection } from "components/homepage/sections/HeroSection"; -import HomePageCard from "components/homepage/sections/HomePageCard"; -import { NewsletterSection } from "components/homepage/sections/NewsletterSection"; -import { PricingSection } from "components/homepage/sections/PricingSection"; -import { SDKSection } from "components/homepage/sections/SDKSection"; -import { SolutionsSection } from "components/homepage/sections/Solutions"; -import { WithoutThirdwebSection } from "components/homepage/sections/WithoutThirdwebSection"; -import LandingCardWithMetrics from "components/landing-pages/card-with-metrics"; -import { PartnerCarousel } from "components/partners/carousel"; -import { HomepageTopNav } from "components/product-pages/common/Topnav"; -import { metrics } from "components/product-pages/common/nav/data"; -import { PageId } from "page-id"; -import { Suspense } from "react"; -import { Heading, Text } from "tw-components"; -import type { ThirdwebNextPage } from "utils/types"; -import { AnyEVMSection } from "../components/homepage/sections/AnyEVM"; - -const TRACKING_CATEGORY = "homepage"; - -const HomePage: ThirdwebNextPage = () => { - useForceDarkTheme(); - return ( - - - - - - - - - - - - - Trusted by the best - - - - Powering web3 apps across verticals — from onchain games to - creator platforms. - - - } - desktopColumns={3} - TRACKING_CATEGORY={TRACKING_CATEGORY} - metrics={metrics} - /> - - - - - - - - - - - - - - - ); -}; - -HomePage.pageId = PageId.Homepage; - -export default HomePage; diff --git a/apps/dashboard/src/tw-components/heading.tsx b/apps/dashboard/src/tw-components/heading.tsx index db404dda017..167bc583963 100644 --- a/apps/dashboard/src/tw-components/heading.tsx +++ b/apps/dashboard/src/tw-components/heading.tsx @@ -13,7 +13,7 @@ import { import type { ComponentWithChildren } from "types/component-with-children"; import { convertFontSizeToCSSVar } from "./utils/typography"; -export interface HeadingProps extends Omit { +interface HeadingProps extends Omit { size?: HeadingSizes; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7dcced55d1e..ab3c6eff607 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,9 +258,6 @@ importers: react-hook-form: specifier: 7.52.0 version: 7.52.0(react@18.3.1) - react-intersection-observer: - specifier: ^9.10.3 - version: 9.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-markdown: specifier: ^9.0.1 version: 9.0.1(@types/react@18.3.11)(react@18.3.1) @@ -12821,15 +12818,6 @@ packages: peerDependencies: react: ^16.8.4 || ^17.0.0 || ^18.0.0 - react-intersection-observer@9.13.1: - resolution: {integrity: sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw==} - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - react-dom: - optional: true - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -31114,12 +31102,6 @@ snapshots: dependencies: react: 18.3.1 - react-intersection-observer@9.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - react-is@16.13.1: {} react-is@17.0.2: {}