From 705af45d2a6d176649381661c38fc094e226230d Mon Sep 17 00:00:00 2001 From: luorijun Date: Tue, 18 Mar 2025 18:00:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B5=E5=A4=B4=E9=A1=B5?= =?UTF-8?q?=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(root)/{footer.tsx => @footer/page.tsx} | 0 src/app/(root)/@header/_client/help.tsx | 67 +++ src/app/(root)/@header/_client/product.tsx | 127 +++++ src/app/(root)/@header/_client/solution.tsx | 79 ++++ src/app/(root)/@header/_server/navs.tsx | 72 +++ src/app/(root)/@header/page.tsx | 155 +++++++ src/app/(root)/header.tsx | 434 ------------------ src/app/(root)/layout.tsx | 4 +- {public => src/assets}/header/down.svg | 0 {public => src/assets}/header/help/01.svg | 0 {public => src/assets}/header/help/02.svg | 0 {public => src/assets}/header/help/03.svg | 0 .../assets}/header/help/banner.webp | Bin .../assets/header/product}/anno.svg | 0 .../assets/header/product}/custom.svg | 0 .../assets/header/product}/prod.svg | 0 {public => src/assets}/header/solution/01.svg | 0 {public => src/assets}/header/solution/02.svg | 0 {public => src/assets}/header/solution/03.svg | 0 {public => src/assets}/header/solution/04.svg | 0 {public => src/assets}/header/solution/05.svg | 0 {public => src/assets}/header/solution/06.svg | 0 {public => src/assets}/header/solution/07.svg | 0 {public => src/assets}/header/solution/08.svg | 0 src/assets/logo.png | Bin 0 -> 6637 bytes 25 files changed, 502 insertions(+), 436 deletions(-) rename src/app/(root)/{footer.tsx => @footer/page.tsx} (100%) create mode 100644 src/app/(root)/@header/_client/help.tsx create mode 100644 src/app/(root)/@header/_client/product.tsx create mode 100644 src/app/(root)/@header/_client/solution.tsx create mode 100644 src/app/(root)/@header/_server/navs.tsx create mode 100644 src/app/(root)/@header/page.tsx delete mode 100644 src/app/(root)/header.tsx rename {public => src/assets}/header/down.svg (100%) rename {public => src/assets}/header/help/01.svg (100%) rename {public => src/assets}/header/help/02.svg (100%) rename {public => src/assets}/header/help/03.svg (100%) rename {public => src/assets}/header/help/banner.webp (100%) rename {public => src/assets/header/product}/anno.svg (100%) rename {public => src/assets/header/product}/custom.svg (100%) rename {public => src/assets/header/product}/prod.svg (100%) rename {public => src/assets}/header/solution/01.svg (100%) rename {public => src/assets}/header/solution/02.svg (100%) rename {public => src/assets}/header/solution/03.svg (100%) rename {public => src/assets}/header/solution/04.svg (100%) rename {public => src/assets}/header/solution/05.svg (100%) rename {public => src/assets}/header/solution/06.svg (100%) rename {public => src/assets}/header/solution/07.svg (100%) rename {public => src/assets}/header/solution/08.svg (100%) create mode 100644 src/assets/logo.png diff --git a/src/app/(root)/footer.tsx b/src/app/(root)/@footer/page.tsx similarity index 100% rename from src/app/(root)/footer.tsx rename to src/app/(root)/@footer/page.tsx diff --git a/src/app/(root)/@header/_client/help.tsx b/src/app/(root)/@header/_client/help.tsx new file mode 100644 index 0000000..cf5c79a --- /dev/null +++ b/src/app/(root)/@header/_client/help.tsx @@ -0,0 +1,67 @@ +import Link from "next/link" +import Image from "next/image" +import Wrap from "@/components/wrap" +import h01 from '@/assets/header/help/01.svg' +import h02 from '@/assets/header/help/02.svg' +import h03 from '@/assets/header/help/03.svg' +import banner from '@/assets/header/help/banner.webp' + +export default function HelpMenu() { + + + + return ( + + + + + {`banner`} + + ) +} + +function Column(props: { + icon: any + title: string + items: { + lead: string + href: string + }[] +}) { + return ( +
+

+ {props.title} + {props.title} +

+ +
+ ) +} \ No newline at end of file diff --git a/src/app/(root)/@header/_client/product.tsx b/src/app/(root)/@header/_client/product.tsx new file mode 100644 index 0000000..472bc91 --- /dev/null +++ b/src/app/(root)/@header/_client/product.tsx @@ -0,0 +1,127 @@ +'use client' + +import { useState, ReactNode } from "react" +import Wrap from "@/components/wrap" +import Image from "next/image" +import prod from '@/assets/header/product/prod.svg' +import custom from '@/assets/header/product/custom.svg' +import anno from '@/assets/header/product/anno.svg' + +type TabType = 'domestic' | 'oversea' + +export default function ProductMenu() { + + const [type, setType] = useState('domestic') + + return ( + +
    + setType('domestic')}>国内代理 + setType('oversea')}>海外代理 +
