mirror of
https://github.com/AykutSarac/jsoncrack.com.git
synced 2025-01-27 15:22:56 +08:00
feat: update landing
This commit is contained in:
parent
035f6b8baa
commit
80c82e25c9
@ -30,6 +30,11 @@ const Questions = [
|
|||||||
title: "Can I export the generated graphs?",
|
title: "Can I export the generated graphs?",
|
||||||
content: "Yes, you can export the generated graphs as PNG, JPEG, or SVG files.",
|
content: "Yes, you can export the generated graphs as PNG, JPEG, or SVG files.",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "How to use VS Code extension?",
|
||||||
|
content:
|
||||||
|
"You can use the VS Code extension to visualize JSON data directly in your editor. Install the extension from the VS Code marketplace and follow the instructions at extension's page.",
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export const FAQ = () => {
|
export const FAQ = () => {
|
||||||
|
@ -58,7 +58,7 @@ export const Features = () => {
|
|||||||
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
||||||
<Flex align="center" gap={8} mb={16}>
|
<Flex align="center" gap={8} mb={16}>
|
||||||
<FaBolt color="orange" size={24} />
|
<FaBolt color="orange" size={24} />
|
||||||
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
|
<Text c="gray.9" fz={{ base: 16, md: 18, lg: 24, xl: 26 }} fw={500}>
|
||||||
Real-time Visualization
|
Real-time Visualization
|
||||||
</Text>
|
</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
@ -77,7 +77,7 @@ export const Features = () => {
|
|||||||
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
||||||
<Flex align="center" gap={8} mb={16}>
|
<Flex align="center" gap={8} mb={16}>
|
||||||
<FaHeart color="#ff5555" size={26} />
|
<FaHeart color="#ff5555" size={26} />
|
||||||
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
|
<Text c="gray.9" fz={{ base: 16, md: 18, lg: 24, xl: 26 }} fw={500}>
|
||||||
Simple
|
Simple
|
||||||
</Text>
|
</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
@ -96,7 +96,7 @@ export const Features = () => {
|
|||||||
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
||||||
<Flex align="center" gap={8} mb={16}>
|
<Flex align="center" gap={8} mb={16}>
|
||||||
<FaMagic color="#8c0075" size={24} />
|
<FaMagic color="#8c0075" size={24} />
|
||||||
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
|
<Text c="gray.9" fz={{ base: 16, md: 18, lg: 24, xl: 26 }} fw={500}>
|
||||||
Generate
|
Generate
|
||||||
</Text>
|
</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
@ -116,7 +116,7 @@ export const Features = () => {
|
|||||||
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
||||||
<Flex align="center" gap={8} mb={16}>
|
<Flex align="center" gap={8} mb={16}>
|
||||||
<FaPalette color="#4890fd" size={24} />
|
<FaPalette color="#4890fd" size={24} />
|
||||||
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
|
<Text c="gray.9" fz={{ base: 16, md: 18, lg: 24, xl: 26 }} fw={500}>
|
||||||
Customizable
|
Customizable
|
||||||
</Text>
|
</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
@ -136,7 +136,7 @@ export const Features = () => {
|
|||||||
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
||||||
<Flex align="center" gap={8} mb={16}>
|
<Flex align="center" gap={8} mb={16}>
|
||||||
<FaShieldHalved color="black" size={24} />
|
<FaShieldHalved color="black" size={24} />
|
||||||
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
|
<Text c="gray.9" fz={{ base: 16, md: 18, lg: 24, xl: 26 }} fw={500}>
|
||||||
Privacy First
|
Privacy First
|
||||||
</Text>
|
</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
@ -156,7 +156,7 @@ export const Features = () => {
|
|||||||
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
|
||||||
<Flex align="center" gap={8} mb={16}>
|
<Flex align="center" gap={8} mb={16}>
|
||||||
<FaShapes color="#00a571" size={24} />
|
<FaShapes color="#00a571" size={24} />
|
||||||
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
|
<Text c="gray.9" fz={{ base: 16, md: 18, lg: 24, xl: 26 }} fw={500}>
|
||||||
Advanced Features
|
Advanced Features
|
||||||
</Text>
|
</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
@ -5,6 +5,7 @@ import styled from "styled-components";
|
|||||||
const StyledPreviewWrapper = styled.div`
|
const StyledPreviewWrapper = styled.div`
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
padding: 5rem 0;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const HeroPreview = () => {
|
export const HeroPreview = () => {
|
||||||
@ -54,13 +55,13 @@ export const HeroPreview = () => {
|
|||||||
onChange={setSelectedFeature}
|
onChange={setSelectedFeature}
|
||||||
orientation="vertical"
|
orientation="vertical"
|
||||||
withItemsBorders={false}
|
withItemsBorders={false}
|
||||||
color="grape"
|
|
||||||
bg="transparent"
|
bg="transparent"
|
||||||
|
color="orange.7"
|
||||||
size="lg"
|
size="lg"
|
||||||
visibleFrom="sm"
|
visibleFrom="sm"
|
||||||
styles={{
|
styles={{
|
||||||
control: {
|
control: {
|
||||||
background: "#8f8f8f52",
|
background: "rgba(168, 168, 168, 0.2)",
|
||||||
borderRadius: "4px",
|
borderRadius: "4px",
|
||||||
},
|
},
|
||||||
root: {
|
root: {
|
||||||
|
@ -1,11 +1,42 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { Stack, Flex, Badge, Button } from "@mantine/core";
|
import { Manrope } from "next/font/google";
|
||||||
|
import { Stack, Flex, Badge, Button, Text } from "@mantine/core";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
import { MdChevronRight } from "react-icons/md";
|
import { MdChevronRight } from "react-icons/md";
|
||||||
|
|
||||||
|
const manrope = Manrope({
|
||||||
|
subsets: ["latin-ext"],
|
||||||
|
});
|
||||||
|
|
||||||
const StyledHeroSection = styled.main`
|
const StyledHeroSection = styled.main`
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
position: absolute;
|
||||||
|
content: "";
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
image-rendering: pixelated;
|
||||||
|
-webkit-mask-image: linear-gradient(to bottom, transparent, 20%, white, 80%, transparent);
|
||||||
|
mask-image: linear-gradient(to bottom, transparent, 20%, white, 80%, transparent);
|
||||||
|
--line-color-1: #f5f5f5;
|
||||||
|
--line-color-2: #f8f8f8;
|
||||||
|
background-image: linear-gradient(var(--line-color-1) 1.5px, transparent 1.5px),
|
||||||
|
linear-gradient(90deg, var(--line-color-1) 1.5px, transparent 1.5px),
|
||||||
|
linear-gradient(var(--line-color-2) 1px, transparent 1px),
|
||||||
|
linear-gradient(90deg, var(--line-color-2) 1px, transparent 1px);
|
||||||
|
background-position:
|
||||||
|
-1.5px -1.5px,
|
||||||
|
-1.5px -1.5px,
|
||||||
|
-1px -1px,
|
||||||
|
-1px -1px;
|
||||||
|
background-size:
|
||||||
|
100px 100px,
|
||||||
|
100px 100px,
|
||||||
|
20px 20px,
|
||||||
|
20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 1240px) {
|
@media only screen and (max-width: 1240px) {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
@ -13,23 +44,15 @@ const StyledHeroSection = styled.main`
|
|||||||
|
|
||||||
const StyledHeroTitle = styled.h1`
|
const StyledHeroTitle = styled.h1`
|
||||||
position: relative;
|
position: relative;
|
||||||
font-size: 2rem;
|
font-size: 2.2rem;
|
||||||
font-weight: 600;
|
font-weight: 800;
|
||||||
display: inline;
|
display: inline;
|
||||||
color: #272727;
|
color: #272727;
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
line-height: 1.2;
|
line-height: 1.12;
|
||||||
letter-spacing: -1px;
|
letter-spacing: -0.02em;
|
||||||
max-width: 30rem;
|
max-width: 30rem;
|
||||||
|
font-family: ${manrope.style.fontFamily};
|
||||||
span {
|
|
||||||
display: inline-block;
|
|
||||||
white-space: nowrap;
|
|
||||||
padding: 0 0.5rem;
|
|
||||||
color: white;
|
|
||||||
background: black;
|
|
||||||
transform: rotate(-1.5deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media only screen and (min-width: 576px) {
|
@media only screen and (min-width: 576px) {
|
||||||
font-size: 3.2rem;
|
font-size: 3.2rem;
|
||||||
@ -42,32 +65,31 @@ const StyledHeroTitle = styled.h1`
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (min-width: 1400px) {
|
@media only screen and (min-width: 1400px) {
|
||||||
font-size: 4rem;
|
font-size: 4.2rem;
|
||||||
max-width: 48rem;
|
max-width: 50rem;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const StyledHeroText = styled.p`
|
const StyledHeroText = styled.p`
|
||||||
font-size: 1.2rem;
|
font-size: 1rem;
|
||||||
color: #626262;
|
color: #626262;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
max-width: 100%;
|
max-width: 75%;
|
||||||
min-width: 400px;
|
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: #0073ff;
|
color: #be7d1c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (min-width: 576px) {
|
@media only screen and (min-width: 576px) {
|
||||||
font-size: 1.3rem;
|
font-size: 1.15rem;
|
||||||
max-width: 80%;
|
max-width: 80%;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (min-width: 1400px) {
|
@media only screen and (min-width: 1400px) {
|
||||||
font-size: 1.2rem;
|
font-size: 1.3rem;
|
||||||
max-width: 60%;
|
max-width: 60%;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
@ -78,7 +100,7 @@ const StyledHeroSectionBody = styled.div`
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 9rem 10%;
|
padding: 7rem 10%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
gap: 60px;
|
gap: 60px;
|
||||||
@ -95,10 +117,7 @@ export const HeroSection = () => {
|
|||||||
<StyledHeroSection id="hero-section">
|
<StyledHeroSection id="hero-section">
|
||||||
<StyledHeroSectionBody>
|
<StyledHeroSectionBody>
|
||||||
<Stack flex="1" miw={250} mx="auto" align="center">
|
<Stack flex="1" miw={250} mx="auto" align="center">
|
||||||
<StyledHeroTitle>
|
<StyledHeroTitle>Visualize JSON into interactive graphs</StyledHeroTitle>
|
||||||
Convert any JSON into
|
|
||||||
<span>interactive graphs</span>
|
|
||||||
</StyledHeroTitle>
|
|
||||||
<StyledHeroText>
|
<StyledHeroText>
|
||||||
The best JSON viewer tool to <strong>visualize</strong>, <strong>format</strong> and{" "}
|
The best JSON viewer tool to <strong>visualize</strong>, <strong>format</strong> and{" "}
|
||||||
<strong>modify</strong>.
|
<strong>modify</strong>.
|
||||||
@ -120,23 +139,37 @@ export const HeroSection = () => {
|
|||||||
TOML
|
TOML
|
||||||
</Badge>
|
</Badge>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
<Flex gap="md" wrap="wrap" justify="center">
|
||||||
<Button
|
<Button
|
||||||
component="a"
|
component="a"
|
||||||
variant="gradient"
|
color="gray.2"
|
||||||
gradient={{
|
href="/#preview"
|
||||||
from: "#4466ff",
|
size="lg"
|
||||||
to: "#003ba9",
|
radius="sm"
|
||||||
}}
|
fw={500}
|
||||||
href="/#pricing"
|
fz="md"
|
||||||
size="xl"
|
mt="lg"
|
||||||
radius="md"
|
visibleFrom="xs"
|
||||||
fw={600}
|
>
|
||||||
rightSection={<MdChevronRight size={30} />}
|
Learn more
|
||||||
mt="lg"
|
</Button>
|
||||||
>
|
<Button
|
||||||
Start Typing
|
component="a"
|
||||||
</Button>
|
color="orange"
|
||||||
|
href="/#pricing"
|
||||||
|
size="lg"
|
||||||
|
radius="sm"
|
||||||
|
fw={500}
|
||||||
|
fz="md"
|
||||||
|
rightSection={<MdChevronRight size={30} />}
|
||||||
|
mt="lg"
|
||||||
|
>
|
||||||
|
Start using free
|
||||||
|
</Button>
|
||||||
|
</Flex>
|
||||||
|
<Text c="gray.6" size="xs" mt="-10">
|
||||||
|
No registration needed.
|
||||||
|
</Text>
|
||||||
</Stack>
|
</Stack>
|
||||||
</StyledHeroSectionBody>
|
</StyledHeroSectionBody>
|
||||||
</StyledHeroSection>
|
</StyledHeroSection>
|
||||||
|
@ -45,10 +45,10 @@ export const PremiumVsFree = () => {
|
|||||||
}}
|
}}
|
||||||
radius="xl"
|
radius="xl"
|
||||||
mx="auto"
|
mx="auto"
|
||||||
mb="-16.5rem"
|
mb="-18rem"
|
||||||
style={{
|
style={{
|
||||||
textAlign: "center",
|
textAlign: "center",
|
||||||
background: "linear-gradient(rgb(33, 148, 87) 40%, rgb(255, 255, 255) 90%)",
|
background: "linear-gradient(rgb(207, 116, 3) 40%, rgb(255, 255, 255) 90%)",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Title
|
<Title
|
||||||
@ -71,15 +71,14 @@ export const PremiumVsFree = () => {
|
|||||||
xs: 16,
|
xs: 16,
|
||||||
}}
|
}}
|
||||||
maw={{
|
maw={{
|
||||||
base: "80%",
|
base: "60%",
|
||||||
sm: "70%",
|
sm: "50%",
|
||||||
}}
|
}}
|
||||||
c="gray.2"
|
c="gray.2"
|
||||||
mb={60}
|
mb={60}
|
||||||
>
|
>
|
||||||
Designed to help you navigate through your data with ease. <br />
|
Designed to help you navigate through your data with ease. <br /> Smaller, faster, and
|
||||||
The editor provides a clean and intuitive interface that allows you to focus on what
|
more efficient than ever before.
|
||||||
matters most: your data.
|
|
||||||
</Text>
|
</Text>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
|
||||||
|
@ -10,8 +10,9 @@ const inter = Inter({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const StyledLayoutWrapper = styled.div`
|
const StyledLayoutWrapper = styled.div`
|
||||||
background-image: radial-gradient(#ededed 2px, #ffffff 2px);
|
background: #fff;
|
||||||
background-size: 40px 40px;
|
/* background-image: radial-gradient(#ededed 2px, #ffffff 2px); */
|
||||||
|
/* background-size: 40px 40px; */
|
||||||
font-family: ${inter.style.fontFamily};
|
font-family: ${inter.style.fontFamily};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ import { JSONCrackLogo } from "./JsonCrackLogo";
|
|||||||
|
|
||||||
const StyledNavbarWrapper = styled.div`
|
const StyledNavbarWrapper = styled.div`
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
|
padding-top: 1rem;
|
||||||
transition: background 0.2s ease-in-out;
|
transition: background 0.2s ease-in-out;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@ -14,7 +15,7 @@ const StyledNavbar = styled.nav`
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 1157px;
|
max-width: 1200px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 12px 24px;
|
padding: 12px 24px;
|
||||||
background: rgba(255, 255, 255, 0.1);
|
background: rgba(255, 255, 255, 0.1);
|
||||||
@ -53,10 +54,10 @@ export const Navbar = () => {
|
|||||||
href="/#pricing"
|
href="/#pricing"
|
||||||
variant="subtle"
|
variant="subtle"
|
||||||
color="black"
|
color="black"
|
||||||
radius="md"
|
radius="sm"
|
||||||
size="sm"
|
size="sm"
|
||||||
ml={50}
|
ml={50}
|
||||||
fw={400}
|
fw={500}
|
||||||
>
|
>
|
||||||
Pricing
|
Pricing
|
||||||
</Button>
|
</Button>
|
||||||
@ -66,9 +67,9 @@ export const Navbar = () => {
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
variant="subtle"
|
variant="subtle"
|
||||||
color="black"
|
color="black"
|
||||||
radius="md"
|
radius="sm"
|
||||||
size="sm"
|
size="sm"
|
||||||
fw={400}
|
fw={500}
|
||||||
>
|
>
|
||||||
VS Code
|
VS Code
|
||||||
</Button>
|
</Button>
|
||||||
@ -78,9 +79,9 @@ export const Navbar = () => {
|
|||||||
href="/docs"
|
href="/docs"
|
||||||
variant="subtle"
|
variant="subtle"
|
||||||
color="black"
|
color="black"
|
||||||
radius="md"
|
radius="sm"
|
||||||
size="sm"
|
size="sm"
|
||||||
fw={400}
|
fw={500}
|
||||||
>
|
>
|
||||||
Docs
|
Docs
|
||||||
</Button>
|
</Button>
|
||||||
@ -90,9 +91,9 @@ export const Navbar = () => {
|
|||||||
href="/#faq"
|
href="/#faq"
|
||||||
variant="subtle"
|
variant="subtle"
|
||||||
color="black"
|
color="black"
|
||||||
radius="md"
|
radius="sm"
|
||||||
size="sm"
|
size="sm"
|
||||||
fw={400}
|
fw={500}
|
||||||
>
|
>
|
||||||
FAQ
|
FAQ
|
||||||
</Button>
|
</Button>
|
||||||
@ -102,21 +103,19 @@ export const Navbar = () => {
|
|||||||
variant="default"
|
variant="default"
|
||||||
component="a"
|
component="a"
|
||||||
href="https://app.jsoncrack.com/sign-in"
|
href="https://app.jsoncrack.com/sign-in"
|
||||||
radius="md"
|
radius="sm"
|
||||||
visibleFrom="sm"
|
visibleFrom="sm"
|
||||||
size="md"
|
size="md"
|
||||||
fw={600}
|
|
||||||
>
|
>
|
||||||
Sign in
|
Sign in
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
component="a"
|
component="a"
|
||||||
color="brightBlue"
|
color="orange"
|
||||||
href="/editor"
|
href="/editor"
|
||||||
radius="md"
|
radius="sm"
|
||||||
visibleFrom="sm"
|
visibleFrom="sm"
|
||||||
size="md"
|
size="md"
|
||||||
fw={600}
|
|
||||||
>
|
>
|
||||||
Editor
|
Editor
|
||||||
</Button>
|
</Button>
|
||||||
|
@ -198,36 +198,38 @@ export const GraphView = ({ isWidget = false }: GraphProps) => {
|
|||||||
>
|
>
|
||||||
<GraphCanvas isWidget={isWidget} />
|
<GraphCanvas isWidget={isWidget} />
|
||||||
</Space>
|
</Space>
|
||||||
<Dialog
|
{!isWidget && (
|
||||||
opened={!isDialogClosed}
|
<Dialog
|
||||||
size="lg"
|
opened={!isDialogClosed}
|
||||||
radius="md"
|
size="lg"
|
||||||
withBorder
|
radius="md"
|
||||||
position={{
|
withBorder
|
||||||
right: 15,
|
position={{
|
||||||
bottom: 40,
|
right: 15,
|
||||||
}}
|
bottom: 40,
|
||||||
onClose={() => setDialogClosed(true)}
|
}}
|
||||||
>
|
onClose={() => setDialogClosed(true)}
|
||||||
<Text size="sm" fw={500}>
|
>
|
||||||
Try the powerful Premium editor for larger graphs and advanced features with money-back
|
<Text size="sm" fw={500}>
|
||||||
guarantee.
|
Try the powerful Premium editor for larger graphs and advanced features with
|
||||||
</Text>
|
money-back guarantee.
|
||||||
<Group justify="right" mt="sm">
|
</Text>
|
||||||
<Button variant="default" onClick={() => setDialogClosed(true)}>
|
<Group justify="right" mt="sm">
|
||||||
Close
|
<Button variant="default" onClick={() => setDialogClosed(true)}>
|
||||||
</Button>
|
Close
|
||||||
<Button
|
</Button>
|
||||||
color="green"
|
<Button
|
||||||
onClick={() => {
|
color="green"
|
||||||
setVisible("upgrade")(true);
|
onClick={() => {
|
||||||
setDialogClosed(true);
|
setVisible("upgrade")(true);
|
||||||
}}
|
setDialogClosed(true);
|
||||||
>
|
}}
|
||||||
Explore
|
>
|
||||||
</Button>
|
Explore
|
||||||
</Group>
|
</Button>
|
||||||
</Dialog>
|
</Group>
|
||||||
|
</Dialog>
|
||||||
|
)}
|
||||||
</StyledEditorWrapper>
|
</StyledEditorWrapper>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
@ -10,14 +10,13 @@ import {
|
|||||||
Paper,
|
Paper,
|
||||||
SegmentedControl,
|
SegmentedControl,
|
||||||
Center,
|
Center,
|
||||||
Badge, // ThemeIcon,
|
Badge,
|
||||||
Tooltip,
|
Tooltip,
|
||||||
Anchor,
|
Anchor,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
import { AiOutlineInfoCircle } from "react-icons/ai";
|
import { AiOutlineInfoCircle } from "react-icons/ai";
|
||||||
import { IoIosCheckmarkCircle } from "react-icons/io";
|
import { FaCheck, FaXmark } from "react-icons/fa6";
|
||||||
import { IoCheckmarkCircle, IoCloseCircle } from "react-icons/io5";
|
|
||||||
import { VscArrowRight, VscLinkExternal } from "react-icons/vsc";
|
import { VscArrowRight, VscLinkExternal } from "react-icons/vsc";
|
||||||
import Layout from "src/layout/Layout";
|
import Layout from "src/layout/Layout";
|
||||||
import { gaEvent } from "src/lib/utils/gaEvent";
|
import { gaEvent } from "src/lib/utils/gaEvent";
|
||||||
@ -35,30 +34,13 @@ export const purchaseLinks = {
|
|||||||
"https://jsoncrack.lemonsqueezy.com/checkout/buy/577928ea-fb09-4076-9307-3e5931b35ad0?desc=0&enabled=82417",
|
"https://jsoncrack.lemonsqueezy.com/checkout/buy/577928ea-fb09-4076-9307-3e5931b35ad0?desc=0&enabled=82417",
|
||||||
};
|
};
|
||||||
|
|
||||||
const StyledPaper = styled(Paper)<{ $highlight?: boolean } & any>`
|
const StyledPaper = styled(Paper)`
|
||||||
padding: 1.5em;
|
padding: 1.5em;
|
||||||
width: 350px;
|
width: 350px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
border: 2px solid #e9e9e9;
|
border: 2px solid #e9e9e9;
|
||||||
${({ $highlight }) => $highlight && "border: 3px solid #28c417;"}
|
|
||||||
background: white;
|
background: white;
|
||||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
|
||||||
${({ $highlight }) =>
|
|
||||||
$highlight &&
|
|
||||||
`
|
|
||||||
&::before {
|
|
||||||
content: "Recommended";
|
|
||||||
background: #28c417;
|
|
||||||
position: absolute;
|
|
||||||
transform: translate(-27px, -61px);
|
|
||||||
font-weight: 500;
|
|
||||||
color: white;
|
|
||||||
padding: 6px 8px;
|
|
||||||
border-top-right-radius: 6px;
|
|
||||||
border-top-left-radius: 6px;
|
|
||||||
}
|
|
||||||
`}
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const PricingCards = () => {
|
export const PricingCards = () => {
|
||||||
@ -83,8 +65,8 @@ export const PricingCards = () => {
|
|||||||
label: (
|
label: (
|
||||||
<Flex align="center" gap="xs">
|
<Flex align="center" gap="xs">
|
||||||
Annual{" "}
|
Annual{" "}
|
||||||
<Badge radius="sm" variant="light" color="green">
|
<Badge radius="sm" variant="light" color="orange">
|
||||||
{PRICING.getAnnualSave()}% OFF
|
Save {PRICING.getAnnualSave()}%
|
||||||
</Badge>
|
</Badge>
|
||||||
</Flex>
|
</Flex>
|
||||||
),
|
),
|
||||||
@ -109,125 +91,7 @@ export const PricingCards = () => {
|
|||||||
}}
|
}}
|
||||||
mx="auto"
|
mx="auto"
|
||||||
>
|
>
|
||||||
{/* <StyledPaper>
|
<StyledPaper>
|
||||||
<Flex justify="space-between">
|
|
||||||
<Stack gap="0">
|
|
||||||
<Text fw={500} size="xl" c="black">
|
|
||||||
Partner
|
|
||||||
</Text>
|
|
||||||
|
|
||||||
<ThemeIcon variant="transparent" size={59}>
|
|
||||||
<PiChats color="black" size={50} />
|
|
||||||
</ThemeIcon>
|
|
||||||
<Text fz="xs" c="gray.7">
|
|
||||||
Contact us for custom pricing
|
|
||||||
</Text>
|
|
||||||
</Stack>
|
|
||||||
</Flex>
|
|
||||||
<Button
|
|
||||||
component="a"
|
|
||||||
color="green"
|
|
||||||
onClick={() => gaEvent("Pricing", "click partner plan")}
|
|
||||||
href="mailto:contact@jsoncrack.com"
|
|
||||||
target="_blank"
|
|
||||||
size="lg"
|
|
||||||
radius="md"
|
|
||||||
fullWidth
|
|
||||||
my="md"
|
|
||||||
rightSection={<VscArrowRight />}
|
|
||||||
>
|
|
||||||
Contact Us
|
|
||||||
</Button>
|
|
||||||
<Text mt="xs" fz="xs" c="dimmed">
|
|
||||||
Integrate JSON Crack into your applications and websites.
|
|
||||||
</Text>
|
|
||||||
<Flex direction="column" justify="space-between">
|
|
||||||
<List
|
|
||||||
spacing="md"
|
|
||||||
size="sm"
|
|
||||||
mt="xs"
|
|
||||||
c="black"
|
|
||||||
center
|
|
||||||
icon={<IoIosCheckmarkCircle color="green" size="20" />}
|
|
||||||
>
|
|
||||||
<List.Item>
|
|
||||||
<Tooltip
|
|
||||||
color="blue"
|
|
||||||
label="Integrate premium graph visualization into your own website/apps using iframe"
|
|
||||||
maw={350}
|
|
||||||
multiline
|
|
||||||
withArrow
|
|
||||||
>
|
|
||||||
<Text
|
|
||||||
c="gray.7"
|
|
||||||
fw={600}
|
|
||||||
fz="sm"
|
|
||||||
style={{ textDecoration: "underline", textDecorationStyle: "dashed" }}
|
|
||||||
>
|
|
||||||
JSON Crack Premium Widget
|
|
||||||
</Text>
|
|
||||||
</Tooltip>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item>
|
|
||||||
<Text c="gray.7" fw={600} fz="sm">
|
|
||||||
1 Domain / Plan
|
|
||||||
</Text>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item>
|
|
||||||
<Tooltip
|
|
||||||
color="blue"
|
|
||||||
label="Listen for events like node click, hover, center etc. Display your own UI"
|
|
||||||
maw={350}
|
|
||||||
multiline
|
|
||||||
withArrow
|
|
||||||
>
|
|
||||||
<Text
|
|
||||||
c="gray.7"
|
|
||||||
fw={600}
|
|
||||||
fz="sm"
|
|
||||||
style={{ textDecoration: "underline", textDecorationStyle: "dashed" }}
|
|
||||||
>
|
|
||||||
Events API
|
|
||||||
</Text>
|
|
||||||
</Tooltip>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item>
|
|
||||||
<Tooltip
|
|
||||||
color="blue"
|
|
||||||
label="Customize the look and feel of the editor matching with your own branding"
|
|
||||||
maw={350}
|
|
||||||
multiline
|
|
||||||
withArrow
|
|
||||||
>
|
|
||||||
<Text
|
|
||||||
c="gray.7"
|
|
||||||
fw={600}
|
|
||||||
fz="sm"
|
|
||||||
style={{ textDecoration: "underline", textDecorationStyle: "dashed" }}
|
|
||||||
>
|
|
||||||
Custom Theming
|
|
||||||
</Text>
|
|
||||||
</Tooltip>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item>
|
|
||||||
<Text c="gray.7" fw={600} fz="sm">
|
|
||||||
White Labeling
|
|
||||||
</Text>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item>
|
|
||||||
<Text c="gray.7" fw={600} fz="sm">
|
|
||||||
Onboarding and engineering support
|
|
||||||
</Text>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item>
|
|
||||||
<Text c="gray.7" fw={600} fz="sm">
|
|
||||||
High-priority customer support
|
|
||||||
</Text>
|
|
||||||
</List.Item>
|
|
||||||
</List>
|
|
||||||
</Flex>
|
|
||||||
</StyledPaper> */}
|
|
||||||
<StyledPaper $highlight>
|
|
||||||
<Flex justify="space-between">
|
<Flex justify="space-between">
|
||||||
<Stack gap="0">
|
<Stack gap="0">
|
||||||
<Flex align="center">
|
<Flex align="center">
|
||||||
@ -236,12 +100,12 @@ export const PricingCards = () => {
|
|||||||
</Text>
|
</Text>
|
||||||
{!isMonthly && (
|
{!isMonthly && (
|
||||||
<Badge
|
<Badge
|
||||||
fw={500}
|
fw={600}
|
||||||
size="lg"
|
size="md"
|
||||||
variant="light"
|
variant="light"
|
||||||
c="#41B619"
|
c="orange"
|
||||||
radius="md"
|
radius="sm"
|
||||||
color="green"
|
color="orange"
|
||||||
ml="sm"
|
ml="sm"
|
||||||
>
|
>
|
||||||
SAVE {PRICING.getAnnualSave()}%
|
SAVE {PRICING.getAnnualSave()}%
|
||||||
@ -264,7 +128,7 @@ export const PricingCards = () => {
|
|||||||
</Flex>
|
</Flex>
|
||||||
<Button
|
<Button
|
||||||
component="a"
|
component="a"
|
||||||
color="#2ba80f"
|
color="orange"
|
||||||
onClick={() => gaEvent("Pricing", "click upgrade premium")}
|
onClick={() => gaEvent("Pricing", "click upgrade premium")}
|
||||||
href={isMonthly ? purchaseLinks.monthly : purchaseLinks.annual}
|
href={isMonthly ? purchaseLinks.monthly : purchaseLinks.annual}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
@ -274,19 +138,19 @@ export const PricingCards = () => {
|
|||||||
my="md"
|
my="md"
|
||||||
rightSection={<VscArrowRight />}
|
rightSection={<VscArrowRight />}
|
||||||
>
|
>
|
||||||
Get Started
|
Upgrade
|
||||||
</Button>
|
</Button>
|
||||||
<Text mt="xs" fz="xs" c="dimmed">
|
<Text mt="xs" fz="xs" c="dimmed">
|
||||||
Advanced features, better performance and optimized user interface.
|
Remake version with advanced features, better performance and smooth user interface.
|
||||||
</Text>
|
</Text>
|
||||||
<Flex direction="column" justify="space-between">
|
<Flex direction="column" justify="space-between">
|
||||||
<List
|
<List
|
||||||
spacing="md"
|
spacing="sm"
|
||||||
size="sm"
|
size="sm"
|
||||||
mt="xs"
|
mt="xs"
|
||||||
c="black"
|
c="black"
|
||||||
center
|
center
|
||||||
icon={<IoCheckmarkCircle color="green" size="20" />}
|
icon={<FaCheck size="18" color="#E8580C" />}
|
||||||
>
|
>
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@ -306,7 +170,7 @@ export const PricingCards = () => {
|
|||||||
textUnderlineOffset: "2px",
|
textUnderlineOffset: "2px",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Large data support
|
Larger data support
|
||||||
</Text>
|
</Text>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
@ -328,36 +192,19 @@ export const PricingCards = () => {
|
|||||||
textUnderlineOffset: "2px",
|
textUnderlineOffset: "2px",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Compact Graphs & High Performance
|
Compact and Fast Visualization
|
||||||
</Text>
|
</Text>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Text c="black" fw={500} fz="sm">
|
<Text c="black" fw={500} fz="sm">
|
||||||
Compare Data Differences
|
Compare data
|
||||||
</Text>
|
</Text>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Tooltip
|
<Text c="black" fw={500} fz="sm">
|
||||||
color="blue"
|
Edit data on graph
|
||||||
label="Click on a node at graph to update data on editor."
|
</Text>
|
||||||
maw={350}
|
|
||||||
multiline
|
|
||||||
withArrow
|
|
||||||
>
|
|
||||||
<Text
|
|
||||||
c="black"
|
|
||||||
fw={500}
|
|
||||||
fz="sm"
|
|
||||||
style={{
|
|
||||||
textDecoration: "underline",
|
|
||||||
textDecorationStyle: "dashed",
|
|
||||||
textUnderlineOffset: "2px",
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Edit Data on Graph
|
|
||||||
</Text>
|
|
||||||
</Tooltip>
|
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Text c="black" fw={500} fz="sm">
|
<Text c="black" fw={500} fz="sm">
|
||||||
@ -411,16 +258,16 @@ export const PricingCards = () => {
|
|||||||
Go to Editor
|
Go to Editor
|
||||||
</Button>
|
</Button>
|
||||||
<Text mt="xs" fz="xs" c="dimmed">
|
<Text mt="xs" fz="xs" c="dimmed">
|
||||||
Basic version of the editor with limited features.
|
Basic version of the editor with limited features, open-source.
|
||||||
</Text>
|
</Text>
|
||||||
<Flex direction="column" justify="space-between">
|
<Flex direction="column" justify="space-between">
|
||||||
<List
|
<List
|
||||||
spacing="md"
|
spacing="sm"
|
||||||
size="sm"
|
size="sm"
|
||||||
mt="lg"
|
mt="lg"
|
||||||
c="black"
|
c="black"
|
||||||
center
|
center
|
||||||
icon={<IoIosCheckmarkCircle color="green" size="20" />}
|
icon={<FaCheck size="18" color="#E8580C" />}
|
||||||
>
|
>
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@ -478,28 +325,28 @@ export const PricingCards = () => {
|
|||||||
Store 25 documents
|
Store 25 documents
|
||||||
</Text>
|
</Text>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
|
<List.Item icon={<FaXmark color="gray" size={20} />}>
|
||||||
<Text c="gray.7" fw={500} fz="sm">
|
<Text c="gray.6" fw={500} fz="sm">
|
||||||
Compact Visualization
|
Edit data on graph
|
||||||
</Text>
|
</Text>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
|
<List.Item icon={<FaXmark color="gray" size={20} />}>
|
||||||
<Text c="gray.7" fw={500} fz="sm">
|
<Text c="gray.6" fw={500} fz="sm">
|
||||||
Compare Data
|
|
||||||
</Text>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
|
|
||||||
<Text c="gray.7" fw={500} fz="sm">
|
|
||||||
Edit Data on Graph
|
|
||||||
</Text>
|
|
||||||
</List.Item>
|
|
||||||
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
|
|
||||||
<Text c="gray.7" fw={500} fz="sm">
|
|
||||||
AI-powered data filter
|
AI-powered data filter
|
||||||
</Text>
|
</Text>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
|
<List.Item icon={<FaXmark color="gray" size={20} />}>
|
||||||
<Text c="gray.7" fw={500} fz="sm">
|
<Text c="gray.6" fw={500} fz="sm">
|
||||||
|
Compact visualization
|
||||||
|
</Text>
|
||||||
|
</List.Item>
|
||||||
|
<List.Item icon={<FaXmark color="gray" size={20} />}>
|
||||||
|
<Text c="gray.6" fw={500} fz="sm">
|
||||||
|
Compare data
|
||||||
|
</Text>
|
||||||
|
</List.Item>
|
||||||
|
<List.Item icon={<FaXmark color="gray" size={20} />}>
|
||||||
|
<Text c="gray.6" fw={500} fz="sm">
|
||||||
Customize graph colors
|
Customize graph colors
|
||||||
</Text>
|
</Text>
|
||||||
</List.Item>
|
</List.Item>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user