mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-21 13:00:04 +08:00
Sidebar: 11 separator groups become 5, with each module a collapsible folder that auto-opens on the active page. 61 always-visible rows drop to 16. Groups mirror the app's own nav (Chats/Workspace/Workflows) rather than inventing a taxonomy; Enterprise and Self-Hosting are hoisted out of Platform. Chrome: register the `hover-hover` variant, without which every @sim/emcn hover state silently compiled to nothing; restore the sidebar's Geist font stack; add 11 emcn tokens that were falling back to currentColor; adopt the named type scale; align row geometry, hover tokens and group labels with the app. Rename: mothership/ -> chat/ with redirects for the old URLs. Asset paths, the @mothership.sim.ai domain and the `mothership` log-trigger enum value are deliberately left alone -- they are CDN objects, a real domain, and a live product value. Also removes the page-type badge, drops the "Next" heading from the ToC, and lets FAQ rows open independently so expanding one no longer shifts the page.
102 lines
3.0 KiB
TypeScript
102 lines
3.0 KiB
TypeScript
import { createElement, Fragment } from 'react'
|
|
import { loader, multiple } from 'fumadocs-core/source'
|
|
import type { DocData, DocMethods } from 'fumadocs-mdx/runtime/types'
|
|
import { openapiSource } from 'fumadocs-openapi/server'
|
|
import { docs } from '@/.source/server'
|
|
import { i18n } from './i18n'
|
|
import { openapi } from './openapi'
|
|
|
|
const METHOD_COLORS: Record<string, string> = {
|
|
GET: 'text-green-600 dark:text-green-400',
|
|
HEAD: 'text-green-600 dark:text-green-400',
|
|
OPTIONS: 'text-green-600 dark:text-green-400',
|
|
POST: 'text-blue-600 dark:text-blue-400',
|
|
PUT: 'text-yellow-600 dark:text-yellow-400',
|
|
PATCH: 'text-orange-600 dark:text-orange-400',
|
|
DELETE: 'text-red-600 dark:text-red-400',
|
|
}
|
|
|
|
/**
|
|
* Custom openapi plugin that places method badges BEFORE the page name
|
|
* in the sidebar (like Mintlify/Gumloop) instead of after.
|
|
*/
|
|
function openapiPluginBadgeLeft() {
|
|
return {
|
|
name: 'fumadocs:openapi-badge-left',
|
|
enforce: 'pre' as const,
|
|
transformPageTree: {
|
|
file(
|
|
this: {
|
|
storage: {
|
|
read: (path: string) => { format: string; data: Record<string, unknown> } | undefined
|
|
}
|
|
},
|
|
node: { name: React.ReactNode },
|
|
filePath: string | undefined
|
|
) {
|
|
if (!filePath) return node
|
|
const file = this.storage.read(filePath)
|
|
if (!file || file.format !== 'page') return node
|
|
const openApiData = file.data._openapi as { method?: string; webhook?: boolean } | undefined
|
|
if (!openApiData || typeof openApiData !== 'object') return node
|
|
if (openApiData.webhook) {
|
|
node.name = createElement(
|
|
Fragment,
|
|
null,
|
|
node.name,
|
|
' ',
|
|
createElement(
|
|
'span',
|
|
{
|
|
className:
|
|
'ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono',
|
|
},
|
|
'Webhook'
|
|
)
|
|
)
|
|
} else if (openApiData.method) {
|
|
const method = openApiData.method.toUpperCase()
|
|
const colorClass = METHOD_COLORS[method] ?? METHOD_COLORS.GET
|
|
node.name = createElement(
|
|
Fragment,
|
|
null,
|
|
createElement(
|
|
'span',
|
|
{
|
|
className: `font-mono font-medium me-1.5 text-[10px] text-nowrap ${colorClass}`,
|
|
'data-method': method.toLowerCase(),
|
|
},
|
|
method
|
|
),
|
|
node.name
|
|
)
|
|
}
|
|
return node
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
export const source = loader(
|
|
multiple({
|
|
docs: docs.toFumadocsSource(),
|
|
openapi: await openapiSource(openapi, {
|
|
baseDir: 'en/api-reference/(generated)',
|
|
groupBy: 'tag',
|
|
}),
|
|
}),
|
|
{
|
|
baseUrl: '/',
|
|
i18n,
|
|
plugins: [openapiPluginBadgeLeft() as never],
|
|
}
|
|
)
|
|
|
|
/** Full page data type including MDX content and metadata */
|
|
export type PageData = DocData &
|
|
DocMethods & {
|
|
title: string
|
|
description?: string
|
|
full?: boolean
|
|
}
|