From 2b74a83e72e58583ffce4877afba299b009ea7e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Sat, 21 Feb 2026 18:52:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=87=BD=E6=95=B0=E3=80=81=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=92=8C=E5=B8=B8=E9=87=8F=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit style: 优化.gitignore文件结构 test: 添加导航测试用例 docs: 删除旧版网站重设计文档 chore: 更新浏览器配置和设置管理 --- .gitignore | 233 +-- .../2026-02-12-website-redesign-design.md | 643 --------- ...13-website-redesign-implementation-plan.md | 1279 ----------------- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 181 bytes .../__pycache__/browsers.cpython-313.pyc | Bin 0 -> 9623 bytes .../__pycache__/settings.cpython-313.pyc | Bin 0 -> 13929 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 180 bytes .../__pycache__/base_page.cpython-313.pyc | Bin 0 -> 16189 bytes .../__pycache__/contact_page.cpython-313.pyc | Bin 0 -> 15883 bytes .../__pycache__/home_page.cpython-313.pyc | Bin 0 -> 19698 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 180 bytes .../conftest.cpython-313-pytest-8.3.3.pyc | Bin 0 -> 19407 bytes .../__pycache__/conftest.cpython-313.pyc | Bin 0 -> 16438 bytes ..._contact_form.cpython-313-pytest-8.3.3.pyc | Bin 0 -> 18282 bytes ...est_home_page.cpython-313-pytest-8.3.3.pyc | Bin 0 -> 21391 bytes ...st_navigation.cpython-313-pytest-8.3.3.pyc | Bin 0 -> 13166 bytes ...t_performance.cpython-313-pytest-8.3.3.pyc | Bin 0 -> 25896 bytes ...st_responsive.cpython-313-pytest-8.3.3.pyc | Bin 0 -> 21907 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 180 bytes .../data_generator.cpython-313.pyc | Bin 0 -> 24936 bytes .../utils/__pycache__/helpers.cpython-313.pyc | Bin 0 -> 32536 bytes .../utils/__pycache__/logger.cpython-313.pyc | Bin 0 -> 15051 bytes .../report_generator.cpython-313.pyc | Bin 0 -> 31235 bytes src/lib/colors.ts | 69 + src/lib/constants.ts | 323 +++++ src/lib/utils.ts | 6 + 26 files changed, 433 insertions(+), 2120 deletions(-) delete mode 100644 docs/plans/2026-02-12-website-redesign-design.md delete mode 100644 docs/plans/2026-02-13-website-redesign-implementation-plan.md create mode 100644 e2e-tests/config/__pycache__/__init__.cpython-313.pyc create mode 100644 e2e-tests/config/__pycache__/browsers.cpython-313.pyc create mode 100644 e2e-tests/config/__pycache__/settings.cpython-313.pyc create mode 100644 e2e-tests/pages/__pycache__/__init__.cpython-313.pyc create mode 100644 e2e-tests/pages/__pycache__/base_page.cpython-313.pyc create mode 100644 e2e-tests/pages/__pycache__/contact_page.cpython-313.pyc create mode 100644 e2e-tests/pages/__pycache__/home_page.cpython-313.pyc create mode 100644 e2e-tests/tests/__pycache__/__init__.cpython-313.pyc create mode 100644 e2e-tests/tests/__pycache__/conftest.cpython-313-pytest-8.3.3.pyc create mode 100644 e2e-tests/tests/__pycache__/conftest.cpython-313.pyc create mode 100644 e2e-tests/tests/__pycache__/test_contact_form.cpython-313-pytest-8.3.3.pyc create mode 100644 e2e-tests/tests/__pycache__/test_home_page.cpython-313-pytest-8.3.3.pyc create mode 100644 e2e-tests/tests/__pycache__/test_navigation.cpython-313-pytest-8.3.3.pyc create mode 100644 e2e-tests/tests/__pycache__/test_performance.cpython-313-pytest-8.3.3.pyc create mode 100644 e2e-tests/tests/__pycache__/test_responsive.cpython-313-pytest-8.3.3.pyc create mode 100644 e2e-tests/utils/__pycache__/__init__.cpython-313.pyc create mode 100644 e2e-tests/utils/__pycache__/data_generator.cpython-313.pyc create mode 100644 e2e-tests/utils/__pycache__/helpers.cpython-313.pyc create mode 100644 e2e-tests/utils/__pycache__/logger.cpython-313.pyc create mode 100644 e2e-tests/utils/__pycache__/report_generator.cpython-313.pyc create mode 100644 src/lib/colors.ts create mode 100644 src/lib/constants.ts create mode 100644 src/lib/utils.ts diff --git a/.gitignore b/.gitignore index 27df75c..0e12435 100644 --- a/.gitignore +++ b/.gitignore @@ -1,45 +1,33 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - # Dependencies -/node_modules -/.pnp +node_modules/ +.pnpm-store/ +.pnp/ .pnp.* .yarn/* !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/versions -.pnpm-store/ - -# Testing -/coverage -/.nyc_output # Next.js -/.next/ -/out/ -/dist/ -!.next/ -!dist/ +.next/ +out/ +.next/cache/ # Production -/build -/.cache +build/ +dist/ +.cache/ -# Misc -.DS_Store -*.pem -Thumbs.db +# Testing +coverage/ +.nyc_output/ -# Debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* -*-debug.log -*-error.log +# TypeScript +*.tsbuildinfo +next-env.d.ts -# Local env files +# Environment variables .env .env.local .env.development.local @@ -48,11 +36,15 @@ yarn-error.log* .env.*.local # Vercel -.vercel +.vercel/ -# TypeScript -*.tsbuildinfo -next-env.d.ts +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* # IDE .idea/ @@ -60,9 +52,6 @@ next-env.d.ts *.swp *.swo *~ -.project -.classpath -.settings/ *.sublime-workspace *.sublime-project @@ -72,184 +61,32 @@ next-env.d.ts ._* .Spotlight-V100 .Trashes -ehthumbs.db Thumbs.db +ehthumbs.db -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* +# Debug +*.pem # Runtime data -pids +pids/ *.pid *.seed *.pid.lock -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Dependency directories -node_modules/ - -# Optional eslint cache +# Optional npm cache .eslintcache - -# Optional REPL history .node_repl_history -# Output of 'npm pack' +# Build outputs *.tgz - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.production - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Storybook build outputs -storybook-static +*.local # Turbopack -.turbo +.turbo/ # Vite vite.config.ts.timestamp-* -dist-ssr -*.local +dist-ssr/ -# Rollup -dist -dist-ssr - -# PyTorch -*.pt -*.pth - -# Machine learning models -model.onnx -*.h5 -*.pb -saved_model/ - -# Python -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -Pipfile.lock - -# poetry -.poetry/ - -# pdm -.pdm.toml - -# PEP 582 -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# IDEs -.vscode/ -.idea/ -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -# macOS -.DS_Store -.AppleDouble -.LSOverride - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Optional additional ignore items -*.bak -*.backup -*.orig -*.rej -*.tmp -*~ +# Trae +.trae/ diff --git a/docs/plans/2026-02-12-website-redesign-design.md b/docs/plans/2026-02-12-website-redesign-design.md deleted file mode 100644 index 8291f3a..0000000 --- a/docs/plans/2026-02-12-website-redesign-design.md +++ /dev/null @@ -1,643 +0,0 @@ -# 睿新致远官网重设计方案 - -**文档版本:** v1.0 -**创建日期:** 2026-02-12 -**设计理念:** 印章文化×现代科技融合 - ---- - -## 一、项目背景与目标 - -### 1.1 项目背景 - -睿新致远(Novalon)是一家以技术创新为核心竞争力的软件公司,品牌以中国传统印章为核心视觉元素,印章采用经典中国红(#C41E3A),象征企业的稳健、专业与传承。 - -当前官网需要全面升级,在视觉冲击力、内容呈现方式、转化路径设计、移动端体验和技术实力展示等多个维度实现突破性提升。 - -### 1.2 核心目标 - -**目标用户群体:** 企业决策者(中高层管理者) - -**业务定位:** 技术创新型公司 - -**核心转化目标:** -1. 获取销售线索(咨询表单、预约演示) -2. 品牌认知建设(提升品牌知名度和行业影响力) -3. 展示技术实力(案例、技术博客、开源项目) - -**设计风格定位:** 混合创新风 - 结合品牌传统元素(印章)与现代设计,打造独特视觉识别 - -**技术优先级:** 极致性能优先 - 首屏加载速度、SEO优化、静态生成 - ---- - -## 二、信息架构设计 - -### 2.1 导航结构 - -基于企业决策者的浏览习惯,设计以下信息架构: - -**主导航:** -1. **首页** - 品牌印象+核心价值传达 -2. **解决方案** - 按行业/场景分类的解决方案展示 -3. **产品服务** - 技术产品和服务介绍 -4. **成功案例** - 客户案例和项目成果 -5. **技术洞察** - 技术博客/白皮书(展示技术实力) -6. **关于我们** - 公司介绍、团队、文化 -7. **联系我们** - 转化入口 - -**设计决策:** -- 将"解决方案"放在首位,符合企业决策者"先看能解决什么问题"的思维模式 -- "技术洞察"替代传统的"新闻动态",更符合技术创新型定位 -- 在每个页面都设置清晰的CTA按钮,引导用户进入"联系我们" - -### 2.2 转化路径设计 - -**主转化路径:** -浏览案例 → 了解解决方案 → 预约咨询 - -**次转化路径:** -阅读技术文章 → 下载白皮书 → 留下邮箱 - -**辅助转化:** -每个页面底部设置"快速咨询"浮动按钮 - ---- - -## 三、首页设计详解 - -### 3.1 Hero区域设计 - -**视觉概念:** 印章的数字化蜕变 - -**布局结构:** -- 左侧:超大标题"以技术创新,铸就卓越未来" + 副标题 + 双CTA按钮 -- 右侧:动态印章视觉装置 - -**印章动画设计(核心亮点):** -1. **初始状态**:传统红色印章,带有古典纹理和光影 -2. **滚动触发**:随着用户滚动,印章逐渐分解为红色粒子 -3. **粒子重组**:粒子重新组合成数字化网格/代码流形态 -4. **循环动画**:粒子在印章形态和数字形态之间缓慢呼吸式切换 - -**技术实现:** -- 使用Canvas或SVG实现粒子动画 -- 采用CSS变量控制动画速度,尊重用户偏好设置 -- 动画资源预加载,确保首屏流畅 -- 降级方案:不支持Canvas时显示静态印章图片 - -**配色方案:** -- 背景:深色渐变(#0F1419 → #1A1F2E) -- 主色:品牌红(#C41E3A)用于印章和CTA按钮 -- 辅助色:科技蓝(#3B82F6)用于粒子效果和装饰元素 -- 文字:白色主标题 + 浅灰副文本 - -**性能优化策略:** -- Hero区域优先加载,动画异步加载 -- 使用WebP格式图片,提供AVIF降级 -- 动画帧率控制在30fps,减少GPU压力 - -### 3.2 核心价值展示区 - -**设计理念:** 用数据说话,建立信任 - -**模块布局:** -- 四个核心指标卡片横向排列(响应式堆叠) -- 每个卡片包含:大数字 + 单位 + 说明文字 + 微动画 - -**指标示例:** -1. **10+年** 技术积累与沉淀 -2. **200+** 成功案例交付 -3. **50+** 技术专家团队 -4. **99.5%** 客户满意度 - -**视觉设计:** -- 卡片背景:半透明玻璃态效果 -- 数字动画:滚动到可视区域时,数字从0递增到目标值 -- 印章元素:每个卡片角落装饰小型印章图标 -- 悬停效果:卡片微微上浮,边框发光 - -### 3.3 解决方案预览区 - -**设计理念:** 场景化展示,快速建立共鸣 - -**布局结构:** -- 左侧:行业场景标签(可切换) -- 右侧:对应场景的解决方案卡片 - -**场景分类:** -- 金融科技 -- 智能制造 -- 数字化转型 -- 企业服务 - -**卡片设计:** -- 卡片包含:场景图标 + 标题 + 核心价值点 + "了解更多"按钮 -- 交互:点击卡片展开详情预览(不跳转页面) -- CTA:底部"查看全部解决方案"按钮 - -### 3.4 技术实力展示区 - -**设计理念:** 可视化技术栈,增强专业可信度 - -**展示方式:** -- 技术能力雷达图:展示技术广度和深度 -- 技术栈Logo墙:合作伙伴和核心技术展示 -- 技术博客预览:最新3篇技术文章卡片 - -**视觉亮点:** -- 雷达图使用品牌红渐变填充 -- Logo墙采用灰度处理,悬停时恢复彩色 -- 文章卡片包含:封面图 + 标题 + 摘要 + 阅读时间 - -### 3.5 成功案例精选区 - -**设计理念:** 用案例证明实力 - -**布局:** -- 网格布局展示6个精选案例 -- 每个案例卡片:客户Logo + 项目名称 + 核心成果 + 标签 - -**交互设计:** -- 悬停效果:卡片翻转显示更多详情 -- 筛选功能:按行业/技术类型筛选 -- CTA:"查看更多案例"按钮 - ---- - -## 四、关键内页设计 - -### 4.1 解决方案页面 - -**设计理念:** 场景化叙事,引导决策 - -**页面结构:** - -1. **Hero区域** - - 大标题:"为您的行业,定制专属解决方案" - - 行业场景选择器(图标+标签形式) - -2. **解决方案详情区** - - 左侧:痛点分析(用印章图标标记关键问题) - - 右侧:解决方案架构图(可交互的流程图) - -3. **核心价值区** - - 3-4个价值点卡片 - - 每个卡片:图标 + 标题 + 详细说明 + 数据支撑 - -4. **相关案例区** - - 该行业的成功案例展示 - - 包含客户评价和成果数据 - -**交互亮点:** -- 场景切换时,内容区域平滑过渡 -- 架构图支持悬停查看详情 -- 每个模块底部都有"预约咨询"CTA - -### 4.2 成功案例页面 - -**设计理念:** 用故事打动决策者 - -**页面布局:** - -1. **筛选导航** - - 按行业、技术类型、项目规模筛选 - - 使用印章风格的筛选标签 - -2. **案例卡片网格** - - 大卡片设计(更突出视觉效果) - - 包含:客户Logo + 项目封面 + 标题 + 核心成果 + 标签 - -3. **案例详情页** - - 项目背景 → 挑战与痛点 → 解决方案 → 实施过程 → 成果展示 - - 用时间线形式展示项目历程 - - 印章元素作为时间线节点装饰 - -**视觉特色:** -- 案例封面采用深色背景+品牌红点缀 -- 成果数据用大字号+动画展示 -- 客户评价区域使用印章作为引用标记 - -### 4.3 关于我们页面 - -**设计理念:** 展现团队实力与文化底蕴 - -**页面模块:** - -1. **品牌故事区** - - 印章文化解读:从传统印章到数字创新 - - 公司发展历程(时间线形式) - -2. **团队展示区** - - 核心团队成员卡片 - - 包含:头像 + 姓名 + 职位 + 专业领域 + 个人简介 - -3. **企业文化区** - - 企业价值观(用印章图标代表每个价值观) - - 团队活动照片墙 - -4. **资质荣誉区** - - 认证证书展示 - - 合作伙伴Logo墙 - -**视觉亮点:** -- 品牌故事区使用印章动画作为背景 -- 团队卡片采用玻璃态效果 -- 企业价值观用印章形态的图标呈现 - -### 4.4 联系我们页面 - -**设计理念:** 降低转化门槛,建立信任 - -**页面布局:** - -1. **快速联系区** - - 醒目的联系电话和邮箱 - - 在线咨询入口(集成第三方客服) - -2. **咨询表单区** - - 简洁的表单设计(仅必填项) - - 表单字段:姓名、公司、联系方式、需求描述 - - 印章风格的提交按钮 - -3. **公司信息区** - - 公司地址(集成地图) - - 办公环境照片 - - 交通指引 - -**转化优化:** -- 表单提交后显示感谢页面+下载白皮书入口 -- 提供多个联系方式选择(电话、邮件、表单) -- 添加"预约演示"选项 - ---- - -## 五、响应式设计与移动端体验 - -### 5.1 响应式布局策略 - -**断点设计:** -- 移动端:320px - 767px -- 平板:768px - 1023px -- 桌面:1024px - 1439px -- 大屏:1440px+ - -**移动端优先原则:** - -1. **导航设计** - - 移动端:汉堡菜单 + 底部固定导航栏 - - 印章Logo居中显示 - - CTA按钮固定在底部(始终可见) - -2. **Hero区域适配** - - 移动端:垂直布局,文字在上,印章动画在下 - - 印章动画简化:减少粒子数量,降低动画复杂度 - - 标题字号自适应:移动端48px → 桌面96px - -3. **卡片布局适配** - - 移动端:单列堆叠 - - 平板:双列网格 - - 桌面:三列或四列网格 - -### 5.2 移动端性能优化 - -**核心策略:** - -1. **图片优化** - - 使用响应式图片(srcset + sizes) - - 移动端加载小尺寸图片 - - WebP格式 + 懒加载 - -2. **动画降级** - - 检测设备性能,自动调整动画质量 - - 低端设备:禁用粒子动画,显示静态印章 - - 支持`prefers-reduced-motion`媒体查询 - -3. **字体加载** - - 使用`font-display: swap`避免FOIT - - 移动端加载字体子集(仅中文常用字) - -4. **代码分割** - - 路由级别代码分割 - - 第三方库按需加载 - - 移动端延迟加载非关键JS - -### 5.3 触摸交互优化 - -**移动端专属交互:** - -1. **手势支持** - - 案例卡片支持左右滑动浏览 - - 图片支持双指缩放 - - 下拉刷新(技术博客页面) - -2. **触摸反馈** - - 所有可点击元素添加触摸反馈效果 - - 使用品牌红色作为触摸高亮色 - - 按钮触摸区域不小于44×44px - -3. **表单优化** - - 输入框自动聚焦时页面滚动到可见区域 - - 使用原生日期选择器 - - 表单验证实时反馈 - -### 5.4 移动端转化优化 - -**关键设计:** - -1. **固定CTA按钮** - - 底部固定"立即咨询"按钮 - - 印章风格的按钮设计 - - 点击展开快速联系面板 - -2. **点击拨号** - - 电话号码可点击直接拨打 - - 邮件地址点击打开邮件应用 - -3. **简化表单** - - 移动端表单字段更精简 - - 支持语音输入 - - 自动填充优化 - ---- - -## 六、技术实现方案 - -### 6.1 组件架构设计 - -**基于现有技术栈的组件规划:** - -#### 核心组件库 -- `SealAnimation`: 印章粒子动画组件 -- `GlassCard`: 玻璃态卡片组件 -- `AnimatedNumber`: 数字递增动画组件 -- `SealIcon`: 印章风格图标组件 -- `CTAButton`: 品牌化CTA按钮组件 - -#### 布局组件 -- `MarketingLayout`: 营销页面通用布局 -- `Navigation`: 导航栏组件(响应式) -- `Footer`: 页脚组件 -- `FloatingCTA`: 浮动CTA按钮(移动端) - -#### 业务组件 -- `SolutionCard`: 解决方案卡片 -- `CaseStudyCard`: 案例卡片 -- `TeamMemberCard`: 团队成员卡片 -- `TechRadarChart`: 技术雷达图 -- `ContactForm`: 联系表单 - -### 6.2 性能优化策略 - -#### Next.js专项优化 - -1. **静态生成(SSG)** - - 所有营销页面使用静态生成 - - 使用`generateStaticParams`预生成动态路由 - - 构建时生成所有案例详情页 - -2. **图片优化** - - 使用Next.js `` 组件 - - 配置图片域名和尺寸 - - 自动WebP转换和懒加载 - -3. **字体优化** - - 使用`next/font`加载本地字体 - - 自动字体子集化 - - 预加载关键字体 - -**配置示例:** -```javascript -// next.config.js -const config = { - output: 'export', - images: { - unoptimized: true, // 静态导出时禁用优化 - formats: ['image/webp'], - }, - experimental: { - optimizeCss: true, - }, -} -``` - -### 6.3 动画实现方案 - -**性能优先的动画策略:** - -1. **印章粒子动画** - - 使用Canvas API实现 - - 使用`requestAnimationFrame`控制帧率 - - 支持`prefers-reduced-motion`降级 - - 移动端自动降低粒子数量 - -2. **滚动动画** - - 使用Intersection Observer API - - 仅在元素进入视口时触发动画 - - 使用CSS transforms(触发GPU加速) - -3. **微交互** - - 优先使用CSS transitions - - 复杂动画使用Framer Motion - - 避免布局抖动 - -**性能监控:** -```typescript -// 动画性能监控 -const checkAnimationPerformance = () => { - if (navigator.hardwareConcurrency < 4) { - return 'low' - } - return 'high' -} -``` - -### 6.4 SEO优化方案 - -#### 技术SEO - -1. **元数据管理** - - 每个页面配置独立的metadata - - 动态生成Open Graph标签 - - 结构化数据(JSON-LD) - -2. **站点地图** - - 自动生成sitemap.xml - - 配置robots.txt - - 规范化URL - -3. **性能指标** - - 目标:LCP < 2.5s, FID < 100ms, CLS < 0.1 - - 使用Next.js内置的性能监控 - - 集成Google Core Web Vitals - -**代码示例:** -```typescript -// app/(marketing)/page.tsx -export const metadata: Metadata = { - title: '睿新致远 - 技术创新驱动数字化转型', - description: '睿新致远是一家专注于技术创新的软件公司...', - openGraph: { - title: '睿新致远 - 技术创新驱动数字化转型', - description: '...', - images: ['/og-image.png'], - }, -} -``` - -### 6.5 数据管理方案 - -#### 内容管理策略 - -1. **静态内容** - - 直接写在组件中 - - 使用TypeScript类型约束 - -2. **动态内容(案例、博客)** - - 使用Markdown文件管理 - - 构建时解析为静态数据 - - 支持前端matter解析 - -3. **表单处理** - - 集成第三方表单服务(如Formspree) - - 或使用Next.js API Routes - - 表单验证使用Zod - -**文件结构:** -``` -content/ - cases/ - case-1.md - case-2.md - blog/ - article-1.md - article-2.md -``` - ---- - -## 七、实施路径与预期效果 - -### 7.1 实施路径规划 - -**分阶段交付策略:** - -#### 阶段一:基础架构搭建(1-2周) -- 建立组件库和设计系统 -- 实现响应式布局框架 -- 配置性能优化基础设施 -- 完成导航和页脚组件 - -#### 阶段二:核心页面开发(2-3周) -- 首页Hero区域+印章动画 -- 解决方案页面 -- 成功案例列表页 -- 联系我们页面 - -#### 阶段三:内容完善(1-2周) -- 案例详情页 -- 关于我们页面 -- 技术博客系统 -- 表单集成和测试 - -#### 阶段四:优化与上线(1周) -- 性能优化和测试 -- SEO优化 -- 多设备测试 -- 正式上线部署 - -### 7.2 预期效果评估 - -#### 品牌提升效果 - -1. **视觉识别度提升60%** - - 独特的印章×科技融合设计 - - 差异化竞争优势明显 - - 品牌记忆点突出 - -2. **专业形象强化** - - 技术实力可视化展示 - - 案例和数据的说服力 - - 符合企业决策者审美 - -#### 业务转化效果 - -1. **转化率提升预期:30-50%** - - 清晰的转化路径设计 - - 多触点CTA布局 - - 降低咨询门槛 - -2. **用户停留时间增加:40%** - - 吸引人的视觉设计 - - 有价值的内容呈现 - - 流畅的浏览体验 - -#### 技术性能指标 - -1. **性能指标达标** - - LCP < 2.5秒 - - FID < 100毫秒 - - CLS < 0.1 - - 移动端首屏加载 < 3秒 - -2. **SEO优化效果** - - 搜索引擎收录率100% - - 核心关键词排名提升 - - 结构化数据完整 - -### 7.3 风险控制与应对 - -**潜在风险:** - -1. **动画性能风险** - - 应对:提供降级方案,低端设备自动禁用复杂动画 - -2. **开发周期风险** - - 应对:采用分阶段交付,优先核心功能 - -3. **内容准备风险** - - 应对:提前规划内容需求,提供内容模板 - -### 7.4 后续优化方向 - -**持续改进计划:** - -1. **数据分析驱动优化** - - 集成Google Analytics 4 - - 用户行为热力图分析 - - A/B测试关键页面 - -2. **内容运营支持** - - 定期更新技术博客 - - 添加新案例展示 - - 优化SEO关键词 - -3. **功能扩展预留** - - 多语言支持(国际化) - - 客户案例视频展示 - - 在线演示预约系统 - ---- - -## 八、总结 - -### 8.1 核心优势 - -本"印章文化×现代科技融合方案"将: - -✅ **完美融合品牌传统与现代科技**,打造独特的视觉识别 -✅ **针对企业决策者优化**,提升转化率和用户体验 -✅ **极致性能优先**,确保快速加载和SEO友好 -✅ **全面升级各个维度**,实现品牌、转化、技术实力的全面提升 - -### 8.2 差异化竞争优势 - -1. **文化底蕴深厚**:印章元素不仅是视觉符号,更是品牌精神的载体 -2. **技术创新突出**:粒子动画、数据可视化等现代技术手段展现技术实力 -3. **用户体验优先**:性能优化、响应式设计、转化路径优化贯穿始终 -4. **可执行性强**:分阶段实施、风险可控、效果可量化 - ---- - -**文档状态:** 已完成 -**下一步行动:** 进入实施阶段,启动基础架构搭建 diff --git a/docs/plans/2026-02-13-website-redesign-implementation-plan.md b/docs/plans/2026-02-13-website-redesign-implementation-plan.md deleted file mode 100644 index 191b205..0000000 --- a/docs/plans/2026-02-13-website-redesign-implementation-plan.md +++ /dev/null @@ -1,1279 +0,0 @@ -# 睿新致远官网重构实施计划 - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** 基于优秀案例参考,全面升级睿新致远官网,融合印章文化与现代科技,提升品牌形象和转化率 - -**Architecture:** 采用 Next.js 16 App Router + React 19 + TypeScript 技术栈,基于现有组件库扩展,优化 Hero 区域印章动画,新增技术洞察板块和客户评价模块,全面提升用户体验和转化路径 - -**Tech Stack:** Next.js 16.1.6, React 19.2.3, TypeScript 5, Tailwind CSS v4, Framer Motion 12.29.2, shadcn/ui - ---- - -## 实施策略 - -### 优先级说明 - -**P0(核心功能)** - 必须完成,直接影响品牌形象和转化 -**P1(重要功能)** - 显著提升用户体验和专业度 -**P2(增强功能)** - 锦上添花,可后续迭代 - -### 开发原则 - -- **TDD(测试驱动开发)**:先写测试,再写实现 -- **DRY(不重复)**:复用现有组件和工具函数 -- **YAGNI(不过度设计)**:只实现当前需要的功能 -- **频繁提交**:每个小功能点独立提交 -- **性能优先**:关注 LCP、FID、CLS 指标 - ---- - -## Phase 1: P0 核心功能优化(预计 5-7 天) - -### Task 1: 优化印章粒子动画组件 - -**目标:** 增强印章粒子动画的视觉效果和交互体验 - -**Files:** -- Modify: `src/components/effects/seal-particle.tsx` -- Create: `src/components/effects/seal-animation-enhanced.tsx` -- Test: `src/components/effects/__tests__/seal-animation-enhanced.test.tsx` - -**Step 1: 创建增强版印章动画组件** - -创建文件:`src/components/effects/seal-animation-enhanced.tsx` - -```typescript -'use client'; - -import { useEffect, useRef, useCallback, useState } from 'react'; - -interface Particle { - x: number; - y: number; - targetX: number; - targetY: number; - vx: number; - vy: number; - size: number; - opacity: number; - color: string; - life: number; - maxLife: number; - stage: 'idle' | 'dispersing' | 'reforming'; -} - -interface SealAnimationEnhancedProps { - width?: number; - height?: number; - particleCount?: number; - colors?: string[]; - sealText?: string; - animationStages?: boolean; - onStageChange?: (stage: string) => void; - className?: string; -} - -export function SealAnimationEnhanced({ - width = 300, - height = 300, - particleCount = 150, - colors = ['#C41E3A', '#D4A574', '#8B4513'], - sealText = '睿新', - animationStages = true, - onStageChange, - className = '', -}: SealAnimationEnhancedProps) { - const canvasRef = useRef(null); - const particlesRef = useRef([]); - const animationRef = useRef(null); - const [currentStage, setCurrentStage] = useState<'idle' | 'dispersing' | 'reforming'>('idle'); - const stageTimerRef = useRef(null); - - const createSealShape = useCallback((width: number, height: number) => { - const centerX = width / 2; - const centerY = height / 2; - const sealSize = Math.min(width, height) * 0.35; - const particles: { x: number; y: number }[] = []; - - // 创建印章形状的粒子位置(简化版方形印章) - for (let i = 0; i < particleCount; i++) { - const angle = (i / particleCount) * Math.PI * 2; - const radius = sealSize * (0.8 + Math.random() * 0.4); - particles.push({ - x: centerX + Math.cos(angle) * radius * (Math.random() > 0.5 ? 1 : 0.8), - y: centerY + Math.sin(angle) * radius * (Math.random() > 0.5 ? 1 : 0.8), - }); - } - - return particles; - }, [particleCount]); - - const createParticle = useCallback( - (x: number, y: number, targetX: number, targetY: number): Particle => { - const color = colors[Math.floor(Math.random() * colors.length)]; - const size = 2 + Math.random() * 3; - const maxLife = 200 + Math.random() * 100; - - return { - x, - y, - targetX, - targetY, - vx: (Math.random() - 0.5) * 2, - vy: (Math.random() - 0.5) * 2, - size, - opacity: 0.6 + Math.random() * 0.4, - color, - life: 0, - maxLife, - stage: 'idle', - }; - }, - [colors] - ); - - useEffect(() => { - const canvas = canvasRef.current; - if (!canvas) return; - - const ctx = canvas.getContext('2d'); - if (!ctx) return; - - canvas.width = width; - canvas.height = height; - - const sealPositions = createSealShape(width, height); - particlesRef.current = sealPositions.map((pos, i) => - createParticle(pos.x, pos.y, pos.x, pos.y) - ); - - // 动画阶段控制 - if (animationStages) { - // 3秒后开始分散 - stageTimerRef.current = setTimeout(() => { - setCurrentStage('dispersing'); - onStageChange?.('dispersing'); - - particlesRef.current.forEach(p => { - p.vx = (Math.random() - 0.5) * 4; - p.vy = (Math.random() - 0.5) * 4; - p.stage = 'dispersing'; - }); - - // 2秒后开始重组 - setTimeout(() => { - setCurrentStage('reforming'); - onStageChange?.('reforming'); - - particlesRef.current.forEach(p => { - p.stage = 'reforming'; - }); - - // 3秒后回到idle - setTimeout(() => { - setCurrentStage('idle'); - onStageChange?.('idle'); - }, 3000); - }, 2000); - }, 3000); - } - - const animate = () => { - ctx.clearRect(0, 0, width, height); - - particlesRef.current.forEach((particle) => { - if (particle.stage === 'reforming') { - // 向目标位置移动 - const dx = particle.targetX - particle.x; - const dy = particle.targetY - particle.y; - particle.vx += dx * 0.02; - particle.vy += dy * 0.02; - particle.vx *= 0.95; - particle.vy *= 0.95; - } - - particle.x += particle.vx; - particle.y += particle.vy; - particle.life++; - - // 绘制粒子 - ctx.beginPath(); - ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2); - ctx.fillStyle = particle.color; - ctx.globalAlpha = particle.opacity; - ctx.fill(); - ctx.globalAlpha = 1; - }); - - animationRef.current = requestAnimationFrame(animate); - }; - - animate(); - - return () => { - if (animationRef.current) { - cancelAnimationFrame(animationRef.current); - } - if (stageTimerRef.current) { - clearTimeout(stageTimerRef.current); - } - }; - }, [width, height, createSealShape, createParticle, animationStages, onStageChange]); - - return ( - - ); -} -``` - -**Step 2: 创建测试文件** - -创建文件:`src/components/effects/__tests__/seal-animation-enhanced.test.tsx` - -```typescript -import { render, screen } from '@testing-library/react'; -import { SealAnimationEnhanced } from '../seal-animation-enhanced'; - -describe('SealAnimationEnhanced', () => { - it('should render canvas element', () => { - render(); - const canvas = screen.getByRole('img'); - expect(canvas).toBeInTheDocument(); - }); - - it('should accept custom props', () => { - const { container } = render( - - ); - const canvas = container.querySelector('canvas'); - expect(canvas).toHaveAttribute('width', '400'); - expect(canvas).toHaveAttribute('height', '400'); - }); - - it('should call onStageChange callback', (done) => { - const handleStageChange = (stage: string) => { - expect(stage).toBe('dispersing'); - done(); - }; - - render( - - ); - }); -}); -``` - -**Step 3: 运行测试** - -```bash -npm test src/components/effects/__tests__/seal-animation-enhanced.test.tsx -``` - -Expected: PASS - -**Step 4: 提交代码** - -```bash -git add src/components/effects/seal-animation-enhanced.tsx -git add src/components/effects/__tests__/seal-animation-enhanced.test.tsx -git commit -m "feat: add enhanced seal animation component with stages" -``` - ---- - -### Task 2: 更新 Hero Section 使用增强版印章动画 - -**目标:** 在 Hero 区域集成增强版印章动画,提升视觉冲击力 - -**Files:** -- Modify: `src/components/sections/hero-section.tsx` -- Create: `src/lib/constants.ts` (如果不存在) - -**Step 1: 检查并创建 constants 文件** - -检查文件是否存在:`src/lib/constants.ts` - -如果不存在,创建: - -```typescript -export const COMPANY_INFO = { - name: '睿新致远', - slogan: '以技术创新,铸就卓越未来', - description: '专注于数字化转型与技术创新,为企业提供全方位的技术解决方案', - foundedYear: 2014, - teamSize: '50+', -}; - -export const STATS = [ - { value: '10+', label: '年技术积累' }, - { value: '200+', label: '成功案例' }, - { value: '50+', label: '技术专家' }, - { value: '99.5%', label: '客户满意度' }, -]; - -export const NAV_LINKS = [ - { href: '#home', label: '首页' }, - { href: '#solutions', label: '解决方案' }, - { href: '#cases', label: '成功案例' }, - { href: '#about', label: '关于我们' }, - { href: '#contact', label: '联系我们' }, -]; -``` - -**Step 2: 更新 Hero Section** - -修改文件:`src/components/sections/hero-section.tsx` - -在文件顶部添加导入: - -```typescript -import { SealAnimationEnhanced } from '@/components/effects/seal-animation-enhanced'; -``` - -在 Hero Section 组件中,找到现有的 `SealParticle` 组件,替换为: - -```typescript -{/* 增强版印章动画 */} -
- console.log('Animation stage:', stage)} - className="opacity-80" - /> -
-``` - -**Step 3: 测试更新后的 Hero Section** - -```bash -npm run dev -``` - -访问 http://localhost:3000,检查: -- 印章动画是否正常显示 -- 动画阶段是否按预期切换(idle → dispersing → reforming → idle) -- 移动端是否隐藏动画(lg:block) - -**Step 4: 提交代码** - -```bash -git add src/components/sections/hero-section.tsx -git add src/lib/constants.ts -git commit -m "feat: integrate enhanced seal animation in hero section" -``` - ---- - -### Task 3: 创建技术洞察卡片组件 - -**目标:** 创建可复用的技术洞察卡片组件,用于展示技术文章和白皮书 - -**Files:** -- Create: `src/components/ui/insight-card.tsx` -- Create: `src/components/ui/__tests__/insight-card.test.tsx` - -**Step 1: 创建 InsightCard 组件** - -创建文件:`src/components/ui/insight-card.tsx` - -```typescript -'use client'; - -import { Calendar, Clock, ArrowRight } from 'lucide-react'; -import { Badge } from '@/components/ui/badge'; - -export interface InsightCardProps { - title: string; - excerpt: string; - category: string; - readTime: string; - publishedAt: string; - imageUrl?: string; - href: string; - featured?: boolean; -} - -export function InsightCard({ - title, - excerpt, - category, - readTime, - publishedAt, - imageUrl, - href, - featured = false, -}: InsightCardProps) { - return ( -
- {imageUrl && ( -
- {title} -
-
- )} - -
-
- - {category} - -
- - {readTime} -
-
- -

- {title} -

- -

- {excerpt} -

- -
-
- - {publishedAt} -
- - - 阅读更多 - - -
-
-
- ); -} -``` - -**Step 2: 创建测试文件** - -创建文件:`src/components/ui/__tests__/insight-card.test.tsx` - -```typescript -import { render, screen } from '@testing-library/react'; -import { InsightCard } from '../insight-card'; - -describe('InsightCard', () => { - const defaultProps = { - title: '测试文章标题', - excerpt: '这是一篇测试文章的摘要内容', - category: '技术洞察', - readTime: '5 分钟', - publishedAt: '2026-02-13', - href: '/insights/test-article', - }; - - it('should render card with all props', () => { - render(); - - expect(screen.getByText('测试文章标题')).toBeInTheDocument(); - expect(screen.getByText('这是一篇测试文章的摘要内容')).toBeInTheDocument(); - expect(screen.getByText('技术洞察')).toBeInTheDocument(); - expect(screen.getByText('5 分钟')).toBeInTheDocument(); - expect(screen.getByText('2026-02-13')).toBeInTheDocument(); - }); - - it('should render image when imageUrl provided', () => { - render( - - ); - - const image = screen.getByRole('img'); - expect(image).toHaveAttribute('src', '/test-image.jpg'); - }); - - it('should have correct link href', () => { - render(); - - const link = screen.getByRole('link', { name: /阅读更多/i }); - expect(link).toHaveAttribute('href', '/insights/test-article'); - }); - - it('should apply featured class when featured prop is true', () => { - const { container } = render( - - ); - - const article = container.querySelector('article'); - expect(article).toHaveClass('md:col-span-2'); - }); -}); -``` - -**Step 3: 运行测试** - -```bash -npm test src/components/ui/__tests__/insight-card.test.tsx -``` - -Expected: PASS - -**Step 4: 提交代码** - -```bash -git add src/components/ui/insight-card.tsx -git add src/components/ui/__tests__/insight-card.test.tsx -git commit -m "feat: add insight card component for tech insights section" -``` - ---- - -### Task 4: 创建技术洞察板块组件 - -**目标:** 创建完整的技术洞察板块,展示最新技术文章和白皮书 - -**Files:** -- Create: `src/components/sections/insights-section.tsx` -- Create: `src/components/sections/__tests__/insights-section.test.tsx` -- Modify: `src/app/(marketing)/page.tsx` - -**Step 1: 创建 InsightsSection 组件** - -创建文件:`src/components/sections/insights-section.tsx` - -```typescript -'use client'; - -import { useEffect, useState, useRef } from 'react'; -import { InsightCard } from '@/components/ui/insight-card'; -import { Button } from '@/components/ui/button'; -import { ArrowRight } from 'lucide-react'; - -interface Insight { - id: string; - title: string; - excerpt: string; - category: string; - readTime: string; - publishedAt: string; - imageUrl?: string; - href: string; - featured?: boolean; -} - -const MOCK_INSIGHTS: Insight[] = [ - { - id: '1', - title: '2025年技术趋势:AI驱动的数字化转型', - excerpt: '深入探讨人工智能如何重塑企业技术架构,以及如何把握AI时代的机遇', - category: '技术趋势', - readTime: '8 分钟', - publishedAt: '2026-02-10', - imageUrl: '/insights/ai-trend.jpg', - href: '/insights/ai-trend-2025', - featured: true, - }, - { - id: '2', - title: '微服务架构最佳实践指南', - excerpt: '从单体应用到微服务的演进之路,包含实战案例和避坑指南', - category: '架构设计', - readTime: '12 分钟', - publishedAt: '2026-02-08', - imageUrl: '/insights/microservices.jpg', - href: '/insights/microservices-best-practices', - }, - { - id: '3', - title: '云原生技术栈选型指南', - excerpt: 'Kubernetes、Docker、Service Mesh等技术栈的深度对比与选型建议', - category: '云原生', - readTime: '10 分钟', - publishedAt: '2026-02-05', - imageUrl: '/insights/cloud-native.jpg', - href: '/insights/cloud-native-stack-guide', - }, -]; - -export function InsightsSection() { - const [isVisible, setIsVisible] = useState(false); - const sectionRef = useRef(null); - - useEffect(() => { - const observer = new IntersectionObserver( - ([entry]) => { - if (entry.isIntersecting) { - setIsVisible(true); - } - }, - { threshold: 0.1 } - ); - - if (sectionRef.current) { - observer.observe(sectionRef.current); - } - - return () => observer.disconnect(); - }, []); - - return ( -
-
-
-

- 技术洞察 -

-

- 分享前沿技术趋势、最佳实践和深度思考,助力企业数字化转型 -

-
- -
- {MOCK_INSIGHTS.map((insight) => ( - - ))} -
- -
- -
-
-
- ); -} -``` - -**Step 2: 创建测试文件** - -创建文件:`src/components/sections/__tests__/insights-section.test.tsx` - -```typescript -import { render, screen } from '@testing-library/react'; -import { InsightsSection } from '../insights-section'; - -describe('InsightsSection', () => { - it('should render section with title', () => { - render(); - - expect(screen.getByText('技术洞察')).toBeInTheDocument(); - expect(screen.getByText(/分享前沿技术趋势/)).toBeInTheDocument(); - }); - - it('should render insight cards', () => { - render(); - - expect(screen.getByText('2025年技术趋势:AI驱动的数字化转型')).toBeInTheDocument(); - expect(screen.getByText('微服务架构最佳实践指南')).toBeInTheDocument(); - expect(screen.getByText('云原生技术栈选型指南')).toBeInTheDocument(); - }); - - it('should render view all button', () => { - render(); - - expect(screen.getByText('查看全部洞察')).toBeInTheDocument(); - }); -}); -``` - -**Step 3: 更新首页集成技术洞察板块** - -修改文件:`src/app/(marketing)/page.tsx` - -在导入部分添加: - -```typescript -import { InsightsSection } from '@/components/sections/insights-section'; -``` - -在 `HomePage` 组件中,在 `` 之前添加: - -```typescript - -``` - -**Step 4: 测试集成效果** - -```bash -npm run dev -``` - -访问 http://localhost:3000,检查: -- 技术洞察板块是否正确显示 -- 卡片布局是否响应式 -- 滚动动画是否触发 - -**Step 5: 提交代码** - -```bash -git add src/components/sections/insights-section.tsx -git add src/components/sections/__tests__/insights-section.test.tsx -git add src/app/(marketing)/page.tsx -git commit -m "feat: add insights section to homepage" -``` - ---- - -### Task 5: 创建客户评价组件 - -**目标:** 创建客户评价展示组件,增强社会证明 - -**Files:** -- Create: `src/components/ui/testimonial-card.tsx` -- Create: `src/components/sections/testimonials-section.tsx` -- Modify: `src/app/(marketing)/page.tsx` - -**Step 1: 创建 TestimonialCard 组件** - -创建文件:`src/components/ui/testimonial-card.tsx` - -```typescript -'use client'; - -import { Quote } from 'lucide-react'; - -export interface TestimonialCardProps { - quote: string; - author: string; - position: string; - company: string; - avatarUrl?: string; - rating?: number; -} - -export function TestimonialCard({ - quote, - author, - position, - company, - avatarUrl, - rating = 5, -}: TestimonialCardProps) { - return ( -
- - - {rating > 0 && ( -
- {Array.from({ length: rating }).map((_, i) => ( - - - - ))} -
- )} - -
- "{quote}" -
- -
- {avatarUrl && ( - {author} - )} -
-
{author}
-
- {position} · {company} -
-
-
-
- ); -} -``` - -**Step 2: 创建 TestimonialsSection 组件** - -创建文件:`src/components/sections/testimonials-section.tsx` - -```typescript -'use client'; - -import { useEffect, useState, useRef } from 'react'; -import { TestimonialCard } from '@/components/ui/testimonial-card'; - -interface Testimonial { - id: string; - quote: string; - author: string; - position: string; - company: string; - avatarUrl?: string; - rating?: number; -} - -const MOCK_TESTIMONIALS: Testimonial[] = [ - { - id: '1', - quote: '睿新致远团队的专业能力和服务态度让我们印象深刻,他们不仅交付了高质量的产品,还帮助我们建立了完善的技术体系。', - author: '张总', - position: 'CTO', - company: '某金融科技公司', - rating: 5, - }, - { - id: '2', - quote: '在与睿新致远的合作中,我们感受到了他们对技术创新的执着追求。他们提供的解决方案极大地提升了我们的业务效率。', - author: '李经理', - position: '技术总监', - company: '某制造企业', - rating: 5, - }, - { - id: '3', - quote: '感谢睿新致远团队的专业支持,他们帮助我们完成了数字化转型的关键一步,为未来的发展奠定了坚实基础。', - author: '王总', - position: '总经理', - company: '某零售集团', - rating: 5, - }, -]; - -export function TestimonialsSection() { - const [isVisible, setIsVisible] = useState(false); - const sectionRef = useRef(null); - - useEffect(() => { - const observer = new IntersectionObserver( - ([entry]) => { - if (entry.isIntersecting) { - setIsVisible(true); - } - }, - { threshold: 0.1 } - ); - - if (sectionRef.current) { - observer.observe(sectionRef.current); - } - - return () => observer.disconnect(); - }, []); - - return ( -
-
-
-

- 客户评价 -

-

- 听听我们的客户怎么说 -

-
- -
- {MOCK_TESTIMONIALS.map((testimonial) => ( - - ))} -
-
-
- ); -} -``` - -**Step 3: 更新首页集成客户评价板块** - -修改文件:`src/app/(marketing)/page.tsx` - -在导入部分添加: - -```typescript -import { TestimonialsSection } from '@/components/sections/testimonials-section'; -``` - -在 `HomePage` 组件中,在 `` 之前添加: - -```typescript - -``` - -**Step 4: 测试集成效果** - -```bash -npm run dev -``` - -访问 http://localhost:3000,检查客户评价板块是否正确显示 - -**Step 5: 提交代码** - -```bash -git add src/components/ui/testimonial-card.tsx -git add src/components/sections/testimonials-section.tsx -git add src/app/(marketing)/page.tsx -git commit -m "feat: add testimonials section to homepage" -``` - ---- - -### Task 6: 优化联系表单 - -**目标:** 优化联系表单的用户体验和验证逻辑 - -**Files:** -- Modify: `src/components/sections/contact-section.tsx` -- Create: `src/lib/validations/contact.ts` - -**Step 1: 创建表单验证逻辑** - -创建文件:`src/lib/validations/contact.ts` - -```typescript -import { z } from 'zod'; - -export const contactFormSchema = z.object({ - name: z - .string() - .min(2, '姓名至少需要2个字符') - .max(50, '姓名不能超过50个字符'), - company: z - .string() - .min(2, '公司名称至少需要2个字符') - .max(100, '公司名称不能超过100个字符'), - email: z - .string() - .email('请输入有效的邮箱地址'), - phone: z - .string() - .regex(/^1[3-9]\d{9}$/, '请输入有效的手机号码') - .optional() - .or(z.literal('')), - message: z - .string() - .min(10, '留言内容至少需要10个字符') - .max(500, '留言内容不能超过500个字符'), -}); - -export type ContactFormData = z.infer; - -export function validateContactForm(data: unknown) { - return contactFormSchema.safeParse(data); -} -``` - -**Step 2: 更新 ContactSection 组件** - -修改文件:`src/components/sections/contact-section.tsx` - -添加表单验证和提交逻辑(具体代码根据现有实现调整) - -**Step 3: 测试表单验证** - -```bash -npm run dev -``` - -测试各种表单输入场景 - -**Step 4: 提交代码** - -```bash -git add src/lib/validations/contact.ts -git add src/components/sections/contact-section.tsx -git commit -m "feat: add form validation to contact section" -``` - ---- - -## Phase 2: P1 重要功能优化(预计 3-4 天) - -### Task 7: 优化移动端体验 - -**目标:** 优化移动端的导航、动画和性能 - -**Files:** -- Modify: `src/components/layout/header.tsx` -- Modify: `src/components/effects/seal-particle.tsx` -- Create: `src/hooks/use-device-performance.ts` - -**Step 1: 创建设备性能检测 Hook** - -创建文件:`src/hooks/use-device-performance.ts` - -```typescript -'use client'; - -import { useState, useEffect } from 'react'; - -export type PerformanceLevel = 'low' | 'medium' | 'high'; - -export function useDevicePerformance(): PerformanceLevel { - const [performance, setPerformance] = useState('high'); - - useEffect(() => { - // 检测设备性能 - const checkPerformance = () => { - // 检查 CPU 核心数 - const cores = navigator.hardwareConcurrency || 4; - - // 检查设备内存(如果可用) - const memory = (navigator as any).deviceMemory || 8; - - // 检查是否为移动设备 - const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ); - - // 检查是否启用了减少动画 - const prefersReducedMotion = window.matchMedia( - '(prefers-reduced-motion: reduce)' - ).matches; - - if (prefersReducedMotion) { - setPerformance('low'); - } else if (isMobile && (cores < 4 || memory < 4)) { - setPerformance('low'); - } else if (isMobile || cores < 8) { - setPerformance('medium'); - } else { - setPerformance('high'); - } - }; - - checkPerformance(); - }, []); - - return performance; -} -``` - -**Step 2: 更新印章动画组件以支持性能降级** - -修改文件:`src/components/effects/seal-particle.tsx` - -添加性能检测和降级逻辑 - -**Step 3: 优化移动端导航** - -修改文件:`src/components/layout/header.tsx` - -优化移动端菜单交互 - -**Step 4: 测试移动端体验** - -```bash -npm run dev -``` - -使用浏览器开发者工具测试移动端显示效果 - -**Step 5: 提交代码** - -```bash -git add src/hooks/use-device-performance.ts -git add src/components/effects/seal-particle.tsx -git add src/components/layout/header.tsx -git commit -m "feat: optimize mobile experience with performance detection" -``` - ---- - -### Task 8: 添加案例详情页优化 - -**目标:** 优化案例详情页的展示效果和用户体验 - -**Files:** -- Modify: `src/app/(marketing)/cases/[slug]/page.tsx` (如果存在) -- Create: `src/components/ui/case-detail-card.tsx` - -**Step 1: 创建案例详情卡片组件** - -创建文件:`src/components/ui/case-detail-card.tsx` - -**Step 2: 优化案例详情页布局** - -修改案例详情页文件 - -**Step 3: 测试案例详情页** - -**Step 4: 提交代码** - ---- - -## Phase 3: P2 增强功能(预计 2-3 天) - -### Task 9: 添加深色模式支持 - -**目标:** 实现深色/浅色主题切换 - -**Files:** -- Create: `src/components/ui/theme-toggle.tsx` -- Modify: `src/app/layout.tsx` -- Modify: `src/app/globals.css` - -**Step 1: 创建主题切换组件** - -**Step 2: 更新全局样式** - -**Step 3: 测试主题切换** - -**Step 4: 提交代码** - ---- - -### Task 10: 性能优化和测试 - -**目标:** 全面优化性能指标,确保达到预期目标 - -**Files:** -- Modify: `next.config.ts` -- Create: `tests/performance/lighthouse.test.ts` - -**Step 1: 配置性能优化** - -**Step 2: 运行 Lighthouse 测试** - -**Step 3: 优化关键指标** - -**Step 4: 提交代码** - ---- - -## 验收标准 - -### 功能验收 - -- [ ] Hero 区域印章动画正常工作,支持多阶段动画 -- [ ] 技术洞察板块正确展示,响应式布局良好 -- [ ] 客户评价板块正常显示,星级评分准确 -- [ ] 联系表单验证逻辑正确,错误提示清晰 -- [ ] 移动端体验流畅,动画降级正常 - -### 性能验收 - -- [ ] LCP < 2.5秒 -- [ ] FID < 100毫秒 -- [ ] CLS < 0.1 -- [ ] 移动端首屏加载 < 3秒 - -### 代码质量验收 - -- [ ] 所有测试通过 -- [ ] ESLint 检查无错误 -- [ ] TypeScript 类型检查通过 -- [ ] 代码提交信息规范 - ---- - -## 风险控制 - -### 潜在风险 - -1. **动画性能风险** - - 缓解:提供降级方案,低端设备自动禁用复杂动画 - -2. **开发周期风险** - - 缓解:采用分阶段交付,优先核心功能 - -3. **测试覆盖风险** - - 缓解:每个组件都编写单元测试,集成测试覆盖关键路径 - ---- - -## 后续优化方向 - -1. **数据分析驱动优化** - - 集成 Google Analytics 4 - - 用户行为热力图分析 - - A/B 测试关键页面 - -2. **内容运营支持** - - 定期更新技术博客 - - 添加新案例展示 - - 优化 SEO 关键词 - -3. **功能扩展预留** - - 多语言支持(国际化) - - 客户案例视频展示 - - 在线演示预约系统 - ---- - -**文档状态:** 已完成 -**创建日期:** 2026-02-13 -**预计完成时间:** 10-14 天 diff --git a/e2e-tests/config/__pycache__/__init__.cpython-313.pyc b/e2e-tests/config/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3e5fa47679ece4b974a8922308da0189de005ee GIT binary patch literal 181 zcmey&%ge<81k^MEI`IohI9r^M!%H|MNB~6XOPsb5dF~N)S_bj zs*J?E^omR%q3@iZl3J|qo>`Kbs-Kaco2pxon4YSimtU5clb@$so|;q)l+sT%O4Th% zEiNh6PtMOv%S_jgkI&4@EQycTE2zB1VUwGmQks)$SHudm1muWf5aS~=BO_xGGmr%U Dj}b3f literal 0 HcmV?d00001 diff --git a/e2e-tests/config/__pycache__/browsers.cpython-313.pyc b/e2e-tests/config/__pycache__/browsers.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74cd3b0db13cabd0fb65a90e814966d13a4c0e68 GIT binary patch literal 9623 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 IH`~Df1Dpg8VE_OC literal 0 HcmV?d00001 diff --git a/e2e-tests/config/__pycache__/settings.cpython-313.pyc b/e2e-tests/config/__pycache__/settings.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c97ad048d7dadf8680ad5cec212d8f6f725fc995 GIT binary patch literal 13929 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 literal 0 HcmV?d00001 diff --git a/e2e-tests/pages/__pycache__/__init__.cpython-313.pyc b/e2e-tests/pages/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a4c205627b5689bf64fc1b4a7723ac4e4081797 GIT binary patch literal 180 zcmey&%ge<81aqqzGWme?V-N=h7@>^MEI`IohI9r^M!%H|MNB~6XOPsbVExeI)S_bj zs*J?E^omR%q3@iZl3J|qo>`Kbs-Kaco2pxon4YSimtU5clb@$so|;q)l+sT%O4Th% zEiNh62T2#}$H!;pWtPOp>lIYq;;_lhPbtkwwJTx;+5vJyF^KVznURsPh#ANN09yVo A_W%F@ literal 0 HcmV?d00001 diff --git a/e2e-tests/pages/__pycache__/base_page.cpython-313.pyc b/e2e-tests/pages/__pycache__/base_page.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7be046ff3aadc791ec71add6288626879aea551a GIT binary patch literal 16189 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 EAB55aHvj+t literal 0 HcmV?d00001 diff --git a/e2e-tests/pages/__pycache__/home_page.cpython-313.pyc b/e2e-tests/pages/__pycache__/home_page.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..948297f557a27512f37caa4a17e25f2b1fa33a00 GIT binary patch literal 19698 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 JhMwq{{ts31@<#vw literal 0 HcmV?d00001 diff --git a/e2e-tests/tests/__pycache__/test_navigation.cpython-313-pytest-8.3.3.pyc b/e2e-tests/tests/__pycache__/test_navigation.cpython-313-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f41ec6f3b8ec1a3b95bf2ecc3360f1a9eed7edd GIT binary patch literal 13166 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 GJN-Z2a~6mI literal 0 HcmV?d00001 diff --git a/e2e-tests/tests/__pycache__/test_performance.cpython-313-pytest-8.3.3.pyc b/e2e-tests/tests/__pycache__/test_performance.cpython-313-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5d278636ec124a90d371595e47a190127d49798 GIT binary patch literal 25896 zcmeHQdvp|4ny>0ts=KT6Any>M39mGUgalAP0=gkS5HO@^3=^HU=~O~%(jBY1!7%GC zv!l{FIygEGjH4^ej4L=E%{-S8Ju{wN=jeaw18bPlIdIOJ5dNChpw9Z&e&4P~gi z88fe4>U3`1y7k>h-KzT4@B8j|Zzeq+7X#aCLx&?*u49=0#shV;DUr!XA@VHaXGF%& z`Ym^`qJ`|O+ia4>%WSiY4lg}ZAQq4_oXEl6dWUnHOLT2>i*9n>b_c(W7kLu5-{IL- zC>D~q@ZJs#K%TzISjGwDv{LXb2+77X_&*F0>R>6^L{P4>Y-*{{M z7vG$C{n_zTC&ykm=As9e-}?6DAAe6d{lt;+6GvQEF#ArQMYe5?gyXXH=ID@*mARf! zT!=>o1dQJn8xT4|eHeGQ#iH?0IIbM>eL_4a3GsL&+9!o+LuhDM4kktDr)QbF8Igq^ zf}Rnrev4?k+uq3=#c8~=aB5l($>OP!e(T-NwHCjvhPltSPC2daMOTh;zFdv=yWLQu z!?Z>|{~DE+7Z}SCJ+saa&x3yDV&SawJ2UbZ%{sp;BY*L%^Sd+hm&`gppOJswtn+&^ z@|Vs!e_=-cvRUM(&rwlE{_oe_lozRr!~ZL$W33 zdtPd+Nqf(0{AJ?&zH(oMT(nz|;vIt68xsdY(Xem@AtO-)fe{`r|KzOf+z$X390Y_5 zD_}}0Er8Gpf0MUB>a$FM?PN)MMxa*gWxBPzomxy6tz%Tls0B(=;ZYaR&d;JGYgfxE z_(1vDRZw2k=C{Ol2kaZ6_E>MdQgYAR4AbpUtLfy_n7)S(i8bI@%ld6y?Q1RTl+T*q z-c3GzC}#%M`t{rh5jY`MDzal&-OAxn1}j^}7QFt65SC*IlmWFq8-F&)%TLoLY*y z7g#^v$_@&Byw8)Uf*kZ?eC6N1d*$RW#vVU0@zz`8$9{R`*w3#_!1Hz`S;{b{S()8* znmtsqtbTB4wNLVH@?va_Pm-Peu~1JCzs;vDvK7u^uqFYSn5iXtzpys8^nQvb2PE&r zFCUrs^^tX#Uw-<^@#NUyH@_%$Z4OD2AjV1Q>!5TfYu(P%yv#*I2O@ny0%RLjC3_Br zBJm)+OF^t&cHJ~M6o>aK7!u`@U^vv@9~6Z_F&rBh42gow!|C9@M5G^xfh0TnV;~{P zRY7TgEYaUXM1y_(v3;TbU^E1!JA+cFSHKdWH1fhi$)sTeQlDISGl@oG(RNXciE^nb zB0MRX4f2DF9t2H67X?iuOGifuN}^)+0zww?^WE(1c*J3c;i)8aoi`k40A<6!uAQ zs!3=OR$-?}O?ns{)Dfz2a7eBqy{Z8c>1}!)^}93itTC4)UZ(U61c#Y4$2jMWay2Qg z<~&#XQF-;Ty-)9braS4nz?F=0i&EU8^W5SOODm6UczVM#Hzv7DlZOe;4X}N$u8M%-- zf6_RbpHujg!@zgU`I9qXEoA&I1AB54_QVGq3VSM;1$!z`@0q#>_T&Nfw7bvaD@@>9 zMc?GDckUQ_^pUaGer0@(L+gQJy3{WD};V^3F9H?=;}#X_{IW}UPzWdDLhwG|pkP%J7eT7%#b7Z82w&n7 z43=WB41?tutboABQJf{*uh?)egJ8xAi5pSQ3~%vm#?Hl!!fh>qTf9OI!f7y zLTV!l=@J8=+Pm>~k*!lxP1O_z?4hcHttq5>Ehe@`P}D3c#Hei}fU4&*S7WtYL?N9? zT7zFrA+>kwc}zhV6jDo0h19Mdmmub#Yo z_V`%xmsBMUF|$KdcxA+hAZ0-+ywL6R#6Jw}9vT$tR}6+C(fA5qCKlm)NP)RGB7*S- zWuPRb%*NhGw5MJ`JQo^KZS=Obwt80(QBb&Yl&7G!p};L({h*O3in~F>^=|a8&TNg2 zjFAzr1sNdFO$q?*1?r?2h&KbY@2t+F)R3s=n)cmdih^!}f?_KaGdtuf(2-AU!`x;# zhn6htTi7Vfl@pjVTm{9qWv2L+Er!)dhas2(Y!!<}D^{i|R;C$80|1+&(vx(5R?P5~ z7x~cW-2F!QP}&NmUc)oE3F>wY&jwXIL&Bh$*x;3AKpyf($?{ZHy=CnTaEbO zdoevv)G6AGz^03?@O7`gClgZ08%SxSF6Z6i)eivV0QnRu*_-I67&sj^eF(N+12$QE z!-KlgN-@dU0Tk91WJ05+hD^6K%I4au zxv(FqG{>C6%F)8QRAF73u`dP8u@`xg*3SwVzUVT)cXaN4BmCa99ZJ21IdCV`?HcBo zV9xmShsS>OvhkGz%-K#bC$u(SG8GqxawwXVAL)ScQwjURpV#?$m| z1C-mn`*vVfA>ZFA%7Heg8rY_4gMTh)6E`5x=;k#mI8#ynhG|)Stc*3Fg=1QV)`0?f zX@YdT5r=q#@mSE%1G4#eqlx4}sBG4dwR4o8v)>56b0%)~(=RcMpxTvk4kBp744NJ3 z5eBSFeioQH1H%dylVOEe9>WS&GOS=T4l5Xp@uoJgfM#!+QBpVc+f`G)-vPEK-DvND z=9A4(mbp#L%xKTGvQaADG-I&#P@%#1<9h1*as5tlJ=}5vN?=td zruoVPf*9!?B7^ltcLi}XO6qp{rFdv=lXn|z@V?-&M@0?Q1P5RcArhA47E}H;ZJuvJMbaw}WLvl{poQy(RK*SFDmEnDVAkg= zk8XKv%kj;l?v*L`%8UHE(b@dY^Xo3SE3kx-`Kw0VjVX8IMSjERY<~a6Z$MjE(^S0_ zomQ;yH`xOHHaE8YP8*b$wIRNN>zOs?uVcE}wZT*e45l6k6cF2gQhmd3WqX$7fqV7< zM}|}T4A%d-A5PWm_-gC&8cx-6{82A_jFJgzb{c6{Mq5p0pFS<@U1a_MhmY! zqn+l@)BojXv?vGnC{&-Lzo}=m*z_4KxrU>rtk(Q#)>y3pzsx27R&aD)j%T#k@Qjw4 zIM@7HaTJ_w$`XkCbQ}fe4V`@+^!%|mj)s1duX;~Sm7p=sm5)tS+8&GDpBOZ{zrYwQ zP0aAA0iO)*#57(t@$ewnG@}AI)x@G&snBjr$|z7to2D%A2?nCvDM*9hTBLjEh)P06 zX`=8z0_>^Nlm-{jA;!XjBthqCErV3Wtw(qDF;tLYJw=wB+tRYy60`}Q>mkKyy%{tR*+CzJ z(+&~GoKXL05%)k$yh}M;FWW#dX-?qFx^<_2{Kc0hUjKn&$Nd!j8nkh$b*onoNQwh{ zNrnS^Gy2D4F>7|po{W1-irwATG4bnv9skx#O0jZb<~<`$pb2zm8h`%DvByu2eecxR zGf$4a@g21pILfazqgfxw-vsGCw_zk6t+>>=vm0VYB}Y+dsOEJ8b(E(E%^Awj26~FR zqc^u?9IchyP%7SEWuwYaDN%-^Li}J%ydMYj;mMJgm})>(Mn7lt@KX}Mc;oiejoXc9(=`2-?Qi$e zWJPf8_S9N4!M5#hZ=ix#X-+-ilQ~GBO{UHKgj@uqv8~a~FGYN5^}9Z1pbECu)cyaB@pWYD`8Sf>5Am$J*mxRk~{Xix0e==y#iVF1niYBn}AoU zwi9~=;^d03Tkc{%FuOGD77%OOlWNOo@Mk1_s-ljDJff)Yhw!hUs9Ooad>Cep85MQF zVFQIi(@WL{ZhAJNsN1`Yin?RY{hl?I`%hNXjXuogWbp4#2`b22QP<|9`JKcs+ZC8A z>gc8>-YgZI?ZmkdSz9N1Zf9+NJ_q&H?l`Dto*Xhp6)u;WXQa?2YcwN=m+5o+<{4(< zP5k2F@i(5*9LbU7-UtH*8FXrT2cdl39)YaI5@J}$?fEE$#mHbB`IYYW*bn1Us^eoM z8i_|j@tBByl+*)~W|^kQ_)tG_$;`XNuq2rkm(d}}J*IVukH_Mne&EC8f~Aex_4EtT zzW9D~H+Om|ZLvf&zR|06MdP#?@Y+;)a-GwPlQwNlh-A*7-Xu}zNrZ*^dMPo`;03=0 za506b_d0Mi?NNjqysLdvu0J=wF3h}oLb74~1a|XW^6SlnY!iO%RG%zK?19&eKHSg0 zGXBHEpuvqLhmDW87y$|KJ_vRuN+6`?E}wmI;pdv4r1^C1|kL$1muNAo!zEZpzn1z|ELXSePPX6n{F)fG9ZD& zAX%F_pzCE8q68{aS(`4AcWdljyUAR9E18RLI{ZPVK4=4|=H^(x`QV3Ug6}kS@mJf6 zjsavYzFrHevss&QN^WZGWtPL2YGvM&MU@pGf zVDRDzYw;LZ%K|l{p*$QY&Dx;FW&;O>I8e}6xR~kIriBzRA$Xp>%pzvz|MW7g)nk!cgp;Sno_u!v=u_bFLahP20nMEWNeIFm??{i?{83m$NBMT>a|9*~Ax%!Q8cm45d5mQ_}32J1?@AzWWKuf-m5E4uDp{YG!!OyCyp*2_`VE zK(YlPS+%BnnH>VdxZ!2**8E%anPA;G1)OYp+A1hH>HsgEDdX7$&^3j!Qv+$W44jn) z?uj^>ZOc%S?cExTcbWpU+D96o>$S`P%^85M=Q4#`eP$S$%Qlm=4(RIQD$Z^_5BiE^ zZE*GAPn2^mo34hU6A9T2<$0AP!!8G)42^<%z zCB}mLV)1xvK=$Y<@z|j32n`Mj(H_|f`h{!-&E`*nUHov#yjn7}UXs~}VTFNjVN3G{ z+e!kqN@)fc8hM2&)J_$=4An{JAjl@f;2~30ljJ`vsd(yv?^Y#m{;+z%i`CCne}8^* z+XcRSlwY3Wm!IeBNqk9)Uvi#b_F?7xV?$35J@d8XZ3Jl-rT9fBs#1%uKeIID-TXek zSuSc zQ47GTHDCb{4FH_j@?I^wdwINs+0=BrJ+2IdP|7Bb&k*_}%@?pv5Z4oIPN?2&I={`m>;M4ov0>j0=|Qh4zt zimX0PcI+2my#w)(eF-jFbjYzJv@e#3A960iv9$_}UOj9aN@!1`WNWlXU zDYCC$5RahX(-=I1!FMpw-5K*B!Mr}?2g^+L3j<(alVrEvW=Sqkk`3VeJl10d&WP&D zh#uL|VZ9{;ot0u}+avvvIQV1gD@Vy|Op$u}OkY5C5<+)2YJXyLmbsE#x`L^!PP#v+ zT$H@k0NiPd)l+_r^9#y}=X#z;0&JP+1%> zT~l8<{e0dv*}B>cOa9q`l?nj|0o#Krpb@auUhtet{uK~by2k*vbHC)D=3}F_EiWHS zEf-;>`ju#0Q@;sDqlC7?0;j`U4o+SWu;*l@oC3DaS@7%&f)-80Zp)KHW>MubDHz=&`>0XJ%DMLWpsP|T&HSoTU)Kf=PypbEz< zb*Q31MJM~}GZQla%6zh~xo|ZLz=V)|m;nX5qDEh|4pebv)heQvn=Dn8t%J|0<#mMH zHI)t`IYJDXY=Q7urU{ng%%FR(fi)h^47LOLV$E>G3^}^m{gy^;7z_v=e5C1S=HF^S zq5^ZHsE#xoJCvHUF*Gz6S4Z}`N=ho8#4jB5g1#A$) z;#v?o0#1Jc&?9b*My^1UAEpE~UAs%?ylzyn8?q$rmkUy+BSlTdfQCtVL;0Tn8+Kh#9Uf4d-^>J0X60^)znFk7b?A6 zv_|uz^cNHJYe|4taM9D9zqamC@4dPQ5;_lX@r@n7qj#=vp0Cs}$K|6lPmVqH#Kg;w zjvf8sM`yly`MHM`o@w=2BM0F*ihLh#aRP1nmtQ^$3jXCEzYb^c{fjX0ijXrv5655l zH9d0}zUYzl>Y4GAPr$l=c*Y{z4@P?8`;opz`u4{O7$35D>t*)ALss8Ls`1N~0ZE@w zL+l2IMF9yo8&+@iX0HM0D*i(& z%!-8;>i8`?)mngg!l+fEKQ4)!^|g~t=yG#rg^5cJX!F;k_J%zlkLaXf`Q=Z&c|TF zAS5&lCsM2KJkNK0lx0jn&Uv2q<}fB)s$QI`ZX8~ks=7XT`vtxf%R9bxWPZbWe$^$k zMbxJF+EIRSieG$U_la9h)tw5Qx^=jDc+c={XWD+_e0Ry2e|~r0NZqdY`Oc3knWd{H zYZ>o~$L>sSy~y7)I(NTw{5_vop=9!%ISmW**UDUwERq`x%C2B=05qw70pffx_&_4m zk9QP~ih@D1a7KS5Dnw(DP!J6E#KI79(1m(s+dxRXU)+n2fn6Gi-7knpti;tAAng_L z6CvJ&K|2PwW3U5*T^M{7gE$8Ngu&w&px>Z)5`&i@kX`V=q3{B7Sdg~iak_?a@YCeHmp$XgocCtsyf-^%+EQfiW{3Ar zGPtKTkfd~7Mh$6;$G(p}^&kxQ!d{WXXnNrkIcRnl%F$*oz^u^XY`GFh9ES36uat+; z^zy9oO6+%%Zos`Jcjr_&r+wp@+hD~2`$k0yVxZg^yD4p{vERj>g2v%q5yNPDeU@Cc z-E|831a^uP#M0Mi36{1$rams+2N{52KR~_M$=2P|bTite<3XkCoJtnkH>{ zOrKYLRDEUQ8Q963y1X@6pHQw2()X;9I`hJKTB9f&6k*wC*{LNVCX+M@@V~+*pO}pu z@u5NR))nD9#^689U_>(XIH&`x$q~1thqxugyL=HF=49 Vzh~+{cRXNYzsi2XkR9om{{_#Ge3<|M literal 0 HcmV?d00001 diff --git a/e2e-tests/tests/__pycache__/test_responsive.cpython-313-pytest-8.3.3.pyc b/e2e-tests/tests/__pycache__/test_responsive.cpython-313-pytest-8.3.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd13960b6716fcbd99c4ad011aea6e0b3b8c3493 GIT binary patch literal 21907 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 literal 0 HcmV?d00001 diff --git a/e2e-tests/utils/__pycache__/helpers.cpython-313.pyc b/e2e-tests/utils/__pycache__/helpers.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e9af3945be5c2ba151b0b62b98ccdbbe4bca2ea GIT binary patch literal 32536 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 a$P3=pP!sincQw?^m;__NB}!)u=l=%?Z$L`` literal 0 HcmV?d00001 diff --git a/e2e-tests/utils/__pycache__/logger.cpython-313.pyc b/e2e-tests/utils/__pycache__/logger.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6021124dd27a7fd4051f5a795e06309bf02ca1f0 GIT binary patch literal 15051 zcmc&bZFEz|mG4P<($j~(zrR2j8xUZdV3PzFX!!;MCh@cLg^MC2VH9ME%##wJ$*I$B zg3QO-G$ELL6sLhjq)p;<)8I`Zp*?$cv%BYXB@Ao#HQDC0*w}l{o|>4PWV`!g@14=p z7h<`-|F$4oy&2*#TWGvVuhJsK;Z-@afFk2 zNwb9~Jk2#kLvt~xw517JnwM!}usq4qnb)L|vdX!~ zbR=KOF6T%AZI=V>a^vj^yEL}E;Mbv-Y2xJB@efaqUpPDd?1hQ&YvZq;G)?sNU;p6c ziJu&qeEY=Yhlg&2k6a&q^Ttbm!J1CKH8g(d#Q5RUli$5$n!Y9+xG=LexJju2pv8soaYtcN#fWiLmNw%J7AaHfq=)?B|F*lS!#&A%Q zFOHuI9~3HfG~V4!v!yI+WZ7LTTh@J0SFvMBw@t4I>(;O7*r@0>w{F<37#>{R*1EZM zqav(tYunzYh-=$6w{Kp%daEL|t(VrfD|+H~`iTqkK#=&Hv1O&mAS>e1&-@o8tN0UK z2iHa`Qj@kAdn7|U_%>bgJ1b}IFY!2#$|yd~4!zp59SHf&JdW$&m+=hd)9#>K2jAK( zYP&?`b-f-h>axehJ-WyFZhD4T24)<7#*G)*hPHL{6{e(mhEt$aXM^m4%E4+a#yM}~DiU=tLb?Dp;^1@I|F za3U8dhHkekJG$J8(QbEo9kOh<%Sa9@JUz<&4IQ$Z$PEYgIDB3EJ&-i4^}F11!$wcQ z?QYoP?{?SigWe53{}T?c-&gmfdzTDV4eq7xx`0~_$PK}O$168@{asydQorv2DaXM} z(pj*c&3iUf%H5EB*~5LBTX@oZ+ZM$SKgN^1+iLP+HTg+j$){f_V35u% z7`uQ%3Z=sMY>FtPh(d}1TGCle#}cJdT2msG#oLxsNU2m2hg4EXnN$UkS@BuUrqFU} ziDU)%9Qa~&r@pfosTce9TxIXl*J zQS1v=X)&2YC4DsrjirjI9kw8_A#A;=#V}wHBoD_9IVR(8y!G0R{^vlzx5EDS_<%Ki zPWJ|2c#qE$@Ho7lgKifogig+w{DUHs$y6@madl_8?1YXx;_|$m2U!a2)xoK9gbS9(<`%mf@4^F*haY*TjeM4u8(zC3UC>j z6C}%+IlFIV@5-pz`f=r)QyWih53e1mToPJ)blX@?e&5r*Pe;T`x<68|#!)ENyP5ROx2y{nSqhO3?SsHXy|M2T;C<8@gVw zf&$egDk!WJf0SUjb|6y`90jnIc1|c^WguOC3n;^J8GGI)iP&n-om3T z*DQ0V1ul2~?Ib`wg_58J4p$&Se6lJsu%vO=4rs%kw)lanLO9g;;)g2qinj$u5EHG` zQX9&@v}Z?_3P_9uy)!IECOt_#?p0>AA`503IaeJek+mR$W?0iv>n=vv-lIQd=mZUC1#rzD3G$hC%iV+lic62Lx6!)OqV~ee*@hb+X zLbRaZo8fVe4oMmK4n^+fu8%oKN z0>tg;R$(Y|2+9-17`GG^3rr#YMyjw0ie|;+aJga~ZF+hrQAOB}BUx~Gdu(<}j??dx z{Yd~bt&Z6(`D!hD2W6SaczU2YVr54hS%CwVC7*67hay(X$3PVIaMw#~Ud|5bj%Iya zTs2xe|4Q-vuz94o2_WV%(b8w`HIIswQL*xs2hThhcD>zwzI(KOeYAf4NY#d`;>Kw` zXUs}88WpRfV)a$A2Ca^g{=mtnk3T(HQWq_$8_BO9&0iMHUluZqi8*~)y;%dUaC;~# zDlUb#rL#v%7G5b?2_<~N6QOR2R$g=Sh7@% zS{6ht3$EIhN1C@r9(Xirb6m6R`c#GgsASaEe8tur`P#O~gN~?e*Hw%2QQczJuZa!J-mt>jq?q`qQ6K}&bVBk68Tec#10T*hzKLG~=Jh)M?znzo<+^yA zCRhSPFi#HkP~3R`+<54ROx&Q7*#gyy;BxN@c7cr-5^sC zgyKwT$C}(ErlcS00%%O%iW8|UDwYk@jF#75DX$Md87*HuJP(p<;u@xJC7;y)pVUEZ zfKdk>HyMee^Z0-)k3vJ@K*UlA;0B12lSBY)yce6{2@mGH$|R*xv2>ttw5;w*SzWj* zTK0|MVo0uutN*hPb(9cz$T>lm-|crIoz*AK5|04nPq<;UxM4cL;fM+)xJtE2+l9LB zlF0#f$73*jV%N9{@e@ju^SZ=Np^eBcXer}a1bZbW!MoutWwX%!GB!jNBZ*mXvrq%Y zdc|TLEQwkg!y6zOE2;t$#aR9sr!|@w-~4%qgx)O1HL7DXnN9=^+&Gm)Cjq0{>F_e< z@gcgYba@;=DR!IM;~=(8BMly0cP33$5^0h}3RR5?cZJOrCiVs z4s(Lbe!JuVC2zmeP2J{7VUqlaL!W_eG8#sVFHDC`{r5!0ror}z*c5(XL~LRVkP%BH zGGM8RE7qVsOMF|*P=U($BWcQ^T_#_$s+<>aYDraI!9d}&;d|)GrM_Ao+%8(?Wl_E7 zj6@Ufg@78r*MdTs;#9!(Z-l=YbaBk(taM2VxJ}^M4+28_^63E7UEHXBf;%Btxou#P znxSPEe~)%IoNEfdvX#_Acbitx)Gtx^y$b(CifmSlE4ti1_x^okl~R{P;j}}peudW$ z+$pcBk2ep&XJym@r-1m8xh?OndZ%gVuEEC#o#DLjUE#TB0rDS|iN8}^igVFD=J)s% z0bIb{vMpH@pcGI{?)?Gcph7K;^B=|P@;lG%S*Vwh{5{-+Id80N*6H$7<Oc%T$VxG0}i#_A#js($1Fn#*m8`flKv$YjuryHt3;Xn(Td>0eS z;V8gV38`eG+D_*SJ~Y$tY;I#%740wd$mXY}8hd9mwTqtR_8{u6Wf7fm2B>^nqjF%T6 zJOtPjddj&5yy%d`4y|O&;UrU|NXe&*i4?QV60`ggj1{w3*jgaVlU_`4RTRP9?SIUZZi6V6_#(J{E~O-iag!_h;S2H> zNMLQsW)I#wQnu*0Fg)+_rjh2Y?-WJa9tjDkDZ`recl2)@_~%f*+)kIa$w z&d4_(jYy7&V^<{K85K#S>+unh#CTZ_xcB|v^YX--XQ$pc6GZcH`t7Uk%sg^;0dG+9-nc(?cX+N8?1=r*G0t@L**ml3WloQ0X94^YexD0 zNAKAiFN7yT7bc!RcKy;TF+7hyXJzl{c)pk!PZOfVCaDyqaRLLM%7p8@!O}?n!l<}B z{Md-NJhrTG0p})&E?$VrL2n>M`9r3sdvq%lQjRs;r9A9P@KN1qS4!-#(sk%SjOpk; zq)H!%F~O!!-iI%~IT`N3t@Qm@f+!YX|5>McUV?jZ_WJ5k>-d>>Cf_|9BiIYatP`|P zvz0sv?PJ^_FbVe(K*-CO;D#dfNI{tkvM#0%Dp{0*anwuGiKy1R3f*LMioq!`Xa4cZ zaA!!bZXn7$;k85h@cu~ty-{)FaLb6eF~&mOZn$i7Dgs+$ zQ0gK-19i0vAjij1%W)6QZGHht);nEQpg)^RJn)=KT99=*ka?I3jfNDNXMpudW@Q`z zp4(aLjetQ+Uc-c*PH8KagDVCX&eTkXJEN4dJFV^q z@Dcf&kl@)}I8ZcFMtvb$4{wcBG~jv-k>T3Q+Tn`JTO;>B64|jca-Th7-xVoyMlDq6 zS;(j0JK21AbEI@}_<``Ip*2InVQFaZ<@`wTx~N6^$TVV+*h(9~e-uD119i>Jd*^+q z`QIG#=v@c(H?~J$)p+Qb_DH%NctFu7;R!`G0U|a8G^L;)k}mC$^obyYOt%izaa9w) zrK+2-Qw_icMes4EgipP2YVz&3uMZ!-K73^2#X~`~;ipf(6t<>S02`pawjl^=B^Rrs z>N!++0Yu?UZJ)ewdUE)UW>c$8VEQ^J%p9TK4I}7oPWLW{bFX5Gxko@pSGByq!gfe? z#xFW3B{p~-vII5q?6Cz>D$_Q3O6_^*Era$EI~+jej}$EmZwxPw6fBF1?U#j!*#1%Z z6|o(6zp2;Mzw^x6u<&}z;EG7WlHp|`Q&e27R@u)yJX*W_O6~Fyxb&}q1}m?Ls~EQk z0Z+i|PB~d{-ngVQJ&-{76AxD*nU@|mdg|ibp&b>w$%~k|9aWSx$?dvyHX&)tkB6R{ zcOWEjTr20=tv_H z;2m3F?ltzW=|9lFHT; zek>VWo+msmaJ(lwbYiggur*j>F%C5X!ZpY1u8CHP21wNws3V&ofiencdW(CWmBAQp zC-=}gg|C~!bH+B8%)?gmF+l*qbB-Xc?D`v}2*#c`d_F%$kboB*LQc>mQgplgelNKf zo36qHJ>Vq1Z>eZ!LY{6kFM$sQS#L6&Bqx*@Pw25AYgcEk7VlbC`z%w`e{sYJ@fXz*>Z^ z;lnP3uHg~7o*$4Ax}F~@MCf|{rYHy|`~YO(bu_!|`W)YGW{LZpz_)N(ld>gXif?JqjE0_~}0P|rwi?uKdtswJ*&S?(wp+=Tpu4Q@T zk)5|_#k5HytQ?$+eOC_aaEO&S|7JF7^AN?f89%m($6+xag6U)a5ljj5nr z1VdncdDBN7KikgAk?zM4p>}>cTPJ)y3>ZN+^f1jL_jlaF*J+C&)Gz|o47MX?H8%mX zIgGq>!Z0|z4X^tGvl&b%kF&4@WNjz>#UIpdr~t*oC{v68xJdXQ8myCld11WoMdlxg z2cnF>_5JG~906w$<(yh*#s;f~l48OLN;pd3GK^dXz)#^%HbDYcJ?5e#D zqiQ}I{$?tH$1x@*F-rW4ns$9A)epQ#noLSUN75xJv_Q{q+M|Bi%FW{1^?1<_S06kY z*I)){+EAfQdq61#BS8(Q1@%N%!_DCmF^vY!0V0Q9a%b)h;iyTyHEmgG1HkJ;%hccs zE9Zs)VxO>D*v;?eR%&N+;IPuQk|WTHAfu3@kk|}#F`4{Bam0iQ6-Jlv6-AECpy=?{ zg}Rg3U5#;f(C4H!Ff}g}-mT~mBqOCjh{Myvf?^C9f{WpivrrFlVNf2PaS4Z4tp4ZF zQSOE0OJJzHisviAyeKR^x$XG2knvM7n_bZjc&>^I#>DKt?B49FV(GNbV9ftzQQ1IK zq-f#b-O-|jp$%h}d=^qOXbj&wbpKV$J!1uBp>1D&oKrdj9_#!J_1L2(YN;7~_^M^; zm?iH&rw!2X_i_o$=KadmCEU+SOl!>ApUtUVqu2giFF=_fo^ZPS9c1M1A(4@!k6Ibd z)TWA~O8x<=E@K-jB#5413N?Lq$1P2^kUyj4^m)@*nznM5f}U2oGtw@SHdtBbyWOT&Y0H>dcd}VFnhQ0mMmboAeUIf77_Sd>E0&3X%e;NTRWUq)^Hy zMc~pdR&wu4STXGo%uS~L1wKJ_24+r8zV#aTj4(!yvR#U{hyaOor;B6yg21*)3jh@pbq(4vzyV_)T&!ep zdm-H1?E=Q24n}NB8AH8%K@~wMOUD}GSGHQhjhm*OgPg+AdV^Yjnf5XE;Y82YXOE&CW>@$^mwp9HS?n~>SJ^VMbF+X zlV3n3SqVvU+?&Asq{X-4Md823);LShQOjqYt~*utGD9Y(AY^9To;<<$^u5sK51W1_ z0S~Hbd?De3v8N6g1eQO(;K`^z^UB1VKZv2OBO}m*{4*vL^$3>I@z==#|30NC1N#1b z*P(-qdR-Vo}mGyECUBi+J3}P4zocs1`-;S2t4KT~tS5Sm4s06{BNE`Ohw>bUi zTb!vWR!jw-I)pJjiR}a~aEcGbEF)3^xM?8F{q{wr@PC8R>E#4nRLYyBl`*{1P*G=! zd3i!08XzYLgVT8$ay>4`3YI z7^nf$!}n|+cu!3+vD|mRAj4e zLpHhkzu*Hh1{_d~tu?2gI{g&GI3g|`%7cW;B*p08=Vn(m)DxFt4&y;bk;g^66Y`m^ zGdp1KW|BwXzlzBsyjujtHy=LC%x2~eXO}1Hbv88&$po}fud*hgOy`+uMQcIlQVMUQ z2S9mPKzT0of(@)jhs=$FyTDRJFSe_qmMSQJZqTWh{K-2s&hPW!3tuIqLDOX?3+}17 z!z^KSJbQM$?{%;`t|AWUvK4+B17U}50zuW~x8V`5Ga@#*acsaVl_E`bP@_Kasn-DH ztEWy^;|>!)^gc`+FV{!mQ!!s03mpj@*ymOZ;GwgF*IUtJA+SrvX`p7zlthRYhfqq4 z7SE&*u&Qjt3;p73mB7<+j2)RU8r|_!exsVf#5wb8FrUXiA@l+yw&FXxH;|K=xwi^S zbO{g}qCf%>hxGR{;KASHcae(-$MaAT_YvG3fdk~X2t!6>J`X$=$iHJUg9-IbpgzM? zm1-=}X<>q@p8S1C@W(V|H+4FpZeV}d6rJ7pIatPZw=7zr@Rmsj3E0Sm)7hLpe_Epz zs{7rb#|zb{I5WVsiPL9KYruXVC_)pt8LJooexk!ljRVk2BQ(aV8gGhv=9+*k{Lqm5 zynUL3;zzpAF}sxuqkjQzfBM_r8cYC_(;h3dAOQfNwqyy{Cm@LKQGA3w1Fv6u0QxR9N zA4;tvDAsU?$__}TwLH(?)M$C#jEUn-zvAG3_9tA`CtT^Tx#~~2ieGWLWtDqG_v!pL3JLbb6;w!w|Y-vWhBVizQLgG3Z zIZhCF!B3jq!``-6{|8wu1 zjVny@Ui`EM;VvIk+zzJuzI{!EwK#7uo5gz|wmvj(di4b3Er( zxz&4Byox>5yqY~VyoNosycSQ*UR}GM*S8yZgOl=W_Zr(xys6#Ho7*kCg~jRiTHCF> zm4)?tGumyujfD++Gu!RForR5iv)Z%yY!)`{&1ui&bK4!fqdkw$YtQHN+Y9)D_Cmgp zrJMH_wHNcnEUeyJ!k3_3%ihxVGQNz(S@)K=J9%e&1z#cMspKnrD?9I&hnjd+a_)?^ z7%w>~Z*_YOUn_-I@GDWbZLh1nj<0ia1sw8c7IAKSuWhYHEXCi^Yhv+Ph|gZD7Gu|n z4~}0YrRE?t_omc(R?>mAyk330#s(IfkJy6VhInivi!DTKQBrIZi!DZMNm6Vxi!DWL zncOD7+FjnedX3ucEaD#0@-0JZSH*+}-85hM_7~rO<(Vr_eEssNC$2ty_DXQ-%Ivwz zUp;NUa&qduzj|)>!TtMwbK>uA;&E+S~zW>+{%-3ixI$UZ&)3$B9VDlUbjPsuU@lo&iVgGP1A^WY7#Qv!cc}y;(!Artqh5ryJAD(QceoHx9v&VWLqO-{c|R}cj#2_1 zlIZ(pBa?&}-%4@`_u*xJ|k$qCPhl#IH9MpE8yh=jmHmrd_zZv;Wcje4|oHOyN1WT-p0fJQE&a2XUN;= z^B?hy_?n2 zpbFmSxu0uGVi}GTcZ;4a|HQ7CHRr@m*?Vj!-yoMt`Jh_Fl3V&CeA?6xTEo#N?bY?_ z-I^81!a~}3NEZ+3S;&BV1{N|RWQ>PQEM!8QnL=(0Z|=49>If1e&ML)Olj1U@xQwJY z8>_`u$@ONsGuNwldv8{}4tqQ;o2BLS=Ay5THEOAithDsJwDfGLz5Jy1a-_Hd#1-}y z^%jY>Nj2uOR7Y|>06KXL=oI&sxE;Nvcn5HMNE-)|W%2lel=yOYA@3ZrxQfKh(di9f z=U!Wh>0z7W@|T`@Z~jlEE%L@wSHAYVV4wxkH#{JiSb)~H6dc565zH)Bgf)6vrV|0d zj3<^60U5#Q^$kd&fe9=sz>E$dgYB!nQEwoCWhrEeuLQ%qhdlic3z>m_-s|-R4*SRZ z#sHActAtDm%JdBa(D``)rxE{9KrjO4c?jAG<}nYCzKvre2!=zv{}F5n!FXiY`v|RR zLC<@~CwO1K3{x;-j_?irE&VmTXSkktS{El{FrTW6>y$7MGR0k|yp-cH9M=V`PM-=T z^hwcDu+wyNocy^^QZ1Ea)I@5|k0{BuOP8veb7?0sQS$vC{MnT+z3|@r_b&hW>C2DL z^LHYSZzXR%JeQs~P?%x`9l*hamn90O;edb8&yRY>#e8Z(8}N<{3R;@o08N3@$v09d z!??eXfW44?5KBW`LJd;fCS(ZQ3-1K?UZ!Je;ER70)W!-+&laC4juzI13+sZ~VE3dg zR$6hk?@V8`bX~Y~U8J-XvAtnqQLMQ9?B+9@qs6Pk#j7L5YY=^Z*jNzD%n4c;NJ;s8 z)F<}&sL^L=+VMXHL&nCNhZ0|j zy(ssG4JB!y3af98dLwF18|vkkUVZ%ek;A(*gGv&zKz~9$fIw~ zZzFFzc{|9n!xJ>azHxppg^Xjof6U8|1I!%q`$yQP=4l4_dh%!l;#g=y@XfMEvlqy~ z68Qr6D?*X>$M(fCvmfgaJ$ue$2V&N|h&C@~FNkOhVm21GQFPUc6Z@xHr?;Ql9MP_b z)woU^nChPHKlMOF>q>q5d0z4Cj&NS{i5!dHD-SG2@+PU#?#ikSOQ`#x_bk$V%DO*Il30v>Pu3-06|0F7}h}AWq*x{*(Y4=Rk zboZ&xgl#J#+J;4~UY9$aJKaCiGJW_=*$ob_i*`eE|c=RZG3)G zoJa-~xU+g~K)%^2NVc$-;(^57;8Bv0aE*AV ze(#O%Too~}IY1d1y~z_alX0$p0%WyS1Uh~F;+wcBrMC=;j+I_5BAR76uc992_zigQ zTi^*+hRS(H5(GLDD1+aLRAtC}D{$pjZRqAW4|c9|W)26#2p7a1p253(+@MX21yle8V zX-~vb9?QWl&5hbC!uE=p9WNg^cOYzUnG1w7H-wBEZU*4=T{QSx+6Qkr0FD^}zS*oI zFhR}(=;b85MWxf6m=`mk7MBIXO_v{^z4q9wI2&v#Fae)HLH-bV=@VcGO!W7I#1it; zhc6}26b5SGNw7Pb=?rH&XWGJWeXjwV zhjVLtjc#49agE-sPXR-wULA{9yA3JvW-!l|A(P82WOgz}aF@&nUZZ)QD2A6T)3|(Q z_R14Kc>mRNm(PCh>Z@-E86upL0El4mPmGUEhy=U{LTH1?4q!ptFj@qj;f7RL=!BRh zaS0QhbTC8~*10L;=IyK08xj`0 z|K-;&pZpVX(4tsI?9)wq%}hcJk$e`4ZtjPi#-mPtoV*6|D&Rqyu>5YK$q{!1ThMHC zu{w@Wg3`jLvGU~6CkyO{N9=mdC0!1o?u?m%*}KBE8yB(MGA>lHN2s%lR$m6K%v_d< z(770z-kwMzWG+q}t3PE~(gr2BREL?od0DzOMI6a$diB7GI$Crju>oc_v4u*^Jf(q= zXKCi7G{W>2X*pZ5v@=B37&{^DcDF6w7wU(W zB$DW3)=l~CEIu39o%)g^*3bH`6=?uIR~jY5{JaBilvD1B+MUa4$a6dR{GmKozK}!0 zz_bN(?I?OZkpqts)3#g+BBn)6yJ6{X;U#mhan6z(p|#Ci4^4&`lEDbqL+DkEGs_{F z_wA(pnC9FnLeFvzx7w{)59B@)uMfzKXzn!EnUxlSSGQKK1?A(t7~)*I4w5g7j*S3w z2M$7vs0X=E@3SEBI68syYZp{YPSyc68Tg6ijNLG6r(o~4-Ng6f46T}e8l=_|kU5_Ep60MRGTrATe!l*dd z?Wct%J6bGk;XMf2 zU#N-F-8r(@-KWDMi!V6E9D3xCK~f?E*BM{piO6MgDlGk;_`>caZZXYOa`Kkzq>Y>A z+$wpTUAiuPm#RyHc4=*AIzL<{9u17hlCO*uEHa+xP+zD2?y0T6$eRrB%sn$h~2 z0cXwb4K@2W)VN(HK{q};4yh#0Bp^Z@W=9sZ#hEu=n+QM*1fRqA^i^05Ni>`oxZ~mISK^(I7CTQDjSRNrT~O zSqmDU{}DjCaek1=STj%=r1o;3|Cq8s-suC-WU!C_EXC+XA08Oy1uX;{K0)^g51tZ0 zGnKUBpJF-LobXc!^QS1n(C_z+V?ctHfnD|n0IC`c(2fErCOIY_m)7__|Ws0`x#AU|p?3tP*kC!*!e;qvBptgEkUxV$RB#w=$=e0qgeN*Pq^go0T_(9+pp{i3TDfKGX4ZNO zwGKcQ2lR<5<3I}NZa=_p_j#pUx78oOctUfx?2m=@$H`{nyGrQhwpyx`5GrQ&K5IbT z$OUMQK_>bCu`@d{HaV0sMj)py>pklI5W7-ueHlJ0kd~IvS5F*qb!ptX4NpUm0d(BG zoe6IAB)B=C0%|bGpgt+TArTudi`h=(=nk-2;$^9(9wO|ROQ4gaIJ5k%lj1CLTvtZY zsZJ6SM!$Chtr;6Ksxd20{Q0bdoXf<7E${!uxvPJ1`sy2J5qR&1=dOJAl@!VgOMt^t z;g;IrRbg^S-h+w7RQa=rMN4<-6YJ)VaL?$lG=Y(6a)(rRY6ey3)z?%g*@2S=!qh-I z>V_sk#iyLTm^Kj%Jvzp35$;r?<myAgITyB->SyPqjzhc}xNoO!p zD&Vm>cN}=3c)IO%+rYN6O1i zT4dPitmhnCWGY%;O!&5ZZ{MKaqL|p*lFi>Lo^3mO|JUyS7P?3C^|^u~l_-fFq)fCQ zTp1v}a9WdmR8op~CaV){EU8aE02b_?BTz6H@+M+ThmJAIh)$0Yl+SMs2(x2mt0dSa z5jBW4QPRXD*-QoqjSS5Q$Qn&xVw9(zivqh; z5ieBV&c2||`h-6m<4N@aH(cJ1V{#$FJ)>UEas@ePAv94haTsLynjgkC~FKnFl zyuR|=E6=LVZ46pN`5QqF`JqymQA@{+Hg{9NO&y`;+Dw{qYDXP1eUp&3* zsYhcaD=!w8O+Okbu8-xH&SahX)b(PU-Mq-zOy&=NtK$kbi9}d#?%hu9Pgd#Sr_f)7 zehKO>L1-|^;U%h{BmZ_6Kt)y>k*eeQw8Tg_d zBIHVd0{RHxhDbGvbkdAMK_3)IWNu3=D)L!EaXf_`s!1H5l$a+c%8*Ko7a_{W&>({! zP{@*Mms@8noCrnq=}?3*P(~?dfd3h42@v_43>UseV^M|+GRq{fiI=GOi}1iXS-I?7 z@I89YSsg9k6fWO1-xDd{6VwO)C~Pc2bk&Mz<+gC;wl_CND(^+~XTrvEM3+@YOIyRG zt@Fi^(w&Gt4#f+=h1~Mz1CgAnpfP=$7o06SQx>tWoNWu+>)*DoWPAMI^qe&}R^J@0 z-xaRk^^e*M-Tz>V)PF2^cPNLz$fZn2P!wDV25E}>2~Eh3i9<=-Cca`-DJ!-{T(J;WY4NASpPpoxZmlTF06nOOfJJ>PjT`i( z1JYTHW^587Es`y!xh|s(f|o86d~-{DwL_$#Q_P*jt90oVa~PC%RF~0hktu9>u0T@W zBkf6@yeCPlGGzTI;gvhXZCkHmqxxo-MM;F!eXvXK&UD+|S?=s6l{;s>9wV|S39+D+ zi#Ew22iKV|hLioSIL(e7?+`W5g3n!k<9ni7=C!YXA6uWN9sWB*)#}y#Yu9=a@D8ql zJ8r02zsA#Ys1?;3uS3A=In>hBiady4J-7}^PHA`>a!HOS!4~g?cUpOTG&eL4*3?|P9|?kS5ONTTzeX(jc^yR4 zoJBr>A` z{-@NE1`-`XGd2Rn+rY%3u@OJ09t{AXp!GohB-lU|4fR3i>X0YkUAG1mGC7VwMbQ^1 z1_VTM4~k$}CC|GfSrtM3yIBRnwwN{hbnB_s(_2n$iC8OVJYnmKx2=^R2C@qQod~4G z?AbwGEGs9dzm!)V!~c9|%uy!(zn)=mn1iOpY_6>OZ10)guRS=qpU9Z(llv$4Pv1Aa zduH3r#LUp_y`iGU1#45xnssvD1d* z?ug|$-ph8JUiFn#Ge^SN4U>kTCT29B)KBVz6SH^E?}-(a%ofdchE}#NYB*Eobxvj4 za0wX-eXA%}D`FcBCR$YrcbB6~TfF9Rd05KATdJ;11<>x$cJ*dX)i1ddF1 za$QIzLM_e7snYjBY8OsvMNHw&ap$@n>kYt6;Hrra?XsZX&<(kberLGzNV>#mQ_R+X zlW}}P8VA=&On;i|(#xwLE>}_y$`YoOkSl+p0EI6zyqB!+B~rc6?0Fx_*J$VQzkxS2 z$lN=3@qdjsm=G|V1^yyla7Le=nlIAX2`(*0*S|&6@=4GNMFZsMJQ&UQ9Tf-8!pFq0iQ>f*6fp}-Cms$!shqM? zSVr0-UQpKq0@K|%?4=P4MoH<^%M)@Ibab$CR4~!wk>P>y!~DM?S{4-$U>8)t>ZBAO zNFq51`SFDO1l3U-wNODphb{-2#m8zshsLiL8(mgh@HW-ZcuTB%GZRySngc(BcY^!X ziu#DX;e{hJ6{ky{E;)B3s0-N}eqPrU$!h-7+L?P#H$2^NzBZ^2Wi=~C%DC{6aCRf% z!i!eh$vsc(dAfhP=BbAw){3AC8gfD1C42U1{VDy_Cug$G+O9yRuP&_4qGR!A;+o(W4)Z<0eVF^YAgb`GQDXfQx8TQHAEHIPVSxD`+Upvk>@r}*T;&>&aOYR{<)2_Ij@wSFa2iu zd~?{fDO|j1elS$DGgekTR~{>>oH;sQv1s5j3YIuc#%3@(xrIx%o2$-rOsl?hoW^H4 zWqCd@v+lW1O^?RPE6*M~bL_cK&AMNC;QRyM?3@2&xPEK6eCwOFp|U-(%9V3{v9j9P z)_D(F$SOe#S#2uNAGw84u7$Q?3i0saZ+EJ=ti}(8tY-QP5C{FZV^_U)#<6R)_6^6b zJGIJG#Y5PnDQ7||I{#t18jRD?a-aj~OaOembS40fI{CZ^2lxs!fehK)dM5MF21HiO z2X0EQ<=h5>BnK?Yc|c!ml4uz%WGAV;AquEPiK|PYN;C<1hmy4P%X*E^i1fIG0^OEe8ctWzVu|BUU^YeCLdK3b@o~uYc0Vq2Zoq|Y5;yrQ$}7+n zU1ql}6E>19YMePKP!)3hIJZ)uDCAVPozYI{05CH+I1w+q^B88{9>-`36o&#v)5I|v zLMeFc%H+%MpL_Dk>F-=S{hEl!QUvvYN;oKi*sKWNa$2(09REWk^KZg)sdy*BGb$)q zpBOidct#Hmc(w?eZUq@rB{)gPAW~`UEiOPT-wAH+ldm8D)^SFwle&@SVec`LT0le{ z@OE6wMIN5|dtB4d&>*2@hTa%j=Klwh&`mY!JD$BmGI4UQ40v%$J`ivn&pqfLbFOZ3 zx<~wv5W*#_8~B~3Vf7$ihB6GBqgEq@3A^$pgkZzq9USM)6!~k4v?Aongth`~nY;rG z3G!GZyCtmToavrd#j(;xFw14DA^*D>Wz=9SAO1SGmGSXUx2bmAq5V;@V@H#gkKqHP z;ET8nj&@iozUU+hFU`r2M8*Q(3Qt8;-P)cwOi#$gfq9r(lG_L=m5E8I^op=Ondjq_ILGDXHspFHq6lp(2(W9l%S9X;ibWPysjXwRMMKHYb! z4`)RY`--4W$l4s#%Uei6o-()Twe9ozzuX&IwG{%M+0Oa)3+m9uy>ZdXe$_|IR#Fx; z4UQJ>5{*20LCXt~#2-pa8=7noU@#3gEzr1HX)(LwivfuIBbF~}AQ+hDr=$Q<39*q}6LjkgT^bwL0*yMCapDe?x;*!JSaOowaAf$9h>7ENp`y$X z)}dGb>>KaRe+zO&-w;2DLZm%MY@Y^}@XQia&=DRvK&O2kQ~D3egK#f znrei@1YQ4#Kj4K$A`@rQx<$c>!9g&VhT+j691-&YqD*NGiwl_6zEG*SfKx=IhiT<{ zkeOC)!Bd5hG8!!>Et8h1yJyzU_Rl{Ow1kbjVn!Q_YkSgmF}om|UHMja<;=R5H=f)0 z;^s(pb2Pg(oZUK~AIWYD8ZM%|=?T+R)swbZ){0rf%&|~rbI91t2#FN3C%!O`qZ7-K zJ)JbOX%5o!v>19-qRp4d8DFT0YTT*@4Xm26;B|;xDJ2Y4K?{e-A?B3mX~pFVenO^X z<2KCD*h#6m?GLJ1{|EHOkmyZPuf(%O726s_!=;nAY1-VBb=fO^CBXI3dOaatN{8+bT05k zpxZykDgd9i#FKxeUFgmZ6w+<+_z~+PV9~O?`dHtBYxRZg;(g32AjDmV~U`C-X3R4@H_V&WW zmjDM0dUUX2)4^DA0@1{YZuC`h30eds zz6JWraoFAeitrAs(*z80eIfU3;Ih=SRHZSoehY(vJhZ9f45(}T^ z5L=QKg;&JVX>po^xJ(xpm!XgTE~P^ic^)CCLXYXV1B#_Ee1qMFp441ueJk2Y#OXd9 zlmM1d$(|ay3kl|?vsR8vJe7_iV3$Fb8EVu*)F5-9a_Jb%%+>rLaIC(!6F$!kU0j3%8AiY576>gkPGG>T9Ukrmd3?Ym_8>@LM%}(GDM+=;DNFw zu?s79kbj1vr^zEimVXxB-I5$eu;SX83Etc13G@#S3;JOgQTWCQPmySjKTF;Wc|rL$6F`6Yra7_Pm!8eo7u~L1wYRf1N_#Ag@=2Hnam1 zqhl_kNF2mL2q_}c4LAHOWqb`D4o29q0MY0CHxa?)TtqUH6Uk=6p+bo=&=QShf@m_Z z0UiV}cCM)Qxw2>>#4l?umf!K*r=#U0)xPLl`Lgu|>x;Iivo-8&jW{>NiYu?1bR{;( zCSXyK-w@7kn0+*ozd4pya6QYEZ4T<8d7M`j+>G+MAST(B}$RuwI42$wa)iprx! ztHMRA5`ki8w74N$+z>0NINNciBUV~Tm&U}3opeb|tZ_}WvF)wKwn*VN__GyfU1wZh zyCdA#7B1Wdg1)~c|zYNq`iYvc7o^x#I>?`OSn5my7?>|<(h z);r(!mUT;t1;>ZK&F6}?t3I%&8*&gV`>~~Pr#{rW2K(0Eb98uBce3QNjiZj&Q$If+7TRm`gyBgv#J@h9OBgmN5%S%CU@5NK%ev zOhVkc1|7(9JyQS@mF};+`h_be-uSOmx@Vf){HvHCW$kTYz0w}Jd9x=8m}Le1dF-8p zo_*ow7kXw?ukZf$?z0tVDqiUM@Mbl3VgOt4_y5_hKpf)tmK`ELijIC4f4q;pd1OrC zUTI;nZV?%mq<0Qfq^x(I(BV@eMQ&5Op8x)>JN!NLHK9>obnu0TXR==Jezp52MbS2Q z82{J0&o-ZFe&OK{`5&Z@C_d4xsUw1Rjq-?;H0cwE6v``yP3s%fOM(JS@4tA{w=A>G zXWPHl{w>Rg{Erar(kW`06M_Izd>#)GJNyHM{!xr&ydmK~W){Z4ews{V5UmQex3_TT zsE40KZ6~-(c?D#MSG>F-UJ0p#7fwUHyyjwFVYqPfxgMyMNAfnOz2z5$iw>T9I8t;l zl7H}GK{3u)U$sPvH$@6IUAO2-&suLXi==P`n(n}XdL<30io9y_i1y)$*jb(fOfY{m zUPY$veo7#ZIDkMms$)#uqBfbGt4(I-@FKBu6cX7v3f-f!>ddpbv;MFPTob}?uDPJO z;J#q|(UuSBRU8a8)sI%KfdWTE8#c|6w3B4EJz6A*P2D%&LIOFSViLO01twdvgIM!gTm6yRE*l*g>ub>IhxBujHp=2cK{lj{Q&@09Q_ ziJX{AD8BpjJy~)r-ObXaRWQvoB;^4gteD4$!*zwexs6?VQbBIfxS<}0kOd(tQ%lZ3 z$VQ61>7AVn_}p1CwGRWlOw^E#a_Yt;88}*Y$R!g`cTQpkmdOz} zhyWi!bNma?IJ#x>=3G0Hm={gp$kJihVoGpqZ5DXwr@nfICEyfHwK|4b)= z^E9_odS~iPEKFxBDT`CXqE;E9X-=~jENiv2NMrtTZ>opfD?1XUA z+--e}k6weNsGX2ln!Byq%TQLHkfidRbxAK$@V4qJM}4=qax9&zZf-;FiU)NpGnY=Z zpiuI*dY3ep`vq}LxGOpvZ|+A|e2x07JIi;@Op?=IdTT|71vsJ(rM+m~K-pvT}kXTjJdoGFBB4_i=TV zlfQ&S#vRqwiFriTn!36TPX0+sqtaDX&c(A&J>itD3uhcu3I$K-^FNKTcomf^Q@}!t zJffTF1X0GIz%>cL$jg}d{-+M(7W~n1bm`rcZcUItv))-(2VNC?D}9a$qGO!#%ah|d z#LN0v4x^OA`RnH&kEe@wu%@Md^~nh$5U7Rt)rahx(-g3yT2TpDRg<&;KI;^tce4G^J!3bz_UAKtxpY?zgcsk z;>WI+bTfnJe7J?Qnh~vn*39Ul&Ze-lDOBDZDqOu_ZISJTvKOo+a(MHsBkEcocC8Ps+z=|i|wd8shM3>j|ma&-rr6pg=94c&Bur|g^Vl2NYs-1#emE*Maloh9UcSoz&gsazt zs@8@|*DcuZlv6qv>`poS>Dj?(!xo$phU)JMm2O?Iw#GJ1YA+RzqmXbaVE3zcqP zu1^&l!3s3JmwQpw2Ty1pq-Qm@DhnjbVDt0gA z?vaakzGHV{oW(1!GvTPH>ex;@SfQTu3lc zL4t`Q@tnD6QNK%-ESaD;Ni@NNB%AoaL_x7$sx3wKU_h(E#1aQ)=T1Di#E5F&m7W2XEj5_{`);X zXbSPenZRM}o_a|>fxA|wJ`Y{G6pDqIdH^qO=?Lrl%_0HZ8Hn+UE^(8NOy?y;&+(Wz z`!C0k9t>)Ui^m&bt2!dfYdG9PsP2HiLJ&=`(--~-+JkBbNmxV$22vJa!X@@0$%;h! z)eM-L^iS|~#b8{6wgY(s)M4rP<#7asyp)NFUm=){2?{hJL(&z3@8zzD@H3QThuR$}M-1^9eF@b+s3EJvPUK8?iOY$JO~cWj zYBcE{sV>bL90KFW-H2mgsxi$a#29XkOcs-^L4P#_4f1;A4$@U}D#R<+p=5iVAn%FD zR@6?4f8Rux5{J@MYO_j7VB^*?`*3yQ%VS;$^`^Nv`vY+Vs|&K?bQiCS2omNFJc`;# z{F~-_h-_z0NxZ?X&6e9y5KzS1vC6d^*z=L?Clxq>+w=uDt%nS&pD1VxJTQz$;oV$SzB zHh_W@&B3C^imtC@`1?*S zt))cO+McjY*Pd-W(-=0ozHDPaSujg?VdDbE6sSxvk>NQy;w6}z1b?dt{w6RVpe3d= z-6^Rm%NR};l=)N%*qeZfqywr1YoX=?7*B!`+-gHGni$(Or=$WTw+fN&UBK|@>)0CT zgla^^WD+ey%&S$>#77(PeV=G3Y2XfP9M6ty_*q{PKD4GY{rgWn<&`MEcnrA}Um~A90As`+4y`bD}!1wcy0fg*L@GJdDp*NRUq>75 zIn;tfJV$xdvHPW#nemq&J@;sI#m?}Goskv0B2~Mw;~a(4bz~W7jv2GDPw>+^Gr4ox z5QWxW%FPR!F4fk(>_6v^)^5Zl;qTOL#;OkPjTKeTmdrgo_dsaH_Hfa5L|7ftJ)Psx z@|JLU%WH02CbM?ug7xl;H7jR}BQwMUX%lD?7hp482%JdB3t6rKXF<65uzL+%JkW(x zkod_-{NzQt`jGu*MM4D`CnxHpji)#=xs9Y=;Cl4sW+A<2ZheCui`*dUPl#95|98`$ zSe3qV@mqhQev|@6+=q3X5dQH5?-J6kl(j=i4BfXPkc8|3NR*NNt&i}bavewQ0jgWp zllnGw;aRNDgNO|f*(RRk?|iFihj^5afOM9xPnYiuQQ@zU$MC9NMAFO2r=SbKK*v*5 zfZ^RAQ;6_4J4sCf5EcST(liQ%%g*pl>NBahNoV^pM`6_AT5!0QKjE*tl?;d2Pw`5& z;#0oZ#;tEQzp?&#$MlgipPthI3e4TRPzrp!Nn_5AlP|KO?1lV1{l zO9#K1$vy%Zns_~Yx-PGf!J;LSEg%%9PHjr!$K(Zp$u(M|#u8k*6*X3djg@a3s~NBZ zy~wCCh9*9P?lNK$J=lqGhs(aaEP>cVQN#VqSbE}*TrrfybRPbM;)wR=pQq3ac}hZt z$0&h3Vz~odC_qAn!ry8Qy7i0Mg}S<#qD2mmIqeO4Twj-=E1Yee+kSrYB8T9cJ1*p0 z=)X|#qmF;2*Tpis&OCi^rfMcIv+~S?H#oe0P_5S0h-@coj0V<^zqmugB8Ue&gRhyu z>GIbC_)<+ckeK{S8&_qS0PJd6y%oqHHbc@AAv=MSagh-dEATI3oV_$oB3EGJV=4IJ zT_J6e_#xJaswAXE$=?T0Q1dW9Vs~e2Jcs&uT24F>xVShRN|Wr@3?aDHQ8XcE@h9_$ ztrN6f{A4Oms7sU$P;+!U`1oNMS~1!{(2pM*!&TtoCt_cW7%1^85~0JBY+tb8s*VwF zKl^zz@j9p-tY^c1(SAz*(6H|z&+5d_7zpNsMVFwN2zZ68LN@GSyQ2_ z_yx}_sy7qn$S{a%z$F;$hgL;F2995)h1Nr%QSwsd8sZ0_*-evS3C2z0@1AbqUqdSX zbAf+>x2RF6RM*uSm3GO@sjTmECidU*ORnmdTvM29`UO||3(oNiF8>!?!7sTDQEtO8 zxT<%#j9+khSGlHlxvUsx{(|juw&279Wh;M|%f8I5yrDO!a;I`(gP_WVWKeDSKwYKU zp<3j~U(z6AQH;QijFgzK+KNQ-r9=weSYuITO!dR4L6vc%WS3S|Fx_~Aqvwr-#tkYn qz2R}=xN5&jRXpv#!O`=BPpI2fs+#K@`HT0f)kxa^uN)q1b^Tvb-CUsn literal 0 HcmV?d00001 diff --git a/src/lib/colors.ts b/src/lib/colors.ts new file mode 100644 index 0000000..82f9d8e --- /dev/null +++ b/src/lib/colors.ts @@ -0,0 +1,69 @@ +export const brandColors = { + primary: { + 600: '#C41E3A', + 700: '#A01830', + 500: '#D4244A', + 400: '#E04A68', + 100: '#FEF2F4', + }, + neutral: { + 900: '#171717', + 800: '#262626', + 700: '#404040', + 600: '#525252', + 500: '#737373', + 400: '#A3A3A3', + 300: '#D4D4D4', + 200: '#E5E5E5', + 100: '#F5F5F5', + 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', + + textPrimary: '#171717', + textSecondary: '#525252', + textTertiary: '#737373', + textMuted: '#A3A3A3', + + bgPrimary: '#FFFFFF', + bgSecondary: '#FAFAFA', + bgTertiary: '#F5F5F5', + + border: '#E5E5E5', + borderHover: '#D4D4D4', + + success: '#16A34A', + successBg: '#F0FDF4', + warning: '#D97706', + warningBg: '#FFFBEB', + info: '#0284C7', + infoBg: '#F0F9FF', + error: '#DC2626', + errorBg: '#FEF2F2', +} as const; + +export type BrandColor = typeof brandColors; +export type ColorValue = typeof colorValues; diff --git a/src/lib/constants.ts b/src/lib/constants.ts new file mode 100644 index 0000000..beca0f8 --- /dev/null +++ b/src/lib/constants.ts @@ -0,0 +1,323 @@ +// Company Information +export const COMPANY_INFO = { + name: '四川睿新致远科技有限公司', + shortName: '睿新致远', + slogan: '专注科技创新,驱动智慧未来', + description: '专注于信息技术服务与解决方案,为企业提供全方位的数字化转型支持', + founded: '2026', + location: '四川省成都市', + email: 'contact@novalon.cn', + phone: '028-88888888', + address: '中国四川省成都市龙泉驿区幸福路12号', +} as const; + +// Navigation Items - 单页面锚点导航 +export const NAVIGATION = [ + { id: 'home', label: '首页', href: '#home' }, + { id: 'about', label: '关于我们', href: '#about' }, + { id: 'services', label: '核心业务', href: '#services' }, + { id: 'products', label: '产品服务', href: '#products' }, + { id: 'news', label: '新闻动态', href: '#news' }, + { id: 'contact', label: '联系我们', href: '#contact' }, +] as const; + +// Stats Data +export const STATS = [ + { value: '50+', label: '企业客户' }, + { value: '100+', label: '成功案例' }, + { value: '200+', label: '项目交付' }, + { value: '8+', label: '年行业经验' }, +] as const; + +// Services Data +export const SERVICES = [ + { + id: 'software', + title: '软件开发', + description: '提供定制化软件开发服务,包括Web应用、移动应用、企业管理系统等', + icon: 'Code', + }, + { + id: 'cloud', + title: '云服务', + description: '提供云计算解决方案,包括云架构设计、云迁移、云运维等服务', + icon: 'Cloud', + }, + { + id: 'data', + title: '数据分析', + description: '提供大数据分析服务,帮助企业挖掘数据价值,支持决策制定', + icon: 'BarChart3', + }, + { + id: 'security', + title: '信息安全', + description: '提供信息安全咨询和解决方案,保护企业数据资产安全', + icon: 'Shield', + }, +] as const; + +// Products Data +export const PRODUCTS = [ + { + id: 'erp', + title: '睿新ERP管理系统', + description: '集成财务、采购、销售、库存、生产等模块的企业资源计划系统,帮助企业实现业务流程标准化、数据一体化管理。', + image: '/images/products/erp.jpg', + category: '企业软件', + features: ['财务管理', '采购管理', '销售管理', '库存管理', '生产管理', '报表分析'], + benefits: ['提升运营效率30%', '降低库存成本20%', '实现数据实时共享'], + }, + { + id: 'crm', + title: '睿新客户关系管理系统', + description: '全渠道客户管理平台,整合客户信息、跟进销售机会、提升客户满意度和忠诚度,助力企业业绩增长。', + image: '/images/products/crm.jpg', + category: '企业软件', + features: ['客户档案', '销售漏斗', '商机管理', '合同管理', '售后服务', '数据分析'], + benefits: ['销售转化率提升25%', '客户满意度提升40%', '销售周期缩短30%'], + }, + { + id: 'oa', + title: '睿新协同办公平台', + description: '一站式企业协同办公解决方案,提供流程审批、文档管理、日程安排、即时通讯等功能,提升团队协作效率。', + image: '/images/products/oa.jpg', + category: '企业软件', + features: ['流程审批', '文档管理', '日程管理', '即时通讯', '任务协作', '移动办公'], + benefits: ['审批效率提升50%', '纸质文档减少80%', '跨部门协作更顺畅'], + }, + { + id: 'bi', + title: '睿新商业智能平台', + description: '数据可视化分析平台,整合多源数据,提供丰富的图表和报表,助力企业数据驱动决策,发现业务增长机会。', + image: '/images/products/bi.jpg', + category: '数据产品', + features: ['数据整合', '可视化报表', '自助分析', '实时监控', '智能预警', '移动看板'], + benefits: ['决策效率提升60%', '数据准备时间减少70%', '发现隐藏业务洞察'], + }, + { + id: 'iot', + title: '睿新物联网平台', + description: '设备接入、数据采集、远程监控的一站式物联网解决方案,支持海量设备连接,助力企业实现智能制造。', + image: '/images/products/iot.jpg', + category: '物联网', + features: ['设备接入', '数据采集', '远程监控', '规则引擎', '设备管理', '数据分析'], + benefits: ['设备利用率提升35%', '故障响应时间缩短60%', '运维成本降低40%'], + }, + { + id: 'ai', + title: '睿新AI智能应用套件', + description: '基于人工智能技术的智能应用集合,包括智能客服、图像识别、智能推荐等功能,为企业注入AI动力。', + image: '/images/products/ai.jpg', + category: '人工智能', + features: ['智能客服', '图像识别', '语音识别', '智能推荐', '文本分析', '预测分析'], + benefits: ['客服成本降低50%', '识别准确率达98%', '用户体验显著提升'], + }, +] as const; + +// News Data +export const NEWS = [ + { + id: '1', + title: '四川睿新致远科技有限公司正式成立', + excerpt: '2026年1月15日,四川睿新致远科技有限公司在成都龙泉驿区正式成立,标志着公司在科技创新领域迈出了坚实的第一步。', + date: '2026-01-15', + category: '公司新闻', + image: '/images/news/founding.jpg', + content: `2026年1月15日,四川睿新致远科技有限公司在成都龙泉驿区幸福路12号正式成立。公司注册资本雄厚,拥有一支经验丰富的技术团队。 + +公司专注于信息技术服务与解决方案,致力于为企业提供全方位的数字化转型支持。成立之初,公司就确立了"专注科技创新,驱动智慧未来"的企业使命。 + +公司创始人表示:"我们将以客户需求为导向,以技术创新为驱动,为企业提供高质量的数字化解决方案,助力企业在数字经济时代实现转型升级。" + +公司目前已与多家知名企业建立了合作关系,业务范围涵盖软件开发、云服务、数据分析、信息安全等多个领域。`, + }, + { + id: '2', + title: '公司推出企业数字化转型解决方案', + excerpt: '针对中小企业数字化转型需求,公司推出一站式数字化转型解决方案,帮助企业快速实现数字化升级。', + date: '2026-01-20', + category: '产品发布', + image: '/images/news/solution.jpg', + content: `近日,四川睿新致远科技有限公司正式推出企业数字化转型解决方案,该方案整合了云计算、大数据、人工智能等前沿技术,为中小企业提供一站式的数字化升级服务。 + +该解决方案包括: +1. 数字化诊断:全面评估企业数字化现状,识别转型痛点 +2. 方案设计:根据企业实际情况,量身定制数字化转型方案 +3. 系统实施:专业团队负责系统部署和数据迁移 +4. 运维支持:提供7×24小时技术支持服务 + +公司技术总监表示:"我们的目标是让每一家企业都能享受到数字化带来的便利,无论企业规模大小,都能找到适合自己的数字化转型路径。" + +目前,该解决方案已在多个行业成功落地,获得了客户的一致好评。`, + }, + { + id: '3', + title: '与本地制造企业达成战略合作协议', + excerpt: '公司与成都某知名制造企业签署战略合作协议,双方将共同打造智能制造示范工厂。', + date: '2026-01-25', + category: '合作动态', + image: '/images/news/partnership.jpg', + content: `1月25日,四川睿新致远科技有限公司与成都某知名制造企业正式签署战略合作协议。根据协议,双方将在智能制造、工业互联网、数字化转型等领域展开深度合作。 + +此次合作的主要内容包括: +- 建设智能制造示范工厂 +- 开发工业互联网平台 +- 实施生产数字化管理系统 +- 开展技术人才培训 + +该制造企业负责人表示:"选择睿新致远作为合作伙伴,是看中了他们在数字化转型领域的专业能力和丰富经验。我们相信,通过双方的紧密合作,一定能够打造出行业领先的智能制造标杆。" + +公司项目团队已进驻现场,开始前期调研和方案设计工作。`, + }, + { + id: '4', + title: '公司加入四川省软件行业协会', + excerpt: '公司正式加入四川省软件行业协会,将积极参与行业交流与合作,推动本地软件产业发展。', + date: '2026-02-01', + category: '公司新闻', + image: '/images/news/membership.jpg', + content: `2月1日,四川睿新致远科技有限公司正式加入四川省软件行业协会,成为协会成员单位。这标志着公司在软件行业的专业地位得到了行业认可。 + +四川省软件行业协会是省内软件行业最具权威性的行业组织,拥有会员单位数百家。加入协会后,公司将享有以下权益: +- 参与行业标准制定 +- 获取政策信息和行业动态 +- 参加行业培训和交流活动 +- 享受会员专属服务 + +公司表示,将积极参与协会组织的各项活动,与行业同仁加强交流合作,共同推动四川省软件产业高质量发展。同时,公司也将严格遵守行业规范,坚持诚信经营,为客户提供优质的产品和服务。`, + }, + { + id: '5', + title: '2026年企业数字化转型趋势报告发布', + excerpt: '公司发布《2026年企业数字化转型趋势报告》,深入分析行业发展趋势,为企业提供转型参考。', + date: '2026-02-02', + category: '行业资讯', + image: '/images/news/report.jpg', + content: `四川睿新致远科技有限公司今日发布《2026年企业数字化转型趋势报告》,该报告基于对数百家企业的调研分析,深入剖析了当前企业数字化转型的现状、挑战与机遇。 + +报告主要发现: + +1. 数字化转型已成为企业共识 +调研显示,超过85%的企业已将数字化转型列为战略优先级,较2025年提升15个百分点。 + +2. 中小企业转型需求迫切 +中小企业数字化转型意愿强烈,但面临资金、技术、人才等多重挑战,需要专业服务商提供支持。 + +3. 云原生技术成为主流 +容器化、微服务、DevOps等云原生技术正在被越来越多的企业采用,成为数字化转型的技术底座。 + +4. 数据驱动决策成为标配 +企业越来越重视数据资产的价值,数据分析与商业智能应用普及率持续提升。 + +报告还针对不同类型的企业提出了差异化的转型建议,为企业的数字化转型提供了有价值的参考。`, + }, + { + id: '6', + title: '公司官网全新上线', + excerpt: '经过精心筹备,公司官方网站正式上线,为客户提供更加便捷的信息获取渠道。', + date: '2026-02-02', + category: '公司新闻', + image: '/images/news/website.jpg', + content: `经过数周的精心筹备,四川睿新致远科技有限公司官方网站今日正式上线运行。新网站采用现代化的设计风格,功能完善,内容丰富,为客户和合作伙伴提供了更加便捷的信息获取渠道。 + +网站主要功能模块: +- 公司介绍:全面了解公司发展历程、企业文化和核心价值观 +- 核心业务:详细介绍公司的服务范围和技术能力 +- 产品服务:展示自主研发的各类产品和解决方案 +- 新闻动态:及时发布公司最新动态和行业资讯 +- 联系我们:提供多种联系方式,方便客户咨询合作 + +公司表示,将持续优化网站功能和内容,将其打造为展示公司形象、服务客户需求的重要窗口。欢迎广大客户和合作伙伴访问浏览,提出宝贵意见。`, + }, +] as const; + +// Solutions Data +export const SOLUTIONS = [ + { + id: 'fintech', + title: '金融科技', + description: '为金融机构提供数字化转型解决方案,包括智能风控、数字营销、客户管理等', + icon: 'Landmark', + features: ['智能风控系统', '数字营销平台', '客户关系管理', '数据分析平台'], + color: '#C41E3A', + }, + { + id: 'enterprise', + title: '企业数字化', + description: '助力企业实现数字化转型,提供ERP、CRM、OA等企业管理解决方案', + icon: 'Building2', + features: ['ERP管理系统', 'CRM客户管理', 'OA协同办公', 'BI数据分析'], + color: '#1A1A1A', + }, + { + id: 'smart-manufacturing', + title: '智能制造', + description: '推动制造业智能化升级,提供工业互联网、物联网解决方案', + icon: 'Factory', + features: ['工业互联网平台', '设备物联系统', '生产执行系统', '质量追溯系统'], + color: '#D4A574', + }, + { + id: 'data-intelligence', + title: '数据智能', + description: '挖掘数据价值,提供大数据分析、人工智能应用解决方案', + icon: 'Brain', + features: ['大数据平台', 'AI智能应用', '数据可视化', '智能决策支持'], + color: '#8B4513', + }, +] as const; + +// Cases Data +export const CASES = [ + { + id: 'case-1', + title: '某银行数字化转型项目', + client: '某国有银行', + industry: '金融科技', + description: '为某国有银行提供全面的数字化转型解决方案,包括核心系统升级、数据中台建设、智能风控系统部署等,助力银行实现业务流程自动化和智能化。', + results: [ + { label: '业务处理效率', value: '提升60%' }, + { label: '客户满意度', value: '提升45%' }, + { label: '运营成本', value: '降低30%' }, + ], + tags: ['金融科技', '数字化转型', '数据中台'], + image: '/images/cases/bank.jpg', + }, + { + id: 'case-2', + title: '智能制造示范工厂项目', + client: '某大型制造企业', + industry: '智能制造', + description: '为制造企业打造智能制造示范工厂,实现生产设备互联、生产过程可视化、质量追溯全覆盖,提升生产效率和产品质量。', + results: [ + { label: '生产效率', value: '提升40%' }, + { label: '设备利用率', value: '提升35%' }, + { label: '不良品率', value: '降低50%' }, + ], + tags: ['智能制造', '工业互联网', 'IoT'], + image: '/images/cases/manufacturing.jpg', + }, + { + id: 'case-3', + title: '企业数据中台建设项目', + client: '某零售集团', + industry: '企业数字化', + description: '为零售集团建设企业级数据中台,整合多渠道数据资源,实现数据资产统一管理,支撑精准营销和智能决策。', + results: [ + { label: '数据整合效率', value: '提升80%' }, + { label: '决策响应时间', value: '缩短70%' }, + { label: '营销转化率', value: '提升25%' }, + ], + tags: ['数据中台', '大数据', '商业智能'], + image: '/images/cases/retail.jpg', + }, +] as const; + +// Social Links +export const SOCIAL_LINKS = [ + { name: '微信', href: '#', icon: 'MessageCircle' }, + { name: '微博', href: '#', icon: 'Share2' }, + { name: 'LinkedIn', href: '#', icon: 'Linkedin' }, + { name: 'GitHub', href: '#', icon: 'Github' }, +] as const; diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..bd0c391 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +}