diff --git a/apps/builder/assets/logos/StripeClimateLogo.tsx b/apps/builder/assets/logos/StripeClimateLogo.tsx index 415881091..b51e79ddb 100644 --- a/apps/builder/assets/logos/StripeClimateLogo.tsx +++ b/apps/builder/assets/logos/StripeClimateLogo.tsx @@ -18,8 +18,8 @@ export const StripeClimateLogo = (props: IconProps) => ( y2="7.8394" gradientTransform="matrix(1 0 0 -1 0 34)" > - - + + ( y2="17.2443" gradientTransform="matrix(1 0 0 -1 0 34)" > - - + + ( y2="29.1239" gradientTransform="matrix(1 0 0 -1 0 34)" > - - + + { return ( - + + Subscription Current workspace subscription: @@ -70,7 +70,7 @@ export const CurrentSubscriptionContent = ({ {isSubscribed && !isCancelling && ( <> - + Need to change payment method or billing information? Head over to your billing portal: diff --git a/apps/builder/components/dashboard/WorkspaceSettingsModal/BillingContent/UsageContent/UsageContent.tsx b/apps/builder/components/dashboard/WorkspaceSettingsModal/BillingContent/UsageContent/UsageContent.tsx index 493c00002..59c3e4311 100644 --- a/apps/builder/components/dashboard/WorkspaceSettingsModal/BillingContent/UsageContent/UsageContent.tsx +++ b/apps/builder/components/dashboard/WorkspaceSettingsModal/BillingContent/UsageContent/UsageContent.tsx @@ -127,13 +127,6 @@ export const UsageContent = ({ workspace }: Props) => { )} - { }) return ( - + {!canInviteNewMember && ( ( + + + + + +) diff --git a/apps/landing-page/assets/logos/StripeClimateLogo.tsx b/apps/landing-page/assets/logos/StripeClimateLogo.tsx index 415881091..b51e79ddb 100644 --- a/apps/landing-page/assets/logos/StripeClimateLogo.tsx +++ b/apps/landing-page/assets/logos/StripeClimateLogo.tsx @@ -18,8 +18,8 @@ export const StripeClimateLogo = (props: IconProps) => ( y2="7.8394" gradientTransform="matrix(1 0 0 -1 0 34)" > - - + + ( y2="17.2443" gradientTransform="matrix(1 0 0 -1 0 34)" > - - + + ( y2="29.1239" gradientTransform="matrix(1 0 0 -1 0 34)" > - - + + { return ( @@ -41,7 +41,7 @@ export const EasyBuildingExperience = () => { } href={`https://app.typebot.io/register`} variant="ghost" diff --git a/apps/landing-page/components/Homepage/EasyEmbed.tsx b/apps/landing-page/components/Homepage/EasyEmbed.tsx index 28e4215e9..5087be876 100644 --- a/apps/landing-page/components/Homepage/EasyEmbed.tsx +++ b/apps/landing-page/components/Homepage/EasyEmbed.tsx @@ -2,9 +2,9 @@ import { Flex, Stack, Heading, Box, Text, Button } from '@chakra-ui/react' import React from 'react' import Image from 'next/image' import nativeFeelingSrc from 'public/images/homepage/native-feeling.png' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' import { ArrowRight } from 'assets/icons/ArrowRight' import { Flare } from 'assets/illustrations/Flare' +import Link from 'next/link' export const EasyEmbed = () => { return ( @@ -42,7 +42,7 @@ export const EasyEmbed = () => { } href={`https://app.typebot.io/register`} variant="ghost" diff --git a/apps/landing-page/components/Homepage/EndCta.tsx b/apps/landing-page/components/Homepage/EndCta.tsx index 19da3b210..bfeb2eb73 100644 --- a/apps/landing-page/components/Homepage/EndCta.tsx +++ b/apps/landing-page/components/Homepage/EndCta.tsx @@ -1,5 +1,5 @@ import { Heading, Button, Text, Flex, VStack } from '@chakra-ui/react' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' +import Link from 'next/link' import React from 'react' import { BackgroundPolygons } from './Hero/BackgroundPolygons' @@ -31,7 +31,7 @@ export const EndCta = () => { { return ( @@ -52,7 +52,7 @@ export const Hero = () => { data-aos-delay="200" > { } href={`https://app.typebot.io/register`} variant="ghost" diff --git a/apps/landing-page/components/PricingPage/FreePlanCard.tsx b/apps/landing-page/components/PricingPage/FreePlanCard.tsx index fef84f5a3..42f652e6c 100644 --- a/apps/landing-page/components/PricingPage/FreePlanCard.tsx +++ b/apps/landing-page/components/PricingPage/FreePlanCard.tsx @@ -1,9 +1,8 @@ -import { chakra, Tooltip, Text } from '@chakra-ui/react' +import { chakra, Tooltip, Text, Button } from '@chakra-ui/react' import { HelpCircleIcon } from 'assets/icons/HelpCircleIcon' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' +import Link from 'next/link' import React from 'react' import { PricingCard } from './PricingCard' -import { ActionButton } from './PricingCard/ActionButton' export const FreePlanCard = () => ( ( ], }} button={ - - Get started - + Get started + } /> ) diff --git a/apps/landing-page/components/PricingPage/PlanComparisonTables.tsx b/apps/landing-page/components/PricingPage/PlanComparisonTables.tsx index 8d54361be..384595ef7 100644 --- a/apps/landing-page/components/PricingPage/PlanComparisonTables.tsx +++ b/apps/landing-page/components/PricingPage/PlanComparisonTables.tsx @@ -17,9 +17,10 @@ import { } from '@chakra-ui/react' import { CheckIcon } from 'assets/icons/CheckIcon' import { HelpCircleIcon } from 'assets/icons/HelpCircleIcon' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' import { Plan } from 'db' -import React from 'react' +import Link from 'next/link' +import React, { useEffect, useState } from 'react' +import { chatsLimit, formatPrice, storageLimit } from 'utils' type Props = { starterPrice: string @@ -31,6 +32,20 @@ export const PlanComparisonTables = ({ proPrice, ...props }: Props) => { + const [additionalChatsPrice, setAdditionalChatsPrice] = useState( + `$${chatsLimit.STARTER.increaseStep.price}` + ) + const [additionalStoragePrice, setAdditionalStoragePrice] = useState( + `$${storageLimit.STARTER.increaseStep.price}` + ) + + useEffect(() => { + setAdditionalChatsPrice(formatPrice(chatsLimit.STARTER.increaseStep.price)) + setAdditionalStoragePrice( + formatPrice(storageLimit.STARTER.increaseStep.price) + ) + }, []) + return ( @@ -61,8 +76,8 @@ export const PlanComparisonTables = ({ Additional Chats - $10 per 500 - $10 per 1,000 + {additionalChatsPrice} per 500 + {additionalChatsPrice} per 1,000 Storage @@ -73,8 +88,8 @@ export const PlanComparisonTables = ({ Additional Storage - $5 per 1 GB - $5 per 1 GB + {additionalStoragePrice} per 1 GB + {additionalStoragePrice} per 1 GB Members @@ -331,12 +346,9 @@ export const PlanComparisonTables = ({ Personal Free - + Get started - + @@ -345,12 +357,11 @@ export const PlanComparisonTables = ({ {starterPrice} / month - Subscribe - + @@ -359,12 +370,11 @@ export const PlanComparisonTables = ({ {proPrice} / month - Subscribe - + @@ -378,12 +388,12 @@ const TdWithTooltip = ({ text: string tooltip: string }) => ( - + {text} - + ) diff --git a/apps/landing-page/components/PricingPage/PricingCard/ActionButton.tsx b/apps/landing-page/components/PricingPage/PricingCard/ActionButton.tsx deleted file mode 100644 index 438d10474..000000000 --- a/apps/landing-page/components/PricingPage/PricingCard/ActionButton.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Button, ButtonProps } from '@chakra-ui/react' -import * as React from 'react' - -export const ActionButton = (props: ButtonProps) => ( - -) diff --git a/apps/landing-page/components/PricingPage/PricingCard/index.tsx b/apps/landing-page/components/PricingPage/PricingCard/index.tsx index d00578c8b..32a37edb7 100644 --- a/apps/landing-page/components/PricingPage/PricingCard/index.tsx +++ b/apps/landing-page/components/PricingPage/PricingCard/index.tsx @@ -9,13 +9,15 @@ import { VStack, } from '@chakra-ui/react' import * as React from 'react' +import { useEffect, useState } from 'react' +import { formatPrice } from 'utils' import { CheckCircleIcon } from '../../../assets/icons/CheckCircleIcon' import { Card, CardProps } from './Card' export interface PricingCardData { features: React.ReactNode[] name: string - price: string + price: number | string featureLabel?: string } @@ -32,8 +34,13 @@ export const PricingCard = ({ ...rest }: PricingCardProps) => { const { features, price, name } = data + const [formattedPrice, setFormattedPrice] = useState(price) const accentColor = useColorModeValue('blue.500', 'white') + useEffect(() => { + setFormattedPrice(typeof price === 'number' ? formatPrice(price) : price) + }, [price]) + return ( @@ -52,9 +59,9 @@ export const PricingCard = ({ my="8" > - {price} + {formattedPrice} - {(price.includes('$') || price.includes('€')) && ( + {typeof price === 'number' && ( / month diff --git a/apps/landing-page/components/PricingPage/ProPlanCard.tsx b/apps/landing-page/components/PricingPage/ProPlanCard.tsx index 505cca4c2..3cc43eadd 100644 --- a/apps/landing-page/components/PricingPage/ProPlanCard.tsx +++ b/apps/landing-page/components/PricingPage/ProPlanCard.tsx @@ -11,21 +11,19 @@ import { } from '@chakra-ui/react' import { ChevronDownIcon } from 'assets/icons/ChevronDownIcon' import { HelpCircleIcon } from 'assets/icons/HelpCircleIcon' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' import { Plan } from 'db' +import Link from 'next/link' import React, { useEffect, useState } from 'react' import { chatsLimit, computePrice, - formatPrice, parseNumberWithCommas, storageLimit, } from 'utils' import { PricingCard } from './PricingCard' -import { ActionButton } from './PricingCard/ActionButton' export const ProPlanCard = () => { - const [price, setPrice] = useState('89$') + const [price, setPrice] = useState(89) const [selectedChatsLimitIndex, setSelectedChatsLimitIndex] = useState(0) @@ -34,13 +32,11 @@ export const ProPlanCard = () => { useEffect(() => { setPrice( - formatPrice( - computePrice( - Plan.PRO, - selectedChatsLimitIndex ?? 0, - selectedStorageLimitIndex ?? 0 - ) ?? NaN - ) + computePrice( + Plan.PRO, + selectedChatsLimitIndex ?? 0, + selectedStorageLimitIndex ?? 0 + ) ?? NaN ) }, [selectedChatsLimitIndex, selectedStorageLimitIndex]) @@ -54,66 +50,64 @@ export const ProPlanCard = () => { 5 seats included , - - - - } - size="sm" - variant="outline" - isLoading={selectedChatsLimitIndex === undefined} - > - {selectedChatsLimitIndex !== undefined - ? parseNumberWithCommas( - chatsLimit.PRO.totalIncluded + - chatsLimit.PRO.increaseStep.amount * - selectedChatsLimitIndex - ) - : undefined} - - - {selectedChatsLimitIndex !== 0 && ( - setSelectedChatsLimitIndex(0)}> - {parseNumberWithCommas(chatsLimit.PRO.totalIncluded)} - - )} - {selectedChatsLimitIndex !== 1 && ( - setSelectedChatsLimitIndex(1)}> - {parseNumberWithCommas( - chatsLimit.PRO.totalIncluded + - chatsLimit.PRO.increaseStep.amount - )} - - )} - {selectedChatsLimitIndex !== 2 && ( - setSelectedChatsLimitIndex(2)}> - {parseNumberWithCommas( - chatsLimit.PRO.totalIncluded + - chatsLimit.PRO.increaseStep.amount * 2 - )} - - )} - {selectedChatsLimitIndex !== 3 && ( - setSelectedChatsLimitIndex(3)}> - {parseNumberWithCommas( - chatsLimit.PRO.totalIncluded + - chatsLimit.PRO.increaseStep.amount * 3 - )} - - )} - {selectedChatsLimitIndex !== 4 && ( - setSelectedChatsLimitIndex(4)}> - {parseNumberWithCommas( - chatsLimit.PRO.totalIncluded + - chatsLimit.PRO.increaseStep.amount * 4 - )} - - )} - - {' '} - chats/mo - + + + } + size="sm" + variant="outline" + isLoading={selectedChatsLimitIndex === undefined} + > + {selectedChatsLimitIndex !== undefined + ? parseNumberWithCommas( + chatsLimit.PRO.totalIncluded + + chatsLimit.PRO.increaseStep.amount * + selectedChatsLimitIndex + ) + : undefined} + + + {selectedChatsLimitIndex !== 0 && ( + setSelectedChatsLimitIndex(0)}> + {parseNumberWithCommas(chatsLimit.PRO.totalIncluded)} + + )} + {selectedChatsLimitIndex !== 1 && ( + setSelectedChatsLimitIndex(1)}> + {parseNumberWithCommas( + chatsLimit.PRO.totalIncluded + + chatsLimit.PRO.increaseStep.amount + )} + + )} + {selectedChatsLimitIndex !== 2 && ( + setSelectedChatsLimitIndex(2)}> + {parseNumberWithCommas( + chatsLimit.PRO.totalIncluded + + chatsLimit.PRO.increaseStep.amount * 2 + )} + + )} + {selectedChatsLimitIndex !== 3 && ( + setSelectedChatsLimitIndex(3)}> + {parseNumberWithCommas( + chatsLimit.PRO.totalIncluded + + chatsLimit.PRO.increaseStep.amount * 3 + )} + + )} + {selectedChatsLimitIndex !== 4 && ( + setSelectedChatsLimitIndex(4)}> + {parseNumberWithCommas( + chatsLimit.PRO.totalIncluded + + chatsLimit.PRO.increaseStep.amount * 4 + )} + + )} + + {' '} + chats/mo { , - - - - } - size="sm" - variant="outline" - isLoading={selectedStorageLimitIndex === undefined} - > - {selectedStorageLimitIndex !== undefined - ? parseNumberWithCommas( - storageLimit.PRO.totalIncluded + - storageLimit.PRO.increaseStep.amount * - selectedStorageLimitIndex - ) - : undefined} - - - {selectedStorageLimitIndex !== 0 && ( - setSelectedStorageLimitIndex(0)}> - {parseNumberWithCommas(storageLimit.PRO.totalIncluded)} - - )} - {selectedStorageLimitIndex !== 1 && ( - setSelectedStorageLimitIndex(1)}> - {parseNumberWithCommas( - storageLimit.PRO.totalIncluded + - storageLimit.PRO.increaseStep.amount - )} - - )} - {selectedStorageLimitIndex !== 2 && ( - setSelectedStorageLimitIndex(2)}> - {parseNumberWithCommas( - storageLimit.PRO.totalIncluded + - storageLimit.PRO.increaseStep.amount * 2 - )} - - )} - {selectedStorageLimitIndex !== 3 && ( - setSelectedStorageLimitIndex(3)}> - {parseNumberWithCommas( - storageLimit.PRO.totalIncluded + - storageLimit.PRO.increaseStep.amount * 3 - )} - - )} - {selectedStorageLimitIndex !== 4 && ( - setSelectedStorageLimitIndex(4)}> - {parseNumberWithCommas( - storageLimit.PRO.totalIncluded + - storageLimit.PRO.increaseStep.amount * 4 - )} - - )} - - {' '} - GB of storage - + + + } + size="sm" + variant="outline" + isLoading={selectedStorageLimitIndex === undefined} + > + {selectedStorageLimitIndex !== undefined + ? parseNumberWithCommas( + storageLimit.PRO.totalIncluded + + storageLimit.PRO.increaseStep.amount * + selectedStorageLimitIndex + ) + : undefined} + + + {selectedStorageLimitIndex !== 0 && ( + setSelectedStorageLimitIndex(0)}> + {parseNumberWithCommas(storageLimit.PRO.totalIncluded)} + + )} + {selectedStorageLimitIndex !== 1 && ( + setSelectedStorageLimitIndex(1)}> + {parseNumberWithCommas( + storageLimit.PRO.totalIncluded + + storageLimit.PRO.increaseStep.amount + )} + + )} + {selectedStorageLimitIndex !== 2 && ( + setSelectedStorageLimitIndex(2)}> + {parseNumberWithCommas( + storageLimit.PRO.totalIncluded + + storageLimit.PRO.increaseStep.amount * 2 + )} + + )} + {selectedStorageLimitIndex !== 3 && ( + setSelectedStorageLimitIndex(3)}> + {parseNumberWithCommas( + storageLimit.PRO.totalIncluded + + storageLimit.PRO.increaseStep.amount * 3 + )} + + )} + {selectedStorageLimitIndex !== 4 && ( + setSelectedStorageLimitIndex(4)}> + {parseNumberWithCommas( + storageLimit.PRO.totalIncluded + + storageLimit.PRO.increaseStep.amount * 4 + )} + + )} + + {' '} + GB of storage { borderWidth="3px" borderColor="blue.200" button={ - - Subscribe now - + Subscribe now + } /> ) diff --git a/apps/landing-page/components/PricingPage/StarterPlanCard.tsx b/apps/landing-page/components/PricingPage/StarterPlanCard.tsx index 166b936bf..e995599c9 100644 --- a/apps/landing-page/components/PricingPage/StarterPlanCard.tsx +++ b/apps/landing-page/components/PricingPage/StarterPlanCard.tsx @@ -11,8 +11,8 @@ import { } from '@chakra-ui/react' import { ChevronDownIcon } from 'assets/icons/ChevronDownIcon' import { HelpCircleIcon } from 'assets/icons/HelpCircleIcon' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' import { Plan } from 'db' +import Link from 'next/link' import React, { useEffect, useState } from 'react' import { chatsLimit, @@ -22,10 +22,9 @@ import { storageLimit, } from 'utils' import { PricingCard } from './PricingCard' -import { ActionButton } from './PricingCard/ActionButton' export const StarterPlanCard = () => { - const [price, setPrice] = useState('39$') + const [price, setPrice] = useState(39) const [selectedChatsLimitIndex, setSelectedChatsLimitIndex] = useState(0) @@ -34,13 +33,11 @@ export const StarterPlanCard = () => { useEffect(() => { setPrice( - formatPrice( - computePrice( - Plan.STARTER, - selectedChatsLimitIndex ?? 0, - selectedStorageLimitIndex ?? 0 - ) ?? NaN - ) + computePrice( + Plan.STARTER, + selectedChatsLimitIndex ?? 0, + selectedStorageLimitIndex ?? 0 + ) ?? NaN ) }, [selectedChatsLimitIndex, selectedStorageLimitIndex]) @@ -54,67 +51,62 @@ export const StarterPlanCard = () => { 2 seats included , - - - - } - size="sm" - variant="outline" - isLoading={selectedChatsLimitIndex === undefined} - colorScheme="orange" - > - {selectedChatsLimitIndex !== undefined - ? parseNumberWithCommas( - chatsLimit.STARTER.totalIncluded + - chatsLimit.STARTER.increaseStep.amount * - selectedChatsLimitIndex - ) - : undefined} - - - {selectedChatsLimitIndex !== 0 && ( - setSelectedChatsLimitIndex(0)}> - {parseNumberWithCommas(chatsLimit.STARTER.totalIncluded)} - - )} - {selectedChatsLimitIndex !== 1 && ( - setSelectedChatsLimitIndex(1)}> - {parseNumberWithCommas( - chatsLimit.STARTER.totalIncluded + - chatsLimit.STARTER.increaseStep.amount - )} - - )} - {selectedChatsLimitIndex !== 2 && ( - setSelectedChatsLimitIndex(2)}> - {parseNumberWithCommas( - chatsLimit.STARTER.totalIncluded + - chatsLimit.STARTER.increaseStep.amount * 2 - )} - - )} - {selectedChatsLimitIndex !== 3 && ( - setSelectedChatsLimitIndex(3)}> - {parseNumberWithCommas( - chatsLimit.STARTER.totalIncluded + - chatsLimit.STARTER.increaseStep.amount * 3 - )} - - )} - {selectedChatsLimitIndex !== 4 && ( - setSelectedChatsLimitIndex(4)}> - {parseNumberWithCommas( - chatsLimit.STARTER.totalIncluded + - chatsLimit.STARTER.increaseStep.amount * 4 - )} - - )} - - {' '} - chats/mo - + + + } + size="sm" + variant="outline" + colorScheme="orange" + > + {parseNumberWithCommas( + chatsLimit.STARTER.totalIncluded + + chatsLimit.STARTER.increaseStep.amount * + selectedChatsLimitIndex + )} + + + {selectedChatsLimitIndex !== 0 && ( + setSelectedChatsLimitIndex(0)}> + {parseNumberWithCommas(chatsLimit.STARTER.totalIncluded)} + + )} + {selectedChatsLimitIndex !== 1 && ( + setSelectedChatsLimitIndex(1)}> + {parseNumberWithCommas( + chatsLimit.STARTER.totalIncluded + + chatsLimit.STARTER.increaseStep.amount + )} + + )} + {selectedChatsLimitIndex !== 2 && ( + setSelectedChatsLimitIndex(2)}> + {parseNumberWithCommas( + chatsLimit.STARTER.totalIncluded + + chatsLimit.STARTER.increaseStep.amount * 2 + )} + + )} + {selectedChatsLimitIndex !== 3 && ( + setSelectedChatsLimitIndex(3)}> + {parseNumberWithCommas( + chatsLimit.STARTER.totalIncluded + + chatsLimit.STARTER.increaseStep.amount * 3 + )} + + )} + {selectedChatsLimitIndex !== 4 && ( + setSelectedChatsLimitIndex(4)}> + {parseNumberWithCommas( + chatsLimit.STARTER.totalIncluded + + chatsLimit.STARTER.increaseStep.amount * 4 + )} + + )} + + {' '} + chats/mo { , - - - - } - size="sm" - variant="outline" - isLoading={selectedStorageLimitIndex === undefined} - colorScheme="orange" - > - {selectedStorageLimitIndex !== undefined - ? parseNumberWithCommas( - storageLimit.STARTER.totalIncluded + - storageLimit.STARTER.increaseStep.amount * - selectedStorageLimitIndex - ) - : undefined} - - - {selectedStorageLimitIndex !== 0 && ( - setSelectedStorageLimitIndex(0)}> - {parseNumberWithCommas( - storageLimit.STARTER.totalIncluded - )} - - )} - {selectedStorageLimitIndex !== 1 && ( - setSelectedStorageLimitIndex(1)}> - {parseNumberWithCommas( - storageLimit.STARTER.totalIncluded + - storageLimit.STARTER.increaseStep.amount - )} - - )} - {selectedStorageLimitIndex !== 2 && ( - setSelectedStorageLimitIndex(2)}> - {parseNumberWithCommas( - storageLimit.STARTER.totalIncluded + - storageLimit.STARTER.increaseStep.amount * 2 - )} - - )} - {selectedStorageLimitIndex !== 3 && ( - setSelectedStorageLimitIndex(3)}> - {parseNumberWithCommas( - storageLimit.STARTER.totalIncluded + - storageLimit.STARTER.increaseStep.amount * 3 - )} - - )} - {selectedStorageLimitIndex !== 4 && ( - setSelectedStorageLimitIndex(4)}> - {parseNumberWithCommas( - storageLimit.STARTER.totalIncluded + - storageLimit.STARTER.increaseStep.amount * 4 - )} - - )} - - {' '} - GB of storage - + + + } + size="sm" + variant="outline" + isLoading={selectedStorageLimitIndex === undefined} + colorScheme="orange" + > + {selectedStorageLimitIndex !== undefined + ? parseNumberWithCommas( + storageLimit.STARTER.totalIncluded + + storageLimit.STARTER.increaseStep.amount * + selectedStorageLimitIndex + ) + : undefined} + + + {selectedStorageLimitIndex !== 0 && ( + setSelectedStorageLimitIndex(0)}> + {parseNumberWithCommas(storageLimit.STARTER.totalIncluded)} + + )} + {selectedStorageLimitIndex !== 1 && ( + setSelectedStorageLimitIndex(1)}> + {parseNumberWithCommas( + storageLimit.STARTER.totalIncluded + + storageLimit.STARTER.increaseStep.amount + )} + + )} + {selectedStorageLimitIndex !== 2 && ( + setSelectedStorageLimitIndex(2)}> + {parseNumberWithCommas( + storageLimit.STARTER.totalIncluded + + storageLimit.STARTER.increaseStep.amount * 2 + )} + + )} + {selectedStorageLimitIndex !== 3 && ( + setSelectedStorageLimitIndex(3)}> + {parseNumberWithCommas( + storageLimit.STARTER.totalIncluded + + storageLimit.STARTER.increaseStep.amount * 3 + )} + + )} + {selectedStorageLimitIndex !== 4 && ( + setSelectedStorageLimitIndex(4)}> + {parseNumberWithCommas( + storageLimit.STARTER.totalIncluded + + storageLimit.STARTER.increaseStep.amount * 4 + )} + + )} + + {' '} + GB of storage { borderWidth="1px" borderColor="orange.200" button={ - - Subscribe now - + Subscribe now + } /> ) diff --git a/apps/landing-page/components/common/Footer.tsx b/apps/landing-page/components/common/Footer.tsx index 49c145657..5b9fe6787 100644 --- a/apps/landing-page/components/common/Footer.tsx +++ b/apps/landing-page/components/common/Footer.tsx @@ -9,8 +9,8 @@ import { Stack, Text, } from '@chakra-ui/react' -import { NextChakraLink } from './nextChakraAdapters/NextChakraLink' import { Logo } from 'assets/icons/Logo' +import { TextLink } from './TextLink' const facebookGroupUrl = 'https://www.facebook.com/groups/typebot' const typebotLinkedInUrl = 'https://www.linkedin.com/company/typebot' @@ -35,64 +35,40 @@ export const Footer = () => { Made with ❤️ by{' '} - - @baptisteArno - + @baptisteArno Product - + Documentation - - + + Roadmap - - - Pricing - + + Pricing Community - + GitHub repository - - + + Facebook Group - - + + Twitter - - + + LinkedIn - + Company - - About - - - Contact - - - Terms of Service - - - Privacy Policy - + About + Contact + Terms of Service + Privacy Policy diff --git a/apps/landing-page/components/common/Header/Header.tsx b/apps/landing-page/components/common/Header/Header.tsx index 290ec63ca..680b30ab3 100755 --- a/apps/landing-page/components/common/Header/Header.tsx +++ b/apps/landing-page/components/common/Header/Header.tsx @@ -7,13 +7,13 @@ import { useColorModeValue as mode, useDisclosure, Box, + Link, } from '@chakra-ui/react' import { HamburgerIcon } from 'assets/icons' import { ChevronDownIcon } from 'assets/icons/ChevronDownIcon' import { CloseIcon } from 'assets/icons/CloseIcon' import { Logo } from 'assets/icons/Logo' import * as React from 'react' -import { NextChakraLink } from '../nextChakraAdapters/NextChakraLink' import { MobileMenu } from './MobileMenu' import { ResourcesMenu } from './ResourcesMenu' @@ -40,7 +40,7 @@ export const Header = () => { className="nav-content__mobile" color={mode('white', 'white')} > - + Typebot @@ -77,7 +77,7 @@ export const Header = () => { { Pricing { Sign in ( spacing={4} > ( Sign in ( Create a typebot ( Resources: {links[0].children?.map((link, idx) => ( ( {links[0].children?.map((item, idx) => ( - ( rounded="lg" _hover={{ bg: mode('gray.50', 'gray.600') }} _focus={{ shadow: 'outline' }} - isExternal={ + target={ item.href.startsWith('https') && !item.href.includes('app.typebot.io') + ? '_blank' + : undefined } > ( {item.description} - + ))} diff --git a/apps/landing-page/components/common/TextLink.tsx b/apps/landing-page/components/common/TextLink.tsx new file mode 100644 index 000000000..6092e0a3e --- /dev/null +++ b/apps/landing-page/components/common/TextLink.tsx @@ -0,0 +1,37 @@ +import Link, { LinkProps } from 'next/link' +import React from 'react' +import { Box, chakra, HStack, Stack, TextProps } from '@chakra-ui/react' +import { ExternalLinkIcon } from 'assets/icons/ExternalLinkIcon' + +type TextLinkProps = LinkProps & TextProps & { isExternal?: boolean } + +export const TextLink = ({ + children, + href, + shallow, + replace, + scroll, + prefetch, + isExternal, + ...textProps +}: TextLinkProps) => ( + + + {isExternal ? ( + + {children} + + + ) : ( + children + )} + + +) diff --git a/apps/landing-page/components/common/nextChakraAdapters/NextChakraLink.tsx b/apps/landing-page/components/common/nextChakraAdapters/NextChakraLink.tsx deleted file mode 100644 index 587df2cb6..000000000 --- a/apps/landing-page/components/common/nextChakraAdapters/NextChakraLink.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { PropsWithChildren } from 'react' -import NextLink from 'next/link' -import { LinkProps as NextLinkProps } from 'next/dist/client/link' -import { - Link as ChakraLink, - LinkProps as ChakraLinkProps, -} from '@chakra-ui/react' -import React from 'react' - -export type NextChakraLinkProps = PropsWithChildren< - NextLinkProps & Omit -> - -// Has to be a new component because both chakra and next share the `as` keyword -// eslint-disable-next-line react/display-name -export const NextChakraLink = React.forwardRef( - ( - { - href, - as, - replace, - scroll, - shallow, - prefetch, - children, - locale, - ...chakraProps - }: NextChakraLinkProps, - ref - ) => { - return ( - - {/*eslint-disable-next-line @typescript-eslint/ban-ts-comment*/} - {/*@ts-ignore*/} - - {children} - - - ) - } -) diff --git a/apps/landing-page/pages/about.tsx b/apps/landing-page/pages/about.tsx index 776086607..8bcd73bc4 100644 --- a/apps/landing-page/pages/about.tsx +++ b/apps/landing-page/pages/about.tsx @@ -5,7 +5,7 @@ import React from 'react' import selfie from '../public/images/about/selfie.png' import Image from 'next/image' import { Footer } from 'components/common/Footer' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' +import { TextLink } from 'components/common/TextLink' const AboutPage = () => { return ( @@ -67,12 +67,9 @@ const AboutPage = () => { If you have any questions, feel free to reach out to me at{' '} - + baptiste@typebot.io - + diff --git a/apps/landing-page/pages/pricing.tsx b/apps/landing-page/pages/pricing.tsx index 6fba252a2..db69de1f2 100644 --- a/apps/landing-page/pages/pricing.tsx +++ b/apps/landing-page/pages/pricing.tsx @@ -15,7 +15,6 @@ import { } from '@chakra-ui/react' import { Footer } from 'components/common/Footer' import { Header } from 'components/common/Header/Header' -import { NextChakraLink } from 'components/common/nextChakraAdapters/NextChakraLink' import { SocialMetaTags } from 'components/common/SocialMetaTags' import { BackgroundPolygons } from 'components/Homepage/Hero/BackgroundPolygons' import { PlanComparisonTables } from 'components/PricingPage/PlanComparisonTables' @@ -25,13 +24,13 @@ import { StripeClimateLogo } from 'assets/logos/StripeClimateLogo' import { FreePlanCard } from 'components/PricingPage/FreePlanCard' import { StarterPlanCard } from 'components/PricingPage/StarterPlanCard' import { ProPlanCard } from 'components/PricingPage/ProPlanCard' +import { TextLink } from 'components/common/TextLink' const Pricing = () => { const [starterPrice, setStarterPrice] = useState('$39') const [proPrice, setProPrice] = useState('$89') useEffect(() => { - if (typeof window === 'undefined') return setStarterPrice(formatPrice(prices.STARTER)) setProPrice(formatPrice(prices.PRO)) }, []) @@ -81,13 +80,9 @@ const Pricing = () => { Typebot is contributing 1% of your subscription to remove CO₂ from the atmosphere.{' '} - - More info. - + + More info + { Need custom limits? Specific features?{' '} - + Let's chat! - + @@ -195,12 +186,9 @@ const Faq = () => { Sure! Just{' '} - + shoot me an email - {' '} + {' '} and we'll figure things out 😀