feat: update landing

This commit is contained in:
AykutSarac 2024-07-22 17:02:37 +03:00
parent 04db6a4250
commit 7b0dccd596
No known key found for this signature in database
13 changed files with 352 additions and 313 deletions

View File

@ -38,6 +38,7 @@
"next": "14.2.3",
"react": "^18.3.1",
"react-compare-slider": "^3.1.0",
"react-countup": "^6.5.3",
"react-dom": "^18.3.1",
"react-ga4": "^2.1.0",
"react-hot-toast": "^2.4.1",

18
pnpm-lock.yaml generated
View File

@ -83,6 +83,9 @@ importers:
react-compare-slider:
specifier: ^3.1.0
version: 3.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-countup:
specifier: ^6.5.3
version: 6.5.3(react@18.3.1)
react-dom:
specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
@ -1014,6 +1017,9 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
countup.js@2.8.0:
resolution: {integrity: sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ==}
create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
@ -2158,6 +2164,11 @@ packages:
peerDependencies:
react: '>= 16.8.0'
react-countup@6.5.3:
resolution: {integrity: sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==}
peerDependencies:
react: '>= 16.3.0'
react-dom@18.3.1:
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
@ -3738,6 +3749,8 @@ snapshots:
concat-map@0.0.1: {}
countup.js@2.8.0: {}
create-require@1.1.1: {}
cross-spawn@7.0.3:
@ -4977,6 +4990,11 @@ snapshots:
dependencies:
react: 18.3.1
react-countup@6.5.3(react@18.3.1):
dependencies:
countup.js: 2.8.0
react: 18.3.1
react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0

View File

