diff --git a/package-lock.json b/package-lock.json
index 250a4c198..fe7986f22 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,6 +14,7 @@
"fumadocs-ui": "npm:@fumadocs/base-ui@^16.15.6",
"fumapress": "^1.2.0",
"hono": "^4.9.9",
+ "lucide-react": "^1.41.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"shiki": "^3.20.0",
@@ -4143,9 +4144,9 @@
}
},
"node_modules/lucide-react": {
- "version": "1.40.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.40.0.tgz",
- "integrity": "sha512-MaG+8WnOXkDWz9XeElj7TnQ890tTZUB0a36i03aRRCKGWE6e7jJpmdCvtxxuxcjjdqyN6m4sL6qlHVuSUDtYgg==",
+ "version": "1.41.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.41.0.tgz",
+ "integrity": "sha512-6lksP35l6KszDKUeRTi4LV7i6DEe0Yzl2ALJm9j4c5xEYN91GdW1xGsawGMOg2mgjF5GHBVX8pKX9kP+cWsP3Q==",
"license": "ISC",
"peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
diff --git a/package.json b/package.json
index 81e2d22ed..20d1a97ae 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"fumadocs-ui": "npm:@fumadocs/base-ui@^16.15.6",
"fumapress": "^1.2.0",
"hono": "^4.9.9",
+ "lucide-react": "^1.41.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"shiki": "^3.20.0",
diff --git a/press.config.tsx b/press.config.tsx
index 7a5d19d0a..3059f023f 100644
--- a/press.config.tsx
+++ b/press.config.tsx
@@ -9,6 +9,7 @@ import { update } from "fumadocs-core/source";
import { uiTranslations } from "fumadocs-ui/i18n";
import { defineDocs } from "fumadocs-mdx/macro";
import { createOpenAPI, type OpenAPIServer } from "fumadocs-openapi/server";
+import { Bot } from "lucide-react";
import { readFileSync, readdirSync } from "node:fs";
import path from "node:path";
@@ -23,6 +24,9 @@ function nodeName(node: PageTreeNode) {
}
function renderNavigationIcon(icon: PageTreeNode["icon"]) {
+ if (icon === "robot") {
+ return ;
+ }
if (typeof icon !== "string" || !icon.startsWith("/")) return icon;
return (
();
+ for (const entry of configuredPages) {
+ if (!entry || typeof entry !== "object" || !("group" in entry)) continue;
+ const group = entry as ConfiguredNavigationGroup;
+ configuredGroups.set(group.group, group);
+ }
+ return nodes.map((node) => {
+ if (node.type !== "folder") return node;
+ const configured = configuredGroups.get(nodeName(node));
+ if (!configured) return node;
+ return {
+ ...node,
+ icon: configured.icon ?? node.icon,
+ children: restoreConfiguredFolderIcons(node.children, configured.pages ?? []),
+ };
+ });
+}
+
const openApiTagOrder = Object.fromEntries(LOCALES.map((locale) => {
const spec = JSON.parse(readFileSync(`openapi/service-api-${locale}.json`, "utf8"));
const tags: string[] = [];
@@ -115,7 +148,10 @@ function sectionizeMintlifyTree(
const sourceGroup = sourceGroups.get(group.group);
if (!sourceGroup) continue;
if (sourceGroup.index) children.push(sourceGroup.index);
- children.push(...sourceGroup.children);
+ children.push(...restoreConfiguredFolderIcons(
+ sourceGroup.children,
+ "pages" in group ? group.pages ?? [] : [],
+ ));
}
const tab: Folder = { ...node, root: true, children };
return tab;
diff --git a/tests/fumapress-static-build.test.mjs b/tests/fumapress-static-build.test.mjs
index 1aa938b84..7f8b504ca 100644
--- a/tests/fumapress-static-build.test.mjs
+++ b/tests/fumapress-static-build.test.mjs
@@ -119,6 +119,40 @@ test("platform navigation renders logo assets instead of icon path text", async
}
});
+test("nested bot groups preserve the logos declared in docs.json", async () => {
+ const html = await readFile(
+ path.join(publicRoot, "zh/usage/platforms/discord/index.html"),
+ "utf8",
+ );
+ const asideStart = html.indexOf('