import { ParentComponent, Show, children, Suspense } from "solid-js"; import { MainNavigation } from "~/ui/layout/main-navigation"; import { MainHeader } from "./layout/main-header"; import { Hero } from "./layout/hero"; import { cache, createAsync, useMatch } from "@solidjs/router"; import { DocsLayout } from "./docs-layout"; import { PageStateProvider } from "~/data/page-state"; import { Alert } from "@kobalte/core"; import { SidePanel } from "./layout/side-panel"; import { SUPPORTED_LOCALES } from "~/i18n/config"; import { getValidLocaleFromPathname } from "~/i18n/helpers"; import { coreTree, routerTree, startTree, coreEntries, startEntries, routerEntries, metaTree, metaEntries, } from "solid:collection"; import { PathMatch } from "@solidjs/router/dist/types"; import { useCurrentRouteMetaData } from "~/utils/route-metadata-helper"; const PROJECTS = ["solid-router", "solid-start", "solid-meta"] as const; function getDefaultTree(project: (typeof PROJECTS)[number]) { switch (project) { case "solid-router": return routerTree; case "solid-start": return startTree; case "solid-meta": return metaTree; default: return coreTree; } } function getDefaultEntries(project: (typeof PROJECTS)[number]) { switch (project) { case "solid-router": return routerEntries; case "solid-start": return startEntries; case "solid-meta": return metaEntries; default: return coreEntries; } } const getProjectFromUrl = (path: string) => { for (const project of PROJECTS) { if (path.includes(project)) { return project; } } return null; }; const getDocsMetadata = cache( async ( isFirstMatch: PathMatch | undefined, isI18nOrProject: PathMatch | undefined, isCore: PathMatch | undefined ) => { "use server"; if (!isFirstMatch && !isI18nOrProject) return { tree: coreTree, entries: coreEntries, }; const { path } = (isFirstMatch || isI18nOrProject || isCore) as PathMatch; const locale = getValidLocaleFromPathname(path); const project = getProjectFromUrl(path); if (project) { if (SUPPORTED_LOCALES.some((lang) => lang === locale)) { return { tree: (await import(`../../.solid/${project}-tree-${locale}.ts`)) .default, entries: ( await import(`../../.solid/${project}-flat-entries-${locale}.ts`) ).default, }; } return { tree: getDefaultTree(project), entries: getDefaultEntries(project), }; } if (SUPPORTED_LOCALES.some((lang) => lang === locale)) { return { tree: (await import(`../../.solid/tree-${locale}.ts`)).default, entries: (await import(`../../.solid/flat-entries-${locale}.ts`)) .default, }; } else { return { tree: coreTree, entries: coreEntries, }; } }, "global-metadata" ); export const Layout: ParentComponent<{ isError?: boolean }> = (props) => { const isTranslatedProject = useMatch(() => "/:locale/:project/*", { locale: [...SUPPORTED_LOCALES, ...PROJECTS], project: PROJECTS, }); // is i18n main // is en project const isProjectContent = useMatch(() => "/:localeOrProject/*", { localeOrProject: [...SUPPORTED_LOCALES, ...PROJECTS], }); const isCoreContent = useMatch(() => "/*"); const entries = createAsync( () => getDocsMetadata( isProjectContent(), isTranslatedProject(), isCoreContent() ), { deferStream: true } ); const resolved = children(() => props.children); return (
These docs are currently in Beta! {(data) => }