create-fumadocs-app 16.0.23 → 16.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js CHANGED
@@ -3,11 +3,11 @@ import {
3
3
  create,
4
4
  getPackageManager,
5
5
  managers
6
- } from "./chunk-CNJCXUXH.js";
6
+ } from "./chunk-K625G2MO.js";
7
7
  import {
8
8
  isCI,
9
9
  templates
10
- } from "./chunk-7TRDY2H2.js";
10
+ } from "./chunk-QPLSOT7S.js";
11
11
 
12
12
  // src/bin.ts
13
13
  import fs from "fs/promises";
@@ -4,7 +4,7 @@ import {
4
4
  sourceDir,
5
5
  templates,
6
6
  tryGitInit
7
- } from "./chunk-7TRDY2H2.js";
7
+ } from "./chunk-QPLSOT7S.js";
8
8
 
9
9
  // src/index.ts
10
10
  import path from "path";
@@ -94,14 +94,13 @@ import { fileURLToPath } from "url";
94
94
  // ../create-app-versions/package.json
95
95
  var package_default = {
96
96
  name: "create-fumadocs-versions",
97
- version: "16.0.23",
97
+ version: "16.0.25",
98
98
  private: true,
99
99
  description: "Used to track dependency versions in create-fumadocs-app",
100
100
  dependencies: {
101
101
  "@biomejs/biome": "^2.3.8",
102
- "@eslint/eslintrc": "^3.3.3",
103
- "@orama/core": "^1.2.13",
104
- eslint: "^9.39.1",
102
+ "@orama/core": "^1.2.14",
103
+ eslint: "^9.39.2",
105
104
  "fumadocs-core": "workspace:*",
106
105
  "fumadocs-mdx": "workspace:*",
107
106
  "fumadocs-ui": "workspace:*"
@@ -109,10 +108,10 @@ var package_default = {
109
108
  };
110
109
 
111
110
  // ../core/package.json
112
- var version = "16.2.3";
111
+ var version = "16.2.5";
113
112
 
114
113
  // ../ui/package.json
115
- var version2 = "16.2.3";
114
+ var version2 = "16.2.5";
116
115
 
117
116
  // ../mdx/package.json
118
117
  var version3 = "14.1.0";
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  create
3
- } from "./chunk-CNJCXUXH.js";
4
- import "./chunk-7TRDY2H2.js";
3
+ } from "./chunk-K625G2MO.js";
4
+ import "./chunk-QPLSOT7S.js";
5
5
  export {
6
6
  create
7
7
  };
@@ -8,7 +8,7 @@ import {
8
8
  depVersions,
9
9
  pick,
10
10
  writeFile
11
- } from "../chunk-7TRDY2H2.js";
11
+ } from "../chunk-QPLSOT7S.js";
12
12
 
13
13
  // src/plugins/biome.ts
14
14
  import path from "path";
@@ -2,34 +2,23 @@ import {
2
2
  depVersions,
3
3
  pick,
4
4
  writeFile
5
- } from "../chunk-7TRDY2H2.js";
5
+ } from "../chunk-QPLSOT7S.js";
6
6
 
7
7
  // src/plugins/eslint.ts
8
8
  import path from "path";
9
- var config = `import { dirname } from 'path';
10
- import { fileURLToPath } from 'url';
11
- import { FlatCompat } from '@eslint/eslintrc';
9
+ var config = `import { defineConfig, globalIgnores } from 'eslint/config';
10
+ import nextVitals from 'eslint-config-next/core-web-vitals';
12
11
 
13
- const __filename = fileURLToPath(import.meta.url);
14
- const __dirname = dirname(__filename);
15
-
16
- const compat = new FlatCompat({
17
- baseDirectory: __dirname,
18
- });
19
-
20
- const eslintConfig = [
21
- ...compat.extends('next/core-web-vitals', 'next/typescript'),
22
- {
23
- ignores: [
24
- 'node_modules/**',
25
- '.next/**',
26
- 'out/**',
27
- 'build/**',
28
- '.source/**',
29
- 'next-env.d.ts',
30
- ],
31
- },
32
- ];
12
+ const eslintConfig = defineConfig([
13
+ ...nextVitals,
14
+ globalIgnores([
15
+ '.next/**',
16
+ 'out/**',
17
+ 'build/**',
18
+ 'next-env.d.ts',
19
+ '.source/**',
20
+ ]),
21
+ ]);
33
22
 
