Initial commit

This commit is contained in:
2026-02-02 22:47:52 +03:00
committed by GitHub
commit f53016aeda
239 changed files with 84360 additions and 0 deletions

130
src/utils/navigation.ts Normal file
View File

@@ -0,0 +1,130 @@
/**
* 导航工具函数
* 提供统一的页面导航功能,支持 Swup 无刷新跳转
*/
import { navbarConfig } from "@/config";
import { LinkPresets } from "@constants/link-presets";
import { type NavbarLink } from "@/types/config";
import { pathsEqual } from "./url";
/**
* 根据当前路径查找其所属的父级页面(如 [...menu].astro 生成的中转页)
* @param currentPath 当前页面的路径
* @returns 如果找到父级页面,则返回该页面的 NavbarLink 对象,否则返回 undefined
*/
export function getParentLink(currentPath: string): NavbarLink | undefined {
// 遍历导航栏中的所有链接
for (const link of navbarConfig.links) {
// 检查是否有子链接且不是 LinkPreset 枚举
if (typeof link !== "number" && link.children && link.children.length > 0) {
// 检查子链接中是否包含当前路径
for (const child of link.children) {
let childLink: NavbarLink;
if (typeof child === "number") {
childLink = LinkPresets[child];
} else {
childLink = child;
}
// 比较路径是否匹配
if (pathsEqual(childLink.url, currentPath)) {
return link;
}
}
}
}
return undefined;
}
/**
* 降级导航函数
* 当 Swup 不可用时使用普通的页面跳转
*/
function fallbackNavigation(
url: string,
options?: {
replace?: boolean;
force?: boolean;
},
): void {
if (typeof window === "undefined") return;
if (options?.replace) {
window.location.replace(url);
} else {
window.location.href = url;
}
}
/**
* 导航到指定页面
* @param url 目标页面URL
* @param options 导航选项
*/
export function navigateToPage(
url: string,
options?: {
replace?: boolean;
force?: boolean;
},
): void {
// 检查 URL 是否有效
if (!url || typeof url !== "string") {
console.warn("navigateToPage: Invalid URL provided");
return;
}
// 如果是外部链接,直接跳转
if (
url.startsWith("http://") ||
url.startsWith("https://") ||
url.startsWith("//")
) {
window.open(url, "_blank");
return;
}
// 如果是锚点链接,滚动到对应位置
if (url.startsWith("#")) {
if (typeof document !== "undefined") {
const element = document.getElementById(url.slice(1));
if (element) {
element.scrollIntoView({ behavior: "smooth" });
}
}
return;
}
// 检查 Swup 是否可用
if (typeof window !== "undefined" && (window as any).swup) {
try {
// 使用 Swup 进行无刷新跳转
if (options?.replace) {
(window as any).swup.navigate(url, { history: false });
} else {
(window as any).swup.navigate(url);
}
} catch (error) {
console.error("Swup navigation failed:", error);
// 降级到普通跳转
fallbackNavigation(url, options);
}
} else {
// Swup 不可用时的降级处理
fallbackNavigation(url, options);
}
}
/**
* 获取当前页面路径
*/
export function getCurrentPath(): string {
return typeof window !== "undefined" ? window.location.pathname : "";
}
/**
* 检查是否为首页
*/
export function isHomePage(): boolean {
const path = getCurrentPath();
return path === "/" || path === "";
}