diff --git a/kubernetes/loculus/templates/_common-metadata.tpl b/kubernetes/loculus/templates/_common-metadata.tpl index 147e463c77..adde6097a2 100644 --- a/kubernetes/loculus/templates/_common-metadata.tpl +++ b/kubernetes/loculus/templates/_common-metadata.tpl @@ -223,6 +223,9 @@ welcomeMessageHTML: {{ quote $.Values.welcomeMessageHTML }} {{ if $.Values.additionalHeadHTML }} additionalHeadHTML: {{ quote $.Values.additionalHeadHTML }} {{end}} +{{ if $.Values.openGraph }} +openGraph: {{ $.Values.openGraph | toYaml | nindent 6 }} +{{ end }} enableLoginNavigationItem: {{ $.Values.website.websiteConfig.enableLoginNavigationItem }} enableSubmissionNavigationItem: {{ $.Values.website.websiteConfig.enableSubmissionNavigationItem }} diff --git a/kubernetes/loculus/values.schema.json b/kubernetes/loculus/values.schema.json index 5e496e0114..0908671bf7 100644 --- a/kubernetes/loculus/values.schema.json +++ b/kubernetes/loculus/values.schema.json @@ -1168,6 +1168,27 @@ "type": "string", "description": "Additional HTML to inject into the
of pages" }, + "openGraph": { + "groups": ["general"], + "type": "object", + "additionalProperties": false, + "description": "Default Open Graph / social card metadata. Used when no per-organism image is configured (organism-specific images are taken from each organism's `schema.image`).", + "properties": { + "image": { + "type": "string", + "description": "Default Open Graph image. Relative paths are resolved against the page URL." + }, + "description": { + "type": "string", + "description": "Default Open Graph / meta description for pages." + }, + "twitterCard": { + "type": "string", + "enum": ["summary", "summary_large_image", "player", "app"], + "description": "Value for ``. When unset, defaults to `summary_large_image` if a card image is configured (per-organism or site-wide), otherwise `summary`." + } + } + }, "createTestAccounts": { "groups": ["general"], "type": "boolean", diff --git a/website/src/layouts/BaseLayout.astro b/website/src/layouts/BaseLayout.astro index cdcaa3b9c9..b9c9ecc072 100644 --- a/website/src/layouts/BaseLayout.astro +++ b/website/src/layouts/BaseLayout.astro @@ -20,6 +20,7 @@ const { additionalHeadHTML, gitHubMainUrl, readOnlyMode, + openGraph, } = websiteConfig; const remoteBannerMessage = await getRemoteBannerMessage(); const readOnlyBannerMessage = readOnlyMode @@ -29,19 +30,25 @@ const bannerMessage = remoteBannerMessage ?? configBannerMessage ?? readOnlyBann interface Props { title: string; + description?: string; implicitOrganism?: string; fullWidth?: boolean; withoutMargin?: boolean; activeTopNavigationItem?: string; } -const { title, implicitOrganism, fullWidth, withoutMargin = false, activeTopNavigationItem } = Astro.props; +const { title, description, implicitOrganism, fullWidth, withoutMargin = false, activeTopNavigationItem } = Astro.props; const { organism, knownOrganisms } = cleanOrganism(Astro.params.organism); const implicitOrganismObject = implicitOrganism ? knownOrganisms.find((o) => o.key === implicitOrganism) : undefined; const currentOrganismObject = implicitOrganismObject || organism; const currentOrganism = currentOrganismObject?.key; +const rawSocialCardImage = currentOrganismObject?.image ?? openGraph?.image; +const socialCardImage = rawSocialCardImage ? new URL(rawSocialCardImage, Astro.url).toString() : undefined; +const socialCardDescription = description ?? openGraph?.description; +const twitterCard = openGraph?.twitterCard ?? (socialCardImage ? 'summary_large_image' : 'summary'); + const currentPath = Astro.url.pathname; const backendIsInDebugMode = await createBackendClient().isInDebugMode(); @@ -56,10 +63,17 @@ const lastTimeBannerWasClosed = Astro.cookies.get('lastTimeBannerWasClosed')?.va + + {socialCardDescription && } + {socialCardImage && } + + {socialCardDescription && } + {socialCardImage && } + {socialCardDescription && }