+
+ {type === 'domestic' + ? ( +
+
+

+ {`产品`} + 代理产品 +

+
+

+ 短效动态IP + + 折扣45% + +

+

+ 全国300+城市级定位节点 +

+
+
+

+ 长效静态IP + + 折扣45% + +

+

+ IPI资源覆盖全国 +

+
+
+

+ 固定IP + + 折扣45% + +

+
+
+
+

+ 定制 + 业务定制 +

+
+

优质/企业/精选IP

+

+ 超 1000 家企业共同信赖之选!大客户经理全 + 程 1 对 1 沟通,随时为您排忧解难,提供 24 + 小时不间断支持 +

+
+
+
+ ) : ( +
+ +
+ ) + } +
+ +
+ ) +} + + + + +function Tab(props: { + selected: boolean + onSelect: () => void + children: ReactNode +}) { + + return ( +
  • + +
  • + ) +} \ No newline at end of file diff --git a/src/app/(root)/@header/_client/solution.tsx b/src/app/(root)/@header/_client/solution.tsx new file mode 100644 index 0000000..cfc09de --- /dev/null +++ b/src/app/(root)/@header/_client/solution.tsx @@ -0,0 +1,79 @@ +import Image from "next/image" +import Wrap from "@/components/wrap" +import s01 from "@/assets/header/solution/01.svg" +import s02 from "@/assets/header/solution/02.svg" +import s03 from "@/assets/header/solution/03.svg" +import s04 from "@/assets/header/solution/04.svg" +import s05 from "@/assets/header/solution/05.svg" +import s06 from "@/assets/header/solution/06.svg" +import s07 from "@/assets/header/solution/07.svg" +import s08 from "@/assets/header/solution/08.svg" + +export default function SolutionMenu() { + + return ( + + + + + + + + + + + ) +} + +function SolutionItem(props: { + icon: any + title: string + desc: string +}) { + return ( +
    + {props.title} +
    +

    {props.title}

    +

    {props.desc}

    +
    +
    + ) +} \ No newline at end of file diff --git a/src/app/(root)/@header/_server/navs.tsx b/src/app/(root)/@header/_server/navs.tsx new file mode 100644 index 0000000..95c4273 --- /dev/null +++ b/src/app/(root)/@header/_server/navs.tsx @@ -0,0 +1,72 @@ +import Image from "next/image" +import Link from "next/link" +import down from "@/assets/header/down.svg" + +export function LinkItem(props: { + text: string + href: string +}) { + return ( +
  • + + {props.text} + +
    +
    +
  • + ) +} + +export function MenuItem(props: { + text: string + active: boolean + onEnter: () => void + onLeave: () => void +}) { + return ( +
  • + +
    +
  • + ) +} \ No newline at end of file diff --git a/src/app/(root)/@header/page.tsx b/src/app/(root)/@header/page.tsx new file mode 100644 index 0000000..27fa6f0 --- /dev/null +++ b/src/app/(root)/@header/page.tsx @@ -0,0 +1,155 @@ +'use client' +import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react' +import Link from 'next/link' +import Image from 'next/image' +import { LinkItem, MenuItem } from './_server/navs' +import SolutionMenu from './_client/solution' +import ProductMenu from './_client/product' +import HelpMenu from './_client/help' +import Wrap from '@/components/wrap' +import logo from '@/assets/logo.png' + +export type HeaderProps = {} + +export default function Header(props: HeaderProps) { + + // ====================== + // 滚动条状态 + // ====================== + + const [scroll, setScroll] = useState(false) // Changed to false for client-side rendering + + const handleScroll = useCallback(() => { + setScroll(window.scrollY > 48) + }, []) + + useEffect(() => { + // Initialize scroll state on client + setScroll(window.scrollY > 48) + window.addEventListener('scroll', handleScroll) + return () => { + window.removeEventListener('scroll', handleScroll) + } + }, [handleScroll]) + + // ====================== + // 菜单状态 + // ====================== + + const [menu, setMenu] = useState(false) + const [page, setPage] = useState(0) + const pages = useMemo(() => [ + , + , + , + ], []) + + // ====================== + // 渲染组件 + // ====================== + + return ( +
    +
    + +
    + {/* logo */} + + {`logo`} + + + {/* 菜单 */} + +
    + {/* 登录 */} + +
    +
    + + {/* 下拉菜单 */} +
    setMenu(true)} + onPointerLeave={() => setMenu(false)} + > + {pages[page]} +
    +
    + ) +} + + + + + diff --git a/src/app/(root)/header.tsx b/src/app/(root)/header.tsx deleted file mode 100644 index 5bd68c7..0000000 --- a/src/app/(root)/header.tsx +++ /dev/null @@ -1,434 +0,0 @@ -'use client' -import {ReactNode, useCallback, useEffect, useMemo, useState} from 'react' -import Link from 'next/link' -import Wrap from '@/components/wrap' - -export type HeaderProps = {} - -export default function Header(props: HeaderProps) { - - // ====================== - // 滚动条状态 - // ====================== - - const [scroll, setScroll] = useState(false) // Changed to false for client-side rendering - - const handleScroll = useCallback(() => { - setScroll(window.scrollY > 48) - }, []) - - useEffect(() => { - // Initialize scroll state on client - setScroll(window.scrollY > 48) - window.addEventListener('scroll', handleScroll) - return () => { - window.removeEventListener('scroll', handleScroll) - } - }, [handleScroll]) - - // ====================== - // 菜单状态 - // ====================== - - const [menu, setMenu] = useState(false) - const [page, setPage] = useState(0) - const pages = useMemo(() => [ - , - , - , - ], []) - - // ====================== - // 覆盖状态 - // ====================== - - const [overlay, setOverlay] = useState(false) - useEffect(() => { - setOverlay(scroll || menu) - }, [menu, scroll]) - - // ====================== - // 渲染组件 - // ====================== - - const LinkItem = (props: { - text: string - href: string - }) => ( -
  • - - {props.text} - -
    -
    -
  • - ) - - const MenuItem = (props: { - text: string - page: number - }) => ( -
  • - -
    -
    -
  • - - ) - - return ( -
    -
    - -
    - {/* logo */} - - {`logo`} - - - {/* 菜单 */} - -
    - {/* 登录 */} - -
    -
    - - {/* 下拉菜单 */} -
    setMenu(true)} - onPointerLeave={() => setMenu(false)} - > - {pages[page]} -
    -
    - ) -} - -function ProductMenu() { - - // ==================== - // Tab 选项 - // ==================== - - type TabType = 'domestic' | 'oversea' - const [type, setType] = useState('domestic') - - const Tab = (props: { - type: TabType, - children: ReactNode - }) => { - return ( -
  • - -
  • - ) - } - - // ==================== - // 渲染组件 - // ==================== - - return ( - -
      - 国内代理 - 海外代理 -
    -
    - {type === 'domestic' - ? ( -
    -
    -

    - {`产品`} - 代理产品 -

    -
    -

    - 短效动态IP - - 折扣45% - -

    -

    - 全国300+城市级定位节点 -

    -
    -
    -

    - 长效静态IP - - 折扣45% - -

    -

    - IPI资源覆盖全国 -

    -
    -
    -

    - 固定IP - - 折扣45% - -

    -
    -
    -
    -

    - 定制 - 业务定制 -

    -
    -

    优质/企业/精选IP

    -

    - 超 1000 家企业共同信赖之选!大客户经理全 - 程 1 对 1 沟通,随时为您排忧解难,提供 24 - 小时不间断支持 -

    -
    -
    -
    - ) : ( -
    - -
    - ) - } -
    - -
    - ) -} - -function SolutionMenu() { - - const SolutionItem = (props: { - icon: string - title: string - desc: string - }) => { - return ( -
    - {props.title} -
    -

    {props.title}

    -

    {props.desc}

    -
    -
    - ) - } - - return ( - - - - - - - - - - - ) -} - -function HelpMenu() { - - const Column = (props: { - icon: string, - title: string, - items: { - lead: string - href: string - }[] - }) => ( -
    -

    - {props.title} - {props.title} -

    -
      - {props.items.map((item, index) => ( -
    • {item.lead}
    • - ))} -
    -
    - ) - - return ( - - - - - {`banner`} - - ) -} diff --git a/src/app/(root)/layout.tsx b/src/app/(root)/layout.tsx index 6d69514..82c28d2 100644 --- a/src/app/(root)/layout.tsx +++ b/src/app/(root)/layout.tsx @@ -1,5 +1,5 @@ -import Header from '@/app/(root)/header' -import Footer from '@/app/(root)/footer' +import Header from '@/app/(root)/@header/page' +import Footer from '@/app/(root)/@footer/page' import {ReactNode} from 'react' export type RootLayoutProps = { diff --git a/public/header/down.svg b/src/assets/header/down.svg similarity index 100% rename from public/header/down.svg rename to src/assets/header/down.svg diff --git a/public/header/help/01.svg b/src/assets/header/help/01.svg similarity index 100% rename from public/header/help/01.svg rename to src/assets/header/help/01.svg diff --git a/public/header/help/02.svg b/src/assets/header/help/02.svg similarity index 100% rename from public/header/help/02.svg rename to src/assets/header/help/02.svg diff --git a/public/header/help/03.svg b/src/assets/header/help/03.svg similarity index 100% rename from public/header/help/03.svg rename to src/assets/header/help/03.svg diff --git a/public/header/help/banner.webp b/src/assets/header/help/banner.webp similarity index 100% rename from public/header/help/banner.webp rename to src/assets/header/help/banner.webp diff --git a/public/anno.svg b/src/assets/header/product/anno.svg similarity index 100% rename from public/anno.svg rename to src/assets/header/product/anno.svg diff --git a/public/custom.svg b/src/assets/header/product/custom.svg similarity index 100% rename from public/custom.svg rename to src/assets/header/product/custom.svg diff --git a/public/prod.svg b/src/assets/header/product/prod.svg similarity index 100% rename from public/prod.svg rename to src/assets/header/product/prod.svg diff --git a/public/header/solution/01.svg b/src/assets/header/solution/01.svg similarity index 100% rename from public/header/solution/01.svg rename to src/assets/header/solution/01.svg diff --git a/public/header/solution/02.svg b/src/assets/header/solution/02.svg similarity index 100% rename from public/header/solution/02.svg rename to src/assets/header/solution/02.svg diff --git a/public/header/solution/03.svg b/src/assets/header/solution/03.svg similarity index 100% rename from public/header/solution/03.svg rename to src/assets/header/solution/03.svg diff --git a/public/header/solution/04.svg b/src/assets/header/solution/04.svg similarity index 100% rename from public/header/solution/04.svg rename to src/assets/header/solution/04.svg diff --git a/public/header/solution/05.svg b/src/assets/header/solution/05.svg similarity index 100% rename from public/header/solution/05.svg rename to src/assets/header/solution/05.svg diff --git a/public/header/solution/06.svg b/src/assets/header/solution/06.svg similarity index 100% rename from public/header/solution/06.svg rename to src/assets/header/solution/06.svg diff --git a/public/header/solution/07.svg b/src/assets/header/solution/07.svg similarity index 100% rename from public/header/solution/07.svg rename to src/assets/header/solution/07.svg diff --git a/public/header/solution/08.svg b/src/assets/header/solution/08.svg similarity index 100% rename from public/header/solution/08.svg rename to src/assets/header/solution/08.svg diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..be7c2c6d2afcf3f3e682fcf314e0145d1edbb5d8 GIT binary patch literal 6637 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

    F6m`{Ma6Z_ zJx&1QHty&?nf!5R6Y3}+!5IcDdfeH9lbXa95+DkU5CUXD0>+_@lkHhwWU1qT1R6^A z+-a_bET2KXk&zcb7Zuq#0gOvz?P;x*7+Oso2_({^KT8#Dwp}2)$L+u|Q%uVPBR=+ErLzB(_+x%ltk*C9rU87@d}M2f_%Q4kTIaV2Jn) zIk(lfucStB$vozRjNsk1F)9m?Rc#TcZ$#Poi>@2w9>i79cFL{o4XCNoRM*ba>0EYax9KnX2kY62|6+@oG(VfsCqX zFm^3qM0J6Tu0?6fC|{TCil_@@L_Hq%ji7X4G^#F;Itqs|bkwISuew00O2#sV&(Z11 rr!J5xl7q1;1$BYcQ5QzD0)YPq%{6!+z&TXv00000NkvXXu0mjf8k40| literal 0 HcmV?d00001