- 产品概述
-
+
+ 产品概述
+
{product.overview}
-
-
-
+
+
+
规划功能
{product.features.map((feature, index) => (
-
- {feature}
+
+ {feature}
))}
-
-
-
+
+
+
产品优势
{product.benefits.map((benefit, index) => (
- {benefit}
+ {benefit}
))}
-
-
-
+
+
+
预期实施流程
{product.process.map((step, index) => (
-
+
{index + 1}
-
{step}
+
{step}
))}
-
- 技术规格
+
+ 技术规格
{product.specs.map((spec, index) => (
))}
-
+
-
+
-
定价待公布
-
+
定价待公布
+
本产品正在研发中,正式定价将在产品发布时公布。如果您对产品方向感兴趣,欢迎预约早期体验,您的反馈将帮助我们打造更贴合需求的产品。
-
-
+
关注进展
-
+
预约体验
diff --git a/src/app/(marketing)/products/page.tsx b/src/app/(marketing)/products/page.tsx
index 43ee3ae..7e97cc7 100644
--- a/src/app/(marketing)/products/page.tsx
+++ b/src/app/(marketing)/products/page.tsx
@@ -2,29 +2,32 @@
import { PRODUCTS } from '@/lib/constants';
import { ProductCard } from '@/components/ui/product-card';
-import { StaticLink } from '@/components/ui/static-link';
-import { Button } from '@/components/ui/button';
-import { ArrowRight } from 'lucide-react';
import { motion } from 'framer-motion';
+import { useReducedMotion } from '@/hooks/use-reduced-motion';
import { PageNav } from '@/components/layout/page-nav';
+import { CTASection } from '@/components/sections/cta-section';
+import { BreadcrumbSchema } from '@/components/seo/structured-data';
export default function ProductsPage() {
+ const shouldReduceMotion = useReducedMotion();
+ const fadeUp = shouldReduceMotion ? {} : { initial: { opacity: 0, y: 20 } };
return (
-
+
+
- Products
-
+
Products
+
产品
-
+
我们正在打造的企业级产品,致力于助力企业高效运营,实现数字化转型
@@ -33,7 +36,7 @@ export default function ProductsPage() {
-
+
{PRODUCTS.map((product, index) => (
-
-
-
- 期待与您共同打磨产品
-
-
- 我们的产品正在研发中,如果您对产品方向有建议或希望参与早期体验,欢迎联系我们
-
-
-
- 预约体验
-
-
-
-
-
+
);
}
diff --git a/src/app/(marketing)/services/[id]/client.tsx b/src/app/(marketing)/services/[id]/client.tsx
index 3b175a2..e58caba 100644
--- a/src/app/(marketing)/services/[id]/client.tsx
+++ b/src/app/(marketing)/services/[id]/client.tsx
@@ -72,16 +72,16 @@ export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
const serviceOutcomes = outcomes[service.id] ?? [];
return (
-
+
-
Services
-
+
Services
+
{service.title}
-
+
{service.description}
@@ -92,19 +92,19 @@ export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
-
-
+
+
-
您可能面临的挑战
+
您可能面临的挑战
{serviceChallenges.map((challenge, index) => (
-
{challenge.title}
-
{challenge.description}
+
{challenge.title}
+
{challenge.description}
))}
@@ -112,19 +112,19 @@ export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
-
-
+
+
-
我们如何帮助您
+
我们如何帮助您
-
+
{service.overview}
{service.features.map((feature, index) => (
-
- {feature}
+
+ {feature}
))}
@@ -132,18 +132,18 @@ export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
-
{service.process.map((step, index) => (
-
+
{index + 1}
-
{step}
+
{step}
))}
@@ -151,37 +151,37 @@ export function ServiceDetailClient({ service }: ServiceDetailClientProps) {
-
-
+
+
-
您将获得的改变
+
您将获得的改变
{serviceOutcomes.map((outcome, index) => (
-
+
{outcome.value}
-
{outcome.label}
+
{outcome.label}
))}
-
-
+
+
{service.benefits.join(';')}
-
+
查看其他服务
-
+
开始您的转型之旅
diff --git a/src/app/(marketing)/services/page.tsx b/src/app/(marketing)/services/page.tsx
index a38a096..dc97db4 100644
--- a/src/app/(marketing)/services/page.tsx
+++ b/src/app/(marketing)/services/page.tsx
@@ -5,25 +5,28 @@ import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { ArrowRight, ArrowUpRight } from 'lucide-react';
import { motion } from 'framer-motion';
+import { useReducedMotion } from '@/hooks/use-reduced-motion';
import { PageNav } from '@/components/layout/page-nav';
export default function ServicesPage() {
+ const shouldReduceMotion = useReducedMotion();
+ const fadeUp = shouldReduceMotion ? {} : { initial: { opacity: 0, y: 20 } };
return (
-
+
- Services
-
+
Services
+
服务
-
+
专业技术团队,为您提供全方位的数字化解决方案
@@ -36,32 +39,32 @@ export default function ServicesPage() {
{SERVICES.map((service, index) => (
-
+
{String(index + 1).padStart(2, '0')}
-
+
-
+
{service.title}
-
+
{service.description}
{service.features.slice(0, 3).map((feature, idx) => (
{feature.split(':')[0]}
@@ -74,17 +77,17 @@ export default function ServicesPage() {
-
+
-
+
准备开始您的数字化转型之旅?
-
+
让我们与您同行,共创美好未来
diff --git a/src/app/(marketing)/solutions/[id]/client.tsx b/src/app/(marketing)/solutions/[id]/client.tsx
index 96a9527..444abd4 100644
--- a/src/app/(marketing)/solutions/[id]/client.tsx
+++ b/src/app/(marketing)/solutions/[id]/client.tsx
@@ -1,6 +1,7 @@
'use client';
import { motion } from 'framer-motion';
+import { useReducedMotion } from '@/hooks/use-reduced-motion';
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { PageNav } from '@/components/layout/page-nav';
@@ -14,25 +15,27 @@ interface SolutionDetailClientProps {
}
export function SolutionDetailClient({ solution, relatedProducts }: SolutionDetailClientProps) {
+ const shouldReduceMotion = useReducedMotion();
+ const fadeUp = shouldReduceMotion ? {} : { initial: { opacity: 0, y: 20 } };
return (
-
+
-
+
{solution.industry}
-
+
{solution.title}
-
{solution.subtitle}
-
+
{solution.subtitle}
+
{solution.description}
@@ -42,44 +45,44 @@ export function SolutionDetailClient({ solution, relatedProducts }: SolutionDeta
-
-
+
+
行业痛点
{solution.challenges.map((challenge, index) => (
- {challenge}
+ {challenge}
))}
-
-
+
+
解决方案
{solution.solutions.map((sol, index) => (
-
+
{index + 1}
-
{sol}
+
{sol}
))}
@@ -87,13 +90,13 @@ export function SolutionDetailClient({ solution, relatedProducts }: SolutionDeta
{relatedProducts.length > 0 && (
-
-
+
+
相关产品
@@ -101,26 +104,26 @@ export function SolutionDetailClient({ solution, relatedProducts }: SolutionDeta
-
+
{product.title}
{product.status && (
{product.status}
)}
-
+
{product.description}
@@ -129,11 +132,11 @@ export function SolutionDetailClient({ solution, relatedProducts }: SolutionDeta
)}
-
+
联系我们
-
+
立即咨询
diff --git a/src/app/(marketing)/solutions/page.tsx b/src/app/(marketing)/solutions/page.tsx
index 66340af..5d2c442 100644
--- a/src/app/(marketing)/solutions/page.tsx
+++ b/src/app/(marketing)/solutions/page.tsx
@@ -1,11 +1,13 @@
'use client';
import { motion } from 'framer-motion';
+import { useReducedMotion } from '@/hooks/use-reduced-motion';
import { StaticLink } from '@/components/ui/static-link';
-import { Button } from '@/components/ui/button';
import { ArrowRight, Lightbulb, Cpu, Users, CheckCircle2 } from 'lucide-react';
import { MethodologySection } from '@/components/sections/methodology-section';
+import { CTASection } from '@/components/sections/cta-section';
import { PageNav } from '@/components/layout/page-nav';
+import { BreadcrumbSchema } from '@/components/seo/structured-data';
const modules = [
{
@@ -19,8 +21,10 @@ const modules = [
],
values: ['行业趋势洞察报告', '数字化转型成熟度评估', '个性化实施路径规划'],
cta: '预约一次免费诊断',
- ctaVariant: 'default' as const,
ctaHref: '/contact',
+ accentColor: 'var(--color-brand-primary)',
+ accentBg: 'var(--color-brand-primary-bg)',
+ accentBorder: 'border-l-[var(--color-brand-primary)]',
},
{
icon: Cpu,
@@ -33,8 +37,10 @@ const modules = [
],
values: ['业务场景深度调研', '技术方案定制开发', '敏捷交付快速迭代'],
cta: '了解技术方案',
- ctaVariant: 'outline' as const,
ctaHref: '/products',
+ accentColor: 'var(--color-accent-blue)',
+ accentBg: 'rgba(37, 99, 235, 0.08)',
+ accentBorder: 'border-l-[var(--color-accent-blue)]',
},
{
icon: Users,
@@ -47,28 +53,33 @@ const modules = [
],
values: ['专属客户成功经理', '季度业务复盘会', '7×24小时响应通道'],
cta: '了解陪跑服务',
- ctaVariant: 'default' as const,
ctaHref: '/services',
+ accentColor: 'var(--color-success)',
+ accentBg: 'rgba(22, 163, 74, 0.08)',
+ accentBorder: 'border-l-[var(--color-success)]',
},
];
export default function SolutionsPage() {
+ const shouldReduceMotion = useReducedMotion();
+ const fadeUp = shouldReduceMotion ? {} : { initial: { opacity: 0, y: 20 } };
return (
-
+
+
- Solutions
-
+
Solutions
+
三种角色,一种身份——您的成长伙伴
-
+
我们以伙伴的身份,陪您走过数字化转型的每一步
@@ -84,57 +95,65 @@ export default function SolutionsPage() {
-
-
+
+
-
+
模块{['一', '二', '三'][index]}:{module.title}
-
{module.subtitle}
+
{module.subtitle}
{module.paragraphs.map((p, i) => (
-
{p}
+
{p}
))}
-
-
+
+
核心价值点
{module.values.map((value, i) => (
-
-
{
+ e.currentTarget.style.backgroundColor = module.accentColor;
+ e.currentTarget.style.color = '#fff';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = 'transparent';
+ e.currentTarget.style.color = module.accentColor;
+ }}
>
-
- {module.cta}
-
-
-
+ {module.cta}
+
+
);
@@ -145,27 +164,14 @@ export default function SolutionsPage() {
-
-
-
- 准备开始您的数字化转型之旅?
-
-
- 无论您处于哪个阶段,我们都能为您提供合适的解决方案
-
-
-
- 联系我们
-
-
-
- 立即咨询
-
-
-
-
-
-
+
);
}
diff --git a/src/app/(marketing)/team/client.tsx b/src/app/(marketing)/team/client.tsx
index cdf7045..d74f0d8 100644
--- a/src/app/(marketing)/team/client.tsx
+++ b/src/app/(marketing)/team/client.tsx
@@ -1,6 +1,7 @@
'use client';
import { motion } from 'framer-motion';
+import { useReducedMotion } from '@/hooks/use-reduced-motion';
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { Shield, Building2, Users, Code, Target, ArrowRight } from 'lucide-react';
@@ -35,22 +36,24 @@ const TEAM_PILLARS = [
];
export function TeamClient() {
+ const shouldReduceMotion = useReducedMotion();
+ const fadeUp = shouldReduceMotion ? {} : { initial: { opacity: 0, y: 20 } };
return (
-
+
- Team
-
+
Team
+
核心团队
-
+
核心团队从事技术咨询、企业数字化等行业 12 年+,开发团队成员来自于多个大型传统 IT 企业
@@ -61,21 +64,21 @@ export function TeamClient() {
- 关于我们的团队
+ 关于我们的团队
-
- 我们的核心团队长期从事技术咨询、企业数字化等行业,拥有 12 年以上的深厚积累。
+
+ 我们的核心团队长期从事技术咨询、企业数字化等行业,拥有 12 年以上的深厚积累。
-
- 开发团队成员来自于多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。
+
+ 开发团队成员来自于多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。
-
+
我们相信,优秀的技术咨询不仅需要过硬的技术能力,更需要深入理解客户的业务场景和真实需求。
每一位成员都是既懂技术又懂业务的复合型人才。
@@ -83,31 +86,31 @@ export function TeamClient() {
- 团队优势
+ 团队优势
{TEAM_PILLARS.map((item, idx) => {
const Icon = item.icon;
return (
= 3 ? 'md:col-span-1 lg:col-start-1' : ''}
>
-
-
-
+
+
+
-
{item.title}
-
{item.description}
+
{item.title}
+
{item.description}
@@ -117,14 +120,14 @@ export function TeamClient() {
- 想与我们的团队交流?
-
+ 想与我们的团队交流?
+
联系我们
diff --git a/src/app/(marketing)/template.tsx b/src/app/(marketing)/template.tsx
new file mode 100644
index 0000000..d260486
--- /dev/null
+++ b/src/app/(marketing)/template.tsx
@@ -0,0 +1,50 @@
+'use client';
+
+import { motion, type Variants } from 'framer-motion';
+import { useReducedMotion } from '@/hooks/use-reduced-motion';
+
+const pageVariants: Variants = {
+ initial: {
+ opacity: 0,
+ y: 8,
+ },
+ enter: {
+ opacity: 1,
+ y: 0,
+ transition: {
+ duration: 0.35,
+ ease: [0.16, 1, 0.3, 1] as [number, number, number, number],
+ },
+ },
+ exit: {
+ opacity: 0,
+ y: -4,
+ transition: {
+ duration: 0.2,
+ ease: [0.16, 1, 0.3, 1] as [number, number, number, number],
+ },
+ },
+};
+
+export default function MarketingTemplate({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ const shouldReduceMotion = useReducedMotion();
+
+ if (shouldReduceMotion) {
+ return <>{children}>;
+ }
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/app/error.tsx b/src/app/error.tsx
index d1ee083..807e860 100644
--- a/src/app/error.tsx
+++ b/src/app/error.tsx
@@ -17,32 +17,32 @@ export default function Error({
}, [error]);
return (
-
+
-
-
+
出现了一些问题
-
+
很抱歉,我们遇到了一个意外错误。
请尝试刷新页面,或返回首页继续浏览。
{error.message && (
-
-
+
+
错误信息: {error.message}
{error.digest && (
-
+
错误ID: {error.digest}
)}
@@ -53,7 +53,7 @@ export default function Error({
重试
@@ -71,43 +71,43 @@ export default function Error({
-
-
+
+
需要帮助?
-
-
+
-
联系我们
-
获取技术支持
+
联系我们
+
获取技术支持
-
-
+
+
-
服务
-
了解我们的服务
+
服务
+
了解我们的服务
-
+
如果问题持续存在,请{' '}
-
+
联系我们的技术团队
diff --git a/src/app/fonts/geist-mono.woff2 b/src/app/fonts/geist-mono.woff2
new file mode 100644
index 0000000..dbdb8c2
Binary files /dev/null and b/src/app/fonts/geist-mono.woff2 differ
diff --git a/src/app/fonts/geist-sans.woff2 b/src/app/fonts/geist-sans.woff2
new file mode 100644
index 0000000..b2f0121
Binary files /dev/null and b/src/app/fonts/geist-sans.woff2 differ
diff --git a/src/app/globals.css b/src/app/globals.css
index 34033ce..5acc100 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,71 +1,104 @@
@import "tailwindcss";
@theme inline {
- --font-sans: var(--font-geist-sans);
+ --font-sans: var(--font-noto-sans-sc), var(--font-geist-sans), -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
--font-mono: var(--font-geist-mono);
- --font-chinese: var(--font-noto-sans-sc);
- --font-calligraphy: 'Ma Shan Zheng', 'ZCOOL XiaoWei', 'STKaiti', 'KaiTi', serif;
+ --font-chinese: var(--font-noto-sans-sc), sans-serif;
+ --font-calligraphy: var(--font-ma-shan-zheng), 'ZCOOL XiaoWei', 'STKaiti', 'KaiTi', serif;
}
:root {
- /* 主色调 - 墨黑系(水墨画主色) */
--color-primary: #1C1C1C;
--color-primary-hover: #0A0A0A;
--color-primary-light: #3D3D3D;
--color-primary-lighter: #F5F5F5;
-
- /* 品牌色 - 朱砂红(印章红) */
+ --color-primary-rgb: 28, 28, 28;
+
--color-brand-primary: #C41E3A;
--color-brand-primary-hover: #A01830;
--color-brand-primary-light: #E04A68;
--color-brand-primary-bg: #FEF2F4;
-
- /* 背景色系 - 宣纸白 */
+
--color-bg-primary: #FFFFFF;
--color-bg-secondary: #FFFBF5;
--color-bg-tertiary: #F5F5F5;
+ --color-bg-section: #FAFAFA;
--color-bg-hover: #EFEFEF;
-
- /* 文字色系 - 墨色层次 */
+
--color-text-primary: #1C1C1C;
--color-text-secondary: #3D3D3D;
- --color-text-tertiary: #404040; /* 从 #4A4A4A 调整,提升对比度 */
- --color-text-muted: #595959; /* 从 #6B6B6B 调整,确保 WCAG AA 合规 */
-
- /* 边框色系 */
+ --color-text-tertiary: #404040;
+ --color-text-muted: #595959;
+ --color-text-subtle: #A3A3A3;
+ --color-text-placeholder: #5C5C5C;
+ --color-text-hint: #8C8C8C;
+
--color-border-primary: #E5E5E5;
--color-border-secondary: #D4D4D4;
--color-border-accent: #1C1C1C;
-
- /* 链接色 */
+ --color-border-light: #F0F0F0;
+ --color-border-dark: #333333;
+
--color-link: #1C1C1C;
--color-link-hover: #C41E3A;
-
- /* 状态色 */
+
--color-success: #16A34A;
+ --color-success-hover: #15803D;
--color-success-bg: #F0FDF4;
--color-warning: #D97706;
+ --color-warning-hover: #B45309;
--color-warning-bg: #FFFBEB;
--color-info: #5C5C5C;
--color-info-bg: #F5F5F5;
--color-error: #C41E3A;
--color-error-bg: #FEF2F4;
-
- /* 场景色 - 挑战卡片 */
+
+ --color-accent-blue: #2563EB;
+ --color-accent-purple: #7C3AED;
+ --color-accent-cyan: #0891B2;
+
+ --color-brand-primary-rgb: 196, 30, 58;
+ --color-warning-rgb: 217, 119, 6;
+ --color-success-rgb: 22, 163, 74;
+ --color-accent-blue-rgb: 37, 99, 235;
+ --color-accent-purple-rgb: 124, 58, 237;
+ --color-accent-cyan-rgb: 8, 145, 178;
+
+ --color-footer-bg: #1C1C1C;
+ --color-footer-text: #A0A0A0;
+ --color-footer-text-muted: #666666;
+ --color-footer-text-dim: #999999;
+ --color-footer-text-link: #E0E0E0;
+ --color-footer-border: #333333;
+
--color-challenge-isolation: #FEF2F4;
--color-challenge-isolation-hover: #FDE8EC;
--color-challenge-growth: #FFFBEB;
--color-challenge-growth-hover: #FEF3C7;
--color-challenge-compliance: #F0FDF4;
--color-challenge-compliance-hover: #DCFCE7;
-
- /* 阴影 */
+
+ --color-flip-card-bg: #FAFAFA;
+ --color-flip-card-border: #E5E5E5;
+ --color-flip-card-divider: #B0B0B0;
+ --color-flip-card-divider-subtle: #D4D4D4;
+
+ --color-toast-success-bg: #F0FDF4;
+ --color-toast-success-border: #BBF7D0;
+ --color-toast-error-bg: #FEF2F4;
+ --color-toast-error-border: #FECACA;
+ --color-toast-info-bg: #EFF6FF;
+ --color-toast-info-border: #BFDBFE;
+ --color-toast-close: #A3A3A3;
+ --color-toast-close-hover: #595959;
+
+ --color-skeleton-bg: #E5E5E5;
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.05);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.05);
--shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.05);
-
- /* 尺寸变量 */
+
--font-size-xs: 0.75rem;
--font-size-sm: 0.875rem;
--font-size-base: 1rem;
@@ -76,16 +109,16 @@
--font-size-4xl: 2.25rem;
--font-size-5xl: 3rem;
--font-size-6xl: 3.75rem;
-
+
--line-height-tight: 1.1;
--line-height-snug: 1.25;
--line-height-normal: 1.5;
--line-height-relaxed: 1.625;
-
+
--letter-spacing-tight: -0.025em;
--letter-spacing-normal: 0;
--letter-spacing-wide: 0.025em;
-
+
--spacing-xs: 0.25rem;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
@@ -95,14 +128,14 @@
--spacing-3xl: 4rem;
--spacing-4xl: 6rem;
--spacing-5xl: 8rem;
-
+
--border-width-thin: 0.5px;
--border-width-normal: 1px;
-
+
--transition-fast: 150ms;
--transition-normal: 200ms;
--transition-slow: 300ms;
-
+
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
}
@@ -112,7 +145,7 @@
@apply antialiased;
border-color: var(--color-border-primary);
}
-
+
html {
scroll-behavior: smooth;
font-size: 16px;
@@ -121,30 +154,30 @@
text-rendering: optimizeLegibility;
overflow-x: hidden;
}
-
+
@media (min-width: 640px) {
html {
font-size: 17px;
}
}
-
+
@media (min-width: 1024px) {
html {
font-size: 18px;
}
}
-
+
body {
background-color: var(--color-bg-primary);
color: var(--color-text-primary);
- font-family: var(--font-chinese), var(--font-sans), -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ font-family: var(--font-sans);
line-height: var(--line-height-normal);
letter-spacing: var(--letter-spacing-normal);
position: relative;
overflow-x: hidden;
width: 100%;
}
-
+
body::before {
content: '';
position: fixed;
@@ -152,66 +185,54 @@
left: 0;
right: 0;
bottom: 0;
- background:
- radial-gradient(ellipse at 15% 20%, rgba(28, 28, 28, 0.02) 0%, transparent 50%),
- radial-gradient(ellipse at 85% 80%, rgba(196, 30, 58, 0.02) 0%, transparent 50%);
+ background:
+ radial-gradient(ellipse at 15% 20%, rgba(var(--color-primary-rgb), 0.02) 0%, transparent 50%),
+ radial-gradient(ellipse at 85% 80%, rgba(var(--color-brand-primary-rgb), 0.02) 0%, transparent 50%);
pointer-events: none;
z-index: -1;
}
-
+
h1, h2, h3, h4, h5, h6 {
font-weight: 600;
line-height: var(--line-height-tight);
letter-spacing: var(--letter-spacing-tight);
color: var(--color-text-primary);
}
-
- h1 {
- font-size: var(--font-size-5xl);
- }
-
- h2 {
- font-size: var(--font-size-4xl);
- }
-
- h3 {
- font-size: var(--font-size-2xl);
- }
-
- h4 {
- font-size: var(--font-size-xl);
- }
-
+
+ h1 { font-size: var(--font-size-5xl); }
+ h2 { font-size: var(--font-size-4xl); }
+ h3 { font-size: var(--font-size-2xl); }
+ h4 { font-size: var(--font-size-xl); }
+
p {
color: var(--color-text-secondary);
line-height: var(--line-height-relaxed);
}
-
+
a {
color: var(--color-link);
text-decoration: none;
transition: color var(--transition-fast) var(--ease-out);
}
-
+
a:hover {
color: var(--color-link-hover);
}
-
+
button {
font-family: inherit;
cursor: pointer;
}
-
+
input, textarea {
font-family: inherit;
outline: none;
}
-
+
input:focus, textarea:focus {
outline: none;
}
-
- /* 马善政行书体 - 用于红色关键词高亮 */
+
.font-calligraphy {
font-family: var(--font-ma-shan-zheng), 'Ma Shan Zheng', 'ZCOOL XiaoWei', 'STKaiti', 'KaiTi', serif !important;
font-weight: normal;
@@ -220,7 +241,6 @@
text-rendering: optimizeLegibility;
}
- /* 青柳隷書 - 仅用于品牌标题"睿新致遠" */
.font-brand {
font-family: var(--font-aoyagi-reisho), 'Aoyagi Reisho', 'Ma Shan Zheng', 'ZCOOL XiaoWei', 'STKaiti', 'KaiTi', serif !important;
font-weight: normal;
@@ -236,15 +256,6 @@
}
@layer utilities {
- .container-narrow {
- width: 100%;
- max-width: 640px;
- margin-left: auto;
- margin-right: auto;
- padding-left: var(--spacing-lg);
- padding-right: var(--spacing-lg);
- }
-
.container-wide {
width: 100%;
max-width: 1200px;
@@ -253,126 +264,45 @@
padding-left: var(--spacing-lg);
padding-right: var(--spacing-lg);
}
-
+
@media (min-width: 768px) {
.container-wide {
padding-left: var(--spacing-2xl);
padding-right: var(--spacing-2xl);
}
}
-
+
@media (min-width: 1024px) {
.container-wide {
padding-left: 4rem;
padding-right: 4rem;
}
}
-
+
.container-full {
width: 100%;
padding-left: var(--spacing-lg);
padding-right: var(--spacing-lg);
}
-
+
@media (min-width: 768px) {
.container-full {
padding-left: var(--spacing-2xl);
padding-right: var(--spacing-2xl);
}
}
-
+
@media (min-width: 1024px) {
.container-full {
padding-left: 4rem;
padding-right: 4rem;
}
}
-
+
.section-padding {
padding-top: var(--spacing-5xl);
padding-bottom: var(--spacing-5xl);
}
-
- .section-padding-sm {
- padding-top: var(--spacing-3xl);
- padding-bottom: var(--spacing-3xl);
- }
-
- .text-balance {
- text-wrap: balance;
- }
-
- .text-pretty {
- text-wrap: pretty;
- }
-
- .border-thin {
- border-width: var(--border-width-thin);
- }
-
- .transition-smooth {
- transition: all var(--transition-normal) var(--ease-out);
- }
-
- .transition-fast {
- transition: all var(--transition-fast) var(--ease-out);
- }
-
- /* 渐变背景 - Wickret 风格 */
- .bg-gradient-modern {
- background: linear-gradient(135deg, var(--color-dark-bg) 0%, #1a1a2e 50%, #16213e 100%);
- }
-
- .bg-gradient-brand {
- background: linear-gradient(135deg, var(--color-gradient-start), var(--color-gradient-mid), var(--color-gradient-end));
- }
-
- .bg-gradient-radial {
- background: radial-gradient(ellipse at center, var(--color-gradient-start) 0%, transparent 70%);
- }
-
- /* 渐变文字 */
- .text-gradient-brand {
- background: linear-gradient(135deg, var(--color-gradient-start), var(--color-gradient-mid), var(--color-gradient-end));
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- }
-
- .text-gradient-cyan {
- background: linear-gradient(135deg, var(--color-gradient-cyan), var(--color-gradient-mid));
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
- }
-
- /* 发光效果 */
- .bg-glow-red {
- background: radial-gradient(circle at center, var(--color-accent-red-glow) 0%, transparent 70%);
- }
-
- .bg-glow-purple {
- background: radial-gradient(circle at center, rgba(139, 92, 246, 0.3) 0%, transparent 70%);
- }
-
- .shadow-glow-purple {
- box-shadow: 0 0 30px rgba(139, 92, 246, 0.3);
- }
-
- .shadow-glow-red {
- box-shadow: 0 0 30px rgba(196, 30, 58, 0.3);
- }
-}
-
-@keyframes fadeIn {
- from {
- opacity: 0;
- transform: translateY(8px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
}
@keyframes fadeInUp {
@@ -386,37 +316,6 @@
}
}
-@keyframes slideIn {
- from {
- opacity: 0;
- transform: translateX(-8px);
- }
- to {
- opacity: 1;
- transform: translateX(0);
- }
-}
-
-@keyframes scaleIn {
- from {
- opacity: 0;
- transform: scale(0.98);
- }
- to {
- opacity: 1;
- transform: scale(1);
- }
-}
-
-@keyframes drawLine {
- from {
- transform: scaleX(0);
- }
- to {
- transform: scaleX(1);
- }
-}
-
@keyframes stampIn {
0% {
opacity: 0;
@@ -435,220 +334,16 @@
}
}
-@keyframes inkSpread {
- 0% {
- opacity: 0;
- transform: scale(0.8);
- filter: blur(4px);
- }
- 100% {
- opacity: 0.03;
- transform: scale(1);
- filter: blur(0);
- }
-}
-
-@keyframes inkFlow {
- 0%, 100% {
- background-position: 0% 0%;
- }
- 50% {
- background-position: 100% 100%;
- }
-}
-
-@keyframes numberCount {
- from {
- opacity: 0;
- transform: translateY(10px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-@keyframes sectionReveal {
- from {
- opacity: 0;
- transform: translateY(40px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
-@keyframes cornerFadeIn {
- from {
- opacity: 0;
- transform: scale(0);
- }
- to {
- opacity: 1;
- transform: scale(1);
- }
-}
-
-.animate-fade-in {
- animation: fadeIn 0.5s var(--ease-out) forwards;
-}
-
.animate-fade-in-up {
animation: fadeInUp 0.6s var(--ease-out) forwards;
}
-.animate-slide-in {
- animation: slideIn 0.4s var(--ease-out) forwards;
-}
-
-.animate-scale-in {
- animation: scaleIn 0.3s var(--ease-out) forwards;
-}
-
-.animate-draw-line {
- animation: drawLine 0.4s var(--ease-out) forwards;
- transform-origin: left;
-}
-
.animate-stamp-in {
animation: stampIn 0.6s var(--ease-out) forwards;
}
-.animate-ink-spread {
- animation: inkSpread 1s var(--ease-out) forwards;
-}
-
-.animate-section-reveal {
- animation: sectionReveal 0.8s var(--ease-out) forwards;
-}
-
-.animate-number-count {
- animation: numberCount 0.5s var(--ease-out) forwards;
-}
-
.stagger-1 { animation-delay: 0.1s; }
.stagger-2 { animation-delay: 0.2s; }
-.stagger-3 { animation-delay: 0.3s; }
-.stagger-4 { animation-delay: 0.4s; }
-.stagger-5 { animation-delay: 0.5s; }
-.stagger-6 { animation-delay: 0.6s; }
-
-.geometric-card {
- border: 1px solid rgba(196, 30, 58, 0.08);
- position: relative;
- background: rgba(255, 255, 255, 0.8);
- backdrop-filter: blur(8px);
- transition: all 0.3s var(--ease-out);
-}
-
-.geometric-card::before,
-.geometric-card::after {
- content: '';
- position: absolute;
- width: 12px;
- height: 12px;
- border: 1px solid rgba(196, 30, 58, 0.15);
- opacity: 0;
- transition: all 0.3s var(--ease-out);
-}
-
-.geometric-card::before {
- top: -1px;
- left: -1px;
- border-right: none;
- border-bottom: none;
- border-radius: 4px 0 0 0;
-}
-
-.geometric-card::after {
- bottom: -1px;
- right: -1px;
- border-left: none;
- border-top: none;
- border-radius: 0 0 4px 0;
-}
-
-.geometric-card:hover {
- border-color: rgba(196, 30, 58, 0.2);
- transform: translateY(-4px);
- box-shadow: 0 12px 40px -12px rgba(196, 30, 58, 0.15);
-}
-
-.geometric-card:hover::before,
-.geometric-card:hover::after {
- opacity: 1;
-}
-
-.geometric-card:hover::before {
- animation: cornerFadeIn 0.3s var(--ease-out) forwards;
-}
-
-.geometric-card:hover::after {
- animation: cornerFadeIn 0.3s var(--ease-out) 0.1s forwards;
-}
-
-.ink-divider {
- height: 1px;
- background: linear-gradient(90deg, transparent, rgba(196, 30, 58, 0.2), transparent);
- position: relative;
-}
-
-.ink-divider::before {
- content: '';
- position: absolute;
- left: 50%;
- top: -3px;
- width: 6px;
- height: 6px;
- background: var(--color-brand-primary);
- border-radius: 50%;
- transform: translateX(-50%);
- opacity: 0.3;
-}
-
-.chapter-title {
- position: relative;
- display: inline-block;
-}
-
-.chapter-title::after {
- content: '';
- position: absolute;
- bottom: -8px;
- left: 0;
- width: 40px;
- height: 3px;
- background: var(--color-brand-primary);
- border-radius: 2px;
-}
-
-.scroll-reveal {
- opacity: 0;
- transform: translateY(30px);
- transition: all 0.8s var(--ease-out);
-}
-
-.scroll-reveal.revealed {
- opacity: 1;
- transform: translateY(0);
-}
-
-.ink-texture {
- position: relative;
-}
-
-.ink-texture::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");
- opacity: 0.015;
- pointer-events: none;
-}
::-webkit-scrollbar {
width: 6px;
@@ -676,7 +371,7 @@
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
-
+
html {
scroll-behavior: auto;
}
@@ -689,469 +384,39 @@
--font-size-3xl: 1.5rem;
--font-size-2xl: 1.25rem;
}
-
+
.section-padding {
padding-top: var(--spacing-3xl);
padding-bottom: var(--spacing-3xl);
}
}
-@keyframes glow {
- 0%, 100% {
- box-shadow: 0 4px 12px rgba(196, 30, 58, 0.2);
- }
- 50% {
- box-shadow: 0 8px 24px rgba(196, 30, 58, 0.3);
- }
-}
-
-@keyframes float {
- 0%, 100% {
- transform: translateY(0px);
- }
- 50% {
- transform: translateY(-10px);
- }
-}
-
-@keyframes pulse-glow {
- 0%, 100% {
- opacity: 0.2;
- }
- 50% {
- opacity: 0.4;
- }
-}
-
-@keyframes ripple {
- 0% {
- transform: scale(0);
- opacity: 1;
- }
- 100% {
- transform: scale(4);
- opacity: 0;
- }
-}
-
-@keyframes inkDrop {
- 0% {
- transform: scale(0);
- opacity: 0;
- filter: blur(8px);
- }
- 50% {
- opacity: 0.8;
- filter: blur(2px);
- }
- 100% {
- transform: scale(1);
- opacity: 1;
- filter: blur(0);
- }
-}
-
-@keyframes brushStroke {
- 0% {
- stroke-dashoffset: 1000;
- opacity: 0;
- }
- 50% {
- opacity: 1;
- }
- 100% {
- stroke-dashoffset: 0;
- opacity: 1;
- }
-}
-
-@keyframes sealPress {
- 0% {
- transform: scale(1.8) rotate(-20deg);
- opacity: 0;
- }
- 60% {
- transform: scale(0.9) rotate(2deg);
- opacity: 1;
- }
- 80% {
- transform: scale(1.05) rotate(-1deg);
- }
- 100% {
- transform: scale(1) rotate(0deg);
- opacity: 1;
- }
-}
-
-@keyframes inkBleed {
- 0% {
- box-shadow: 0 0 0 0 rgba(28, 28, 28, 0.1);
- }
- 100% {
- box-shadow: 0 0 20px 10px rgba(28, 28, 28, 0);
- }
-}
-
-@keyframes shimmer {
- 0% {
- background-position: -200% 0;
- }
- 100% {
- background-position: 200% 0;
- }
-}
-
-@keyframes breathe {
- 0%, 100% {
- transform: scale(1);
- }
- 50% {
- transform: scale(1.02);
- }
-}
-
-@keyframes slideUp {
- 0% {
- transform: translateY(100%);
- opacity: 0;
- }
- 100% {
- transform: translateY(0);
- opacity: 1;
- }
-}
-
-@keyframes slideDown {
- 0% {
- transform: translateY(-100%);
- opacity: 0;
- }
- 100% {
- transform: translateY(0);
- opacity: 1;
- }
-}
-
-@keyframes expandWidth {
- 0% {
- width: 0;
- opacity: 0;
- }
- 100% {
- width: 100%;
- opacity: 1;
- }
-}
-
-@keyframes typewriter {
- from {
- width: 0;
- }
- to {
- width: 100%;
- }
-}
-
-@keyframes blink {
- 0%, 50% {
- opacity: 1;
- }
- 51%, 100% {
- opacity: 0;
- }
-}
-
-.animate-glow {
- animation: glow 2s ease-in-out infinite;
-}
-
-.animate-float {
- animation: float 3s ease-in-out infinite;
-}
-
-.animate-pulse-glow {
- animation: pulse-glow 2s ease-in-out infinite;
-}
-
-.animate-ripple {
- animation: ripple 0.6s ease-out forwards;
-}
-
-.animate-ink-drop {
- animation: inkDrop 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
-}
-
-.animate-seal-press {
- animation: sealPress 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
-}
-
-.animate-ink-bleed {
- animation: inkBleed 1s ease-out forwards;
-}
-
-.animate-shimmer {
- background: linear-gradient(
- 90deg,
- rgba(196, 30, 58, 0) 0%,
- rgba(196, 30, 58, 0.1) 50%,
- rgba(196, 30, 58, 0) 100%
- );
- background-size: 200% 100%;
- animation: shimmer 2s infinite;
-}
-
-.animate-breathe {
- animation: breathe 4s ease-in-out infinite;
-}
-
-.animate-slide-up {
- animation: slideUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
-}
-
-.animate-slide-down {
- animation: slideDown 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
-}
-
-.animate-expand-width {
- animation: expandWidth 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards;
-}
-
-.hover-lift {
- transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.hover-lift:hover {
- transform: translateY(-4px);
- box-shadow: 0 12px 24px rgba(28, 28, 28, 0.1);
-}
-
-.hover-scale {
- transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.hover-scale:hover {
- transform: scale(1.02);
-}
-
-.hover-glow {
- transition: box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.hover-glow:hover {
- box-shadow: 0 0 20px rgba(196, 30, 58, 0.3);
-}
-
-.hover-ink {
- position: relative;
- overflow: hidden;
-}
-
-.hover-ink::before {
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- width: 0;
- height: 0;
- background: rgba(28, 28, 28, 0.05);
- border-radius: 50%;
- transform: translate(-50%, -50%);
- transition: width 0.6s cubic-bezier(0.16, 1, 0.3, 1), height 0.6s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.hover-ink:hover::before {
- width: 300%;
- height: 300%;
-}
-
-.ink-border {
- position: relative;
-}
-
-.ink-border::after {
- content: '';
- position: absolute;
- bottom: 0;
- left: 0;
- width: 0;
- height: 2px;
- background: linear-gradient(90deg, #1C1C1C, #C41E3A);
- transition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.ink-border:hover::after {
- width: 100%;
-}
-
-.seal-stamp {
- position: relative;
-}
-
-.seal-stamp::before {
- content: '';
- position: absolute;
- inset: -4px;
- border: 2px solid rgba(196, 30, 58, 0.3);
- border-radius: inherit;
- opacity: 0;
- transform: scale(1.1);
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.seal-stamp:hover::before {
- opacity: 1;
- transform: scale(1);
-}
-
-.primary-gradient {
- background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-light) 100%);
-}
-
-.primary-gradient-text {
- background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-light) 100%);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
-}
-
-.brand-gradient {
- background: linear-gradient(135deg, var(--color-brand-primary) 0%, var(--color-brand-primary-light) 100%);
-}
-
-.brand-gradient-text {
- background: linear-gradient(135deg, var(--color-brand-primary) 0%, var(--color-brand-primary-light) 100%);
- -webkit-background-clip: text;
- -webkit-text-fill-color: transparent;
- background-clip: text;
-}
-
-.card-shadow {
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
-}
-
-.card-shadow-hover:hover {
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
-}
-
-.btn-primary {
- background: #C41E3A;
- color: #FFFFFF;
- border-radius: 8px;
- padding: 12px 32px;
- font-weight: 600;
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.btn-primary:hover {
- background: #A01830;
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(196, 30, 58, 0.25);
-}
-
-.btn-secondary {
- background: #1C1C1C;
- color: #FFFFFF;
- border-radius: 8px;
- padding: 12px 32px;
- font-weight: 600;
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.btn-secondary:hover {
- background: #0A0A0A;
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(28, 28, 28, 0.25);
-}
-
-.btn-outline {
- background: transparent;
- border: 2px solid #1C1C1C;
- color: #1C1C1C;
- border-radius: 8px;
- padding: 12px 32px;
- font-weight: 600;
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.btn-outline:hover {
- background: #F5F5F5;
- transform: translateY(-2px);
- box-shadow: 0 2px 8px rgba(28, 28, 28, 0.15);
-}
-
-.card-health {
- background: var(--color-bg-primary);
- border: 1px solid var(--color-border-primary);
- border-radius: 12px;
- padding: 24px;
- transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
-}
-
-.card-health:hover {
- border-color: var(--color-primary);
- transform: translateY(-4px);
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.06);
-}
-
-.icon-container-primary {
- background: linear-gradient(135deg, rgba(0, 94, 184, 0.1), rgba(0, 163, 224, 0.1));
- border-radius: 12px;
- transition: box-shadow 0.3s ease;
-}
-
-.icon-container-primary:hover {
- box-shadow: 0 4px 12px rgba(0, 94, 184, 0.15);
-}
-
-.icon-container-brand {
- background: linear-gradient(135deg, rgba(196, 30, 58, 0.1), rgba(224, 74, 104, 0.1));
- border-radius: 12px;
- transition: box-shadow 0.3s ease;
-}
-
-.icon-container-brand:hover {
- box-shadow: 0 4px 12px rgba(196, 30, 58, 0.15);
-}
-
-/* 移动端安全区域适配 */
.safe-area-inset-bottom {
padding-bottom: env(safe-area-inset-bottom, 0px);
}
-/* 隐藏移动端底部导航栏时的页面底部间距 */
body {
padding-bottom: 0;
+ text-wrap: pretty;
}
@media (max-width: 767px) {
body {
padding-bottom: 64px;
}
-
- /* 防止移动端内容溢出 */
+
.container-wide,
- .container-full,
- .container-narrow {
+ .container-full {
padding-left: 1rem;
padding-right: 1rem;
max-width: 100%;
overflow-x: hidden;
}
-
- /* 优化移动端文字大小 */
- h1 {
- font-size: 2rem;
- }
-
- h2 {
- font-size: 1.75rem;
- }
-
- h3 {
- font-size: 1.375rem;
- }
-
- /* 优化移动端按钮和链接的触摸目标 */
+
+ h1 { font-size: 2rem; }
+ h2 { font-size: 1.75rem; }
+ h3 { font-size: 1.375rem; }
+
a:not(nav[aria-label="breadcrumb"] a), button {
min-height: 44px;
min-width: 44px;
@@ -1160,15 +425,13 @@ body {
min-height: 0;
min-width: 0;
}
-
- /* 防止长文本溢出 */
+
p, li, span {
overflow-wrap: break-word;
word-wrap: break-word;
}
}
-/* 墨韵流光 - 旋转渐变边框 */
@property --border-angle {
syntax: '
';
initial-value: 0deg;
@@ -1218,30 +481,54 @@ body {
opacity: 0.3;
}
-/* 平板端优化 (768px - 1023px) */
@media (min-width: 768px) and (max-width: 1023px) {
.container-wide,
.container-full {
padding-left: 2rem;
padding-right: 2rem;
}
-
- /* 平板端文字大小调整 */
- h1 {
- font-size: 2.5rem;
- }
-
- h2 {
- font-size: 2rem;
- }
-
- h3 {
- font-size: 1.5rem;
- }
-
- /* 平板端section间距 */
+
+ h1 { font-size: 2.5rem; }
+ h2 { font-size: 2rem; }
+ h3 { font-size: 1.5rem; }
+
.section-padding {
padding-top: 4rem;
padding-bottom: 4rem;
}
}
+
+.page-transition-loader {
+ width: 120px;
+ height: 3px;
+ background: var(--color-bg-section);
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+.page-transition-loader__bar {
+ width: 40%;
+ height: 100%;
+ background: var(--color-brand-primary);
+ border-radius: 2px;
+ animation: page-loader-slide 1.2s ease-in-out infinite;
+}
+
+@keyframes page-loader-slide {
+ 0% {
+ transform: translateX(-100%);
+ }
+ 50% {
+ transform: translateX(200%);
+ }
+ 100% {
+ transform: translateX(-100%);
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .page-transition-loader__bar {
+ animation: none;
+ width: 100%;
+ }
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 61c1e18..77df2e8 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,6 +1,6 @@
import type { Metadata, Viewport } from "next";
-import { Geist, Geist_Mono, Noto_Sans_SC, Ma_Shan_Zheng } from "next/font/google";
import localFont from "next/font/local";
+import { Ma_Shan_Zheng, Noto_Sans_SC } from "next/font/google";
import "./globals.css";
import { Suspense } from "react";
import { ThemeProvider } from "@/contexts/theme-context";
@@ -15,24 +15,23 @@ import { ErrorBoundary } from "@/components/ui/error-boundary";
import { ScrollProgress } from "@/components/ui/scroll-progress";
import { BackToTop } from "@/components/ui/back-to-top";
-const geistSans = Geist({
+const geistSans = localFont({
+ src: "./fonts/geist-sans.woff2",
variable: "--font-geist-sans",
- subsets: ["latin"],
display: "swap",
preload: false,
});
-const geistMono = Geist_Mono({
+const geistMono = localFont({
+ src: "./fonts/geist-mono.woff2",
variable: "--font-geist-mono",
- subsets: ["latin"],
display: "swap",
preload: false,
});
-const notoSansSC = Noto_Sans_SC({
- weight: ["400", "500", "700"],
- variable: "--font-noto-sans-sc",
- subsets: ["latin"],
+const aoyagiReisho = localFont({
+ src: "./fonts/AoyagiReisho-subset.ttf",
+ variable: "--font-aoyagi-reisho",
display: "swap",
preload: true,
});
@@ -40,17 +39,16 @@ const notoSansSC = Noto_Sans_SC({
const maShanZheng = Ma_Shan_Zheng({
weight: "400",
variable: "--font-ma-shan-zheng",
- subsets: ["latin"],
display: "swap",
- preload: true,
+ preload: false,
});
-// 青柳隷書 - 仅用于品牌标题"睿新致遠"(子集版本,仅包含4个字符)
-const aoyagiReisho = localFont({
- src: "./fonts/AoyagiReisho-subset.ttf",
- variable: "--font-aoyagi-reisho",
+const notoSansSC = Noto_Sans_SC({
+ weight: ["400", "500", "700"],
+ variable: "--font-noto-sans-sc",
display: "swap",
- preload: true,
+ subsets: ["latin"],
+ preload: false,
});
export const metadata: Metadata = {
@@ -134,12 +132,11 @@ export default function RootLayout({
跳转到主内容
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
index 0ab13e1..e8c2e52 100644
--- a/src/app/not-found.tsx
+++ b/src/app/not-found.tsx
@@ -7,21 +7,21 @@ import { COMPANY_INFO } from '@/lib/constants';
export default function NotFound() {
return (
-
+
-
+
页面未找到
-
+
很抱歉,您访问的页面不存在或已被移动。
请检查网址是否正确,或使用以下导航继续浏览。
@@ -30,7 +30,7 @@ export default function NotFound() {
@@ -48,69 +48,69 @@ export default function NotFound() {
-
-
+
+
您可能在寻找
-
-
+
+
-
关于我们
-
了解{COMPANY_INFO.displayName}
+
关于我们
+
了解{COMPANY_INFO.displayName}
-
-
+
+
-
服务
-
我们的服务
+
服务
+
我们的服务
-
-
+
+
-
产品
-
企业级产品
+
产品
+
企业级产品
-
-
+
+
-
解决方案
-
行业方案
+
解决方案
+
行业方案
-
+
如果您认为这是一个错误,请{' '}
-
+
联系我们
diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx
index f98f30c..d65eb4e 100644
--- a/src/app/privacy/page.tsx
+++ b/src/app/privacy/page.tsx
@@ -8,8 +8,8 @@ export const metadata: Metadata = {
export default function PrivacyPolicyPage() {
return (
-
-
+
+
隐私政策
@@ -24,31 +24,31 @@ export default function PrivacyPolicyPage() {
- 引言
-
+
引言
+
四川睿新致远科技有限公司(以下简称“我们”、“公司”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。
-
+
本隐私政策适用于您通过四川睿新致远科技有限公司官方网站、移动应用、产品服务等渠道访问和使用我们的产品和服务时,我们收集和使用您的个人信息的情形。
- 一、我们如何收集和使用您的个人信息
-
+
一、我们如何收集和使用您的个人信息
+
我们会遵循正当、合法、必要的原则,仅为实现产品功能,向您提供服务之目的,收集和使用您的个人信息。
- 1.1 我们收集的个人信息
-
+ 1.1 我们收集的个人信息
+
- 账户信息:当您注册账户时,我们可能收集您的姓名、电子邮箱地址、手机号码、公司名称等。
- 联系信息:当您通过联系表单或客服与我们沟通时,我们可能收集您的姓名、电子邮箱地址、手机号码、留言内容等。
- 使用信息:我们可能收集您使用我们产品和服务的信息,包括访问时间、浏览记录、操作日志等。
- 设备信息:我们可能收集您使用的设备信息,包括设备型号、操作系统、浏览器类型等。
- 1.2 我们如何使用您的个人信息
-
+ 1.2 我们如何使用您的个人信息
+
- 提供产品和服务:向您提供我们的产品和服务,处理您的请求和订单。
- 客户服务:与您联系,提供客户支持,回复您的咨询和反馈。
- 改进产品和服务:分析使用情况,改进我们的产品和服务质量。
@@ -58,33 +58,33 @@ export default function PrivacyPolicyPage() {
- 二、我们如何共享、转让、公开披露您的个人信息
+ 二、我们如何共享、转让、公开披露您的个人信息
- 2.1 共享
-
+
2.1 共享
+
我们不会向其他任何公司、组织和个人分享您的个人信息,但以下情况除外:
-
- 三、我们如何保护您的个人信息
-
+
三、我们如何保护您的个人信息
+
我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。
-
+
- 使用加密技术确保数据传输和存储安全。
- 限制访问权限,仅授权人员可访问个人信息。
- 定期进行安全审计和风险评估。
@@ -107,11 +107,11 @@ export default function PrivacyPolicyPage() {
- 四、您的权利
-
+
四、您的权利
+
按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的个人信息行使以下权利:
-
- 五、未成年人保护
-
+
五、未成年人保护
+
我们非常重视对未成年人个人信息的保护。如果您是18周岁以下的未成年人,在使用我们的产品和服务前,应事先取得您家长或法定监护人的同意。如您是未成年人的监护人,当您对您所监护的未成年人的个人信息处理存在疑问时,请通过本隐私政策提供的联系方式与我们联系。
- 六、隐私政策的更新
-
+
六、隐私政策的更新
+
我们可能适时更新本隐私政策的条款,该等更新构成本隐私政策的一部分。如该等更新造成您在本隐私政策下权利的实质减少,我们将在更新生效前通过在主页上显著位置提示或向您发送电子邮件或其他方式通知您,在该种情况下,若您继续使用我们的服务,即表示同意受经修订的本隐私政策的约束。
- 七、Cookie 和网站分析工具
+ 七、Cookie 和网站分析工具
- 7.1 Cookie 使用说明
-
+
7.1 Cookie 使用说明
+
我们使用 Cookie 和类似技术来提供、保护和改进我们的服务。Cookie 是存储在您设备上的小型文本文件,帮助我们识别您的设备、记住您的偏好设置。
-
-
+
+
- | Cookie 类型 |
- 用途 |
- 持续时间 |
- 是否必需 |
+ Cookie 类型 |
+ 用途 |
+ 持续时间 |
+ 是否必需 |
-
+
- | 必要 Cookie |
- 网站基本功能运行 |
- 会话期间 |
- 是 |
+ 必要 Cookie |
+ 网站基本功能运行 |
+ 会话期间 |
+ 是 |
- | 分析 Cookie |
- 了解网站使用情况,改进服务 |
- 14个月 |
- 否 |
+ 分析 Cookie |
+ 了解网站使用情况,改进服务 |
+ 14个月 |
+ 否 |
- | 营销 Cookie |
- 个性化广告(当前未使用) |
- - |
- 否 |
+ 营销 Cookie |
+ 个性化广告(当前未使用) |
+ - |
+ 否 |
- 7.2 Google Analytics 使用说明
-
+
7.2 Google Analytics 使用说明
+
我们使用 Google Analytics 4(由 Google LLC 提供)分析网站使用情况,帮助我们了解访客如何使用网站,从而改进用户体验。
-
+
收集的数据包括:
-
+
- 访问的页面和停留时间
- 设备类型、浏览器类型
- 地理位置(国家/城市级别,IP 地址已匿名化)
- 访问来源(直接访问、搜索引擎、外部链接)
-
+
我们已采取的保护措施:
-