diff --git a/docs/plans/2026-02-22-novalon-redesign-implementation.md b/docs/plans/2026-02-22-novalon-redesign-implementation.md new file mode 100644 index 0000000..dedd0a0 --- /dev/null +++ b/docs/plans/2026-02-22-novalon-redesign-implementation.md @@ -0,0 +1,1341 @@ +# Novalon 官网重新设计实施计划 + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** 将 Novalon 官网从现有设计升级为数字未来风设计,包括配色系统、UI 组件、页面布局、动效和响应式适配的全面升级。 + +**Architecture:** 采用渐进式升级策略,从核心配色系统开始,逐步更新 UI 组件、页面布局、动效和响应式适配。使用 Tailwind CSS v4 的 CSS 变量系统实现主题切换,使用 Framer Motion 实现动效,使用 AntV 生态实现数据可视化。 + +**Tech Stack:** Next.js 16, React 19, TypeScript, Tailwind CSS v4, Framer Motion, AntV (G2/G6/L7/S2), Lucide React + +--- + +## Phase 1: 核心配色系统 + +### Task 1: 更新 CSS 变量 - 深色模式配色 + +**Files:** +- Modify: `src/app/globals.css:1-200` + +**Step 1: 备份当前配色变量** + +```bash +cp src/app/globals.css src/app/globals.css.backup +``` + +**Step 2: 更新深色模式配色变量** + +在 `.dark` 类中更新配色变量: + +```css +.dark { + --color-bg-primary: #0A0A0A; + --color-bg-secondary: #141414; + --color-bg-tertiary: #1A1A1A; + --color-bg-hover: #242424; + + --color-text-primary: #FAFAFA; + --color-text-secondary: #D4D4D4; + --color-text-tertiary: #A3A3A3; + --color-text-muted: #737373; + + --color-border-primary: #262626; + --color-border-secondary: #333333; + --color-border-accent: #404040; + + --color-accent: #FAFAFA; + --color-accent-hover: #E5E5E5; + --color-accent-light: #D4D4D4; + + --color-link: #D4D4D4; + --color-link-hover: #FAFAFA; + + --color-brand-primary: #C41E3A; + --color-brand-primary-hover: #A01830; + --color-brand-primary-light: #E04A68; + --color-brand-primary-lighter: #F08C9F; + --color-brand-primary-bg: #1A0F11; + + --color-tech-blue: #00D9FF; + --color-tech-blue-hover: #00B8D9; + --color-tech-blue-light: #33E1FF; + --color-tech-purple: #A855F7; + --color-tech-purple-hover: #9333EA; + --color-tech-purple-light: #C084FC; + --color-tech-cyan: #06B6D4; + + --color-success: #22C55E; + --color-success-bg: #052E16; + --color-warning: #F59E0B; + --color-warning-bg: #1C1917; + --color-info: #0EA5E9; + --color-info-bg: #0C2D48; + --color-error: #EF4444; + --color-error-bg: #1C1917; +} +``` + +**Step 3: 更新浅色模式配色变量** + +在 `:root` 中更新配色变量: + +```css +:root { + --color-bg-primary: #FFFFFF; + --color-bg-secondary: #FAFAFA; + --color-bg-tertiary: #F5F5F5; + --color-bg-hover: #F0F0F0; + + --color-text-primary: #171717; + --color-text-secondary: #525252; + --color-text-tertiary: #737373; + --color-text-muted: #A3A3A3; + + --color-border-primary: #E5E5E5; + --color-border-secondary: #F0F0F0; + --color-border-accent: #D4D4D4; + + --color-accent: #171717; + --color-accent-hover: #262626; + --color-accent-light: #404040; + + --color-link: #525252; + --color-link-hover: #171717; + + --color-brand-primary: #C41E3A; + --color-brand-primary-hover: #A01830; + --color-brand-primary-light: #D4244A; + --color-brand-primary-lighter: #E04A68; + --color-brand-primary-bg: #FEF2F4; + + --color-tech-blue: #00D9FF; + --color-tech-blue-hover: #00B8D9; + --color-tech-blue-light: #33E1FF; + --color-tech-purple: #A855F7; + --color-tech-purple-hover: #9333EA; + --color-tech-purple-light: #C084FC; + --color-tech-cyan: #06B6D4; + + --color-success: #16A34A; + --color-success-bg: #F0FDF4; + --color-warning: #D97706; + --color-warning-bg: #FFFBEB; + --color-info: #0284C7; + --color-info-bg: #F0F9FF; + --color-error: #DC2626; + --color-error-bg: #FEF2F2; +} +``` + +**Step 4: 验证配色变量** + +在浏览器中打开网站,切换深色/浅色模式,检查配色是否正确应用。 + +**Step 5: 提交更改** + +```bash +git add src/app/globals.css +git commit -m "feat: 更新核心配色系统 - 深色/浅色模式 + +- 更新深色模式配色变量(科技蓝、紫色、印章红) +- 更新浅色模式配色变量 +- 添加新的科技色彩变量 +- 保持品牌色一致性" +``` + +--- + +### Task 2: 更新 colors.ts 文件 + +**Files:** +- Modify: `src/lib/colors.ts:1-69` + +**Step 1: 更新品牌色彩定义** + +```typescript +export const brandColors = { + primary: { + 600: '#C41E3A', + 700: '#A01830', + 500: '#D4244A', + 400: '#E04A68', + 100: '#FEF2F4', + }, + tech: { + blue: { + 600: '#00D9FF', + 700: '#00B8D9', + 500: '#33E1FF', + }, + purple: { + 600: '#A855F7', + 700: '#9333EA', + 500: '#C084FC', + }, + cyan: { + 600: '#06B6D4', + }, + }, + neutral: { + 900: '#0A0A0A', + 800: '#141414', + 700: '#1A1A1A', + 600: '#242424', + 500: '#333333', + 400: '#404040', + 300: '#737373', + 200: '#A3A3A3', + 100: '#D4D4D4', + 50: '#FAFAFA', + 0: '#FFFFFF', + }, + success: { + 600: '#16A34A', + 100: '#F0FDF4', + }, + warning: { + 600: '#D97706', + 100: '#FFFBEB', + }, + info: { + 600: '#0284C7', + 100: '#F0F9FF', + }, + error: { + 600: '#DC2626', + 100: '#FEF2F2', + }, +} as const; + +export const colorValues = { + primary: '#C41E3A', + primaryHover: '#A01830', + primaryLight: '#D4244A', + primaryBg: '#FEF2F4', + + techBlue: '#00D9FF', + techBlueHover: '#00B8D9', + techBlueLight: '#33E1FF', + techPurple: '#A855F7', + techPurpleHover: '#9333EA', + techPurpleLight: '#C084FC', + techCyan: '#06B6D4', + + textPrimary: '#FAFAFA', + textSecondary: '#D4D4D4', + textTertiary: '#A3A3A3', + textMuted: '#737373', + + bgPrimary: '#0A0A0A', + bgSecondary: '#141414', + bgTertiary: '#1A1A1A', + bgHover: '#242424', + + border: '#262626', + borderHover: '#333333', + + success: '#16A34A', + successBg: '#F0FDF4', + warning: '#D97706', + warningBg: '#FFFBEB', + info: '#0284C7', + infoBg: '#F0F9FF', + error: '#DC2626', + errorBg: '#FEF2F2', +} as const; + +export const gradients = { + primary: 'linear-gradient(135deg, #00D9FF 0%, #A855F7 100%)', + reverse: 'linear-gradient(135deg, #A855F7 0%, #00D9FF 100%)', + glow: 'radial-gradient(circle, rgba(0, 217, 255, 0.15) 0%, transparent 70%)', + glowPurple: 'radial-gradient(circle, rgba(168, 85, 247, 0.15) 0%, transparent 70%)', +} as const; + +export type BrandColor = typeof brandColors; +export type ColorValue = typeof colorValues; +export type Gradient = typeof gradients; +``` + +**Step 2: 验证类型定义** + +运行 TypeScript 编译检查: + +```bash +npm run build +``` + +Expected: 无类型错误 + +**Step 3: 提交更改** + +```bash +git add src/lib/colors.ts +git commit -m "feat: 更新色彩系统定义 + +- 添加科技蓝、紫色、青色色彩系列 +- 更新中性色系列 +- 添加渐变色定义 +- 完善类型定义" +``` + +--- + +### Task 3: 创建渐变色工具函数 + +**Files:** +- Create: `src/lib/gradients.ts` + +**Step 1: 创建渐变色工具函数** + +```typescript +import { gradients } from './colors'; + +export const getGradientStyle = (type: keyof typeof gradients) => { + return { + background: gradients[type], + }; +}; + +export const getGlowStyle = (color: 'blue' | 'purple', opacity: number = 0.15) => { + const colorValue = color === 'blue' ? '0, 217, 255' : '168, 85, 247'; + return { + background: `radial-gradient(circle, rgba(${colorValue}, ${opacity}) 0%, transparent 70%)`, + }; +}; + +export const getBorderGradientStyle = () => { + return { + borderImage: `${gradients.primary} 1`, + }; +}; + +export const getTextGradientStyle = () => { + return { + background: gradients.primary, + WebkitBackgroundClip: 'text', + WebkitTextFillColor: 'transparent', + backgroundClip: 'text', + }; +}; +``` + +**Step 2: 创建测试文件** + +```typescript +import { getGradientStyle, getGlowStyle, getTextGradientStyle } from '../gradients'; + +describe('gradients utilities', () => { + test('getGradientStyle returns correct gradient', () => { + const style = getGradientStyle('primary'); + expect(style.background).toContain('linear-gradient'); + }); + + test('getGlowStyle returns correct glow for blue', () => { + const style = getGlowStyle('blue', 0.2); + expect(style.background).toContain('rgba(0, 217, 255, 0.2)'); + }); + + test('getGlowStyle returns correct glow for purple', () => { + const style = getGlowStyle('purple', 0.1); + expect(style.background).toContain('rgba(168, 85, 247, 0.1)'); + }); + + test('getTextGradientStyle returns correct text gradient', () => { + const style = getTextGradientStyle(); + expect(style.WebkitBackgroundClip).toBe('text'); + expect(style.WebkitTextFillColor).toBe('transparent'); + }); +}); +``` + +**Step 3: 运行测试** + +```bash +npm test -- src/lib/gradients.test.ts +``` + +Expected: 所有测试通过 + +**Step 4: 提交更改** + +```bash +git add src/lib/gradients.ts src/lib/gradients.test.ts +git commit -m "feat: 添加渐变色工具函数 + +- 创建渐变色样式生成函数 +- 创建光晕效果生成函数 +- 创建文字渐变效果函数 +- 添加单元测试" +``` + +--- + +## Phase 2: UI 组件更新 + +### Task 4: 更新按钮组件 + +**Files:** +- Modify: `src/components/ui/button.tsx` + +**Step 1: 更新按钮样式变体** + +```typescript +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-tech-blue)] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-[var(--color-brand-primary)] text-white hover:bg-[var(--color-brand-primary-hover)] hover:shadow-[0_0_20px_rgba(196,30,58,0.4)] hover:-translate-y-0.5 active:scale-[0.98]", + secondary: + "bg-gradient-to-br from-[var(--color-tech-blue)] to-[var(--color-tech-purple)] text-white hover:shadow-[0_0_20px_rgba(0,217,255,0.3)] hover:-translate-y-0.5 active:scale-[0.98]", + outline: + "border border-[var(--color-tech-blue)] bg-transparent text-[var(--color-tech-blue)] hover:bg-[rgba(0,217,255,0.1)] hover:shadow-[0_0_20px_rgba(0,217,255,0.2)]", + ghost: + "text-[var(--color-text-secondary)] hover:bg-[rgba(255,255,255,0.05)] hover:text-[var(--color-text-primary)]", + link: + "text-[var(--color-tech-blue)] underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-12 rounded-lg px-6 text-base", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } +``` + +**Step 2: 测试按钮组件** + +在浏览器中打开网站,检查按钮样式是否正确应用。 + +**Step 3: 提交更改** + +```bash +git add src/components/ui/button.tsx +git commit -m "feat: 更新按钮组件样式 + +- 更新默认按钮为印章红色 +- 添加科技蓝渐变次要按钮 +- 更新轮廓按钮样式 +- 添加悬停发光效果 +- 添加点击缩放反馈" +``` + +--- + +### Task 5: 更新卡片组件 + +**Files:** +- Modify: `src/components/ui/card.tsx` + +**Step 1: 更新卡片样式** + +```typescript +import * as React from "react" +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } +``` + +**Step 2: 测试卡片组件** + +在浏览器中打开网站,检查卡片样式是否正确应用。 + +**Step 3: 提交更改** + +```bash +git add src/components/ui/card.tsx +git commit -m "feat: 更新卡片组件样式 + +- 更新卡片背景色为深灰 +- 添加悬停边框发光效果 +- 添加悬停上移动画 +- 更新文字颜色变量" +``` + +--- + +### Task 6: 更新导航栏组件 + +**Files:** +- Modify: `src/components/layout/header.tsx` + +**Step 1: 更新导航栏样式** + +在导航栏组件中添加新的样式类: + +```typescript +// 在 header.tsx 中更新导航栏样式 +
+ {/* 导航内容 */} +
+``` + +**Step 2: 更新导航链接样式** + +```typescript +// 更新导航链接样式 + + {link.name} + + +``` + +**Step 3: 测试导航栏** + +在浏览器中打开网站,检查导航栏样式是否正确应用。 + +**Step 4: 提交更改** + +```bash +git add src/components/layout/header.tsx +git commit -m "feat: 更新导航栏样式 + +- 更新导航栏背景为半透明深色 +- 添加模糊效果 +- 更新导航链接悬停效果 +- 添加下划线动画" +``` + +--- + +## Phase 3: 页面布局优化 + +### Task 7: 更新 Hero 区域 + +**Files:** +- Modify: `src/components/sections/hero-section.tsx` + +**Step 1: 更新 Hero 区域背景** + +```typescript +
+ {/* 网格背景 */} +
+ + {/* 光晕效果 */} +
+
+ + {/* 内容 */} +
+ {/* Hero 内容 */} +
+
+``` + +**Step 2: 更新 Hero 文案样式** + +```typescript +

