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 now = new Date();
const diff = now.getTime() - foundingDate.getTime(); const diff = now.getTime() - foundingDate.getTime();
const days = Math.floor(diff / (1000 * 60 * 60 * 24)); const totalDays = Math.floor(diff / (1000 * 60 * 60 * 24));
const years = Math.floor(days / 365); const years = Math.floor(totalDays / 365);
const months = Math.floor((days % 365) / 30); const months = Math.floor((totalDays % 365) / 30);
const days = totalDays % 30;
setOperationTime({ days, months, years }); 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 { StaticLink } from '@/components/ui/static-link';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
const categories = ['全部', '软件产品', '云服务', '数据分析', '信息安全']; const categories = ['全部', '企业软件', '数据产品'];
const ITEMS_PER_PAGE = 6; const ITEMS_PER_PAGE = 6;
export default function ProductsPage() { export default function ProductsPage() {
+18 -7
View File
@@ -1,5 +1,6 @@
'use client'; 'use client';
import { Fragment } from 'react';
import { StaticLink } from '@/components/ui/static-link'; import { StaticLink } from '@/components/ui/static-link';
import { ChevronRight, Home } from 'lucide-react'; import { ChevronRight, Home } from 'lucide-react';
@@ -14,20 +15,30 @@ interface BreadcrumbProps {
export function Breadcrumb({ items }: BreadcrumbProps) { export function Breadcrumb({ items }: BreadcrumbProps) {
return ( return (
<nav aria-label="breadcrumb" className="flex items-center space-x-2 text-sm text-[#5C5C5C] py-4"> <nav
<StaticLink href="/" className="flex items-center hover:text-[#C41E3A] transition-colors" aria-label="返回首页"> aria-label="breadcrumb"
<Home className="w-4 h-4" /> 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> </StaticLink>
{items.map((item, index) => ( {items.map((item, index) => (
<div key={index} className="flex items-center"> <Fragment key={index}>
<ChevronRight className="w-4 h-4 text-[#E5E5E5]" /> <ChevronRight className="w-3 h-3 text-[#CCCCCC] shrink-0 mx-1" />
<StaticLink <StaticLink
href={item.href} 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} {item.label}
</StaticLink> </StaticLink>
</div> </Fragment>
))} ))}
</nav> </nav>
); );
+7 -11
View File
@@ -3,12 +3,13 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { StaticLink } from '@/components/ui/static-link'; 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 { MagneticButton, BlurReveal, CounterWithEffect } from '@/lib/animations';
import { COMPANY_INFO, STATS } from '@/lib/constants'; import { COMPANY_INFO, STATS } from '@/lib/constants';
import { ArrowRight, Shield, Zap, Award } from 'lucide-react'; import { ArrowRight, Shield, Zap, Award } from 'lucide-react';
import { useReducedMotion } from '@/hooks/use-reduced-motion'; import { useReducedMotion } from '@/hooks/use-reduced-motion';
import { trackButtonClick, trackServiceInterest } from '@/lib/analytics'; import { trackButtonClick } from '@/lib/analytics';
interface HeroContentProps { interface HeroContentProps {
isVisible: boolean; isVisible: boolean;
@@ -95,11 +96,6 @@ export function HeroDescription(_props: HeroContentProps) {
export function HeroButtons({ isVisible }: HeroContentProps) { export function HeroButtons({ isVisible }: HeroContentProps) {
const shouldReduceMotion = useReducedMotion(); const shouldReduceMotion = useReducedMotion();
const handleConsultClick = () => {
trackButtonClick('consult_now', 'hero_section');
trackServiceInterest('consultation');
};
const handleLearnMoreClick = () => { const handleLearnMoreClick = () => {
trackButtonClick('learn_more', 'hero_section'); trackButtonClick('learn_more', 'hero_section');
scrollTo('about'); 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" className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-8"
> >
<MagneticButton strength={0.4}> <MagneticButton strength={0.4}>
<StaticLink href="/contact" onClick={handleConsultClick}> <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>
<SealButton size="lg" className="min-w-45"> <StaticLink href="/contact">
<ArrowRight className="w-4 h-4 ml-2" /> <ArrowRight className="w-4 h-4 ml-2" />
</SealButton> </StaticLink>
</StaticLink> </Button>
</MagneticButton> </MagneticButton>
<MagneticButton strength={0.4}> <MagneticButton strength={0.4}>
<RippleButton <RippleButton
+1 -1
View File
@@ -31,7 +31,7 @@ export function PageHeader({ badge, title, description, className = '' }: PageHe
/> />
<SubtleDots color="#C41E3A" count={6} /> <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 <motion.div
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
animate={isInView ? { opacity: 1, y: 0 } : {}} animate={isInView ? { opacity: 1, y: 0 } : {}}