From ce3bb097963e854efd72b6af41e1dbb9984cb2e1 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Fri, 31 Jul 2026 19:45:19 +0800 Subject: [PATCH] feat(docs): optimize mobile layout and localized metadata --- docs/app/(root)/layout.tsx | 38 +++ docs/app/{ => (root)}/page.tsx | 0 docs/app/[lang]/changelog/page.tsx | 11 +- docs/app/[lang]/community/page.tsx | 11 +- docs/app/[lang]/contributors/page.tsx | 24 +- docs/app/[lang]/databases/page.tsx | 30 +- docs/app/[lang]/docs/[[...slug]]/page.tsx | 18 +- docs/app/[lang]/docs/layout.tsx | 2 +- docs/app/[lang]/drivers/DriversClient.tsx | 1 + docs/app/[lang]/layout.tsx | 77 +++-- docs/app/[lang]/page.tsx | 53 ++-- docs/app/global.css | 282 ++++++++++++++++-- docs/app/layout.tsx | 112 ------- .../aceternity/HeroProductStage.tsx | 17 +- .../aceternity/InfiniteMovingCards.tsx | 6 +- .../ContributorsExperience.module.css | 3 + .../contributors/ContributorsExperience.tsx | 16 +- docs/components/landing/ChangelogList.tsx | 100 ++++--- .../landing/ExpandableDatabaseGrid.tsx | 37 +++ docs/components/landing/InstallTabs.tsx | 52 ++-- docs/components/landing/LandingFooter.tsx | 10 +- docs/components/landing/LandingNav.tsx | 126 ++++++-- docs/components/landing/RevealSection.tsx | 8 +- docs/lib/structuredData.test.ts | 25 ++ docs/lib/structuredData.ts | 96 ++++++ docs/public/llms.txt | 83 +++--- docs/scripts/generate-sitemap.mjs | 14 +- docs/scripts/verify-static-export.mjs | 53 +++- 28 files changed, 909 insertions(+), 396 deletions(-) create mode 100644 docs/app/(root)/layout.tsx rename docs/app/{ => (root)}/page.tsx (100%) delete mode 100644 docs/app/layout.tsx create mode 100644 docs/components/landing/ExpandableDatabaseGrid.tsx create mode 100644 docs/lib/structuredData.test.ts create mode 100644 docs/lib/structuredData.ts diff --git a/docs/app/(root)/layout.tsx b/docs/app/(root)/layout.tsx new file mode 100644 index 000000000..b21ae05a4 --- /dev/null +++ b/docs/app/(root)/layout.tsx @@ -0,0 +1,38 @@ +import "../global.css"; +import type { Metadata, Viewport } from "next"; +import type { ReactNode } from "react"; +import { DEFAULT_DESCRIPTION, DEFAULT_OG_IMAGE, SITE_NAME, SITE_URL } from "@/lib/metadata"; + +export const metadata: Metadata = { + title: SITE_NAME, + description: DEFAULT_DESCRIPTION, + metadataBase: new URL(SITE_URL), + icons: { + icon: "/favicon.png", + shortcut: "/favicon.png", + apple: "/logo.png", + }, + openGraph: { + siteName: SITE_NAME, + images: [{ url: DEFAULT_OG_IMAGE }], + }, + twitter: { + card: "summary_large_image", + }, +}; + +export const viewport: Viewport = { + width: "device-width", + initialScale: 1, + viewportFit: "cover", + themeColor: "#0b1120", + colorScheme: "dark light", +}; + +export default function RedirectRootLayout({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} diff --git a/docs/app/page.tsx b/docs/app/(root)/page.tsx similarity index 100% rename from docs/app/page.tsx rename to docs/app/(root)/page.tsx diff --git a/docs/app/[lang]/changelog/page.tsx b/docs/app/[lang]/changelog/page.tsx index eb1cad4a6..97522463f 100644 --- a/docs/app/[lang]/changelog/page.tsx +++ b/docs/app/[lang]/changelog/page.tsx @@ -1,4 +1,5 @@ import { LandingNav } from "@/components/landing/LandingNav"; +import { LandingFooter } from "@/components/landing/LandingFooter"; import { ChangelogRuntime } from "@/components/landing/ChangelogRuntime"; import { fetchChangelog } from "@/lib/changelog"; import { buildMetadata } from "@/lib/metadata"; @@ -35,17 +36,19 @@ export default async function ChangelogPage({ params }: { params: Promise<{ lang const initialData = await fetchChangelog(l); return ( -
+
-
+

{t.title}

{t.desc}

-
+
-
+ + +
); } diff --git a/docs/app/[lang]/community/page.tsx b/docs/app/[lang]/community/page.tsx index 5351df549..852f76c70 100644 --- a/docs/app/[lang]/community/page.tsx +++ b/docs/app/[lang]/community/page.tsx @@ -1,4 +1,5 @@ import { LandingNav } from "@/components/landing/LandingNav"; +import { LandingFooter } from "@/components/landing/LandingFooter"; import { buildMetadata } from "@/lib/metadata"; import type { Metadata } from "next"; @@ -79,15 +80,15 @@ export default async function CommunityPage({ params }: { params: Promise<{ lang const t = i18n[l]; return ( -
+
-
+

{t.title}

{t.desc}

-
+
{channels.map((ch) => { const meta = t[ch.id as keyof typeof t] as { name: string; desc: string }; @@ -108,6 +109,8 @@ export default async function CommunityPage({ params }: { params: Promise<{ lang })}
-
+ + +
); } diff --git a/docs/app/[lang]/contributors/page.tsx b/docs/app/[lang]/contributors/page.tsx index b398aa038..ecdd951fd 100644 --- a/docs/app/[lang]/contributors/page.tsx +++ b/docs/app/[lang]/contributors/page.tsx @@ -4,7 +4,7 @@ import { ContributorsExperience } from "@/components/contributors/ContributorsEx import { LandingFooter } from "@/components/landing/LandingFooter"; import { LandingNav } from "@/components/landing/LandingNav"; import type { ContributorActivityData } from "@/lib/contributorActivity"; -import { SITE_URL } from "@/lib/metadata"; +import { buildMetadata } from "@/lib/metadata"; const pageMetadata = { en: { @@ -22,22 +22,12 @@ export async function generateMetadata({ params }: { params: Promise<{ lang: str const locale = lang === "cn" ? "cn" : "en"; const metadata = pageMetadata[locale]; - return { - ...metadata, - alternates: { - canonical: `${SITE_URL}/${locale}/contributors`, - languages: { - en: `${SITE_URL}/en/contributors`, - zh: `${SITE_URL}/cn/contributors`, - "x-default": `${SITE_URL}/en/contributors`, - }, - }, - openGraph: { - title: metadata.title, - description: metadata.description, - url: `${SITE_URL}/${locale}/contributors`, - }, - }; + return buildMetadata({ + title: metadata.title, + description: metadata.description, + path: `/${locale}/contributors`, + lang: locale, + }); } export default async function ContributorsPage({ params }: { params: Promise<{ lang: string }> }) { diff --git a/docs/app/[lang]/databases/page.tsx b/docs/app/[lang]/databases/page.tsx index 3780da948..b3df866b9 100644 --- a/docs/app/[lang]/databases/page.tsx +++ b/docs/app/[lang]/databases/page.tsx @@ -2,8 +2,10 @@ import type { CSSProperties } from "react"; import type { Metadata } from "next"; import Link from "next/link"; import { LandingNav } from "@/components/landing/LandingNav"; +import { LandingFooter } from "@/components/landing/LandingFooter"; import { Spotlight } from "@/components/aceternity/Spotlight"; import { RevealSection } from "@/components/landing/RevealSection"; +import { ExpandableDatabaseGrid } from "@/components/landing/ExpandableDatabaseGrid"; import { buildMetadata } from "@/lib/metadata"; const databaseSupport = [ @@ -130,48 +132,48 @@ export default async function DatabasesPage({ params }: { params: Promise<{ lang const t = i18n[l]; return ( -
+
{/* Hero */} -
+
-
+

{t.title}

{t.desc}

{/* Database Grid */} - -
+ + {databaseSupport.map((db) => { const isCta = "href" in db && db.href; const CardTag = isCta ? "a" : "div"; return ( -
+
{isCta ? ( + ) : ( - + )}
- {db.name} + {db.name} ); })} -
+
{/* Vendor CTA */} - +

{t.ctaTitle}

{t.ctaDesc}

@@ -186,12 +188,14 @@ export default async function DatabasesPage({ params }: { params: Promise<{ lang {/* Footer link to docs */} -
+
{t.footerLink}
-
+ + +
); } diff --git a/docs/app/[lang]/docs/[[...slug]]/page.tsx b/docs/app/[lang]/docs/[[...slug]]/page.tsx index ac02e3a7f..8cbd9cb47 100644 --- a/docs/app/[lang]/docs/[[...slug]]/page.tsx +++ b/docs/app/[lang]/docs/[[...slug]]/page.tsx @@ -88,14 +88,16 @@ export default async function Page({ params }: { params: Promise<{ lang: string; }; return ( - -