+ 睿新致遠,智创未来 +

+

+ 以科技创新驱动企业数字化转型,打造智慧未来 +

+``` + +**Step 3: 测试 Hero 区域** + +在浏览器中打开网站,检查 Hero 区域样式是否正确应用。 + +**Step 4: 提交更改** + +```bash +git add src/components/sections/hero-section.tsx +git commit -m "feat: 更新 Hero 区域设计 + +- 添加网格背景 +- 添加科技蓝和紫色光晕效果 +- 更新文案样式 +- 优化布局结构" +``` + +--- + +### Task 8: 创建粒子效果组件 + +**Files:** +- Create: `src/components/effects/particles.tsx` + +**Step 1: 创建粒子效果组件** + +```typescript +'use client'; + +import { useEffect, useRef } from 'react'; +import { motion } from 'framer-motion'; + +interface Particle { + x: number; + y: number; + size: number; + speedX: number; + speedY: number; + color: string; +} + +export function Particles() { + const canvasRef = useRef(null); + const particlesRef = useRef([]); + const animationRef = useRef(); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + const resizeCanvas = () => { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + }; + + resizeCanvas(); + window.addEventListener('resize', resizeCanvas); + + // 初始化粒子 + const particleCount = 50; + const colors = ['#00D9FF', '#A855F7', '#06B6D4']; + + for (let i = 0; i < particleCount; i++) { + particlesRef.current.push({ + x: Math.random() * canvas.width, + y: Math.random() * canvas.height, + size: Math.random() * 3 + 1, + speedX: (Math.random() - 0.5) * 0.5, + speedY: (Math.random() - 0.5) * 0.5, + color: colors[Math.floor(Math.random() * colors.length)], + }); + } + + const animate = () => { + ctx.clearRect(0, 0, canvas.width, canvas.height); + + particlesRef.current.forEach((particle) => { + particle.x += particle.speedX; + particle.y += particle.speedY; + + if (particle.x < 0 || particle.x > canvas.width) particle.speedX *= -1; + if (particle.y < 0 || particle.y > canvas.height) particle.speedY *= -1; + + ctx.beginPath(); + ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2); + ctx.fillStyle = particle.color; + ctx.fill(); + }); + + animationRef.current = requestAnimationFrame(animate); + }; + + animate(); + + return () => { + window.removeEventListener('resize', resizeCanvas); + if (animationRef.current) { + cancelAnimationFrame(animationRef.current); + } + }; + }, []); + + return ( + + ); +} +``` + +**Step 2: 在 Hero 区域中使用粒子效果** + +```typescript +import { Particles } from '@/components/effects/particles'; + +export function HeroSection() { + return ( +
+ + {/* 其他内容 */} +
+ ); +} +``` + +**Step 3: 测试粒子效果** + +在浏览器中打开网站,检查粒子效果是否正常运行。 + +**Step 4: 提交更改** + +```bash +git add src/components/effects/particles.tsx src/components/sections/hero-section.tsx +git commit -m "feat: 添加粒子效果组件 + +- 创建 Canvas 粒子动画 +- 使用科技蓝、紫色、青色粒子 +- 添加粒子漂浮动画 +- 在 Hero 区域中集成" +``` + +--- + +### Task 9: 创建数字计数动画组件 + +**Files:** +- Create: `src/components/effects/count-up.tsx` + +**Step 1: 创建数字计数动画组件** + +```typescript +'use client'; + +import { useEffect, useRef, useState } from 'react'; +import { useInView } from 'framer-motion'; + +interface CountUpProps { + end: number; + duration?: number; + prefix?: string; + suffix?: string; + className?: string; +} + +export function CountUp({ end, duration = 2000, prefix = '', suffix = '', className }: CountUpProps) { + const ref = useRef(null); + const isInView = useInView(ref, { once: true }); + const [count, setCount] = useState(0); + + useEffect(() => { + if (!isInView) return; + + let startTime: number; + let animationFrame: number; + + const animate = (currentTime: number) => { + if (!startTime) startTime = currentTime; + const progress = Math.min((currentTime - startTime) / duration, 1); + + setCount(Math.floor(progress * end)); + + if (progress < 1) { + animationFrame = requestAnimationFrame(animate); + } + }; + + animationFrame = requestAnimationFrame(animate); + + return () => { + if (animationFrame) { + cancelAnimationFrame(animationFrame); + } + }; + }, [isInView, end, duration]); + + return ( + + {prefix}{count.toLocaleString()}{suffix} + + ); +} +``` + +**Step 2: 在数据卡片中使用计数动画** + +```typescript +import { CountUp } from '@/components/effects/count-up'; + +export function DataCard() { + return ( +
+ +

服务客户

+
+ ); +} +``` + +**Step 3: 测试计数动画** + +在浏览器中打开网站,检查计数动画是否正常运行。 + +**Step 4: 提交更改** + +```bash +git add src/components/effects/count-up.tsx +git commit -m "feat: 添加数字计数动画组件 + +- 创建 CountUp 组件 +- 支持前缀、后缀 +- 支持自定义持续时间 +- 使用 Intersection Observer 触发" +``` + +--- + +## Phase 4: 动效与交互 + +### Task 10: 创建滚动揭示 Hook + +**Files:** +- Create: `src/hooks/use-scroll-reveal.ts` + +**Step 1: 创建滚动揭示 Hook** + +```typescript +import { useEffect, useRef, useState } from 'react'; + +export function useScrollReveal(threshold = 0.1) { + const ref = useRef(null); + const [isVisible, setIsVisible] = useState(false); + + useEffect(() => { + const element = ref.current; + if (!element) return; + + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting) { + setIsVisible(true); + observer.unobserve(element); + } + }, + { threshold } + ); + + observer.observe(element); + + return () => { + observer.unobserve(element); + }; + }, [threshold]); + + return { ref, isVisible }; +} +``` + +**Step 2: 创建滚动揭示组件** + +```typescript +'use client'; + +import { motion } from 'framer-motion'; +import { useScrollReveal } from '@/hooks/use-scroll-reveal'; + +interface ScrollRevealProps { + children: React.ReactNode; + className?: string; + delay?: number; +} + +export function ScrollReveal({ children, className, delay = 0 }: ScrollRevealProps) { + const { ref, isVisible } = useScrollReveal(); + + return ( + + {children} + + ); +} +``` + +**Step 3: 在页面中使用滚动揭示** + +```typescript +import { ScrollReveal } from '@/components/effects/scroll-reveal'; + +export function ProductsSection() { + return ( +
+ +

产品矩阵

+
+
+ {products.map((product, index) => ( + + + + ))} +
+
+ ); +} +``` + +**Step 4: 提交更改** + +```bash +git add src/hooks/use-scroll-reveal.ts src/components/effects/scroll-reveal.tsx +git commit -m "feat: 添加滚动揭示动效 + +- 创建 useScrollReveal Hook +- 创建 ScrollReveal 组件 +- 支持延迟动画 +- 使用 Intersection Observer" +``` + +--- + +### Task 11: 创建光晕脉动组件 + +**Files:** +- Create: `src/components/effects/glow-pulse.tsx` + +**Step 1: 创建光晕脉动组件** + +```typescript +'use client'; + +import { motion } from 'framer-motion'; + +interface GlowPulseProps { + color: 'blue' | 'purple'; + size?: number; + className?: string; +} + +export function GlowPulse({ color, size = 400, className }: GlowPulseProps) { + const colorValue = color === 'blue' ? '0, 217, 255' : '168, 85, 247'; + + return ( + + ); +} +``` + +**Step 2: 在 Hero 区域中使用光晕脉动** + +```typescript +import { GlowPulse } from '@/components/effects/glow-pulse'; + +export function HeroSection() { + return ( +
+ + + {/* 其他内容 */} +
+ ); +} +``` + +**Step 3: 提交更改** + +```bash +git add src/components/effects/glow-pulse.tsx +git commit -m "feat: 添加光晕脉动组件 + +- 创建 GlowPulse 组件 +- 支持蓝色和紫色光晕 +- 添加脉动动画 +- 可自定义大小" +``` + +--- + +## Phase 5: 响应式适配 + +### Task 12: 优化移动端导航 + +**Files:** +- Modify: `src/components/layout/mobile-menu.tsx` + +**Step 1: 更新移动端菜单样式** + +```typescript +import { motion } from 'framer-motion'; + +export function MobileMenu() { + return ( + +
+ {/* 菜单项 */} + +
+
+ ); +} +``` + +**Step 2: 测试移动端导航** + +在移动设备或浏览器开发者工具中测试移动端导航。 + +**Step 3: 提交更改** + +```bash +git add src/components/layout/mobile-menu.tsx +git commit -m "feat: 优化移动端导航 + +- 更新移动端菜单背景色 +- 添加滑入动画 +- 优化菜单项样式 +- 改善触摸体验" +``` + +--- + +### Task 13: 优化响应式布局 + +**Files:** +- Modify: `src/app/(marketing)/page.tsx` + +**Step 1: 更新首页响应式布局** + +```typescript +export default function HomePage() { + return ( +
+ {/* Hero */} +
+
+ {/* 内容 */} +
+
+ + {/* 产品矩阵 */} +
+
+
+ {/* 产品卡片 */} +
+
+
+
+ ); +} +``` + +**Step 2: 测试响应式布局** + +在不同设备尺寸下测试页面布局。 + +**Step 3: 提交更改** + +```bash +git add src/app/\(marketing\)/page.tsx +git commit -m "feat: 优化响应式布局 + +- 更新 Section 间距 +- 优化网格布局断点 +- 改善移动端体验 +- 统一内边距规范" +``` + +--- + +## Phase 6: 性能优化与测试 + +### Task 14: 添加性能监控 + +**Files:** +- Create: `src/components/analytics/performance-monitor.tsx` + +**Step 1: 创建性能监控组件** + +```typescript +'use client'; + +import { useEffect } from 'react'; + +export function PerformanceMonitor() { + useEffect(() => { + if (typeof window === 'undefined') return; + + // 监控 Web Vitals + const observer = new PerformanceObserver((list) => { + list.getEntries().forEach((entry) => { + console.log('[Performance]', entry.name, entry.duration); + }); + }); + + observer.observe({ entryTypes: ['measure', 'navigation'] }); + + return () => observer.disconnect(); + }, []); + + return null; +} +``` + +**Step 2: 在布局中添加性能监控** + +```typescript +import { PerformanceMonitor } from '@/components/analytics/performance-monitor'; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + {children} + + + ); +} +``` + +**Step 3: 提交更改** + +```bash +git add src/components/analytics/performance-monitor.tsx src/app/layout.tsx +git commit -m "feat: 添加性能监控 + +- 创建性能监控组件 +- 监控 Web Vitals 指标 +- 输出性能日志" +``` + +--- + +### Task 15: 运行性能测试 + +**Files:** +- Test: `e2e-tests/tests/test_performance.py` + +**Step 1: 运行 Lighthouse 测试** + +```bash +npx lighthouse http://localhost:3000 --output=json --output-path=./lighthouse-report.json +``` + +Expected: 性能分数 ≥ 90 + +**Step 2: 运行 E2E 性能测试** + +```bash +pytest e2e-tests/tests/test_performance.py -v +``` + +Expected: 所有测试通过 + +**Step 3: 提交测试报告** + +```bash +git add lighthouse-report.json +git commit -m "test: 添加性能测试报告 + +- 运行 Lighthouse 测试 +- 验证性能指标 +- 确保性能分数达标" +``` + +--- + +## 最终验收 + +### Task 16: 全面测试与验收 + +**Step 1: 运行所有测试** + +```bash +npm run build +npm run lint +pytest e2e-tests/ -v +``` + +Expected: 所有测试通过,无错误 + +**Step 2: 视觉验收** + +在浏览器中检查: +- 配色方案是否符合设计 +- 组件样式是否正确 +- 动效是否流畅 +- 响应式布局是否正常 + +**Step 3: 性能验收** + +检查 Lighthouse 报告: +- Performance ≥ 90 +- Accessibility ≥ 95 +- Best Practices ≥ 90 +- SEO ≥ 90 + +**Step 4: 提交最终版本** + +```bash +git add . +git commit -m "feat: 完成 Novalon 官网重新设计 + +✅ 核心配色系统升级 +✅ UI 组件更新 +✅ 页面布局优化 +✅ 动效与交互增强 +✅ 响应式适配完善 +✅ 性能优化完成 + +通过所有测试和验收标准" +``` + +--- + +## 总结 + +本实施计划将 Novalon 官网重新设计方案分解为 **16 个可执行任务**,每个任务都包含: + +- 明确的文件路径 +- 完整的代码实现 +- 具体的测试步骤 +- 清晰的提交信息 + +遵循 **TDD、DRY、YAGNI** 原则,确保高质量交付。 + +**预计完成时间:** 2-3 个工作日 + +**下一步:** 选择执行方式