Skip to content

Commit f8a07c8

Browse files
committed
Add grid borders to the footer
1 parent 293eb4f commit f8a07c8

File tree

2 files changed

+80
-41
lines changed

2 files changed

+80
-41
lines changed

src/app/conf/2025/components/footer/index.tsx

Lines changed: 73 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,41 @@ import { SocialIcons } from "../../../_components/social-icons"
66

77
import blurBean from "./blur-bean.webp"
88

9+
interface FooterLink {
10+
href: string
11+
children: ReactNode
12+
disabled?: boolean
13+
}
14+
915
export function Footer({
1016
links,
1117
logo,
1218
}: {
13-
links: { href: string; children: string; "aria-disabled"?: true }[][]
19+
links: (FooterLink | FooterLink[])[]
1420
logo: ReactNode
1521
}) {
1622
return (
17-
<footer className="gql-conf-section gql-all-anchors-focusable relative !bg-neu-100 py-10 text-neu-900 typography-menu dark:!bg-neu-0 max-md:px-0 max-md:pt-0 lg:py-20">
23+
<footer className="gql-all-anchors-focusable relative !bg-neu-100 text-neu-900 typography-menu dark:!bg-neu-0 max-md:px-0 max-md:pt-0">
1824
<Stripes />
19-
<div className="mb-10 flex flex-wrap items-start justify-between xl:mb-32 xl:gap-10">
20-
<div className="border-neu-400 p-5 max-md:w-full max-md:border-b md:p-4">
21-
{logo}
25+
<div className="flex flex-wrap justify-between gap-4 border-neu-400 p-4 max-md:w-full max-md:border-b lg:p-10">
26+
{logo}
27+
<div className="flex gap-x-4 gap-y-2 typography-body-lg">
28+
<p className="flex items-center gap-2">
29+
<time dateTime="2025-09-08">September 08</time>
30+
<span>-</span>
31+
<time dateTime="2025-09-10">10, 2025</time>
32+
</p>
33+
<address className="not-italic">Amsterdam, Netherlands</address>
2234
</div>
23-
{links.map((link, i) => (
24-
<ul key={i} className="max-md:contents">
25-
{link.map(({ "aria-disabled": isDisabled, children, ...link }) => (
26-
<li key={link.href} className="mb-3.5 max-md:w-1/2">
27-
<NextLink
28-
{...link}
29-
className={clsx(
30-
"gql-focus-visible block p-5",
31-
isDisabled
32-
? "pointer-events-none"
33-
: "underline-offset-4 hover:underline",
34-
)}
35-
tabIndex={isDisabled ? -1 : undefined}
36-
>
37-
{children}
38-
</NextLink>
39-
</li>
40-
))}
41-
</ul>
42-
))}
4335
</div>
44-
<div className="relative flex justify-between gap-10 text-sm max-lg:flex-col max-md:px-5">
36+
<ul className="grid grid-cols-2 gap-px bg-neu-400 py-px lg:grid-cols-4">
37+
{links.map((box, i) => (
38+
<li className="bg-neu-100 dark:bg-neu-0 lg:h-32" key={i}>
39+
<FooterBox box={box} />
40+
</li>
41+
))}
42+
</ul>
43+
<div className="relative flex justify-between gap-10 px-6 py-4 text-sm max-lg:flex-col">
4544
<div className="flex flex-col font-light max-md:gap-5">
4645
<p>
4746
Copyright © {new Date().getFullYear()} The GraphQL Foundation. All
@@ -89,14 +88,17 @@ function Stripes() {
8988
[--end-2:hsl(var(--color-pri-dark)/0.8)]
9089
dark:[--start-2:rgba(255,204,239,.1)]
9190
dark:[--end-2:hsl(var(--color-pri-base)/.8)]
91+
92+
mix-blend-darken
93+
dark:mix-blend-lighten
9294
"
9395
style={{
9496
maskImage: `url(${blurBean.src})`,
9597
WebkitMaskImage: `url(${blurBean.src})`,
96-
maskPosition: "center 300px",
97-
WebkitMaskPosition: "center 300px",
98-
maskSize: "200% 110%",
99-
WebkitMaskSize: "200% 110%",
98+
maskPosition: "center 200px",
99+
WebkitMaskPosition: "center 200px",
100+
maskSize: "200% 100%",
101+
WebkitMaskSize: "200% 100%",
100102
maskRepeat: "no-repeat",
101103
WebkitMaskRepeat: "no-repeat",
102104
maskOrigin: "top",
@@ -119,3 +121,44 @@ function Stripes() {
119121
</div>
120122
)
121123
}
124+
125+
function FooterBox({ box }: { box: FooterLink | FooterLink[] }) {
126+
if (Array.isArray(box)) {
127+
return (
128+
<div className="relative flex flex-col p-3">
129+
{box.map(link => (
130+
<NextLink
131+
key={link.href}
132+
href={link.href}
133+
title={link.disabled ? "Coming soon" : undefined}
134+
className={clsx(
135+
"gql-focus-visible block h-full p-3 first:font-bold",
136+
link.disabled
137+
? "pointer-events-none"
138+
: "underline-offset-4 hover:underline",
139+
)}
140+
tabIndex={link.disabled ? -1 : undefined}
141+
>
142+
{link.children}
143+
</NextLink>
144+
))}
145+
</div>
146+
)
147+
}
148+
149+
const { href, children, disabled } = box
150+
151+
return (
152+
<NextLink
153+
href={href}
154+
title={disabled ? "Coming soon" : undefined}
155+
className={clsx(
156+
"gql-focus-visible relative block h-full p-6",
157+
disabled ? "pointer-events-none" : "underline-offset-4 hover:underline",
158+
)}
159+
tabIndex={disabled ? -1 : undefined}
160+
>
161+
{children}
162+
</NextLink>
163+
)
164+
}

src/app/conf/2025/layout.tsx

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,14 @@ export default function Layout({
5454
<Footer
5555
logo={<GraphQLConfLogoLink year={2025} />}
5656
links={[
57+
{ children: "Sponsor", href: "/conf/2025/#sponsors" },
58+
{ children: "Speakers", href: "/#speakers" },
59+
{ children: "GraphQLConf 2024", href: "/conf/2024" },
60+
{ children: "FAQ", href: "#faq" },
61+
{ children: "Contact Us", href: "/conf/2025/faq/#contact" },
62+
{ children: "GraphQL", href: "/" },
63+
{ children: "GraphQL Foundation", href: "/foundation" },
5764
[
58-
{ children: "Sponsor", href: "/conf/2025/#sponsors" },
59-
{ children: "Speakers", href: "/#speakers" },
60-
{ children: "GraphQLConf 2024", href: "/conf/2024" },
61-
],
62-
[
63-
{ children: "FAQ", href: "#faq" },
64-
{ children: "Contact Us", href: "/conf/2025/faq/#contact" },
65-
],
66-
[
67-
{ children: "GraphQL", href: "/" },
68-
{ children: "GraphQL Foundation", href: "/foundation" },
6965
{
7066
children: "Code of Conduct",
7167
href: "/conf/2025/resources/#code-of-conduct",

0 commit comments

Comments
 (0)