|
1 | | -import Link from "next/link" |
2 | | -import { GraphQLLogo } from "@/icons" |
3 | 1 | import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration" |
4 | 2 | import CheckIcon from "@/app/conf/_design-system/pixelarticons/check.svg?svgr" |
5 | 3 | import { Button } from "@/app/conf/_design-system/button" |
| 4 | +import { ImageLoaded } from "@/app/conf/2025/components/image-loaded" |
| 5 | + |
| 6 | +import logoBlurred from "./hero/logo-blurred.png" |
6 | 7 |
|
7 | 8 | export function Hero() { |
8 | 9 | return ( |
9 | | - <div className="relative min-h-screen bg-neu-0"> |
10 | | - <HeroStripes /> |
11 | | - |
12 | | - <div className="flex max-w-4xl flex-col gap-10 py-24 pl-24 pr-10"> |
13 | | - <h1 className="typography-h1 max-w-3xl text-neu-900"> |
14 | | - The query language for modern APIs |
15 | | - </h1> |
| 10 | + <div className="relative bg-neu-0"> |
| 11 | + <div className="gql-conf-container flex flex-col-reverse lg:grid lg:grid-cols-2"> |
| 12 | + <div className="flex max-w-4xl flex-col justify-center gap-4 p-4 lg:min-h-[800px] xl:gap-8 xl:py-24 xl:pl-24 xl:pr-10"> |
| 13 | + <h1 className="typography-h1 max-w-3xl text-neu-900"> |
| 14 | + The query language for modern APIs |
| 15 | + </h1> |
16 | 16 |
|
17 | | - <ul className="flex flex-col gap-2"> |
18 | | - {[ |
19 | | - "Deliver high-performance user experience at scale", |
20 | | - "Secure and stabilize your API with a strongly typed schema and validated queries", |
21 | | - "Reduce dependencies through efficient, distributed development", |
22 | | - ].map((item, index) => ( |
23 | | - <li key={index} className="flex items-center gap-1"> |
24 | | - <CheckIcon className="size-6 shrink-0 text-pri-base" /> |
25 | | - <p className="typography-body-sm text-neu-800">{item}</p> |
26 | | - </li> |
27 | | - ))} |
28 | | - </ul> |
| 17 | + <ul className="flex flex-col gap-2"> |
| 18 | + {[ |
| 19 | + "Deliver high-performance user experience at scale", |
| 20 | + "Secure and stabilize your API with a strongly typed schema and validated queries", |
| 21 | + "Reduce dependencies through efficient, distributed development", |
| 22 | + ].map((item, index) => ( |
| 23 | + <li key={index} className="flex items-start gap-1"> |
| 24 | + <CheckIcon className="size-6 shrink-0 text-pri-base max-lg:mt-px" /> |
| 25 | + <p className="text-pretty text-neu-800">{item}</p> |
| 26 | + </li> |
| 27 | + ))} |
| 28 | + </ul> |
29 | 29 |
|
30 | | - <div className="flex items-center gap-4"> |
31 | | - <Button href="/learn">Get Started</Button> |
| 30 | + <div className="flex items-center gap-4"> |
| 31 | + <Button href="/learn" className="max-sm:w-full"> |
| 32 | + Learn more |
| 33 | + </Button> |
| 34 | + </div> |
32 | 35 | </div> |
| 36 | + <HeroStripes /> |
33 | 37 | </div> |
34 | 38 | </div> |
35 | 39 | ) |
36 | 40 | } |
37 | 41 |
|
38 | 42 | function HeroStripes() { |
39 | 43 | return ( |
40 | | - <div className="pointer-events-none absolute right-0 top-0 h-full overflow-hidden"> |
| 44 | + <div className="pointer-events-none relative overflow-hidden max-lg:h-[210px]"> |
| 45 | + <ImageLoaded |
| 46 | + image={logoBlurred} |
| 47 | + className="relative h-full bg-gradient-to-b from-pri-base to-pri-lighter opacity-0 transition-opacity duration-[1.5s] [mask-position:center_12%] [mask-size:110%] data-[loaded=true]:opacity-100 dark:to-pri-base lg:[mask-position:7%_7%] lg:[mask-size:200%]" |
| 48 | + style={{ |
| 49 | + maskImage: `url(${logoBlurred.src})`, |
| 50 | + maskRepeat: "no-repeat", |
| 51 | + }} |
| 52 | + /> |
41 | 53 | <StripesDecoration |
42 | 54 | stripeWidth="5px" |
43 | | - oddClassName="bg-gradient-to-b from-sec-base to-pri-lighter" |
| 55 | + oddClassName="bg-gradient-to-b from-sec-base to-pri-lighter dark:from-sec-darker dark:to-pri-darker" |
44 | 56 | /> |
45 | 57 | </div> |
46 | 58 | ) |
|
0 commit comments