34
23
  export default eslintConfig;`;
35
24
  function eslint() {
@@ -45,7 +34,7 @@ function eslint() {
45
34
  devDependencies: {
46
35
  ...packageJson.devDependencies,
47
36
  "eslint-config-next": packageJson.dependencies.next,
48
- ...pick(depVersions, ["eslint", "@eslint/eslintrc"])
37
+ ...pick(depVersions, ["eslint"])
49
38
  }
50
39
  };
51
40
  },
@@ -4,7 +4,7 @@ import {
4
4
  pick,
5
5
  sourceDir,
6
6
  writeFile
7
- } from "../chunk-7TRDY2H2.js";
7
+ } from "../chunk-QPLSOT7S.js";
8
8
 
9
9
  // src/plugins/orama-cloud.ts
10
10
  import path2 from "path";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fumadocs-app",
3
- "version": "16.0.23",
3
+ "version": "16.0.25",
4
4
  "description": "Create a new documentation site with Fumadocs",
5
5
  "keywords": [
6
6
  "react",
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/cross-spawn": "^6.0.6",
42
- "@types/node": "24.10.1",
42
+ "@types/node": "24.10.2",
43
43
  "tinyglobby": "^0.2.15",
44
44
  "typescript": "^5.9.3",
45
45
  "eslint-config-custom": "0.0.0",
@@ -6,25 +6,25 @@
6
6
  "build": "next build",
7
7
  "dev": "next dev",
8
8
  "start": "next start",
9
- "types:check": "fumadocs-mdx && tsc --noEmit"
9
+ "types:check": "fumadocs-mdx && next typegen && tsc --noEmit"
10
10
  },
11
11
  "dependencies": {
12
12
  "fumadocs-core": "workspace:*",
13
13
  "fumadocs-mdx": "workspace:*",
14
14
  "fumadocs-ui": "workspace:*",
15
- "lucide-react": "^0.552.0",
16
- "next": "16.0.1",
17
- "react": "^19.2.0",
18
- "react-dom": "^19.2.0"
15
+ "lucide-react": "^0.556.0",
16
+ "next": "16.0.10",
17
+ "react": "^19.2.1",
18
+ "react-dom": "^19.2.1"
19
19
  },
20
20
  "devDependencies": {
21
- "@tailwindcss/postcss": "^4.1.16",
21
+ "@tailwindcss/postcss": "^4.1.17",
22
22
  "@types/mdx": "^2.0.13",
23
- "@types/node": "^24.10.0",
24
- "@types/react": "^19.2.2",
25
- "@types/react-dom": "^19.2.2",
23
+ "@types/node": "^24.10.2",
24
+ "@types/react": "^19.2.7",
25
+ "@types/react-dom": "^19.2.3",
26
26
  "postcss": "^8.5.6",
27
- "tailwindcss": "^4.1.16",
27
+ "tailwindcss": "^4.1.17",
28
28
  "typescript": "^5.9.3"
29
29
  }
30
30
  }
@@ -17,7 +17,7 @@ import { OramaCloud } from '@orama/core';
17
17
  import { useI18n } from 'fumadocs-ui/contexts/i18n';
18
18
 
19
19
  const client = new OramaCloud({
20
- projectId: process.env.NEXT_PUBLIC_ORAMA_DATASOURCE_ID,
20
+ projectId: process.env.NEXT_PUBLIC_ORAMA_PROJECT_ID,
21
21
  apiKey: process.env.NEXT_PUBLIC_ORAMA_API_KEY,
22
22
  });
23
23
 
@@ -7,10 +7,10 @@ import {
7
7
  DocsTitle,
8
8
  } from 'fumadocs-ui/layouts/docs/page';
9
9
  import { source } from '@/lib/source';
10
- import type * as PageTree from 'fumadocs-core/page-tree';
11
10
  import defaultMdxComponents from 'fumadocs-ui/mdx';
12
11
  import browserCollections from 'fumadocs-mdx:collections/browser';
13
12
  import { baseOptions } from '@/lib/layout.shared';
13
+ import { useFumadocsLoader } from 'fumadocs-core/source/client';
14
14
 
15
15
  export async function loader({ params }: Route.LoaderArgs) {
16
16
  const slugs = params['*'].split('/').filter((v) => v.length > 0);
@@ -19,7 +19,7 @@ export async function loader({ params }: Route.LoaderArgs) {
19
19
 
20
20
  return {
21
21
  path: page.path,
22
- tree: source.getPageTree(),
22
+ pageTree: await source.serializePageTree(source.getPageTree()),
23
23
  };
24
24
  }
25
25
 
@@ -40,11 +40,11 @@ const clientLoader = browserCollections.docs.createClientLoader({
40
40
  });
41
41
 
42
42
  export default function Page({ loaderData }: Route.ComponentProps) {
43
- const { tree, path } = loaderData;
44
- const Content = clientLoader.getComponent(path);
43
+ const Content = clientLoader.getComponent(loaderData.path);
44
+ const { pageTree } = useFumadocsLoader(loaderData);
45
45
 
46
46
  return (
47
- <DocsLayout {...baseOptions()} tree={tree as PageTree.Root}>
47
+ <DocsLayout {...baseOptions()} tree={pageTree}>
48
48
  <Content />
49
49
  </DocsLayout>
50
50
  );
@@ -62,7 +62,7 @@ export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
62
62
  }
63
63
 
64
64
  return (
65
- <main className="pt-16 p-4 container mx-auto">
65
+ <main className="pt-16 p-4 w-full max-w-[1400px] mx-auto">
66
66
  <h1>{message}</h1>
67
67
  <p>{details}</p>
68
68
  {stack && (
@@ -9,27 +9,27 @@
9
9
  "types:check": "react-router typegen && fumadocs-mdx && tsc --noEmit"
10
10
  },
11
11
  "dependencies": {
12
- "@react-router/node": "^7.9.5",
13
- "@react-router/serve": "^7.9.5",
12
+ "@react-router/node": "^7.10.1",
13
+ "@react-router/serve": "^7.10.1",
14
14
  "fumadocs-core": "workspace:*",
15
15
  "fumadocs-mdx": "workspace:*",
16
16
  "fumadocs-ui": "workspace:*",
17
17
  "isbot": "^5.1.32",
18
- "react": "^19.2.0",
19
- "react-dom": "^19.2.0",
20
- "react-router": "^7.9.5"
18
+ "react": "^19.2.1",
19
+ "react-dom": "^19.2.1",
20
+ "react-router": "^7.10.1"
21
21
  },
22
22
  "devDependencies": {
23
- "@react-router/dev": "^7.9.5",
24
- "@tailwindcss/vite": "^4.1.16",
23
+ "@react-router/dev": "^7.10.1",
24
+ "@tailwindcss/vite": "^4.1.17",
25
25
  "@types/mdx": "^2.0.13",
26
- "@types/node": "^24.10.0",
27
- "@types/react": "^19.2.2",
28
- "@types/react-dom": "^19.2.2",
29
- "react-router-devtools": "^5.1.3",
30
- "tailwindcss": "^4.1.16",
26
+ "@types/node": "^24.10.2",
27
+ "@types/react": "^19.2.7",
28
+ "@types/react-dom": "^19.2.3",
29
+ "react-router-devtools": "^6.0.0",
30
+ "tailwindcss": "^4.1.17",
31
31
  "typescript": "^5.9.3",
32
- "vite": "^7.2.0",
32
+ "vite": "^7.2.7",
33
33
  "vite-tsconfig-paths": "^5.1.4"
34
34
  }
35
35
  }
@@ -7,10 +7,10 @@ import {
7
7
  DocsTitle,
8
8
  } from 'fumadocs-ui/layouts/docs/page';
9
9
  import { source } from '@/lib/source';
10
- import type * as PageTree from 'fumadocs-core/page-tree';
11
10
  import defaultMdxComponents from 'fumadocs-ui/mdx';
12
11
  import browserCollections from 'fumadocs-mdx:collections/browser';
13
12
  import { baseOptions } from '@/lib/layout.shared';
13
+ import { useFumadocsLoader } from 'fumadocs-core/source/client';
14
14
 
15
15
  export async function loader({ params }: Route.LoaderArgs) {
16
16
  const slugs = params['*'].split('/').filter((v) => v.length > 0);
@@ -19,7 +19,7 @@ export async function loader({ params }: Route.LoaderArgs) {
19
19
 
20
20
  return {
21
21
  path: page.path,
22
- tree: source.getPageTree(),
22
+ pageTree: await source.serializePageTree(source.pageTree),
23
23
  };
24
24
  }
25
25
 
@@ -40,11 +40,11 @@ const clientLoader = browserCollections.docs.createClientLoader({
40
40
  });
41
41
 
42
42
  export default function Page({ loaderData }: Route.ComponentProps) {
43
- const { tree, path } = loaderData;
44
- const Content = clientLoader.getComponent(path);
43
+ const Content = clientLoader.getComponent(loaderData.path);
44
+ const { pageTree } = useFumadocsLoader(loaderData);
45
45
 
46
46
  return (
47
- <DocsLayout {...baseOptions()} tree={tree as PageTree.Root}>
47
+ <DocsLayout {...baseOptions()} tree={pageTree}>
48
48
  <Content />
49
49
  </DocsLayout>
50
50
  );
@@ -63,7 +63,7 @@ export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
63
63
  }
64
64
 
65
65
  return (
66
- <main className="pt-16 p-4 container mx-auto">
66
+ <main className="pt-16 p-4 w-full max-w-[1400px] mx-auto">
67
67
  <h1>{message}</h1>
68
68
  <p>{details}</p>
69
69
  {stack && (
@@ -10,27 +10,27 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@orama/orama": "^3.1.16",
13
- "@react-router/node": "^7.9.5",
13
+ "@react-router/node": "^7.10.1",
14
14
  "fumadocs-core": "workspace:*",
15
15
  "fumadocs-mdx": "workspace:*",
16
16
  "fumadocs-ui": "workspace:*",
17
17
  "isbot": "^5.1.32",
18
- "react": "^19.2.0",
19
- "react-dom": "^19.2.0",
20
- "react-router": "^7.9.5"
18
+ "react": "^19.2.1",
19
+ "react-dom": "^19.2.1",
20
+ "react-router": "^7.10.1"
21
21
  },
22
22
  "devDependencies": {
23
- "@react-router/dev": "^7.9.5",
24
- "@tailwindcss/vite": "^4.1.16",
23
+ "@react-router/dev": "^7.10.1",
24
+ "@tailwindcss/vite": "^4.1.17",
25
25
  "@types/mdx": "^2.0.13",
26
- "@types/node": "^24.10.0",
27
- "@types/react": "^19.2.2",
28
- "@types/react-dom": "^19.2.2",
29
- "react-router-devtools": "^5.1.3",
26
+ "@types/node": "^24.10.2",
27
+ "@types/react": "^19.2.7",
28
+ "@types/react-dom": "^19.2.3",
29
+ "react-router-devtools": "^6.0.0",
30
30
  "serve": "^14.2.5",
31
- "tailwindcss": "^4.1.16",
31
+ "tailwindcss": "^4.1.17",
32
32
  "typescript": "^5.9.3",
33
- "vite": "^7.2.0",
33
+ "vite": "^7.2.7",
34
34
  "vite-tsconfig-paths": "^5.1.4"
35
35
  }
36
36
  }
@@ -15,5 +15,4 @@ node_modules
15
15
  /playwright/.cache/
16
16
  .tanstack
17
17
 
18
- src/routeTree.gen.ts
19
18
  .source
@@ -10,27 +10,27 @@
10
10
  "types:check": "fumadocs-mdx && tsc --noEmit"
11
11
  },
12
12
  "dependencies": {
13
- "@tanstack/react-router": "^1.134.12",
14
- "@tanstack/react-router-devtools": "^1.134.12",
15
- "@tanstack/react-start": "^1.134.12",
13
+ "@tanstack/react-router": "1.136.18",
14
+ "@tanstack/react-router-devtools": "1.136.18",
15
+ "@tanstack/react-start": "1.136.18",
16
16
  "fumadocs-core": "workspace:*",
17
17
  "fumadocs-mdx": "workspace:*",
18
18
  "fumadocs-ui": "workspace:*",
19
- "lucide-static": "^0.552.0",
20
- "react": "^19.2.0",
21
- "react-dom": "^19.2.0",
22
- "tailwind-merge": "^3.3.1",
23
- "vite": "^7.2.0"
19
+ "lucide-react": "^0.556.0",
20
+ "react": "^19.2.1",
21
+ "react-dom": "^19.2.1",
22
+ "tailwind-merge": "^3.4.0",
23
+ "vite": "^7.2.7"
24
24
  },
25
25
  "devDependencies": {
26
- "@tailwindcss/vite": "^4.1.16",
26
+ "@tailwindcss/vite": "^4.1.17",
27
27
  "@types/mdx": "^2.0.13",
28
- "@types/node": "^24.10.0",
29
- "@types/react": "^19.2.2",
30
- "@types/react-dom": "^19.2.2",
31
- "@vitejs/plugin-react": "^5.1.0",
28
+ "@types/node": "^24.10.2",
29
+ "@types/react": "^19.2.7",
30
+ "@types/react-dom": "^19.2.3",
31
+ "@vitejs/plugin-react": "^5.1.2",
32
32
  "nitro": "3.0.1-alpha.1",
33
- "tailwindcss": "^4.1.16",
33
+ "tailwindcss": "^4.1.17",
34
34
  "typescript": "^5.9.3",
35
35
  "vite-tsconfig-paths": "^5.1.4"
36
36
  }
@@ -1,15 +1,9 @@
1
1
  import { loader } from 'fumadocs-core/source';
2
- import * as icons from 'lucide-static';
3
2
  import { docs } from 'fumadocs-mdx:collections/server';
3
+ import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons';
4
4
 
5
5
  export const source = loader({
6
6
  source: docs.toFumadocsSource(),
7
7
  baseUrl: '/docs',
8
- icon(icon) {
9
- if (!icon) {
10
- return;
11
- }
12
-
13
- if (icon in icons) return icons[icon as keyof typeof icons];
14
- },
8
+ plugins: [lucideIconsPlugin()],
15
9
  });
@@ -2,8 +2,6 @@ import { createFileRoute, notFound } from '@tanstack/react-router';
2
2
  import { DocsLayout } from 'fumadocs-ui/layouts/docs';
3
3
  import { createServerFn } from '@tanstack/react-start';
4
4
  import { source } from '@/lib/source';
5
- import type * as PageTree from 'fumadocs-core/page-tree';
6
- import { useMemo } from 'react';
7
5
  import browserCollections from 'fumadocs-mdx:collections/browser';
8
6
  import {
9
7
  DocsBody,
@@ -13,18 +11,19 @@ import {
13
11
  } from 'fumadocs-ui/layouts/docs/page';
14
12
  import defaultMdxComponents from 'fumadocs-ui/mdx';
15
13
  import { baseOptions } from '@/lib/layout.shared';
14
+ import { useFumadocsLoader } from 'fumadocs-core/source/client';
16
15
 
17
16
  export const Route = createFileRoute('/docs/$')({
18
17
  component: Page,
19
18
  loader: async ({ params }) => {
20
19
  const slugs = params._splat?.split('/') ?? [];
21
- const data = await loader({ data: slugs });
20
+ const data = await serverLoader({ data: slugs });
22
21
  await clientLoader.preload(data.path);
23
22
  return data;
24
23
  },
25
24
  });
26
25
 
27
- const loader = createServerFn({
26
+ const serverLoader = createServerFn({
28
27
  method: 'GET',
29
28
  })
30
29
  .inputValidator((slugs: string[]) => slugs)
@@ -33,8 +32,8 @@ const loader = createServerFn({
33
32
  if (!page) throw notFound();
34
33
 
35
34
  return {
36
- tree: source.pageTree as object,
37
35
  path: page.path,
36
+ pageTree: await source.serializePageTree(source.getPageTree()),
38
37
  };
39
38
  });
40
39
 
@@ -58,48 +57,12 @@ const clientLoader = browserCollections.docs.createClientLoader({
58
57
 
59
58
  function Page() {
60
59
  const data = Route.useLoaderData();
60
+ const { pageTree } = useFumadocsLoader(data);
61
61
  const Content = clientLoader.getComponent(data.path);
62
- const tree = useMemo(
63
- () => transformPageTree(data.tree as PageTree.Folder),
64
- [data.tree],
65
- );
66
62
 
67
63
  return (
68
- <DocsLayout {...baseOptions()} tree={tree}>
64
+ <DocsLayout {...baseOptions()} tree={pageTree}>
69
65
  <Content />
70
66
  </DocsLayout>
71
67
  );
72
68
  }
73
-
74
- function transformPageTree(root: PageTree.Root): PageTree.Root {
75
- function mapNode<T extends PageTree.Node>(item: T): T {
76
- if (typeof item.icon === 'string') {
77
- item = {
78
- ...item,
79
- icon: (
80
- <span
81
- dangerouslySetInnerHTML={{
82
- __html: item.icon,
83
- }}
84
- />
85
- ),
86
- };
87
- }
88
-
89
- if (item.type === 'folder') {
90
- return {
91
- ...item,
92
- index: item.index ? mapNode(item.index) : undefined,
93
- children: item.children.map(mapNode),
94
- };
95
- }
96
-
97
- return item;
98
- }
99
-
100
- return {
101
- ...root,
102
- children: root.children.map(mapNode),
103
- fallback: root.fallback ? transformPageTree(root.fallback) : undefined,
104
- };
105
- }
@@ -8,17 +8,21 @@ export const Route = createFileRoute('/')({
8
8
 
9
9
  function Home() {
10
10
  return (
11
- <HomeLayout {...baseOptions()} className="text-center py-32 justify-center">
12
- <h1 className="font-medium text-xl mb-4">Fumadocs on Tanstack Start.</h1>
13
- <Link
14
- to="/docs/$"
15
- params={{
16
- _splat: '',
17
- }}
18
- className="px-3 py-2 rounded-lg bg-fd-primary text-fd-primary-foreground font-medium text-sm mx-auto"
19
- >
20
- Open Docs
21
- </Link>
11
+ <HomeLayout {...baseOptions()}>
12
+ <div className="flex flex-col flex-1 justify-center px-4 py-8 text-center">
13
+ <h1 className="font-medium text-xl mb-4">
14
+ Fumadocs on Tanstack Start.
15
+ </h1>
16
+ <Link
17
+ to="/docs/$"
18
+ params={{
19
+ _splat: '',
20
+ }}
21
+ className="px-3 py-2 rounded-lg bg-fd-primary text-fd-primary-foreground font-medium text-sm mx-auto"
22
+ >
23
+ Open Docs
24
+ </Link>
25
+ </div>
22
26
  </HomeLayout>
23
27
  );
24
28
  }
@@ -15,5 +15,4 @@ node_modules
15
15
  /playwright/.cache/
16
16
  .tanstack
17
17
 
18
- src/routeTree.gen.ts
19
18
  .source
@@ -11,28 +11,28 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "@orama/orama": "^3.1.16",
14
- "@tanstack/react-router": "^1.134.12",
15
- "@tanstack/react-router-devtools": "^1.134.12",
16
- "@tanstack/react-start": "^1.134.12",
17
- "@tanstack/start-static-server-functions": "^1.134.12",
14
+ "@tanstack/react-router": "1.136.18",
15
+ "@tanstack/react-router-devtools": "1.136.18",
16
+ "@tanstack/react-start": "1.136.18",
17
+ "@tanstack/start-static-server-functions": "1.136.18",
18
18
  "fumadocs-core": "workspace:*",
19
19
  "fumadocs-mdx": "workspace:*",
20
20
  "fumadocs-ui": "workspace:*",
21
- "lucide-static": "^0.552.0",
22
- "react": "^19.2.0",
23
- "react-dom": "^19.2.0",
24
- "tailwind-merge": "^3.3.1",
25
- "vite": "^7.2.0"
21
+ "lucide-static": "^0.556.0",
22
+ "react": "^19.2.1",
23
+ "react-dom": "^19.2.1",
24
+ "tailwind-merge": "^3.4.0",
25
+ "vite": "^7.2.7"
26
26
  },
27
27
  "devDependencies": {
28
- "@tailwindcss/vite": "^4.1.16",
28
+ "@tailwindcss/vite": "^4.1.17",
29
29
  "@types/mdx": "^2.0.13",
30
- "@types/node": "^24.10.0",
31
- "@types/react": "^19.2.2",
32
- "@types/react-dom": "^19.2.2",
33
- "@vitejs/plugin-react": "^5.1.0",
30
+ "@types/node": "^24.10.2",
31
+ "@types/react": "^19.2.7",
32
+ "@types/react-dom": "^19.2.3",
33
+ "@vitejs/plugin-react": "^5.1.2",
34
34
  "serve": "^14.2.5",
35
- "tailwindcss": "^4.1.16",
35
+ "tailwindcss": "^4.1.17",
36
36
  "typescript": "^5.9.3",
37
37
  "vite-tsconfig-paths": "^5.1.4"
38
38
  }
@@ -2,8 +2,6 @@ import { createFileRoute, notFound } from '@tanstack/react-router';
2
2
  import { DocsLayout } from 'fumadocs-ui/layouts/docs';
3
3
  import { createServerFn } from '@tanstack/react-start';
4
4
  import { source } from '@/lib/source';
5
- import type * as PageTree from 'fumadocs-core/page-tree';
6
- import { useMemo } from 'react';
7
5
  import browserCollections from 'fumadocs-mdx:collections/browser';
8
6
  import {
9
7
  DocsBody,
@@ -14,6 +12,7 @@ import {
14
12
  import defaultMdxComponents from 'fumadocs-ui/mdx';
15
13
  import { baseOptions } from '@/lib/layout.shared';
16
14
  import { staticFunctionMiddleware } from '@tanstack/start-static-server-functions';
15
+ import { useFumadocsLoader } from 'fumadocs-core/source/client';
17
16
 
18
17
  export const Route = createFileRoute('/docs/$')({
19
18
  component: Page,
@@ -35,8 +34,8 @@ const loader = createServerFn({
35
34
  if (!page) throw notFound();
36
35
 
37
36
  return {
38
- tree: source.pageTree as object,
39
37
  path: page.path,
38
+ pageTree: await source.serializePageTree(source.pageTree),
40
39
  };
41
40
  });
42
41
 
@@ -61,47 +60,11 @@ const clientLoader = browserCollections.docs.createClientLoader({
61
60
  function Page() {
62
61
  const data = Route.useLoaderData();
63
62
  const Content = clientLoader.getComponent(data.path);
64
- const tree = useMemo(
65
- () => transformPageTree(data.tree as PageTree.Folder),
66
- [data.tree],
67
- );
63
+ const { pageTree } = useFumadocsLoader(data);
68
64
 
69
65
  return (
70
- <DocsLayout {...baseOptions()} tree={tree}>
66
+ <DocsLayout {...baseOptions()} tree={pageTree}>
71
67
  <Content />
72
68
  </DocsLayout>
73
69
  );
74
70
  }
75
-
76
- function transformPageTree(root: PageTree.Root): PageTree.Root {
77
- function mapNode<T extends PageTree.Node>(item: T): T {
78
- if (typeof item.icon === 'string') {
79
- item = {
80
- ...item,
81
- icon: (
82
- <span
83
- dangerouslySetInnerHTML={{
84
- __html: item.icon,
85
- }}
86
- />
87
- ),
88
- };
89
- }
90
-
91
- if (item.type === 'folder') {
92
- return {
93
- ...item,
94
- index: item.index ? mapNode(item.index) : undefined,
95
- children: item.children.map(mapNode),
96
- };
97
- }
98
-
99
- return item;
100
- }
101
-
102
- return {
103
- ...root,
104
- children: root.children.map(mapNode),
105
- fallback: root.fallback ? transformPageTree(root.fallback) : undefined,
106
- };
107
- }
@@ -13,20 +13,20 @@
13
13
  "fumadocs-core": "workspace:*",
14
14
  "fumadocs-mdx": "workspace:*",
15
15
  "fumadocs-ui": "workspace:*",
16
- "react": "^19.2.0",
17
- "react-dom": "^19.2.0",
18
- "react-server-dom-webpack": "^19.2.0",
19
- "waku": "^0.27.0"
16
+ "react": "^19.2.1",
17
+ "react-dom": "^19.2.1",
18
+ "react-server-dom-webpack": "^19.2.1",
19
+ "waku": "^0.27.3"
20
20
  },
21
21
  "devDependencies": {
22
- "@tailwindcss/vite": "^4.1.16",
22
+ "@tailwindcss/vite": "^4.1.17",
23
23
  "@types/mdx": "^2.0.13",
24
- "@types/node": "^24.10.0",
25
- "@types/react": "^19.2.2",
26
- "@types/react-dom": "^19.2.2",
27
- "tailwindcss": "^4.1.16",
24
+ "@types/node": "^24.10.2",
25
+ "@types/react": "^19.2.7",
26
+ "@types/react-dom": "^19.2.3",
27
+ "tailwindcss": "^4.1.17",
28
28
  "typescript": "^5.9.3",
29
- "vite": "^7.2.0",
29
+ "vite": "^7.2.7",
30
30
  "vite-tsconfig-paths": "^5.1.4"
31
31
  }
32
32
  }