feat(layout): 重构布局组件体系与数据层

- 重构 Header 导航、Footer 页脚、MobileMenu 移动端菜单
- 新增 MobileTabBar 移动端底部导航栏
- 更新 MegaDropdown 大型下拉导航
- 重构 SEO 结构化数据组件
- 更新数据层常量 (products, services, solutions, navigation 等)
- 新增 useCountUp 数字递增 Hook
- 修复 .gitignore 中 src/lib 被错误忽略的问题
This commit is contained in:
张翔
2026-07-07 06:53:13 +08:00
parent e78df62cd1
commit 767931202d
28 changed files with 898 additions and 468 deletions
+43 -2
View File
@@ -39,6 +39,21 @@ jest.mock('framer-motion', () => ({
{children}
</div>
),
header: ({ children, className, ...props }: { children: React.ReactNode; className?: string; [key: string]: unknown }) => (
<header className={className} {...props}>
{children}
</header>
),
a: ({ children, className, href, ...props }: { children: React.ReactNode; className?: string; href?: string; [key: string]: unknown }) => (
<a className={className} href={href} {...props}>
{children}
</a>
),
nav: ({ children, className, ...props }: { children: React.ReactNode; className?: string; [key: string]: unknown }) => (
<nav className={className} {...props}>
{children}
</nav>
),
},
AnimatePresence: ({ children }: { children: React.ReactNode }) => <>{children}</>,
}));
@@ -46,6 +61,7 @@ jest.mock('framer-motion', () => ({
jest.mock('lucide-react', () => ({
Menu: () => <span data-testid="menu-icon" />,
X: () => <span data-testid="x-icon" />,
MessageCircle: () => <span data-testid="message-circle-icon" />,
}));
jest.mock('@/components/ui/button', () => {
@@ -58,6 +74,31 @@ jest.mock('@/components/ui/button', () => {
return { Button: MockButton };
});
jest.mock('@/lib/site-config', () => ({
useSiteConfig: () => ({
name: '四川睿新致远科技有限公司',
shortName: '睿新致遠',
displayName: '睿新致远',
mainNav: [
{ id: 'products', label: '产品', href: '/products', hasDropdown: true, dropdownKey: 'products' },
{ id: 'solutions', label: '解决方案', href: '/solutions', hasDropdown: true, dropdownKey: 'solutions' },
{ id: 'services', label: '服务', href: '/services' },
{ id: 'about', label: '关于我们', href: '/about' },
{ id: 'contact', label: '联系我们', href: '/contact' },
],
megaDropdown: {
products: [
{ id: 'erp', title: 'ERP 管理系统', description: '财务·采购·销售·库存·生产', href: '/products/erp' },
{ id: 'crm', title: 'CRM 客户管理', description: '线索·商机·合同·服务', href: '/products/crm' },
],
solutions: [
{ id: 'manufacturing', title: '制造业', description: '智能制造·MES·质量管控', href: '/solutions/manufacturing' },
],
},
}),
SiteConfigProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
}));
jest.mock('@/lib/constants', () => ({
COMPANY_INFO: {
name: '四川睿新致远科技有限公司',
@@ -87,10 +128,10 @@ jest.mock('@/hooks/use-focus-trap', () => ({
}));
jest.mock('@/components/layout/mega-dropdown', () => ({
MegaDropdown: ({ label, items }: { label: string; items: Array<{ id: string; title: string; description: string; href: string }> }) => (
MegaDropdown: ({ label, groups }: { label: string; groups?: Array<{ id: string; title: string; description: string; href: string }> }) => (
<div data-testid="mega-dropdown">
<span>{label}</span>
{items.map(item => (
{(groups ?? []).map(item => (
<a key={item.id} href={item.href}>{item.title}</a>
))}
</div>