diff --git a/.changeset/polite-cheetahs-help.md b/.changeset/polite-cheetahs-help.md new file mode 100644 index 00000000000..450ec379f25 --- /dev/null +++ b/.changeset/polite-cheetahs-help.md @@ -0,0 +1,5 @@ +--- +'@astrojs/starlight': patch +--- + +Moves the `href` used in the site title link to Starlight’s route data object. This makes it possible for overrides to change the title link while reusing Starlight’s default component implemenation. diff --git a/docs/src/content/docs/reference/overrides.md b/docs/src/content/docs/reference/overrides.md index 74ae9032164..9293654be2a 100644 --- a/docs/src/content/docs/reference/overrides.md +++ b/docs/src/content/docs/reference/overrides.md @@ -56,6 +56,13 @@ The base path at which a language is served. `undefined` for root locale slugs. The site title for this page’s locale. +#### `siteTitleHref` + +**Type:** `string` + +The value for the site title’s `href` attribute, linking back to the homepage, e.g. `/`. +For multilingual sites this will include the current locale, e.g. `/en/` or `/zh-cn/`. + #### `slug` **Type:** `string` diff --git a/packages/starlight/components/SiteTitle.astro b/packages/starlight/components/SiteTitle.astro index 1f09a7df1ff..2f4b829943e 100644 --- a/packages/starlight/components/SiteTitle.astro +++ b/packages/starlight/components/SiteTitle.astro @@ -2,13 +2,10 @@ import { logos } from 'virtual:starlight/user-images'; import config from 'virtual:starlight/user-config'; import type { Props } from '../props'; -import { formatPath } from '../utils/format-path'; - -const { siteTitle } = Astro.props; -const href = formatPath(Astro.props.locale || '/'); +const { siteTitle, siteTitleHref } = Astro.props; --- - + { config.logo && logos.dark && ( <> diff --git a/packages/starlight/utils/route-data.ts b/packages/starlight/utils/route-data.ts index a47e68f262f..841804bdfe5 100644 --- a/packages/starlight/utils/route-data.ts +++ b/packages/starlight/utils/route-data.ts @@ -9,6 +9,7 @@ import { ensureTrailingSlash } from './path'; import type { Route } from './routing'; import { localizedId } from './slugs'; import { useTranslations } from './translations'; +import { formatPath } from './format-path'; export interface PageProps extends Route { headings: MarkdownHeading[]; @@ -17,6 +18,8 @@ export interface PageProps extends Route { export interface StarlightRouteData extends Route { /** Title of the site. */ siteTitle: string; + /** URL or path used as the link when clicking on the site title. */ + siteTitleHref: string; /** Array of Markdown headings extracted from the current page. */ headings: MarkdownHeading[]; /** Site navigation sidebar entries for this page. */ @@ -48,6 +51,7 @@ export function generateRouteData({ return { ...props, siteTitle, + siteTitleHref: getSiteTitleHref(locale), sidebar, hasSidebar: entry.data.template !== 'splash', pagination: getPrevNextLinks(sidebar, config.pagination, entry.data), @@ -118,3 +122,7 @@ export function getSiteTitle(lang: string): string { } return config.title[defaultLang] as string; } + +export function getSiteTitleHref(locale: string | undefined): string { + return formatPath(locale || '/'); +} diff --git a/packages/starlight/utils/starlight-page.ts b/packages/starlight/utils/starlight-page.ts index e736457bbb5..24c3bb17f71 100644 --- a/packages/starlight/utils/starlight-page.ts +++ b/packages/starlight/utils/starlight-page.ts @@ -3,7 +3,13 @@ import { type ContentConfig, type SchemaContext } from 'astro:content'; import config from 'virtual:starlight/user-config'; import { parseWithFriendlyErrors } from './error-map'; import { stripLeadingAndTrailingSlashes } from './path'; -import { getSiteTitle, getToC, type PageProps, type StarlightRouteData } from './route-data'; +import { + getSiteTitle, + getSiteTitleHref, + getToC, + type PageProps, + type StarlightRouteData, +} from './route-data'; import type { StarlightDocsEntry } from './routing'; import { slugToLocaleData, urlToSlug } from './slugs'; import { getPrevNextLinks, getSidebar } from './navigation'; @@ -224,6 +230,7 @@ export async function generateStarlightPageRouteData({ pagination: getPrevNextLinks(sidebar, config.pagination, entry.data), sidebar, siteTitle: getSiteTitle(localeData.lang), + siteTitleHref: getSiteTitleHref(localeData.locale), slug, toc: getToC({ ...routeProps,