From e276a987f2447bf66af74cc7bf9b63ba5f10aa2d Mon Sep 17 00:00:00 2001 From: Akash Kumar Date: Sat, 8 Aug 2026 23:01:03 +0530 Subject: [PATCH 1/6] fix: correct CTA spacing on Events page and add missing Event structured-data fields (#725) Signed-off-by: Akash Kumar --- src/components/EventLanding.js | 20 ++++++++++++++++++++ src/data/events.js | 2 ++ src/pages/events.module.css | 6 +++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/components/EventLanding.js b/src/components/EventLanding.js index f5f915a0e..90c0ef8d7 100644 --- a/src/components/EventLanding.js +++ b/src/components/EventLanding.js @@ -72,6 +72,26 @@ export default function EventLanding({ slug }) { description: pick(locale, event.description), image: bannerUrl ? `${siteConfig.url}${bannerUrl}` : undefined, eventAttendanceMode: "https://schema.org/OfflineEventAttendanceMode", + eventStatus: `https://schema.org/${event.eventStatus || "EventScheduled"}`, + organizer: { + "@type": "Organization", + name: "HAMi", + url: "https://project-hami.io/", + }, + offers: { + "@type": "Offer", + url: event.externalUrl || `${siteConfig.url}/events/${event.slug}`, + price: event.price ?? "0", + priceCurrency: event.priceCurrency || "USD", + availability: "https://schema.org/InStock", + validFrom: event.offerValidFrom || event.date, + }, + ...(event.speaker && { + performer: { + "@type": "Person", + name: event.speaker, + }, + }), }; return ( diff --git a/src/data/events.js b/src/data/events.js index 81c4e049a..9aa48d657 100644 --- a/src/data/events.js +++ b/src/data/events.js @@ -6,6 +6,7 @@ const events = [ zh: "从项目到生产:HAMi 与 Viettel Cloud 亮相 KCD 越南", }, date: "2026-07-25", + speaker: "fishman, The Anh Nguyen", location: { en: "Hanoi, Vietnam", zh: "越南 河内", @@ -47,6 +48,7 @@ const events = [ zh: "HAMi 亮相 KubeCon 日本 2026", }, date: "2026-07-28", + speaker: "Jeonghyun Kim, Reza Jelveh", endDate: "2026-07-30", location: { en: "Yokohama, Japan", diff --git a/src/pages/events.module.css b/src/pages/events.module.css index ab1fb41bd..fe3ded28c 100644 --- a/src/pages/events.module.css +++ b/src/pages/events.module.css @@ -295,17 +295,17 @@ } .ctaList { - margin: 0 0 var(--hami-space-32); + margin: 0 auto var(--hami-space-32); padding: 0 0 0 2rem; - display: inline-flex; + display: flex; flex-direction: column; gap: var(--hami-space-8); color: var(--hami-color-muted); font-size: 0.96rem; line-height: 1.6; text-align: left; + max-width: fit-content; } - /* ── dark mode ── */ [data-theme="dark"] .dayCard { From 6c00ae4fa7301041a2d9b8b797227f69a9b29369 Mon Sep 17 00:00:00 2001 From: Akash Kumar Date: Sat, 8 Aug 2026 23:25:08 +0530 Subject: [PATCH 2/6] fix: split multi-speaker performer field into separate Person entries Signed-off-by: Akash Kumar --- src/components/EventLanding.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/EventLanding.js b/src/components/EventLanding.js index 90c0ef8d7..e0ad4ede6 100644 --- a/src/components/EventLanding.js +++ b/src/components/EventLanding.js @@ -87,10 +87,10 @@ export default function EventLanding({ slug }) { validFrom: event.offerValidFrom || event.date, }, ...(event.speaker && { - performer: { + performer: event.speaker.split(",").map((name) => ({ "@type": "Person", - name: event.speaker, - }, + name: name.trim(), + })), }), }; From 622c09abb3421e00e308b1e3e428f17246f3140e Mon Sep 17 00:00:00 2001 From: Akash Kumar Date: Sun, 9 Aug 2026 00:36:48 +0530 Subject: [PATCH 3/6] fix: only emit offers when real ticket data exists; reflect true availability Signed-off-by: Akash Kumar --- src/components/EventLanding.js | 49 +++++++++++++++++----------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/components/EventLanding.js b/src/components/EventLanding.js index e0ad4ede6..37be90406 100644 --- a/src/components/EventLanding.js +++ b/src/components/EventLanding.js @@ -69,30 +69,31 @@ export default function EventLanding({ slug }) { address: { "@type": "PostalAddress", ...event.address }, }), }, - description: pick(locale, event.description), - image: bannerUrl ? `${siteConfig.url}${bannerUrl}` : undefined, - eventAttendanceMode: "https://schema.org/OfflineEventAttendanceMode", - eventStatus: `https://schema.org/${event.eventStatus || "EventScheduled"}`, - organizer: { - "@type": "Organization", - name: "HAMi", - url: "https://project-hami.io/", - }, - offers: { - "@type": "Offer", - url: event.externalUrl || `${siteConfig.url}/events/${event.slug}`, - price: event.price ?? "0", - priceCurrency: event.priceCurrency || "USD", - availability: "https://schema.org/InStock", - validFrom: event.offerValidFrom || event.date, - }, - ...(event.speaker && { - performer: event.speaker.split(",").map((name) => ({ - "@type": "Person", - name: name.trim(), - })), - }), - }; + description: pick(locale, event.description), + image: bannerUrl ? `${siteConfig.url}${bannerUrl}` : undefined, + eventAttendanceMode: "https://schema.org/OfflineEventAttendanceMode", + eventStatus: `https://schema.org/${event.eventStatus || "EventScheduled"}`, + organizer: { + "@type": "Organization", + name: "HAMi", + url: "https://project-hami.io/", + }, + ...(event.price !== undefined || event.externalUrl + ? { + offers: { + "@type": "Offer", + url: event.externalUrl || `${siteConfig.url}/events/${event.slug}`, + price: event.price ?? "0", + priceCurrency: event.priceCurrency || "USD", + availability: + event.eventStatus === "EventScheduled" + ? "https://schema.org/InStock" + : "https://schema.org/SoldOut", + validFrom: event.offerValidFrom || event.date, + }, + } + : {}), +}; return ( Date: Sun, 9 Aug 2026 10:16:31 +0530 Subject: [PATCH 4/6] fix: use single source for eventStatus/availability; add performer field Signed-off-by: Akash Kumar --- src/components/EventLanding.js | 41 +++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/components/EventLanding.js b/src/components/EventLanding.js index 37be90406..3c02f1a00 100644 --- a/src/components/EventLanding.js +++ b/src/components/EventLanding.js @@ -56,28 +56,37 @@ export default function EventLanding({ slug }) { ); } - const eventJsonLd = { - "@context": "https://schema.org", - "@type": "Event", - name: pick(locale, event.title), - startDate: event.date, - endDate: event.endDate || event.date, - location: { - "@type": "Place", - name: pick(locale, event.location), - ...(event.address && { - address: { "@type": "PostalAddress", ...event.address }, - }), - }, - description: pick(locale, event.description), +const effectiveEventStatus = event.eventStatus || "EventScheduled"; + +const eventJsonLd = { + "@context": "https://schema.org", + "@type": "Event", + name: pick(locale, event.title), + startDate: event.date, + endDate: event.endDate || event.date, + location: { + "@type": "Place", + name: pick(locale, event.location), + ...(event.address && { + address: { "@type": "PostalAddress", ...event.address }, + }), + }, + description: pick(locale, event.description), image: bannerUrl ? `${siteConfig.url}${bannerUrl}` : undefined, eventAttendanceMode: "https://schema.org/OfflineEventAttendanceMode", - eventStatus: `https://schema.org/${event.eventStatus || "EventScheduled"}`, + eventStatus: `https://schema.org/${effectiveEventStatus}`, organizer: { "@type": "Organization", name: "HAMi", url: "https://project-hami.io/", }, + ...(event.speaker + ? { + performer: event.speaker + .split(",") + .map((name) => ({ "@type": "Person", name: name.trim() })), + } + : {}), ...(event.price !== undefined || event.externalUrl ? { offers: { @@ -86,7 +95,7 @@ export default function EventLanding({ slug }) { price: event.price ?? "0", priceCurrency: event.priceCurrency || "USD", availability: - event.eventStatus === "EventScheduled" + effectiveEventStatus === "EventScheduled" ? "https://schema.org/InStock" : "https://schema.org/SoldOut", validFrom: event.offerValidFrom || event.date, From 61a62c84fda99fa3c16743aaeecb3f0cd5f46adf Mon Sep 17 00:00:00 2001 From: Akash Kumar Date: Thu, 13 Aug 2026 00:14:50 +0530 Subject: [PATCH 5/6] style: run prettier on EventLanding.js Signed-off-by: Akash Kumar --- src/components/EventLanding.js | 92 +++++++++++++++++----------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/components/EventLanding.js b/src/components/EventLanding.js index 3c02f1a00..8cfa23f04 100644 --- a/src/components/EventLanding.js +++ b/src/components/EventLanding.js @@ -56,53 +56,53 @@ export default function EventLanding({ slug }) { ); } -const effectiveEventStatus = event.eventStatus || "EventScheduled"; + const effectiveEventStatus = event.eventStatus || "EventScheduled"; -const eventJsonLd = { - "@context": "https://schema.org", - "@type": "Event", - name: pick(locale, event.title), - startDate: event.date, - endDate: event.endDate || event.date, - location: { - "@type": "Place", - name: pick(locale, event.location), - ...(event.address && { - address: { "@type": "PostalAddress", ...event.address }, - }), - }, - description: pick(locale, event.description), - image: bannerUrl ? `${siteConfig.url}${bannerUrl}` : undefined, - eventAttendanceMode: "https://schema.org/OfflineEventAttendanceMode", - eventStatus: `https://schema.org/${effectiveEventStatus}`, - organizer: { - "@type": "Organization", - name: "HAMi", - url: "https://project-hami.io/", - }, - ...(event.speaker - ? { - performer: event.speaker - .split(",") - .map((name) => ({ "@type": "Person", name: name.trim() })), - } - : {}), - ...(event.price !== undefined || event.externalUrl - ? { - offers: { - "@type": "Offer", - url: event.externalUrl || `${siteConfig.url}/events/${event.slug}`, - price: event.price ?? "0", - priceCurrency: event.priceCurrency || "USD", - availability: - effectiveEventStatus === "EventScheduled" - ? "https://schema.org/InStock" - : "https://schema.org/SoldOut", - validFrom: event.offerValidFrom || event.date, - }, - } - : {}), -}; + const eventJsonLd = { + "@context": "https://schema.org", + "@type": "Event", + name: pick(locale, event.title), + startDate: event.date, + endDate: event.endDate || event.date, + location: { + "@type": "Place", + name: pick(locale, event.location), + ...(event.address && { + address: { "@type": "PostalAddress", ...event.address }, + }), + }, + description: pick(locale, event.description), + image: bannerUrl ? `${siteConfig.url}${bannerUrl}` : undefined, + eventAttendanceMode: "https://schema.org/OfflineEventAttendanceMode", + eventStatus: `https://schema.org/${effectiveEventStatus}`, + organizer: { + "@type": "Organization", + name: "HAMi", + url: "https://project-hami.io/", + }, + ...(event.speaker + ? { + performer: event.speaker + .split(",") + .map((name) => ({ "@type": "Person", name: name.trim() })), + } + : {}), + ...(event.price !== undefined || event.externalUrl + ? { + offers: { + "@type": "Offer", + url: event.externalUrl || `${siteConfig.url}/events/${event.slug}`, + price: event.price ?? "0", + priceCurrency: event.priceCurrency || "USD", + availability: + effectiveEventStatus === "EventScheduled" + ? "https://schema.org/InStock" + : "https://schema.org/SoldOut", + validFrom: event.offerValidFrom || event.date, + }, + } + : {}), + }; return ( Date: Thu, 13 Aug 2026 00:18:28 +0530 Subject: [PATCH 6/6] Update src/data/events.js Co-authored-by: Jimmy Song Signed-off-by: Akash Kumar --- src/data/events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/events.js b/src/data/events.js index 9aa48d657..68c1bc410 100644 --- a/src/data/events.js +++ b/src/data/events.js @@ -6,7 +6,7 @@ const events = [ zh: "从项目到生产:HAMi 与 Viettel Cloud 亮相 KCD 越南", }, date: "2026-07-25", - speaker: "fishman, The Anh Nguyen", + speaker: "Reza Jelveh, The Anh Nguyen", location: { en: "Hanoi, Vietnam", zh: "越南 河内",