fefad82e78
mirror-to-gitee / mirror (push) Successful in 6s
现象:导航左上角显示成「雪羊科技物联网卡与设备管理平台」挤在一行, 副标题没有换行,还压到了 logo 上。 根因 siteTitle 里的副标题是 <span class="site-subtitle">,经 v-html 插入后, 其父级是 VitePress 自己的**裸 <span>(无 class)**,而不是 .title-text。 原样式写的是 `.VPNavBarTitle .title-text .site-subtitle`, 选择器永远匹配不上,display:block 从未生效,副标题只能行内跟随。 改动 - 选择器改为 .VPNavBarTitle .site-subtitle(去掉不存在的 .title-text) - 品牌名与副标题的容器改为 flex 纵向 + 垂直居中, 整体在导航高度内居中 - 副标题 11px / 0.03em 字距 / var(--p-ink-3) 弱化; 品牌名与副标题间距 3px - 响应式:≤860px 副标题缩到 10.5px;≤480px 隐藏副标题只留品牌名 - 新增 scripts/check-nav-brand.mjs 并接入 npm run check(prebuild/predev 自动跑): 校验 siteTitle 的**品牌主体**必须是「雪羊科技」(允许带副标题 span), 且 logo 配置与文件都存在。 反例全部验证:改成「雪羊开源」→ 拦;只留「雪羊科技」→ 通过; 改成「雪羊科技开源」→ 拦;删掉 siteTitle → 拦 验证 - 干净副本构建后实测三档宽度: 1440/860 → 「雪羊科技 ⏎ 物联网卡与设备管理平台」,display:block 390 → 只显示「雪羊科技」,副标题 display:none - 品牌区截图确认两行居中、不压 logo
163 lines
5.6 KiB
TypeScript
163 lines
5.6 KiB
TypeScript
import { defineConfig } from 'vitepress'
|
|
import { projects } from '../data/projects'
|
|
import { docs, DOCS_HOME } from '../data/content'
|
|
|
|
/**
|
|
* 门户站构建配置
|
|
*
|
|
* SITE_BASE 由构建参数注入:
|
|
* - /www/ 过渡形态:挂在已有网关的 /www/ 路径下(没有独立域名时用)
|
|
* - / 独立域名形态:站点独占域名根路径
|
|
* 两者内容完全同源,只有资源前缀与路由前缀不同,所以用构建参数而不是改代码。
|
|
*/
|
|
const SITE_BASE = process.env.SITE_BASE ?? '/www/'
|
|
|
|
/** 代码仓组织(雪羊科技企业仓) */
|
|
const ORG_URL = process.env.ORG_URL ?? 'https://gitee.com/snowgoat'
|
|
|
|
/** 各项目的文档站地址(按项目 id 覆盖) */
|
|
const DOCS_URL: Record<string, string> = {
|
|
iotlcm: 'http://open.5iot.com:5051/docs/',
|
|
}
|
|
|
|
function tokenizeSearchText(text: string): string[] {
|
|
const terms = text.match(/[A-Za-z0-9]+|[\u3400-\u9fff]+/g) ?? []
|
|
return terms.flatMap((term) => {
|
|
if (!/^[\u3400-\u9fff]+$/.test(term)) return [term.toLowerCase()]
|
|
if (term.length === 1) return [term]
|
|
return Array.from({ length: term.length - 1 }, (_, index) => term.slice(index, index + 2))
|
|
})
|
|
}
|
|
|
|
const searchTranslations = {
|
|
button: {
|
|
buttonText: '搜索',
|
|
buttonAriaLabel: '搜索文档',
|
|
},
|
|
modal: {
|
|
displayDetails: '显示详细结果',
|
|
resetButtonTitle: '清除搜索',
|
|
backButtonTitle: '关闭搜索',
|
|
noResultsText: '没有找到相关结果',
|
|
footer: {
|
|
selectText: '选择',
|
|
selectKeyAriaLabel: '回车',
|
|
navigateText: '切换结果',
|
|
navigateUpKeyAriaLabel: '上箭头',
|
|
navigateDownKeyAriaLabel: '下箭头',
|
|
closeText: '关闭',
|
|
closeKeyAriaLabel: '退出',
|
|
},
|
|
},
|
|
}
|
|
|
|
export default defineConfig({
|
|
srcDir: './pages',
|
|
base: SITE_BASE,
|
|
title: '雪羊科技物联网卡与设备管理平台',
|
|
description: '雪羊科技开源的物联网卡与设备管理平台:物联网卡管理、DTU 设备管理、中后台开发框架,Apache-2.0 许可',
|
|
lang: 'zh-CN',
|
|
cleanUrls: true,
|
|
lastUpdated: false,
|
|
head: [
|
|
['link', { rel: 'icon', type: 'image/svg+xml', href: `${SITE_BASE}favicon.svg` }],
|
|
],
|
|
themeConfig: {
|
|
/**
|
|
* 导航左上角的品牌名 —— 主体固定为「雪羊科技」,不要替换成别的字。
|
|
*
|
|
* 后面那截 <span class="site-subtitle">物联网卡与设备管理平台</span>
|
|
* 是品牌定位副标题(样式见 portal.css 的 .site-subtitle),
|
|
* 与品牌名一起构成左上角的两行结构:上行品牌、下行定位。
|
|
*
|
|
* 注意区分:
|
|
* config.title → 浏览器标签页与 SEO 用的完整站名,不显示在导航
|
|
* siteTitle → 左上角实际渲染的内容
|
|
* 校验见 scripts/check-nav-brand.mjs(构建前自动执行)。
|
|
*/
|
|
siteTitle: '雪羊科技<span class="site-subtitle">物联网卡与设备管理平台</span>',
|
|
logo: { src: '/snowgoat-logo.png', alt: '雪羊科技' },
|
|
nav: [
|
|
{ text: '首页', link: '/' },
|
|
{ text: '产品功能', link: '/#features' },
|
|
{ text: '核心能力', link: '/#core' },
|
|
{ text: '界面预览', link: '/#preview' },
|
|
// activeMatch:进入任一项目详情页时「项目」保持高亮
|
|
{ text: '项目', link: '/projects/', activeMatch: '^/projects/' },
|
|
// 教程视频:站内页,含各项目的录制清单与分镜
|
|
{ text: '教程', link: '/guide/videos', activeMatch: '^/guide/videos' },
|
|
// 官方文档直接跳文档站(外站),不在本站内做锚点停留
|
|
{
|
|
text: '官方文档',
|
|
link: DOCS_HOME,
|
|
target: '_blank',
|
|
rel: 'noopener',
|
|
},
|
|
{ text: '关于', link: '/about' },
|
|
],
|
|
sidebar: {
|
|
'/projects/': [
|
|
{
|
|
text: '项目',
|
|
collapsed: false,
|
|
// 每个项目带自己的子页面(快速开始 / 部署 / 教程等),
|
|
// 子页面清单来自注册表的 sections,不在此处重复维护。
|
|
items: projects.map((p) => ({
|
|
text: p.name,
|
|
link: p.page,
|
|
collapsed: false,
|
|
items: p.sections.map((s) => ({ text: s.text, link: s.link })),
|
|
})),
|
|
},
|
|
],
|
|
'/guide/': [
|
|
{
|
|
text: '门户',
|
|
collapsed: false,
|
|
items: [
|
|
{ text: '教程中心', link: '/guide/videos' },
|
|
{ text: '门户部署', link: '/guide/portal-deploy' },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
socialLinks: [
|
|
{ icon: 'github', link: ORG_URL },
|
|
],
|
|
footer: {
|
|
message: '雪羊科技物联网卡与设备管理平台 · Apache-2.0',
|
|
copyright: 'Copyright © 雪羊科技',
|
|
},
|
|
search: {
|
|
provider: 'local',
|
|
options: {
|
|
translations: searchTranslations,
|
|
miniSearch: {
|
|
options: { tokenize: tokenizeSearchText },
|
|
searchOptions: { combineWith: 'AND' },
|
|
},
|
|
_render(src, env, md) {
|
|
const html = md.render(src, env)
|
|
if (env.relativePath !== 'index.md') return html
|
|
|
|
const homeSearchText = [
|
|
'雪羊科技开源 首页 项目 产品功能 核心能力 界面预览 官方文档',
|
|
...projects.map((project) => `${project.name} ${project.tagline} ${project.summary}`),
|
|
...docs.map((doc) => `${doc.name} ${doc.desc} ${doc.project}`),
|
|
].join('\n\n')
|
|
|
|
return `${html}\n${md.render(homeSearchText, env)}`
|
|
},
|
|
},
|
|
},
|
|
outline: {
|
|
level: [2, 3],
|
|
label: '本页目录',
|
|
},
|
|
docFooter: {
|
|
prev: '上一页',
|
|
next: '下一页',
|
|
},
|
|
},
|
|
})
|