diff --git a/components/Lenis.js b/components/Lenis.js
new file mode 100644
index 00000000..27f1d5d9
--- /dev/null
+++ b/components/Lenis.js
@@ -0,0 +1,36 @@
+/**
+ * 鼠标滚动阻尼感
+ */
+import { useEffect } from 'react'
+// import anime from 'animejs'
+import { siteConfig } from '@/lib/config'
+import { loadExternalResource } from '@/lib/utils'
+
+/**
+ * 鼠标点击烟花特效
+ * @returns
+ */
+const Lenis = () => {
+
+ useEffect(() => {
+ // 异步加载
+ async function loadLenis() {
+ loadExternalResource(
+ 'https://unpkg.com/lenis@1.2.3/dist/lenis.mjs',
+ 'js'
+ ).then(() => {
+ console.log('Lenis',window.Lenis)
+ })
+ }
+
+ loadLenis()
+
+ return () => {
+ // 在组件卸载时清理资源
+ }
+ }, [])
+
+ return <>>
+}
+
+export default Lenis
diff --git a/themes/proxio/components/About.js b/themes/proxio/components/About.js
new file mode 100644
index 00000000..6ae4abe9
--- /dev/null
+++ b/themes/proxio/components/About.js
@@ -0,0 +1,188 @@
+/* eslint-disable @next/next/no-img-element */
+/* eslint-disable react/no-unescaped-entities */
+import { siteConfig } from '@/lib/config'
+import Link from 'next/link'
+
+/**
+ * 首页的关于模块
+ */
+export const About = () => {
+ return (
+ <>
+ {/* */}
+
+
+
+
+ {/* 左侧的文字说明板块 */}
+
+
+
+ {siteConfig('PROXIO_CAREER_TITLE')}
+
+
+
+
+ {siteConfig('PROXIO_CAREER_BUTTON_TEXT')}
+
+
+
+
+ {/* 右侧的图片海报 */}
+
+
+
+
+
})
+
+
+
+
+
+
})
+
+
+
+
+
+ {siteConfig('PROXIO_CAREER_TIPS_1')}
+
+
+ {siteConfig('PROXIO_CAREER_TIPS_2')}
+
+
+ {siteConfig('PROXIO_CAREER_TIPS_3')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Announcement.js b/themes/proxio/components/Announcement.js
new file mode 100644
index 00000000..2a72cea0
--- /dev/null
+++ b/themes/proxio/components/Announcement.js
@@ -0,0 +1,30 @@
+// import { useGlobal } from '@/lib/global'
+import dynamic from 'next/dynamic'
+
+const NotionPage = dynamic(() => import('@/components/NotionPage'))
+
+/**
+ * Magzine主题的公告
+ */
+const Announcement = ({ post, className }) => {
+ // const { locale } = useGlobal()
+ if (post?.blockMap) {
+ return (
+
+
+ {/* {locale.COMMON.ANNOUNCEMENT}
*/}
+ {post && (
+
+
+
+ )}
+
+
+ )
+ } else {
+ return <>>
+ }
+}
+export default Announcement
diff --git a/themes/proxio/components/ArticleLock.js b/themes/proxio/components/ArticleLock.js
new file mode 100644
index 00000000..3a5f4b4c
--- /dev/null
+++ b/themes/proxio/components/ArticleLock.js
@@ -0,0 +1,53 @@
+import { useGlobal } from '@/lib/global'
+import { useEffect, useRef } from 'react'
+
+/**
+ * 加密文章校验组件
+ * @param {password, validPassword} props
+ * @param password 正确的密码
+ * @param validPassword(bool) 回调函数,校验正确回调入参为true
+ * @returns
+ */
+export const ArticleLock = props => {
+ const { validPassword } = props
+ const { locale } = useGlobal()
+
+ const submitPassword = () => {
+ const p = document.getElementById('password')
+ if (!validPassword(p?.value)) {
+ const tips = document.getElementById('tips')
+ if (tips) {
+ tips.innerHTML = ''
+ tips.innerHTML = `${locale.COMMON.PASSWORD_ERROR}
`
+ }
+ }
+ }
+
+ const passwordInputRef = useRef(null)
+ useEffect(() => {
+ // 选中密码输入框并将其聚焦
+ passwordInputRef.current.focus()
+ }, [])
+
+ return
+
+
{locale.COMMON.ARTICLE_LOCK_TIPS}
+
+
{
+ if (e.key === 'Enter') {
+ submitPassword()
+ }
+ }}
+ ref={passwordInputRef} // 绑定ref到passwordInputRef变量
+ className='outline-none w-full text-sm pl-5 rounded-l transition focus:shadow-lg font-light leading-10 text-black dark:bg-gray-500 bg-gray-50'
+ >
+
+ {locale.COMMON.SUBMIT}
+
+
+
+
+
+
+}
diff --git a/themes/proxio/components/BackToTopButton.js b/themes/proxio/components/BackToTopButton.js
new file mode 100644
index 00000000..f6876021
--- /dev/null
+++ b/themes/proxio/components/BackToTopButton.js
@@ -0,0 +1,75 @@
+import throttle from 'lodash.throttle'
+import { useCallback, useEffect } from 'react'
+
+/**
+ * 回顶按钮
+ * @returns
+ */
+export const BackToTopButton = () => {
+ useEffect(() => {
+ Math.easeInOutQuad = function (t, b, c, d) {
+ t /= d / 2
+ if (t < 1) return (c / 2) * t * t + b
+ t--
+ return (-c / 2) * (t * (t - 2) - 1) + b
+ }
+
+ window.addEventListener('scroll', navBarScollListener)
+ return () => {
+ window.removeEventListener('scroll', navBarScollListener)
+ }
+ }, [])
+
+ // 滚动监听
+ const throttleMs = 200
+ const navBarScollListener = useCallback(
+ throttle(() => {
+ const scrollY = window.scrollY
+ // 显示或隐藏返回顶部按钮
+ const backToTop = document.querySelector('.back-to-top')
+ if (backToTop) {
+ backToTop.style.display = scrollY > 50 ? 'flex' : 'none'
+ }
+ }, throttleMs)
+ )
+
+ // ====== scroll top js
+ function scrollTo(element, to = 0, duration = 500) {
+ const start = element.scrollTop
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+
+ const animateScroll = () => {
+ currentTime += increment
+
+ const val = Math.easeInOutQuad(currentTime, start, change, duration)
+
+ element.scrollTop = val
+
+ if (currentTime < duration) {
+ setTimeout(animateScroll, increment)
+ }
+ }
+
+ animateScroll()
+ }
+
+ function scrollTop() {
+ if (document) {
+ scrollTo(document.documentElement)
+ }
+ }
+
+ return (
+ <>
+ {/* */}
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Banner.js b/themes/proxio/components/Banner.js
new file mode 100644
index 00000000..18370a2d
--- /dev/null
+++ b/themes/proxio/components/Banner.js
@@ -0,0 +1,49 @@
+/**
+ * 页面顶部宣传栏
+ * @returns
+ */
+export const Banner = ({ title, description }) => {
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+
+
+ {title}
+
+
+ {description}
+
+
+ {/*
*/}
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Blog.js b/themes/proxio/components/Blog.js
new file mode 100644
index 00000000..5d516fd7
--- /dev/null
+++ b/themes/proxio/components/Blog.js
@@ -0,0 +1,74 @@
+/* eslint-disable @next/next/no-img-element */
+import LazyImage from '@/components/LazyImage'
+import { siteConfig } from '@/lib/config'
+import Link from 'next/link'
+
+/**
+ * 博文列表
+ * @param {*} param0
+ * @returns
+ */
+export const Blog = ({ posts }) => {
+ return (
+ <>
+ {/* */}
+
+
+ {/* 区块标题文字 */}
+
+
+
+
+ {siteConfig('PROXIO_BLOG_TITLE')}
+
+
+ {siteConfig('PROXIO_BLOG_TEXT_1')}
+
+
+
+
+ {/* 博客列表 此处优先展示3片文章 */}
+
+ {posts?.map((item, index) => {
+ return (
+
+
+
+ {item.pageCoverThumbnail && (
+
+
+
+ )}
+
+
+
+ {item.publishDay}
+
+
+
+ {item.title}
+
+
+
+ {item.summary}
+
+
+
+
+ )
+ })}
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Brand.js b/themes/proxio/components/Brand.js
new file mode 100644
index 00000000..11d8d4c3
--- /dev/null
+++ b/themes/proxio/components/Brand.js
@@ -0,0 +1,39 @@
+/* eslint-disable @next/next/no-img-element */
+
+import { siteConfig } from '@/lib/config'
+
+/**
+ * 合作伙伴
+ * @returns
+ */
+export const Brand = () => {
+ const brands = siteConfig('PROXIO_BRANDS')
+ return (
+ <>
+ {/* */}
+
+
+
+ {brands?.map((item, index) => {
+ return (
+
+
+
+
+ )
+ })}
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/CTA.js b/themes/proxio/components/CTA.js
new file mode 100644
index 00000000..830d38ce
--- /dev/null
+++ b/themes/proxio/components/CTA.js
@@ -0,0 +1,112 @@
+import { siteConfig } from '@/lib/config'
+import Link from 'next/link'
+
+/**
+ * CTA,用于创建一个呼吁用户行动的部分(Call To Action,简称 CTA)。
+ * 该组件通过以下方式激励用户进行特定操作
+ * 用户的公告栏内容将在此显示
+ **/
+export const CTA = () => {
+ if (!siteConfig('PROXIO_CTA_ENABLE')) {
+ return <>>
+ }
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_CTA_TITLE')}
+
+ {siteConfig('PROXIO_CTA_TITLE_2')}
+
+
+
+ {siteConfig('PROXIO_CTA_DESCRIPTION')}
+
+ {siteConfig('PROXIO_CTA_BUTTON') && (
+ <>
+
+ {siteConfig('PROXIO_CTA_BUTTON_TEXT')}
+
+ >
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Contact.js b/themes/proxio/components/Contact.js
new file mode 100644
index 00000000..80916f34
--- /dev/null
+++ b/themes/proxio/components/Contact.js
@@ -0,0 +1,100 @@
+import { siteConfig } from '@/lib/config'
+import CONFIG from '../config'
+import { SVGEmail } from './svg/SVGEmail'
+import { SVGLocation } from './svg/SVGLocation'
+
+/* eslint-disable react/no-unescaped-entities */
+export const Contact = () => {
+ const url = siteConfig('PROXIO_CONTACT_MSG_EXTERNAL_URL')
+ return (
+ <>
+ {/* */}
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/DarkModeButton.js b/themes/proxio/components/DarkModeButton.js
new file mode 100644
index 00000000..9d4ceef1
--- /dev/null
+++ b/themes/proxio/components/DarkModeButton.js
@@ -0,0 +1,84 @@
+import { useGlobal } from '@/lib/global';
+import { useRouter } from 'next/router';
+
+export const DarkModeButton = () => {
+ const { toggleDarkMode } = useGlobal()
+ const router = useRouter()
+ return <>
+
+ >
+}
diff --git a/themes/proxio/components/FAQ.js b/themes/proxio/components/FAQ.js
new file mode 100644
index 00000000..fb741345
--- /dev/null
+++ b/themes/proxio/components/FAQ.js
@@ -0,0 +1,120 @@
+import { siteConfig } from '@/lib/config'
+import { useEffect } from 'react'
+import { SVGCircleBG } from './svg/SVGCircleBG'
+import { SVGQuestion } from './svg/SVGQuestion'
+
+export const FAQ = () => {
+ useEffect(() => {
+ // ===== Faq accordion
+ const faqs = document.querySelectorAll('.single-faq')
+ faqs.forEach(el => {
+ el.querySelector('.faq-btn').addEventListener('click', () => {
+ el.querySelector('.icon').classList.toggle('rotate-180')
+ el.querySelector('.faq-content').classList.toggle('hidden')
+ })
+ })
+ })
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+
+ {siteConfig('PROXIO_FAQ_TITLE')}
+
+
+ {siteConfig('PROXIO_FAQ_TEXT_1')}
+
+
+ {siteConfig('PROXIO_FAQ_TEXT_2')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FAQ_1_QUESTION')}
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FAQ_2_QUESTION')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FAQ_3_QUESTION')}
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FAQ_4_QUESTION')}
+
+
+
+
+
+
+
+
+ {/* 背景图案 */}
+
+
+
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Features.js b/themes/proxio/components/Features.js
new file mode 100644
index 00000000..49e5ec75
--- /dev/null
+++ b/themes/proxio/components/Features.js
@@ -0,0 +1,115 @@
+import { siteConfig } from '@/lib/config'
+import { SVGDesign } from './svg/SVGDesign'
+import { SVGEssential } from './svg/SVGEssential'
+import { SVGGifts } from './svg/SVGGifts'
+import { SVGTemplate } from './svg/SVGTemplate'
+import Link from 'next/link'
+/**
+ * 产品特性相关,将显示在首页中
+ * @returns
+ */
+export const Features = () => {
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+
+ {siteConfig('PROXIO_FEATURE_TITLE')}
+
+
+ {siteConfig('PROXIO_FEATURE_TEXT_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_TEXT_2')}
+
+
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FEATURE_1_TITLE_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_1_TEXT_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_1_BUTTON_TEXT')}
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FEATURE_2_TITLE_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_2_TEXT_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_2_BUTTON_TEXT')}
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FEATURE_3_TITLE_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_3_TEXT_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_3_BUTTON_TEXT')}
+
+
+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_FEATURE_4_TITLE_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_4_TEXT_1')}
+
+
+ {siteConfig('PROXIO_FEATURE_3_BUTTON_TEXT')}
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Footer.js b/themes/proxio/components/Footer.js
new file mode 100644
index 00000000..427f913c
--- /dev/null
+++ b/themes/proxio/components/Footer.js
@@ -0,0 +1,168 @@
+import { siteConfig } from '@/lib/config'
+import SocialButton from '@/themes/fukasawa/components/SocialButton'
+import { Logo } from './Logo'
+import { SVGFooterCircleBG } from './svg/SVGFooterCircleBG'
+import Link from 'next/link'
+
+/* eslint-disable @next/next/no-img-element */
+export const Footer = props => {
+ const footerPostCount = siteConfig('PROXIO_FOOTER_POST_COUNT', 2)
+ const latestPosts = props?.latestPosts
+ ? props?.latestPosts.slice(0, footerPostCount)
+ : []
+ const PROXIO_FOOTER_LINK_GROUP = siteConfig('PROXIO_FOOTER_LINK_GROUP', [])
+ return (
+ <>
+ {/* */}
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Header.js b/themes/proxio/components/Header.js
new file mode 100644
index 00000000..2abfed8f
--- /dev/null
+++ b/themes/proxio/components/Header.js
@@ -0,0 +1,73 @@
+/* eslint-disable no-unreachable */
+import DashboardButton from '@/components/ui/dashboard/DashboardButton'
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import { SignedIn, SignedOut, UserButton } from '@clerk/nextjs'
+import throttle from 'lodash.throttle'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import { useCallback, useEffect, useState } from 'react'
+import { DarkModeButton } from './DarkModeButton'
+import { Logo } from './Logo'
+import { MenuList } from './MenuList'
+
+/**
+ * 顶部导航栏
+ */
+export const Header = props => {
+ const router = useRouter()
+ const { isDarkMode } = useGlobal()
+ const [buttonTextColor, setColor] = useState(
+ router.route === '/' ? 'text-white' : ''
+ )
+
+ const enableClerk = process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
+
+ useEffect(() => {
+ if (isDarkMode || router.route === '/') {
+ setColor('text-white')
+ } else {
+ setColor('')
+ }
+ // ======= Sticky
+ window.addEventListener('scroll', navBarScollListener)
+ return () => {
+ window.removeEventListener('scroll', navBarScollListener)
+ }
+ }, [isDarkMode])
+
+ // 滚动监听
+ const throttleMs = 200
+ const navBarScollListener = useCallback(
+ throttle(() => {
+ // eslint-disable-next-line camelcase
+ const ud_header = document.querySelector('.ud-header')
+ const scrollY = window.scrollY
+ // 控制台输出当前滚动位置和 sticky 值
+ if (scrollY > 0) {
+ ud_header?.classList?.add('sticky')
+ } else {
+ ud_header?.classList?.remove('sticky')
+ }
+ }, throttleMs)
+ )
+
+ return (
+ <>
+ {/* */}
+
+
+
+ {/* Logo */}
+
+ {/* 右侧菜单 */}
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Hero.js b/themes/proxio/components/Hero.js
new file mode 100644
index 00000000..eb52d56a
--- /dev/null
+++ b/themes/proxio/components/Hero.js
@@ -0,0 +1,72 @@
+/* eslint-disable @next/next/no-img-element */
+import LazyImage from '@/components/LazyImage'
+import { siteConfig } from '@/lib/config'
+import CONFIG from '../config'
+import Link from 'next/link'
+
+/**
+ * 英雄大图区块
+ */
+export const Hero = props => {
+ const config = props?.NOTION_CONFIG || CONFIG
+ const pageCover = props?.siteInfo?.pageCover
+ const bannerImage = siteConfig('PROXIO_HERO_BANNER_IMAGE', null, config) || pageCover
+ const bannerIframe = siteConfig('PROXIO_HERO_BANNER_IFRAME_URL',null,config)
+ return (
+ <>
+ {/* */}
+
+ {/* 横幅图片 */}
+ {!bannerIframe && bannerImage && (
+
+ )}
+
+ {/* 阴影遮罩 */}
+
+
+
+ {/* 文字标题等 */}
+
+
+
+
+ {/* 主标题 */}
+
+ {siteConfig('PROXIO_HERO_TITLE_1', null, config)}
+
+ {/* 次标题 */}
+
+ {siteConfig('PROXIO_HERO_TITLE_2', null, config)}
+
+ {/* 按钮组 */}
+
+ {siteConfig('PROXIO_HERO_BUTTON_1_TEXT', null, config) && (
+ -
+
+ {siteConfig('PROXIO_HERO_BUTTON_1_TEXT', null, config)}
+
+
+ )}
+
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Lenis.js b/themes/proxio/components/Lenis.js
new file mode 100644
index 00000000..e69de29b
diff --git a/themes/proxio/components/Logo.js b/themes/proxio/components/Logo.js
new file mode 100644
index 00000000..5bb1b6d8
--- /dev/null
+++ b/themes/proxio/components/Logo.js
@@ -0,0 +1,73 @@
+/* eslint-disable @next/next/no-img-element */
+/* eslint-disable @next/next/no-html-link-for-pages */
+import LazyImage from '@/components/LazyImage'
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import throttle from 'lodash.throttle'
+import { useRouter } from 'next/router'
+import { useEffect, useState } from 'react'
+
+/**
+ * 站点图标
+ * @returns
+ */
+export const Logo = props => {
+ const { white, NOTION_CONFIG } = props
+ const router = useRouter()
+ const logoWhite = siteConfig('PROXIO_LOGO_WHITE')
+ const logoNormal = siteConfig('PROXIO_LOGO')
+ const { isDarkMode } = useGlobal()
+ const [logo, setLogo] = useState(logoWhite)
+ const [logoTextColor, setLogoTextColor] = useState('text-white')
+
+ useEffect(() => {
+ // 滚动监听
+ const throttleMs = 200
+ const navBarScrollListener = throttle(() => {
+ const scrollY = window.scrollY
+ // 何时显示浅色或白底的logo
+ const homePageNavBar = router.route === '/' && scrollY < 10 // 在首页并且视窗在页面顶部
+
+ if (white || isDarkMode || homePageNavBar) {
+ setLogo(logoWhite)
+ setLogoTextColor('text-white')
+ } else {
+ setLogo(logoNormal)
+ setLogoTextColor('text-black')
+ }
+ }, throttleMs)
+
+ navBarScrollListener()
+ window.addEventListener('scroll', navBarScrollListener)
+ return () => {
+ window.removeEventListener('scroll', navBarScrollListener)
+ }
+ }, [isDarkMode, router])
+
+ return (
+
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+ {logo && (
+ {
+ router.push('/')
+ }}
+ src={logo}
+ alt='logo'
+ className='header-logo mr-1 h-8'
+ />
+ )}
+ {/* logo文字 */}
+ {
+ router.push('/')
+ }}
+ className={`${logoTextColor} logo dark:text-white py-1.5 header-logo-text whitespace-nowrap text-2xl font-semibold`}>
+ {siteConfig('TITLE')}
+
+
+
+ )
+}
diff --git a/themes/proxio/components/MadeWithButton.js b/themes/proxio/components/MadeWithButton.js
new file mode 100644
index 00000000..a833f78b
--- /dev/null
+++ b/themes/proxio/components/MadeWithButton.js
@@ -0,0 +1,29 @@
+/* eslint-disable @next/next/no-img-element */
+export const MadeWithButton = () => {
+ return <>
+ {/* */}
+
+
+ Made with
+
+
+
+
+
+
+
+ >
+}
diff --git a/themes/proxio/components/MenuItem.js b/themes/proxio/components/MenuItem.js
new file mode 100644
index 00000000..95de15b2
--- /dev/null
+++ b/themes/proxio/components/MenuItem.js
@@ -0,0 +1,91 @@
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import { useState } from 'react'
+
+/**
+ * 菜单链接
+ * @param {*} param0
+ * @returns
+ */
+export const MenuItem = ({ link }) => {
+ const hasSubMenu = link?.subMenus?.length > 0
+ const router = useRouter()
+
+ // 管理子菜单的展开状态
+ const [isSubMenuOpen, setIsSubMenuOpen] = useState(false)
+
+ const toggleSubMenu = () => {
+ setIsSubMenuOpen(prev => !prev) // 切换子菜单状态
+ }
+
+ return (
+ <>
+ {/* 普通 MenuItem */}
+ {!hasSubMenu && (
+
+
+ {link?.icon && }
+ {link?.name}
+
+
+ )}
+
+ {/* 有子菜单的 MenuItem */}
+ {hasSubMenu && (
+
+
+
+ {/* 子菜单 */}
+
+ {link.subMenus.map((sLink, index) => (
+
+ {/* 子菜单 SubMenuItem */}
+
+ {link?.icon && }{' '}
+ {sLink.title}
+
+
+ ))}
+
+
+ )}
+ >
+ )
+}
diff --git a/themes/proxio/components/MenuList.js b/themes/proxio/components/MenuList.js
new file mode 100644
index 00000000..0352e8b2
--- /dev/null
+++ b/themes/proxio/components/MenuList.js
@@ -0,0 +1,93 @@
+import BLOG from '@/blog.config'
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import { useRouter } from 'next/router'
+import { useEffect, useState } from 'react'
+import { MenuItem } from './MenuItem'
+
+/**
+ * 响应式 折叠菜单
+ */
+export const MenuList = props => {
+ const { customNav, customMenu } = props
+ const { locale } = useGlobal()
+
+ const [showMenu, setShowMenu] = useState(false) // 控制菜单展开/收起状态
+ const router = useRouter()
+
+ let links = [
+ {
+ icon: 'fas fa-archive',
+ name: locale.NAV.ARCHIVE,
+ href: '/archive',
+ show: siteConfig('HEO_MENU_ARCHIVE')
+ },
+ {
+ icon: 'fas fa-search',
+ name: locale.NAV.SEARCH,
+ href: '/search',
+ show: siteConfig('HEO_MENU_SEARCH')
+ },
+ {
+ icon: 'fas fa-folder',
+ name: locale.COMMON.CATEGORY,
+ href: '/category',
+ show: siteConfig('HEO_MENU_CATEGORY')
+ },
+ {
+ icon: 'fas fa-tag',
+ name: locale.COMMON.TAGS,
+ href: '/tag',
+ show: siteConfig('HEO_MENU_TAG')
+ }
+ ]
+
+ if (customNav) {
+ links = customNav.concat(links)
+ }
+
+ // 如果 开启自定义菜单,则覆盖Page生成的菜单
+ if (siteConfig('CUSTOM_MENU', BLOG.CUSTOM_MENU)) {
+ links = customMenu
+ }
+
+ if (!links || links.length === 0) {
+ return null
+ }
+
+ const toggleMenu = () => {
+ setShowMenu(!showMenu) // 切换菜单状态
+ }
+
+ useEffect(() => {
+ setShowMenu(false)
+ }, [router])
+
+ return (
+
+ {/* 移动端菜单切换按钮 */}
+
+
+
+
+ )
+}
diff --git a/themes/proxio/components/MessageForm.js b/themes/proxio/components/MessageForm.js
new file mode 100644
index 00000000..547b7a1f
--- /dev/null
+++ b/themes/proxio/components/MessageForm.js
@@ -0,0 +1,112 @@
+import { siteConfig } from '@/lib/config'
+import { useRef, useState } from 'react'
+
+/**
+ * 留言表单
+ * @returns
+ */
+export const MessageForm = () => {
+ const formRef = useRef()
+ const [success] = useState(false)
+ const [formData, setFormData] = useState({
+ fullName: '',
+ email: '',
+ phone: '',
+ message: ''
+ })
+
+ const handleChange = e => {
+ const { name, value } = e.target
+ setFormData(prevState => ({
+ ...prevState,
+ [name]: value
+ }))
+ }
+
+ return (
+ <>
+
+ {siteConfig('PROXIO_CONTACT_MSG_TITLE')}
+
+
+ >
+ )
+}
diff --git a/themes/proxio/components/Pricing.js b/themes/proxio/components/Pricing.js
new file mode 100644
index 00000000..c5800931
--- /dev/null
+++ b/themes/proxio/components/Pricing.js
@@ -0,0 +1,178 @@
+import { siteConfig } from '@/lib/config'
+import Link from 'next/link'
+
+/**
+ * 价格板块
+ * @returns
+ */
+export const Pricing = () => {
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+
+ {siteConfig('PROXIO_PRICING_TITLE')}
+
+
+ {siteConfig('PROXIO_PRICING_TEXT_1')}
+
+
+ {siteConfig('PROXIO_PRICING_TEXT_2')}
+
+
+
+
+
+
+ {/* 第一个付费计划 */}
+
+
+
+ {siteConfig('PROXIO_PRICING_1_TITLE')}
+
+
+
+ {siteConfig('PROXIO_PRICING_1_PRICE_CURRENCY')}
+
+
+ {siteConfig('PROXIO_PRICING_1_PRICE')}
+
+
+ {siteConfig('PROXIO_PRICING_1_PRICE_PERIOD')}
+
+
+
+
+
+ {siteConfig('PROXIO_PRICING_1_HEADER')}
+
+
+ {siteConfig('PROXIO_PRICING_1_FEATURES')
+ ?.split(',')
+ .map((feature, index) => {
+ return (
+
+ {feature}
+
+ )
+ })}
+
+
+
+ {siteConfig('PROXIO_PRICING_1_BUTTON_TEXT')}
+
+
+
+
+ {/* 第二个付费计划 */}
+
+
+
+ {siteConfig('PROXIO_PRICING_2_TAG')}
+
+
+ {siteConfig('PROXIO_PRICING_2_TITLE')}
+
+
+
+ {siteConfig('PROXIO_PRICING_2_PRICE_CURRENCY')}
+
+
+ {siteConfig('PROXIO_PRICING_2_PRICE')}
+
+
+ {siteConfig('PROXIO_PRICING_2_PRICE_PERIOD')}
+
+
+
+
+
+ {siteConfig('PROXIO_PRICING_2_HEADER')}
+
+
+ {siteConfig('PROXIO_PRICING_2_FEATURES')
+ ?.split(',')
+ .map((feature, index) => {
+ return (
+
+ {feature}
+
+ )
+ })}
+
+
+
+ {siteConfig('PROXIO_PRICING_2_BUTTON_TEXT')}
+
+
+
+
+ {/* 第三个付费计划 */}
+
+
+
+ {siteConfig('PROXIO_PRICING_3_TITLE')}
+
+
+
+ {siteConfig('PROXIO_PRICING_3_PRICE_CURRENCY')}
+
+
+ {siteConfig('PROXIO_PRICING_3_PRICE')}
+
+
+ {siteConfig('PROXIO_PRICING_3_PRICE_PERIOD')}
+
+
+
+
+
+ {siteConfig('PROXIO_PRICING_3_HEADER')}
+
+
+ {siteConfig('PROXIO_PRICING_3_FEATURES')
+ ?.split(',')
+ .map((feature, index) => {
+ return (
+
+ {feature}
+
+ )
+ })}
+
+
+
+ {siteConfig('PROXIO_PRICING_3_BUTTON_TEXT')}
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/SearchInput.js b/themes/proxio/components/SearchInput.js
new file mode 100644
index 00000000..1baf29e8
--- /dev/null
+++ b/themes/proxio/components/SearchInput.js
@@ -0,0 +1,107 @@
+import { useGlobal } from '@/lib/global'
+import { useRouter } from 'next/router'
+import { useImperativeHandle, useRef, useState } from 'react'
+
+let lock = false
+
+/**
+ * 搜索输入框
+ * @param {*} param0
+ * @returns
+ */
+const SearchInput = ({ currentTag, keyword, cRef }) => {
+ const { locale } = useGlobal()
+ const router = useRouter()
+ const searchInputRef = useRef(null)
+ useImperativeHandle(cRef, () => {
+ return {
+ focus: () => {
+ searchInputRef?.current?.focus()
+ }
+ }
+ })
+ const handleSearch = () => {
+ const key = searchInputRef.current.value
+ if (key && key !== '') {
+ router.push({ pathname: '/search/' + key }).then(r => {})
+ } else {
+ router.push({ pathname: '/' }).then(r => {})
+ }
+ }
+ const handleKeyUp = e => {
+ if (e.keyCode === 13) {
+ // 回车
+ handleSearch(searchInputRef.current.value)
+ } else if (e.keyCode === 27) {
+ // ESC
+ cleanSearch()
+ }
+ }
+ const cleanSearch = () => {
+ searchInputRef.current.value = ''
+ setShowClean(false)
+ }
+ function lockSearchInput() {
+ lock = true
+ }
+
+ function unLockSearchInput() {
+ lock = false
+ }
+ const [showClean, setShowClean] = useState(false)
+ const updateSearchKey = val => {
+ if (lock) {
+ return
+ }
+ searchInputRef.current.value = val
+ if (val) {
+ setShowClean(true)
+ } else {
+ setShowClean(false)
+ }
+ }
+
+ return (
+
+ )
+}
+
+export default SearchInput
diff --git a/themes/proxio/components/SignInForm.js b/themes/proxio/components/SignInForm.js
new file mode 100644
index 00000000..1b7024c3
--- /dev/null
+++ b/themes/proxio/components/SignInForm.js
@@ -0,0 +1,97 @@
+/* eslint-disable @next/next/no-img-element */
+
+import { Logo } from './Logo'
+import { SVGCircleBg2 } from './svg/SVGCircleBG2'
+import { SVGCircleBG3 } from './svg/SVGCircleBG3'
+import { SVGFacebook } from './svg/SVGFacebook'
+import { SVGGoogle } from './svg/SVGGoogle'
+import { SVGTwitter } from './svg/SVGTwitter'
+
+/**
+ * 登录
+ * @returns
+ */
+export const SignInForm = () => {
+ return <>
+ {/* */}
+
+
+
+
+
+
+
+ {/* 表单内容 */}
+
+
+
+
+ Connect With
+
+
+ {/* 社交平台 */}
+
+
+ Forget Password?
+
+
+ Not a member yet?
+
+ Sign Up
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+ >
+}
diff --git a/themes/proxio/components/SignUpForm.js b/themes/proxio/components/SignUpForm.js
new file mode 100644
index 00000000..f6f36553
--- /dev/null
+++ b/themes/proxio/components/SignUpForm.js
@@ -0,0 +1,160 @@
+import { Logo } from './Logo'
+
+/**
+ * 注册
+ * @returns
+ */
+export const SignUpForm = () => {
+ return <>
+ {/* */}
+
+
+
+
+
+
+
+
+
+ Connect With
+
+
+
+
+ By creating an account you are agree with our
+
+ Privacy
+
+ and
+
+ Policy
+
+
+
+
+ Already have an account?
+
+ Sign In
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+ >
+}
diff --git a/themes/proxio/components/SocialButton.js b/themes/proxio/components/SocialButton.js
new file mode 100644
index 00000000..d11f3423
--- /dev/null
+++ b/themes/proxio/components/SocialButton.js
@@ -0,0 +1,106 @@
+import { siteConfig } from '@/lib/config'
+
+/**
+ * 社交联系方式按钮组
+ * @returns {JSX.Element}
+ * @constructor
+ */
+const SocialButton = () => {
+ return (
+
+
+ {siteConfig('CONTACT_GITHUB') && (
+
+
+
+ )}
+ {siteConfig('CONTACT_TWITTER') && (
+
+
+
+ )}
+ {siteConfig('CONTACT_TELEGRAM') && (
+
+
+
+ )}
+ {siteConfig('CONTACT_LINKEDIN') && (
+
+
+
+ )}
+ {siteConfig('CONTACT_WEIBO') && (
+
+
+
+ )}
+ {siteConfig('CONTACT_INSTAGRAM') && (
+
+
+
+ )}
+ {siteConfig('CONTACT_EMAIL') && (
+
+
+
+ )}
+ {JSON.parse(siteConfig('ENABLE_RSS')) && (
+
+
+
+ )}
+ {siteConfig('CONTACT_BILIBILI') && (
+
+
+
+ )}
+ {siteConfig('CONTACT_YOUTUBE') && (
+
+
+
+ )}
+
+
+ )
+}
+export default SocialButton
diff --git a/themes/proxio/components/Team.js b/themes/proxio/components/Team.js
new file mode 100644
index 00000000..91f0198c
--- /dev/null
+++ b/themes/proxio/components/Team.js
@@ -0,0 +1,41 @@
+/* eslint-disable @next/next/no-img-element */
+import { siteConfig } from '@/lib/config'
+import { SVGAvatarBG } from './svg/SVGAvatarBG'
+
+export const Team = () => {
+ const PROXIO_TEAM_ITEMS = siteConfig('PROXIO_TEAM_ITEMS', [])
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+
+ {siteConfig('PROXIO_ABOUT_TITLE')}
+
+
+ {siteConfig('PROXIO_ABOUT_TEXT_1')}
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/Testimonials.js b/themes/proxio/components/Testimonials.js
new file mode 100644
index 00000000..556883e6
--- /dev/null
+++ b/themes/proxio/components/Testimonials.js
@@ -0,0 +1,150 @@
+/* eslint-disable react/no-unescaped-entities */
+/* eslint-disable @next/next/no-img-element */
+
+import { siteConfig } from '@/lib/config'
+import { loadExternalResource } from '@/lib/utils'
+import { useEffect } from 'react'
+import { SVGLeftArrow } from './svg/SVGLeftArrow'
+import { SVGRightArrow } from './svg/SVGRightArrow'
+
+/**
+ * 一些外部js
+ */
+const loadExternal = async () => {
+ await loadExternalResource(
+ 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/11.0.5/swiper-bundle.css',
+ 'css'
+ )
+ await loadExternalResource(
+ 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/11.0.5/swiper-bundle.min.js',
+ 'js'
+ )
+
+ const Swiper = window.Swiper
+ if (!Swiper) {
+ return
+ }
+ // Testimonial
+ // eslint-disable-next-line no-unused-vars
+ const testimonialSwiper = new Swiper('.testimonial-carousel', {
+ slidesPerView: 1,
+ spaceBetween: 30,
+
+ // Navigation arrows
+ navigation: {
+ nextEl: '.swiper-button-next',
+ prevEl: '.swiper-button-prev'
+ },
+
+ breakpoints: {
+ 640: {
+ slidesPerView: 2,
+ spaceBetween: 30
+ },
+ 1024: {
+ slidesPerView: 3,
+ spaceBetween: 30
+ },
+ 1280: {
+ slidesPerView: 3,
+ spaceBetween: 30
+ }
+ }
+ })
+}
+
+export const Testimonials = () => {
+ useEffect(() => {
+ loadExternal()
+ }, [])
+ // 用户评分
+ const ratings = [1, 2, 3, 4, 5]
+ const PROXIO_TESTIMONIALS_ITEMS = siteConfig('PROXIO_TESTIMONIALS_ITEMS')
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+
+ {siteConfig('PROXIO_TESTIMONIALS_TITLE')}
+
+
+ {siteConfig('PROXIO_TESTIMONIALS_TEXT_1')}
+
+
+ {siteConfig('PROXIO_TESTIMONIALS_TEXT_2')}
+
+
+
+
+
+
+
+
+ {/* 用户评价卡牌 */}
+ {PROXIO_TESTIMONIALS_ITEMS?.map((item, index) => {
+ return (
+
+ )
+ })}
+
+
+ {/* 切换按钮 */}
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
diff --git a/themes/proxio/components/svg/SVG404.js b/themes/proxio/components/svg/SVG404.js
new file mode 100644
index 00000000..dae4e7bc
--- /dev/null
+++ b/themes/proxio/components/svg/SVG404.js
@@ -0,0 +1,33 @@
+export const SVG404 = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGAvatarBG.js b/themes/proxio/components/svg/SVGAvatarBG.js
new file mode 100644
index 00000000..38f3ef75
--- /dev/null
+++ b/themes/proxio/components/svg/SVGAvatarBG.js
@@ -0,0 +1,220 @@
+export const SVGAvatarBG = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGCircleBG.js b/themes/proxio/components/svg/SVGCircleBG.js
new file mode 100644
index 00000000..58d95909
--- /dev/null
+++ b/themes/proxio/components/svg/SVGCircleBG.js
@@ -0,0 +1,290 @@
+export const SVGCircleBG = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGCircleBG2.js b/themes/proxio/components/svg/SVGCircleBG2.js
new file mode 100644
index 00000000..842d2a5e
--- /dev/null
+++ b/themes/proxio/components/svg/SVGCircleBG2.js
@@ -0,0 +1,35 @@
+/**
+ * 圆点背景图
+ */
+export const SVGCircleBg2 = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGCircleBG3.js b/themes/proxio/components/svg/SVGCircleBG3.js
new file mode 100644
index 00000000..0390998d
--- /dev/null
+++ b/themes/proxio/components/svg/SVGCircleBG3.js
@@ -0,0 +1,24 @@
+export const SVGCircleBG3 = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGDesign.js b/themes/proxio/components/svg/SVGDesign.js
new file mode 100644
index 00000000..414e8fbe
--- /dev/null
+++ b/themes/proxio/components/svg/SVGDesign.js
@@ -0,0 +1,46 @@
+export const SVGDesign = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGEmail.js b/themes/proxio/components/svg/SVGEmail.js
new file mode 100644
index 00000000..13f90a9b
--- /dev/null
+++ b/themes/proxio/components/svg/SVGEmail.js
@@ -0,0 +1,12 @@
+export const SVGEmail = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGEssential.js b/themes/proxio/components/svg/SVGEssential.js
new file mode 100644
index 00000000..bf8527c1
--- /dev/null
+++ b/themes/proxio/components/svg/SVGEssential.js
@@ -0,0 +1,26 @@
+export const SVGEssential = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGFacebook.js b/themes/proxio/components/svg/SVGFacebook.js
new file mode 100644
index 00000000..3d9836e3
--- /dev/null
+++ b/themes/proxio/components/svg/SVGFacebook.js
@@ -0,0 +1,15 @@
+export const SVGFacebook = ({ className }) => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGFooterCircleBG.js b/themes/proxio/components/svg/SVGFooterCircleBG.js
new file mode 100644
index 00000000..62280889
--- /dev/null
+++ b/themes/proxio/components/svg/SVGFooterCircleBG.js
@@ -0,0 +1,255 @@
+export const SVGFooterCircleBG = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGGifts.js b/themes/proxio/components/svg/SVGGifts.js
new file mode 100644
index 00000000..6c0d78bd
--- /dev/null
+++ b/themes/proxio/components/svg/SVGGifts.js
@@ -0,0 +1,14 @@
+export const SVGGifts = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGGoogle.js b/themes/proxio/components/svg/SVGGoogle.js
new file mode 100644
index 00000000..2773996a
--- /dev/null
+++ b/themes/proxio/components/svg/SVGGoogle.js
@@ -0,0 +1,14 @@
+export const SVGGoogle = ({ className }) => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGInstagram.js b/themes/proxio/components/svg/SVGInstagram.js
new file mode 100644
index 00000000..f904ce7b
--- /dev/null
+++ b/themes/proxio/components/svg/SVGInstagram.js
@@ -0,0 +1,23 @@
+export const SVGInstagram = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGLeftArrow.js b/themes/proxio/components/svg/SVGLeftArrow.js
new file mode 100644
index 00000000..693aafbd
--- /dev/null
+++ b/themes/proxio/components/svg/SVGLeftArrow.js
@@ -0,0 +1,14 @@
+export const SVGLeftArrow = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGLocation.js b/themes/proxio/components/svg/SVGLocation.js
new file mode 100644
index 00000000..bfc8c18f
--- /dev/null
+++ b/themes/proxio/components/svg/SVGLocation.js
@@ -0,0 +1,15 @@
+export const SVGLocation = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGPlayAstro.js b/themes/proxio/components/svg/SVGPlayAstro.js
new file mode 100644
index 00000000..0af28259
--- /dev/null
+++ b/themes/proxio/components/svg/SVGPlayAstro.js
@@ -0,0 +1,28 @@
+export default function SVGPlayAstro() {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGPlayBoostrap.js b/themes/proxio/components/svg/SVGPlayBoostrap.js
new file mode 100644
index 00000000..0f3aeca1
--- /dev/null
+++ b/themes/proxio/components/svg/SVGPlayBoostrap.js
@@ -0,0 +1,31 @@
+export default function SVGPlayBootstrap() {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGPlayNext.js b/themes/proxio/components/svg/SVGPlayNext.js
new file mode 100644
index 00000000..91a0a537
--- /dev/null
+++ b/themes/proxio/components/svg/SVGPlayNext.js
@@ -0,0 +1,14 @@
+export default function SVGPlayNext() {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGPlayReact.js b/themes/proxio/components/svg/SVGPlayReact.js
new file mode 100644
index 00000000..2556599b
--- /dev/null
+++ b/themes/proxio/components/svg/SVGPlayReact.js
@@ -0,0 +1,17 @@
+export default function SVGPlayReact() {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGPlayTailWind.js b/themes/proxio/components/svg/SVGPlayTailWind.js
new file mode 100644
index 00000000..c95fd149
--- /dev/null
+++ b/themes/proxio/components/svg/SVGPlayTailWind.js
@@ -0,0 +1,29 @@
+export default function SVGPlayTailwind() {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGQuestion.js b/themes/proxio/components/svg/SVGQuestion.js
new file mode 100644
index 00000000..817171a2
--- /dev/null
+++ b/themes/proxio/components/svg/SVGQuestion.js
@@ -0,0 +1,18 @@
+export const SVGQuestion = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGRightArrow.js b/themes/proxio/components/svg/SVGRightArrow.js
new file mode 100644
index 00000000..ba6338cb
--- /dev/null
+++ b/themes/proxio/components/svg/SVGRightArrow.js
@@ -0,0 +1,14 @@
+export const SVGRightArrow = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGTemplate.js b/themes/proxio/components/svg/SVGTemplate.js
new file mode 100644
index 00000000..a618d0ba
--- /dev/null
+++ b/themes/proxio/components/svg/SVGTemplate.js
@@ -0,0 +1,14 @@
+export const SVGTemplate = () => {
+ return
+}
diff --git a/themes/proxio/components/svg/SVGTwitter.js b/themes/proxio/components/svg/SVGTwitter.js
new file mode 100644
index 00000000..dcef95fc
--- /dev/null
+++ b/themes/proxio/components/svg/SVGTwitter.js
@@ -0,0 +1,15 @@
+export const SVGTwitter = ({ className }) => {
+ return
+}
diff --git a/themes/proxio/config.js b/themes/proxio/config.js
new file mode 100644
index 00000000..e1606d92
--- /dev/null
+++ b/themes/proxio/config.js
@@ -0,0 +1,357 @@
+/**
+ * 另一个落地页主题
+ */
+const CONFIG = {
+ // 默认只展示Logo文字,如果设置了logo图片,会在文字左侧显示图标
+ PROXIO_LOGO: '', // 普通logo图片 示例:/images/starter/logo/logo.svg
+ PROXIO_LOGO_WHITE: '', // 透明底浅色logo 示例: /images/starter/logo/logo-white.svg
+
+ // MENU , 菜单部分不在此处配置,请在Notion数据库中添加MENU
+
+ // 英雄区块导航
+ PROXIO_HERO_ENABLE: true, // 开启英雄区
+ PROXIO_HERO_TITLE_1: '开源且免费的基于 Notion 笔记的网站构建工具', // 英雄区文字
+ PROXIO_HERO_TITLE_2: '通过笔记无感知地建站、成倍放大您的价值', // 英雄区文字
+ // 英雄区两个按钮,如果TEXT留空则隐藏按钮
+ PROXIO_HERO_BUTTON_1_TEXT: '开始体验', // 英雄区按钮
+ PROXIO_HERO_BUTTON_1_URL:
+ 'https://docs.tangly1024.com/article/vercel-deploy-notion-next', // 英雄区按钮
+ PROXIO_HERO_BUTTON_2_TEXT: '在Github上关注', // 英雄区按钮
+ PROXIO_HERO_BUTTON_2_URL: 'https://github.com/tangly1024/NotionNext', // 英雄区按钮
+ PROXIO_HERO_BUTTON_2_ICON: '/images/starter/github.svg', // 英雄区按钮2的图标,不需要则留空
+
+ // 英雄区配图,如需隐藏,改为空值即可 ''
+ PROXIO_HERO_BANNER_IMAGE: '', // hero区背景,默认是获取Notion背景,如需另外配置图片可以填写在这里
+ PROXIO_HERO_BANNER_IFRAME_URL: '', // hero背景区内嵌背景网页 ,可以配置一个网页地址,例如动画网页https://my.spline.design/untitled-b0c6e886227646c34afc82cdc6de4ca2/
+
+
+ // 文章区块
+ PROXIO_BLOG_ENABLE: true, // 首页博文区块开关
+ PROXIO_BLOG_TITLE: '作品',
+ PROXIO_BLOG_COUNT: 4, // 首页博文区块默认展示前3篇文章
+ PROXIO_BLOG_TEXT_1: '我的最新动态',
+
+ PROXIO_ANNOUNCEMENT_ENABLE: true, //公告文字区块
+
+ // 特性区块
+ PROXIO_FEATURE_ENABLE: true, // 特性区块开关
+ PROXIO_FEATURE_TITLE: '特性', // 特性
+ PROXIO_FEATURE_TEXT_1: 'NotionNext的主要特性', // 特性
+ PROXIO_FEATURE_TEXT_2:
+ 'NotionNext的愿景是帮助您简单、无感知地稳定地搭建自己的网站,放大品牌的价值。 ', // 特性
+
+ PROXIO_FEATURE_1_TITLE_1: '免费且开源', // 特性1
+ PROXIO_FEATURE_1_TEXT_1: '项目源码在Github上完全开放共享,遵循MIT协议', // 特性1
+ PROXIO_FEATURE_1_BUTTON_TEXT: '了解更多', // 特性1
+ PROXIO_FEATURE_1_BUTTON_URL: 'https://github.com/tangly1024/NotionNext', // 特性1
+
+ PROXIO_FEATURE_2_TITLE_1: '多种主题定制', // 特性2
+ PROXIO_FEATURE_2_TEXT_1: '数十种主题,适用于不同场景,总有一款适合你', // 特性2
+ PROXIO_FEATURE_2_BUTTON_TEXT: '了解更多', // 特性2
+ PROXIO_FEATURE_2_BUTTON_URL:
+ 'https://docs.tangly1024.com/article/notion-next-themes', // 特性2
+
+ PROXIO_FEATURE_3_TITLE_1: '优秀的性能', // 特性3
+ PROXIO_FEATURE_3_TEXT_1: '基于NextJS开发,更快的响应速度,更好的SEO', // 特性3
+ PROXIO_FEATURE_3_BUTTON_TEXT: '了解更多', // 特性3
+ PROXIO_FEATURE_3_BUTTON_URL: 'https://docs.tangly1024.com/article/next-js', // 特性3
+
+ PROXIO_FEATURE_4_TITLE_1: '便捷的写作体验', // 特性4
+ PROXIO_FEATURE_4_TEXT_1: '只需在Notion笔记中编修,自动同步到网站', // 特性4
+ PROXIO_FEATURE_4_BUTTON_TEXT: '了解更多', // 特性4
+ PROXIO_FEATURE_4_BUTTON_URL: 'https://docs.tangly1024.com/about', // 特性4
+
+ // 首页生涯区块
+ PROXIO_CAREER_ENABLE: true, // 区块开关
+ PROXIO_CAREER_TITLE: '一套轻量实用的建站解决方案',
+ PROXIO_CAREER_TEXT:
+ 'NotionNext的愿景是帮助非技术人员的小白,最低成本、最快速地搭建自己的网站,帮助您将自己的产品与故事高效地传达给世界。
功能强大的Notion笔记,简单快速的Vercel托管平台,组成一个简单的网站',
+ PROXIO_CAREER_BUTTON_TEXT: '了解更多',
+ PROXIO_CAREER_BUTTON_URL: 'https://docs.tangly1024.com/about',
+ PROXIO_CAREER_IMAGE_1: '/images/starter/about/about-image-01.jpg',
+ PROXIO_CAREER_IMAGE_2: '/images/starter/about/about-image-02.jpg',
+ PROXIO_CAREER_TIPS_1: '7000+',
+ PROXIO_CAREER_TIPS_2: '博客站点',
+ PROXIO_CAREER_TIPS_3: '正在线上运行',
+
+ // 首页价格区块
+ PROXIO_PRICING_ENABLE: true, // 价格区块开关
+ PROXIO_PRICING_TITLE: '价格表',
+ PROXIO_PRICING_TEXT_1: '很棒的定价计划',
+ PROXIO_PRICING_TEXT_2:
+ '我们制定了灵活的付费模式,您可以按需选择。(NotionNext免费开源,这里仅演示产品订阅付费功能,请勿下单购买!)',
+
+ PROXIO_PRICING_1_TITLE: '入门版',
+ PROXIO_PRICING_1_PRICE: '19.9',
+ PROXIO_PRICING_1_PRICE_CURRENCY: '$',
+ PROXIO_PRICING_1_PRICE_PERIOD: '每月',
+ PROXIO_PRICING_1_HEADER: '功能点',
+ PROXIO_PRICING_1_FEATURES: '所有的主题,免费更新,帮助手册', // 英文逗号隔开
+ PROXIO_PRICING_1_BUTTON_TEXT: '立即购买',
+ PROXIO_PRICING_1_BUTTON_URL:
+ 'https://tangly1024.lemonsqueezy.com/checkout/buy/c1a38a65-362e-44c5-8065-733fee39eb54',
+
+ PROXIO_PRICING_2_TAG: '推荐',
+ PROXIO_PRICING_2_TITLE: '基础版',
+ PROXIO_PRICING_2_PRICE: '39.9',
+ PROXIO_PRICING_2_PRICE_CURRENCY: '$',
+ PROXIO_PRICING_2_PRICE_PERIOD: '每月',
+ PROXIO_PRICING_2_HEADER: '功能点',
+ PROXIO_PRICING_2_FEATURES: '包含入门版,项目源码,内部社群,技术咨询,SEO优化', // 英文逗号隔开
+ PROXIO_PRICING_2_BUTTON_TEXT: '立即购买',
+ PROXIO_PRICING_2_BUTTON_URL:
+ 'https://tangly1024.lemonsqueezy.com/checkout/buy/590ad70a-c3b7-4caf-94ec-9ca27bde06d4',
+
+ PROXIO_PRICING_3_TITLE: '高级版',
+ PROXIO_PRICING_3_PRICE: '59.9',
+ PROXIO_PRICING_3_PRICE_CURRENCY: '$',
+ PROXIO_PRICING_3_PRICE_PERIOD: '每月',
+ PROXIO_PRICING_3_HEADER: '功能点',
+ PROXIO_PRICING_3_FEATURES: '包含基础版,功能定制开发', // 英文逗号隔开
+ PROXIO_PRICING_3_BUTTON_TEXT: '立即购买',
+ PROXIO_PRICING_3_BUTTON_URL:
+ 'https://tangly1024.lemonsqueezy.com/checkout/buy/df924d66-09dc-42a4-a632-a6b0c5cc4f28',
+
+ // 首页用户测评区块
+ PROXIO_TESTIMONIALS_ENABLE: true, // 测评区块开关
+ PROXIO_TESTIMONIALS_TITLE: '用户反馈',
+ PROXIO_TESTIMONIALS_TEXT_1: '我们的用户怎么说',
+ PROXIO_TESTIMONIALS_TEXT_2:
+ '数千位站长选择用NotionNext搭建他们的网站,通过帮助手册、交流社群以及技术咨询,大家成功上线了自己的网站',
+ PROXIO_TESTIMONIALS_STAR_ICON: '/images/starter/testimonials/icon-star.svg', // 评分图标
+
+ // 这里不支持CONFIG和环境变量,需要一一修改此处代码。
+ PROXIO_TESTIMONIALS_ITEMS: [
+ {
+ PROXIO_TESTIMONIALS_ITEM_TEXT:
+ '感谢大佬的方法。之前尝试过Super、Potion等国外的第三方平台,实现效果一般,个性化程度远不如这个方法,已经用起来了! ',
+ PROXIO_TESTIMONIALS_ITEM_AVATAR:
+ 'https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F22de3fcb-d90d-4271-bc01-f815f476122b%2F4FE0A0C0-E487-4C74-BF8E-6F01A27461B8-14186-000008094BC289A6.jpg?table=collection&id=a320a2cc-6ebe-4a8d-95cc-ea94e63bced9&width=200',
+ PROXIO_TESTIMONIALS_ITEM_NICKNAME: 'Ryan_G',
+ PROXIO_TESTIMONIALS_ITEM_DESCRIPTION: 'Ryan`Log 站长',
+ PROXIO_TESTIMONIALS_ITEM_URL: 'https://blog.gaoran.xyz/'
+ },
+ {
+ PROXIO_TESTIMONIALS_ITEM_TEXT:
+ '很喜欢这个主题,本代码小白用三天台风假期搭建出来了,还根据大佬的教程弄了自定义域名,十分感谢,已请喝咖啡~',
+ PROXIO_TESTIMONIALS_ITEM_AVATAR:
+ 'https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0d33d169-f932-41ff-ac6b-88a923c08e02%2F%25E5%25A4%25B4%25E5%2583%258F.jfif?table=collection&id=7787658d-d5c0-4f34-8e32-60c523dfaba3&width=400',
+ PROXIO_TESTIMONIALS_ITEM_NICKNAME: 'Asenkits',
+ PROXIO_TESTIMONIALS_ITEM_DESCRIPTION: '阿森的百宝袋 站长',
+ PROXIO_TESTIMONIALS_ITEM_URL: 'https://asenkits.top/'
+ },
+ {
+ PROXIO_TESTIMONIALS_ITEM_TEXT:
+ '呜呜呜,经过一个下午的努力,终于把博客部署好啦,非常感谢Tangly1024大佬的框架和教程,这是我有生之年用过的最好用的博客框架┭┮﹏┭┮。从今之后,我就可以在自己的博客里bb啦,( •̀ ω •́ )y ',
+ PROXIO_TESTIMONIALS_ITEM_AVATAR:
+ 'https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F6c096b44-beb9-48ee-8f92-1efdde47f3a3%2F338962f1-d352-49c7-9a1b-746e35a7005c%2Fhf.png?table=block&id=ce5a48a9-d77a-4843-a3d9-a78cd4f794ce&spaceId=6c096b44-beb9-48ee-8f92-1efdde47f3a3&width=100&userId=27074aef-7216-41ed-baef-d9b53addd870&cache=v2',
+ PROXIO_TESTIMONIALS_ITEM_NICKNAME: 'DWIND',
+ PROXIO_TESTIMONIALS_ITEM_DESCRIPTION: '且听风吟 站长',
+ PROXIO_TESTIMONIALS_ITEM_URL: 'https://www.dwind.top/'
+ },
+ {
+ PROXIO_TESTIMONIALS_ITEM_TEXT:
+ '感谢提供这么好的项目哈哈 之前一直不知道怎么部署(别的项目好难好复杂)这个相对非常简单 新手非常友好哦',
+ PROXIO_TESTIMONIALS_ITEM_AVATAR:
+ 'https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd52f6766-3e32-4c3d-8529-46e1f214360f%2Ffavicon.svg?table=collection&id=7d76aad5-a2c4-4d9a-887c-c7913fae4eed&width=400',
+ PROXIO_TESTIMONIALS_ITEM_NICKNAME: '迪升disheng ',
+ PROXIO_TESTIMONIALS_ITEM_DESCRIPTION: 'AI资源分享 Blog',
+ PROXIO_TESTIMONIALS_ITEM_URL: 'https://blog.disheng.org/'
+ },
+ {
+ PROXIO_TESTIMONIALS_ITEM_TEXT:
+ '灰常感谢大佬的博客项目,能将博客和notion结合起来,这一直是我挺期待的博客模式。',
+ PROXIO_TESTIMONIALS_ITEM_AVATAR:
+ 'https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fafb21381-f51b-4fd0-9998-800dbeb64dbe%2Favatar.png?table=block&id=195935d2-0d8d-49fc-bd81-1db42ee50840&spaceId=6c096b44-beb9-48ee-8f92-1efdde47f3a3&width=100&userId=27074aef-7216-41ed-baef-d9b53addd870&cache=v2',
+ PROXIO_TESTIMONIALS_ITEM_NICKNAME: 'AnJhon',
+ PROXIO_TESTIMONIALS_ITEM_DESCRIPTION: 'Anjhon`s Blog 站长',
+ PROXIO_TESTIMONIALS_ITEM_URL: 'https://www.anjhon.top'
+ },
+ {
+ PROXIO_TESTIMONIALS_ITEM_TEXT: '用好久了,太感谢了',
+ PROXIO_TESTIMONIALS_ITEM_AVATAR:
+ 'https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe4f391d7-7d65-4c05-a82c-c6e2c40f06e4%2Fa2a7641a26b367608c6ef28ce9b7e983_(2).png?table=block&id=a386eb0e-4c07-4b18-9ece-bba4e79ce21c&spaceId=6c096b44-beb9-48ee-8f92-1efdde47f3a3&width=100&userId=27074aef-7216-41ed-baef-d9b53addd870&cache=v2',
+ PROXIO_TESTIMONIALS_ITEM_NICKNAME: 'LUCEN',
+ PROXIO_TESTIMONIALS_ITEM_DESCRIPTION: 'LUCEN考验辅导 站长',
+ PROXIO_TESTIMONIALS_ITEM_URL: 'https://www.lucenczz.top/'
+ }
+ ],
+
+ // FAQ 常见问题模块
+ PROXIO_FAQ_ENABLE: true, // 常见问题模块开关
+ PROXIO_FAQ_TITLE: '常见问题解答',
+ PROXIO_FAQ_TEXT_1: '有任何问题吗?请看这里',
+ PROXIO_FAQ_TEXT_2: '我们收集了常见的用户疑问',
+
+ PROXIO_FAQ_1_QUESTION: 'NotionNext有帮助文档吗?',
+ PROXIO_FAQ_1_ANSWER:
+ 'NotionNext提供了帮助文档,操作演示视频,以及交流社群来协助您完成网站的搭建部署',
+
+ PROXIO_FAQ_2_QUESTION: '部署后要如何编写文章?',
+ PROXIO_FAQ_2_ANSWER:
+ '您可以在Notion中之间添加或修改类型为Post的页面,内容将被实时同步在站点中,详情参考《帮助文档》',
+
+ PROXIO_FAQ_3_QUESTION: '站点部署失败,更新失败?',
+ PROXIO_FAQ_3_ANSWER:
+ '通常是配置修改错误导致,请检查配置或者重试操作步骤,或者通过Vercel后台的Deployments中找到错误日志,并向网友求助',
+
+ PROXIO_FAQ_4_QUESTION: '文章没有实时同步?',
+ PROXIO_FAQ_4_ANSWER:
+ '先检查Notion_Page_ID是否正确配置,其次由于博客的每个页面都有独立缓存,刷新网页后即可解决',
+
+ // 团队成员区块
+ PROXIO_ABOUT_ENABLE: true, // 团队成员区块开关
+ PROXIO_ABOUT_TITLE: '团队成员',
+ PROXIO_ABOUT_TEXT_1: '我们的开发者团队',
+ PROXIO_ABOUT_TEXT_2:
+ 'NotionNext 由众多开源技术爱好者们共同合作完成,感谢每一位贡献者',
+ PROXIO_ABOUT_PHOTO_URL:'',
+ PROXIO_ABOUT_KEY_1:'经验年限',
+ PROXIO_ABOUT_VAL_1:'10年+',
+ PROXIO_ABOUT_KEY_2:'客户',
+ PROXIO_ABOUT_VAL_2:'1000+',
+ PROXIO_ABOUT_KEY_3:'交付项目',
+ PROXIO_ABOUT_VAL_3:'5000+',
+ PROXIO_ABOUT_KEY_4:'累积创作时长(小时)',
+ PROXIO_ABOUT_VAL_4:'10000+',
+
+
+ // 联系模块
+ PROXIO_CONTACT_ENABLE: true, // 联系模块开关
+ PROXIO_CONTACT_TITLE: '联系我们',
+ PROXIO_CONTACT_TEXT: '告诉我们您遇到的问题',
+ PROXIO_CONTACT_LOCATION_TITLE: '我们的位置',
+ PROXIO_CONTACT_LOCATION_TEXT: '中国,福建',
+ PROXIO_CONTACT_EMAIL_TITLE: '我们如何帮助您?',
+ PROXIO_CONTACT_EMAIL_TEXT: 'mail@tangly1024.com',
+
+ // 嵌入外部表单
+ PROXIO_CONTACT_MSG_EXTERNAL_URL: 'https://noteforms.com/forms/yfctc7', // 基于NoteForm创建,将留言数据存在Notion中
+ // 自定义留言表单,以下几个配置暂时废弃
+ // PROXIO_CONTACT_MSG_TITLE: '向我们留言',
+ // PROXIO_CONTACT_MSG_NAME: '姓名',
+ // PROXIO_CONTACT_MSG_EMAIL: '邮箱地址',
+ // PROXIO_CONTACT_MSG_PHONE: '联系电话',
+ // PROXIO_CONTACT_MSG_TEXT: '消息内容',
+ // PROXIO_CONTACT_MSG_SEND: '发送消息',
+ // PROXIO_CONTACT_MSG_THANKS: '感谢您的留言',
+
+ // 合作伙伴的图标
+ PROXIO_BRANDS_ENABLE: true, // 合作伙伴开关
+ PROXIO_BRANDS: [
+ {
+ IMAGE: '/images/starter/brands/graygrids.svg',
+ IMAGE_WHITE: '/images/starter/brands/graygrids-white.svg',
+ URL: 'https://graygrids.com/',
+ TITLE: 'graygrids'
+ },
+ {
+ IMAGE: '/images/starter/brands/lineicons.svg',
+ IMAGE_WHITE: '/images/starter/brands/lineicons-white.svg',
+ URL: 'https://lineicons.com/',
+ TITLE: 'lineicons'
+ },
+ {
+ IMAGE: '/images/starter/brands/uideck.svg',
+ IMAGE_WHITE: '/images/starter/brands/uideck-white.svg',
+ URL: 'https://uideck.com/',
+ TITLE: 'uideck'
+ },
+ {
+ IMAGE: '/images/starter/brands/ayroui.svg',
+ IMAGE_WHITE: '/images/starter/brands/ayroui-white.svg',
+ URL: 'https://ayroui.com/',
+ TITLE: 'ayroui'
+ },
+ {
+ IMAGE: '/images/starter/brands/tailgrids.svg',
+ IMAGE_WHITE: '/images/starter/brands/tailgrids-white.svg',
+ URL: '"https://tailgrids.com/',
+ TITLE: 'tailgrids'
+ }
+ ],
+
+ PROXIO_FOOTER_SLOGAN: '我们通过技术为品牌和公司创造数字体验。',
+
+ // 页脚三列菜单组
+ PROXIO_FOOTER_LINK_GROUP: [
+ {
+ TITLE: '关于我们',
+ LINK_GROUP: [
+ { TITLE: '官方主页', URL: '/#home' },
+ { TITLE: '操作文档', URL: 'https://docs.tangly1024.com/about' },
+ {
+ TITLE: '帮助支持',
+ URL: 'https://docs.tangly1024.com/article/how-to-question'
+ },
+ {
+ TITLE: '合作申请',
+ URL: 'https://docs.tangly1024.com/article/my-service'
+ }
+ ]
+ },
+ {
+ TITLE: '功能特性',
+ LINK_GROUP: [
+ {
+ TITLE: '部署指南',
+ URL: 'https://docs.tangly1024.com/article/vercel-deploy-notion-next'
+ },
+ {
+ TITLE: '升级指南',
+ URL: 'https://docs.tangly1024.com/article/how-to-update-notionnext'
+ },
+ { TITLE: '最新版本', URL: 'https://docs.tangly1024.com/article/latest' }
+ ]
+ },
+ {
+ TITLE: 'Notion写作',
+ LINK_GROUP: [
+ {
+ TITLE: 'Notion开始写作',
+ URL: 'https://docs.tangly1024.com/article/start-to-write'
+ },
+ {
+ TITLE: '快捷键提升效率',
+ URL: 'https://docs.tangly1024.com/article/notion-short-key'
+ },
+ {
+ TITLE: '中国大陆使用Notion',
+ URL: 'https://docs.tangly1024.com/article/notion-faster'
+ }
+ ]
+ }
+ ],
+
+ PROXIO_FOOTER_BLOG_LATEST_TITLE: '最新文章',
+
+ PROXIO_FOOTER_PRIVACY_POLICY_TEXT: '隐私政策',
+ PROXIO_FOOTER_PRIVACY_POLICY_URL: '/privacy-policy',
+
+ PROXIO_FOOTER_PRIVACY_LEGAL_NOTICE_TEXT: '法律声明',
+ PROXIO_FOOTER_PRIVACY_LEGAL_NOTICE_URL: '/legacy-notice',
+
+ PROXIO_FOOTER_PRIVACY_TERMS_OF_SERVICE_TEXT: '服务协议',
+ PROXIO_FOOTER_PRIVACY_TERMS_OF_SERVICE_URL: '/terms-of-use',
+
+ // 404页面的提示语
+ PROXIO_404_TITLE: '我们似乎找不到您要找的页面。',
+ PROXIO_404_TEXT: '抱歉!您要查找的页面不存在。可能已经移动或删除。',
+ PROXIO_404_BACK: '回到主页',
+
+ // 页面底部的行动呼吁模块
+ PROXIO_CTA_ENABLE: true,
+ PROXIO_CTA_TITLE: '你还在等待什么呢?',
+ PROXIO_CTA_TITLE_2: '现在开始吧',
+ PROXIO_CTA_DESCRIPTION:
+ '访问NotionNext的操作文档,我们提供了详细的教程,帮助你即刻搭建站点',
+ PROXIO_CTA_BUTTON: true, // 是否显示按钮
+ PROXIO_CTA_BUTTON_URL:
+ 'https://docs.tangly1024.com/article/vercel-deploy-notion-next',
+ PROXIO_CTA_BUTTON_TEXT: '开始体验',
+
+ PROXIO_POST_REDIRECT_ENABLE: true, // 默認開啟重定向
+ PROXIO_POST_REDIRECT_URL: 'https://blog.tangly1024.com', // 重定向域名
+ PROXIO_NEWSLETTER: process.env.NEXT_PUBLIC_THEME_PROXIO_NEWSLETTER || false // 是否开启邮件订阅 请先配置mailchimp功能 https://docs.tangly1024.com/article/notion-next-mailchimp
+}
+export default CONFIG
diff --git a/themes/proxio/index.js b/themes/proxio/index.js
new file mode 100644
index 00000000..61725ab6
--- /dev/null
+++ b/themes/proxio/index.js
@@ -0,0 +1,555 @@
+/* eslint-disable react/no-unescaped-entities */
+/* eslint-disable @next/next/no-img-element */
+
+'use client'
+import Loading from '@/components/Loading'
+import NotionPage from '@/components/NotionPage'
+import { siteConfig } from '@/lib/config'
+import { isBrowser } from '@/lib/utils'
+import { useRouter } from 'next/router'
+import { useEffect } from 'react'
+import { About } from './components/About'
+import { BackToTopButton } from './components/BackToTopButton'
+import { Blog } from './components/Blog'
+import { Brand } from './components/Brand'
+import { Contact } from './components/Contact'
+import { FAQ } from './components/FAQ'
+import { Features } from './components/Features'
+import { Footer } from './components/Footer'
+import { Header } from './components/Header'
+import { Hero } from './components/Hero'
+import { Pricing } from './components/Pricing'
+import { Team } from './components/Team'
+import { Testimonials } from './components/Testimonials'
+import CONFIG from './config'
+import { Style } from './style'
+// import { MadeWithButton } from './components/MadeWithButton'
+import Comment from '@/components/Comment'
+import replaceSearchResult from '@/components/Mark'
+import ShareBar from '@/components/ShareBar'
+import DashboardBody from '@/components/ui/dashboard/DashboardBody'
+import DashboardHeader from '@/components/ui/dashboard/DashboardHeader'
+import { useGlobal } from '@/lib/global'
+import { loadWowJS } from '@/lib/plugins/wow'
+import { SignIn, SignUp } from '@clerk/nextjs'
+import Link from 'next/link'
+import { ArticleLock } from './components/ArticleLock'
+import { Banner } from './components/Banner'
+import { CTA } from './components/CTA'
+import SearchInput from './components/SearchInput'
+import { SignInForm } from './components/SignInForm'
+import { SignUpForm } from './components/SignUpForm'
+import { SVG404 } from './components/svg/SVG404'
+import Lenis from '@/components/Lenis'
+import Announcement from './components/Announcement'
+
+/**
+ * 布局框架
+ * Landing-2 主题用作产品落地页展示
+ * 结合Stripe或者lemonsqueezy插件可以成为saas支付订阅
+ * https://play-tailwind.tailgrids.com/
+ * @param {*} props
+ * @returns
+ */
+const LayoutBase = props => {
+ const { children } = props
+
+ // 加载wow动画
+ useEffect(() => {
+ loadWowJS()
+ }, [])
+
+ return (
+
+
+ {/* 页头 */}
+
+
+
+ {children}
+
+
+ {/* 页脚 */}
+
+
+ {/* 悬浮按钮 */}
+
+
+ {/* 鼠标阻尼效果 */}
+
+
+ {/*
*/}
+
+ )
+}
+
+/**
+ * 首页布局
+ * @param {*} props
+ * @returns
+ */
+const LayoutIndex = props => {
+ const count = siteConfig('PROXIO_BLOG_COUNT', 4, CONFIG)
+ const { locale } = useGlobal()
+ const posts = props?.allNavPages ? props.allNavPages.slice(0, count) : []
+ return (
+ <>
+ {/* 英雄区 */}
+ {siteConfig('PROXIO_HERO_ENABLE', true, CONFIG) && }
+ {/* 博文列表 */}
+ {siteConfig('PROXIO_BLOG_ENABLE', true, CONFIG) && (
+ <>
+
+ {/* 更多文章按钮 */}
+
+
+ {locale.COMMON.MORE}
+
+
+
+ >
+ )}
+
+ {/* 短留言公告 */}
+ {siteConfig('PROXIO_ANNOUNCEMENT_ENABLE', true, CONFIG) && }
+
+ {/* 团队介绍 */}
+ {siteConfig('PROXIO_ABOUT_ENABLE', true, CONFIG) && }
+
+ {/* 合作伙伴 */}
+ {siteConfig('PROXIO_BRANDS_ENABLE', true, CONFIG) && }
+
+ {/* 产品特性 */}
+ {siteConfig('PROXIO_FEATURE_ENABLE', true, CONFIG) && }
+ {/* 生涯 */}
+ {siteConfig('PROXIO_CAREER_ENABLE', true, CONFIG) && }
+
+
+ {/* 价格 */}
+ {/* {siteConfig('PROXIO_PRICING_ENABLE', true, CONFIG) && } */}
+
+
+
+ {/* 评价展示 */}
+ {siteConfig('PROXIO_TESTIMONIALS_ENABLE', true, CONFIG) && (
+
+ )}
+ {/* 常见问题 */}
+ {siteConfig('PROXIO_FAQ_ENABLE', true, CONFIG) && }
+
+
+ {/* 行动呼吁 */}
+ {siteConfig('PROXIO_CTA_ENABLE', true, CONFIG) && }
+ >
+ )
+}
+
+/**
+ * 文章详情页布局
+ * @param {*} props
+ * @returns
+ */
+const LayoutSlug = props => {
+ const { post, lock, validPassword } = props
+
+ // 如果 是 /article/[slug] 的文章路径则視情況进行重定向到另一个域名
+ const router = useRouter()
+ if (
+ !post &&
+ siteConfig('PROXIO_POST_REDIRECT_ENABLE') &&
+ isBrowser &&
+ router.route === '/[prefix]/[slug]'
+ ) {
+ const redirectUrl =
+ siteConfig('PROXIO_POST_REDIRECT_URL') +
+ router.asPath.replace('?theme=landing', '')
+ router.push(redirectUrl)
+ return (
+
+
+
+ )
+ }
+
+ return (
+ <>
+
+
+
+
+ {lock &&
}
+
+ {!lock && post && (
+
+
+
+
+
+ )}
+
+
+
+ >
+ )
+}
+
+/**
+ * 仪表盘
+ * @param {*} props
+ * @returns
+ */
+const LayoutDashboard = props => {
+ const { post } = props
+
+ return (
+ <>
+
+
+
+ {post && (
+
+
+
+ )}
+
+
+
+ {/* 仪表盘 */}
+
+
+ >
+ )
+}
+
+/**
+ * 搜索
+ * @param {*} props
+ * @returns
+ */
+const LayoutSearch = props => {
+ const { keyword } = props
+ const router = useRouter()
+ const currentSearch = keyword || router?.query?.s
+
+ useEffect(() => {
+ if (isBrowser) {
+ replaceSearchResult({
+ doms: document.getElementById('posts-wrapper'),
+ search: keyword,
+ target: {
+ element: 'span',
+ className: 'text-red-500 border-b border-dashed'
+ }
+ })
+ }
+ }, [])
+ return (
+ <>
+
+
+ {currentSearch && }
+
+ >
+ )
+}
+
+/**
+ * 文章归档
+ * @param {*} props
+ * @returns
+ */
+const LayoutArchive = props => (
+ <>
+ {/* 博文列表 */}
+
+ >
+)
+
+/**
+ * 404页面
+ * @param {*} props
+ * @returns
+ */
+const Layout404 = props => {
+ return (
+ <>
+ {/* */}
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+ {siteConfig('PROXIO_404_TITLE')}
+
+
+ {siteConfig('PROXIO_404_TEXT')}
+
+
+ {siteConfig('PROXIO_404_BACK')}
+
+
+
+
+
+
+ {/* */}
+ >
+ )
+}
+
+/**
+ * 博客列表
+ */
+const LayoutPostList = props => {
+ const { posts, category, tag } = props
+ const slotTitle = category || tag
+
+ return (
+ <>
+ {/* */}
+
+
+ {/* 区块标题文字 */}
+
+
+
+ {slotTitle && (
+
+ {slotTitle}
+
+ )}
+
+ {!slotTitle && (
+ <>
+
+ {siteConfig('PROXIO_BLOG_TITLE')}
+
+
+ {siteConfig('PROXIO_BLOG_TEXT_1')}
+
+
+ >
+ )}
+
+
+
+ {/* 博客列表 此处优先展示4篇文章 */}
+
+ {posts?.map((item, index) => {
+ return (
+
+
+
+
+

+
+
+
+
+ {item.publishDay}
+
+
+
+ {item.title}
+
+
+
+ {item.summary}
+
+
+
+
+ )
+ })}
+
+
+
+ {/* */}
+ >
+ )
+}
+/**
+ * 分类列表
+ * @param {*} props
+ * @returns
+ */
+const LayoutCategoryIndex = props => {
+ const { categoryOptions } = props
+ const { locale } = useGlobal()
+ return (
+
+
+
+ {locale.COMMON.CATEGORY}
+
+
+ {categoryOptions?.map(category => {
+ return (
+
+
+
+ {category.name}({category.count})
+
+
+ )
+ })}
+
+
+
+ )
+}
+
+/**
+ * 标签列表
+ * @param {*} props
+ * @returns
+ */
+const LayoutTagIndex = props => {
+ const { tagOptions } = props
+ const { locale } = useGlobal()
+ return (
+
+
+
+ {locale.COMMON.TAGS}
+
+
+
+
+ )
+}
+/**
+ * 登录页面
+ * @param {*} props
+ * @returns
+ */
+const LayoutSignIn = props => {
+ const enableClerk = process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
+ const title = siteConfig('PROXIO_SIGNIN', '登录')
+ const description = siteConfig(
+ 'PROXIO_SIGNIN_DESCRITION',
+ '这里是演示页面,NotionNext目前不提供会员登录功能'
+ )
+ return (
+ <>
+
+
+ {/* clerk预置表单 */}
+ {enableClerk && (
+
+
+
+ )}
+
+ {/* 自定义登录表单 */}
+ {!enableClerk &&
}
+
+ >
+ )
+}
+
+/**
+ * 注册页面
+ * @param {*} props
+ * @returns
+ */
+const LayoutSignUp = props => {
+ const enableClerk = process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
+
+ const title = siteConfig('PROXIO_SIGNIN', '注册')
+ const description = siteConfig(
+ 'PROXIO_SIGNIN_DESCRITION',
+ '这里是演示页面,NotionNext目前不提供会员注册功能'
+ )
+ return (
+ <>
+
+
+
+ {/* clerk预置表单 */}
+ {enableClerk && (
+
+
+
+ )}
+
+ {/* 自定义登录表单 */}
+ {!enableClerk &&
}
+
+ >
+ )
+}
+
+export {
+ Layout404,
+ LayoutArchive,
+ LayoutBase,
+ LayoutCategoryIndex,
+ LayoutDashboard,
+ LayoutIndex,
+ LayoutPostList,
+ LayoutSearch,
+ LayoutSignIn,
+ LayoutSignUp,
+ LayoutSlug,
+ LayoutTagIndex,
+ CONFIG as THEME_CONFIG
+}
diff --git a/themes/proxio/style.js b/themes/proxio/style.js
new file mode 100644
index 00000000..87ec2d30
--- /dev/null
+++ b/themes/proxio/style.js
@@ -0,0 +1,252 @@
+/* eslint-disable react/no-unknown-property */
+
+/**
+ * 此处样式只对当前主题生效
+ * 此处不支持tailwindCSS的 @apply 语法
+ * @returns
+ */
+const Style = () => {
+ return
+}
+
+export { Style }