From da4a17e7ab270d81e16520628c730b9e4c3ad362 Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Fri, 1 Nov 2024 11:02:01 -0700 Subject: [PATCH 1/2] Update free wallets promo code to FREEWALLETS24 --- apps/dashboard/src/components/notices/AnnouncementBanner.tsx | 4 ++-- .../src/components/settings/Account/Billing/CouponCard.tsx | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/dashboard/src/components/notices/AnnouncementBanner.tsx b/apps/dashboard/src/components/notices/AnnouncementBanner.tsx index 80b6a7e2366..4ae8e3e3035 100644 --- a/apps/dashboard/src/components/notices/AnnouncementBanner.tsx +++ b/apps/dashboard/src/components/notices/AnnouncementBanner.tsx @@ -53,8 +53,8 @@ function AnnouncementBanner(props: { export function UnlimitedWalletsBanner() { return ( ); diff --git a/apps/dashboard/src/components/settings/Account/Billing/CouponCard.tsx b/apps/dashboard/src/components/settings/Account/Billing/CouponCard.tsx index 93dcf204875..0bf0c18d46a 100644 --- a/apps/dashboard/src/components/settings/Account/Billing/CouponCard.tsx +++ b/apps/dashboard/src/components/settings/Account/Billing/CouponCard.tsx @@ -151,6 +151,8 @@ export function ApplyCouponCardUI(props: { res.data, // prod & dev values.promoCode === "FREEWALLETS" || + // new prod code + values.promoCode === "FREEWALLETS24" || values.promoCode === "TESTFREEWALLETS", ); } From 2e609bcce5b07cbdf2ff57a7612e76e5e96d73b5 Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Fri, 1 Nov 2024 11:08:42 -0700 Subject: [PATCH 2/2] move /engine and /solutions/gaming to framer --- apps/dashboard/framer-rewrites.js | 2 + .../homepage/open-source/OpenSource.tsx | 59 --- .../open-source/opensource.module.css | 57 --- .../homepage/sections/PricingEngine.tsx | 79 --- .../landing-pages/image-section-item.tsx | 51 -- .../components/landing-pages/splash-image.tsx | 89 ---- .../product-pages/common/ImageCard.tsx | 85 ---- apps/dashboard/src/page-id.ts | 2 - apps/dashboard/src/pages/engine.tsx | 394 --------------- apps/dashboard/src/pages/solutions/gaming.tsx | 449 ------------------ 10 files changed, 2 insertions(+), 1265 deletions(-) delete mode 100644 apps/dashboard/src/components/homepage/open-source/OpenSource.tsx delete mode 100644 apps/dashboard/src/components/homepage/open-source/opensource.module.css delete mode 100644 apps/dashboard/src/components/homepage/sections/PricingEngine.tsx delete mode 100644 apps/dashboard/src/components/landing-pages/image-section-item.tsx delete mode 100644 apps/dashboard/src/components/landing-pages/splash-image.tsx delete mode 100644 apps/dashboard/src/components/product-pages/common/ImageCard.tsx delete mode 100644 apps/dashboard/src/pages/engine.tsx delete mode 100644 apps/dashboard/src/pages/solutions/gaming.tsx diff --git a/apps/dashboard/framer-rewrites.js b/apps/dashboard/framer-rewrites.js index 4d63379d6ca..8f4cad3c6f0 100644 --- a/apps/dashboard/framer-rewrites.js +++ b/apps/dashboard/framer-rewrites.js @@ -4,4 +4,6 @@ module.exports = [ "/connect/sign-in", "/contracts/modular-contracts", "/unlimited-wallets", + "/engine", + "/solutions/gaming", ]; diff --git a/apps/dashboard/src/components/homepage/open-source/OpenSource.tsx b/apps/dashboard/src/components/homepage/open-source/OpenSource.tsx deleted file mode 100644 index 250709509e3..00000000000 --- a/apps/dashboard/src/components/homepage/open-source/OpenSource.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { TrackedLink } from "tw-components"; -import styles from "./opensource.module.css"; - -const thirdwebRepoUrl = "https://github.com/thirdweb-dev"; - -const GithubIcon = () => { - return ( - - GitHub - - - - - - - - - - ); -}; - -type OpenSourceProps = { - TRACKING_CATEGORY: string; -}; - -export const OpenSource: React.FC = ({ - TRACKING_CATEGORY, -}) => { - return ( - - - open-source - - - ); -}; diff --git a/apps/dashboard/src/components/homepage/open-source/opensource.module.css b/apps/dashboard/src/components/homepage/open-source/opensource.module.css deleted file mode 100644 index 3ffd7f18e1f..00000000000 --- a/apps/dashboard/src/components/homepage/open-source/opensource.module.css +++ /dev/null @@ -1,57 +0,0 @@ -@keyframes slideGradient { - from { - background-position: 0% 50%; - } - to { - background-position: -200% 50%; - } -} - -.animatedGradient { - cursor: pointer; - position: relative; - display: inline-block; /* Use inline-block for better control */ - background: linear-gradient(88deg, #fff 0%, #fff 50%, #9786df 60%, #fff 90%); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - background-size: 200% 100%; - animation: slideGradient 4s linear infinite; -} - -.animatedGradient:hover { - background: none; - color: #9786df; -} - -.githubIcon { - position: absolute; - top: 4px; - right: -24px; -} - -.animatedGradient:hover > .githubIcon > g > path { - fill: #9786df; -} - -@media screen and (max-width: 1166px) { - .githubIcon { - top: -10px; - right: -12px; - } -} - -@media screen and (max-width: 611px) { - .githubIcon { - top: -10px; - right: -12px; - } -} -@media screen and (max-width: 479px) { - .githubIcon { - width: 16px; - height: 16px; - top: -8px; - right: -8px; - } -} diff --git a/apps/dashboard/src/components/homepage/sections/PricingEngine.tsx b/apps/dashboard/src/components/homepage/sections/PricingEngine.tsx deleted file mode 100644 index 91c4e508d0e..00000000000 --- a/apps/dashboard/src/components/homepage/sections/PricingEngine.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { Box, Container, Flex, SimpleGrid } from "@chakra-ui/react"; -import { EngineTierCard } from "components/engine/create/tier-card"; -import { useTrack } from "hooks/analytics/useTrack"; -import { useRouter } from "next/router"; -import { Heading } from "tw-components"; - -interface PricingSectionProps { - trackingCategory: string; -} - -export const PricingEngineHomepage: React.FC = ({ - trackingCategory, -}) => { - const track = useTrack(); - const router = useRouter(); - return ( - - - - - Simple, transparent & flexible{" "} - - pricing for every team. - - - - - { - track({ - category: trackingCategory, - action: "click", - label: "clicked-cloud-hosted", - tier: "STANDARD", - }); - router.push("/dashboard/engine"); - }} - /> - - { - track({ - category: trackingCategory, - action: "click", - label: "clicked-cloud-hosted", - tier: "PREMIUM", - }); - router.push("/dashboard/engine"); - }} - /> - - { - track({ - category: trackingCategory, - action: "click", - label: "clicked-cloud-hosted", - tier: "ENTERPRISE", - }); - router.push("/contact-us"); - }} - /> - - - - ); -}; diff --git a/apps/dashboard/src/components/landing-pages/image-section-item.tsx b/apps/dashboard/src/components/landing-pages/image-section-item.tsx deleted file mode 100644 index 3958da739d8..00000000000 --- a/apps/dashboard/src/components/landing-pages/image-section-item.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Flex, type FlexProps } from "@chakra-ui/react"; -import type { StaticImageData } from "next/image"; -import { Text } from "tw-components"; -import { LandingDesktopMobileImage } from "./desktop-mobile-image"; - -type LandingImageSectionItemProps = { - image: StaticImageData; - mobileImage: StaticImageData; - title: string; - description: string; - maxHeightImage?: FlexProps["maxHeight"]; -} & FlexProps; - -const LandingImageSectionItem = ({ - mobileImage, - image, - title, - description, - maxHeightImage, - ...rest -}: LandingImageSectionItemProps) => { - return ( - - - - - - - {title} - - - {description && {description}} - - - ); -}; - -export default LandingImageSectionItem; diff --git a/apps/dashboard/src/components/landing-pages/splash-image.tsx b/apps/dashboard/src/components/landing-pages/splash-image.tsx deleted file mode 100644 index cf084da5135..00000000000 --- a/apps/dashboard/src/components/landing-pages/splash-image.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { Box, Container, Flex } from "@chakra-ui/react"; -import type { StaticImageData } from "next/image"; -import { Heading, Text } from "tw-components"; -import { LandingCTAButtons } from "./cta-buttons"; -import { LandingDesktopMobileImage } from "./desktop-mobile-image"; - -interface SplashImageProps { - title: string; - titleWithGradient: string; - subtitle: string; - trackingCategory: string; - ctaText?: string; - ctaLink?: string; - // biome-ignore lint/complexity/noBannedTypes: FIXME - lottie?: {}; - gradient: string; - image?: StaticImageData; - mobileImage?: StaticImageData; - noCta?: boolean; - contactUsTitle?: string; - contactUsLink?: string; -} - -export const SplashImage: React.FC = ({ - title, - titleWithGradient, - subtitle, - trackingCategory, - ctaText, - ctaLink, - gradient, - lottie, - image, - mobileImage, - noCta, - contactUsTitle, - contactUsLink, -}) => { - return ( - - - - - - {title}{" "} - - {titleWithGradient} - - - - - {subtitle} - - - - - - - - - - - - ); -}; diff --git a/apps/dashboard/src/components/product-pages/common/ImageCard.tsx b/apps/dashboard/src/components/product-pages/common/ImageCard.tsx deleted file mode 100644 index b121cc34c19..00000000000 --- a/apps/dashboard/src/components/product-pages/common/ImageCard.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { Box, Flex } from "@chakra-ui/react"; -import { ArrowRightIcon } from "lucide-react"; -import NextImage, { type StaticImageData } from "next/image"; -import { Card, Heading, TrackedLink } from "tw-components"; -import type { ComponentWithChildren } from "types/component-with-children"; - -interface ImageCardProps { - title: string; - image: StaticImageData; - TRACKING_CATEGORY: string; - linkTitle?: string; - category?: string; - label: string; - href: string; -} - -export const ImageCard: ComponentWithChildren = ({ - title, - image, - href, - linkTitle, - category, - TRACKING_CATEGORY, - label, - children, -}) => { - return ( - - - - - - {title} - - {category && ( - - {category} - - )} - - {children && ( - - {children} - - )} - {href && ( - - {linkTitle || Visit website} - - - )} - - - - ); -}; diff --git a/apps/dashboard/src/page-id.ts b/apps/dashboard/src/page-id.ts index ca8652985a1..33fcaf68b84 100644 --- a/apps/dashboard/src/page-id.ts +++ b/apps/dashboard/src/page-id.ts @@ -66,8 +66,6 @@ export enum PageId { // thirdweb.com/rpc-edge RPCEdgeLanding = "rpc-edge-landing", - // thirdweb.com/engine - EngineLanding = "engine-landing", // thirdweb.com/web3-dashboard DashboardLanding = "dashboard-landing", diff --git a/apps/dashboard/src/pages/engine.tsx b/apps/dashboard/src/pages/engine.tsx deleted file mode 100644 index 47e961b82ba..00000000000 --- a/apps/dashboard/src/pages/engine.tsx +++ /dev/null @@ -1,394 +0,0 @@ -import { Box, Container, Flex } from "@chakra-ui/react"; -import { PricingEngineHomepage } from "components/homepage/sections/PricingEngine"; -import { LandingCardWithImage } from "components/landing-pages/card-with-image"; -import LandingCardWithMetrics from "components/landing-pages/card-with-metrics"; -import { LandingEndCTA } from "components/landing-pages/end-cta"; -import { Gradients } from "components/landing-pages/gradients"; -import { LandingGridSection } from "components/landing-pages/grid-section"; -import { LandingGuidesShowcase } from "components/landing-pages/guide-showcase"; -import { LandingHeroWithSideImage } from "components/landing-pages/hero-with-side-image"; -import LandingImageSectionItem from "components/landing-pages/image-section-item"; -import { LandingLayout } from "components/landing-pages/layout"; -import { LandingSectionHeading } from "components/landing-pages/section-heading"; -import { SplashImage } from "components/landing-pages/splash-image"; -import { getAbsoluteUrl } from "lib/vercel-utils"; -import { PageId } from "page-id"; -import { Heading, Text } from "tw-components"; -import type { ThirdwebNextPage } from "utils/types"; -import { OpenSource } from "../components/homepage/open-source/OpenSource"; - -const TRACKING_CATEGORY = "engine-landing"; - -export const metrics = [ - { - title: "Stand With Crypto", - description: - "Championing clear crypto regulation to foster greater economic freedom via a grassroots advocacy hub.", - image: require("../../public/assets/product-pages/engine/casestudy-image-standwithcrypto.png"), - mobileImage: require("../../public/assets/product-pages/engine/casestudy-image-standwithcrypto.png"), - items: [ - { - title: "$87M+", - description: "Raised", - }, - { - title: "515k+", - description: "Crypto Advocates", - colSpan: 2, - }, - { - title: "165k+", - description: "Contacts", - }, - ], - href: "https://www.standwithcrypto.org/", - hoverBackground: "#0053FF", - }, - { - title: "InfiniGods", - description: - "Building a free-to-play web3 game universe — with interoperable onchain assets that players truly own.", - image: require("../../public/assets/product-pages/engine/casestudy-image-infinigods.png"), - mobileImage: require("../../public/assets/product-pages/engine/casestudy-image-infinigods.png"), - items: [ - { - title: "100k+", - description: "Daily Users", - }, - { - title: "1.5M+", - description: "Monthly Transactions", - colSpan: 2, - }, - { - title: "10k+", - description: "VIP Members", - }, - ], - href: "https://blog.thirdweb.com/case-studies/king-of-destiny-launches-avatar-nfts-thirdweb-engine/", - hoverBackground: "#25262B", - }, - { - title: "Coinbase Wallet", - description: - "Bringing onchain experiences to the real world — with seamless NFT creation, delivery, & transaction management.", - image: require("../../public/assets/product-pages/engine/casestudy-image-coinbase-wallet.png"), - mobileImage: require("../../public/assets/product-pages/engine/casestudy-image-coinbase-wallet.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", - }, -]; - -const GUIDES = [ - { - title: "The Quick-Start Guide to thirdweb Engine", - image: require("../../public/assets/product-pages/engine/guide-get-started.png"), - link: "https://portal.thirdweb.com/engine/get-started", - }, - { - title: "Airdrop Tokens and NFTs to Users", - image: require("../../public/assets/product-pages/engine/guide-airdrop.png"), - link: "https://portal.thirdweb.com/engine/guides/airdrop-nfts", - }, - { - title: "Create a Gasless NFT Mint Farcaster Frame", - image: require("../../public/assets/product-pages/engine/guide-farcaster-frame.png"), - link: "https://blog.thirdweb.com/guides/create-an-nft-mint-farcaster-frame/", - }, -]; - -const EngineLanding: ThirdwebNextPage = () => { - return ( - - - - - - - - APIs for web3 apps & games - - } - titleWithGradient="" - subtitle="Scalable smart contract APIs backed by secure wallets, with automatic nonce queuing & gas-optimized retries." - trackingCategory={TRACKING_CATEGORY} - ctaLink="/dashboard/engine" - ctaText="Get started" - contactUsTitle="Book a demo" - gradient="linear(to-r, #9786DF, #9786DF)" - lottie={require("../../public/assets/product-pages/engine/lottie.json")} - contactUsBg="#0E0E0E" - contactUsHover={{ background: "#0E0E0E" }} - /> - - - - - - - } - > - - - - - - - - - - - } - desktopColumns={4} - > - - - - - - - - - - - - - - - Trusted by the best - - - - thirdweb Engine powers the best onchain apps, integrating into - any backend at scale. - - - } - desktopColumns={3} - TRACKING_CATEGORY={TRACKING_CATEGORY} - metrics={metrics} - /> - - - - - - - - - - - ); -}; - -EngineLanding.pageId = PageId.EngineLanding; - -export default EngineLanding; diff --git a/apps/dashboard/src/pages/solutions/gaming.tsx b/apps/dashboard/src/pages/solutions/gaming.tsx deleted file mode 100644 index 9e99c4e1e12..00000000000 --- a/apps/dashboard/src/pages/solutions/gaming.tsx +++ /dev/null @@ -1,449 +0,0 @@ -import { Container, Flex, SimpleGrid } from "@chakra-ui/react"; -import LandingCardWithMetrics from "components/landing-pages/card-with-metrics"; -import { LandingEndCTA } from "components/landing-pages/end-cta"; -import { LandingGridSection } from "components/landing-pages/grid-section"; -import { LandingHero } from "components/landing-pages/hero"; -import { LandingIconSectionItem } from "components/landing-pages/icon-section-item"; -import { LandingLayout } from "components/landing-pages/layout"; -import { LandingOptionSelector } from "components/landing-pages/option-selector"; -import { ImageCard } from "components/product-pages/common/ImageCard"; -import { getAbsoluteUrl } from "lib/vercel-utils"; -import { PageId } from "page-id"; -import type { ReactNode } from "react"; -import { - Card, - type CardProps, - Heading, - Text, - TrackedLink, -} from "tw-components"; -import type { ThirdwebNextPage } from "utils/types"; - -const TRACKING_CATEGORY = "gaming_kit"; - -const SELECTOR_ITEMS = [ - { - title: "Frictionless onboarding experience", - description: - "Get users onboarded quickly with familiar email and social log-ins— we create game wallets on behalf of users. Purchases can be made via credit card, Apple/Google Pay.", - steps: [ - "User sign-in to app with their email or social log-in", - "Wallet is created on behalf of the user abstracting away crypto entirely", - "User interacts with app seamlessly— without disruptive transaction pop-ups", - ], - products: ["connect", "embedded-wallets", "smart-wallet"], - }, - { - title: "Uninterrupted game play", - description: - "Give users uninterrupted game play by removing disruptive transaction pop-ups. Generate on-chain transactions reliably and at scale on behalf of users.", - steps: [ - "User completes a level in game and is rewarded with an in-game digital asset", - "Developer sponsors the transaction so that user does not have to pay for gas fees", - "User receives in-game asset without any interruption to game play", - ], - products: [ - "embedded-wallets", - "smart-wallet", - "sponsored-transactions", - "engine", - ], - }, - { - title: "Subscription and All Access passes", - description: - "Create digital loyalty passes that provide access to early gameplay content, exclusive NFT drops, and in-game boosts", - steps: [ - "User selects a digital loyalty pass NFT when they login", - "Loyalty pass is used to unlock in-game experiences", - "User collects rewards to upgrade their loyalty pass", - ], - products: ["explore", "interact"], - }, - { - title: "Interoperable game ecosystems", - description: - "Give a unified interface to users to login across your gaming ecosystem with the flexibility to import/export their digital assets", - steps: [ - "User logs in using existing game login", - "Game links User's gaming wallet to game issued account", - "User selects assets they want to import and gives game scoped access to use assets for duration of game play", - ], - products: ["auth", "smart-wallet", "engine"], - }, - { - title: "Game appchain", - description: - "Connect seamlessly to any EVM compatible L1, L2 blockchains as well as build your game on your own app chain.", - steps: [ - "Game devs can add their app chain to thirdweb Dashboard and SDK's", - "An app chain landing page is generated with links to SDKs, contract deployment and infrastructure for their app chain", - "Developers can easily deploy contracts to their app chain in just a few clicks and get code snippets to integrate contracts into their games", - ], - products: ["rpc-edge", "explore", "interact", "engine"], - }, - { - title: "Marketplace for digital assets", - description: - "Generate revenue through the launch of your own on-chain marketplace", - steps: [ - "Deploy marketplace contract", - "Set % platform fee (% collected by game dev on every in-game asset sale, e.g. when buyer buys tokens from listing)", - "Players can list and trade NFTs for sale at a fixed price", - ], - products: ["explore", "interact", "engine", "storage"], - }, -]; - -export const metrics = [ - { - title: "Pixels", - description: - "Creating an open-world web3 game with a thriving ecosystem — with in-game tokens, VIP memberships, and digital assets that users own onchain.", - image: require("../../../public/assets/landingpage/pixels.png"), - mobileImage: require("../../../public/assets/landingpage/mobile-pixels.png"), - items: [], - href: "https://blog.thirdweb.com/case-studies/pixels-builds-an-onchain-ecosystem-for-its-web3-game", - hoverBackground: "#622AFF", - }, - { - title: "Gala Games", - description: - "Partnering with DreamWorks to integrate their brand IP into the VOXverse — and bringing fans onchain with interoperable digital collectibles.", - image: require("../../../public/assets/solutions-pages/gaming/case-study-gala.png"), - mobileImage: require("../../../public/assets/solutions-pages/gaming/mobile-case-study-gala.png"), - items: [], - href: "https://blog.thirdweb.com/case-studies/dreamworks-launches-nft-avatars-for-web3-games-with-gala-and-the-sims-creators-voxverse/", - hoverBackground: "#0053FF", - }, - { - title: "Paima Studios", - description: - "Bringing onchain games to all players — with instant onboarding, an `invisible` wallet experience, and the smoothest gameplay with signless & gasless UX.", - image: require("../../../public/assets/solutions-pages/gaming/case-study-ztx.png"), - mobileImage: require("../../../public/assets/solutions-pages/gaming/mobile-case-study-ztx.png"), - items: [], - href: "https://paimastudios.com", - hoverBackground: "#00B477", - }, -]; - -const SolutionsGamingCard = ({ - children, - href, - label, - ...rest -}: { children: ReactNode; href: string; label: string } & CardProps) => { - return ( - - - {children} - - - ); -}; - -const SolutionsGaming: ThirdwebNextPage = () => { - return ( - - - - - - - - - - - - Build games on any platform - - - - - - - - - - - Create new gaming universes - - - - A full-scale action RPG — built in 3 weeks using thirdweb's - Unity SDK. - - - - A simple web3 mobile game — gone viral & built in 2 days using - thirdweb. - - - - Guide your fowl through a fantastical landscape that requires - quick reflexes and precise timing. - - - - - - - - - The complete stack for web3 games - - - - Everything you need to build full-featured onchain games. - - - } - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Trusted by the best - - - - Powering web3 apps across verticals — from onchain games to - creator platforms. - - - } - desktopColumns={3} - TRACKING_CATEGORY={TRACKING_CATEGORY} - metrics={metrics} - /> - - - - - ); -}; - -SolutionsGaming.pageId = PageId.SolutionsGaming; - -export default SolutionsGaming;