import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitepress' import type { DefaultTheme } from 'vitepress' import llmstxt from 'vitepress-plugin-llms' import { vitepressDemoPlugin } from 'vitepress-demo-plugin/markdown' /** * VitePress 的 SidebarItem 没有 icon 字段,这里扩展一个。 * * icon 必须是「名字字符串」(如 'boxes'),渲染时由 theme/sidebarIcons.ts * 查表映射到 Lucide 组件。不能直接写组件对象:themeConfig.sidebar 会被 * VitePress 序列化,组件引用在此过程中丢失(详见 sidebarIcons.ts)。 */ type G3SidebarItem = DefaultTheme.SidebarItem & { icon?: string items?: G3SidebarItem[] } /** * 文档站(VitePress 默认主题)。 * * 几个刻意的选择: * - srcDir: 'content' —— Markdown 全部在 docs/content 下,站点根即 content/ * - alias 直连 packages 源码 —— 组件库尚未构建也能开发,改组件即时热更 * (tokens 例外:它是 SCSS 编译产物,alias 指向 dist/index.css,需先 build tokens) * * 部署到子路径时用环境变量 DOCS_BASE_URL=/docs/,不在配置里写死。 */ export default defineConfig({ srcDir: 'content', base: process.env.DOCS_BASE_URL || '/', cleanUrls: true, lang: 'zh-CN', title: 'G3Soft 技术文档', description: 'G3Soft 技术文档:组件库、设计变量、工程规范与设计决策。', // sitemap.xml 由 VitePress 内置生成,hostname 决定绝对 URL。 sitemap: { hostname: process.env.DOCS_SITE_URL || 'https://ui.g3soft.dev', }, markdown: { // 代码块配色(shiki 内置主题),亮/暗各一套 theme: { light: 'vitesse-light', dark: 'vitesse-dark' }, config(md) { // 组件示例容器:md 里写 // demoDir 作为示例文件基准目录,路径相对它解析(这里指向 docs/examples) md.use(vitepressDemoPlugin, { demoDir: fileURLToPath(new URL('../examples', import.meta.url)), lightTheme: 'vitesse-light', darkTheme: 'vitesse-dark', }) }, }, vite: { // 构建期生成 llms.txt / llms-full.txt 与每页 .md 版本 plugins: [llmstxt()], resolve: { // 用正则做“精确匹配”:否则 '@g3soft/tokens' 的前缀别名会把 // '@g3soft/tokens/scss' 也一并改写掉,导致组件里的 @use 找不到 SCSS。 alias: [ { find: /^@g3soft\/ui$/, replacement: fileURLToPath(new URL('../../packages/ui/src/index.ts', import.meta.url)), }, { // tokens 是 SCSS 编译产物:仅裸导入指向 dist/index.css(由 @g3soft/tokens 的 build 生成) find: /^@g3soft\/tokens$/, replacement: fileURLToPath( new URL('../../packages/tokens/dist/index.css', import.meta.url), ), }, ], }, server: { // 默认 5173 常被其它 Vite 项目占用,这里固定用 3100; // strictPort: false 让端口冲突时自动往后顺延(3101、3102…), // 而不是直接报错退出。实际端口以终端输出为准。 port: 3100, strictPort: false, fs: { // 组件库源码在 docs 目录之外,需要放开读取范围 allow: [fileURLToPath(new URL('../..', import.meta.url))], }, }, }, themeConfig: { nav: [], // 按路径前缀分段,替代原 Docus 的 .navigation.yml 与 navigation.sub: // 进入某板块时侧边栏只显示该板块的页面。 // collapsed: false 是 VitePress 渲染折叠箭头的前提 —— 只有显式设置 // item.collapsed 才会输出 .caret 节点(见 VPSidebarItem.vue)。 // 默认展开,与 Docus 侧栏一致。 sidebar: { '/guide/': [ { text: '指南', icon: 'component', collapsed: false, items: [{ text: '快速开始', link: '/guide/getting-started' }], }, ] satisfies G3SidebarItem[], '/ui/': [ { text: '使用', icon: 'boxes', collapsed: false, items: [ { text: '快速上手', link: '/ui/usage/getting-started' }, { text: '双向布局(RTL)', link: '/ui/usage/rtl' }, ], }, { text: '通用组件', icon: 'layers', collapsed: false, items: [ { text: 'Button 按钮', link: '/ui/general/button' }, { text: 'ButtonGroup 按钮组', link: '/ui/general/button-group' }, { text: 'Grid 栅格', link: '/ui/general/grid' }, { text: 'Segmented 分段控制器', link: '/ui/general/segmented' }, { text: 'Space 间距', link: '/ui/general/space' }, { text: 'Tag 标签', link: '/ui/general/tag' }, ], }, { text: '数据录入', icon: 'form-input', collapsed: false, items: [ { text: 'Checkbox 复选框', link: '/ui/form/checkbox' }, { text: 'Form 表单', link: '/ui/form/form' }, { text: 'Input 输入框', link: '/ui/form/input' }, { text: 'Radio 单选框', link: '/ui/form/radio' }, { text: 'Select 选择器', link: '/ui/form/select' }, { text: 'Switch 开关', link: '/ui/form/switch' }, ], }, { text: '浮层与导航', icon: 'layers', collapsed: false, items: [ { text: 'Drawer 抽屉', link: '/ui/overlay/drawer' }, { text: 'Dropdown 下拉菜单', link: '/ui/overlay/dropdown' }, { text: 'Modal 对话框', link: '/ui/overlay/modal' }, { text: 'Popover 气泡卡片', link: '/ui/overlay/popover' }, { text: 'Tooltip 文字提示', link: '/ui/overlay/tooltip' }, ], }, { text: '反馈', icon: 'message-square', collapsed: false, items: [ { text: 'Message 轻提示', link: '/ui/feedback/message' }, { text: 'Notification 通知提醒', link: '/ui/feedback/notification' }, { text: 'Scrollbar 滚动容器', link: '/ui/feedback/scrollbar' }, { text: 'Spin 加载中', link: '/ui/feedback/spin' }, ], }, { text: '数据展示', icon: 'table-properties', collapsed: false, items: [ { text: 'DatePicker 日期选择', link: '/ui/data/date' }, { text: 'Pagination 分页器', link: '/ui/data/pagination' }, { text: 'Splitter 分割面板', link: '/ui/data/splitter' }, { text: 'Tabs 标签页', link: '/ui/data/tabs' }, { text: 'Tree 树形控件', link: '/ui/data/tree' }, ], }, ] satisfies G3SidebarItem[], '/api/': [ { text: '接口文档', icon: 'cable', collapsed: false, items: [{ text: '快速开始', link: '/api/getting-started' }], }, ] satisfies G3SidebarItem[], }, // 内置本地搜索(minisearch),不再依赖 better-sqlite3 search: { provider: 'local' }, outline: { level: [2, 3], label: '本页目录' }, }, })