@ -40,17 +40,16 @@ const Questions = [
export const FAQ = () => {
return (
<Container id="faq" component="section">
<Container id="faq" component="section" mt={150}>
<Title
c="black"
order={2}
fz={{
base: 26,
xs: 32,
sm: 42,
base: 24,
xs: 30,
sm: 36,
}}
fw={600}
mt={150}
mb={60}
style={{ textAlign: "center" }}
>

View File

@ -1,29 +1,7 @@
import React from "react";
import { Text, Title, Grid, Paper, Badge, Image, Container, rem } from "@mantine/core";
import styled from "styled-components";
const StyledPaper = styled.div`
position: relative;
z-index: 1;
&:before {
position: absolute;
z-index: -1;
opacity: 0.4;
top: 0;
left: 0;
content: "";
width: 100%;
height: 100%;
background-size: 20px 20px;
background-image: linear-gradient(to right, #dcdcdc 1px, transparent 1px),
linear-gradient(to bottom, #dcdcdc 1px, transparent 1px);
background-position: top center;
image-rendering: pixelated;
-webkit-mask-image: linear-gradient(to bottom, transparent, 20%, white, 90%, transparent);
mask-image: linear-gradient(to bottom, transparent, 20%, white, 90%, transparent);
}
`;
import { Container, Grid, Flex, rem, Title, Text, Paper } from "@mantine/core";
import { FaBolt, FaHeart, FaMagic, FaPalette, FaShapes } from "react-icons/fa";
import { FaShieldHalved } from "react-icons/fa6";
export const Features = () => {
return (
@ -39,6 +17,7 @@ export const Features = () => {
maw={rem(1700)}
fluid
my={150}
mt={120}
>
<Title
c="black"
@ -50,14 +29,13 @@ export const Features = () => {
sm: 42,
}}
fw={600}
mt={120}
mb={15}
style={{ textAlign: "center" }}
>
Intuitive and User-Friendly
Explore Your Data Visually
</Title>
<Text
c="gray.6"
c="gray.7"
fz={{
sm: 14,
md: 16,
@ -71,190 +49,127 @@ export const Features = () => {
ta="center"
mb={50}
>
All-in-one tool for JSON, YAML, CSV, XML, and TOML. Formatter, validator, visualizer, and
All in one tool for JSON, YAML, CSV, XML, and TOML. Formatter, validator, visualizer, and
editor. Make smarter decisions faster.
</Text>
<Grid gutter={24} mt={50} mb={150} mx="auto">
<Grid.Col span={{ base: 12, xs: 6 }}>
<Paper
pos="relative"
p={30}
shadow="sm"
radius="md"
w="100%"
mah={{ sm: 300, md: 370 }}
h="100%"
withBorder
style={{ overflow: "hidden", borderColor: "#ececec" }}
bg="white"
>
<StyledPaper>
<Title c="black" order={3} fw={500} fz={{ sm: 20, md: 28 }}>
Graphs
</Title>
<Text fz={{ sm: 14, md: 18 }} c="dark.5" mt={10}>
Visualize your data in a graph format to understand and analyze it better.
<Grid px={{ base: 0, xs: "xl", md: 0 }} mt={100} mx="auto" gutter={30}>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
<Flex align="center" gap={8} mb={16}>
<FaBolt color="orange" size={24} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Real-time Visualization
</Text>
<Image
loading="lazy"
src="./assets/features/compare.webp"
alt="Compare"
w={{ sm: 350, md: 400 }}
mt={20}
style={{
filter: "drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25))",
}}
/>
</StyledPaper>
</Flex>
<Text
c="gray.7"
fz={{
base: 14,
xs: 16,
}}
>
Transform into graphs as you type. Update your data from the graphs directly.
</Text>
</Paper>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6 }}>
<Paper
p={30}
shadow="sm"
radius="md"
w="100%"
mah={{ sm: 300, md: 370 }}
h="100%"
bg="white"
withBorder
style={{ overflow: "hidden", borderColor: "#ececec" }}
>
<StyledPaper>
<Title c="black" order={3} fw={500} fz={{ sm: 20, md: 28 }}>
Generate Types
</Title>
<Text fz={{ sm: 14, md: 18 }} c="dark.5" my={10}>
Generate types for your data with a single click: TypeScript, Go, Rust & more.
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
<Flex align="center" gap={8} mb={16}>
<FaHeart color="#ff5555" size={26} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Simple
</Text>
<Paper
withBorder
shadow="sm"
radius={5}
w="fit-content"
mx="auto"
style={{ borderColor: "lightgray" }}
>
<Image
loading="lazy"
radius="sm"
src="./assets/features/edit.webp"
alt="Edit"
w={340}
/>
</Paper>
</StyledPaper>
</Flex>
<Text
c="gray.7"
fz={{
base: 14,
xs: 16,
}}
>
Designed for everyone. Clean, focused, and easy to use. No learning curve.
</Text>
</Paper>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6 }}>
<Paper
p={30}
shadow="sm"
radius="md"
w="100%"
mah={{ sm: 300, md: 370 }}
h="100%"
withBorder
style={{ overflow: "hidden", borderColor: "#ececec" }}
bg="white"
>
<StyledPaper>
<Title c="black" order={3} fw={500} fz={{ sm: 20, md: 28 }}>
Choose Your Format
</Title>
<Text fz={{ sm: 14, md: 18 }} c="dark.5" mt={10}>
Visualize and edit your data in multiple formats. JSON, YAML, CSV, XML, and TOML are
supported.
<Grid.Col span={{ base: 12, xs: 6, md: 4 }} visibleFrom="xs">
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
<Flex align="center" gap={8} mb={16}>
<FaMagic color="#8c0075" size={24} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Generate
</Text>
<Grid gutter="lg" mt={50}>
<Grid.Col span={6}>
<Badge
w="100%"
mih={{ sm: 10, md: 40 }}
variant="light"
c="indigo"
color="indigo"
radius="sm"
size="xl"
>
JSON
</Badge>
</Grid.Col>
<Grid.Col span={6}>
<Badge
w="100%"
mih={{ sm: 10, md: 40 }}
variant="light"
color="cyan"
radius="sm"
size="xl"
c="cyan"
>
YAML
</Badge>
</Grid.Col>
<Grid.Col span={6}>
<Badge
w="100%"
mih={{ sm: 10, md: 40 }}
variant="light"
color="grape"
radius="sm"
c="grape"
size="xl"
>
CSV
</Badge>
</Grid.Col>
<Grid.Col span={6}>
<Badge
w="100%"
mih={{ sm: 10, md: 40 }}
variant="light"
color="red"
radius="sm"
size="xl"
c="red"
>
XML
</Badge>
</Grid.Col>
</Grid>
</StyledPaper>
</Flex>
<Text
c="gray.7"
fz={{
base: 14,
xs: 16,
}}
>
Generate JSON Schema and mock data, TypeScript interfaces, Golang structs, and more
from your data with a single click.
</Text>
</Paper>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6 }}>
<Paper
p={30}
shadow="sm"
radius="md"
w="100%"
mah={{ sm: 300, md: 370 }}
h="100%"
withBorder
style={{ overflow: "hidden", borderColor: "#ececec" }}
bg="white"
>
<StyledPaper>
<Title c="black" order={3} fw={500} fz={{ sm: 20, md: 28 }}>
Search
</Title>
<Text fz={{ sm: 14, md: 18 }} c="dark.5" mt={10}>
Highlight and search what you need in your data, without any hassle.
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
<Flex align="center" gap={8} mb={16}>
<FaPalette color="#4890fd" size={24} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Customizable
</Text>
<Image
loading="lazy"
src="./assets/features/search.webp"
alt="Search"
w={{ sm: 400, md: 500 }}
mx="auto"
mt={20}
style={{
filter: "drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25))",
}}
/>
</StyledPaper>
</Flex>
<Text
c="gray.7"
fz={{
base: 14,
xs: 16,
}}
>
Besides the default light and dark themes, customize the editor&apos;s theme to your
liking, matching your brand or personal preference.
</Text>
</Paper>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
<Flex align="center" gap={8} mb={16}>
<FaShieldHalved color="black" size={24} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Privacy First
</Text>
</Flex>
<Text
c="gray.7"
fz={{
base: 14,
xs: 16,
}}
>
JSON Crack does not store your data unless you upload it manually. Your data remains
completely private.
</Text>
</Paper>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }} visibleFrom="xs">
<Paper h="100%" p="lg" radius="md" bg="gray.0" withBorder>
<Flex align="center" gap={8} mb={16}>
<FaShapes color="#00a571" size={24} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Advanced Features
</Text>
</Flex>
<Text
c="gray.7"
fz={{
base: 14,
xs: 16,
}}
>
Unlock advanced features like JSON Path, AI data filter, Compare Data, Search on
graph, Download as Image and many more!
</Text>
</Paper>
</Grid.Col>
</Grid>

