Unified Agent + reusable Go agent core.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Update VitePress header menu

Lyric 70d1f498 16fde14e

+453 -78
+5
web/vitepress/design_impl.md
··· 92 92 - search trigger 是图标按钮,不是文字按钮 93 93 - language switch 继续作为 utility menu 94 94 - 不引入默认 mobile menu 体系 95 + - `theme.nav` 不再作为 header 中央一级导航直接暴露,而是进入右侧 `MENU` 的全高面板 96 + - `MENU` 面板沿用 canonical website header 规则:从 68px header 下沿开始,高度为 `calc(100svh - 68px)` 97 + - VitePress 侧保留 search、LANG、MENU 三个右侧 utility action;search 是 docs runtime 独有入口 98 + - 移动端隐藏 VitePress 默认 `VPLocalNav`;sidebar 分组进入自定义 `MENU` 面板 99 + - `MENU` 面板只保留三组:`Navigation`、当前语言下的 `References`、`Resources` 95 100 96 101 ### 3.2 Local Search 97 102
+168 -17
web/vitepress/docs/.vitepress/theme/components/MorphSiteHeader.vue
··· 9 9 text: string 10 10 } 11 11 12 + type SidebarItem = { 13 + items?: SidebarItem[] 14 + link?: string 15 + text: string 16 + } 17 + 12 18 const { hash, localeIndex, page, site, theme } = useData() 13 19 const route = useRoute() 14 20 15 21 const langDetails = ref<HTMLDetailsElement | null>(null) 22 + const menuCloseTimer = ref<number | null>(null) 23 + const menuOpen = ref(false) 24 + const menuVisible = ref(false) 16 25 const showSearch = ref(false) 17 26 18 27 const navItems = computed(() => ((theme.value.nav ?? []) as NavItem[]).filter((item) => item.link)) 28 + const sidebarGroups = computed(() => (theme.value.sidebar ?? []) as SidebarItem[]) 29 + const referenceGroup = computed(() => { 30 + return sidebarGroups.value.find((group) => { 31 + return (group.items ?? []).some((item) => { 32 + return item.link?.includes('integration-references') || item.link?.includes('config-reference') 33 + }) 34 + }) 35 + }) 19 36 20 37 const searchButtonLabel = computed(() => { 21 38 const options = theme.value.search?.options ?? theme.value.algolia ··· 62 79 () => route.path, 63 80 () => { 64 81 if (langDetails.value) langDetails.value.open = false 82 + closeMenu() 65 83 } 66 84 ) 67 85 68 86 onMounted(() => { 69 87 window.addEventListener('keydown', onKeydown) 88 + window.addEventListener('pointerdown', onPointerDown) 70 89 }) 71 90 72 91 onBeforeUnmount(() => { 73 92 window.removeEventListener('keydown', onKeydown) 93 + window.removeEventListener('pointerdown', onPointerDown) 94 + clearMenuCloseTimer() 74 95 }) 75 96 76 97 function ensureStartingSlash(value: string) { ··· 91 112 } 92 113 93 114 function onKeydown(event: KeyboardEvent) { 115 + if (event.key === 'Escape') { 116 + closeMenu() 117 + if (langDetails.value) langDetails.value.open = false 118 + return 119 + } 120 + 94 121 if (event.key.toLowerCase() === 'k' && (event.ctrlKey || event.metaKey)) { 95 122 event.preventDefault() 96 - showSearch.value = true 123 + openSearch() 97 124 return 98 125 } 99 126 100 127 if (event.key === '/' && !isEditing(event)) { 101 128 event.preventDefault() 102 - showSearch.value = true 129 + openSearch() 130 + } 131 + } 132 + 133 + function onPointerDown(event: PointerEvent) { 134 + const target = event.target as HTMLElement | null 135 + if (!target || !menuOpen.value) return 136 + if (target.closest('.morph-nav-menu') || target.closest('.nav-menu-panel')) return 137 + 138 + closeMenu() 139 + } 140 + 141 + function openSearch() { 142 + closeMenu() 143 + showSearch.value = true 144 + } 145 + 146 + function clearMenuCloseTimer() { 147 + if (menuCloseTimer.value === null) return 148 + 149 + window.clearTimeout(menuCloseTimer.value) 150 + menuCloseTimer.value = null 151 + } 152 + 153 + function toggleMenu() { 154 + if (menuOpen.value) { 155 + closeMenu() 156 + return 103 157 } 158 + 159 + openMenu() 160 + } 161 + 162 + function openMenu() { 163 + clearMenuCloseTimer() 164 + menuVisible.value = true 165 + window.requestAnimationFrame(() => { 166 + menuOpen.value = true 167 + }) 168 + } 169 + 170 + function closeMenu() { 171 + clearMenuCloseTimer() 172 + menuOpen.value = false 173 + menuCloseTimer.value = window.setTimeout(() => { 174 + menuVisible.value = false 175 + menuCloseTimer.value = null 176 + }, 260) 104 177 } 105 178 106 179 function normalizeHref(link = '') { ··· 142 215 <path class="logo-spy-bridge" d="M10 17h4"></path> 143 216 </svg> 144 217 </span> 218 + <span class="nav-brand-name">Mister Morph</span> 145 219 </a> 146 220 </div> 147 221 148 - <nav class="morph-nav-primary" aria-label="Primary"> 149 - <a 150 - v-for="item in navItems" 151 - :key="item.text" 152 - class="nav-primary-link" 153 - :class="{ 'is-active': isActive(item) }" 154 - :href="normalizeHref(item.link)" 155 - > 156 - {{ item.text }} 157 - </a> 158 - </nav> 159 - 160 222 <div class="morph-nav-actions"> 161 223 <button 162 - class="nav-primary-trigger morph-search-trigger" 224 + class="nav-primary-trigger nav-action-trigger morph-search-trigger" 163 225 type="button" 164 226 :aria-label="searchButtonLabel" 165 227 :title="searchButtonLabel" 166 - @click="showSearch = true" 228 + @click="openSearch" 167 229 > 168 230 <svg class="morph-search-icon" viewBox="0 0 24 24" role="presentation" aria-hidden="true"> 169 231 <circle cx="11" cy="11" r="6.5"></circle> ··· 172 234 </button> 173 235 174 236 <details ref="langDetails" class="nav-primary-item lang-menu" aria-label="Language"> 175 - <summary class="nav-primary-trigger lang-menu-trigger" title="Language"> 237 + <summary class="nav-primary-trigger nav-action-trigger lang-menu-trigger" title="Language"> 176 238 <span class="lang-menu-kicker">LANG</span> 177 239 <span class="lang-menu-current">{{ currentLocaleCode }}</span> 240 + <span class="nav-primary-caret" aria-hidden="true"> 241 + <svg class="nav-primary-caret-icon" viewBox="0 0 16 16" role="presentation"> 242 + <path d="M8 3.5v9"></path> 243 + <path d="M3.5 8h9"></path> 244 + </svg> 245 + </span> 178 246 </summary> 179 247 180 248 <div class="nav-primary-submenu nav-helper-surface nav-helper-surface-end"> ··· 194 262 </a> 195 263 </div> 196 264 </details> 265 + 266 + <div class="morph-nav-menu" :class="{ 'is-open': menuOpen }"> 267 + <button 268 + class="nav-primary-trigger nav-action-trigger nav-menu-trigger" 269 + type="button" 270 + :aria-expanded="menuOpen" 271 + aria-controls="site-menu-panel" 272 + @click="toggleMenu" 273 + > 274 + <span class="nav-menu-kicker">MENU</span> 275 + <span class="nav-primary-caret" aria-hidden="true"> 276 + <svg class="nav-primary-caret-icon" viewBox="0 0 16 16" role="presentation"> 277 + <path d="M8 3.5v9"></path> 278 + <path d="M3.5 8h9"></path> 279 + </svg> 280 + </span> 281 + </button> 282 + </div> 283 + </div> 284 + 285 + <div 286 + id="site-menu-panel" 287 + class="nav-menu-panel" 288 + :class="{ 'is-open': menuOpen }" 289 + :hidden="!menuVisible" 290 + :aria-hidden="!menuOpen" 291 + > 292 + <div class="nav-menu-panel-inner"> 293 + <nav class="nav-menu-groups" aria-label="Menu"> 294 + <section class="nav-menu-group" aria-labelledby="nav-menu-docs"> 295 + <p id="nav-menu-docs" class="nav-menu-panel-kicker">Navigation</p> 296 + <div class="nav-menu-links"> 297 + <a 298 + v-for="item in navItems" 299 + :key="item.text" 300 + class="nav-menu-link" 301 + :class="{ 'is-active': isActive(item) }" 302 + :href="normalizeHref(item.link)" 303 + @click="closeMenu" 304 + > 305 + <span class="nav-menu-link-label">{{ item.text }}</span> 306 + <span class="nav-menu-link-description">Mister Morph docs</span> 307 + </a> 308 + </div> 309 + </section> 310 + 311 + <section v-if="referenceGroup" class="nav-menu-group"> 312 + <p class="nav-menu-panel-kicker">References</p> 313 + <div class="nav-menu-links"> 314 + <a 315 + v-for="item in referenceGroup.items ?? []" 316 + :key="item.text" 317 + class="nav-menu-link" 318 + :class="{ 'is-active': item.link ? isActive(item) : false }" 319 + :href="normalizeHref(item.link)" 320 + @click="closeMenu" 321 + > 322 + <span class="nav-menu-link-label">{{ item.text }}</span> 323 + </a> 324 + </div> 325 + </section> 326 + 327 + <section class="nav-menu-group" aria-labelledby="nav-menu-resources"> 328 + <p id="nav-menu-resources" class="nav-menu-panel-kicker">Resources</p> 329 + <div class="nav-menu-links"> 330 + <a class="nav-menu-link" :href="brandLink" @click="closeMenu"> 331 + <span class="nav-menu-link-label">Website</span> 332 + <span class="nav-menu-link-description">Mister Morph product site</span> 333 + </a> 334 + <a 335 + class="nav-menu-link" 336 + href="https://github.com/quailyquaily/mistermorph" 337 + rel="noopener noreferrer" 338 + target="_blank" 339 + @click="closeMenu" 340 + > 341 + <span class="nav-menu-link-label">GitHub</span> 342 + <span class="nav-menu-link-description">Source, issues, and releases</span> 343 + </a> 344 + </div> 345 + </section> 346 + </nav> 347 + </div> 197 348 </div> 198 349 </div> 199 350
+1 -21
web/vitepress/docs/.vitepress/theme/styles/base.css
··· 502 502 503 503 504 504 .VPLocalNav { 505 - border-bottom: 1px solid color-mix(in srgb, var(--morph-line) 60%, transparent); 506 - background: color-mix(in srgb, var(--morph-paper-strong) 84%, transparent); 507 - backdrop-filter: blur(8px); 508 - -webkit-backdrop-filter: blur(8px); 509 - } 510 - 511 - .VPLocalNav .container { 512 - width: min(var(--site-max-width), calc(100vw - (var(--site-gutter) * 2))); 513 - margin: 0 auto; 514 - } 515 - 516 - .VPLocalNav .menu, 517 - .VPLocalNav .VPOutlineDropdown { 518 - padding-left: 0; 519 - padding-right: 0; 520 - } 521 - 522 - @media (min-width: 960px) { 523 - .VPLocalNav { 524 - display: none; 525 - } 505 + display: none !important; 526 506 } 527 507 528 508 .VPLocalNav .menu-text,
+274 -35
web/vitepress/docs/.vitepress/theme/styles/header.css
··· 6 6 .morph-site-header { 7 7 position: sticky; 8 8 top: 0; 9 - z-index: 20; 9 + z-index: 110; 10 + height: var(--site-header-height); 11 + min-height: var(--site-header-height); 10 12 padding-top: 0; 11 13 isolation: isolate; 12 14 } ··· 15 17 content: ''; 16 18 position: absolute; 17 19 inset: 0 0 auto; 18 - height: 97%; 20 + height: 100%; 19 21 background: linear-gradient( 20 22 180deg, 21 23 rgba(246, 250, 255, 0.84), ··· 31 33 .morph-nav-shell { 32 34 --nav-shell-pad-top: var(--morph-nav-shell-pad-top); 33 35 --nav-shell-pad-bottom: var(--morph-nav-shell-pad-bottom); 34 - --nav-copy-size: 0.8125rem; 36 + --nav-copy-size: var(--morph-nav-action-font-size); 35 37 position: relative; 38 + height: 100%; 36 39 display: grid; 37 40 grid-template-columns: auto minmax(0, 1fr) auto; 38 41 align-items: center; ··· 82 85 z-index: 1; 83 86 } 84 87 88 + .nav-brand-name { 89 + display: inline-flex; 90 + align-items: center; 91 + color: var(--text-0); 92 + font-family: var(--morph-font-ui); 93 + font-size: 0.85rem; 94 + font-weight: 500; 95 + line-height: 1; 96 + letter-spacing: 0; 97 + white-space: nowrap; 98 + } 99 + 85 100 .brand-mark { 86 101 display: inline-grid; 87 102 place-items: center; ··· 118 133 stroke-width: 1.15; 119 134 stroke-linecap: round; 120 135 stroke-linejoin: round; 121 - } 122 - 123 - .morph-nav-primary { 124 - grid-column: 2; 125 - justify-self: start; 126 - display: inline-flex; 127 - align-items: center; 128 - gap: clamp(0.9rem, 1.7vw, 1.55rem); 129 - min-width: 0; 130 136 } 131 137 132 138 .nav-primary-link, ··· 135 141 .nav-helper-item-kicker, 136 142 .lang-menu-current, 137 143 .lang-menu-kicker, 138 - .nav-menu-kicker { 144 + .nav-menu-kicker, 145 + .nav-menu-panel-kicker { 139 146 font-family: var(--morph-font-mono); 140 147 } 141 148 ··· 151 158 color: var(--text-0); 152 159 font-size: var(--nav-copy-size); 153 160 font-weight: 400; 154 - letter-spacing: 0.14em; 161 + letter-spacing: 0.08em; 155 162 line-height: 1; 156 163 text-decoration: none; 157 164 text-transform: uppercase; ··· 175 182 position: relative; 176 183 display: flex; 177 184 margin: 0; 178 - height: 22px; 179 - padding: 0 8px; 185 + height: 100%; 186 + padding: 0; 180 187 } 181 188 182 189 .nav-primary-item > summary { ··· 191 198 grid-column: 3; 192 199 justify-self: end; 193 200 display: inline-flex; 194 - align-items: center; 201 + align-items: stretch; 195 202 gap: 0.48rem; 203 + height: var(--site-header-height); 196 204 flex-shrink: 0; 205 + } 206 + 207 + .nav-action-trigger { 208 + height: 100%; 209 + min-height: 100%; 210 + padding: 0 0.2rem; 211 + font-size: var(--morph-nav-action-font-size); 197 212 } 198 213 199 214 .morph-search-trigger, ··· 203 218 204 219 .morph-search-trigger { 205 220 justify-content: center; 206 - width: 1.92rem; 207 - height: 1.92rem; 221 + width: 2.3rem; 222 + height: 100%; 208 223 padding: 0; 209 224 border: 1px solid transparent; 210 225 border-radius: 0; ··· 229 244 } 230 245 231 246 .morph-search-icon { 232 - width: 0.92rem; 233 - height: 0.92rem; 247 + width: 0.95rem; 248 + height: 0.95rem; 234 249 fill: none; 235 250 stroke: currentColor; 236 251 stroke-width: 1.55; ··· 252 267 253 268 .lang-menu-kicker { 254 269 font-size: 0.6rem; 255 - letter-spacing: 0.14em; 270 + letter-spacing: 0.08em; 256 271 color: var(--text-2); 257 272 } 258 273 259 274 .lang-menu-current { 260 275 font-size: var(--nav-copy-size); 261 276 font-weight: 400; 262 - letter-spacing: 0.12em; 277 + letter-spacing: 0.08em; 263 278 color: var(--text-1); 264 279 } 265 280 281 + .nav-primary-caret { 282 + display: inline-flex; 283 + align-items: center; 284 + justify-content: center; 285 + width: 0.85rem; 286 + height: 0.85rem; 287 + flex: 0 0 0.85rem; 288 + color: currentColor; 289 + transform-origin: center; 290 + transition: transform 220ms ease; 291 + } 292 + 293 + .nav-primary-caret-icon { 294 + display: block; 295 + width: 100%; 296 + height: 100%; 297 + } 298 + 299 + .nav-primary-caret-icon path { 300 + fill: none; 301 + stroke: currentColor; 302 + stroke-width: 1.6; 303 + stroke-linecap: round; 304 + stroke-linejoin: round; 305 + } 306 + 307 + .lang-menu[open] .nav-primary-caret, 308 + .morph-nav-menu.is-open .nav-primary-caret { 309 + transform: rotate(45deg); 310 + } 311 + 266 312 .nav-helper-surface { 267 313 position: absolute; 268 - top: calc(100% + var(--nav-shell-pad-bottom) + 4px); 314 + top: 100%; 269 315 display: grid; 270 316 gap: 0; 271 - padding: calc(0.18rem + var(--nav-shell-pad-bottom)) 0; 317 + padding: 0.28rem 0; 272 318 border: 0; 273 319 background-color: color-mix(in srgb, var(--bg-0) 56%, transparent); 274 320 backdrop-filter: blur(7px); ··· 280 326 .nav-helper-surface::before { 281 327 content: ''; 282 328 position: absolute; 283 - top: calc(-1 * var(--nav-shell-pad-bottom)); 329 + top: -0.5rem; 284 330 width: 1px; 285 - height: var(--nav-shell-pad-bottom); 331 + height: 0.5rem; 286 332 background: color-mix(in srgb, var(--accent-0) 56%, transparent); 287 333 } 288 334 ··· 303 349 } 304 350 305 351 .nav-helper-surface-end { 306 - right: 10px; 352 + right: 0; 307 353 min-width: 0; 308 354 justify-items: end; 309 355 z-index: 50; ··· 333 379 background: transparent; 334 380 font-size: var(--nav-copy-size); 335 381 font-weight: 400; 336 - letter-spacing: 0.14em; 382 + letter-spacing: 0.08em; 337 383 line-height: 1; 338 384 text-decoration: none; 339 385 text-transform: uppercase; ··· 392 438 white-space: nowrap; 393 439 } 394 440 441 + .morph-nav-menu { 442 + display: flex; 443 + } 444 + 445 + .nav-menu-trigger { 446 + gap: 0.32rem; 447 + color: var(--text-1); 448 + } 449 + 450 + .nav-menu-trigger:hover, 451 + .nav-menu-trigger:focus-visible, 452 + .morph-nav-menu.is-open .nav-menu-trigger { 453 + color: var(--text-0); 454 + outline: none; 455 + } 456 + 457 + .nav-menu-kicker { 458 + font-size: var(--nav-copy-size); 459 + font-weight: 400; 460 + line-height: 1; 461 + letter-spacing: 0.08em; 462 + } 463 + 464 + .nav-menu-panel { 465 + position: fixed; 466 + top: var(--site-header-height, 68px); 467 + right: 0; 468 + left: 0; 469 + z-index: 100; 470 + height: calc(100svh - var(--site-header-height, 68px)); 471 + background: color-mix(in srgb, var(--morph-panel-strong) 56%, transparent); 472 + backdrop-filter: blur(7px); 473 + -webkit-backdrop-filter: blur(7px); 474 + opacity: 0; 475 + overflow: hidden; 476 + pointer-events: none; 477 + transform: translateY(-0.6rem); 478 + transition: 479 + opacity 260ms ease, 480 + transform 260ms ease; 481 + } 482 + 483 + .nav-menu-panel[hidden] { 484 + display: none; 485 + } 486 + 487 + .nav-menu-panel.is-open { 488 + opacity: 1; 489 + pointer-events: auto; 490 + transform: translateY(0); 491 + } 492 + 493 + .nav-menu-panel-inner { 494 + width: min(var(--site-max-width), calc(100vw - (var(--site-gutter) * 2))); 495 + height: 100%; 496 + margin: 0 auto; 497 + padding: clamp(1.1rem, 2.4vw, 2rem) 0 clamp(1.4rem, 3vw, 2.6rem); 498 + overflow-y: auto; 499 + overscroll-behavior: contain; 500 + } 501 + 502 + .nav-menu-groups { 503 + display: grid; 504 + grid-template-columns: repeat(3, minmax(0, 1fr)); 505 + gap: clamp(0.8rem, 1.8vw, 1.4rem); 506 + align-items: start; 507 + } 508 + 509 + .nav-menu-group { 510 + display: grid; 511 + gap: 0.7rem; 512 + min-width: 0; 513 + } 514 + 515 + .nav-menu-panel-kicker { 516 + margin: 0; 517 + color: var(--accent-0); 518 + font-size: 0.68rem; 519 + font-weight: 400; 520 + line-height: 1; 521 + letter-spacing: 0.08em; 522 + text-transform: uppercase; 523 + } 524 + 525 + .nav-menu-links { 526 + display: grid; 527 + gap: 0.42rem; 528 + } 529 + 530 + .nav-menu-link { 531 + display: grid; 532 + gap: 0.24rem; 533 + min-height: 3.2rem; 534 + padding: 0.68rem 0.74rem; 535 + border: 1px solid color-mix(in srgb, var(--morph-line) 46%, transparent); 536 + background: color-mix(in srgb, var(--bg-0) 36%, transparent); 537 + color: var(--text-0); 538 + text-decoration: none; 539 + transition: 540 + border-color 220ms ease, 541 + background-color 220ms ease, 542 + color 220ms ease, 543 + transform 220ms ease; 544 + } 545 + 546 + .nav-menu-link:hover, 547 + .nav-menu-link:focus-visible, 548 + .nav-menu-link.is-active { 549 + border-color: color-mix(in srgb, var(--accent-0) 42%, var(--morph-line) 58%); 550 + background: color-mix(in srgb, var(--bg-0) 72%, var(--accent-0) 8%); 551 + color: var(--accent-0); 552 + outline: none; 553 + } 554 + 555 + .nav-menu-link:hover, 556 + .nav-menu-link:focus-visible { 557 + transform: translateX(0.12rem); 558 + } 559 + 560 + .nav-menu-link-label { 561 + color: inherit; 562 + font-family: var(--morph-font-ui); 563 + font-size: 0.96rem; 564 + font-weight: 700; 565 + line-height: 1.18; 566 + letter-spacing: 0; 567 + } 568 + 569 + .nav-menu-link-description { 570 + color: var(--text-2); 571 + font-size: 0.76rem; 572 + line-height: 1.36; 573 + } 574 + 575 + .nav-menu-language-links { 576 + grid-template-columns: repeat(3, minmax(0, 1fr)); 577 + } 578 + 579 + .nav-menu-language-link { 580 + min-height: 2.4rem; 581 + justify-items: center; 582 + padding: 0.62rem 0.5rem; 583 + } 584 + 585 + .nav-menu-language-link .nav-menu-link-label { 586 + font-family: var(--morph-font-mono); 587 + font-size: 0.78rem; 588 + font-weight: 400; 589 + } 590 + 395 591 @media (min-width: 960px) { 396 592 .morph-nav-shell { 397 593 grid-template-columns: var(--rail-section-sidebar) minmax(0, 1fr) auto; 398 594 column-gap: var(--rail-section-gap); 595 + } 596 + 597 + .morph-nav-brand-shell { 598 + grid-column: 1; 599 + } 600 + 601 + .morph-nav-actions { 602 + grid-column: 3; 399 603 } 400 604 } 401 605 402 606 @media (max-width: 959px) { 403 - .morph-nav-primary { 404 - display: none; 607 + .nav-menu-groups { 608 + grid-template-columns: repeat(2, minmax(0, 1fr)); 405 609 } 406 610 } 407 611 408 612 @media (max-width: 639px) { 613 + .morph-nav-shell { 614 + --nav-copy-size: 0.72rem; 615 + } 616 + 409 617 .morph-nav-actions { 410 - gap: 0.4rem; 618 + gap: 0.24rem; 619 + } 620 + 621 + .nav-brand-name { 622 + display: none; 623 + } 624 + 625 + .morph-search-trigger { 626 + width: 2rem; 627 + } 628 + 629 + .nav-action-trigger { 630 + font-size: 0.72rem; 411 631 } 412 632 413 - .nav-primary-trigger, 414 - .nav-primary-link { 415 - font-size: 0.62rem; 633 + .lang-menu-kicker { 634 + font-size: 0.56rem; 635 + } 636 + 637 + .nav-primary-caret { 638 + width: 0.72rem; 639 + height: 0.72rem; 640 + flex-basis: 0.72rem; 641 + } 642 + 643 + .nav-helper-surface { 644 + right: 0; 645 + } 646 + 647 + .nav-menu-panel-inner { 648 + width: min(var(--site-max-width), calc(100vw - (var(--site-gutter) * 2))); 649 + padding-top: 1rem; 650 + } 651 + 652 + .nav-menu-groups { 653 + grid-template-columns: 1fr; 654 + gap: 1rem; 416 655 } 417 656 }
+5 -5
web/vitepress/docs/.vitepress/theme/styles/tokens.css
··· 72 72 --install-cta-font-size: 0.72rem; 73 73 --install-cta-font-weight: 600; 74 74 --install-cta-letter-spacing: 0.08em; 75 + --site-header-height: 68px; 75 76 --morph-nav-brand-size: 1.92rem; 76 - --morph-nav-shell-pad-top: 0.48rem; 77 - --morph-nav-shell-pad-bottom: 0.48rem; 77 + --morph-nav-shell-pad-top: 0; 78 + --morph-nav-shell-pad-bottom: 0; 79 + --morph-nav-action-font-size: 0.85rem; 78 80 79 81 --vp-font-family-base: var(--morph-font-ui); 80 82 --vp-font-family-mono: var(--morph-font-mono); 81 83 --vp-layout-max-width: var(--site-max-width); 82 84 --vp-sidebar-width: var(--rail-section-sidebar); 83 - --vp-nav-height: calc( 84 - var(--morph-nav-brand-size) + var(--morph-nav-shell-pad-top) + var(--morph-nav-shell-pad-bottom) 85 - ); 85 + --vp-nav-height: var(--site-header-height); 86 86 87 87 --vp-c-brand-1: var(--morph-accent-strong); 88 88 --vp-c-brand-2: var(--morph-accent);