-
+
GraphQLConf is presented by the GraphQL Foundation, uniting the global
diff --git a/src/app/conf/2025/components/hero/index.tsx b/src/app/conf/2025/components/hero/index.tsx
index 5cac0ba2a3..7868528c6c 100644
--- a/src/app/conf/2025/components/hero/index.tsx
+++ b/src/app/conf/2025/components/hero/index.tsx
@@ -14,7 +14,7 @@ export function Hero() {
return (
-
+
@@ -35,7 +35,7 @@ export function Hero() {
-
+
@@ -55,7 +55,7 @@ export function Hero() {
)
}
-function DateAndLocation() {
+export function HeroDateAndLocation() {
return (
@@ -77,7 +77,7 @@ const maskEven =
const maskOdd =
"repeating-linear-gradient(to right, black, black 12px, transparent 12px, transparent 24px)"
-function Stripes() {
+export function HeroStripes() {
return (
()
+
export interface ImageLoadedProps extends React.HTMLAttributes {
image: string | StaticImageData
}
export function ImageLoaded({ image, ...rest }: ImageLoadedProps) {
const [loaded, setLoaded] = useState(false)
+ const src = typeof image === "string" ? image : image.src
+
+ const alreadyLoaded = _cache.get(src)?.complete
useEffect(() => {
- const img = new Image()
- const src = typeof image === "string" ? image : image.src
- img.src = src
- img.onload = () => setLoaded(true)
- }, [image])
+ let img: HTMLImageElement
+ if (_cache.has(src)) {
+ img = _cache.get(src)!
+ if (img.complete) {
+ setLoaded(true)
+ } else {
+ img.addEventListener("load", () => setLoaded(true))
+ }
+ } else {
+ img = new Image()
+ img.src = src
+ img.addEventListener("load", () => setLoaded(true))
+ _cache.set(src, img)
+ }
+ }, [src])
- return
+ return
}
diff --git a/src/app/conf/2025/components/marquee-rows/index.tsx b/src/app/conf/2025/components/marquee-rows/index.tsx
index af8647a28e..5706113f3f 100644
--- a/src/app/conf/2025/components/marquee-rows/index.tsx
+++ b/src/app/conf/2025/components/marquee-rows/index.tsx
@@ -33,7 +33,7 @@ export function MarqueeRows({
return (
{
+ // todo: block scrolling on body
setMobileDrawerOpen(prev => !prev)
}, [])
diff --git a/src/app/conf/2025/components/sponsors.tsx b/src/app/conf/2025/components/sponsors.tsx
index 573eb8ae2c..07a250de66 100644
--- a/src/app/conf/2025/components/sponsors.tsx
+++ b/src/app/conf/2025/components/sponsors.tsx
@@ -1,10 +1,4 @@
-import Stellate from "public/img/conf/Sponsors/Stellate.svg?svgr"
-import Hasura from "public/img/conf/Sponsors/Hasura.svg?svgr"
-import TheGuild from "public/img/conf/Sponsors/TheGuild.svg?svgr"
-import Apollo from "public/img/conf/Sponsors/Apollo.svg?svgr"
-import Tyk from "public/img/conf/Sponsors/Tyk.svg?svgr"
-import IBM from "public/img/conf/Sponsors/IBM.svg?svgr"
-import Graphweaver from "public/img/conf/Sponsors/Graphweaver.svg?svgr"
+import Grafbase from "public/img/conf/Sponsors/Grafbase.svg?svgr"
import { clsx } from "clsx"
import { ChevronRight } from "../pixelarticons/chevron-right"
@@ -15,20 +9,12 @@ interface Sponsor {
link: string
}
-const sponsorDiamond: Sponsor[] = [
- { icon: TheGuild, name: "The Guild", link: "https://the-guild.dev" },
- { icon: IBM, name: "IBM", link: "https://www.ibm.com/products/api-connect" },
-]
+const sponsorDiamond: Sponsor[] = []
-const sponsorGold: Sponsor[] = [
- { icon: Apollo, name: "Apollo", link: "https://www.apollographql.com/" },
- { icon: Graphweaver, name: "Graphweaver", link: "https://graphweaver.com" },
- { icon: Hasura, name: "Hasura", link: "https://hasura.io" },
-]
+const sponsorGold: Sponsor[] = []
const sponsorSilver: Sponsor[] = [
- { icon: Stellate, name: "Stellate", link: "https://stellate.co" },
- { icon: Tyk, name: "Tyk", link: "https://tyk.io/" },
+ { icon: Grafbase, name: "Grafbase", link: "https://grafbase.com/" },
]
export interface SponsorsProps {
@@ -57,13 +43,13 @@ const sponsorTiers: Tier[] = [
export function Sponsors({ heading }: SponsorsProps) {
return (
-
+
{heading}
- {sponsorTiers.map(tier => (
-
- ))}
+ {sponsorTiers.map(
+ tier => tier.items.length > 0 && ,
+ )}
)
@@ -78,7 +64,7 @@ function Tier({ tier }: { tier: Tier }) {
{tier.items.map(({ link, icon: Icon, name }, i) => (
diff --git a/src/app/conf/2025/components/what-to-expect.tsx b/src/app/conf/2025/components/what-to-expect.tsx
index 539701cb1e..1666bb1a22 100644
--- a/src/app/conf/2025/components/what-to-expect.tsx
+++ b/src/app/conf/2025/components/what-to-expect.tsx
@@ -13,12 +13,12 @@ export default function WhatToExpectSection({
{...rest}
>
What to expect
-
+
+
)
}
diff --git a/src/app/conf/2025/layout.tsx b/src/app/conf/2025/layout.tsx
index bdd77b4c68..4bb4bfeb77 100644
--- a/src/app/conf/2025/layout.tsx
+++ b/src/app/conf/2025/layout.tsx
@@ -40,9 +40,9 @@ export default function Layout({
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
)
diff --git a/src/app/conf/2025/pixelarticons/arrow-down.svg b/src/app/conf/2025/pixelarticons/arrow-down.svg
index 642c02b9f3..bc9157f91b 100644
--- a/src/app/conf/2025/pixelarticons/arrow-down.svg
+++ b/src/app/conf/2025/pixelarticons/arrow-down.svg
@@ -1,3 +1,13 @@
-