View File

@ -97,6 +97,7 @@ const StyledHeroSectionBody = styled.div`
@media only screen and (max-width: 768px) {
padding: 6em 16px;
margin-top: 10vh;
}
`;

View File

@ -0,0 +1,145 @@
import React from "react";
import Link from "next/link";
import { Avatar, Container, Flex, Paper, Stack, Text, Title } from "@mantine/core";
import styled from "styled-components";
import CountUp from "react-countup";
import { FaGithub, FaHackerNews, FaHeart, FaProductHunt, FaTwitter } from "react-icons/fa6";
import { VscVerifiedFilled } from "react-icons/vsc";
interface LovedByProps {
stars: number;
}
interface TweetCardProps {
username: string;
handle: string;
profileImage: string;
tweet: string;
tweetId: string;
verified?: "company" | "individual";
}
const StyledFeaturedItem = styled.a`
display: flex;
gap: 8px;
align-items: center;
white-space: nowrap;
filter: grayscale(1) contrast(0.2);
transition: filter 0.2s;
&:hover {
filter: none;
}
`;
const Featured = ({ stars }: LovedByProps) => {
return (
<Flex align="center" justify="center" gap="lg" mb="lg" wrap="wrap">
<StyledFeaturedItem
href="https://github.com/AykutSarac/jsoncrack.com"
target="_blank"
rel="noreferrer"
>
<FaGithub color="black" size={30} />
<Text fz="md" fw={600} c="gray.8">
<CountUp startVal={0} end={stars} enableScrollSpy scrollSpyOnce scrollSpyDelay={200} />{" "}
Stars
</Text>
</StyledFeaturedItem>
<StyledFeaturedItem
href="https://news.ycombinator.com/item?id=32626873"
target="_blank"
rel="noreferrer"
>
<FaHackerNews color="#FF6600" size={30} />
<Text fz="md" fw={600} c="gray.8">
Hacker News
</Text>
</StyledFeaturedItem>
<StyledFeaturedItem
href="https://www.producthunt.com/products/JSON-Crack"
target="_blank"
rel="noreferrer"
>
<FaProductHunt color="#DA552F" size={30} />
<Text fz="md" fw={600} c="gray.8">
Product Hunt
</Text>
</StyledFeaturedItem>
</Flex>
);
};
const TweetCard = ({
profileImage,
handle,
tweetId,
tweet,
username,
verified,
}: TweetCardProps) => {
return (
<Paper p="sm" w="fit-content" withBorder radius="md" bg="gray.0" miw={300} maw={450}>
<Flex justify="space-between">
<Link href={`https://twitter.com/${handle}`} target="_blank">
<Flex align="flex-start" gap="sm" direction="row">
<Avatar src={profileImage} w={40} h={40} />
<Stack gap={0}>
<Flex align="center" gap={2}>
<Text c="dark" fz="sm" fw={500}>
{username}
</Text>
{verified && (
<VscVerifiedFilled color={verified === "company" ? "#ECCC4B" : "#1D9BF0"} />
)}
</Flex>
<Text fz="xs" c="gray.6">
@{handle}
</Text>
</Stack>
</Flex>
</Link>
<Link target="_blank" href={`https://x.com/${handle}/status/${tweetId}`}>
<FaTwitter color="#1EA1F1" size={20} />
</Link>
</Flex>
<Text fz="sm" c="gray.8" mt="lg">
{tweet}
</Text>
</Paper>
);
};
export const LovedBy = ({ stars }: LovedByProps) => {
return (
<Container pos="relative" mx="auto" p={30} my={100} mt={150} fluid>
<Title
c="black"
order={2}
px="lg"
fz={{
base: 24,
xs: 30,
sm: 36,
}}
fw={700}
mb={30}
ta="center"
style={{ textAlign: "center" }}
>
People <FaHeart color="red" /> JSON Crack
</Title>
<Featured stars={stars} />
<Flex justify="center" wrap="wrap" gap="md">
<TweetCard
username="GitHub"
handle="github"
profileImage="https://pbs.twimg.com/profile_images/1633247750010830848/8zfRrYjA_400x400.png"
tweetId="1519363257794015233"
tweet="Looking to understand or explore some JSON? Just paste or upload to visualize it as a graph with JSON Crack 😍"
verified="company"
/>
</Flex>
</Container>
);
};

