feat(analytics): enhance Google Analytics with privacy compliance and comprehensive tracking

- Add automatic route change tracking for SPA navigation
- Implement Cookie consent banner for GDPR compliance
- Add performance tracking (LCP, FID, CLS Web Vitals)
- Add outbound link click tracking
- Integrate contact form submission tracking with conversion events
- Add CTA button click tracking in hero section
- Integrate error tracking in ErrorBoundary component
- Extend analytics utility library with 15+ tracking functions
- Configure IP anonymization and privacy settings
- Remove unused test files and deployment scripts
- Update case studies to include only specified cases
- Fix mobile navigation active state issues
- Fix lint errors in test files and components

BREAKING CHANGE: Google Analytics now requires user consent before tracking
This commit is contained in:
张翔
2026-04-22 07:19:29 +08:00
parent b117372b03
commit 2f45818724
45 changed files with 652 additions and 2293 deletions
+13 -2
View File
@@ -8,6 +8,7 @@ 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';
interface HeroContentProps {
isVisible: boolean;
@@ -94,6 +95,16 @@ 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');
};
return (
<motion.div
initial={shouldReduceMotion ? {} : { opacity: 0, y: 20 }}
@@ -102,7 +113,7 @@ 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">
<StaticLink href="/contact" onClick={handleConsultClick}>
<SealButton size="lg" className="min-w-45">
<ArrowRight className="w-4 h-4 ml-2" />
@@ -113,7 +124,7 @@ export function HeroButtons({ isVisible }: HeroContentProps) {
<RippleButton
size="lg"
variant="outline"
onClick={() => scrollTo('about')}
onClick={handleLearnMoreClick}
onKeyDown={(e) => handleKeyDown(e, 'about')}
className="min-w-45"
>