import type { MenuConfig } from './Layout/renderMenu' import type { FooterConfig, FooterColumn, FooterLink } from './Layout/Footer' import type { PagesStaticData, ThemeProps, } from 'vite-plugin-react-pages/clientTypes' import type { PageGroups } from './analyzeStaticData' export interface ThemeConfig { /** * Logo at top bar */ logo?: React.ReactNode | ((ctx: ThemeContextValue) => React.ReactNode) /** * Logo link path * @defaultValue "/" */ logoLink?: | string | null | undefined | ((ctx: ThemeContextValue) => string | null | undefined) /** * Navigation menu at top bar. */ topNavs?: | ReadonlyArray | ((ctx: ThemeContextValue) => ReadonlyArray | null | undefined) /** * Side menu. */ sideNavs?: | ReadonlyArray | ((ctx: ThemeContextValue) => ReadonlyArray | null | undefined) /** * Extra area at top bar. */ TopBarExtra?: React.ComponentType> /** * Footer */ footer?: | FooterConfig | ((ctx: ThemeContextValue) => FooterConfig | null | undefined) /** * Component to be rendered when app in 404 state * (url not matching any page) */ Component404?: React.ComponentType> /** * Component to be rendered when app is loading js bundle */ ComponentLoading?: React.ComponentType> /** * Wrap the App with custom Component. * You can use `useThemeCtx()` in it to get context info */ AppWrapper?: React.ComponentType> /** * i18n metadata */ i18n?: I18nConfig /** * Whether enable search feature * @defaultValue true */ search?: boolean } export interface I18nConfig { /** * The localeKey of default locale * If a page have pagePath that doesn't match any `LocalConfig.routePrefix`, * the `I18nConfig.defaultLocale` will apply to it */ defaultLocale: string /** * If true, this theme will render a locale selector at topbar * Only matters when you have more than one locales * @defaultValue true */ topBarLocaleSelector?: boolean /** * Define all locales that your site supports * Map localeKey to locale config */ locales: Record } export interface LocalConfig { /** * This will be set as the lang attribute on */ lang?: string /** * This label will be used when rendering the locale * in the locale selector */ label?: string /** * If a page have pagePath with this prefix, this locale will apply to it * If a page have pagePath that doesn't match any routePrefix, * the `I18nConfig.defaultLocale` will apply to it */ routePrefix?: string } export type ThemeContextValue = ThemeProps & { themeConfig: ThemeConfig staticData: PagesStaticData /** * The resolved locale data of the current page */ resolvedLocale: { /** * the locale config object that is currently activated */ locale?: LocalConfig /** * The key of the locale config object inside `I18nConfig.locales` object */ localeKey?: string /** * Current pagePath without locale routePrefix. * For example, page `/zh/foo` will have pagePathWithoutLocalePrefix `/foo` */ pagePathWithoutLocalePrefix?: string } pageGroups: PageGroups } export type { MenuConfig, FooterConfig, FooterColumn, FooterLink }