dev #15
@@ -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 });
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 } : {}}
|
||||||
|
|||||||
Reference in New Issue
Block a user