diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 119fd21..3fff74f 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,4 +1,5 @@
import type { Metadata, Viewport } from "next";
+import localFont from "next/font/local";
import "./globals.css";
import { Suspense } from "react";
import { GoogleAnalyticsWrapper } from "@/components/analytics/GoogleAnalyticsWrapper";
@@ -18,6 +19,26 @@ import { SiteConfigProvider, type SiteConfig, type NavigationItem, type MegaDrop
import { COMPANY_INFO, BRAND_NARRATIVE, type BrandPillar } from "@/lib/constants/company";
import { NAVIGATION_V2, MEGA_DROPDOWN_DATA } from "@/lib/constants/navigation";
+/**
+ * 拉丁字形使用 Geist(本地 woff2,无网络请求);
+ * 中文由 globals.css 的 --font-sans 回退到 PingFang SC / 微软雅黑。
+ * 这样英文数字有设计字体,中文又不需下载数 MB 的 CJK 字重。
+ * 两者总重 140KB,display: swap 不阻塞首屏。
+ */
+const geistSans = localFont({
+ src: "./fonts/geist-sans.woff2",
+ variable: "--font-geist-sans",
+ display: "swap",
+ preload: true,
+});
+
+const geistMono = localFont({
+ src: "./fonts/geist-mono.woff2",
+ variable: "--font-geist-mono",
+ display: "swap",
+ preload: false,
+});
+
export const metadata: Metadata = {
metadataBase: new URL("https://www.novalon.cn"),
title: {
@@ -143,7 +164,11 @@ export default async function RootLayout({
};
return (
-
+
diff --git a/src/app/not-found-content.tsx b/src/app/not-found-content.tsx
index 3b532ff..18b682c 100644
--- a/src/app/not-found-content.tsx
+++ b/src/app/not-found-content.tsx
@@ -47,7 +47,7 @@ export function NotFoundContent() {
href="/products"
className="flex flex-col items-center p-4 bg-[var(--color-bg-primary)] rounded-lg hover:shadow-md transition-shadow group"
>
-
+
产品
@@ -57,7 +57,7 @@ export function NotFoundContent() {
href="/solutions"
className="flex flex-col items-center p-4 bg-[var(--color-bg-primary)] rounded-lg hover:shadow-md transition-shadow group"
>
-
+
解决方案
@@ -67,7 +67,7 @@ export function NotFoundContent() {
href="/about"
className="flex flex-col items-center p-4 bg-[var(--color-bg-primary)] rounded-lg hover:shadow-md transition-shadow group"
>
-
+
关于我们
@@ -77,7 +77,7 @@ export function NotFoundContent() {
href="/contact"
className="flex flex-col items-center p-4 bg-[var(--color-bg-primary)] rounded-lg hover:shadow-md transition-shadow group"
>
-
+
联系我们
diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx
index 7873bce..09b1d89 100644
--- a/src/app/privacy/page.tsx
+++ b/src/app/privacy/page.tsx
@@ -136,16 +136,16 @@ function PrivacyContent() {
我们使用 Cookie 和类似技术来提供、保护和改进我们的服务。Cookie 是存储在您设备上的小型文本文件,帮助我们识别您的设备、记住您的偏好设置。
-
+
- | Cookie 类型 |
- 用途 |
- 持续时间 |
- 是否必需 |
+ Cookie 类型 |
+ 用途 |
+ 持续时间 |
+ 是否必需 |
-
+
| 必要 Cookie |
网站基本功能运行 |
@@ -248,7 +248,7 @@ export default async function PrivacyPolicyPage() {
return (
-
+
{heroTitle}
diff --git a/src/app/terms/page.tsx b/src/app/terms/page.tsx
index 684a105..c6298e6 100644
--- a/src/app/terms/page.tsx
+++ b/src/app/terms/page.tsx
@@ -193,7 +193,7 @@ export default async function TermsOfServicePage() {
return (
-
+
{heroTitle}
diff --git a/src/components/admin/admin-layout.tsx b/src/components/admin/admin-layout.tsx
index de7ae4f..399b7d4 100644
--- a/src/components/admin/admin-layout.tsx
+++ b/src/components/admin/admin-layout.tsx
@@ -122,7 +122,7 @@ export function AdminLayout({ children }: { children: React.ReactNode }) {
return next;
});
}
- }, [pathname]);
+ }, [pathname]); // eslint-disable-line react-hooks/exhaustive-deps -- getExpandedMenusForPath 为组件内函数(引用随渲染变化),effect 已用 prevPathname 变更保护,刻意不列入依赖
const toggleMenu = (label: string) => {
setExpandedMenus((prev) => {
diff --git a/src/components/analytics/CookieConsent.tsx b/src/components/analytics/CookieConsent.tsx
index 2c51f59..9265d29 100644
--- a/src/components/analytics/CookieConsent.tsx
+++ b/src/components/analytics/CookieConsent.tsx
@@ -160,14 +160,14 @@ export function CookieConsent() {
@@ -196,7 +196,7 @@ export function CookieConsent() {
-
+
-
+
-
+
setShowSettings(false)}
disabled={isAnimating}
- className="px-4 py-2 text-sm font-medium text-[var(--color-text-secondary)] bg-[var(--color-bg-primary)] border border-[var(--color-border-secondary)] rounded-lg hover:bg-[var(--color-brand-lighter)] transition-colors disabled:opacity-50"
+ className="px-4 py-2 text-sm font-medium text-[var(--color-text-secondary)] bg-[var(--color-bg-primary)] border border-[var(--color-border-secondary)] rounded-lg hover:bg-[var(--color-brand-bg)] transition-colors disabled:opacity-50"
>
取消
@@ -288,7 +288,7 @@ export function CookieSettingsButton() {
const event = new CustomEvent('open-cookie-settings');
window.dispatchEvent(event);
}}
- className="fixed bottom-4 right-4 z-[9997] px-3 py-2 text-xs font-medium text-[var(--color-text-muted)] bg-[var(--color-bg-primary)] border border-[var(--color-border-secondary)] rounded-lg shadow-sm hover:bg-[var(--color-brand-lighter)] transition-colors"
+ className="fixed bottom-4 right-4 z-[9997] px-3 py-2 text-xs font-medium text-[var(--color-text-muted)] bg-[var(--color-bg-primary)] border border-[var(--color-border-secondary)] rounded-lg shadow-sm hover:bg-[var(--color-brand-bg)] transition-colors"
aria-label="Cookie 设置"
>
Cookie 设置
diff --git a/src/components/layout/mobile-menu.tsx b/src/components/layout/mobile-menu.tsx
index 669b371..5345a2e 100644
--- a/src/components/layout/mobile-menu.tsx
+++ b/src/components/layout/mobile-menu.tsx
@@ -46,7 +46,7 @@ export function MobileMenu({ className }: MobileMenuProps) {