Rework docs navigation and move alternatives to top-level pages (#1487)

* Rework docs navigation and move alternatives to top-level pages

- Add nested docs nav with categories, collapsible groups, breadcrumbs,
  and a right-hand page outline with heading slugs.
- Move alternatives out of /docs/alternatives into /alternatives/*
  marketing pages with 301 redirects.
- Add github-slugger for heading IDs and require explicit width on
  SiteShell so new pages can't accidentally pick the narrow prose layout.
- Remove the best-practices doc from public-docs.

* Make docs content column prose-width
This commit is contained in:
Mohamed Boudra
2026-06-12 12:53:30 +00:00
committed by GitHub
parent fb0c5b27f3
commit 7e46f6a647
54 changed files with 934 additions and 200 deletions
+149
View File
@@ -61,6 +61,13 @@ import { Route as DocsIndexRouteImport } from "./routes/docs/index";
import { Route as BlogIndexRouteImport } from "./routes/blog/index";
import { Route as DocsSplatRouteImport } from "./routes/docs/$";
import { Route as BlogSplatRouteImport } from "./routes/blog/$";
import { Route as AlternativesSupersetRouteImport } from "./routes/alternatives/superset";
import { Route as AlternativesOpencodeDesktopRouteImport } from "./routes/alternatives/opencode-desktop";
import { Route as AlternativesOpenchamberRouteImport } from "./routes/alternatives/openchamber";
import { Route as AlternativesHappyCoderRouteImport } from "./routes/alternatives/happy-coder";
import { Route as AlternativesConductorRouteImport } from "./routes/alternatives/conductor";
import { Route as AlternativesCodexAppRouteImport } from "./routes/alternatives/codex-app";
import { Route as AlternativesClaudeDesktopRouteImport } from "./routes/alternatives/claude-desktop";
const VtcodeRoute = VtcodeRouteImport.update({
id: "/vtcode",
@@ -322,6 +329,43 @@ const BlogSplatRoute = BlogSplatRouteImport.update({
path: "/$",
getParentRoute: () => BlogRoute,
} as any);
const AlternativesSupersetRoute = AlternativesSupersetRouteImport.update({
id: "/alternatives/superset",
path: "/alternatives/superset",
getParentRoute: () => rootRouteImport,
} as any);
const AlternativesOpencodeDesktopRoute =
AlternativesOpencodeDesktopRouteImport.update({
id: "/alternatives/opencode-desktop",
path: "/alternatives/opencode-desktop",
getParentRoute: () => rootRouteImport,
} as any);
const AlternativesOpenchamberRoute = AlternativesOpenchamberRouteImport.update({
id: "/alternatives/openchamber",
path: "/alternatives/openchamber",
getParentRoute: () => rootRouteImport,
} as any);
const AlternativesHappyCoderRoute = AlternativesHappyCoderRouteImport.update({
id: "/alternatives/happy-coder",
path: "/alternatives/happy-coder",
getParentRoute: () => rootRouteImport,
} as any);
const AlternativesConductorRoute = AlternativesConductorRouteImport.update({
id: "/alternatives/conductor",
path: "/alternatives/conductor",
getParentRoute: () => rootRouteImport,
} as any);
const AlternativesCodexAppRoute = AlternativesCodexAppRouteImport.update({
id: "/alternatives/codex-app",
path: "/alternatives/codex-app",
getParentRoute: () => rootRouteImport,
} as any);
const AlternativesClaudeDesktopRoute =
AlternativesClaudeDesktopRouteImport.update({
id: "/alternatives/claude-desktop",
path: "/alternatives/claude-desktop",
getParentRoute: () => rootRouteImport,
} as any);
export interface FileRoutesByFullPath {
"/": typeof IndexRoute;
@@ -372,6 +416,13 @@ export interface FileRoutesByFullPath {
"/sponsor": typeof SponsorRoute;
"/stakpak": typeof StakpakRoute;
"/vtcode": typeof VtcodeRoute;
"/alternatives/claude-desktop": typeof AlternativesClaudeDesktopRoute;
"/alternatives/codex-app": typeof AlternativesCodexAppRoute;
"/alternatives/conductor": typeof AlternativesConductorRoute;
"/alternatives/happy-coder": typeof AlternativesHappyCoderRoute;
"/alternatives/openchamber": typeof AlternativesOpenchamberRoute;
"/alternatives/opencode-desktop": typeof AlternativesOpencodeDesktopRoute;
"/alternatives/superset": typeof AlternativesSupersetRoute;
"/blog/$": typeof BlogSplatRoute;
"/docs/$": typeof DocsSplatRoute;
"/blog/": typeof BlogIndexRoute;
@@ -424,6 +475,13 @@ export interface FileRoutesByTo {
"/sponsor": typeof SponsorRoute;
"/stakpak": typeof StakpakRoute;
"/vtcode": typeof VtcodeRoute;
"/alternatives/claude-desktop": typeof AlternativesClaudeDesktopRoute;
"/alternatives/codex-app": typeof AlternativesCodexAppRoute;
"/alternatives/conductor": typeof AlternativesConductorRoute;
"/alternatives/happy-coder": typeof AlternativesHappyCoderRoute;
"/alternatives/openchamber": typeof AlternativesOpenchamberRoute;
"/alternatives/opencode-desktop": typeof AlternativesOpencodeDesktopRoute;
"/alternatives/superset": typeof AlternativesSupersetRoute;
"/blog/$": typeof BlogSplatRoute;
"/docs/$": typeof DocsSplatRoute;
"/blog": typeof BlogIndexRoute;
@@ -479,6 +537,13 @@ export interface FileRoutesById {
"/sponsor": typeof SponsorRoute;
"/stakpak": typeof StakpakRoute;
"/vtcode": typeof VtcodeRoute;
"/alternatives/claude-desktop": typeof AlternativesClaudeDesktopRoute;
"/alternatives/codex-app": typeof AlternativesCodexAppRoute;
"/alternatives/conductor": typeof AlternativesConductorRoute;
"/alternatives/happy-coder": typeof AlternativesHappyCoderRoute;
"/alternatives/openchamber": typeof AlternativesOpenchamberRoute;
"/alternatives/opencode-desktop": typeof AlternativesOpencodeDesktopRoute;
"/alternatives/superset": typeof AlternativesSupersetRoute;
"/blog/$": typeof BlogSplatRoute;
"/docs/$": typeof DocsSplatRoute;
"/blog/": typeof BlogIndexRoute;
@@ -535,6 +600,13 @@ export interface FileRouteTypes {
| "/sponsor"
| "/stakpak"
| "/vtcode"
| "/alternatives/claude-desktop"
| "/alternatives/codex-app"
| "/alternatives/conductor"
| "/alternatives/happy-coder"
| "/alternatives/openchamber"
| "/alternatives/opencode-desktop"
| "/alternatives/superset"
| "/blog/$"
| "/docs/$"
| "/blog/"
@@ -587,6 +659,13 @@ export interface FileRouteTypes {
| "/sponsor"
| "/stakpak"
| "/vtcode"
| "/alternatives/claude-desktop"
| "/alternatives/codex-app"
| "/alternatives/conductor"
| "/alternatives/happy-coder"
| "/alternatives/openchamber"
| "/alternatives/opencode-desktop"
| "/alternatives/superset"
| "/blog/$"
| "/docs/$"
| "/blog"
@@ -641,6 +720,13 @@ export interface FileRouteTypes {
| "/sponsor"
| "/stakpak"
| "/vtcode"
| "/alternatives/claude-desktop"
| "/alternatives/codex-app"
| "/alternatives/conductor"
| "/alternatives/happy-coder"
| "/alternatives/openchamber"
| "/alternatives/opencode-desktop"
| "/alternatives/superset"
| "/blog/$"
| "/docs/$"
| "/blog/"
@@ -696,6 +782,13 @@ export interface RootRouteChildren {
SponsorRoute: typeof SponsorRoute;
StakpakRoute: typeof StakpakRoute;
VtcodeRoute: typeof VtcodeRoute;
AlternativesClaudeDesktopRoute: typeof AlternativesClaudeDesktopRoute;
AlternativesCodexAppRoute: typeof AlternativesCodexAppRoute;
AlternativesConductorRoute: typeof AlternativesConductorRoute;
AlternativesHappyCoderRoute: typeof AlternativesHappyCoderRoute;
AlternativesOpenchamberRoute: typeof AlternativesOpenchamberRoute;
AlternativesOpencodeDesktopRoute: typeof AlternativesOpencodeDesktopRoute;
AlternativesSupersetRoute: typeof AlternativesSupersetRoute;
}
declare module "@tanstack/react-router" {
@@ -1064,6 +1157,55 @@ declare module "@tanstack/react-router" {
preLoaderRoute: typeof BlogSplatRouteImport;
parentRoute: typeof BlogRoute;
};
"/alternatives/superset": {
id: "/alternatives/superset";
path: "/alternatives/superset";
fullPath: "/alternatives/superset";
preLoaderRoute: typeof AlternativesSupersetRouteImport;
parentRoute: typeof rootRouteImport;
};
"/alternatives/opencode-desktop": {
id: "/alternatives/opencode-desktop";
path: "/alternatives/opencode-desktop";
fullPath: "/alternatives/opencode-desktop";
preLoaderRoute: typeof AlternativesOpencodeDesktopRouteImport;
parentRoute: typeof rootRouteImport;
};
"/alternatives/openchamber": {
id: "/alternatives/openchamber";
path: "/alternatives/openchamber";
fullPath: "/alternatives/openchamber";
preLoaderRoute: typeof AlternativesOpenchamberRouteImport;
parentRoute: typeof rootRouteImport;
};
"/alternatives/happy-coder": {
id: "/alternatives/happy-coder";
path: "/alternatives/happy-coder";
fullPath: "/alternatives/happy-coder";
preLoaderRoute: typeof AlternativesHappyCoderRouteImport;
parentRoute: typeof rootRouteImport;
};
"/alternatives/conductor": {
id: "/alternatives/conductor";
path: "/alternatives/conductor";
fullPath: "/alternatives/conductor";
preLoaderRoute: typeof AlternativesConductorRouteImport;
parentRoute: typeof rootRouteImport;
};
"/alternatives/codex-app": {
id: "/alternatives/codex-app";
path: "/alternatives/codex-app";
fullPath: "/alternatives/codex-app";
preLoaderRoute: typeof AlternativesCodexAppRouteImport;
parentRoute: typeof rootRouteImport;
};
"/alternatives/claude-desktop": {
id: "/alternatives/claude-desktop";
path: "/alternatives/claude-desktop";
fullPath: "/alternatives/claude-desktop";
preLoaderRoute: typeof AlternativesClaudeDesktopRouteImport;
parentRoute: typeof rootRouteImport;
};
}
}
@@ -1140,6 +1282,13 @@ const rootRouteChildren: RootRouteChildren = {
SponsorRoute: SponsorRoute,
StakpakRoute: StakpakRoute,
VtcodeRoute: VtcodeRoute,
AlternativesClaudeDesktopRoute: AlternativesClaudeDesktopRoute,
AlternativesCodexAppRoute: AlternativesCodexAppRoute,
AlternativesConductorRoute: AlternativesConductorRoute,
AlternativesHappyCoderRoute: AlternativesHappyCoderRoute,
AlternativesOpenchamberRoute: AlternativesOpenchamberRoute,
AlternativesOpencodeDesktopRoute: AlternativesOpencodeDesktopRoute,
AlternativesSupersetRoute: AlternativesSupersetRoute,
};
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)