chore: sync marketing pages, CMS extensions, tests and project docs
同步工作区剩余变更,主要包括: - 营销页面组件与布局持续优化(about/news/services/solutions/team 等) - 详情页四层叙事组件、布局组件、UI 组件调整 - CMS 数据模型、API 路由、权限、工作流、站内通知、媒体管理扩展 - 新增/补充单元测试与 E2E 测试(cms-workflow.spec.ts 等) - ESLint 9 迁移、jest/tsconfig 配置更新、依赖调整 - 新增 ADR、CMS 评估文档、Release Review / Acceptance 报告 - 移除水墨装饰组件与大体积未使用字体文件
This commit is contained in:
@@ -4,7 +4,7 @@ import { useCallback, useRef, useState } from 'react';
|
||||
import { motion } from 'framer-motion';
|
||||
import { StaticLink } from '@/components/ui/static-link';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { HeroInkBackground } from '@/components/ui/hero-ink-background';
|
||||
|
||||
import { COMPANY_INFO } from '@/lib/constants';
|
||||
import { ArrowRight, MessageSquare, Search, Rocket, Handshake } from 'lucide-react';
|
||||
import { useReducedMotion } from '@/hooks/use-reduced-motion';
|
||||
@@ -52,8 +52,6 @@ export function HeroSectionV2() {
|
||||
aria-labelledby="hero-heading"
|
||||
className="relative min-h-screen flex flex-col justify-center overflow-hidden bg-[var(--color-bg-primary)]"
|
||||
>
|
||||
<HeroInkBackground />
|
||||
|
||||
<div className="container-wide py-16 md:py-24 lg:py-32 relative z-10 flex-1 flex items-center">
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-center w-full">
|
||||
<div>
|
||||
@@ -112,7 +110,7 @@ export function HeroSectionV2() {
|
||||
>
|
||||
<div
|
||||
ref={cardRef}
|
||||
className="relative ink-glow-border rounded-2xl lg:opacity-95"
|
||||
className="relative overflow-hidden rounded-2xl lg:opacity-95 border border-[var(--color-border-primary)]"
|
||||
style={
|
||||
{
|
||||
'--glow-start': 'var(--color-brand)',
|
||||
|
||||
@@ -5,7 +5,7 @@ import { useInView } from 'framer-motion';
|
||||
import { useRef } from 'react';
|
||||
import { METHODOLOGY } from '@/lib/constants/methodology';
|
||||
import { CheckCircle2 } from 'lucide-react';
|
||||
import { InkGlowCard } from '@/components/ui/ink-glow-card';
|
||||
import { Card } from '@/components/ui/card';
|
||||
|
||||
const phaseBgOpacities = [0.1, 0.08, 0.12, 0.06];
|
||||
|
||||
@@ -38,9 +38,9 @@ export function MethodologySection() {
|
||||
{METHODOLOGY.map((phase, idx) => {
|
||||
const bgOpacity = phaseBgOpacities[idx % phaseBgOpacities.length];
|
||||
return (
|
||||
<InkGlowCard
|
||||
<Card
|
||||
key={phase.id}
|
||||
index={idx}
|
||||
className="relative overflow-hidden transition-all duration-300 hover:-translate-y-1 hover:shadow-lg"
|
||||
>
|
||||
<div className="p-6 md:p-8">
|
||||
<div
|
||||
@@ -78,7 +78,7 @@ export function MethodologySection() {
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</InkGlowCard>
|
||||
</Card>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
@@ -43,8 +43,8 @@ export function ProductCard({
|
||||
|
||||
{/* Content */}
|
||||
<div className="relative z-10">
|
||||
{/* Icon */}
|
||||
<div className="w-10 h-10 sm:w-12 sm:h-12 rounded-lg bg-[var(--color-brand-bg)] flex items-center justify-center mb-4 sm:mb-5 transition-transform duration-500 group-hover:scale-110">
|
||||
{/* Icon: 装饰性图标,对屏幕阅读器隐藏 */}
|
||||
<div className="w-10 h-10 sm:w-12 sm:h-12 rounded-lg bg-[var(--color-brand-bg)] flex items-center justify-center mb-4 sm:mb-5 transition-transform duration-500 group-hover:scale-110" aria-hidden="true">
|
||||
{icon}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -78,10 +78,6 @@ jest.mock('@/components/ui/brand-visuals', () => ({
|
||||
),
|
||||
}));
|
||||
|
||||
jest.mock('@/components/ui/hero-ink-background', () => ({
|
||||
HeroInkBackground: () => <div data-testid="hero-ink-bg" />,
|
||||
}));
|
||||
|
||||
jest.mock('next/link', () => ({
|
||||
__esModule: true,
|
||||
default: ({ children, href, className, ...props }: any) => (
|
||||
@@ -354,12 +350,6 @@ describe('HeroSectionV2', () => {
|
||||
expect(screen.getAllByText('长期陪跑').length).toBeGreaterThanOrEqual(1);
|
||||
});
|
||||
|
||||
it('should render ink background', async () => {
|
||||
const { HeroSectionV2 } = await import('./hero-section-v2');
|
||||
render(<HeroSectionV2 />);
|
||||
expect(screen.getByTestId('hero-ink-bg')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('should provide CTA link to contact', async () => {
|
||||
const { HeroSectionV2 } = await import('./hero-section-v2');
|
||||
render(<HeroSectionV2 />);
|
||||
|
||||
Reference in New Issue
Block a user