aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/docs/app/root.tsx
diff options
context:
space:
mode:
author简律纯 <i@jyunko.cn>2026-01-21 20:27:47 +0800
committerGitHub <noreply@github.com>2026-01-21 20:27:47 +0800
commit9ebcd9e9a441c7edcd9d9d55ef65af2799a30a7f (patch)
tree3b7426aa13e66dc29de1a2e06583f5cea9f87596 /packages/docs/app/root.tsx
parent42b114140b9ddeb1060ac7e51311cc50f5641c2d (diff)
parent85382b427244ebb13497124defacd63f39e2871b (diff)
downloadDropOut-9ebcd9e9a441c7edcd9d9d55ef65af2799a30a7f.tar.gz
DropOut-9ebcd9e9a441c7edcd9d9d55ef65af2799a30a7f.zip
docs: add chinese readme and docs website (#76)
## Summary by Sourcery Add a new documentation site package and a Chinese README to improve project documentation and accessibility. New Features: - Introduce a dedicated @dropout/docs React Router application powered by Fumadocs for hosting the project documentation. Documentation: - Add a Chinese README file providing an overview, installation, build instructions, and contribution guidelines for Chinese-speaking users. - Set up initial docs content, navigation, and metadata within the new docs site, including example pages and search endpoint configuration.
Diffstat (limited to 'packages/docs/app/root.tsx')
-rw-r--r--packages/docs/app/root.tsx73
1 files changed, 73 insertions, 0 deletions
diff --git a/packages/docs/app/root.tsx b/packages/docs/app/root.tsx
new file mode 100644
index 0000000..08b8aa8
--- /dev/null
+++ b/packages/docs/app/root.tsx
@@ -0,0 +1,73 @@
+import {
+ isRouteErrorResponse,
+ Links,
+ Meta,
+ Outlet,
+ Scripts,
+ ScrollRestoration,
+} from 'react-router';
+import { RootProvider } from 'fumadocs-ui/provider/react-router';
+import type { Route } from './+types/root';
+import './app.css';
+
+export const links: Route.LinksFunction = () => [
+ { rel: 'preconnect', href: 'https://fonts.googleapis.com' },
+ {
+ rel: 'preconnect',
+ href: 'https://fonts.gstatic.com',
+ crossOrigin: 'anonymous',
+ },
+ {
+ rel: 'stylesheet',
+ href: 'https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap',
+ },
+];
+
+export function Layout({ children }: { children: React.ReactNode }) {
+ return (
+ <html lang="en" suppressHydrationWarning>
+ <head>
+ <meta charSet="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <Meta />
+ <Links />
+ </head>
+ <body className="flex flex-col min-h-screen">
+ <RootProvider>{children}</RootProvider>
+ <ScrollRestoration />
+ <Scripts />
+ </body>
+ </html>
+ );
+}
+
+export default function App() {
+ return <Outlet />;
+}
+
+export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
+ let message = 'Oops!';
+ let details = 'An unexpected error occurred.';
+ let stack: string | undefined;
+
+ if (isRouteErrorResponse(error)) {
+ message = error.status === 404 ? '404' : 'Error';
+ details =
+ error.status === 404 ? 'The requested page could not be found.' : error.statusText || details;
+ } else if (import.meta.env.DEV && error && error instanceof Error) {
+ details = error.message;
+ stack = error.stack;
+ }
+
+ return (
+ <main className="pt-16 p-4 w-full max-w-[1400px] mx-auto">
+ <h1>{message}</h1>
+ <p>{details}</p>
+ {stack && (
+ <pre className="w-full p-4 overflow-x-auto">
+ <code>{stack}</code>
+ </pre>
+ )}
+ </main>
+ );
+}