Skip to content

Commit a10a23e

Browse files
committed
Add remaining marquee sections
1 parent 67c7333 commit a10a23e

File tree

4 files changed

+82
-20
lines changed

4 files changed

+82
-20
lines changed

src/app/conf/2025/components/marquee-under-hero/index.tsx renamed to src/app/conf/2025/components/marquee-rows/index.tsx

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,46 @@
1-
import { Fragment } from "react"
1+
import { Fragment, ReactNode } from "react"
22

33
import { Marquee } from "@/app/conf/_design-system/marquee"
44

55
import CodeIcon from "../../pixelarticons/code.svg?svgr"
66

77
import blurWave from "./blur.webp"
88
import { StripesDecoration } from "@/app/conf/_design-system/stripes-decoration"
9+
import { clsx } from "clsx"
910

10-
const keywords = [
11-
["COMMUNITY", "DEVELOPER EXPERIENCE", "APIs", "TOOLS & LIBRARIES"],
12-
["OPEN SOURCE", "FEDERATION", "ECOSYSTEMS", "TRACING & OBSERVABILITY"],
13-
["BEST PRACTICES", "WORKSHOPS", "SCHEMAS", "SECURITY"],
14-
]
11+
export interface MarqueeRowsProps extends React.HTMLAttributes<HTMLDivElement> {
12+
items: ReactNode[][]
13+
variant: "primary" | "secondary"
14+
}
15+
16+
export function MarqueeRows({
17+
items,
18+
className,
19+
variant,
20+
...rest
21+
}: MarqueeRowsProps) {
22+
const separator = (
23+
<CodeIcon
24+
className={clsx(
25+
"size-8 md:size-10",
26+
variant === "primary"
27+
? "text-pri-dark dark:text-pri-light"
28+
: "text-pri-base",
29+
)}
30+
/>
31+
)
1532

16-
export function MarqueeUnderHero() {
1733
return (
18-
<section className="relative pt-4 font-mono text-xl/none text-pri-base max-sm:pb-1 sm:pt-6 md:space-y-2 md:pt-12 md:text-[56px]/none xl:pt-16">
19-
<Stripes />
20-
{keywords.map((row, i) => (
34+
<section
35+
className={clsx(
36+
"relative font-mono text-xl/none md:text-[56px]/none",
37+
variant === "primary" ? "text-pri-base" : "text-neu-900",
38+
className,
39+
)}
40+
{...rest}
41+
>
42+
{variant === "primary" && <Stripes />}
43+
{items.map((row, i) => (
2144
<Marquee
2245
key={i}
2346
gap={16}
@@ -26,13 +49,12 @@ export function MarqueeUnderHero() {
2649
className="relative *:select-none"
2750
reverse={i % 2 === 1}
2851
drag
52+
separator={separator}
2953
>
30-
{row.map((keyword, j) => (
31-
<Fragment key={keyword}>
32-
<span>{keyword}</span>
33-
{j !== row.length - 1 && (
34-
<CodeIcon className="size-8 text-pri-dark dark:text-pri-light md:size-10" />
35-
)}
54+
{row.map((item, j) => (
55+
<Fragment key={j}>
56+
{item}
57+
{j !== row.length - 1 && separator}
3658
</Fragment>
3759
))}
3860
</Marquee>

src/app/conf/2025/page.tsx

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,28 @@ import { GetYourTicket } from "./components/get-your-ticket"
1111
import { RegisterSection } from "./components/register-section"
1212
import { Sponsors } from "./components/sponsors"
1313
import { GraphQLFoundationCard } from "./components/graphql-foundation-card"
14-
import { MarqueeUnderHero } from "./components/marquee-under-hero"
14+
import { MarqueeRows } from "./components/marquee-rows"
15+
1516
export const metadata: Metadata = {
1617
title: "GraphQLConf 2025 — Sept 08-10",
1718
}
1819

20+
const HERO_MARQUEE_ITEMS = [
21+
["COMMUNITY", "DEVELOPER EXPERIENCE", "APIs", "TOOLS & LIBRARIES"],
22+
["OPEN SOURCE", "FEDERATION", "ECOSYSTEMS", "TRACING & OBSERVABILITY"],
23+
["BEST PRACTICES", "WORKSHOPS", "SCHEMAS", "SECURITY"],
24+
]
25+
1926
export default function Page() {
2027
return (
21-
<main className="gql-all-anchors-focusable antialiased">
28+
<main className="gql-all-anchors-focusable">
2229
<Hero />
2330
<div className="gql-conf-container gql-conf-navbar-strip text-neu-900 before:bg-white/40 before:dark:bg-blk/30">
24-
<MarqueeUnderHero />
31+
<MarqueeRows
32+
variant="primary"
33+
className="pt-4 max-sm:pb-1 sm:pt-6 md:space-y-2 md:pt-12 xl:pt-16"
34+
items={HERO_MARQUEE_ITEMS}
35+
/>
2536
<RegisterToday className="md:mb-8 md:mt-16" />
2637
<WhatToExpectSection className="md:mb-8 md:mt-24" />
2738
<TopMindsSection className="md:mb-8 md:mt-24" hasSpeakersPage={false} />
@@ -34,9 +45,33 @@ export default function Page() {
3445
<Sponsors heading="Thanks to our 2024 sponsors!" />
3546
<Sponsor />
3647
<CallForProposals />
48+
<MarqueeRows
49+
variant="secondary"
50+
items={[
51+
["AMSTERDAM", "SEPTEMBER 2025", "THREE DAYS", "PAKHUIS DE ZWIJGER"],
52+
[
53+
"THREE DAYS",
54+
"PAKHUIS DE ZWIJGER",
55+
"NETHERLANDS",
56+
"PIET HEINKADE 179",
57+
],
58+
[
59+
"NETHERLANDS",
60+
"10 YEARS OF GRAPHQL",
61+
"8-10 SEPTEMBER",
62+
"AMSTERDAM",
63+
],
64+
]}
65+
className="my-8 xl:mb-16 xl:mt-10 2xl:mb-24"
66+
/>
3767
<Venue />
3868
<GraphQLFoundationCard />
3969
<FAQ />
70+
<MarqueeRows
71+
variant="secondary"
72+
items={HERO_MARQUEE_ITEMS}
73+
className="my-8 xl:my-16"
74+
/>
4075
</div>
4176
</main>
4277
)

src/app/conf/_design-system/marquee.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface MarqueeProps {
1414
reverse?: boolean
1515
className?: string
1616
drag?: boolean
17+
separator?: React.ReactNode
1718
}
1819

1920
export function Marquee({
@@ -25,6 +26,7 @@ export function Marquee({
2526
reverse = false,
2627
className,
2728
drag = false,
29+
separator,
2830
}: MarqueeProps) {
2931
const [currentSpeed, setCurrentSpeed] = useState(speed)
3032
const [ref, { width, height }] = useMeasure()
@@ -130,7 +132,10 @@ export function Marquee({
130132
{...hoverProps}
131133
>
132134
{Array.from({ length: multiples }).map((_, i) => (
133-
<Fragment key={i}>{children}</Fragment>
135+
<Fragment key={i}>
136+
{children}
137+
{separator}
138+
</Fragment>
134139
))}
135140
</motion.div>
136141
</div>

0 commit comments

Comments
 (0)