mirror of
https://github.com/AykutSarac/jsoncrack.com.git
synced 2025-02-04 01:32:54 +08:00
feat: update landing
This commit is contained in:
parent
6f5902b263
commit
800e66ca87
@ -13,6 +13,7 @@
|
|||||||
"analyze": "ANALYZE=true npm run build"
|
"analyze": "ANALYZE=true npm run build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@img-comparison-slider/react": "^8.0.2",
|
||||||
"@mantine/carousel": "^7.9.2",
|
"@mantine/carousel": "^7.9.2",
|
||||||
"@mantine/code-highlight": "^7.9.2",
|
"@mantine/code-highlight": "^7.9.2",
|
||||||
"@mantine/core": "^7.9.2",
|
"@mantine/core": "^7.9.2",
|
||||||
|
13
pnpm-lock.yaml
generated
13
pnpm-lock.yaml
generated
@ -5,6 +5,9 @@ settings:
|
|||||||
excludeLinksFromLockfile: false
|
excludeLinksFromLockfile: false
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@img-comparison-slider/react':
|
||||||
|
specifier: ^8.0.2
|
||||||
|
version: 8.0.2
|
||||||
'@mantine/carousel':
|
'@mantine/carousel':
|
||||||
specifier: ^7.9.2
|
specifier: ^7.9.2
|
||||||
version: 7.9.2(@mantine/core@7.9.2)(@mantine/hooks@7.9.2)(embla-carousel-react@8.1.3)(react-dom@18.3.1)(react@18.3.1)
|
version: 7.9.2(@mantine/core@7.9.2)(@mantine/hooks@7.9.2)(embla-carousel-react@8.1.3)(react-dom@18.3.1)(react@18.3.1)
|
||||||
@ -442,6 +445,12 @@ packages:
|
|||||||
resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
|
resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@img-comparison-slider/react@8.0.2:
|
||||||
|
resolution: {integrity: sha512-Him0yhbXpMXdnV6R3XE3LiXcMRhSXFMsbk6I7ct5HxO2YpK/BAGz3ub+7+akJRnK2XI7c3vQqvoIE507N1K4SA==}
|
||||||
|
dependencies:
|
||||||
|
img-comparison-slider: 8.0.6
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@isaacs/cliui@8.0.2:
|
/@isaacs/cliui@8.0.2:
|
||||||
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@ -2844,6 +2853,10 @@ packages:
|
|||||||
engines: {node: '>= 4'}
|
engines: {node: '>= 4'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/img-comparison-slider@8.0.6:
|
||||||
|
resolution: {integrity: sha512-ej4de7mWyjcXZvDgHq8K2a/dG8Vv+qYTdUjZa3cVILf316rLtDrHyGbh9fPvixmAFgbs30zTLfmaRDa7abjtzw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/immediate@3.0.6:
|
/immediate@3.0.6:
|
||||||
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
|
resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
BIN
public/assets/compare/free.webp
Normal file
BIN
public/assets/compare/free.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 131 KiB |
BIN
public/assets/compare/graph_free.webp
Normal file
BIN
public/assets/compare/graph_free.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 62 KiB |
BIN
public/assets/compare/graph_pro.webp
Normal file
BIN
public/assets/compare/graph_pro.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 83 KiB |
BIN
public/assets/compare/pro.webp
Normal file
BIN
public/assets/compare/pro.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 165 KiB |
@ -13,14 +13,27 @@ import {
|
|||||||
useMantineColorScheme,
|
useMantineColorScheme,
|
||||||
List,
|
List,
|
||||||
Anchor,
|
Anchor,
|
||||||
Alert,
|
Image,
|
||||||
|
ScrollArea,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
|
import styled from "styled-components";
|
||||||
|
import { ImgComparisonSlider } from "@img-comparison-slider/react";
|
||||||
import { IoMdArrowForward } from "react-icons/io";
|
import { IoMdArrowForward } from "react-icons/io";
|
||||||
import { MdCheck } from "react-icons/md";
|
import { MdCheck } from "react-icons/md";
|
||||||
import { gaEvent } from "src/lib/utils/gaEvent";
|
import { gaEvent } from "src/lib/utils/gaEvent";
|
||||||
import { PRICING } from "src/pages/pricing";
|
import { PRICING } from "src/pages/pricing";
|
||||||
import useUser from "src/store/useUser";
|
import useUser from "src/store/useUser";
|
||||||
|
|
||||||
|
const StyledImgComparisonSlider = styled(ImgComparisonSlider)`
|
||||||
|
--divider-width: 2px;
|
||||||
|
--divider-color: #515151;
|
||||||
|
--default-handle-opacity: 0.3;
|
||||||
|
--default-handle-color: #000;
|
||||||
|
border: 1px solid #999999;
|
||||||
|
overflow: hidden;
|
||||||
|
border-radius: 12px;
|
||||||
|
`;
|
||||||
|
|
||||||
const overlayLinks = {
|
const overlayLinks = {
|
||||||
monthly:
|
monthly:
|
||||||
"https://herowand.lemonsqueezy.com/buy/ce30521f-c7cc-44f3-9435-995d3260ba22?embed=1&media=0&logo=0&desc=0&discount=0&enabled=67805",
|
"https://herowand.lemonsqueezy.com/buy/ce30521f-c7cc-44f3-9435-995d3260ba22?embed=1&media=0&logo=0&desc=0&discount=0&enabled=67805",
|
||||||
@ -63,21 +76,15 @@ export const UpgradeModal = ({ opened, onClose }: ModalProps) => {
|
|||||||
</Text>
|
</Text>
|
||||||
}
|
}
|
||||||
centered
|
centered
|
||||||
size="md"
|
size="lg"
|
||||||
opened={opened}
|
opened={opened}
|
||||||
onClose={onClose}
|
onClose={onClose}
|
||||||
zIndex={202}
|
zIndex={202}
|
||||||
>
|
>
|
||||||
<Alert>
|
|
||||||
We made a new editor for larger data, faster work, and more features. If you use JSON Crack
|
|
||||||
already, upgrading to this new version will make things much better.
|
|
||||||
</Alert>
|
|
||||||
|
|
||||||
<Radio.Group
|
<Radio.Group
|
||||||
color="indigo"
|
color="indigo"
|
||||||
value={plan}
|
value={plan}
|
||||||
onChange={setPlan}
|
onChange={setPlan}
|
||||||
mt="md"
|
|
||||||
label="Select your plan:"
|
label="Select your plan:"
|
||||||
size="md"
|
size="md"
|
||||||
>
|
>
|
||||||
@ -117,7 +124,8 @@ export const UpgradeModal = ({ opened, onClose }: ModalProps) => {
|
|||||||
</Flex>
|
</Flex>
|
||||||
</Radio.Group>
|
</Radio.Group>
|
||||||
|
|
||||||
<Text mt="lg" fz="sm" fw="bold" mb="xs">
|
<ScrollArea.Autosize h={400} offsetScrollbars>
|
||||||
|
<Text mt="md" fz="sm" fw="bold" mb="xs">
|
||||||
What You Get
|
What You Get
|
||||||
</Text>
|
</Text>
|
||||||
<List
|
<List
|
||||||
@ -137,6 +145,26 @@ export const UpgradeModal = ({ opened, onClose }: ModalProps) => {
|
|||||||
</List.Item>
|
</List.Item>
|
||||||
</List>
|
</List>
|
||||||
|
|
||||||
|
<Paper mx="auto" maw="100%" mt="sm" w="fit-content">
|
||||||
|
<StyledImgComparisonSlider hover allowTransparency>
|
||||||
|
<Image
|
||||||
|
slot="first"
|
||||||
|
width={600}
|
||||||
|
src="./assets/compare/graph_pro.webp"
|
||||||
|
loading="lazy"
|
||||||
|
alt="Premium Editor"
|
||||||
|
/>
|
||||||
|
<Image
|
||||||
|
slot="second"
|
||||||
|
width={600}
|
||||||
|
src="./assets/compare/graph_free.webp"
|
||||||
|
loading="lazy"
|
||||||
|
alt="Free Editor"
|
||||||
|
/>
|
||||||
|
</StyledImgComparisonSlider>
|
||||||
|
</Paper>
|
||||||
|
</ScrollArea.Autosize>
|
||||||
|
|
||||||
<Divider my="md" />
|
<Divider my="md" />
|
||||||
<Flex align="center" justify="space-between">
|
<Flex align="center" justify="space-between">
|
||||||
<Flex h={32} align="center">
|
<Flex h={32} align="center">
|
||||||
|
@ -21,6 +21,7 @@ import {
|
|||||||
import { Carousel } from "@mantine/carousel";
|
import { Carousel } from "@mantine/carousel";
|
||||||
import "@mantine/carousel/styles.css";
|
import "@mantine/carousel/styles.css";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
|
import { ImgComparisonSlider } from "@img-comparison-slider/react";
|
||||||
import { BiChevronDown } from "react-icons/bi";
|
import { BiChevronDown } from "react-icons/bi";
|
||||||
import { FaGithub } from "react-icons/fa";
|
import { FaGithub } from "react-icons/fa";
|
||||||
import { IoSparklesSharp } from "react-icons/io5";
|
import { IoSparklesSharp } from "react-icons/io5";
|
||||||
@ -172,6 +173,14 @@ const StyledCarouselWrapper = styled.section`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const StyledImgComparisonSlider = styled(ImgComparisonSlider)`
|
||||||
|
--divider-width: 2px;
|
||||||
|
--divider-color: #515151;
|
||||||
|
--default-handle-opacity: 0.3;
|
||||||
|
--default-handle-color: #000;
|
||||||
|
overflow: hidden;
|
||||||
|
`;
|
||||||
|
|
||||||
const FAQ = [
|
const FAQ = [
|
||||||
{
|
{
|
||||||
title: "What is JSON Crack?",
|
title: "What is JSON Crack?",
|
||||||
@ -621,6 +630,31 @@ export const HomePage = () => {
|
|||||||
Pricing
|
Pricing
|
||||||
</Title>
|
</Title>
|
||||||
<PricingCards />
|
<PricingCards />
|
||||||
|
<Paper mx="auto" bg="transparent" my="lg" maw="70%" w="fit-content" visibleFrom="sm">
|
||||||
|
<StyledImgComparisonSlider
|
||||||
|
hover
|
||||||
|
style={{
|
||||||
|
border: "1px solid #999999",
|
||||||
|
overflow: "hidden",
|
||||||
|
borderRadius: 12,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Image
|
||||||
|
slot="first"
|
||||||
|
width={600}
|
||||||
|
src="./assets/compare/pro.webp"
|
||||||
|
loading="lazy"
|
||||||
|
alt="Premium Editor"
|
||||||
|
/>
|
||||||
|
<Image
|
||||||
|
slot="second"
|
||||||
|
width={600}
|
||||||
|
src="./assets/compare/free.webp"
|
||||||
|
loading="lazy"
|
||||||
|
alt="Free Editor"
|
||||||
|
/>
|
||||||
|
</StyledImgComparisonSlider>
|
||||||
|
</Paper>
|
||||||
|
|
||||||
<Container id="faq" component="section">
|
<Container id="faq" component="section">
|
||||||
<Title
|
<Title
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import Head from "next/head";
|
import Head from "next/head";
|
||||||
import Link from "next/link";
|
|
||||||
import {
|
import {
|
||||||
Flex,
|
Flex,
|
||||||
Stack,
|
Stack,
|
||||||
@ -22,15 +21,15 @@ import Layout from "src/layout/Layout";
|
|||||||
import { gaEvent } from "src/lib/utils/gaEvent";
|
import { gaEvent } from "src/lib/utils/gaEvent";
|
||||||
|
|
||||||
export const PRICING = {
|
export const PRICING = {
|
||||||
MONTHLY: 5,
|
MONTHLY: 6,
|
||||||
ANNUAL: 4,
|
ANNUAL: 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const purchaseLinks = {
|
export const purchaseLinks = {
|
||||||
monthly:
|
monthly:
|
||||||
"https://herowand.lemonsqueezy.com/checkout/buy/ce30521f-c7cc-44f3-9435-995d3260ba22?checkout[discount_code]=Q2MDE1MA&desc=0&enabled=67805",
|
"https://herowand.lemonsqueezy.com/checkout/buy/ce30521f-c7cc-44f3-9435-995d3260ba22?desc=0&enabled=67805",
|
||||||
annual:
|
annual:
|
||||||
"https://herowand.lemonsqueezy.com/checkout/buy/577928ea-fb09-4076-9307-3e5931b35ad0?checkout[discount_code]=Q5OTKYMW&desc=0&enabled=82417",
|
"https://herowand.lemonsqueezy.com/checkout/buy/577928ea-fb09-4076-9307-3e5931b35ad0?desc=0&enabled=82417",
|
||||||
};
|
};
|
||||||
|
|
||||||
const StyledPaperFree = styled(Paper)`
|
const StyledPaperFree = styled(Paper)`
|
||||||
@ -78,6 +77,7 @@ export const PricingCards = () => {
|
|||||||
<Text fw={500} size="xl" c="black">
|
<Text fw={500} size="xl" c="black">
|
||||||
Premium
|
Premium
|
||||||
</Text>
|
</Text>
|
||||||
|
{!isMonthly && (
|
||||||
<Badge
|
<Badge
|
||||||
size="lg"
|
size="lg"
|
||||||
variant="light"
|
variant="light"
|
||||||
@ -85,8 +85,9 @@ export const PricingCards = () => {
|
|||||||
ml="sm"
|
ml="sm"
|
||||||
leftSection={<FaArrowTrendDown />}
|
leftSection={<FaArrowTrendDown />}
|
||||||
>
|
>
|
||||||
%{isMonthly ? 16 : 20}
|
20%
|
||||||
</Badge>
|
</Badge>
|
||||||
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Flex gap="xs" align="baseline">
|
<Flex gap="xs" align="baseline">
|
||||||
@ -96,17 +97,11 @@ export const PricingCards = () => {
|
|||||||
<Text fz="md" fw={500} c="gray.6">
|
<Text fz="md" fw={500} c="gray.6">
|
||||||
/ mo
|
/ mo
|
||||||
</Text>
|
</Text>
|
||||||
<Text fz="xl" lts={1} c="dark" td="line-through" style={{ alignSelf: "start" }}>
|
|
||||||
${isMonthly ? PRICING.MONTHLY + 1 : PRICING.ANNUAL + 1}
|
|
||||||
</Text>
|
|
||||||
</Flex>
|
</Flex>
|
||||||
<Text fz="xs" c="gray.7">
|
<Text fz="xs" c="gray.7">
|
||||||
billed {isMonthly ? "monthly" : "annually"}
|
billed {isMonthly ? "monthly" : "annually"}
|
||||||
</Text>
|
</Text>
|
||||||
</Stack>
|
</Stack>
|
||||||
<Anchor c="dark" fz="sm" component={Link} h="fit-content" href="/#preview">
|
|
||||||
Preview
|
|
||||||
</Anchor>
|
|
||||||
</Flex>
|
</Flex>
|
||||||
<Button
|
<Button
|
||||||
component="a"
|
component="a"
|
||||||
@ -155,7 +150,7 @@ export const PricingCards = () => {
|
|||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Text c="gray.7" fw={500} fz="sm">
|
<Text c="gray.7" fw={500} fz="sm">
|
||||||
Edit directly on visualizations reflecting on data
|
Edit Nodes
|
||||||
</Text>
|
</Text>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item>
|
<List.Item>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user