dev #15

Merged
zhangxiang merged 15 commits from dev into main 2026-04-23 21:31:54 +08:00
5 changed files with 31 additions and 23 deletions
+4 -3
View File
@@ -20,9 +20,10 @@ export function AboutClient() {
const now = new Date();
const diff = now.getTime() - foundingDate.getTime();
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
const years = Math.floor(days / 365);
const months = Math.floor((days % 365) / 30);
const totalDays = Math.floor(diff / (1000 * 60 * 60 * 24));
const years = Math.floor(totalDays / 365);
const months = Math.floor((totalDays % 365) / 30);
const days = totalDays % 30;
setOperationTime({ days, months, years });
};
+1 -1
View File
@@ -12,7 +12,7 @@ import { Search, ArrowLeft, Check, TrendingUp, ChevronLeft, ChevronRight, Filter
import { StaticLink } from '@/components/ui/static-link';
import { motion } from 'framer-motion';
const categories = ['全部', '软件产品', '云服务', '数据分析', '信息安全'];
const categories = ['全部', '企业软件', '数据产品'];
const ITEMS_PER_PAGE = 6;
export default function ProductsPage() {
+18 -7
View File
@@ -1,5 +1,6 @@
'use client';
import { Fragment } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import { ChevronRight, Home } from 'lucide-react';
@@ -14,20 +15,30 @@ interface BreadcrumbProps {
export function Breadcrumb({ items }: BreadcrumbProps) {
return (
<nav aria-label="breadcrumb" className="flex items-center space-x-2 text-sm text-[#5C5C5C] py-4">
<StaticLink href="/" className="flex items-center hover:text-[#C41E3A] transition-colors" aria-label="返回首页">
<Home className="w-4 h-4" />
<nav
aria-label="breadcrumb"
className="flex items-center text-xs md:text-sm text-[#5C5C5C] py-3 md:py-4"
style={{ lineHeight: '1' }}
>
<StaticLink
href="/"
className="hover:text-[#C41E3A] transition-colors shrink-0"
aria-label="返回首页"
style={{ minHeight: 0, minWidth: 0 }}
>
<Home className="w-3.5 h-3.5" />
</StaticLink>
{items.map((item, index) => (
<div key={index} className="flex items-center">
<ChevronRight className="w-4 h-4 text-[#E5E5E5]" />
<Fragment key={index}>
<ChevronRight className="w-3 h-3 text-[#CCCCCC] shrink-0 mx-1" />
<StaticLink
href={item.href}
className="ml-2 hover:text-[#C41E3A] transition-colors"
className="hover:text-[#C41E3A] transition-colors whitespace-nowrap"
style={{ minHeight: 0, minWidth: 0 }}
>
{item.label}
</StaticLink>
</div>
</Fragment>
))}
</nav>
);
+6 -10
View File
@@ -3,12 +3,13 @@
import { useEffect, useState } from 'react';
import { motion } from 'framer-motion';
import { StaticLink } from '@/components/ui/static-link';
import { RippleButton, SealButton } from '@/components/ui/ripple-button';
import { RippleButton } from '@/components/ui/ripple-button';
import { Button } from '@/components/ui/button';
import { MagneticButton, BlurReveal, CounterWithEffect } from '@/lib/animations';
import { COMPANY_INFO, STATS } from '@/lib/constants';
import { ArrowRight, Shield, Zap, Award } from 'lucide-react';
import { useReducedMotion } from '@/hooks/use-reduced-motion';
import { trackButtonClick, trackServiceInterest } from '@/lib/analytics';
import { trackButtonClick } from '@/lib/analytics';
interface HeroContentProps {
isVisible: boolean;
@@ -95,11 +96,6 @@ export function HeroDescription(_props: HeroContentProps) {
export function HeroButtons({ isVisible }: HeroContentProps) {
const shouldReduceMotion = useReducedMotion();
const handleConsultClick = () => {
trackButtonClick('consult_now', 'hero_section');
trackServiceInterest('consultation');
};
const handleLearnMoreClick = () => {
trackButtonClick('learn_more', 'hero_section');
scrollTo('about');
@@ -113,12 +109,12 @@ export function HeroButtons({ isVisible }: HeroContentProps) {
className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-8"
>
<MagneticButton strength={0.4}>
<StaticLink href="/contact" onClick={handleConsultClick}>
<SealButton size="lg" className="min-w-45">
<Button size="lg" className="min-w-45 bg-[#C41E3A] hover:bg-[#A01830] text-white shadow-[0_6px_20px_rgba(196,30,58,0.3)]" asChild>
<StaticLink href="/contact">
<ArrowRight className="w-4 h-4 ml-2" />
</SealButton>
</StaticLink>
</Button>
</MagneticButton>
<MagneticButton strength={0.4}>
<RippleButton
+1 -1
View File
@@ -31,7 +31,7 @@ export function PageHeader({ badge, title, description, className = '' }: PageHe
/>
<SubtleDots color="#C41E3A" count={6} />
<div className="container-wide relative z-10 pt-32 pb-20" ref={ref}>
<div className="container-wide relative z-10 pt-8 pb-12" ref={ref}>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}