{title}
+{tagline}
+{body}
+ + {ctaLabel} + +diff --git a/preview/docusaurus.config.ts b/preview/docusaurus.config.ts index 3864e2a4..8cd8db73 100644 --- a/preview/docusaurus.config.ts +++ b/preview/docusaurus.config.ts @@ -73,6 +73,7 @@ const config: Config = { colorMode: { defaultMode: 'light', respectPrefersColorScheme: true, + disableSwitch: true, }, announcementBar: { id: 'dev_preview_banner', @@ -95,19 +96,45 @@ const config: Config = { position: 'left', label: 'Documentation', }, + { + to: '/blog', + label: 'Blog', + position: 'left', + }, + { + to: '/community', + label: 'Community', + position: 'left', + }, { type: 'custom-version-dropdown' as any, position: 'left', }, { - href: 'https://llm-d.ai', - label: 'llm-d.ai', + type: 'custom-github-stars' as any, position: 'right', }, + { + type: 'custom-slack-button' as any, + position: 'right', + }, + { + type: 'custom-color-mode-toggle' as any, + position: 'right', + }, + // Mobile-only fallbacks — hidden on desktop via CSS, surface in the + // hamburger drawer at <997px where the custom pills are hidden. { href: 'https://github.com/llm-d/llm-d', label: 'GitHub', position: 'right', + className: 'navbar-mobile-only', + }, + { + href: 'https://llm-d.slack.com', + label: 'Join Slack', + position: 'right', + className: 'navbar-mobile-only', }, ], }, @@ -139,6 +166,25 @@ const config: Config = { {label: 'KV Cache', href: 'https://github.com/llm-d/llm-d-kv-cache'}, ], }, + { + title: 'Social', + items: [ + { + html: ` +
+ `, + }, + {label: 'Join our Slack', href: 'https://llm-d.slack.com'}, + ], + }, ], copyright: `Copyright © ${new Date().getFullYear()} llm-d project. Apache 2.0 License.`, }, diff --git a/preview/package-lock.json b/preview/package-lock.json index b86da326..4222a0a3 100644 --- a/preview/package-lock.json +++ b/preview/package-lock.json @@ -12,9 +12,10 @@ "@docusaurus/faster": "3.10.0", "@docusaurus/preset-classic": "3.10.0", "@docusaurus/theme-mermaid": "^3.10.0", - "@fontsource/inter": "^5.2.8", + "@fontsource/ibm-plex-sans": "^5.2.8", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", + "lucide-react": "^1.14.0", "prism-react-renderer": "^2.3.0", "react": "^19.0.0", "react-dom": "^19.0.0" @@ -4234,11 +4235,10 @@ "tslib": "^2.4.0" } }, - "node_modules/@fontsource/inter": { + "node_modules/@fontsource/ibm-plex-sans": { "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz", - "integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==", - "license": "OFL-1.1", + "resolved": "https://registry.npmjs.org/@fontsource/ibm-plex-sans/-/ibm-plex-sans-5.2.8.tgz", + "integrity": "sha512-eztSXjDhPhcpxNIiGTgMebdLP9qS4rWkysuE1V7c+DjOR0qiezaiDaTwQE7bTnG5HxAY/8M43XKDvs3cYq6ZYQ==", "funding": { "url": "https://github.com/sponsors/ayuhito" } @@ -12669,6 +12669,14 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.14.0.tgz", + "integrity": "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", diff --git a/preview/package.json b/preview/package.json index 4e2f5818..01072281 100644 --- a/preview/package.json +++ b/preview/package.json @@ -21,9 +21,10 @@ "@docusaurus/faster": "3.10.0", "@docusaurus/preset-classic": "3.10.0", "@docusaurus/theme-mermaid": "^3.10.0", - "@fontsource/inter": "^5.2.8", + "@fontsource/ibm-plex-sans": "^5.2.8", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", + "lucide-react": "^1.14.0", "prism-react-renderer": "^2.3.0", "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/preview/src/components/ColorModeToggleSwitch.tsx b/preview/src/components/ColorModeToggleSwitch.tsx new file mode 100644 index 00000000..6ba36559 --- /dev/null +++ b/preview/src/components/ColorModeToggleSwitch.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import {useColorMode} from '@docusaurus/theme-common'; +import {Moon, Sun} from 'lucide-react'; + +export default function ColorModeToggleSwitch(): React.JSX.Element { + const {colorMode, setColorMode} = useColorMode(); + const isDark = colorMode === 'dark'; + + return ( + + ); +} diff --git a/preview/src/components/GitHubStars.tsx b/preview/src/components/GitHubStars.tsx new file mode 100644 index 00000000..5f1e7218 --- /dev/null +++ b/preview/src/components/GitHubStars.tsx @@ -0,0 +1,105 @@ +import React, {useEffect, useState} from 'react'; +import {Star} from 'lucide-react'; + +// lucide-react 1.x dropped brand marks; inline the GitHub Octicon (MIT) so we +// don't depend on the older 0.x line. +function GitHubMark({size = 16}: {size?: number}): React.JSX.Element { + return ( + + ); +} + +const REPO_URL = 'https://github.com/llm-d/llm-d'; +const API_URL = 'https://api.github.com/repos/llm-d/llm-d'; +const CACHE_KEY = 'llmd-github-stars'; +const CACHE_TTL_MS = 60 * 60 * 1000; + +type CacheEntry = {count: number; ts: number}; + +function formatStars(n: number): string { + if (n < 1000) return n.toString(); + return (Math.round(n / 100) / 10).toFixed(1) + 'k'; +} + +function readCache(): number | null { + try { + const raw = sessionStorage.getItem(CACHE_KEY); + if (!raw) return null; + const parsed = JSON.parse(raw) as CacheEntry; + if (Date.now() - parsed.ts > CACHE_TTL_MS) return null; + return parsed.count; + } catch { + return null; + } +} + +function writeCache(count: number): void { + try { + sessionStorage.setItem(CACHE_KEY, JSON.stringify({count, ts: Date.now()})); + } catch { + /* ignore quota / privacy mode */ + } +} + +export default function GitHubStars(): React.JSX.Element { + const [stars, setStars] = useState
- + llm-d is a distributed inference stack that orchestrates vLLM and + SGLang across your cluster with LLM-aware routing, disaggregated + serving, and tiered KV caching — using Kubernetes primitives you + already run. +
+{s.description}
- - ))} +{tagline}
+{body}
+ + {ctaLabel} + +