View File

@ -1,9 +1,7 @@
import React from "react";
import { Title, Overlay, Paper, rem, Grid, Flex, Image, Text, Container } from "@mantine/core";
import { Title, Overlay, Paper, rem, Image, Text, Container } from "@mantine/core";
import styled from "styled-components";
import { ReactCompareSlider, ReactCompareSliderHandle } from "react-compare-slider";
import { FaBolt, FaExpand, FaLifeRing, FaParachuteBox, FaShapes } from "react-icons/fa";
import { FaShieldHalved } from "react-icons/fa6";
const StyledImageWrapper = styled.div`
max-width: 85%;
@ -50,16 +48,16 @@ export const PremiumVsFree = () => {
mb="-16.5rem"
style={{
textAlign: "center",
background: "linear-gradient(rgb(7, 5, 90) 40%, rgb(255, 255, 255) 90%)",
background: "linear-gradient(rgb(33, 148, 87) 40%, rgb(255, 255, 255) 90%)",
}}
>
<Title
c="white"
order={2}
fz={{
base: 26,
xs: 32,
sm: 42,
base: 24,
xs: 30,
sm: 36,
}}
fw={700}
mb="md"
@ -76,11 +74,12 @@ export const PremiumVsFree = () => {
base: "80%",
sm: "70%",
}}
c="gray.4"
c="gray.2"
mb={60}
>
Designed to help you navigate through your data with ease. The editor provides a clean and
intuitive interface that allows you to focus on what matters most: your data.
Designed to help you navigate through your data with ease. <br />
The editor provides a clean and intuitive interface that allows you to focus on what
matters most: your data.
</Text>
</Paper>
@ -130,87 +129,6 @@ export const PremiumVsFree = () => {
}
/>
</StyledImageWrapper>
<Grid
w={{ sm: "100%", md: "80%" }}
px="xl"
mt={100}
mx="auto"
gutter={{ base: 30, xs: 30, sm: 50 }}
>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Flex align="center" gap={8} mb={16}>
<FaBolt color="orange" size={28} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
High Performance
</Text>
</Flex>
<Text c="gray.7" fz={14}>
Designed to handle large datasets with ease. It&apos;s optimized for performance and
speed; currently supporting up to 4MB of data.
</Text>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Flex align="center" gap={8} mb={16}>
<FaExpand color="blue" size={28} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Clean & Focused
</Text>
</Flex>
<Text c="gray.7" fz={14}>
Compared to the free version, the premium version creates 50% less nodes on the graph
and helps you to focus on what matters most.
</Text>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }} visibleFrom="xs">
<Flex align="center" gap={8} mb={16}>
<FaLifeRing color="#FF6B00" size={28} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Quick Support
</Text>
</Flex>
<Text c="gray.7" fz={14}>
Get quick support from our team. We&apos;re here to help you with any issues or
questions you may have. Usual response time is within 24 hours.
</Text>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }} visibleFrom="xs">
<Flex align="center" gap={8} mb={16}>
<FaParachuteBox color="#00848C" size={28} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Always Improving
</Text>
</Flex>
<Text c="gray.7" fz={14}>
Have an idea? We&apos;re always looking to improve JSON Crack. We take your feedback
seriously and are constantly working on new features.
</Text>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Flex align="center" gap={8} mb={16}>
<FaShapes color="#A854A5" size={28} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Advanced Features
</Text>
</Flex>
<Text c="gray.7" fz={14}>
Unlock advanced features such as data comparison, direct editing on the graph,
customized themes and compact visualization style.
</Text>
</Grid.Col>
<Grid.Col span={{ base: 12, xs: 6, md: 4 }}>
<Flex align="center" gap={8} mb={16}>
<FaShieldHalved color="black" size={28} />
<Text c="gray.9" fz={{ base: 16, md: 20, lg: 26, xl: 28 }} fw={600}>
Privacy First
</Text>
</Flex>
<Text c="gray.7" fz={14}>
JSON Crack does not store your data unless you upload it manually. Your data remains
completely private.
</Text>
</Grid.Col>
</Grid>
</Container>
);
};

View File

@ -9,9 +9,9 @@ export const Pricing = () => {
c="black"
order={2}
fz={{
base: 26,
xs: 32,
sm: 42,
base: 24,
xs: 30,
sm: 36,
}}
fw={600}
mb={15}

View File

@ -6,6 +6,8 @@ import { Navbar } from "./Navbar";
const StyledLayoutWrapper = styled.div`
padding-bottom: 48px;
background-image: radial-gradient(#e6e6e6 1px, transparent 1px);
background-size: 20px 20px;
`;
const Layout = ({ children }: React.PropsWithChildren) => {

View File

@ -28,6 +28,12 @@ const StyledNavbar = styled.nav`
const Left = styled.div`
width: 100%;
@media only screen and (max-width: 768px) {
& > *:not(:first-child) {
display: none;
}
}
`;
const Right = styled.div`
@ -49,7 +55,6 @@ export const Navbar = () => {
variant="subtle"
color="black"
radius="md"
visibleFrom="sm"
size="md"
>
VS Code
@ -61,7 +66,6 @@ export const Navbar = () => {
variant="subtle"
color="black"
radius="md"
visibleFrom="sm"
size="md"
>
Pricing
@ -73,7 +77,6 @@ export const Navbar = () => {
variant="subtle"
color="black"
radius="md"
visibleFrom="sm"
size="md"
>
Docs
@ -85,7 +88,6 @@ export const Navbar = () => {
variant="subtle"
color="black"
radius="md"
visibleFrom="sm"
size="md"
>
FAQ

View File

@ -1,7 +1,6 @@
import React from "react";
import type { AppProps } from "next/app";
import dynamic from "next/dynamic";
import { DM_Sans } from "next/font/google";
import Head from "next/head";
import { useRouter } from "next/router";
import { MantineProvider, createTheme } from "@mantine/core";
@ -15,16 +14,13 @@ import { Loading } from "src/layout/Loading";
import { supabase } from "src/lib/api/supabase";
import useUser from "src/store/useUser";
const dmSans = DM_Sans({
subsets: ["latin-ext"],
});
const theme = createTheme({
autoContrast: true,
fontSmoothing: false,
respectReducedMotion: true,
cursorType: "pointer",
fontFamily: dmSans.style.fontFamily,
fontFamily:
'system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"',
defaultGradient: {
from: "#388cdb",
to: "#0f037f",

View File

@ -1,4 +1,5 @@
import React from "react";
import type { GetStaticProps, InferGetStaticPropsType } from "next";
import Head from "next/head";
import "@mantine/carousel/styles.css";
import styled from "styled-components";
@ -7,6 +8,7 @@ import { FAQ } from "src/containers/Landing/FAQ";
import { Features } from "src/containers/Landing/Features";
import { HeroPreview } from "src/containers/Landing/HeroPreview";
import { HeroSection } from "src/containers/Landing/HeroSection";
import { LovedBy } from "src/containers/Landing/LovedBy";
import { PremiumVsFree } from "src/containers/Landing/PremiumVsFree";
import { Pricing } from "src/containers/Landing/Pricing";
import Layout from "src/layout/Layout";
@ -24,7 +26,7 @@ const StyledSectionWrapper = styled.div`
}
`;
export const HomePage = () => {
export const HomePage = ({ stars }: InferGetStaticPropsType<typeof getStaticProps>) => {
return (
<Layout>
<Head>
@ -39,6 +41,7 @@ export const HomePage = () => {
</StyledSectionWrapper>
<Features />
<PremiumVsFree />
<LovedBy stars={stars} />
<Pricing />
<FAQ />
</Layout>
@ -46,3 +49,12 @@ export const HomePage = () => {
};
export default HomePage;
export const getStaticProps = (async () => {
const res = await fetch("https://api.github.com/repos/AykutSarac/jsoncrack.com");
const repo = await res.json();
const stars = repo.stargazers_count;
return { props: { stars } };
}) satisfies GetStaticProps<{
stars: number;
}>;

View File

@ -17,7 +17,7 @@ import {
import styled from "styled-components";
import { AiOutlineInfoCircle } from "react-icons/ai";
import { IoIosCheckmarkCircle } from "react-icons/io";
import { IoCheckmarkCircle } from "react-icons/io5";
import { IoCheckmarkCircle, IoCloseCircle } from "react-icons/io5";
// import { PiChats } from "react-icons/pi";
import { VscArrowRight, VscLinkExternal } from "react-icons/vsc";
import Layout from "src/layout/Layout";
@ -274,7 +274,7 @@ export const PricingCards = () => {
<List.Item>
<Tooltip
color="blue"
label="Visualize up to ~4 MB or above depending on your hardware"
label="Visualize up to 4 MB of data"
maw={350}
multiline
withArrow
@ -338,7 +338,7 @@ export const PricingCards = () => {
textUnderlineOffset: "2px",
}}
>
Update Data on Graphs
Edit Data on Graph
</Text>
</Tooltip>
</List.Item>
@ -354,7 +354,12 @@ export const PricingCards = () => {
</List.Item>
<List.Item>
<Text c="black" fw={500} fz="sm">
AI powered data filter
AI-powered data filter
</Text>
</List.Item>
<List.Item>
<Text c="black" fw={500} fz="sm">
Customize graph colors
</Text>
</List.Item>
</List>
@ -456,6 +461,31 @@ export const PricingCards = () => {
Store 25 documents
</Text>
</List.Item>
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
<Text c="gray.7" fw={500} fz="sm">
Compact Visualization
</Text>
</List.Item>
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
<Text c="gray.7" 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
</Text>
</List.Item>
<List.Item icon={<IoCloseCircle color="gray" size={20} />}>
<Text c="gray.7" fw={500} fz="sm">
Customize graph colors
</Text>
</List.Item>
</List>
</Flex>
</StyledPaper>