refactor: 移除hero水墨动画,优化全局样式与组件细节

This commit is contained in:
张翔
2026-05-04 00:00:19 +08:00
parent 61bb24d56e
commit 747405dc96
19 changed files with 1757 additions and 19 deletions
+5 -1
View File
@@ -1152,10 +1152,14 @@ body {
}
/* 优化移动端按钮和链接的触摸目标 */
a, button {
a:not(nav[aria-label="breadcrumb"] a), button {
min-height: 44px;
min-width: 44px;
}
nav[aria-label="breadcrumb"] a {
min-height: 0;
min-width: 0;
}
/* 防止长文本溢出 */
p, li, span {
+6 -1
View File
@@ -124,7 +124,12 @@ export default function RootLayout({
<html lang="zh-CN" className="scroll-smooth" suppressHydrationWarning>
<head>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/favicon.svg" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="manifest" href="/site.webmanifest" />
<meta name="theme-color" content="#C41E3A" />
<OrganizationSchema />
<WebsiteSchema />
</head>
+2 -2
View File
@@ -14,7 +14,7 @@ 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">
<nav aria-label="breadcrumb" className="flex items-center space-x-1 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" />
</StaticLink>
@@ -23,7 +23,7 @@ export function Breadcrumb({ items }: BreadcrumbProps) {
<ChevronRight className="w-4 h-4 text-[#E5E5E5]" />
<StaticLink
href={item.href}
className="ml-2 hover:text-[#C41E3A] transition-colors"
className="ml-1 hover:text-[#C41E3A] transition-colors"
>
{item.label}
</StaticLink>
+5 -5
View File
@@ -14,15 +14,15 @@ interface PageNavProps {
export function PageNav({ items }: PageNavProps) {
return (
<nav aria-label="breadcrumb" className="flex items-center gap-1.5 text-sm text-[#A3A3A3] mb-8">
<StaticLink href="/" className="flex items-center hover:text-[#C41E3A] transition-colors" aria-label="返回首页">
<Home className="w-3.5 h-3.5" />
<nav aria-label="breadcrumb" className="flex items-center gap-[3px] md:gap-1 text-[11px] md:text-sm text-[#A3A3A3] mb-2 md:mb-8 -ml-0.5">
<StaticLink href="/" className="flex items-center w-fit hover:text-[#C41E3A] transition-colors" aria-label="返回首页">
<Home className="w-2.5 h-2.5 md:w-3.5 md:h-3.5" />
</StaticLink>
{items.map((item, index) => {
const isLast = index === items.length - 1;
return (
<div key={index} className="flex items-center gap-1.5">
<ChevronRight className="w-3.5 h-3.5 text-[#D4D4D4]" />
<div key={index} className="flex items-center gap-[3px] md:gap-1">
<ChevronRight className="w-2.5 h-2.5 md:w-3.5 md:h-3.5 text-[#D4D4D4]" />
{isLast || !item.href ? (
<span className={isLast ? 'text-[#1C1C1C] font-medium' : ''}>
{item.label}
@@ -1,7 +1,6 @@
'use client';
import { useEffect, useRef, useState } from 'react';
import dynamic from 'next/dynamic';
import { motion } from 'framer-motion';
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
@@ -9,11 +8,6 @@ import { COMPANY_INFO } from '@/lib/constants';
import { ArrowRight } from 'lucide-react';
import { useReducedMotion } from '@/hooks/use-reduced-motion';
const InkDataMorph = dynamic(
() => import('@/components/effects/ink-data-morph').then(mod => ({ default: mod.InkDataMorph })),
{ ssr: false }
);
export function HeroSectionV2() {
const [isVisible, setIsVisible] = useState(false);
const sectionRef = useRef<HTMLElement>(null);
@@ -48,7 +42,6 @@ export function HeroSectionV2() {
aria-labelledby="hero-heading"
className="relative min-h-screen flex flex-col justify-center overflow-hidden bg-white"
>
<InkDataMorph />
<div className="container-wide py-24 md:py-32 lg:py-40 relative z-10 flex-1 flex items-center">
<div className="max-w-3xl">
<motion.div
+1 -1
View File
@@ -35,7 +35,7 @@ export function BackToTop() {
exit={shouldReduceMotion ? {} : { opacity: 0, y: 20, scale: 0.8 }}
transition={{ duration: 0.2, ease: 'easeOut' }}
onClick={scrollToTop}
className="fixed bottom-8 right-8 z-50 p-3 bg-[#C41E3A] text-white rounded-full shadow-lg hover:bg-[#A01830] hover:shadow-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-[#C41E3A] focus:ring-offset-2"
className="fixed right-4 bottom-20 md:bottom-8 md:right-8 z-40 p-3 bg-[#C41E3A] text-white rounded-full shadow-lg hover:bg-[#A01830] hover:shadow-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-[#C41E3A] focus:ring-offset-2"
aria-label="返回顶部"
title="返回顶部"
style={{
+4 -2
View File
@@ -1,6 +1,6 @@
'use client';
import { useReducer } from 'react';
import { useReducer, useEffect } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
interface FlipCardProps {
@@ -93,7 +93,9 @@ function FlipCard({ value, label, maxDigits = 2 }: FlipCardProps) {
},
{ current: value, previous: value }
);
dispatch(value);
useEffect(() => {
dispatch(value);
}, [value]);
const formatNumber = (num: number) => {
const str = num.toString().padStart(maxDigits, '0');