1- import NotesIcon from "@/app/conf/_design-system/pixelarticons/notes.svg?svgr"
2- import TournamentIcon from "@/app/conf/_design-system/pixelarticons/tournament.svg?svgr"
3- import ModemIcon from "@/app/conf/_design-system/pixelarticons/modem.svg?svgr"
4- import ZapIcon from "@/app/conf/_design-system/pixelarticons/zap.svg?svgr"
51import { GraphQLWordmarkLogo } from "@/icons"
6- import { CityQuery } from "@/components/code-blocks"
2+ import { MobileDiagram } from "@/components/index-page/what-is-graphql/wires"
3+ import wiresStyles from "@/components/index-page/what-is-graphql/wires.module.css"
74
85import { BannerFrame } from "./banner-frame"
96import { BlobStripes } from "./blob-stripes"
7+ import { CityQuerySnippet } from "./city-query-snippet"
108import { QRPlaceholder } from "./qr-placeholder"
11- import { BannerTrustedFooter } from "./trusted-logos"
12-
13- const features = [
14- {
15- Icon : NotesIcon ,
16- label : "Typesafe\nschemas" ,
17- iconClassName : "text-pri-base" ,
18- } ,
19- {
20- Icon : TournamentIcon ,
21- label : "Distributed\nby design" ,
22- iconClassName : "text-pri-base" ,
23- } ,
24- {
25- Icon : ModemIcon ,
26- label : "Data\ncolocation" ,
27- iconClassName : "text-pri-base" ,
28- } ,
29- {
30- Icon : ZapIcon ,
31- label : "Performance\nat scale" ,
32- iconClassName : "text-sec-base" ,
33- } ,
34- ] as const
9+ import { TRUSTED_LOGOS } from "./trusted-logos"
3510
3611export function LanguageBanner ( ) {
3712 return (
3813 < BannerFrame
3914 slug = "language"
4015 caption = "GraphQL — the query language"
41- className = "flex flex-col bg-[#0A0B08] px-9 pt -9 text-white"
16+ className = "flex flex-col gap-7 bg-[#0A0B08] p -9 text-white"
4217 >
4318 < BlobStripes
4419 position = "70% 30%"
4520 size = "155%"
4621 stripeWidth = "14px"
47- evenClassName = "bg-[linear-gradient(180deg,rgba(225,0,152 ,0.22 )_0%,rgba(225,0,152 ,0.04 )_100%)]"
48- oddClassName = "bg-[linear-gradient(180deg,rgba(225,0,152 ,0.06 )_0%,rgba(132,0,89 ,0.18)_100%)]"
22+ evenClassName = "bg-[linear-gradient(180deg,rgba(132,205,22 ,0.18 )_0%,rgba(132,205,22 ,0.03 )_100%)]"
23+ oddClassName = "bg-[linear-gradient(180deg,rgba(132,205,22 ,0.04 )_0%,rgba(70,109,11 ,0.18)_100%)]"
4924 />
5025
5126 < div className = "z-10 flex items-center justify-between" >
@@ -55,81 +30,47 @@ export function LanguageBanner() {
5530 style = { { letterSpacing : "0.02em" } }
5631 >
5732 < span > schema-first</ span >
58- < span className = "text-pri-base " > •</ span >
33+ < span className = "text-sec-light " > •</ span >
5934 < span > typesafe</ span >
60- < span className = "text-pri-base " > •</ span >
35+ < span className = "text-sec-light " > •</ span >
6136 < span > flexible</ span >
62- < span className = "text-pri-base " > •</ span >
37+ < span className = "text-sec-light " > •</ span >
6338 < span > fast</ span >
6439 </ div >
6540 </ div >
6641
67- < div className = "absolute z-10" style = { { top : 130 } } >
68- < h2 className = "m-0 text-[60px] font-medium leading-none tracking-tight" >
69- The query
70- </ h2 >
71- < div className = "mt-0.5 text-[60px] font-medium leading-none tracking-tight text-pri-base" >
72- language
73- </ div >
74- < div
75- className = "mt-2 text-[54px] font-medium leading-none text-sec-base"
76- style = { { letterSpacing : "-0.02em" } }
77- >
78- for your API
79- </ div >
80- </ div >
42+ < h2 className = "z-10 mb-0 mt-16 text-[60px] font-medium leading-[1.05] tracking-tight" >
43+ The query
44+ < br />
45+ language
46+ < br />
47+ for your API
48+ </ h2 >
8149
82- < div className = "absolute z-10" style = { { top : 380 } } >
83- < p
84- className = "typography-body-lg m-0 text-white/80"
85- style = { { lineHeight : 1.4 , textWrap : "pretty" } }
86- >
87- An open-standard query language and runtime that lets clients ask for
88- exactly the data they need — and nothing more.
89- </ p >
90- </ div >
91-
92- < div
93- className = "absolute z-10 grid grid-cols-4 gap-2"
94- style = { { top : 590 } }
50+ < p
51+ className = "typography-body-lg z-10 m-0 text-white/80"
52+ style = { { lineHeight : 1.4 , textWrap : "pretty" } }
9553 >
96- { features . map ( ( { Icon, label, iconClassName } ) => (
54+ An open-standard query language and runtime that lets clients ask for
55+ exactly the data they need — and nothing more.
56+ </ p >
57+
58+ < div className = "relative isolate z-10 flex flex-1 items-center justify-center" >
59+ < MobileDiagram step = { 1 } className = "block overflow-visible" />
60+ < div className = "pointer-events-none absolute inset-0 flex items-center justify-center" >
9761 < div
98- key = { label }
99- className = "flex flex-col items-center gap-3.5 px-1 py-2"
62+ className = { ` ${ wiresStyles . highlightsQuery } border border-sec-base/25 bg-[#0A0B08]/80 py-3 backdrop-blur-sm` }
63+ style = { { [ "--highlight-opacity" as string ] : 1 } }
10064 >
101- < div className = "flex size-12 items-center justify-center" >
102- < Icon className = { `block size-9 ${ iconClassName } ` } />
103- </ div >
104- < div
105- className = "whitespace-pre-line text-center text-[13px] text-white/85"
106- style = { { lineHeight : 1.25 } }
107- >
108- { label }
109- </ div >
65+ < CityQuerySnippet />
11066 </ div >
111- ) ) }
112- </ div >
113-
114- < div className = "absolute inset-x-9 z-10" style = { { top : 810 } } >
115- < CityQuery />
67+ </ div >
11668 </ div >
117- { /* Force shiki's dark theme tokens for this banner only — the page renders
118- light-themed by default, but this banner is dark. */ }
119- < style > { `
120- [data-print-banner="language"] .nextra-code span {
121- background-color: var(--shiki-dark-bg);
122- color: var(--shiki-dark);
123- }
124- ` } </ style >
12569
126- < div
127- className = "absolute z-10 grid grid-cols-2 gap-2.5"
128- style = { { top : 1020 } }
129- >
70+ < div className = "z-10 mt-auto grid grid-cols-2 gap-2.5" >
13071 < div className = "flex h-24 items-center gap-3.5 border border-white/10 bg-white/[0.02] p-3.5" >
131- < div className = "flex size-16 shrink-0 items-center justify-center border-[1.5px] border-pri -base" >
132- < ArrowRightLine className = "size-7 text-pri -base" />
72+ < div className = "flex size-16 shrink-0 items-center justify-center border-[1.5px] border-sec -base" >
73+ < ArrowRightLine className = "size-7 text-sec -base" />
13374 </ div >
13475 < div className = "min-w-0" >
13576 < div
@@ -170,7 +111,28 @@ export function LanguageBanner() {
170111 </ div >
171112 </ div >
172113
173- < BannerTrustedFooter />
114+ < div className = "z-10" >
115+ < div
116+ className = "mb-3 font-mono text-[11px] uppercase text-white/55"
117+ style = { { letterSpacing : "0.04em" } }
118+ >
119+ Trusted in production
120+ </ div >
121+ < div className = "grid grid-cols-5 grid-rows-2 items-center gap-x-2 gap-y-3" >
122+ { TRUSTED_LOGOS . map ( ( { name, Component, height } ) => (
123+ < div
124+ key = { name }
125+ className = "flex h-[38px] min-w-0 items-center justify-center overflow-hidden"
126+ aria-label = { name }
127+ >
128+ < Component
129+ className = "max-h-full w-auto max-w-full shrink"
130+ style = { { height, filter : "brightness(0) invert(1)" } }
131+ />
132+ </ div >
133+ ) ) }
134+ </ div >
135+ </ div >
174136 </ BannerFrame >
175137 )
176138}
0 commit comments