mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-14 07:26:52 +00:00
Merge pull request #3338 from tangly1024/feat/theme-proxio
Feat/theme proxio
This commit is contained in:
97
components/CursorDot.js
Normal file
97
components/CursorDot.js
Normal file
@@ -0,0 +1,97 @@
|
||||
import { useEffect } from 'react';
|
||||
|
||||
const CursorDot = () => {
|
||||
useEffect(() => {
|
||||
// 创建小白点元素
|
||||
const dot = document.createElement('div');
|
||||
dot.classList.add('cursor-dot');
|
||||
document.body.appendChild(dot);
|
||||
|
||||
// 鼠标坐标和缓动目标坐标
|
||||
let mouse = { x: -100, y: -100 }; // 初始位置在屏幕外
|
||||
let dotPos = { x: mouse.x, y: mouse.y };
|
||||
|
||||
// 监听鼠标移动
|
||||
const handleMouseMove = (e) => {
|
||||
mouse.x = e.clientX;
|
||||
mouse.y = e.clientY;
|
||||
};
|
||||
document.addEventListener('mousemove', handleMouseMove);
|
||||
|
||||
// 监听鼠标悬停在可点击对象上的事件
|
||||
const handleMouseEnter = () => {
|
||||
dot.classList.add('cursor-dot-hover'); // 添加放大样式
|
||||
};
|
||||
const handleMouseLeave = () => {
|
||||
dot.classList.remove('cursor-dot-hover'); // 移除放大样式
|
||||
};
|
||||
|
||||
|
||||
// 为所有可点击元素和包含 hover 或 group-hover 类名的元素添加事件监听
|
||||
const clickableElements = document.querySelectorAll(
|
||||
'a, button, [role="button"], [onclick], [cursor="pointer"], [class*="hover"], [class*="group-hover"], [class*="cursor-pointer"]'
|
||||
);
|
||||
clickableElements.forEach((el) => {
|
||||
el.addEventListener('mouseenter', handleMouseEnter);
|
||||
el.addEventListener('mouseleave', handleMouseLeave);
|
||||
});
|
||||
|
||||
// 动画循环:延迟更新小白点位置
|
||||
const updateDotPosition = () => {
|
||||
const damping = 0.2; // 阻尼系数,值越小延迟越明显
|
||||
dotPos.x += (mouse.x - dotPos.x) * damping;
|
||||
dotPos.y += (mouse.y - dotPos.y) * damping;
|
||||
|
||||
// 更新DOM
|
||||
dot.style.left = `${dotPos.x}px`;
|
||||
dot.style.top = `${dotPos.y}px`;
|
||||
|
||||
requestAnimationFrame(updateDotPosition);
|
||||
};
|
||||
|
||||
// 启动动画
|
||||
updateDotPosition();
|
||||
|
||||
// 清理函数
|
||||
return () => {
|
||||
document.removeEventListener('mousemove', handleMouseMove);
|
||||
clickableElements.forEach((el) => {
|
||||
el.removeEventListener('mouseenter', handleMouseEnter);
|
||||
el.removeEventListener('mouseleave', handleMouseLeave);
|
||||
});
|
||||
document.body.removeChild(dot);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<style jsx global>{`
|
||||
.cursor-dot {
|
||||
position: fixed;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
background: white;
|
||||
border-radius: 50%;
|
||||
pointer-events: none;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 9999;
|
||||
transition: transform 100ms ease-out, width 200ms ease, height 200ms ease; /* 添加尺寸平滑过渡 */
|
||||
mix-blend-mode: difference; /* 可选:增强对比度 */
|
||||
}
|
||||
|
||||
.cursor-dot-hover {
|
||||
border: 1px solid rgba(167, 167, 167, 0.14); /* 鼠标悬停时的深灰色边框,厚度为1px */
|
||||
width: 60px; /* 放大 */
|
||||
height: 60px; /* 放大 */
|
||||
background: hsla(0, 0%, 100%, 0.04); /* 半透明背景 */
|
||||
-webkit-backdrop-filter: blur(5px); /* 毛玻璃效果 */
|
||||
backdrop-filter: blur(5px);
|
||||
}
|
||||
|
||||
.dark .cursor-dot-hover {
|
||||
border: 1px solid rgba(66, 66, 66, 0.66); /* 鼠标悬停时的深灰色边框,厚度为1px */
|
||||
}
|
||||
`}</style>
|
||||
);
|
||||
};
|
||||
|
||||
export default CursorDot;
|
||||
@@ -12,7 +12,7 @@ export default function IconFont() {
|
||||
useEffect(() => {
|
||||
loadExternalResource('/webfonts/iconfont.js')
|
||||
.then(u => {
|
||||
console.log('iconfont loaded');
|
||||
console.log('iconfont loaded:', u);
|
||||
|
||||
// 查找所有 <i> 标签且 class 包含 'icon-'
|
||||
const iElements = document.querySelectorAll('i[class*="icon-"]');
|
||||
@@ -30,7 +30,7 @@ export default function IconFont() {
|
||||
|
||||
// 替换原来的 <i> 元素
|
||||
element.replaceWith(svgElement);
|
||||
console.log(`Replaced <i> with class "${className}" to <svg>`);
|
||||
// console.log(`Replaced <i> with class "${className}" to <svg>`);
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
69
components/Lenis.js
Normal file
69
components/Lenis.js
Normal file
@@ -0,0 +1,69 @@
|
||||
import { useEffect, useRef } from 'react'
|
||||
import { loadExternalResource } from '@/lib/utils'
|
||||
|
||||
/**
|
||||
* 滚动阻尼特效
|
||||
* 目前只用在proxio主题
|
||||
* @returns
|
||||
*/
|
||||
const Lenis = () => {
|
||||
const lenisRef = useRef(null) // 用于存储 Lenis 实例
|
||||
|
||||
useEffect(() => {
|
||||
// 异步加载
|
||||
async function loadLenis() {
|
||||
loadExternalResource('/js/lenis.js', 'js').then(() => {
|
||||
// console.log('Lenis', window.Lenis)
|
||||
if (!window.Lenis) {
|
||||
console.error('Lenis not loaded')
|
||||
return
|
||||
}
|
||||
const Lenis = window.Lenis
|
||||
|
||||
// 创建 Lenis 实例
|
||||
const lenis = new Lenis({
|
||||
duration: 1.2,
|
||||
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou
|
||||
direction: 'vertical', // vertical, horizontal
|
||||
gestureDirection: 'vertical', // vertical, horizontal, both
|
||||
smooth: true,
|
||||
mouseMultiplier: 1,
|
||||
smoothTouch: false,
|
||||
touchMultiplier: 2,
|
||||
infinite: false,
|
||||
})
|
||||
|
||||
// 存储实例到 ref
|
||||
lenisRef.current = lenis
|
||||
|
||||
// 监听滚动事件
|
||||
// lenis.on('scroll', ({ scroll, limit, velocity, direction, progress }) => {
|
||||
// // console.log({ scroll, limit, velocity, direction, progress })
|
||||
// })
|
||||
|
||||
// 动画帧循环
|
||||
function raf(time) {
|
||||
lenis.raf(time)
|
||||
requestAnimationFrame(raf)
|
||||
}
|
||||
|
||||
requestAnimationFrame(raf)
|
||||
})
|
||||
}
|
||||
|
||||
loadLenis()
|
||||
|
||||
return () => {
|
||||
// 在组件卸载时清理资源
|
||||
if (lenisRef.current) {
|
||||
lenisRef.current.destroy() // 销毁 Lenis 实例
|
||||
lenisRef.current = null
|
||||
// console.log('Lenis instance destroyed')
|
||||
}
|
||||
}
|
||||
}, [])
|
||||
|
||||
return <></>
|
||||
}
|
||||
|
||||
export default Lenis
|
||||
BIN
public/images/themes-preview/proxio.png
Normal file
BIN
public/images/themes-preview/proxio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 198 KiB |
2
public/js/lenis.js
Normal file
2
public/js/lenis.js
Normal file
File diff suppressed because one or more lines are too long
30
themes/proxio/components/Announcement.js
Normal file
30
themes/proxio/components/Announcement.js
Normal file
@@ -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 (
|
||||
<div className={className}>
|
||||
<section
|
||||
id='announcement-wrapper'
|
||||
className='rounded-xl px-2 wow fadeInUp' data-wow-delay='.2s'>
|
||||
{/* <div><i className='mr-2 fas fa-bullhorn' />{locale.COMMON.ANNOUNCEMENT}</div> */}
|
||||
{post && (
|
||||
<div id='announcement-content'>
|
||||
<NotionPage post={post}/>
|
||||
</div>
|
||||
)}
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
} else {
|
||||
return <></>
|
||||
}
|
||||
}
|
||||
export default Announcement
|
||||
53
themes/proxio/components/ArticleLock.js
Normal file
53
themes/proxio/components/ArticleLock.js
Normal file
@@ -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 = `<div class='text-red-500 animate__shakeX animate__animated'>${locale.COMMON.PASSWORD_ERROR}</div>`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const passwordInputRef = useRef(null)
|
||||
useEffect(() => {
|
||||
// 选中密码输入框并将其聚焦
|
||||
passwordInputRef.current.focus()
|
||||
}, [])
|
||||
|
||||
return <div id='container' className='w-full flex justify-center items-center h-96 '>
|
||||
<div className='text-center space-y-3'>
|
||||
<div className='font-bold'>{locale.COMMON.ARTICLE_LOCK_TIPS}</div>
|
||||
<div className='flex'>
|
||||
<input id="password" type='password'
|
||||
onKeyDown={(e) => {
|
||||
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'
|
||||
></input>
|
||||
<div onClick={submitPassword} className="px-3 whitespace-nowrap cursor-pointer items-center justify-center py-2 rounded-r duration-300 bg-gray-300" >
|
||||
<i className={'duration-200 cursor-pointer fas fa-key dark:text-black'} > {locale.COMMON.SUBMIT}</i>
|
||||
</div>
|
||||
</div>
|
||||
<div id='tips'>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
75
themes/proxio/components/BackToTopButton.js
Normal file
75
themes/proxio/components/BackToTopButton.js
Normal file
@@ -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 (
|
||||
<>
|
||||
{/* <!-- ====== Back To Top Start --> */}
|
||||
<a
|
||||
onClick={scrollTop}
|
||||
className='back-to-top cursor-pointer fixed bottom-16 left-auto right-8 z-[999] hidden h-10 w-10 items-center justify-center rounded-md bg-primary text-white shadow-md transition duration-300 ease-in-out hover:bg-dark'>
|
||||
<span className='mt-[6px] h-3 w-3 rotate-45 border-l border-t border-white'></span>
|
||||
</a>
|
||||
{/* <!-- ====== Back To Top End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
49
themes/proxio/components/Banner.js
Normal file
49
themes/proxio/components/Banner.js
Normal file
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* 页面顶部宣传栏
|
||||
* @returns
|
||||
*/
|
||||
export const Banner = ({ title, description }) => {
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== Banner Section Start --> */}
|
||||
<div className='relative z-10 overflow-hidden pb-[60px] pt-[120px] dark:bg-dark md:pt-[130px] lg:pt-[160px]'>
|
||||
<div className='absolute bottom-0 left-0 w-full h-px bg-gradient-to-r from-stroke/0 via-stroke to-stroke/0 dark:via-dark-3'></div>
|
||||
<div className='container'>
|
||||
<div className='flex flex-wrap items-center -mx-4'>
|
||||
<div className='w-full px-4'>
|
||||
<div className='text-center'>
|
||||
<h1 className='mb-4 text-3xl font-bold text-dark dark:text-white sm:text-4xl md:text-[40px] md:leading-[1.2]'>
|
||||
{title}
|
||||
</h1>
|
||||
<p className='mb-5 text-base text-body-color dark:text-dark-6'>
|
||||
{description}
|
||||
</p>
|
||||
|
||||
{/* <ul className="flex items-center justify-center gap-[10px]">
|
||||
<li>
|
||||
<a
|
||||
href="index.html"
|
||||
className="flex items-center gap-[10px] text-base font-medium text-dark dark:text-white"
|
||||
>
|
||||
Home
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="#"
|
||||
className="flex items-center gap-[10px] text-base font-medium text-body-color"
|
||||
>
|
||||
<span className="text-body-color dark:text-dark-6"> / </span>
|
||||
Blog Details
|
||||
</a>
|
||||
</li>
|
||||
</ul> */}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* <!-- ====== Banner Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
82
themes/proxio/components/Blog.js
Normal file
82
themes/proxio/components/Blog.js
Normal file
@@ -0,0 +1,82 @@
|
||||
/* 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 (
|
||||
<>
|
||||
{/* <!-- ====== Blog Section Start --> */}
|
||||
<section className='bg-white pt-20 dark:bg-dark lg:pt-[120px]'>
|
||||
<div className='container mx-auto'>
|
||||
{/* 区块标题文字 */}
|
||||
<div className='-mx-4 flex flex-wrap justify-center wow fadeInUp' data-wow-delay='.2s'>
|
||||
<div className='w-full px-4 py-4'>
|
||||
<div className='mx-auto max-w-[485px] text-center space-y-4'>
|
||||
<span className='px-3 py-0.5 rounded-2xl mb-2 dark:bg-dark-1 border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
{siteConfig('PROXIO_BLOG_TITLE')}
|
||||
</span>
|
||||
|
||||
<h2 className='text-3xl font-bold text-dark dark:text-white sm:text-4xl md:text-[40px] md:leading-[1.2]'>
|
||||
{siteConfig('PROXIO_BLOG_TEXT_1')}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* 博客列表 此处优先展示3片文章 */}
|
||||
<div className='-mx-4 grid md:grid-cols-2 grid-cols-1'>
|
||||
{posts?.map((item, index) => {
|
||||
return (
|
||||
<div key={index} className='w-full px-4'>
|
||||
<div
|
||||
className='wow fadeInUp group mb-10 relative overflow-hidden blog'
|
||||
data-wow-delay='.1s'>
|
||||
<div className='relative rounded-xl border overflow-hidden shadow-md dark:border-gray-700 dark:bg-gray-800'>
|
||||
{item.pageCoverThumbnail && (
|
||||
<Link href={item?.href} className='block'>
|
||||
{/* 图片半透明 */}
|
||||
<LazyImage
|
||||
src={item.pageCoverThumbnail}
|
||||
alt={item.title}
|
||||
className='w-full h-80 object-cover transition-transform duration-500 rounded-xl'
|
||||
/>
|
||||
</Link>
|
||||
)}
|
||||
{/* 遮罩层,仅覆盖图片部分 */}
|
||||
<div className='absolute inset-0 bg-gray-100 dark:bg-hexo-black-gray transition-all duration-500 group-hover:opacity-50 group-hover:bg-black' />
|
||||
{/* 鼠标悬停时显示的文字内容 */}
|
||||
<div className='absolute inset-0 flex items-center justify-center group-hover:scale-110 duration-200 group-hover:text-white'>
|
||||
<p className='max-w-[370px] text-base text-body-color dark:text-dark-6 flex items-center justify-center duration-200 group-hover:text-white '>
|
||||
{item.summary}
|
||||
</p></div>
|
||||
</div>
|
||||
{/* 内容部分 */}
|
||||
<div className='relative z-10 p-4'>
|
||||
<span className='inline-blocktext-center text-xs font-medium leading-loose text-white'>
|
||||
{item.publishDay}
|
||||
</span>
|
||||
<h3>
|
||||
<Link
|
||||
href={item?.href}
|
||||
className='mb-4 inline-block text-xl font-semibold text-dark hover:text-primary dark:text-white dark:hover:text-primary sm:text-2xl lg:text-xl xl:text-2xl'>
|
||||
{item.title}
|
||||
</Link>
|
||||
</h3>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Blog Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
71
themes/proxio/components/Brand.js
Normal file
71
themes/proxio/components/Brand.js
Normal file
@@ -0,0 +1,71 @@
|
||||
/* eslint-disable @next/next/no-img-element */
|
||||
|
||||
import { siteConfig } from '@/lib/config'
|
||||
import { useEffect, useRef } from 'react'
|
||||
|
||||
/**
|
||||
* 合作伙伴滚动组件
|
||||
* @returns
|
||||
*/
|
||||
export const Brand = () => {
|
||||
const brands = siteConfig('PROXIO_BRANDS', [])
|
||||
|
||||
const scrollContainerRef = useRef(null)
|
||||
|
||||
useEffect(() => {
|
||||
const scrollContainer = scrollContainerRef.current
|
||||
|
||||
let scrollAmount = 0
|
||||
const scrollSpeed = 1 // 滚动速度
|
||||
|
||||
const scroll = () => {
|
||||
if (scrollContainer) {
|
||||
scrollAmount += scrollSpeed
|
||||
scrollContainer.scrollLeft = scrollAmount
|
||||
|
||||
// 如果滚动到内容的一半,立即重置滚动位置
|
||||
if (scrollAmount >= scrollContainer.scrollWidth / 2) {
|
||||
scrollAmount = 0
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(scroll)
|
||||
}
|
||||
|
||||
scroll()
|
||||
|
||||
return () => cancelAnimationFrame(scroll)
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== Brands Section Start --> */}
|
||||
<section id='brand' className='py-12 dark:bg-dark'>
|
||||
<div
|
||||
className='overflow-hidden whitespace-nowrap container mx-auto p-3 border rounded-2xl border-gray-200 dark:border-[#333333]'
|
||||
ref={scrollContainerRef}
|
||||
>
|
||||
<div className='inline-block'>
|
||||
{brands?.map((item, index) => (
|
||||
<span
|
||||
key={index}
|
||||
className='mx-8 text-lg font-semibold text-gray-700 dark:text-gray-300'
|
||||
>
|
||||
{item}
|
||||
</span>
|
||||
))}
|
||||
{/* 克隆一份内容,用于无缝滚动 */}
|
||||
{brands.map((item, index) => (
|
||||
<span
|
||||
key={`clone-${index}`}
|
||||
className='mx-8 text-lg font-semibold text-gray-700 dark:text-gray-300'
|
||||
>
|
||||
{item}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Brands Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
56
themes/proxio/components/CTA.js
Normal file
56
themes/proxio/components/CTA.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import { siteConfig } from '@/lib/config'
|
||||
import Link from 'next/link'
|
||||
|
||||
/**
|
||||
* CTA,用于创建一个呼吁用户行动的部分(Call To Action,简称 CTA)。
|
||||
* 该组件通过以下方式激励用户进行特定操作
|
||||
* 用户的公告栏内容将在此显示
|
||||
**/
|
||||
export const CTA = () => {
|
||||
const enable = siteConfig('PROXIO_CTA_ENABLE')
|
||||
if (!enable) {
|
||||
return null
|
||||
}
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== CTA Section Start --> */}
|
||||
<section className='relative z-10 overflow-hidden bg-gray-1 dark:bg-black py-20 lg:py-[115px]'>
|
||||
<div className='container mx-auto'>
|
||||
<div className='relative overflow-hidden'>
|
||||
<div className='-mx-4 flex flex-wrap items-stretch'>
|
||||
<div className='w-full px-4 mb-2'>
|
||||
<div className='mx-auto max-w-[570px] text-center wow fadeInUp' data-wow-delay='.2s'>
|
||||
<div>
|
||||
<span className='px-3 py-0.5 rounded-2xl dark:bg-dark-1 border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
{siteConfig('PROXIO_CTA_TITLE')}
|
||||
</span>
|
||||
</div>
|
||||
<h2 className='mb-2.5 text-3xl font-bold dark:text-white md:text-[38px] md:leading-[1.44]'>
|
||||
|
||||
<span className='text-3xl font-normal md:text-[40px]'>
|
||||
{siteConfig('PROXIO_CTA_TITLE_2')}
|
||||
</span>
|
||||
</h2>
|
||||
<p className='mx-auto mb-6 max-w-[515px] text-base leading-[1.5] dark:text-white'>
|
||||
{siteConfig('PROXIO_CTA_DESCRIPTION')}
|
||||
</p>
|
||||
{siteConfig('PROXIO_CTA_BUTTON') && (
|
||||
<>
|
||||
<Link
|
||||
href={siteConfig('PROXIO_CTA_BUTTON_URL', '')}
|
||||
className='inline-flex items-center justify-center rounded-2xl bg-white px-7 py-[14px] text-center text-base font-medium text-dark shadow-1 transition duration-300 ease-in-out hover:bg-gray-2'>
|
||||
{siteConfig('PROXIO_CTA_BUTTON_TEXT')}
|
||||
</Link>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
{/* <!-- ====== CTA Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
62
themes/proxio/components/Career.js
Normal file
62
themes/proxio/components/Career.js
Normal file
@@ -0,0 +1,62 @@
|
||||
/* 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 Career = () => {
|
||||
const Careers = siteConfig('PROXIO_CAREERS')
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== About Section Start --> */}
|
||||
<section
|
||||
id='about'
|
||||
className='bg-gray-1 pb-8 pt-20 dark:bg-black lg:pb-[70px] lg:pt-[120px]'>
|
||||
<div className='container'>
|
||||
<div className='wow fadeInUp' data-wow-delay='.2s'>
|
||||
{/* 左侧的文字说明板块 */}
|
||||
<div className='w-full px-4 lg:w-1/2'>
|
||||
<div className='mb-12 max-w-[540px] lg:mb-0'>
|
||||
<span className='px-3 py-0.5 rounded-2xl dark:bg-dark-1 border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
{siteConfig('PROXIO_CAREER_TITLE')}
|
||||
</span>
|
||||
<h2
|
||||
className='mb-10 text-3xl font-semibold leading-relaxed dark:text-dark-6'
|
||||
>{siteConfig('PROXIO_CAREER_TEXT')}</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='-mx-4 flex flex-wrap items-center px-4'>
|
||||
{Careers?.map((item, index) => {
|
||||
return <CareerItem key={index} {...item} />
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== About Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
// 生涯内容
|
||||
const CareerItem = ({ title, bio, text }) => {
|
||||
return <div className='w-full border-b mb-6 border-gray-200 dark:border-[#333333] px-4 flex justify-between wow fadeInUp'>
|
||||
<div className='flex item-start flex-col items-start w-full' data-wow-delay='.1s'>
|
||||
<h4 className='mb-3 text-xl text-dark dark:text-white'>
|
||||
<span className='font-bold mr-4'>{title}</span>
|
||||
<span className='text-sm'>{bio}</span>
|
||||
</h4>
|
||||
|
||||
</div>
|
||||
<div className='w-full'>
|
||||
<p className='mb-8 text-body-color dark:text-dark-6 lg:mb-9'>
|
||||
{text}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
}
|
||||
84
themes/proxio/components/DarkModeButton.js
Normal file
84
themes/proxio/components/DarkModeButton.js
Normal file
@@ -0,0 +1,84 @@
|
||||
import { useGlobal } from '@/lib/global';
|
||||
import { useRouter } from 'next/router';
|
||||
|
||||
export const DarkModeButton = () => {
|
||||
const { toggleDarkMode } = useGlobal()
|
||||
const router = useRouter()
|
||||
return <>
|
||||
<label
|
||||
// for="themeSwitcher"
|
||||
className="inline-flex cursor-pointer items-center"
|
||||
aria-label="themeSwitcher"
|
||||
name="themeSwitcher"
|
||||
>
|
||||
<input
|
||||
onClick={toggleDarkMode}
|
||||
type="checkbox"
|
||||
name="themeSwitcher"
|
||||
id="themeSwitcher"
|
||||
className="sr-only"
|
||||
/>
|
||||
|
||||
<span className={`block ${router.route === '/' ? 'text-white' : ''} dark:hidden`}>
|
||||
<svg
|
||||
className="fill-current"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M13.3125 1.50001C12.675 1.31251 12.0375 1.16251 11.3625 1.05001C10.875 0.975006 10.35 1.23751 10.1625 1.68751C9.93751 2.13751 10.05 2.70001 10.425 3.00001C13.0875 5.47501 14.0625 9.11251 12.975 12.525C11.775 16.3125 8.25001 18.975 4.16251 19.0875C3.63751 19.0875 3.22501 19.425 3.07501 19.9125C2.92501 20.4 3.15001 20.925 3.56251 21.1875C4.50001 21.75 5.43751 22.2 6.37501 22.5C7.46251 22.8375 8.58751 22.9875 9.71251 22.9875C11.625 22.9875 13.5 22.5 15.1875 21.5625C17.85 20.1 19.725 17.7375 20.55 14.8875C22.1625 9.26251 18.975 3.37501 13.3125 1.50001ZM18.9375 14.4C18.2625 16.8375 16.6125 18.825 14.4 20.0625C12.075 21.3375 9.41251 21.6 6.90001 20.85C6.63751 20.775 6.33751 20.6625 6.07501 20.55C10.05 19.7625 13.35 16.9125 14.5875 13.0125C15.675 9.56251 15 5.92501 12.7875 3.07501C17.5875 4.68751 20.2875 9.67501 18.9375 14.4Z"
|
||||
/>
|
||||
</svg>
|
||||
</span>
|
||||
|
||||
<span className="hidden text-white dark:block">
|
||||
<svg
|
||||
className="fill-current"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<g clipPath="url(#clip0_2172_3070)">
|
||||
<path
|
||||
d="M12 6.89999C9.18752 6.89999 6.90002 9.18749 6.90002 12C6.90002 14.8125 9.18752 17.1 12 17.1C14.8125 17.1 17.1 14.8125 17.1 12C17.1 9.18749 14.8125 6.89999 12 6.89999ZM12 15.4125C10.125 15.4125 8.58752 13.875 8.58752 12C8.58752 10.125 10.125 8.58749 12 8.58749C13.875 8.58749 15.4125 10.125 15.4125 12C15.4125 13.875 13.875 15.4125 12 15.4125Z"
|
||||
/>
|
||||
<path
|
||||
d="M12 4.2375C12.45 4.2375 12.8625 3.8625 12.8625 3.375V1.5C12.8625 1.05 12.4875 0.637497 12 0.637497C11.55 0.637497 11.1375 1.0125 11.1375 1.5V3.4125C11.175 3.8625 11.55 4.2375 12 4.2375Z"
|
||||
/>
|
||||
<path
|
||||
d="M12 19.7625C11.55 19.7625 11.1375 20.1375 11.1375 20.625V22.5C11.1375 22.95 11.5125 23.3625 12 23.3625C12.45 23.3625 12.8625 22.9875 12.8625 22.5V20.5875C12.8625 20.1375 12.45 19.7625 12 19.7625Z"
|
||||
/>
|
||||
<path
|
||||
d="M18.1125 6.74999C18.3375 6.74999 18.5625 6.67499 18.7125 6.48749L19.9125 5.28749C20.25 4.94999 20.25 4.42499 19.9125 4.08749C19.575 3.74999 19.05 3.74999 18.7125 4.08749L17.5125 5.28749C17.175 5.62499 17.175 6.14999 17.5125 6.48749C17.6625 6.67499 17.8875 6.74999 18.1125 6.74999Z"
|
||||
/>
|
||||
<path
|
||||
d="M5.32501 17.5125L4.12501 18.675C3.78751 19.0125 3.78751 19.5375 4.12501 19.875C4.27501 20.025 4.50001 20.1375 4.72501 20.1375C4.95001 20.1375 5.17501 20.0625 5.32501 19.875L6.52501 18.675C6.86251 18.3375 6.86251 17.8125 6.52501 17.475C6.18751 17.175 5.62501 17.175 5.32501 17.5125Z"
|
||||
/>
|
||||
<path
|
||||
d="M22.5 11.175H20.5875C20.1375 11.175 19.725 11.55 19.725 12.0375C19.725 12.4875 20.1 12.9 20.5875 12.9H22.5C22.95 12.9 23.3625 12.525 23.3625 12.0375C23.3625 11.55 22.95 11.175 22.5 11.175Z"
|
||||
/>
|
||||
<path
|
||||
d="M4.23751 12C4.23751 11.55 3.86251 11.1375 3.37501 11.1375H1.50001C1.05001 11.1375 0.637512 11.5125 0.637512 12C0.637512 12.45 1.01251 12.8625 1.50001 12.8625H3.41251C3.86251 12.8625 4.23751 12.45 4.23751 12Z"
|
||||
/>
|
||||
<path
|
||||
d="M18.675 17.5125C18.3375 17.175 17.8125 17.175 17.475 17.5125C17.1375 17.85 17.1375 18.375 17.475 18.7125L18.675 19.9125C18.825 20.0625 19.05 20.175 19.275 20.175C19.5 20.175 19.725 20.1 19.875 19.9125C20.2125 19.575 20.2125 19.05 19.875 18.7125L18.675 17.5125Z"
|
||||
/>
|
||||
<path
|
||||
d="M5.32501 4.125C4.98751 3.7875 4.46251 3.7875 4.12501 4.125C3.78751 4.4625 3.78751 4.9875 4.12501 5.325L5.32501 6.525C5.47501 6.675 5.70001 6.7875 5.92501 6.7875C6.15001 6.7875 6.37501 6.7125 6.52501 6.525C6.86251 6.1875 6.86251 5.6625 6.52501 5.325L5.32501 4.125Z"
|
||||
/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_2172_3070">
|
||||
<rect width="24" height="24" fill="white" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
</span>
|
||||
</label>
|
||||
</>
|
||||
}
|
||||
85
themes/proxio/components/FAQ.js
Normal file
85
themes/proxio/components/FAQ.js
Normal file
@@ -0,0 +1,85 @@
|
||||
import { siteConfig } from '@/lib/config'
|
||||
import { useState } from 'react'
|
||||
import { SVGCircleBG } from './svg/SVGCircleBG'
|
||||
|
||||
/**
|
||||
* 问答
|
||||
* @returns
|
||||
*/
|
||||
export const FAQ = () => {
|
||||
const FAQS = siteConfig('PROXIO_FAQS', [])
|
||||
|
||||
const [openIndex, setOpenIndex] = useState(null)
|
||||
|
||||
const toggleFAQ = (index) => {
|
||||
setOpenIndex(openIndex === index ? null : index)
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== FAQ Section Start --> */}
|
||||
<section className="relative overflow-hidden bg-white pb-8 pt-20 dark:bg-dark lg:pb-[50px] lg:pt-[120px]">
|
||||
<div className='max-w-2xl mx-auto wow fadeInUp' data-wow-delay='.2s'>
|
||||
<div className="-mx-4 flex flex-wrap">
|
||||
<div className="w-full px-4">
|
||||
<div className="mx-auto mb-[60px] max-w-[520px] text-center flex flex-col space-y-4">
|
||||
<div>
|
||||
<span className='px-3 py-0.5 rounded-2xl dark:bg-dark-1 border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
{siteConfig('PROXIO_FAQ_TITLE')}
|
||||
</span>
|
||||
</div>
|
||||
<h2 className="mb-3 text-3xl font-bold leading-[1.2] text-dark dark:text-white sm:text-4xl md:text-[40px]">
|
||||
{siteConfig('PROXIO_FAQ_TEXT_1')}
|
||||
</h2>
|
||||
<p className="mx-auto max-w-[485px] text-base text-body-color dark:text-dark-6">
|
||||
{siteConfig('PROXIO_FAQ_TEXT_2')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* FAQ 列表 */}
|
||||
<div className='-mx-4 flex flex-wrap space-y-4 wow fadeInUp' data-wow-delay='.2s'>
|
||||
{FAQS?.map((faq, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className="w-full px-4 cursor-pointer"
|
||||
onClick={() => toggleFAQ(index)}
|
||||
>
|
||||
<div className="p-4 border rounded-lg dark:bg-[#0E0E0E] bg-white dark:bg-dark-1 border-gray-200 dark:border-[#333333]">
|
||||
{/* 问题部分 */}
|
||||
<div className="flex justify-between items-center">
|
||||
<h3 className="text-lg font-semibold text-dark dark:text-white">
|
||||
{faq.q}
|
||||
</h3>
|
||||
<i
|
||||
className={`fas fa-chevron-down text-gray-500 dark:text-gray-300 transition-transform duration-300 ${openIndex === index ? 'rotate-180' : ''
|
||||
}`}
|
||||
/>
|
||||
</div>
|
||||
{/* 答案部分 */}
|
||||
<div
|
||||
className={`mt-4 text-base text-body-color dark:text-dark-6 transition-all duration-300 overflow-hidden ${openIndex === index ? 'max-h-screen' : 'max-h-0'
|
||||
}`}
|
||||
dangerouslySetInnerHTML={{ __html: faq.a }}
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 背景图案 */}
|
||||
<div>
|
||||
<span className="absolute left-4 top-4 -z-[1]">
|
||||
<SVGCircleBG />
|
||||
</span>
|
||||
<span className="absolute bottom-4 right-4 -z-[1]">
|
||||
<SVGCircleBG />
|
||||
</span>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== FAQ Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
99
themes/proxio/components/Features.js
Normal file
99
themes/proxio/components/Features.js
Normal file
@@ -0,0 +1,99 @@
|
||||
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 (
|
||||
<>
|
||||
{/* <!-- ====== Features Section Start --> */}
|
||||
<section className='pb-8 pt-20 dark:bg-dark lg:pb-[40px] lg:pt-[120px]'>
|
||||
<div className='container'>
|
||||
|
||||
<div className='-mx-4 flex flex-wrap wow fadeInUp' data-wow-delay='.2s'>
|
||||
<div className='w-full px-4'>
|
||||
<div className='mx-auto mb-12 lg:mb-[40px]'>
|
||||
<span className='px-3 py-0.5 rounded-2xl dark:bg-dark-1 border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
{siteConfig('PROXIO_FEATURE_TITLE')}
|
||||
</span>
|
||||
<h2 className='my-5 text-3xl font-bold text-dark dark:text-white sm:text-4xl md:text-[40px] md:leading-[1.2]'>
|
||||
{siteConfig('PROXIO_FEATURE_TEXT_1')}
|
||||
</h2>
|
||||
<p className='text-base text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_FEATURE_TEXT_2')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* 支持三个特性 */}
|
||||
<div className='-mx-4 flex flex-col md:flex-row gap-4 px-4'>
|
||||
|
||||
<div className='w-full p-6 rounded-xl border border-gray-200 dark:border-[#333333]'>
|
||||
<div className='wow fadeInUp group flex-col space-y-2 flex' data-wow-delay='.1s'>
|
||||
<div className='flex w-12 h-12'>
|
||||
<div className='w-full flex justify-center items-center rounded-xl border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
<i class={siteConfig('PROXIO_FEATURE_1_ICON_CLASS')}></i>
|
||||
</div>
|
||||
</div>
|
||||
<h4 className='mb-3 text-xl font-bold text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_FEATURE_1_TITLE_1')}
|
||||
</h4>
|
||||
<p className='mb-8 text-body-color dark:text-dark-6 lg:mb-9'>
|
||||
{siteConfig('PROXIO_FEATURE_1_TEXT_1')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='w-full p-6 rounded-xl border border-gray-200 dark:border-[#333333]'>
|
||||
<div className='wow fadeInUp group flex-col space-y-2 flex' data-wow-delay='.1s'>
|
||||
<div className='flex w-12 h-12'>
|
||||
<div className='w-full flex justify-center items-center rounded-xl border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
<i class={siteConfig('PROXIO_FEATURE_2_ICON_CLASS')}></i>
|
||||
</div>
|
||||
</div>
|
||||
<h4 className='mb-3 text-xl font-bold text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_FEATURE_2_TITLE_1')}
|
||||
</h4>
|
||||
<p className='mb-8 text-body-color dark:text-dark-6 lg:mb-9'>
|
||||
{siteConfig('PROXIO_FEATURE_2_TEXT_1')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='w-full p-6 rounded-xl border border-gray-200 dark:border-[#333333]'>
|
||||
<div className='wow fadeInUp group flex-col space-y-2 flex' data-wow-delay='.1s'>
|
||||
<div className='flex w-12 h-12'>
|
||||
<div className='w-full flex justify-center items-center rounded-xl border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
<i class={siteConfig('PROXIO_FEATURE_3_ICON_CLASS')}></i>
|
||||
</div>
|
||||
</div>
|
||||
<h4 className='mb-3 text-xl font-bold text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_FEATURE_3_TITLE_1')}
|
||||
</h4>
|
||||
<p className='mb-8 text-body-color dark:text-dark-6 lg:mb-9'>
|
||||
{siteConfig('PROXIO_FEATURE_3_TEXT_1')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div className='mt-8 w-full flex justify-center items-center'>
|
||||
<Link
|
||||
href={siteConfig('PROXIO_FEATURE_BUTTON_URL', '')}
|
||||
className='px-4 py-2 rounded-3xl border dark:border-gray-200 border-[#333333] text-base font-medium text-dark hover:bg-gray-100 dark:text-white dark:hover:bg-white dark:hover:text-black duration-200'>
|
||||
{siteConfig('PROXIO_FEATURE_BUTTON_TEXT')}
|
||||
<i className="pl-4 fa-solid fa-arrow-right"></i>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Features Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
96
themes/proxio/components/Footer.js
Normal file
96
themes/proxio/components/Footer.js
Normal file
@@ -0,0 +1,96 @@
|
||||
import AnalyticsBusuanzi from '@/components/AnalyticsBusuanzi'
|
||||
import { BeiAnGongAn } from '@/components/BeiAnGongAn'
|
||||
import BeiAnSite from '@/components/BeiAnSite'
|
||||
import CopyRightDate from '@/components/CopyRightDate'
|
||||
import DarkModeButton from '@/components/DarkModeButton'
|
||||
import LazyImage from '@/components/LazyImage'
|
||||
import PoweredBy from '@/components/PoweredBy'
|
||||
import { siteConfig } from '@/lib/config'
|
||||
import { useGlobal } from '@/lib/global'
|
||||
import Link from 'next/link'
|
||||
import CONFIG from '../config'
|
||||
import SocialButton from './SocialButton'
|
||||
|
||||
/**
|
||||
* 网页底脚
|
||||
*/
|
||||
export const Footer = ({ title }) => {
|
||||
const { siteInfo } = useGlobal()
|
||||
const PROXIO_FOOTER_LINKS = siteConfig('PROXIO_FOOTER_LINKS', [], CONFIG)
|
||||
|
||||
return (
|
||||
<footer
|
||||
id='footer-bottom'
|
||||
className='z-10 justify-center m-auto w-full p-6 relative container'>
|
||||
<div className='max-w-screen-3xl w-full mx-auto '>
|
||||
{/* 信息与链接区块 */}
|
||||
<div className='w-full flex lg:flex-row flex-col justify-between py-16'>
|
||||
<div className='gap-y-2 flex flex-col items-start dark:text-gray-200'>
|
||||
<div className='flex gap-x-1'>
|
||||
<LazyImage
|
||||
src={siteInfo?.icon}
|
||||
className='rounded-full'
|
||||
width={24}
|
||||
alt={siteConfig('AUTHOR')}
|
||||
/>
|
||||
<h1 className='text-lg'>{title}</h1>
|
||||
<span
|
||||
className='underline font-bold justify-start'>
|
||||
{siteConfig('AUTHOR')}
|
||||
</span>
|
||||
</div>
|
||||
<div className='px-1'>{siteConfig('DESCRIPTION')}</div>
|
||||
<div className='px-1'>{siteConfig('CONTACT_EMAIL')}</div>
|
||||
</div>
|
||||
|
||||
{/* 右侧链接区块 */}
|
||||
<div className='flex gap-x-4'>
|
||||
{PROXIO_FOOTER_LINKS?.map((group, index) => {
|
||||
return (
|
||||
<div key={index}>
|
||||
<div className='font-bold text-xl dark:text-white lg:pb-8 pb-4'>
|
||||
{group.name}
|
||||
</div>
|
||||
<div className='flex flex-col gap-y-2'>
|
||||
{group?.menus?.map((menu, index) => {
|
||||
return (
|
||||
<div key={index}>
|
||||
<Link href={menu.href} className='hover:underline dark:text-gray-200'>
|
||||
{menu.title}
|
||||
</Link>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 页脚 */}
|
||||
<div className='dark:text-gray-200 py-4 flex flex-col lg:flex-row justify-between items-center border-t border-gray-600'>
|
||||
<div className='flex gap-x-2 flex-wrap justify-between items-center'>
|
||||
<CopyRightDate />
|
||||
<PoweredBy />
|
||||
</div>
|
||||
|
||||
<DarkModeButton className='text-white' />
|
||||
|
||||
<div className='flex justify-between items-center gap-x-2'>
|
||||
<div className='flex items-center gap-x-4'>
|
||||
<AnalyticsBusuanzi />
|
||||
<SocialButton />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 备案 */}
|
||||
<div className='dark:text-gray-200 w-full text-center flex flex-wrap items-center justify-center gap-x-2'>
|
||||
<BeiAnSite />
|
||||
<BeiAnGongAn />
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
)
|
||||
}
|
||||
71
themes/proxio/components/Header.js
Normal file
71
themes/proxio/components/Header.js
Normal file
@@ -0,0 +1,71 @@
|
||||
/* 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' : ''
|
||||
)
|
||||
|
||||
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 (
|
||||
<>
|
||||
{/* <!-- ====== Navbar Section Start --> */}
|
||||
<div className='ud-header absolute left-0 top-0 z-40 flex w-full items-center bg-transparent'>
|
||||
<div className='container'>
|
||||
<div className='relative -mx-4 flex items-center justify-between'>
|
||||
{/* Logo */}
|
||||
<Logo {...props} />
|
||||
{/* 右侧菜单 */}
|
||||
<div className='flex items-center gap-4 justify-end pr-16 lg:pr-0'>
|
||||
<MenuList {...props} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* <!-- ====== Navbar Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
72
themes/proxio/components/Hero.js
Normal file
72
themes/proxio/components/Hero.js
Normal file
@@ -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 (
|
||||
<>
|
||||
{/* <!-- ====== Hero Section Start --> */}
|
||||
<div
|
||||
id='home'
|
||||
className='h-screen relative overflow-hidden bg-primary '>
|
||||
{/* 横幅图片 */}
|
||||
{!bannerIframe && bannerImage && (
|
||||
<LazyImage
|
||||
priority
|
||||
className='w-full object-cover absolute h-screen left-0 top-0 pointer-events-none'
|
||||
src={bannerImage} />
|
||||
)}
|
||||
<iframe src={bannerIframe} className='w-full absolute h-screen left-0 top-0 pointer-events-none' />
|
||||
{/* 阴影遮罩 */}
|
||||
<div className='h-1/3 w-full absolute left-0 bottom-0 z-10'>
|
||||
<div className='h-full w-full absolute group-hover:opacity-100 transition-all duration-1000
|
||||
bg-gradient-to-b from-transparent to-white dark:to-black'/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{/* 文字标题等 */}
|
||||
<div className='w-full pb-15 dark:text-white'>
|
||||
<div className='container -mx-4 flex flex-wrap items-center'>
|
||||
<div className='w-full px-4'>
|
||||
<div
|
||||
className='hero-content wow fadeInUp mx-auto max-w-[780px] text-center'
|
||||
data-wow-delay='0.5s'>
|
||||
{/* 主标题 */}
|
||||
<h1 className='mb-6 text-3xl font-bold leading-snug sm:text-4xl sm:leading-snug lg:text-5xl lg:leading-[1.2]'>
|
||||
{siteConfig('PROXIO_HERO_TITLE_1', null, config)}
|
||||
</h1>
|
||||
{/* 次标题 */}
|
||||
<p className='mx-auto mb-9 max-w-[600px] text-base font-medium sm:text-lg sm:leading-[1.44]'>
|
||||
{siteConfig('PROXIO_HERO_TITLE_2', null, config)}
|
||||
</p>
|
||||
{/* 按钮组 */}
|
||||
<ul className='mb-10 flex flex-wrap items-center justify-center gap-5'>
|
||||
{siteConfig('PROXIO_HERO_BUTTON_1_TEXT', null, config) && (
|
||||
<li>
|
||||
<Link
|
||||
href={siteConfig('PROXIO_HERO_BUTTON_1_URL', '')}
|
||||
className='inline-flex items-center justify-center rounded-2xl bg-white px-7 py-[14px] text-center text-base font-medium text-dark shadow-1 transition duration-300 ease-in-out hover:bg-gray-2'>
|
||||
{siteConfig('PROXIO_HERO_BUTTON_1_TEXT', null, config)}
|
||||
</Link>
|
||||
</li>
|
||||
)}
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{/* <!-- ====== Hero Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
168
themes/proxio/components/LoadingCover.js
Normal file
168
themes/proxio/components/LoadingCover.js
Normal file
@@ -0,0 +1,168 @@
|
||||
import { siteConfig } from '@/lib/config';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
const LoadingCover = ({ onFinishLoading }) => {
|
||||
const [isVisible, setIsVisible] = useState(true);
|
||||
const welcomeText = siteConfig('PROXIO_WELCOME_TEXT', '欢迎来到我们的网站!');
|
||||
|
||||
// 定义颜色变量
|
||||
const colors = {
|
||||
backgroundStart: '#1a1a1a', // 深灰色
|
||||
backgroundMiddle: '#4d4d4d', // 中灰色
|
||||
backgroundEnd: '#e6e6e6', // 浅灰色
|
||||
textColor: '#ffffff', // 白色
|
||||
rippleColor: 'rgba(255, 255, 255, 0.6)', // 半透明白色
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const pageContainer = document.getElementById('pageContainer');
|
||||
|
||||
const handleClick = (e) => {
|
||||
// 创建扩散光圈
|
||||
const ripple = document.createElement('div');
|
||||
ripple.classList.add('ripple');
|
||||
ripple.style.left = `${e.clientX - 10}px`;
|
||||
ripple.style.top = `${e.clientY - 10}px`;
|
||||
document.body.appendChild(ripple);
|
||||
|
||||
// 添加页面缩放 + 模糊动画
|
||||
pageContainer.classList.add('page-clicked');
|
||||
|
||||
// 模拟加载完成,调用回调函数
|
||||
setTimeout(() => {
|
||||
setIsVisible(false); // 淡出动画
|
||||
setTimeout(() => {
|
||||
if (onFinishLoading) {
|
||||
onFinishLoading();
|
||||
}
|
||||
}, 600); // 等待淡出动画完成
|
||||
}, 1200);
|
||||
|
||||
// 清理 ripple 元素
|
||||
setTimeout(() => {
|
||||
ripple.remove();
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
document.body.addEventListener('click', handleClick);
|
||||
|
||||
return () => {
|
||||
document.body.removeEventListener('click', handleClick);
|
||||
};
|
||||
}, [onFinishLoading]);
|
||||
|
||||
if (!isVisible) return null;
|
||||
|
||||
return (
|
||||
<div className="welcome" id="pageContainer">
|
||||
<div className="welcome-text" id="welcomeText">
|
||||
{welcomeText}
|
||||
</div>
|
||||
<style jsx>
|
||||
{`
|
||||
body {
|
||||
margin: 0;
|
||||
background-color: ${colors.backgroundStart};
|
||||
height: 100vh;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.welcome {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 9999;
|
||||
pointer-events: auto;
|
||||
background: linear-gradient(120deg, ${colors.backgroundStart}, ${colors.backgroundMiddle}, ${colors.backgroundEnd});
|
||||
background-size: 300% 300%;
|
||||
animation: gradientShift 6s ease infinite;
|
||||
transition: opacity 0.6s ease; /* 淡出动画 */
|
||||
}
|
||||
|
||||
.welcome.page-clicked {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.welcome-text {
|
||||
font-size: 2.5rem;
|
||||
font-weight: bold;
|
||||
color: ${colors.textColor};
|
||||
text-shadow: 0 0 15px rgba(255, 255, 255, 0.9), 0 0 30px rgba(255, 255, 255, 0.6);
|
||||
user-select: none;
|
||||
animation: textPulse 3s ease-in-out infinite, fadeInUp 1.5s ease-out forwards;
|
||||
text-align: center;
|
||||
z-index: 10000; /* 确保文字层级高于背景 */
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.ripple {
|
||||
position: absolute;
|
||||
border-radius: 50%;
|
||||
background: radial-gradient(${colors.rippleColor} 0%, transparent 70%);
|
||||
pointer-events: none;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
transform: scale(0);
|
||||
opacity: 0.8;
|
||||
z-index: 10;
|
||||
animation: rippleExpand 1s ease-out forwards;
|
||||
}
|
||||
|
||||
/* 动态背景动画 */
|
||||
@keyframes gradientShift {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
|
||||
/* 文字呼吸动画 */
|
||||
@keyframes textPulse {
|
||||
0%, 100% {
|
||||
transform: scale(1);
|
||||
text-shadow: 0 0 15px rgba(255, 255, 255, 0.9), 0 0 30px rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
50% {
|
||||
transform: scale(1.1);
|
||||
text-shadow: 0 0 25px rgba(255, 255, 255, 1), 0 0 40px rgba(255, 255, 255, 0.8);
|
||||
}
|
||||
}
|
||||
|
||||
/* 文字淡入动画 */
|
||||
@keyframes fadeInUp {
|
||||
0% {
|
||||
opacity: 0;
|
||||
transform: translateY(50px);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* 扩散光圈动画 */
|
||||
@keyframes rippleExpand {
|
||||
to {
|
||||
transform: scale(40);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
`}
|
||||
</style>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LoadingCover;
|
||||
65
themes/proxio/components/Logo.js
Normal file
65
themes/proxio/components/Logo.js
Normal file
@@ -0,0 +1,65 @@
|
||||
/* 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 { siteInfo, white } = props
|
||||
const router = useRouter()
|
||||
|
||||
const { isDarkMode } = useGlobal()
|
||||
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) {
|
||||
setLogoTextColor('text-white')
|
||||
} else {
|
||||
setLogoTextColor('text-black')
|
||||
}
|
||||
}, throttleMs)
|
||||
|
||||
navBarScrollListener()
|
||||
window.addEventListener('scroll', navBarScrollListener)
|
||||
return () => {
|
||||
window.removeEventListener('scroll', navBarScrollListener)
|
||||
}
|
||||
}, [isDarkMode, router])
|
||||
|
||||
return (
|
||||
<div className='w-60 max-w-full px-4'>
|
||||
<div className='navbar-logo flex items-center w-full py-5 cursor-pointer'>
|
||||
<LazyImage
|
||||
priority
|
||||
src={siteInfo?.icon}
|
||||
width={24}
|
||||
height={20}
|
||||
alt={siteConfig('AUTHOR')}
|
||||
className='mr-2 hidden md:inline-block'
|
||||
/>
|
||||
{/* logo文字 */}
|
||||
<span
|
||||
onClick={() => {
|
||||
router.push('/')
|
||||
}}
|
||||
className={`${logoTextColor} logo dark:text-white py-1.5 header-logo-text whitespace-nowrap font-semibold`}>
|
||||
{siteConfig('TITLE')}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
29
themes/proxio/components/MadeWithButton.js
Normal file
29
themes/proxio/components/MadeWithButton.js
Normal file
@@ -0,0 +1,29 @@
|
||||
/* eslint-disable @next/next/no-img-element */
|
||||
export const MadeWithButton = () => {
|
||||
return <>
|
||||
{/* <!-- ====== Made With Button Start --> */}
|
||||
<a
|
||||
target="_blank"
|
||||
rel="nofollow noopener noreferrer"
|
||||
className="fixed bottom-8 left-4 z-[999] inline-flex items-center gap-[10px] rounded-lg bg-white px-[14px] py-2 shadow-2 dark:bg-dark-2 sm:left-9"
|
||||
href="https://tailgrids.com/"
|
||||
>
|
||||
<span className="text-base font-medium text-dark-3 dark:text-dark-6">
|
||||
Made with
|
||||
</span>
|
||||
<span className="block h-4 w-px bg-stroke dark:bg-dark-3"></span>
|
||||
<span className="block w-full max-w-[88px]">
|
||||
<img
|
||||
src="/images/starter/brands/tailgrids.svg"
|
||||
alt="tailgrids"
|
||||
className="dark:hidden"
|
||||
/>
|
||||
<img
|
||||
src="/images/starter/brands/tailgrids-white.svg"
|
||||
alt="tailgrids"
|
||||
className="hidden dark:block"
|
||||
/>
|
||||
</span>
|
||||
</a>
|
||||
</>
|
||||
}
|
||||
91
themes/proxio/components/MenuItem.js
Normal file
91
themes/proxio/components/MenuItem.js
Normal file
@@ -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 && (
|
||||
<li className='group relative whitespace-nowrap'>
|
||||
<Link
|
||||
href={link?.href}
|
||||
target={link?.target}
|
||||
className={`ud-menu-scroll mx-8 flex py-2 text-sm font-medium text-dark group-hover:text-primary dark:text-white lg:mr-0 lg:inline-flex lg:px-0 lg:py-6 ${
|
||||
router.route === '/'
|
||||
? 'lg:text-white lg:group-hover:text-white'
|
||||
: ''
|
||||
} lg:group-hover:opacity-70`}>
|
||||
{link?.icon && <i className={link.icon + ' mr-2 my-auto'} />}
|
||||
{link?.name}
|
||||
</Link>
|
||||
</li>
|
||||
)}
|
||||
|
||||
{/* 有子菜单的 MenuItem */}
|
||||
{hasSubMenu && (
|
||||
<li className='submenu-item group relative whitespace-nowrap'>
|
||||
<button
|
||||
onClick={toggleSubMenu}
|
||||
className={`cursor-pointer relative px-8 flex items-center justify-between py-2 text-sm font-medium text-dark group-hover:text-primary dark:text-white lg:ml-8 lg:mr-0 lg:inline-flex lg:py-6 lg:pl-0 lg:pr-4 ${
|
||||
router.route === '/'
|
||||
? 'lg:text-white lg:group-hover:text-white'
|
||||
: ''
|
||||
} lg:group-hover:opacity-70 xl:ml-10`}>
|
||||
<span>
|
||||
{link?.icon && <i className={link.icon + ' mr-2 my-auto'} />}
|
||||
{link?.name}
|
||||
</span>
|
||||
|
||||
<svg
|
||||
className='ml-2 fill-current'
|
||||
width='16'
|
||||
height='20'
|
||||
viewBox='0 0 16 20'
|
||||
fill='none'
|
||||
xmlns='http://www.w3.org/2000/svg'>
|
||||
<path d='M7.99999 14.9C7.84999 14.9 7.72499 14.85 7.59999 14.75L1.84999 9.10005C1.62499 8.87505 1.62499 8.52505 1.84999 8.30005C2.07499 8.07505 2.42499 8.07505 2.64999 8.30005L7.99999 13.525L13.35 8.25005C13.575 8.02505 13.925 8.02505 14.15 8.25005C14.375 8.47505 14.375 8.82505 14.15 9.05005L8.39999 14.7C8.27499 14.825 8.14999 14.9 7.99999 14.9Z' />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
{/* 子菜单 */}
|
||||
<div
|
||||
className={`submenu dark:border-gray-600 relative left-0 top-full w-[250px] rounded-sm bg-white p-4 transition-all duration-300 dark:bg-dark-2 lg:absolute lg:shadow-lg ${
|
||||
isSubMenuOpen
|
||||
? 'block opacity-100 visible'
|
||||
: 'hidden opacity-0 invisible'
|
||||
}`}>
|
||||
{link.subMenus.map((sLink, index) => (
|
||||
<Link
|
||||
key={index}
|
||||
href={sLink.href}
|
||||
target={link?.target}
|
||||
className='block rounded px-4 py-[10px] text-sm text-body-color hover:text-primary dark:text-dark-6 dark:hover:text-primary'>
|
||||
{/* 子菜单 SubMenuItem */}
|
||||
<span className='text-md ml-2 whitespace-nowrap'>
|
||||
{link?.icon && <i className={sLink.icon + ' mr-2 my-auto'} />}{' '}
|
||||
{sLink.title}
|
||||
</span>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</li>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
93
themes/proxio/components/MenuList.js
Normal file
93
themes/proxio/components/MenuList.js
Normal file
@@ -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 (
|
||||
<div>
|
||||
{/* 移动端菜单切换按钮 */}
|
||||
<button
|
||||
id='navbarToggler'
|
||||
onClick={toggleMenu}
|
||||
className={`absolute right-4 top-1/2 block -translate-y-1/2 rounded-lg px-3 py-[6px] ring-primary focus:ring-2 lg:hidden ${
|
||||
showMenu ? 'navbarTogglerActive' : ''
|
||||
}`}>
|
||||
<span className='relative my-[6px] block h-[2px] w-[30px] bg-white duration-200 transition-all'></span>
|
||||
<span className='relative my-[6px] block h-[2px] w-[30px] bg-white duration-200 transition-all'></span>
|
||||
<span className='relative my-[6px] block h-[2px] w-[30px] bg-white duration-200 transition-all'></span>
|
||||
</button>
|
||||
|
||||
<nav
|
||||
id='navbarCollapse'
|
||||
className={`absolute right-4 top-full w-full max-w-[250px] rounded-lg bg-white py-5 shadow-lg dark:bg-dark-2 lg:static lg:block lg:w-full lg:max-w-full lg:bg-transparent lg:px-4 lg:py-0 lg:shadow-none dark:lg:bg-transparent xl:px-6 ${
|
||||
showMenu ? '' : 'hidden'
|
||||
}`}>
|
||||
<ul className='blcok lg:flex 2xl:ml-20'>
|
||||
{links?.map((link, index) => (
|
||||
<MenuItem key={index} link={link} />
|
||||
))}
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
112
themes/proxio/components/MessageForm.js
Normal file
112
themes/proxio/components/MessageForm.js
Normal file
@@ -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 (
|
||||
<>
|
||||
<h3 className='mb-8 text-2xl font-semibold text-dark dark:text-white md:text-[28px] md:leading-[1.42]'>
|
||||
{siteConfig('PROXIO_CONTACT_MSG_TITLE')}
|
||||
</h3>
|
||||
<form ref={formRef}>
|
||||
<div className='mb-[22px]'>
|
||||
<label
|
||||
// for="fullName"
|
||||
className='mb-4 block text-sm text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_CONTACT_MSG_NAME')}*
|
||||
</label>
|
||||
<input
|
||||
disabled={success}
|
||||
type='text'
|
||||
name='fullName'
|
||||
value={formData.fullName}
|
||||
onChange={handleChange}
|
||||
placeholder='Adam Gelius'
|
||||
className='w-full border-0 border-b border-[#f1f1f1] bg-transparent pb-3 text-body-color placeholder:text-body-color/60 focus:border-primary focus:outline-none dark:border-dark-3 dark:text-dark-6'
|
||||
/>
|
||||
</div>
|
||||
<div className='mb-[22px]'>
|
||||
<label
|
||||
// for="email"
|
||||
className='mb-4 block text-sm text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_CONTACT_MSG_EMAIL')}*
|
||||
</label>
|
||||
<input
|
||||
disabled={success}
|
||||
type='email'
|
||||
name='email'
|
||||
value={formData.email}
|
||||
onChange={handleChange}
|
||||
placeholder='example@yourmail.com'
|
||||
className='w-full border-0 border-b border-[#f1f1f1] bg-transparent pb-3 text-body-color placeholder:text-body-color/60 focus:border-primary focus:outline-none dark:border-dark-3 dark:text-dark-6'
|
||||
/>
|
||||
</div>
|
||||
<div className='mb-[22px]'>
|
||||
<label
|
||||
// for="phone"
|
||||
className='mb-4 block text-sm text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_CONTACT_MSG_PHONE')}*
|
||||
</label>
|
||||
<input
|
||||
disabled={success}
|
||||
type='text'
|
||||
name='phone'
|
||||
value={formData.phone}
|
||||
onChange={handleChange}
|
||||
placeholder='+885 1254 5211 552'
|
||||
className='w-full border-0 border-b border-[#f1f1f1] bg-transparent pb-3 text-body-color placeholder:text-body-color/60 focus:border-primary focus:outline-none dark:border-dark-3 dark:text-dark-6'
|
||||
/>
|
||||
</div>
|
||||
<div className='mb-[30px]'>
|
||||
<label
|
||||
// for="message"
|
||||
className='mb-4 block text-sm text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_CONTACT_MSG_TEXT')}*
|
||||
</label>
|
||||
<textarea
|
||||
disabled={success}
|
||||
name='message'
|
||||
value={formData.message}
|
||||
onChange={handleChange}
|
||||
rows='1'
|
||||
placeholder='type your message here'
|
||||
className='w-full resize-none border-0 border-b border-[#f1f1f1] bg-transparent pb-3 text-body-color placeholder:text-body-color/60 focus:border-primary focus:outline-none dark:border-dark-3 dark:text-dark-6'></textarea>
|
||||
</div>
|
||||
<div className='mb-0'>
|
||||
<button
|
||||
disabled={success}
|
||||
type='submit'
|
||||
className='inline-flex items-center justify-center rounded-md bg-primary px-10 py-3 text-base font-medium text-white transition duration-300 ease-in-out hover:bg-blue-dark'>
|
||||
{siteConfig('PROXIO_CONTACT_MSG_SEND')}
|
||||
</button>
|
||||
{/* Success message */}
|
||||
{success && (
|
||||
<p className='mt-2 text-green-600 text-sm'>
|
||||
{siteConfig('PROXIO_CONTACT_MSG_THANKS')}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
</form>
|
||||
</>
|
||||
)
|
||||
}
|
||||
178
themes/proxio/components/Pricing.js
Normal file
178
themes/proxio/components/Pricing.js
Normal file
@@ -0,0 +1,178 @@
|
||||
import { siteConfig } from '@/lib/config'
|
||||
import Link from 'next/link'
|
||||
|
||||
/**
|
||||
* 价格板块
|
||||
* @returns
|
||||
*/
|
||||
export const Pricing = () => {
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== Pricing Section Start --> */}
|
||||
<section
|
||||
id='pricing'
|
||||
className='relative overflow-hidden bg-white pb-12 pt-20 dark:bg-dark lg:pb-[90px] lg:pt-[120px]'>
|
||||
<div className='container mx-auto'>
|
||||
<div className='-mx-4 flex flex-wrap'>
|
||||
<div className='w-full px-4'>
|
||||
<div className='mx-auto mb-[60px] max-w-[510px] text-center'>
|
||||
<span className='mb-2 block text-lg font-semibold text-primary'>
|
||||
{siteConfig('PROXIO_PRICING_TITLE')}
|
||||
</span>
|
||||
<h2 className='mb-3 text-3xl font-bold text-dark dark:text-white sm:text-4xl md:text-[40px] md:leading-[1.2]'>
|
||||
{siteConfig('PROXIO_PRICING_TEXT_1')}
|
||||
</h2>
|
||||
<p className='text-base text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_PRICING_TEXT_2')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='-mx-4 flex flex-wrap justify-center'>
|
||||
{/* 第一个付费计划 */}
|
||||
<div className='w-full px-4 md:w-1/2 lg:w-1/3'>
|
||||
<div className='relative z-10 mb-10 overflow-hidden rounded-xl bg-white px-8 py-10 shadow-pricing dark:bg-dark-2 sm:p-12 lg:px-6 lg:py-10 xl:p-14'>
|
||||
<span className='mb-5 block text-xl font-medium text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_PRICING_1_TITLE')}
|
||||
</span>
|
||||
<h2 className='space-x-1 mb-11 text-4xl font-semibold text-dark dark:text-white xl:text-[42px] xl:leading-[1.21]'>
|
||||
<span className='text-xl font-medium'>
|
||||
{siteConfig('PROXIO_PRICING_1_PRICE_CURRENCY')}
|
||||
</span>
|
||||
<span className='-ml-1 -tracking-[2px]'>
|
||||
{siteConfig('PROXIO_PRICING_1_PRICE')}
|
||||
</span>
|
||||
<span className='text-base font-normal text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_PRICING_1_PRICE_PERIOD')}
|
||||
</span>
|
||||
</h2>
|
||||
|
||||
<div className='mb-[50px]'>
|
||||
<h5 className='mb-5 text-lg font-medium text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_PRICING_1_HEADER')}
|
||||
</h5>
|
||||
<div className='flex flex-col gap-[14px]'>
|
||||
{siteConfig('PROXIO_PRICING_1_FEATURES')
|
||||
?.split(',')
|
||||
.map((feature, index) => {
|
||||
return (
|
||||
<p
|
||||
key={index}
|
||||
className='text-base text-body-color dark:text-dark-6'>
|
||||
{feature}
|
||||
</p>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<Link
|
||||
href={siteConfig('PROXIO_PRICING_1_BUTTON_URL', '')}
|
||||
className='inline-block rounded-md bg-primary px-7 py-3 text-center text-base font-medium text-white transition hover:bg-blue-dark'>
|
||||
{siteConfig('PROXIO_PRICING_1_BUTTON_TEXT')}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 第二个付费计划 */}
|
||||
<div className='w-full px-4 md:w-1/2 lg:w-1/3'>
|
||||
<div className='relative z-10 mb-10 overflow-hidden rounded-xl bg-white px-8 py-10 shadow-pricing dark:bg-dark-2 sm:p-12 lg:px-6 lg:py-10 xl:p-14'>
|
||||
<p
|
||||
style={{
|
||||
writingMode: 'vertical-rl',
|
||||
textOrientation: 'mixed'
|
||||
}}
|
||||
className='absolute p-1 right-0 top-0 inline-block rounded-bl-md rounded-tl-md bg-primary text-base font-medium text-white tracking-wider'>
|
||||
{siteConfig('PROXIO_PRICING_2_TAG')}
|
||||
</p>
|
||||
<span className='mb-5 block text-xl font-medium text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_PRICING_2_TITLE')}
|
||||
</span>
|
||||
<h2 className='space-x-1 mb-11 text-4xl font-semibold text-dark dark:text-white xl:text-[42px] xl:leading-[1.21]'>
|
||||
<span className='text-xl font-medium'>
|
||||
{siteConfig('PROXIO_PRICING_2_PRICE_CURRENCY')}
|
||||
</span>
|
||||
<span className='-ml-1 -tracking-[2px]'>
|
||||
{siteConfig('PROXIO_PRICING_2_PRICE')}
|
||||
</span>
|
||||
<span className='text-base font-normal text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_PRICING_2_PRICE_PERIOD')}
|
||||
</span>
|
||||
</h2>
|
||||
|
||||
<div className='mb-[50px]'>
|
||||
<h5 className='mb-5 text-lg font-medium text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_PRICING_2_HEADER')}
|
||||
</h5>
|
||||
<div className='flex flex-col gap-[14px]'>
|
||||
{siteConfig('PROXIO_PRICING_2_FEATURES')
|
||||
?.split(',')
|
||||
.map((feature, index) => {
|
||||
return (
|
||||
<p
|
||||
key={index}
|
||||
className='text-base text-body-color dark:text-dark-6'>
|
||||
{feature}
|
||||
</p>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<Link
|
||||
href={siteConfig('PROXIO_PRICING_2_BUTTON_URL', '')}
|
||||
className='inline-block rounded-md bg-primary px-7 py-3 text-center text-base font-medium text-white transition hover:bg-blue-dark'>
|
||||
{siteConfig('PROXIO_PRICING_2_BUTTON_TEXT')}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 第三个付费计划 */}
|
||||
<div className='w-full px-4 md:w-1/2 lg:w-1/3'>
|
||||
<div className='relative z-10 mb-10 overflow-hidden rounded-xl bg-white px-8 py-10 shadow-pricing dark:bg-dark-2 sm:p-12 lg:px-6 lg:py-10 xl:p-14'>
|
||||
<span className='mb-5 block text-xl font-medium text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_PRICING_3_TITLE')}
|
||||
</span>
|
||||
<h2 className='space-x-1 mb-11 text-4xl font-semibold text-dark dark:text-white xl:text-[42px] xl:leading-[1.21]'>
|
||||
<span className='text-xl font-medium'>
|
||||
{siteConfig('PROXIO_PRICING_3_PRICE_CURRENCY')}
|
||||
</span>
|
||||
<span className='-ml-1 -tracking-[2px]'>
|
||||
{siteConfig('PROXIO_PRICING_3_PRICE')}
|
||||
</span>
|
||||
<span className='text-base font-normal text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_PRICING_3_PRICE_PERIOD')}
|
||||
</span>
|
||||
</h2>
|
||||
|
||||
<div className='mb-[50px]'>
|
||||
<h5 className='mb-5 text-lg font-medium text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_PRICING_3_HEADER')}
|
||||
</h5>
|
||||
<div className='flex flex-col gap-[14px]'>
|
||||
{siteConfig('PROXIO_PRICING_3_FEATURES')
|
||||
?.split(',')
|
||||
.map((feature, index) => {
|
||||
return (
|
||||
<p
|
||||
key={index}
|
||||
className='text-base text-body-color dark:text-dark-6'>
|
||||
{feature}
|
||||
</p>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
<Link
|
||||
href={siteConfig('PROXIO_PRICING_3_BUTTON_URL', '')}
|
||||
className='inline-block rounded-md bg-primary px-7 py-3 text-center text-base font-medium text-white transition hover:bg-blue-dark'>
|
||||
{siteConfig('PROXIO_PRICING_3_BUTTON_TEXT')}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Pricing Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
107
themes/proxio/components/SearchInput.js
Normal file
107
themes/proxio/components/SearchInput.js
Normal file
@@ -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 (
|
||||
<section className='flex w-full bg-gray-100'>
|
||||
<input
|
||||
ref={searchInputRef}
|
||||
type='text'
|
||||
placeholder={
|
||||
currentTag
|
||||
? `${locale.SEARCH.TAGS} #${currentTag}`
|
||||
: `${locale.SEARCH.ARTICLES}`
|
||||
}
|
||||
className={
|
||||
'outline-none w-full text-sm pl-4 transition focus:shadow-lg font-light leading-10 text-black bg-gray-100 dark:bg-gray-900 dark:text-white'
|
||||
}
|
||||
onKeyUp={handleKeyUp}
|
||||
onCompositionStart={lockSearchInput}
|
||||
onCompositionUpdate={lockSearchInput}
|
||||
onCompositionEnd={unLockSearchInput}
|
||||
onChange={e => updateSearchKey(e.target.value)}
|
||||
defaultValue={keyword || ''}
|
||||
/>
|
||||
|
||||
<div
|
||||
className='-ml-8 cursor-pointer float-right items-center justify-center py-2'
|
||||
onClick={handleSearch}>
|
||||
<i
|
||||
className={
|
||||
'hover:text-black transform duration-200 text-gray-500 cursor-pointer fas fa-search'
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{showClean && (
|
||||
<div className='-ml-12 cursor-pointer dark:bg-gray-600 dark:hover:bg-gray-800 float-right items-center justify-center py-2'>
|
||||
<i
|
||||
className='hover:text-black transform duration-200 text-gray-400 cursor-pointer fas fa-times'
|
||||
onClick={cleanSearch}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
export default SearchInput
|
||||
97
themes/proxio/components/SignInForm.js
Normal file
97
themes/proxio/components/SignInForm.js
Normal file
@@ -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 <>
|
||||
{/* <!-- ====== Forms Section Start --> */}
|
||||
<section className="bg-[#F4F7FF] py-14 lg:py-20 dark:bg-dark">
|
||||
<div className="container">
|
||||
<div className="flex flex-wrap -mx-4">
|
||||
<div className="w-full px-4">
|
||||
<div
|
||||
className="wow fadeInUp relative mx-auto max-w-[525px] overflow-hidden rounded-lg bg-white dark:bg-dark-2 py-14 px-8 text-center sm:px-12 md:px-[60px]"
|
||||
data-wow-delay=".15s">
|
||||
<div className="mb-10 text-center">
|
||||
<div href="#" className="mx-auto inline-block max-w-[160px]">
|
||||
<Logo/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* 表单内容 */}
|
||||
<form>
|
||||
<div className="mb-[22px]">
|
||||
<input type="email" placeholder="Email"
|
||||
className="w-full px-5 py-3 text-base transition bg-transparent border rounded-md outline-none border-stroke dark:border-dark-3 text-body-color dark:text-dark-6 placeholder:text-dark-6 focus:border-primary dark:focus:border-primary focus-visible:shadow-none" />
|
||||
</div>
|
||||
<div className="mb-[22px]">
|
||||
<input type="password" placeholder="Password"
|
||||
className="w-full px-5 py-3 text-base transition bg-transparent border rounded-md outline-none border-stroke dark:border-dark-3 text-body-color dark:text-dark-6 placeholder:text-dark-6 focus:border-primary dark:focus:border-primary focus-visible:shadow-none" />
|
||||
</div>
|
||||
<div className="mb-9">
|
||||
<input type="submit" value="Sign In"
|
||||
className="w-full px-5 py-3 text-base text-white transition duration-300 ease-in-out border rounded-md cursor-pointer border-primary bg-primary hover:bg-blue-dark" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<span className="relative block text-center z-1 mb-7">
|
||||
<span className="absolute left-0 block w-full h-px -z-1 top-1/2 bg-stroke dark:bg-dark-3"></span>
|
||||
<span className="relative z-10 inline-block px-3 text-base bg-white dark:bg-dark-2 text-body-secondary">Connect With</span>
|
||||
</span>
|
||||
|
||||
{/* 社交平台 */}
|
||||
<ul className="flex justify-between -mx-2 mb-9">
|
||||
<li className="w-full px-2">
|
||||
<a href="#"
|
||||
className="flex h-11 items-center justify-center rounded-md bg-[#4064AC] transition hover:bg-opacity-90">
|
||||
<SVGFacebook className='fill-white'/>
|
||||
</a>
|
||||
</li>
|
||||
<li className="w-full px-2">
|
||||
<a href="#"
|
||||
className="flex h-11 items-center justify-center rounded-md bg-[#1C9CEA] transition hover:bg-opacity-90">
|
||||
<SVGTwitter className='fill-white'/>
|
||||
</a>
|
||||
</li>
|
||||
<li className="w-full px-2">
|
||||
<a href="#"
|
||||
className="flex h-11 items-center justify-center rounded-md bg-[#D64937] transition hover:bg-opacity-90">
|
||||
<SVGGoogle className='fill-white'/>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<a href="#" className="inline-block mb-2 text-base text-dark dark:text-white hover:text-primary dark:hover:text-primary">
|
||||
Forget Password?
|
||||
</a>
|
||||
<p className="text-base text-body-secondary">
|
||||
Not a member yet?
|
||||
<a href="signup.html" className="text-primary hover:underline">
|
||||
Sign Up
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<div>
|
||||
<span className="absolute top-1 right-1">
|
||||
<SVGCircleBg2/>
|
||||
</span>
|
||||
<span className="absolute left-1 bottom-1">
|
||||
<SVGCircleBG3/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Forms Section End --> */}
|
||||
</>
|
||||
}
|
||||
160
themes/proxio/components/SignUpForm.js
Normal file
160
themes/proxio/components/SignUpForm.js
Normal file
@@ -0,0 +1,160 @@
|
||||
import { Logo } from './Logo'
|
||||
|
||||
/**
|
||||
* 注册
|
||||
* @returns
|
||||
*/
|
||||
export const SignUpForm = () => {
|
||||
return <>
|
||||
{/* <!-- ====== Forms Section Start --> */}
|
||||
<section className="bg-[#F4F7FF] py-14 lg:py-[90px] dark:bg-dark">
|
||||
<div className="container">
|
||||
<div className="flex flex-wrap -mx-4">
|
||||
<div className="w-full px-4">
|
||||
<div
|
||||
className="wow fadeInUp relative mx-auto max-w-[525px] overflow-hidden rounded-xl shadow-form bg-white dark:bg-dark-2 py-14 px-8 text-center sm:px-12 md:px-[60px]"
|
||||
data-wow-delay=".15s">
|
||||
<div className="mb-10 text-center">
|
||||
<a href="#" className="mx-auto inline-block max-w-[160px]">
|
||||
<Logo/>
|
||||
</a>
|
||||
</div>
|
||||
<form>
|
||||
<div className="mb-[22px]">
|
||||
<input type="text" placeholder="Name"
|
||||
className="w-full px-5 py-3 text-base transition bg-transparent border rounded-md outline-none border-stroke dark:border-dark-3 text-body-color dark:text-dark-6 placeholder:text-dark-6 focus:border-primary dark:focus:border-primary focus-visible:shadow-none" />
|
||||
</div>
|
||||
<div className="mb-[22px]">
|
||||
<input type="email" placeholder="Email"
|
||||
className="w-full px-5 py-3 text-base transition bg-transparent border rounded-md outline-none border-stroke dark:border-dark-3 text-body-color dark:text-dark-6 placeholder:text-dark-6 focus:border-primary dark:focus:border-primary focus-visible:shadow-none" />
|
||||
</div>
|
||||
<div className="mb-[22px]">
|
||||
<input type="password" placeholder="Password"
|
||||
className="w-full px-5 py-3 text-base transition bg-transparent border rounded-md outline-none border-stroke dark:border-dark-3 text-body-color dark:text-dark-6 placeholder:text-dark-6 focus:border-primary dark:focus:border-primary focus-visible:shadow-none" />
|
||||
</div>
|
||||
<div className="mb-9">
|
||||
<input type="submit" value="Sign Up"
|
||||
className="w-full px-5 py-3 text-base text-white transition duration-300 ease-in-out border rounded-md cursor-pointer border-primary bg-primary hover:bg-blue-dark" />
|
||||
</div>
|
||||
</form>
|
||||
<span className="relative block text-center z-1 mb-7">
|
||||
<span className="absolute left-0 block w-full h-px -z-1 top-1/2 bg-stroke dark:bg-dark-3"></span>
|
||||
<span className="relative z-10 inline-block px-3 text-base bg-white dark:bg-dark-2 text-body-secondary">Connect With</span>
|
||||
</span>
|
||||
<ul className="flex justify-between -mx-2 mb-9">
|
||||
<li className="w-full px-2">
|
||||
<a href="#"
|
||||
className="flex h-11 items-center justify-center rounded-md bg-[#4064AC] transition hover:bg-opacity-90">
|
||||
<svg width="10" height="20" viewBox="0 0 10 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M9.29878 8H7.74898H7.19548V7.35484V5.35484V4.70968H7.74898H8.91133C9.21575 4.70968 9.46483 4.45161 9.46483 4.06452V0.645161C9.46483 0.290323 9.24343 0 8.91133 0H6.89106C4.70474 0 3.18262 1.80645 3.18262 4.48387V7.29032V7.93548H2.62912H0.747223C0.359774 7.93548 0 8.29032 0 8.80645V11.129C0 11.5806 0.304424 12 0.747223 12H2.57377H3.12727V12.6452V19.129C3.12727 19.5806 3.43169 20 3.87449 20H6.47593C6.64198 20 6.78036 19.9032 6.89106 19.7742C7.00176 19.6452 7.08478 19.4194 7.08478 19.2258V12.6774V12.0323H7.66596H8.91133C9.2711 12.0323 9.54785 11.7742 9.6032 11.3871V11.3548V11.3226L9.99065 9.09677C10.0183 8.87097 9.99065 8.6129 9.8246 8.35484C9.76925 8.19355 9.52018 8.03226 9.29878 8Z"
|
||||
fill="white" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
<li className="w-full px-2">
|
||||
<a href="#"
|
||||
className="flex h-11 items-center justify-center rounded-md bg-[#1C9CEA] transition hover:bg-opacity-90">
|
||||
<svg width="22" height="16" viewBox="0 0 22 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M19.5516 2.75538L20.9 1.25245C21.2903 0.845401 21.3968 0.53229 21.4323 0.375734C20.3677 0.939335 19.3742 1.1272 18.7355 1.1272H18.4871L18.3452 1.00196C17.4935 0.344423 16.429 0 15.2935 0C12.8097 0 10.8581 1.81605 10.8581 3.91389C10.8581 4.03914 10.8581 4.22701 10.8935 4.35225L11 4.97847L10.2548 4.94716C5.7129 4.82192 1.9871 1.37769 1.38387 0.782779C0.390323 2.34834 0.958064 3.85127 1.56129 4.79061L2.76774 6.54403L0.851613 5.6047C0.887097 6.91977 1.45484 7.95303 2.55484 8.7045L3.5129 9.33072L2.55484 9.67515C3.15806 11.272 4.50645 11.9296 5.5 12.18L6.8129 12.4932L5.57097 13.2446C3.58387 14.4971 1.1 14.4031 0 14.3092C2.23548 15.6869 4.89677 16 6.74194 16C8.12581 16 9.15484 15.8748 9.40322 15.7808C19.3387 13.7143 19.8 5.8865 19.8 4.32094V4.10176L20.0129 3.97652C21.2194 2.97456 21.7161 2.44227 22 2.12916C21.8935 2.16047 21.7516 2.22309 21.6097 2.2544L19.5516 2.75538Z"
|
||||
fill="white" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
<li className="w-full px-2">
|
||||
<a href="#"
|
||||
className="flex h-11 items-center justify-center rounded-md bg-[#D64937] transition hover:bg-opacity-90">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M17.8477 8.17132H9.29628V10.643H15.4342C15.1065 14.0743 12.2461 15.5574 9.47506 15.5574C5.95916 15.5574 2.8306 12.8821 2.8306 9.01461C2.8306 5.29251 5.81018 2.47185 9.47506 2.47185C12.2759 2.47185 13.9742 4.24567 13.9742 4.24567L15.7024 2.47185C15.7024 2.47185 13.3783 0.000145544 9.35587 0.000145544C4.05223 -0.0289334 0 4.30383 0 8.98553C0 13.5218 3.81386 18 9.44526 18C14.4212 18 17.9967 14.7141 17.9967 9.79974C18.0264 8.78198 17.8477 8.17132 17.8477 8.17132Z"
|
||||
fill="white" />
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p className="mb-4 text-base text-body-secondary">
|
||||
By creating an account you are agree with our
|
||||
<a href="#" className="text-primary hover:underline">
|
||||
Privacy
|
||||
</a>
|
||||
and
|
||||
<a href="#" className="text-primary hover:underline">
|
||||
Policy
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p className="text-base text-body-secondary">
|
||||
Already have an account?
|
||||
<a href="signin.html" className="text-primary hover:underline">
|
||||
Sign In
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<div>
|
||||
<span className="absolute top-1 right-1">
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="1.39737" cy="38.6026" r="1.39737" transform="rotate(-90 1.39737 38.6026)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="1.39737" cy="1.99122" r="1.39737" transform="rotate(-90 1.39737 1.99122)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="38.6026" r="1.39737" transform="rotate(-90 13.6943 38.6026)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="1.99122" r="1.39737" transform="rotate(-90 13.6943 1.99122)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="38.6026" r="1.39737" transform="rotate(-90 25.9911 38.6026)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="1.99122" r="1.39737" transform="rotate(-90 25.9911 1.99122)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="38.288" cy="38.6026" r="1.39737" transform="rotate(-90 38.288 38.6026)" fill="#3056D3" />
|
||||
<circle cx="38.288" cy="1.99122" r="1.39737" transform="rotate(-90 38.288 1.99122)" fill="#3056D3" />
|
||||
<circle cx="1.39737" cy="26.3057" r="1.39737" transform="rotate(-90 1.39737 26.3057)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="26.3057" r="1.39737" transform="rotate(-90 13.6943 26.3057)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="26.3057" r="1.39737" transform="rotate(-90 25.9911 26.3057)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="38.288" cy="26.3057" r="1.39737" transform="rotate(-90 38.288 26.3057)" fill="#3056D3" />
|
||||
<circle cx="1.39737" cy="14.0086" r="1.39737" transform="rotate(-90 1.39737 14.0086)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="14.0086" r="1.39737" transform="rotate(-90 13.6943 14.0086)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="14.0086" r="1.39737" transform="rotate(-90 25.9911 14.0086)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="38.288" cy="14.0086" r="1.39737" transform="rotate(-90 38.288 14.0086)" fill="#3056D3" />
|
||||
</svg>
|
||||
</span>
|
||||
<span className="absolute left-1 bottom-1">
|
||||
<svg width="29" height="40" viewBox="0 0 29 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="2.288" cy="25.9912" r="1.39737" transform="rotate(-90 2.288 25.9912)" fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="25.9911" r="1.39737" transform="rotate(-90 14.5849 25.9911)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="25.9911" r="1.39737" transform="rotate(-90 26.7216 25.9911)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="2.288" cy="13.6944" r="1.39737" transform="rotate(-90 2.288 13.6944)" fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="13.6943" r="1.39737" transform="rotate(-90 14.5849 13.6943)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="13.6943" r="1.39737" transform="rotate(-90 26.7216 13.6943)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="2.288" cy="38.0087" r="1.39737" transform="rotate(-90 2.288 38.0087)" fill="#3056D3" />
|
||||
<circle cx="2.288" cy="1.39739" r="1.39737" transform="rotate(-90 2.288 1.39739)" fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="38.0089" r="1.39737" transform="rotate(-90 14.5849 38.0089)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="38.0089" r="1.39737" transform="rotate(-90 26.7216 38.0089)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="1.39761" r="1.39737" transform="rotate(-90 14.5849 1.39761)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="1.39761" r="1.39737" transform="rotate(-90 26.7216 1.39761)"
|
||||
fill="#3056D3" />
|
||||
</svg>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Forms Section End --> */}
|
||||
</>
|
||||
}
|
||||
106
themes/proxio/components/SocialButton.js
Normal file
106
themes/proxio/components/SocialButton.js
Normal file
@@ -0,0 +1,106 @@
|
||||
import { siteConfig } from '@/lib/config'
|
||||
|
||||
/**
|
||||
* 社交联系方式按钮组
|
||||
* @returns {JSX.Element}
|
||||
* @constructor
|
||||
*/
|
||||
const SocialButton = () => {
|
||||
return (
|
||||
<div className='w-52 justify-center flex-wrap flex my-2'>
|
||||
<div className='space-x-5 md:text-xl text-3xl text-gray-600 dark:text-gray-400 text-center'>
|
||||
{siteConfig('CONTACT_GITHUB') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'github'}
|
||||
href={siteConfig('CONTACT_GITHUB')}>
|
||||
<i className='fab fa-github transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_TWITTER') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'twitter'}
|
||||
href={siteConfig('CONTACT_TWITTER')}>
|
||||
<i className='fab fa-twitter transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_TELEGRAM') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
href={siteConfig('CONTACT_TELEGRAM')}
|
||||
title={'telegram'}>
|
||||
<i className='fab fa-telegram transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_LINKEDIN') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
href={siteConfig('CONTACT_LINKEDIN')}
|
||||
title={'linkedIn'}>
|
||||
<i className='fab fa-linkedin transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_WEIBO') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'weibo'}
|
||||
href={siteConfig('CONTACT_WEIBO')}>
|
||||
<i className='fab fa-weibo transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_INSTAGRAM') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'instagram'}
|
||||
href={siteConfig('CONTACT_INSTAGRAM')}>
|
||||
<i className='fab fa-instagram transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_EMAIL') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'email'}
|
||||
href={`mailto:${siteConfig('CONTACT_EMAIL')}`}>
|
||||
<i className='fas fa-envelope transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{JSON.parse(siteConfig('ENABLE_RSS')) && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'RSS'}
|
||||
href={'/rss/feed.xml'}>
|
||||
<i className='fas fa-rss transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_BILIBILI') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'bilibili'}
|
||||
href={siteConfig('CONTACT_BILIBILI')}>
|
||||
<i className='fab fa-bilibili transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
{siteConfig('CONTACT_YOUTUBE') && (
|
||||
<a
|
||||
target='_blank'
|
||||
rel='noreferrer'
|
||||
title={'youtube'}
|
||||
href={siteConfig('CONTACT_YOUTUBE')}>
|
||||
<i className='fab fa-youtube transform hover:scale-125 duration-150' />
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
export default SocialButton
|
||||
64
themes/proxio/components/Team.js
Normal file
64
themes/proxio/components/Team.js
Normal file
@@ -0,0 +1,64 @@
|
||||
/* eslint-disable @next/next/no-img-element */
|
||||
import { siteConfig } from '@/lib/config'
|
||||
import LazyImage from '@/components/LazyImage'
|
||||
/**
|
||||
* 作者团队
|
||||
* @returns
|
||||
*/
|
||||
export const Team = () => {
|
||||
const PROXIO_ABOUT_PHOTO_URL = siteConfig('PROXIO_ABOUT_PHOTO_URL')
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== Team Section Start --> */}
|
||||
<section
|
||||
id='team'
|
||||
className='overflow-hidden pb-12 pt-20 lg:pb-[90px] lg:pt-[120px]'>
|
||||
<div className='container mx-auto wow fadeInUp' data-wow-delay='.2s'>
|
||||
<div className='flex flex-col md:flex-row -mx-4 justify-between'>
|
||||
{/* 左边肖像图 */}
|
||||
<div className='mx-6 mb-6 max-w-96 border-gray-200 dark:border-[#333333] dark:bg-dark-1 border rounded-2xl overflow-hidden'>
|
||||
<LazyImage src={PROXIO_ABOUT_PHOTO_URL} className='object-cover h-full' />
|
||||
</div>
|
||||
{/* 右侧文字说明 */}
|
||||
<div className='flex flex-col px-4 space-y-4 mx-auto justify-between max-w-[485px]'>
|
||||
<div>
|
||||
<span className='px-3 py-0.5 mb-2 dark:bg-dark-1 rounded-2xl border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
{siteConfig('PROXIO_ABOUT_TITLE')}
|
||||
</span>
|
||||
</div>
|
||||
<h2 className='mb-3 text-2xl leading-[1.2] dark:text-white md:text-[40px]'>
|
||||
{siteConfig('PROXIO_ABOUT_TEXT_1')}
|
||||
</h2>
|
||||
<p
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: siteConfig('PROXIO_ABOUT_TEXT_2')
|
||||
}}
|
||||
className='text-base text-body-color dark:text-dark-6'></p>
|
||||
{/* 数值四宫格 */}
|
||||
<div className='grid grid-cols-2 grid-rows-2 pt-6 gap-4'>
|
||||
<KeyVal k={siteConfig('PROXIO_ABOUT_KEY_1')} v={siteConfig('PROXIO_ABOUT_VAL_1')} />
|
||||
<KeyVal k={siteConfig('PROXIO_ABOUT_KEY_2')} v={siteConfig('PROXIO_ABOUT_VAL_2')} />
|
||||
<KeyVal k={siteConfig('PROXIO_ABOUT_KEY_3')} v={siteConfig('PROXIO_ABOUT_VAL_3')} />
|
||||
<KeyVal k={siteConfig('PROXIO_ABOUT_KEY_4')} v={siteConfig('PROXIO_ABOUT_VAL_4')} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Team Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
// 显示一组键值对
|
||||
const KeyVal = ({ k, v }) => {
|
||||
if (!k) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<div className='space-y-2'>
|
||||
<div className='dark:text-dark-6'>{k}</div>
|
||||
<div className='dark:text-white text-2xl font-semibold'>{v}</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
149
themes/proxio/components/Testimonials.js
Normal file
149
themes/proxio/components/Testimonials.js
Normal file
@@ -0,0 +1,149 @@
|
||||
/* eslint-disable react/no-unescaped-entities */
|
||||
/* eslint-disable @next/next/no-img-element */
|
||||
import { siteConfig } from '@/lib/config'
|
||||
import Link from 'next/link'
|
||||
import { useEffect, useRef } from 'react'
|
||||
|
||||
/**
|
||||
* 用户反馈
|
||||
* @returns
|
||||
*/
|
||||
export const Testimonials = () => {
|
||||
const PROXIO_TESTIMONIALS_ITEMS = siteConfig('PROXIO_TESTIMONIALS_ITEMS', [])
|
||||
|
||||
const scrollContainerRef = useRef(null)
|
||||
|
||||
useEffect(() => {
|
||||
const scrollContainer = scrollContainerRef.current
|
||||
let scrollAmount = 0
|
||||
const scrollSpeed = 1 // 滚动速度
|
||||
|
||||
const scroll = () => {
|
||||
if (scrollContainer) {
|
||||
scrollAmount += scrollSpeed
|
||||
scrollContainer.scrollTop = scrollAmount
|
||||
|
||||
// 如果滚动到内容的一半,立即重置滚动位置
|
||||
if (scrollAmount >= scrollContainer.scrollHeight / 2) {
|
||||
scrollAmount = 0
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(scroll)
|
||||
}
|
||||
|
||||
scroll()
|
||||
|
||||
return () => cancelAnimationFrame(scroll)
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== Testimonial Section Start --> */}
|
||||
<section
|
||||
id="testimonials"
|
||||
className="overflow-hidden bg-gray-1 py-20 dark:bg-black md:py-[60px]"
|
||||
>
|
||||
<div className="container mx-auto flex flex-col md:flex-row items-start gap-10">
|
||||
{/* 左侧标题和描述 */}
|
||||
<div className="flex flex-col space-y-8 w-full md:w-1/2 text-center md:text-left">
|
||||
|
||||
<div>
|
||||
<span className='px-3 py-0.5 rounded-2xl dark:bg-dark-1 border border-gray-200 dark:border-[#333333] dark:text-white'>
|
||||
{siteConfig('PROXIO_TESTIMONIALS_TITLE')}
|
||||
</span>
|
||||
</div>
|
||||
<h2 className="text-3xl font-bold leading-[1.2] text-dark dark:text-white sm:text-4xl md:text-[40px]">
|
||||
{siteConfig('PROXIO_TESTIMONIALS_TEXT_1')}
|
||||
</h2>
|
||||
<p className="text-base text-body-color dark:text-dark-6">
|
||||
{siteConfig('PROXIO_TESTIMONIALS_TEXT_2')}
|
||||
</p>
|
||||
|
||||
<div className='mt-8 w-full flex justify-start items-center'>
|
||||
<Link
|
||||
href={siteConfig('PROXIO_TESTIMONIALS_BUTTON_URL', '')}
|
||||
className='px-4 py-2 rounded-3xl border dark:border-gray-200 border-[#333333] text-base font-medium text-dark hover:bg-gray-100 dark:text-white dark:hover:bg-white dark:hover:text-black duration-200'>
|
||||
{siteConfig('PROXIO_TESTIMONIALS_BUTTON_TEXT')}
|
||||
<i className="pl-4 fa-solid fa-arrow-right"></i>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
{/* 右侧用户评价卡牌 */}
|
||||
<div
|
||||
className="w-full md:w-1/2 h-[600px] overflow-hidden relative"
|
||||
ref={scrollContainerRef}
|
||||
>
|
||||
<div className="absolute top-0 left-0 w-full">
|
||||
{PROXIO_TESTIMONIALS_ITEMS?.map((item, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className="mb-6 rounded-xl bg-white px-4 py-[30px] shadow-testimonial border dark:bg-[#0E0E0E] sm:px-[30px] dark:border-[#333333] "
|
||||
>
|
||||
<p className="mb-6 text-base text-body-color dark:text-dark-6">
|
||||
“{item.PROXIO_TESTIMONIALS_ITEM_TEXT}”
|
||||
</p>
|
||||
<a
|
||||
href={item.PROXIO_TESTIMONIALS_ITEM_URL}
|
||||
className="flex items-center gap-4"
|
||||
>
|
||||
<div className="h-[50px] w-[50px] overflow-hidden rounded-full">
|
||||
<img
|
||||
src={item.PROXIO_TESTIMONIALS_ITEM_AVATAR}
|
||||
alt="author"
|
||||
className="h-[50px] w-[50px] overflow-hidden rounded-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-sm font-semibold text-dark dark:text-white">
|
||||
{item.PROXIO_TESTIMONIALS_ITEM_NICKNAME}
|
||||
</h3>
|
||||
<p className="text-xs text-body-secondary">
|
||||
{item.PROXIO_TESTIMONIALS_ITEM_DESCRIPTION}
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
))}
|
||||
{/* 克隆一份内容,用于无缝滚动 */}
|
||||
{PROXIO_TESTIMONIALS_ITEMS?.map((item, index) => (
|
||||
<div
|
||||
key={`clone-${index}`}
|
||||
className="mb-6 rounded-xl bg-white px-4 py-[30px] shadow-testimonial border dark:bg-[#0E0E0E] sm:px-[30px] dark:border-[#333333] "
|
||||
>
|
||||
<p className="mb-6 text-base text-body-color dark:text-dark-6">
|
||||
“{item.PROXIO_TESTIMONIALS_ITEM_TEXT}”
|
||||
</p>
|
||||
<a
|
||||
href={item.PROXIO_TESTIMONIALS_ITEM_URL}
|
||||
className="flex items-center gap-4"
|
||||
>
|
||||
<div className="h-[50px] w-[50px] overflow-hidden rounded-full">
|
||||
<img
|
||||
src={item.PROXIO_TESTIMONIALS_ITEM_AVATAR}
|
||||
alt="author"
|
||||
className="h-[50px] w-[50px] overflow-hidden rounded-full object-cover"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="text-sm font-semibold text-dark dark:text-white">
|
||||
{item.PROXIO_TESTIMONIALS_ITEM_NICKNAME}
|
||||
</h3>
|
||||
<p className="text-xs text-body-secondary">
|
||||
{item.PROXIO_TESTIMONIALS_ITEM_DESCRIPTION}
|
||||
</p>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Testimonial Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
33
themes/proxio/components/svg/SVG404.js
Normal file
33
themes/proxio/components/svg/SVG404.js
Normal file
File diff suppressed because one or more lines are too long
220
themes/proxio/components/svg/SVGAvatarBG.js
Normal file
220
themes/proxio/components/svg/SVGAvatarBG.js
Normal file
@@ -0,0 +1,220 @@
|
||||
export const SVGAvatarBG = () => {
|
||||
return <svg
|
||||
width="55"
|
||||
height="53"
|
||||
viewBox="0 0 55 53"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M12.5118 3.1009C13.3681 3.1009 14.0622 2.40674 14.0622 1.55045C14.0622 0.69416 13.3681 0 12.5118 0C11.6555 0 10.9613 0.69416 10.9613 1.55045C10.9613 2.40674 11.6555 3.1009 12.5118 3.1009Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M22.5038 3.1009C23.3601 3.1009 24.0543 2.40674 24.0543 1.55045C24.0543 0.69416 23.3601 0 22.5038 0C21.6475 0 20.9534 0.69416 20.9534 1.55045C20.9534 2.40674 21.6475 3.1009 22.5038 3.1009Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M32.4958 3.1009C33.3521 3.1009 34.0463 2.40674 34.0463 1.55045C34.0463 0.69416 33.3521 0 32.4958 0C31.6395 0 30.9454 0.69416 30.9454 1.55045C30.9454 2.40674 31.6395 3.1009 32.4958 3.1009Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M42.4875 3.1009C43.3438 3.1009 44.038 2.40674 44.038 1.55045C44.038 0.69416 43.3438 0 42.4875 0C41.6312 0 40.9371 0.69416 40.9371 1.55045C40.9371 2.40674 41.6312 3.1009 42.4875 3.1009Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M52.4795 3.1009C53.3358 3.1009 54.03 2.40674 54.03 1.55045C54.03 0.69416 53.3358 0 52.4795 0C51.6233 0 50.9291 0.69416 50.9291 1.55045C50.9291 2.40674 51.6233 3.1009 52.4795 3.1009Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M2.52045 13.0804C3.37674 13.0804 4.0709 12.3862 4.0709 11.5299C4.0709 10.6737 3.37674 9.97949 2.52045 9.97949C1.66416 9.97949 0.970001 10.6737 0.970001 11.5299C0.970001 12.3862 1.66416 13.0804 2.52045 13.0804Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M12.5118 13.0804C13.3681 13.0804 14.0622 12.3862 14.0622 11.5299C14.0622 10.6737 13.3681 9.97949 12.5118 9.97949C11.6555 9.97949 10.9613 10.6737 10.9613 11.5299C10.9613 12.3862 11.6555 13.0804 12.5118 13.0804Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M22.5038 13.0804C23.3601 13.0804 24.0543 12.3862 24.0543 11.5299C24.0543 10.6737 23.3601 9.97949 22.5038 9.97949C21.6475 9.97949 20.9534 10.6737 20.9534 11.5299C20.9534 12.3862 21.6475 13.0804 22.5038 13.0804Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M32.4958 13.0804C33.3521 13.0804 34.0463 12.3862 34.0463 11.5299C34.0463 10.6737 33.3521 9.97949 32.4958 9.97949C31.6395 9.97949 30.9454 10.6737 30.9454 11.5299C30.9454 12.3862 31.6395 13.0804 32.4958 13.0804Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M42.4875 13.0804C43.3438 13.0804 44.038 12.3862 44.038 11.5299C44.038 10.6737 43.3438 9.97949 42.4875 9.97949C41.6312 9.97949 40.9371 10.6737 40.9371 11.5299C40.9371 12.3862 41.6312 13.0804 42.4875 13.0804Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M52.4795 13.0804C53.3358 13.0804 54.03 12.3862 54.03 11.5299C54.03 10.6737 53.3358 9.97949 52.4795 9.97949C51.6233 9.97949 50.9291 10.6737 50.9291 11.5299C50.9291 12.3862 51.6233 13.0804 52.4795 13.0804Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M2.52045 23.0604C3.37674 23.0604 4.0709 22.3662 4.0709 21.5099C4.0709 20.6536 3.37674 19.9595 2.52045 19.9595C1.66416 19.9595 0.970001 20.6536 0.970001 21.5099C0.970001 22.3662 1.66416 23.0604 2.52045 23.0604Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M12.5118 23.0604C13.3681 23.0604 14.0622 22.3662 14.0622 21.5099C14.0622 20.6536 13.3681 19.9595 12.5118 19.9595C11.6555 19.9595 10.9613 20.6536 10.9613 21.5099C10.9613 22.3662 11.6555 23.0604 12.5118 23.0604Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M22.5038 23.0604C23.3601 23.0604 24.0543 22.3662 24.0543 21.5099C24.0543 20.6536 23.3601 19.9595 22.5038 19.9595C21.6475 19.9595 20.9534 20.6536 20.9534 21.5099C20.9534 22.3662 21.6475 23.0604 22.5038 23.0604Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M32.4958 23.0604C33.3521 23.0604 34.0463 22.3662 34.0463 21.5099C34.0463 20.6536 33.3521 19.9595 32.4958 19.9595C31.6395 19.9595 30.9454 20.6536 30.9454 21.5099C30.9454 22.3662 31.6395 23.0604 32.4958 23.0604Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M42.4875 23.0604C43.3438 23.0604 44.038 22.3662 44.038 21.5099C44.038 20.6536 43.3438 19.9595 42.4875 19.9595C41.6312 19.9595 40.9371 20.6536 40.9371 21.5099C40.9371 22.3662 41.6312 23.0604 42.4875 23.0604Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M52.4795 23.0604C53.3358 23.0604 54.03 22.3662 54.03 21.5099C54.03 20.6536 53.3358 19.9595 52.4795 19.9595C51.6233 19.9595 50.9291 20.6536 50.9291 21.5099C50.9291 22.3662 51.6233 23.0604 52.4795 23.0604Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M2.52045 33.0404C3.37674 33.0404 4.0709 32.3462 4.0709 31.4899C4.0709 30.6336 3.37674 29.9395 2.52045 29.9395C1.66416 29.9395 0.970001 30.6336 0.970001 31.4899C0.970001 32.3462 1.66416 33.0404 2.52045 33.0404Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M12.5118 33.0404C13.3681 33.0404 14.0622 32.3462 14.0622 31.4899C14.0622 30.6336 13.3681 29.9395 12.5118 29.9395C11.6555 29.9395 10.9613 30.6336 10.9613 31.4899C10.9613 32.3462 11.6555 33.0404 12.5118 33.0404Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M22.5038 33.0404C23.3601 33.0404 24.0543 32.3462 24.0543 31.4899C24.0543 30.6336 23.3601 29.9395 22.5038 29.9395C21.6475 29.9395 20.9534 30.6336 20.9534 31.4899C20.9534 32.3462 21.6475 33.0404 22.5038 33.0404Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M32.4958 33.0404C33.3521 33.0404 34.0463 32.3462 34.0463 31.4899C34.0463 30.6336 33.3521 29.9395 32.4958 29.9395C31.6395 29.9395 30.9454 30.6336 30.9454 31.4899C30.9454 32.3462 31.6395 33.0404 32.4958 33.0404Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M42.4875 33.0404C43.3438 33.0404 44.038 32.3462 44.038 31.4899C44.038 30.6336 43.3438 29.9395 42.4875 29.9395C41.6312 29.9395 40.9371 30.6336 40.9371 31.4899C40.9371 32.3462 41.6312 33.0404 42.4875 33.0404Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M52.4795 33.0404C53.3358 33.0404 54.03 32.3462 54.03 31.4899C54.03 30.6336 53.3358 29.9395 52.4795 29.9395C51.6233 29.9395 50.9291 30.6336 50.9291 31.4899C50.9291 32.3462 51.6233 33.0404 52.4795 33.0404Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M2.52045 43.0203C3.37674 43.0203 4.0709 42.3262 4.0709 41.4699C4.0709 40.6136 3.37674 39.9194 2.52045 39.9194C1.66416 39.9194 0.970001 40.6136 0.970001 41.4699C0.970001 42.3262 1.66416 43.0203 2.52045 43.0203Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M12.5118 43.0203C13.3681 43.0203 14.0622 42.3262 14.0622 41.4699C14.0622 40.6136 13.3681 39.9194 12.5118 39.9194C11.6555 39.9194 10.9613 40.6136 10.9613 41.4699C10.9613 42.3262 11.6555 43.0203 12.5118 43.0203Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M22.5038 43.0203C23.3601 43.0203 24.0543 42.3262 24.0543 41.4699C24.0543 40.6136 23.3601 39.9194 22.5038 39.9194C21.6475 39.9194 20.9534 40.6136 20.9534 41.4699C20.9534 42.3262 21.6475 43.0203 22.5038 43.0203Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M32.4958 43.0203C33.3521 43.0203 34.0463 42.3262 34.0463 41.4699C34.0463 40.6136 33.3521 39.9194 32.4958 39.9194C31.6395 39.9194 30.9454 40.6136 30.9454 41.4699C30.9454 42.3262 31.6395 43.0203 32.4958 43.0203Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M42.4875 43.0203C43.3438 43.0203 44.038 42.3262 44.038 41.4699C44.038 40.6136 43.3438 39.9194 42.4875 39.9194C41.6312 39.9194 40.9371 40.6136 40.9371 41.4699C40.9371 42.3262 41.6312 43.0203 42.4875 43.0203Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M52.4795 43.0203C53.3358 43.0203 54.03 42.3262 54.03 41.4699C54.03 40.6136 53.3358 39.9194 52.4795 39.9194C51.6233 39.9194 50.9291 40.6136 50.9291 41.4699C50.9291 42.3262 51.6233 43.0203 52.4795 43.0203Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M2.52045 53.0001C3.37674 53.0001 4.0709 52.3059 4.0709 51.4496C4.0709 50.5933 3.37674 49.8992 2.52045 49.8992C1.66416 49.8992 0.970001 50.5933 0.970001 51.4496C0.970001 52.3059 1.66416 53.0001 2.52045 53.0001Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M12.5118 53.0001C13.3681 53.0001 14.0622 52.3059 14.0622 51.4496C14.0622 50.5933 13.3681 49.8992 12.5118 49.8992C11.6555 49.8992 10.9613 50.5933 10.9613 51.4496C10.9613 52.3059 11.6555 53.0001 12.5118 53.0001Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M22.5038 53.0001C23.3601 53.0001 24.0543 52.3059 24.0543 51.4496C24.0543 50.5933 23.3601 49.8992 22.5038 49.8992C21.6475 49.8992 20.9534 50.5933 20.9534 51.4496C20.9534 52.3059 21.6475 53.0001 22.5038 53.0001Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M32.4958 53.0001C33.3521 53.0001 34.0463 52.3059 34.0463 51.4496C34.0463 50.5933 33.3521 49.8992 32.4958 49.8992C31.6395 49.8992 30.9454 50.5933 30.9454 51.4496C30.9454 52.3059 31.6395 53.0001 32.4958 53.0001Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M42.4875 53.0001C43.3438 53.0001 44.038 52.3059 44.038 51.4496C44.038 50.5933 43.3438 49.8992 42.4875 49.8992C41.6312 49.8992 40.9371 50.5933 40.9371 51.4496C40.9371 52.3059 41.6312 53.0001 42.4875 53.0001Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M52.4795 53.0001C53.3358 53.0001 54.03 52.3059 54.03 51.4496C54.03 50.5933 53.3358 49.8992 52.4795 49.8992C51.6233 49.8992 50.9291 50.5933 50.9291 51.4496C50.9291 52.3059 51.6233 53.0001 52.4795 53.0001Z"
|
||||
fill="#3758F9"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
290
themes/proxio/components/svg/SVGCircleBG.js
Normal file
290
themes/proxio/components/svg/SVGCircleBG.js
Normal file
@@ -0,0 +1,290 @@
|
||||
export const SVGCircleBG = () => {
|
||||
return <svg
|
||||
width="48"
|
||||
height="134"
|
||||
viewBox="0 0 48 134"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="132"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 132)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="117.333"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 117.333)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="102.667"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 102.667)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="88.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 88.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="73.3335"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 73.3335)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="45.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 45.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="16.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 16.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="59.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 59.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="30.6668"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 30.6668)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="45.6673"
|
||||
cy="1.66683"
|
||||
r="1.66667"
|
||||
transform="rotate(180 45.6673 1.66683)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="132"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 132)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="117.333"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 117.333)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="102.667"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 102.667)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="88.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 88.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="73.3335"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 73.3335)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="45.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 45.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="16.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 16.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="59.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 59.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="30.6668"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 30.6668)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="31.0013"
|
||||
cy="1.66683"
|
||||
r="1.66667"
|
||||
transform="rotate(180 31.0013 1.66683)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="132"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 132)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="117.333"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 117.333)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="102.667"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 102.667)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="88.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 88.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="73.3335"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 73.3335)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="45.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 45.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="16.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 16.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="59.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 59.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="30.6668"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 30.6668)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="16.3333"
|
||||
cy="1.66683"
|
||||
r="1.66667"
|
||||
transform="rotate(180 16.3333 1.66683)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="132"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 132)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="117.333"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 117.333)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="102.667"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 102.667)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="88.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 88.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="73.3335"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 73.3335)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="45.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 45.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="16.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 16.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="59.0001"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 59.0001)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="30.6668"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 30.6668)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
<circle
|
||||
cx="1.66732"
|
||||
cy="1.66683"
|
||||
r="1.66667"
|
||||
transform="rotate(180 1.66732 1.66683)"
|
||||
fill="#13C296"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
35
themes/proxio/components/svg/SVGCircleBG2.js
Normal file
35
themes/proxio/components/svg/SVGCircleBG2.js
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* 圆点背景图
|
||||
*/
|
||||
export const SVGCircleBg2 = () => {
|
||||
return <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="1.39737" cy="38.6026" r="1.39737" transform="rotate(-90 1.39737 38.6026)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="1.39737" cy="1.99122" r="1.39737" transform="rotate(-90 1.39737 1.99122)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="38.6026" r="1.39737" transform="rotate(-90 13.6943 38.6026)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="1.99122" r="1.39737" transform="rotate(-90 13.6943 1.99122)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="38.6026" r="1.39737" transform="rotate(-90 25.9911 38.6026)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="1.99122" r="1.39737" transform="rotate(-90 25.9911 1.99122)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="38.288" cy="38.6026" r="1.39737" transform="rotate(-90 38.288 38.6026)" fill="#3056D3" />
|
||||
<circle cx="38.288" cy="1.99122" r="1.39737" transform="rotate(-90 38.288 1.99122)" fill="#3056D3" />
|
||||
<circle cx="1.39737" cy="26.3057" r="1.39737" transform="rotate(-90 1.39737 26.3057)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="26.3057" r="1.39737" transform="rotate(-90 13.6943 26.3057)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="26.3057" r="1.39737" transform="rotate(-90 25.9911 26.3057)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="38.288" cy="26.3057" r="1.39737" transform="rotate(-90 38.288 26.3057)" fill="#3056D3" />
|
||||
<circle cx="1.39737" cy="14.0086" r="1.39737" transform="rotate(-90 1.39737 14.0086)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="13.6943" cy="14.0086" r="1.39737" transform="rotate(-90 13.6943 14.0086)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="25.9911" cy="14.0086" r="1.39737" transform="rotate(-90 25.9911 14.0086)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="38.288" cy="14.0086" r="1.39737" transform="rotate(-90 38.288 14.0086)" fill="#3056D3" />
|
||||
</svg>
|
||||
}
|
||||
24
themes/proxio/components/svg/SVGCircleBG3.js
Normal file
24
themes/proxio/components/svg/SVGCircleBG3.js
Normal file
@@ -0,0 +1,24 @@
|
||||
export const SVGCircleBG3 = () => {
|
||||
return <svg width="29" height="40" viewBox="0 0 29 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="2.288" cy="25.9912" r="1.39737" transform="rotate(-90 2.288 25.9912)" fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="25.9911" r="1.39737" transform="rotate(-90 14.5849 25.9911)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="25.9911" r="1.39737" transform="rotate(-90 26.7216 25.9911)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="2.288" cy="13.6944" r="1.39737" transform="rotate(-90 2.288 13.6944)" fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="13.6943" r="1.39737" transform="rotate(-90 14.5849 13.6943)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="13.6943" r="1.39737" transform="rotate(-90 26.7216 13.6943)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="2.288" cy="38.0087" r="1.39737" transform="rotate(-90 2.288 38.0087)" fill="#3056D3" />
|
||||
<circle cx="2.288" cy="1.39739" r="1.39737" transform="rotate(-90 2.288 1.39739)" fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="38.0089" r="1.39737" transform="rotate(-90 14.5849 38.0089)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="38.0089" r="1.39737" transform="rotate(-90 26.7216 38.0089)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="14.5849" cy="1.39761" r="1.39737" transform="rotate(-90 14.5849 1.39761)"
|
||||
fill="#3056D3" />
|
||||
<circle cx="26.7216" cy="1.39761" r="1.39737" transform="rotate(-90 26.7216 1.39761)"
|
||||
fill="#3056D3" />
|
||||
</svg>
|
||||
}
|
||||
46
themes/proxio/components/svg/SVGDesign.js
Normal file
46
themes/proxio/components/svg/SVGDesign.js
Normal file
@@ -0,0 +1,46 @@
|
||||
export const SVGDesign = () => {
|
||||
return <svg
|
||||
width="37"
|
||||
height="37"
|
||||
viewBox="0 0 37 37"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M33.5613 21.4677L31.3675 20.1177C30.805 19.7239 30.0175 19.9489 29.6238 20.5114C29.23 21.1302 29.455 21.8614 30.0175 22.2552L31.48 23.2114L18.1488 31.5927L4.76127 23.2114L6.22377 22.2552C6.84252 21.8614 7.01127 21.0739 6.61752 20.5114C6.22377 19.8927 5.43627 19.7239 4.87377 20.1177L2.68002 21.4677C2.11752 21.8614 1.72377 22.4802 1.72377 23.1552C1.72377 23.8302 2.06127 24.5052 2.68002 24.8427L17.08 33.8989C17.4175 34.1239 17.755 34.1802 18.1488 34.1802C18.5425 34.1802 18.88 34.0677 19.2175 33.8989L33.5613 24.8989C34.1238 24.5052 34.5175 23.8864 34.5175 23.2114C34.5175 22.5364 34.18 21.8614 33.5613 21.4677Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M20.1175 20.4552L18.1488 21.6364L16.18 20.3989C15.5613 20.0052 14.83 20.2302 14.4363 20.7927C14.0425 21.4114 14.2675 22.1427 14.83 22.5364L17.4738 24.1677C17.6988 24.2802 17.9238 24.3364 18.1488 24.3364C18.3738 24.3364 18.5988 24.2802 18.8238 24.1677L21.4675 22.5364C22.0863 22.1427 22.255 21.3552 21.8613 20.7927C21.4675 20.2302 20.68 20.0614 20.1175 20.4552Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M7.74252 18.0927L11.455 20.4552C11.68 20.5677 11.905 20.6239 12.13 20.6239C12.5238 20.6239 12.9738 20.3989 13.1988 20.0052C13.5925 19.3864 13.3675 18.6552 12.805 18.2614L9.09252 15.8989C8.47377 15.5052 7.74252 15.7302 7.34877 16.2927C6.95502 16.9677 7.12377 17.7552 7.74252 18.0927Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M5.04252 16.1802C5.43627 16.1802 5.88627 15.9552 6.11127 15.5614C6.50502 14.9427 6.28002 14.2114 5.71752 13.8177L4.81752 13.2552L5.71752 12.6927C6.33627 12.2989 6.50502 11.5114 6.11127 10.9489C5.71752 10.3302 4.93002 10.1614 4.36752 10.5552L1.72377 12.1864C1.33002 12.4114 1.10502 12.8052 1.10502 13.2552C1.10502 13.7052 1.33002 14.0989 1.72377 14.3239L4.36752 15.9552C4.53627 16.1239 4.76127 16.1802 5.04252 16.1802Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M8.41752 10.7239C8.64252 10.7239 8.86752 10.6677 9.09252 10.5552L12.805 8.1927C13.4238 7.79895 13.5925 7.01145 13.1988 6.44895C12.805 5.8302 12.0175 5.66145 11.455 6.0552L7.74252 8.4177C7.12377 8.81145 6.95502 9.59895 7.34877 10.1614C7.57377 10.4989 7.96752 10.7239 8.41752 10.7239Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M16.18 6.05522L18.1488 4.81772L20.1175 6.05522C20.3425 6.16772 20.5675 6.22397 20.7925 6.22397C21.1863 6.22397 21.6363 5.99897 21.8613 5.60522C22.255 4.98647 22.03 4.25522 21.4675 3.86147L18.8238 2.23022C18.43 1.94897 17.8675 1.94897 17.4738 2.23022L14.83 3.86147C14.2113 4.25522 14.0425 5.04272 14.4363 5.60522C14.83 6.16772 15.6175 6.44897 16.18 6.05522Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M23.4925 8.19267L27.205 10.5552C27.43 10.6677 27.655 10.7239 27.88 10.7239C28.2738 10.7239 28.7238 10.4989 28.9488 10.1052C29.3425 9.48642 29.1175 8.75517 28.555 8.36142L24.8425 5.99892C24.28 5.60517 23.4925 5.83017 23.0988 6.39267C22.705 7.01142 22.8738 7.79892 23.4925 8.19267Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M34.5738 12.1864L31.93 10.5552C31.3675 10.1614 30.58 10.3864 30.1863 10.9489C29.7925 11.5677 30.0175 12.2989 30.58 12.6927L31.48 13.2552L30.58 13.8177C29.9613 14.2114 29.7925 14.9989 30.1863 15.5614C30.4113 15.9552 30.8613 16.1802 31.255 16.1802C31.48 16.1802 31.705 16.1239 31.93 16.0114L34.5738 14.3802C34.9675 14.1552 35.1925 13.7614 35.1925 13.3114C35.1925 12.8614 34.9675 12.4114 34.5738 12.1864Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M24.1675 20.624C24.3925 20.624 24.6175 20.5677 24.8425 20.4552L28.555 18.0927C29.1738 17.699 29.3425 16.9115 28.9488 16.349C28.555 15.7302 27.7675 15.5615 27.205 15.9552L23.4925 18.3177C22.8738 18.7115 22.705 19.499 23.0988 20.0615C23.3238 20.4552 23.7175 20.624 24.1675 20.624Z"
|
||||
fill="white"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
12
themes/proxio/components/svg/SVGEmail.js
Normal file
12
themes/proxio/components/svg/SVGEmail.js
Normal file
@@ -0,0 +1,12 @@
|
||||
export const SVGEmail = () => {
|
||||
return <svg
|
||||
width="34"
|
||||
height="25"
|
||||
viewBox="0 0 34 25"
|
||||
className="fill-current"
|
||||
>
|
||||
<path
|
||||
d="M30.5156 0.960938H3.17188C1.42188 0.960938 0 2.38281 0 4.13281V20.9219C0 22.6719 1.42188 24.0938 3.17188 24.0938H30.5156C32.2656 24.0938 33.6875 22.6719 33.6875 20.9219V4.13281C33.6875 2.38281 32.2656 0.960938 30.5156 0.960938ZM30.5156 2.875C30.7891 2.875 31.0078 2.92969 31.2266 3.09375L17.6094 11.3516C17.1172 11.625 16.5703 11.625 16.0781 11.3516L2.46094 3.09375C2.67969 2.98438 2.89844 2.875 3.17188 2.875H30.5156ZM30.5156 22.125H3.17188C2.51562 22.125 1.91406 21.5781 1.91406 20.8672V5.00781L15.0391 12.9922C15.5859 13.3203 16.1875 13.4844 16.7891 13.4844C17.3906 13.4844 17.9922 13.3203 18.5391 12.9922L31.6641 5.00781V20.8672C31.7734 21.5781 31.1719 22.125 30.5156 22.125Z"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
26
themes/proxio/components/svg/SVGEssential.js
Normal file
26
themes/proxio/components/svg/SVGEssential.js
Normal file
@@ -0,0 +1,26 @@
|
||||
export const SVGEssential = () => {
|
||||
return <svg
|
||||
width="37"
|
||||
height="37"
|
||||
viewBox="0 0 37 37"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M12.355 2.0614H5.21129C3.29879 2.0614 1.72379 3.6364 1.72379 5.5489V12.6927C1.72379 14.6052 3.29879 16.1802 5.21129 16.1802H12.355C14.2675 16.1802 15.8425 14.6052 15.8425 12.6927V5.60515C15.8988 3.6364 14.3238 2.0614 12.355 2.0614ZM13.3675 12.7489C13.3675 13.3114 12.9175 13.7614 12.355 13.7614H5.21129C4.64879 13.7614 4.19879 13.3114 4.19879 12.7489V5.60515C4.19879 5.04265 4.64879 4.59265 5.21129 4.59265H12.355C12.9175 4.59265 13.3675 5.04265 13.3675 5.60515V12.7489Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M31.0863 2.0614H23.9425C22.03 2.0614 20.455 3.6364 20.455 5.5489V12.6927C20.455 14.6052 22.03 16.1802 23.9425 16.1802H31.0863C32.9988 16.1802 34.5738 14.6052 34.5738 12.6927V5.60515C34.5738 3.6364 32.9988 2.0614 31.0863 2.0614ZM32.0988 12.7489C32.0988 13.3114 31.6488 13.7614 31.0863 13.7614H23.9425C23.38 13.7614 22.93 13.3114 22.93 12.7489V5.60515C22.93 5.04265 23.38 4.59265 23.9425 4.59265H31.0863C31.6488 4.59265 32.0988 5.04265 32.0988 5.60515V12.7489Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M12.355 20.0051H5.21129C3.29879 20.0051 1.72379 21.5801 1.72379 23.4926V30.6364C1.72379 32.5489 3.29879 34.1239 5.21129 34.1239H12.355C14.2675 34.1239 15.8425 32.5489 15.8425 30.6364V23.5489C15.8988 21.5801 14.3238 20.0051 12.355 20.0051ZM13.3675 30.6926C13.3675 31.2551 12.9175 31.7051 12.355 31.7051H5.21129C4.64879 31.7051 4.19879 31.2551 4.19879 30.6926V23.5489C4.19879 22.9864 4.64879 22.5364 5.21129 22.5364H12.355C12.9175 22.5364 13.3675 22.9864 13.3675 23.5489V30.6926Z"
|
||||
fill="white"
|
||||
/>
|
||||
<path
|
||||
d="M31.0863 20.0051H23.9425C22.03 20.0051 20.455 21.5801 20.455 23.4926V30.6364C20.455 32.5489 22.03 34.1239 23.9425 34.1239H31.0863C32.9988 34.1239 34.5738 32.5489 34.5738 30.6364V23.5489C34.5738 21.5801 32.9988 20.0051 31.0863 20.0051ZM32.0988 30.6926C32.0988 31.2551 31.6488 31.7051 31.0863 31.7051H23.9425C23.38 31.7051 22.93 31.2551 22.93 30.6926V23.5489C22.93 22.9864 23.38 22.5364 23.9425 22.5364H31.0863C31.6488 22.5364 32.0988 22.9864 32.0988 23.5489V30.6926Z"
|
||||
fill="white"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
15
themes/proxio/components/svg/SVGFacebook.js
Normal file
15
themes/proxio/components/svg/SVGFacebook.js
Normal file
@@ -0,0 +1,15 @@
|
||||
export const SVGFacebook = ({ className }) => {
|
||||
return <svg
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 18 18"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className={className}
|
||||
>
|
||||
<path
|
||||
d="M13.3315 7.25625H11.7565H11.194V6.69375V4.95V4.3875H11.7565H12.9377C13.2471 4.3875 13.5002 4.1625 13.5002 3.825V0.84375C13.5002 0.534375 13.2752 0.28125 12.9377 0.28125H10.8846C8.66272 0.28125 7.11584 1.85625 7.11584 4.19062V6.6375V7.2H6.55334H4.64084C4.24709 7.2 3.88147 7.50937 3.88147 7.95937V9.98438C3.88147 10.3781 4.19084 10.7438 4.64084 10.7438H6.49709H7.05959V11.3063V16.9594C7.05959 17.3531 7.36897 17.7188 7.81897 17.7188H10.4627C10.6315 17.7188 10.7721 17.6344 10.8846 17.5219C10.9971 17.4094 11.0815 17.2125 11.0815 17.0437V11.3344V10.7719H11.6721H12.9377C13.3033 10.7719 13.5846 10.5469 13.6408 10.2094V10.1813V10.1531L14.0346 8.2125C14.0627 8.01562 14.0346 7.79063 13.8658 7.56562C13.8096 7.425 13.5565 7.28437 13.3315 7.25625Z"
|
||||
fill=""
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
255
themes/proxio/components/svg/SVGFooterCircleBG.js
Normal file
255
themes/proxio/components/svg/SVGFooterCircleBG.js
Normal file
@@ -0,0 +1,255 @@
|
||||
export const SVGFooterCircleBG = () => {
|
||||
return <svg
|
||||
width="102"
|
||||
height="102"
|
||||
viewBox="0 0 102 102"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M1.8667 33.1956C2.89765 33.1956 3.7334 34.0318 3.7334 35.0633C3.7334 36.0947 2.89765 36.9309 1.8667 36.9309C0.835744 36.9309 4.50645e-08 36.0947 0 35.0633C-4.50645e-08 34.0318 0.835744 33.1956 1.8667 33.1956Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M18.2939 33.1956C19.3249 33.1956 20.1606 34.0318 20.1606 35.0633C20.1606 36.0947 19.3249 36.9309 18.2939 36.9309C17.263 36.9309 16.4272 36.0947 16.4272 35.0633C16.4272 34.0318 17.263 33.1956 18.2939 33.1956Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M34.7209 33.195C35.7519 33.195 36.5876 34.0311 36.5876 35.0626C36.5876 36.0941 35.7519 36.9303 34.7209 36.9303C33.69 36.9303 32.8542 36.0941 32.8542 35.0626C32.8542 34.0311 33.69 33.195 34.7209 33.195Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M50.9341 33.195C51.965 33.195 52.8008 34.0311 52.8008 35.0626C52.8008 36.0941 51.965 36.9303 50.9341 36.9303C49.9031 36.9303 49.0674 36.0941 49.0674 35.0626C49.0674 34.0311 49.9031 33.195 50.9341 33.195Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M1.8667 16.7605C2.89765 16.7605 3.7334 17.5966 3.7334 18.6281C3.7334 19.6596 2.89765 20.4957 1.8667 20.4957C0.835744 20.4957 4.50645e-08 19.6596 0 18.6281C-4.50645e-08 17.5966 0.835744 16.7605 1.8667 16.7605Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M18.2939 16.7605C19.3249 16.7605 20.1606 17.5966 20.1606 18.6281C20.1606 19.6596 19.3249 20.4957 18.2939 20.4957C17.263 20.4957 16.4272 19.6596 16.4272 18.6281C16.4272 17.5966 17.263 16.7605 18.2939 16.7605Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M34.7209 16.7605C35.7519 16.7605 36.5876 17.5966 36.5876 18.6281C36.5876 19.6596 35.7519 20.4957 34.7209 20.4957C33.69 20.4957 32.8542 19.6596 32.8542 18.6281C32.8542 17.5966 33.69 16.7605 34.7209 16.7605Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M50.9341 16.7605C51.965 16.7605 52.8008 17.5966 52.8008 18.6281C52.8008 19.6596 51.965 20.4957 50.9341 20.4957C49.9031 20.4957 49.0674 19.6596 49.0674 18.6281C49.0674 17.5966 49.9031 16.7605 50.9341 16.7605Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M1.8667 0.324951C2.89765 0.324951 3.7334 1.16115 3.7334 2.19261C3.7334 3.22408 2.89765 4.06024 1.8667 4.06024C0.835744 4.06024 4.50645e-08 3.22408 0 2.19261C-4.50645e-08 1.16115 0.835744 0.324951 1.8667 0.324951Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M18.2939 0.324951C19.3249 0.324951 20.1606 1.16115 20.1606 2.19261C20.1606 3.22408 19.3249 4.06024 18.2939 4.06024C17.263 4.06024 16.4272 3.22408 16.4272 2.19261C16.4272 1.16115 17.263 0.324951 18.2939 0.324951Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M34.7209 0.325302C35.7519 0.325302 36.5876 1.16147 36.5876 2.19293C36.5876 3.2244 35.7519 4.06056 34.7209 4.06056C33.69 4.06056 32.8542 3.2244 32.8542 2.19293C32.8542 1.16147 33.69 0.325302 34.7209 0.325302Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M50.9341 0.325302C51.965 0.325302 52.8008 1.16147 52.8008 2.19293C52.8008 3.2244 51.965 4.06056 50.9341 4.06056C49.9031 4.06056 49.0674 3.2244 49.0674 2.19293C49.0674 1.16147 49.9031 0.325302 50.9341 0.325302Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M66.9037 33.1956C67.9346 33.1956 68.7704 34.0318 68.7704 35.0633C68.7704 36.0947 67.9346 36.9309 66.9037 36.9309C65.8727 36.9309 65.037 36.0947 65.037 35.0633C65.037 34.0318 65.8727 33.1956 66.9037 33.1956Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M83.3307 33.1956C84.3616 33.1956 85.1974 34.0318 85.1974 35.0633C85.1974 36.0947 84.3616 36.9309 83.3307 36.9309C82.2997 36.9309 81.464 36.0947 81.464 35.0633C81.464 34.0318 82.2997 33.1956 83.3307 33.1956Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M99.7576 33.1956C100.789 33.1956 101.624 34.0318 101.624 35.0633C101.624 36.0947 100.789 36.9309 99.7576 36.9309C98.7266 36.9309 97.8909 36.0947 97.8909 35.0633C97.8909 34.0318 98.7266 33.1956 99.7576 33.1956Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M66.9037 16.7605C67.9346 16.7605 68.7704 17.5966 68.7704 18.6281C68.7704 19.6596 67.9346 20.4957 66.9037 20.4957C65.8727 20.4957 65.037 19.6596 65.037 18.6281C65.037 17.5966 65.8727 16.7605 66.9037 16.7605Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M83.3307 16.7605C84.3616 16.7605 85.1974 17.5966 85.1974 18.6281C85.1974 19.6596 84.3616 20.4957 83.3307 20.4957C82.2997 20.4957 81.464 19.6596 81.464 18.6281C81.464 17.5966 82.2997 16.7605 83.3307 16.7605Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M99.7576 16.7605C100.789 16.7605 101.624 17.5966 101.624 18.6281C101.624 19.6596 100.789 20.4957 99.7576 20.4957C98.7266 20.4957 97.8909 19.6596 97.8909 18.6281C97.8909 17.5966 98.7266 16.7605 99.7576 16.7605Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M66.9037 0.324966C67.9346 0.324966 68.7704 1.16115 68.7704 2.19261C68.7704 3.22408 67.9346 4.06024 66.9037 4.06024C65.8727 4.06024 65.037 3.22408 65.037 2.19261C65.037 1.16115 65.8727 0.324966 66.9037 0.324966Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M83.3307 0.324951C84.3616 0.324951 85.1974 1.16115 85.1974 2.19261C85.1974 3.22408 84.3616 4.06024 83.3307 4.06024C82.2997 4.06024 81.464 3.22408 81.464 2.19261C81.464 1.16115 82.2997 0.324951 83.3307 0.324951Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M99.7576 0.324951C100.789 0.324951 101.624 1.16115 101.624 2.19261C101.624 3.22408 100.789 4.06024 99.7576 4.06024C98.7266 4.06024 97.8909 3.22408 97.8909 2.19261C97.8909 1.16115 98.7266 0.324951 99.7576 0.324951Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M1.8667 82.2029C2.89765 82.2029 3.7334 83.039 3.7334 84.0705C3.7334 85.102 2.89765 85.9382 1.8667 85.9382C0.835744 85.9382 4.50645e-08 85.102 0 84.0705C-4.50645e-08 83.039 0.835744 82.2029 1.8667 82.2029Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M18.2939 82.2029C19.3249 82.2029 20.1606 83.039 20.1606 84.0705C20.1606 85.102 19.3249 85.9382 18.2939 85.9382C17.263 85.9382 16.4272 85.102 16.4272 84.0705C16.4272 83.039 17.263 82.2029 18.2939 82.2029Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M34.7209 82.2026C35.7519 82.2026 36.5876 83.0387 36.5876 84.0702C36.5876 85.1017 35.7519 85.9378 34.7209 85.9378C33.69 85.9378 32.8542 85.1017 32.8542 84.0702C32.8542 83.0387 33.69 82.2026 34.7209 82.2026Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M50.9341 82.2026C51.965 82.2026 52.8008 83.0387 52.8008 84.0702C52.8008 85.1017 51.965 85.9378 50.9341 85.9378C49.9031 85.9378 49.0674 85.1017 49.0674 84.0702C49.0674 83.0387 49.9031 82.2026 50.9341 82.2026Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M1.8667 65.7677C2.89765 65.7677 3.7334 66.6039 3.7334 67.6353C3.7334 68.6668 2.89765 69.503 1.8667 69.503C0.835744 69.503 4.50645e-08 68.6668 0 67.6353C-4.50645e-08 66.6039 0.835744 65.7677 1.8667 65.7677Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M18.2939 65.7677C19.3249 65.7677 20.1606 66.6039 20.1606 67.6353C20.1606 68.6668 19.3249 69.503 18.2939 69.503C17.263 69.503 16.4272 68.6668 16.4272 67.6353C16.4272 66.6039 17.263 65.7677 18.2939 65.7677Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M34.7209 65.7674C35.7519 65.7674 36.5876 66.6036 36.5876 67.635C36.5876 68.6665 35.7519 69.5027 34.7209 69.5027C33.69 69.5027 32.8542 68.6665 32.8542 67.635C32.8542 66.6036 33.69 65.7674 34.7209 65.7674Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M50.9341 65.7674C51.965 65.7674 52.8008 66.6036 52.8008 67.635C52.8008 68.6665 51.965 69.5027 50.9341 69.5027C49.9031 69.5027 49.0674 68.6665 49.0674 67.635C49.0674 66.6036 49.9031 65.7674 50.9341 65.7674Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M1.8667 98.2644C2.89765 98.2644 3.7334 99.1005 3.7334 100.132C3.7334 101.163 2.89765 102 1.8667 102C0.835744 102 4.50645e-08 101.163 0 100.132C-4.50645e-08 99.1005 0.835744 98.2644 1.8667 98.2644Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M1.8667 49.3322C2.89765 49.3322 3.7334 50.1684 3.7334 51.1998C3.7334 52.2313 2.89765 53.0675 1.8667 53.0675C0.835744 53.0675 4.50645e-08 52.2313 0 51.1998C-4.50645e-08 50.1684 0.835744 49.3322 1.8667 49.3322Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M18.2939 98.2644C19.3249 98.2644 20.1606 99.1005 20.1606 100.132C20.1606 101.163 19.3249 102 18.2939 102C17.263 102 16.4272 101.163 16.4272 100.132C16.4272 99.1005 17.263 98.2644 18.2939 98.2644Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M18.2939 49.3322C19.3249 49.3322 20.1606 50.1684 20.1606 51.1998C20.1606 52.2313 19.3249 53.0675 18.2939 53.0675C17.263 53.0675 16.4272 52.2313 16.4272 51.1998C16.4272 50.1684 17.263 49.3322 18.2939 49.3322Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M34.7209 98.2647C35.7519 98.2647 36.5876 99.1008 36.5876 100.132C36.5876 101.164 35.7519 102 34.7209 102C33.69 102 32.8542 101.164 32.8542 100.132C32.8542 99.1008 33.69 98.2647 34.7209 98.2647Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M50.9341 98.2647C51.965 98.2647 52.8008 99.1008 52.8008 100.132C52.8008 101.164 51.965 102 50.9341 102C49.9031 102 49.0674 101.164 49.0674 100.132C49.0674 99.1008 49.9031 98.2647 50.9341 98.2647Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M34.7209 49.3326C35.7519 49.3326 36.5876 50.1687 36.5876 51.2002C36.5876 52.2317 35.7519 53.0678 34.7209 53.0678C33.69 53.0678 32.8542 52.2317 32.8542 51.2002C32.8542 50.1687 33.69 49.3326 34.7209 49.3326Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M50.9341 49.3326C51.965 49.3326 52.8008 50.1687 52.8008 51.2002C52.8008 52.2317 51.965 53.0678 50.9341 53.0678C49.9031 53.0678 49.0674 52.2317 49.0674 51.2002C49.0674 50.1687 49.9031 49.3326 50.9341 49.3326Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M66.9037 82.2029C67.9346 82.2029 68.7704 83.0391 68.7704 84.0705C68.7704 85.102 67.9346 85.9382 66.9037 85.9382C65.8727 85.9382 65.037 85.102 65.037 84.0705C65.037 83.0391 65.8727 82.2029 66.9037 82.2029Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M83.3307 82.2029C84.3616 82.2029 85.1974 83.0391 85.1974 84.0705C85.1974 85.102 84.3616 85.9382 83.3307 85.9382C82.2997 85.9382 81.464 85.102 81.464 84.0705C81.464 83.0391 82.2997 82.2029 83.3307 82.2029Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M99.7576 82.2029C100.789 82.2029 101.624 83.039 101.624 84.0705C101.624 85.102 100.789 85.9382 99.7576 85.9382C98.7266 85.9382 97.8909 85.102 97.8909 84.0705C97.8909 83.039 98.7266 82.2029 99.7576 82.2029Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M66.9037 65.7674C67.9346 65.7674 68.7704 66.6036 68.7704 67.635C68.7704 68.6665 67.9346 69.5027 66.9037 69.5027C65.8727 69.5027 65.037 68.6665 65.037 67.635C65.037 66.6036 65.8727 65.7674 66.9037 65.7674Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M83.3307 65.7677C84.3616 65.7677 85.1974 66.6039 85.1974 67.6353C85.1974 68.6668 84.3616 69.503 83.3307 69.503C82.2997 69.503 81.464 68.6668 81.464 67.6353C81.464 66.6039 82.2997 65.7677 83.3307 65.7677Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M99.7576 65.7677C100.789 65.7677 101.624 66.6039 101.624 67.6353C101.624 68.6668 100.789 69.503 99.7576 69.503C98.7266 69.503 97.8909 68.6668 97.8909 67.6353C97.8909 66.6039 98.7266 65.7677 99.7576 65.7677Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M66.9037 98.2644C67.9346 98.2644 68.7704 99.1005 68.7704 100.132C68.7704 101.163 67.9346 102 66.9037 102C65.8727 102 65.037 101.163 65.037 100.132C65.037 99.1005 65.8727 98.2644 66.9037 98.2644Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M66.9037 49.3322C67.9346 49.3322 68.7704 50.1684 68.7704 51.1998C68.7704 52.2313 67.9346 53.0675 66.9037 53.0675C65.8727 53.0675 65.037 52.2313 65.037 51.1998C65.037 50.1684 65.8727 49.3322 66.9037 49.3322Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M83.3307 98.2644C84.3616 98.2644 85.1974 99.1005 85.1974 100.132C85.1974 101.163 84.3616 102 83.3307 102C82.2997 102 81.464 101.163 81.464 100.132C81.464 99.1005 82.2997 98.2644 83.3307 98.2644Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M83.3307 49.3322C84.3616 49.3322 85.1974 50.1684 85.1974 51.1998C85.1974 52.2313 84.3616 53.0675 83.3307 53.0675C82.2997 53.0675 81.464 52.2313 81.464 51.1998C81.464 50.1684 82.2997 49.3322 83.3307 49.3322Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M99.7576 98.2644C100.789 98.2644 101.624 99.1005 101.624 100.132C101.624 101.163 100.789 102 99.7576 102C98.7266 102 97.8909 101.163 97.8909 100.132C97.8909 99.1005 98.7266 98.2644 99.7576 98.2644Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
<path
|
||||
d="M99.7576 49.3322C100.789 49.3322 101.624 50.1684 101.624 51.1998C101.624 52.2313 100.789 53.0675 99.7576 53.0675C98.7266 53.0675 97.8909 52.2313 97.8909 51.1998C97.8909 50.1684 98.7266 49.3322 99.7576 49.3322Z"
|
||||
fill="white"
|
||||
fillOpacity="0.08"
|
||||
></path>
|
||||
</svg>
|
||||
}
|
||||
14
themes/proxio/components/svg/SVGGifts.js
Normal file
14
themes/proxio/components/svg/SVGGifts.js
Normal file
@@ -0,0 +1,14 @@
|
||||
export const SVGGifts = () => {
|
||||
return <svg
|
||||
width="37"
|
||||
height="37"
|
||||
viewBox="0 0 37 37"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M30.5801 8.30514H27.9926C28.6113 7.85514 29.1176 7.34889 29.3426 6.73014C29.6801 5.88639 29.6801 4.48014 27.9363 2.84889C26.0801 1.04889 24.3926 1.04889 23.3238 1.33014C20.9051 1.94889 19.2738 4.76139 18.3738 6.78639C17.4738 4.76139 15.8426 2.00514 13.4238 1.33014C12.3551 1.04889 10.6676 1.10514 8.81133 2.84889C7.06758 4.53639 7.12383 5.88639 7.40508 6.73014C7.63008 7.34889 8.13633 7.85514 8.75508 8.30514H5.71758C4.08633 8.30514 2.73633 9.65514 2.73633 11.2864V14.9989C2.73633 16.5739 4.03008 17.8676 5.60508 17.9239V31.6489C5.60508 33.5614 7.18008 35.1926 9.14883 35.1926H27.5426C29.4551 35.1926 31.0863 33.6176 31.0863 31.6489V17.8676C32.4926 17.6426 33.5613 16.4051 33.5613 14.9426V11.2301C33.5613 9.59889 32.2113 8.30514 30.5801 8.30514ZM23.9426 3.69264C23.9988 3.69264 24.1676 3.63639 24.3363 3.63639C24.7301 3.63639 25.3488 3.80514 26.1926 4.59264C26.8676 5.21139 27.0363 5.66139 26.9801 5.77389C26.6988 6.56139 23.8863 7.40514 20.6801 7.74264C21.4676 5.99889 22.6488 4.03014 23.9426 3.69264ZM10.4988 4.64889C11.3426 3.86139 11.9613 3.69264 12.3551 3.69264C12.5238 3.69264 12.6363 3.74889 12.7488 3.74889C14.0426 4.08639 15.2801 5.99889 16.0676 7.79889C12.8613 7.46139 10.0488 6.61764 9.76758 5.83014C9.71133 5.66139 9.88008 5.26764 10.4988 4.64889ZM5.26758 14.9426V11.2301C5.26758 11.0051 5.43633 10.7801 5.71758 10.7801H30.5801C30.8051 10.7801 31.0301 10.9489 31.0301 11.2301V14.9426C31.0301 15.1676 30.8613 15.3926 30.5801 15.3926H5.71758C5.49258 15.3926 5.26758 15.2239 5.26758 14.9426ZM27.5426 32.6614H9.14883C8.58633 32.6614 8.13633 32.2114 8.13633 31.6489V17.9239H28.4988V31.6489C28.5551 32.2114 28.1051 32.6614 27.5426 32.6614Z"
|
||||
fill="white"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
14
themes/proxio/components/svg/SVGGoogle.js
Normal file
14
themes/proxio/components/svg/SVGGoogle.js
Normal file
@@ -0,0 +1,14 @@
|
||||
export const SVGGoogle = ({ className }) => {
|
||||
return <svg
|
||||
className={className}
|
||||
width="18"
|
||||
|
||||
height="18"
|
||||
viewBox="0 0 18 18"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M17.8477 8.17132H9.29628V10.643H15.4342C15.1065 14.0743 12.2461 15.5574 9.47506 15.5574C5.95916 15.5574 2.8306 12.8821 2.8306 9.01461C2.8306 5.29251 5.81018 2.47185 9.47506 2.47185C12.2759 2.47185 13.9742 4.24567 13.9742 4.24567L15.7024 2.47185C15.7024 2.47185 13.3783 0.000145544 9.35587 0.000145544C4.05223 -0.0289334 0 4.30383 0 8.98553C0 13.5218 3.81386 18 9.44526 18C14.4212 18 17.9967 14.7141 17.9967 9.79974C18.0264 8.78198 17.8477 8.17132 17.8477 8.17132Z"
|
||||
fill="white" />
|
||||
</svg>
|
||||
}
|
||||
23
themes/proxio/components/svg/SVGInstagram.js
Normal file
23
themes/proxio/components/svg/SVGInstagram.js
Normal file
@@ -0,0 +1,23 @@
|
||||
export const SVGInstagram = () => {
|
||||
return <svg
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 18 18"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className="fill-current"
|
||||
>
|
||||
<path
|
||||
d="M9.02429 11.8066C10.5742 11.8066 11.8307 10.5501 11.8307 9.00018C11.8307 7.45022 10.5742 6.19373 9.02429 6.19373C7.47433 6.19373 6.21783 7.45022 6.21783 9.00018C6.21783 10.5501 7.47433 11.8066 9.02429 11.8066Z"
|
||||
fill=""
|
||||
/>
|
||||
<path
|
||||
d="M12.0726 1.5H5.92742C3.48387 1.5 1.5 3.48387 1.5 5.92742V12.0242C1.5 14.5161 3.48387 16.5 5.92742 16.5H12.0242C14.5161 16.5 16.5 14.5161 16.5 12.0726V5.92742C16.5 3.48387 14.5161 1.5 12.0726 1.5ZM9.02419 12.6774C6.96774 12.6774 5.34677 11.0081 5.34677 9C5.34677 6.99194 6.99194 5.32258 9.02419 5.32258C11.0323 5.32258 12.6774 6.99194 12.6774 9C12.6774 11.0081 11.0565 12.6774 9.02419 12.6774ZM14.1048 5.66129C13.8629 5.92742 13.5 6.07258 13.0887 6.07258C12.7258 6.07258 12.3629 5.92742 12.0726 5.66129C11.8065 5.39516 11.6613 5.05645 11.6613 4.64516C11.6613 4.23387 11.8065 3.91935 12.0726 3.62903C12.3387 3.33871 12.6774 3.19355 13.0887 3.19355C13.4516 3.19355 13.8387 3.33871 14.1048 3.60484C14.3468 3.91935 14.5161 4.28226 14.5161 4.66935C14.4919 5.05645 14.3468 5.39516 14.1048 5.66129Z"
|
||||
fill=""
|
||||
/>
|
||||
<path
|
||||
d="M13.1135 4.06433C12.799 4.06433 12.5329 4.33046 12.5329 4.64498C12.5329 4.95949 12.799 5.22562 13.1135 5.22562C13.428 5.22562 13.6942 4.95949 13.6942 4.64498C13.6942 4.33046 13.4522 4.06433 13.1135 4.06433Z"
|
||||
fill=""
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
14
themes/proxio/components/svg/SVGLeftArrow.js
Normal file
14
themes/proxio/components/svg/SVGLeftArrow.js
Normal file
@@ -0,0 +1,14 @@
|
||||
export const SVGLeftArrow = () => {
|
||||
return <svg
|
||||
className="fill-current"
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 22 22"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M19.25 10.2437H4.57187L10.4156 4.29687C10.725 3.9875 10.725 3.50625 10.4156 3.19687C10.1062 2.8875 9.625 2.8875 9.31562 3.19687L2.2 10.4156C1.89062 10.725 1.89062 11.2063 2.2 11.5156L9.31562 18.7344C9.45312 18.8719 9.65937 18.975 9.86562 18.975C10.0719 18.975 10.2437 18.9062 10.4156 18.7687C10.725 18.4594 10.725 17.9781 10.4156 17.6688L4.60625 11.7906H19.25C19.6625 11.7906 20.0063 11.4469 20.0063 11.0344C20.0063 10.5875 19.6625 10.2437 19.25 10.2437Z"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
15
themes/proxio/components/svg/SVGLocation.js
Normal file
15
themes/proxio/components/svg/SVGLocation.js
Normal file
@@ -0,0 +1,15 @@
|
||||
export const SVGLocation = () => {
|
||||
return <svg
|
||||
width="29"
|
||||
height="35"
|
||||
viewBox="0 0 29 35"
|
||||
className="fill-current"
|
||||
>
|
||||
<path
|
||||
d="M14.5 0.710938C6.89844 0.710938 0.664062 6.72656 0.664062 14.0547C0.664062 19.9062 9.03125 29.5859 12.6406 33.5234C13.1328 34.0703 13.7891 34.3437 14.5 34.3437C15.2109 34.3437 15.8672 34.0703 16.3594 33.5234C19.9688 29.6406 28.3359 19.9062 28.3359 14.0547C28.3359 6.67188 22.1016 0.710938 14.5 0.710938ZM14.9375 32.2109C14.6641 32.4844 14.2812 32.4844 14.0625 32.2109C11.3828 29.3125 2.57812 19.3594 2.57812 14.0547C2.57812 7.71094 7.9375 2.625 14.5 2.625C21.0625 2.625 26.4219 7.76562 26.4219 14.0547C26.4219 19.3594 17.6172 29.2578 14.9375 32.2109Z"
|
||||
/>
|
||||
<path
|
||||
d="M14.5 8.58594C11.2734 8.58594 8.59375 11.2109 8.59375 14.4922C8.59375 17.7188 11.2187 20.3984 14.5 20.3984C17.7812 20.3984 20.4062 17.7734 20.4062 14.4922C20.4062 11.2109 17.7266 8.58594 14.5 8.58594ZM14.5 18.4297C12.3125 18.4297 10.5078 16.625 10.5078 14.4375C10.5078 12.25 12.3125 10.4453 14.5 10.4453C16.6875 10.4453 18.4922 12.25 18.4922 14.4375C18.4922 16.625 16.6875 18.4297 14.5 18.4297Z"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
28
themes/proxio/components/svg/SVGPlayAstro.js
Normal file
28
themes/proxio/components/svg/SVGPlayAstro.js
Normal file
@@ -0,0 +1,28 @@
|
||||
export default function SVGPlayAstro() {
|
||||
return <svg
|
||||
className="mt-0.5 fill-current"
|
||||
width="30"
|
||||
height="38"
|
||||
viewBox="0 0 30 38"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<g clipPath="url(#clip0_2412_2096)">
|
||||
<path
|
||||
d="M9.54022 32.0145C7.86872 30.4866 7.38074 27.2761 8.07717 24.9502C9.28468 26.4166 10.9578 26.8812 12.6908 27.1434C15.3662 27.548 17.9937 27.3967 20.479 26.1739C20.7633 26.0338 21.0261 25.8477 21.3368 25.6591C21.57 26.3357 21.6306 27.0187 21.5492 27.7139C21.3511 29.407 20.5086 30.7148 19.1685 31.7062C18.6326 32.1027 18.0656 32.4572 17.5121 32.8311C15.8119 33.9803 15.3519 35.3278 15.9907 37.2877C16.0059 37.3358 16.0195 37.3835 16.0538 37.5C15.1857 37.1114 14.5516 36.5456 14.0684 35.8018C13.5581 35.017 13.3153 34.1486 13.3026 33.209C13.2962 32.7518 13.2962 32.2905 13.2347 31.8397C13.0845 30.7407 12.5686 30.2486 11.5967 30.2203C10.5992 30.1912 9.81018 30.8078 9.60094 31.779C9.58497 31.8535 9.5618 31.9271 9.53863 32.0137L9.54022 32.0145Z"
|
||||
/>
|
||||
<path
|
||||
d="M0 24.5627C0 24.5627 4.94967 22.1515 9.91317 22.1515L13.6555 10.5697C13.7956 10.0096 14.2046 9.62894 14.6665 9.62894C15.1283 9.62894 15.5374 10.0096 15.6775 10.5697L19.4198 22.1515C25.2984 22.1515 29.333 24.5627 29.333 24.5627C29.333 24.5627 20.9256 1.65922 20.9092 1.61326C20.6679 0.936116 20.2605 0.5 19.7113 0.5H9.62256C9.07337 0.5 8.68245 0.936116 8.42473 1.61326C8.40654 1.65835 0 24.5627 0 24.5627Z"
|
||||
/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_2412_2096">
|
||||
<rect
|
||||
width="29.3925"
|
||||
height="37"
|
||||
transform="translate(0 0.5)"
|
||||
/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
}
|
||||
31
themes/proxio/components/svg/SVGPlayBoostrap.js
Normal file
31
themes/proxio/components/svg/SVGPlayBoostrap.js
Normal file
@@ -0,0 +1,31 @@
|
||||
export default function SVGPlayBootstrap() {
|
||||
return <svg
|
||||
className="fill-current"
|
||||
width="41"
|
||||
height="32"
|
||||
viewBox="0 0 41 32"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<mask
|
||||
id="mask0_2005_10788"
|
||||
style={{ maskType: 'luminance' }}
|
||||
maskUnits="userSpaceOnUse"
|
||||
x="0"
|
||||
y="0"
|
||||
width="41"
|
||||
height="32"
|
||||
>
|
||||
<path
|
||||
d="M0.521393 0.0454102H40.5214V31.9174H0.521393V0.0454102Z"
|
||||
/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_2005_10788)">
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M8.82951 0.048584C6.54719 0.048584 4.85835 2.04626 4.93395 4.21266C5.00655 6.29398 4.91223 8.98962 4.23366 11.1879C3.55264 13.3923 2.4017 14.7893 0.521393 14.9686V16.993C2.4017 17.1727 3.55264 18.5689 4.23358 20.7737C4.91223 22.9719 5.00647 25.6676 4.93387 27.7489C4.85827 29.915 6.54711 31.913 8.82983 31.913H32.2163C34.4987 31.913 36.1872 29.9153 36.1116 27.7489C36.039 25.6676 36.1333 22.9719 36.8119 20.7737C37.4929 18.5689 38.641 17.1721 40.5214 16.993V14.9686C38.6411 14.7889 37.493 13.3927 36.8119 11.1879C36.1332 8.9899 36.039 6.29398 36.1116 4.21266C36.1872 2.04654 34.4987 0.048584 32.2163 0.048584H8.82951ZM27.6401 19.6632C27.6401 22.6463 25.415 24.4554 21.7224 24.4554H15.4366C15.2568 24.4554 15.0844 24.3839 14.9572 24.2568C14.8301 24.1297 14.7587 23.9572 14.7587 23.7774V8.18422C14.7587 8.00442 14.8301 7.83194 14.9572 7.70482C15.0844 7.57766 15.2568 7.50626 15.4366 7.50626H21.6866C24.7656 7.50626 26.7863 9.17406 26.7863 11.7347C26.7863 13.5319 25.427 15.1409 23.6952 15.4228V15.5165C26.0526 15.7751 27.6401 17.408 27.6401 19.6632ZM21.037 9.65538H17.453V14.7179H20.4716C22.8052 14.7179 24.092 13.7782 24.092 12.0986C24.0917 10.5245 22.9855 9.65538 21.037 9.65538ZM17.453 16.7265V22.3055H21.1689C23.5986 22.3055 24.8856 21.3306 24.8856 19.4984C24.8856 17.6663 23.5625 16.7263 21.0126 16.7263L17.453 16.7265Z"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
}
|
||||
14
themes/proxio/components/svg/SVGPlayNext.js
Normal file
14
themes/proxio/components/svg/SVGPlayNext.js
Normal file
@@ -0,0 +1,14 @@
|
||||
export default function SVGPlayNext() {
|
||||
return <svg
|
||||
className="fill-current"
|
||||
width="41"
|
||||
height="40"
|
||||
viewBox="0 0 41 40"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M19.1914 0.0107542C19.1054 0.0185659 18.8322 0.0459068 18.5862 0.0654364C12.911 0.577104 7.59499 3.63931 4.22819 8.34588C2.35339 10.9628 1.15419 13.9313 0.700995 17.0755C0.540995 18.173 0.521393 18.4972 0.521393 19.9854C0.521393 21.4735 0.540995 21.7977 0.700995 22.8952C1.78699 30.3984 7.12619 36.7025 14.3678 39.0382C15.6646 39.4561 17.0314 39.7412 18.5862 39.9131C19.1914 39.9795 21.8082 39.9795 22.4138 39.9131C25.097 39.6163 27.3702 38.9523 29.6122 37.8078C29.9562 37.6321 30.0226 37.5852 29.9754 37.5462C29.9442 37.5227 28.4798 35.5581 26.7218 33.1833L23.527 28.8673L19.5234 22.9421C17.3206 19.6846 15.5082 17.0208 15.4926 17.0208C15.477 17.0169 15.4614 19.6495 15.4534 22.864C15.4418 28.4924 15.4378 28.7189 15.3678 28.8517C15.2662 29.0431 15.1878 29.1212 15.0238 29.2071C14.899 29.2696 14.7894 29.2813 14.1998 29.2813H13.5242L13.3442 29.1681C13.227 29.0938 13.1414 28.9962 13.0826 28.8829L13.0006 28.7072L13.0086 20.8759L13.0202 13.0407L13.1414 12.8884C13.2038 12.8064 13.3366 12.7009 13.4302 12.6502C13.5906 12.572 13.653 12.5642 14.3286 12.5642C15.1254 12.5642 15.2582 12.5955 15.4654 12.822C15.5238 12.8845 17.6914 16.1498 20.285 20.083C22.8786 24.0162 26.425 29.3868 28.167 32.0232L31.331 36.8158L31.491 36.7103C32.909 35.7885 34.4086 34.4761 35.5962 33.1091C38.123 30.207 39.7518 26.6683 40.2986 22.8952C40.459 21.7977 40.4786 21.4735 40.4786 19.9854C40.4786 18.4972 40.459 18.173 40.2986 17.0755C39.213 9.57232 33.8738 3.26825 26.6322 0.93254C25.355 0.518516 23.9958 0.233389 22.4722 0.0615304C22.0974 0.0224718 19.5158 -0.0204928 19.1914 0.0107542ZM27.3702 12.0955C27.5578 12.1892 27.7102 12.3689 27.765 12.5564C27.7962 12.658 27.8038 14.8296 27.7962 19.7237L27.7842 26.7464L26.5462 24.8482L25.3042 22.9499V17.845C25.3042 14.5445 25.3198 12.6892 25.343 12.5994C25.4058 12.3806 25.5422 12.2088 25.7298 12.1072C25.8902 12.0252 25.9486 12.0174 26.5618 12.0174C27.1398 12.0174 27.2414 12.0252 27.3702 12.0955Z"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
17
themes/proxio/components/svg/SVGPlayReact.js
Normal file
17
themes/proxio/components/svg/SVGPlayReact.js
Normal file
@@ -0,0 +1,17 @@
|
||||
export default function SVGPlayReact() {
|
||||
return <svg
|
||||
className="fill-current"
|
||||
width="41"
|
||||
height="36"
|
||||
viewBox="0 0 41 36"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M40.5214 17.9856C40.5214 15.3358 37.203 12.8245 32.1154 11.2673C33.2894 6.08177 32.7678 1.95622 30.4686 0.63539C29.9386 0.325566 29.3186 0.178806 28.6422 0.178806V1.99699C29.017 1.99699 29.3186 2.07037 29.5714 2.20897C30.6802 2.84493 31.1614 5.26645 30.7862 8.38101C30.6966 9.14741 30.5498 9.95457 30.3706 10.7781C28.7726 10.3867 27.0278 10.0851 25.1934 9.88937C24.0926 8.38101 22.951 7.01125 21.8014 5.81273C24.4594 3.34229 26.9542 1.98883 28.6502 1.98883V0.170654C26.4082 0.170654 23.473 1.7687 20.505 4.54081C17.5374 1.78501 14.6022 0.203266 12.3598 0.203266V2.02145C14.0478 2.02145 16.5506 3.36673 19.2086 5.82089C18.0674 7.01941 16.9258 8.38101 15.8414 9.88937C13.9986 10.0851 12.2538 10.3867 10.6558 10.7862C10.4686 9.97089 10.3298 9.18001 10.2318 8.42177C9.84859 5.30721 10.3218 2.88569 11.4222 2.24157C11.667 2.09483 11.985 2.0296 12.3598 2.0296V0.211422C11.675 0.211422 11.0554 0.358178 10.5174 0.668006C8.22619 1.98883 7.71259 6.10626 8.89499 11.2754C3.82339 12.8409 0.521393 15.3439 0.521393 17.9856C0.521393 20.6354 3.8398 23.1466 8.9274 24.7039C7.7534 29.8894 8.27499 34.0149 10.5742 35.3358C11.1042 35.6456 11.7242 35.7923 12.409 35.7923C14.651 35.7923 17.5862 34.1943 20.5542 31.4222C23.5218 34.178 26.457 35.7597 28.699 35.7597C29.3842 35.7597 30.0038 35.613 30.5418 35.3031C32.833 33.9823 33.3466 29.8649 32.1642 24.6957C37.2194 23.1385 40.5214 20.6273 40.5214 17.9856ZM29.9058 12.5473C29.6042 13.5991 29.229 14.6835 28.805 15.7679C28.471 15.1156 28.1202 14.4634 27.737 13.8111C27.3622 13.1588 26.9626 12.5229 26.563 11.9032C27.7206 12.0745 28.8378 12.2864 29.9058 12.5473ZM26.1718 21.2306C25.5358 22.3313 24.8834 23.3749 24.2066 24.3451C22.9918 24.4511 21.7606 24.5082 20.5214 24.5082C19.2902 24.5082 18.059 24.4511 16.8526 24.3533C16.1758 23.3831 15.5154 22.3476 14.8794 21.2551C14.2598 20.187 13.697 19.1026 13.1834 18.01C13.689 16.9175 14.2598 15.8249 14.871 14.7569C15.507 13.6562 16.1594 12.6126 16.8362 11.6423C18.051 11.5363 19.2822 11.4793 20.5214 11.4793C21.7526 11.4793 22.9838 11.5363 24.1902 11.6342C24.867 12.6044 25.5274 13.6399 26.1634 14.7324C26.783 15.8005 27.3458 16.8849 27.8594 17.9774C27.3458 19.07 26.783 20.1625 26.1718 21.2306ZM28.805 20.1707C29.2454 21.2632 29.6206 22.3557 29.9302 23.4157C28.8622 23.6766 27.737 23.8967 26.571 24.0679C26.9706 23.4401 27.3702 22.796 27.7454 22.1356C28.1202 21.4833 28.471 20.8229 28.805 20.1707ZM20.5378 28.8702C19.7794 28.0875 19.021 27.2151 18.271 26.2611C19.005 26.2938 19.755 26.3182 20.5134 26.3182C21.2798 26.3182 22.0378 26.3019 22.7798 26.2611C22.0462 27.2151 21.2878 28.0875 20.5378 28.8702ZM14.4718 24.0679C13.3138 23.8967 12.197 23.6847 11.129 23.4238C11.4306 22.3721 11.8054 21.2877 12.2294 20.2033C12.5638 20.8555 12.9142 21.5078 13.2974 22.1601C13.6806 22.8123 14.0722 23.4483 14.4718 24.0679ZM20.497 7.10093C21.255 7.88365 22.0134 8.75605 22.7634 9.70998C22.0298 9.67737 21.2798 9.65293 20.5214 9.65293C19.755 9.65293 18.9966 9.66922 18.2546 9.70998C18.9886 8.75605 19.747 7.88365 20.497 7.10093ZM14.4634 11.9032C14.0642 12.531 13.6646 13.1751 13.2894 13.8356C12.9142 14.4878 12.5638 15.1401 12.2294 15.7923C11.7894 14.6998 11.4142 13.6073 11.1042 12.5473C12.1726 12.2946 13.2974 12.0745 14.4634 11.9032ZM7.08459 22.1111C4.19859 20.88 2.33139 19.2657 2.33139 17.9856C2.33139 16.7055 4.19859 15.083 7.08459 13.86C7.78579 13.5583 8.55219 13.2893 9.34339 13.0365C9.80779 14.6346 10.4194 16.2979 11.1778 18.0019C10.4278 19.6978 9.82419 21.3529 9.36779 22.9428C8.56059 22.69 7.79419 22.4128 7.08459 22.1111ZM11.4714 33.7622C10.3626 33.1262 9.8814 30.7047 10.2566 27.5901C10.3462 26.8237 10.493 26.0166 10.6722 25.1931C12.2702 25.5844 14.015 25.8861 15.8494 26.0818C16.9502 27.5901 18.0918 28.9599 19.2414 30.1584C16.5834 32.6289 14.0886 33.9823 12.3926 33.9823C12.0258 33.9742 11.7158 33.9008 11.4714 33.7622ZM30.811 27.5494C31.1942 30.6639 30.721 33.0855 29.6206 33.7296C29.3758 33.8763 29.0578 33.9415 28.683 33.9415C26.995 33.9415 24.4922 32.5963 21.8342 30.1421C22.9754 28.9436 24.117 27.582 25.2014 26.0736C27.0442 25.8779 28.789 25.5763 30.387 25.1768C30.5742 26.0003 30.721 26.7911 30.811 27.5494ZM33.9498 22.1111C33.2486 22.4128 32.4822 22.6819 31.6914 22.9346C31.2266 21.3366 30.615 19.6733 29.857 17.9693C30.607 16.2734 31.2102 14.6183 31.667 13.0284C32.4742 13.2811 33.2406 13.5583 33.9582 13.86C36.8442 15.0912 38.7114 16.7055 38.7114 17.9856C38.7034 19.2657 36.8362 20.8881 33.9498 22.1111Z"
|
||||
/>
|
||||
<path
|
||||
d="M20.5134 21.7133C22.5714 21.7133 24.2394 20.0451 24.2394 17.9873C24.2394 15.9294 22.5714 14.2612 20.5134 14.2612C18.4558 14.2612 16.7874 15.9294 16.7874 17.9873C16.7874 20.0451 18.4558 21.7133 20.5134 21.7133Z"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
29
themes/proxio/components/svg/SVGPlayTailWind.js
Normal file
29
themes/proxio/components/svg/SVGPlayTailWind.js
Normal file
@@ -0,0 +1,29 @@
|
||||
export default function SVGPlayTailwind() {
|
||||
return <svg
|
||||
className="fill-current"
|
||||
width="41"
|
||||
height="26"
|
||||
viewBox="0 0 41 26"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<mask
|
||||
id="mask0_2005_10783"
|
||||
style={{ maskType: 'luminance' }}
|
||||
maskUnits="userSpaceOnUse"
|
||||
x="0"
|
||||
y="0"
|
||||
width="41"
|
||||
height="26"
|
||||
>
|
||||
<path
|
||||
d="M0.521393 0.949463H40.5214V25.0135H0.521393V0.949463Z"
|
||||
/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_2005_10783)">
|
||||
<path
|
||||
d="M20.5214 0.980713C15.1882 0.980713 11.8546 3.64743 10.5214 8.98071C12.5214 6.31399 14.8546 5.31399 17.5214 5.98071C19.043 6.36103 20.1302 7.46495 21.3342 8.68667C23.295 10.6771 25.5642 12.9807 30.5214 12.9807C35.8546 12.9807 39.1882 10.314 40.5214 4.98071C38.5214 7.64743 36.1882 8.64743 33.5214 7.98071C31.9998 7.60039 30.9126 6.49651 29.7086 5.27479C27.7478 3.28431 25.4786 0.980713 20.5214 0.980713ZM10.5214 12.9807C5.18819 12.9807 1.85459 15.6474 0.521393 20.9807C2.52139 18.314 4.85459 17.314 7.52139 17.9807C9.04299 18.361 10.1302 19.465 11.3342 20.6867C13.295 22.6771 15.5642 24.9807 20.5214 24.9807C25.8546 24.9807 29.1882 22.314 30.5214 16.9807C28.5214 19.6474 26.1882 20.6474 23.5214 19.9807C21.9998 19.6004 20.9126 18.4965 19.7086 17.2748C17.7478 15.2843 15.4786 12.9807 10.5214 12.9807Z"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
}
|
||||
18
themes/proxio/components/svg/SVGQuestion.js
Normal file
18
themes/proxio/components/svg/SVGQuestion.js
Normal file
@@ -0,0 +1,18 @@
|
||||
export const SVGQuestion = () => {
|
||||
return <svg
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 34 34"
|
||||
className="fill-current"
|
||||
>
|
||||
<path
|
||||
d="M17.0008 0.690674C7.96953 0.690674 0.691406 7.9688 0.691406 17C0.691406 26.0313 7.96953 33.3625 17.0008 33.3625C26.032 33.3625 33.3633 26.0313 33.3633 17C33.3633 7.9688 26.032 0.690674 17.0008 0.690674ZM17.0008 31.5032C9.03203 31.5032 2.55078 24.9688 2.55078 17C2.55078 9.0313 9.03203 2.55005 17.0008 2.55005C24.9695 2.55005 31.5039 9.0313 31.5039 17C31.5039 24.9688 24.9695 31.5032 17.0008 31.5032Z"
|
||||
/>
|
||||
<path
|
||||
d="M17.9039 6.32194C16.3633 6.05631 14.8227 6.48131 13.707 7.43756C12.5383 8.39381 11.8477 9.82819 11.8477 11.3688C11.8477 11.9532 11.9539 12.5376 12.1664 13.0688C12.3258 13.5469 12.857 13.8126 13.3352 13.6532C13.8133 13.4938 14.0789 12.9626 13.9195 12.4844C13.8133 12.1126 13.707 11.7938 13.707 11.3688C13.707 10.4126 14.132 9.50944 14.8758 8.87194C15.6195 8.23444 16.5758 7.96881 17.5852 8.18131C18.9133 8.39381 19.9758 9.50944 20.1883 10.7844C20.4539 12.3251 19.657 13.8126 18.2227 14.3969C16.8945 14.9282 16.0445 16.2563 16.0445 17.7969V21.1969C16.0445 21.7282 16.4695 22.1532 17.0008 22.1532C17.532 22.1532 17.957 21.7282 17.957 21.1969V17.7969C17.957 17.0532 18.382 16.3626 18.9664 16.1501C21.1977 15.2469 22.4727 12.9094 22.0477 10.4657C21.6758 8.39381 19.9758 6.69381 17.9039 6.32194Z"
|
||||
/>
|
||||
<path
|
||||
d="M17.0531 24.8625H16.8937C16.3625 24.8625 15.9375 25.2875 15.9375 25.8188C15.9375 26.35 16.3625 26.7751 16.8937 26.7751H17.0531C17.5844 26.7751 18.0094 26.35 18.0094 25.8188C18.0094 25.2875 17.5844 24.8625 17.0531 24.8625Z"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
14
themes/proxio/components/svg/SVGRightArrow.js
Normal file
14
themes/proxio/components/svg/SVGRightArrow.js
Normal file
@@ -0,0 +1,14 @@
|
||||
export const SVGRightArrow = () => {
|
||||
return <svg
|
||||
className="fill-current"
|
||||
width="22"
|
||||
height="22"
|
||||
viewBox="0 0 22 22"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M19.8 10.45L12.6844 3.2313C12.375 2.92192 11.8938 2.92192 11.5844 3.2313C11.275 3.54067 11.275 4.02192 11.5844 4.3313L17.3594 10.2094H2.75C2.3375 10.2094 1.99375 10.5532 1.99375 10.9657C1.99375 11.3782 2.3375 11.7563 2.75 11.7563H17.4281L11.5844 17.7032C11.275 18.0126 11.275 18.4938 11.5844 18.8032C11.7219 18.9407 11.9281 19.0094 12.1344 19.0094C12.3406 19.0094 12.5469 18.9407 12.6844 18.7688L19.8 11.55C20.1094 11.2407 20.1094 10.7594 19.8 10.45Z"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
14
themes/proxio/components/svg/SVGTemplate.js
Normal file
14
themes/proxio/components/svg/SVGTemplate.js
Normal file
@@ -0,0 +1,14 @@
|
||||
export const SVGTemplate = () => {
|
||||
return <svg
|
||||
width="36"
|
||||
height="36"
|
||||
viewBox="0 0 36 36"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M30.5998 1.01245H5.39981C2.98105 1.01245 0.956055 2.9812 0.956055 5.4562V30.6562C0.956055 33.075 2.9248 35.0437 5.39981 35.0437H30.5998C33.0186 35.0437 34.9873 33.075 34.9873 30.6562V5.39995C34.9873 2.9812 33.0186 1.01245 30.5998 1.01245ZM5.39981 3.48745H30.5998C31.6123 3.48745 32.4561 4.3312 32.4561 5.39995V11.1937H3.4873V5.39995C3.4873 4.38745 4.38731 3.48745 5.39981 3.48745ZM3.4873 30.6V13.725H23.0623V32.5125H5.39981C4.38731 32.5125 3.4873 31.6125 3.4873 30.6ZM30.5998 32.5125H25.5373V13.725H32.4561V30.6C32.5123 31.6125 31.6123 32.5125 30.5998 32.5125Z"
|
||||
fill="white"
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
15
themes/proxio/components/svg/SVGTwitter.js
Normal file
15
themes/proxio/components/svg/SVGTwitter.js
Normal file
@@ -0,0 +1,15 @@
|
||||
export const SVGTwitter = ({ className }) => {
|
||||
return <svg
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 18 18"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className={className}
|
||||
>
|
||||
<path
|
||||
d="M16.4647 4.83752C16.565 4.72065 16.4343 4.56793 16.2859 4.62263C15.9549 4.74474 15.6523 4.82528 15.2049 4.875C15.7552 4.56855 16.0112 4.13054 16.2194 3.59407C16.2696 3.46467 16.1182 3.34725 15.9877 3.40907C15.458 3.66023 14.8864 3.84658 14.2854 3.95668C13.6913 3.3679 12.8445 3 11.9077 3C10.1089 3 8.65027 4.35658 8.65027 6.02938C8.65027 6.26686 8.67937 6.49818 8.73427 6.71966C6.14854 6.59919 3.84286 5.49307 2.24098 3.79696C2.13119 3.68071 1.93197 3.69614 1.86361 3.83792C1.68124 4.21619 1.57957 4.63582 1.57957 5.07762C1.57957 6.12843 2.15446 7.05557 3.02837 7.59885C2.63653 7.58707 2.2618 7.51073 1.91647 7.38116C1.74834 7.31808 1.5556 7.42893 1.57819 7.59847C1.75162 8.9004 2.80568 9.97447 4.16624 10.2283C3.89302 10.2978 3.60524 10.3347 3.30754 10.3347C3.23536 10.3347 3.16381 10.3324 3.0929 10.3281C2.91247 10.3169 2.76583 10.4783 2.84319 10.6328C3.35357 11.6514 4.45563 12.3625 5.73809 12.3847C4.62337 13.1974 3.21889 13.6816 1.69269 13.6816C1.50451 13.6816 1.42378 13.9235 1.59073 14.0056C2.88015 14.6394 4.34854 15 5.90878 15C11.9005 15 15.1765 10.384 15.1765 6.38067C15.1765 6.24963 15.1732 6.11858 15.1672 5.98877C15.6535 5.66205 16.0907 5.27354 16.4647 4.83752Z"
|
||||
fill=""
|
||||
/>
|
||||
</svg>
|
||||
}
|
||||
247
themes/proxio/config.js
Normal file
247
themes/proxio/config.js
Normal file
@@ -0,0 +1,247 @@
|
||||
/**
|
||||
* 另一个落地页主题
|
||||
*/
|
||||
const CONFIG = {
|
||||
PROXIO_WELCOME_COVER_ENABLE: true, //是否显示页面进入的欢迎文字
|
||||
PROXIO_WELCOME_TEXT: '欢迎来到此网站,点击任意位置进入', // 欢迎文字,留空则不启用
|
||||
|
||||
// 英雄区块导航
|
||||
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, // 首页博文区块展示前4篇文章
|
||||
PROXIO_BLOG_TEXT_1: '我的最新动态',
|
||||
|
||||
PROXIO_ANNOUNCEMENT_ENABLE: true, //公告文字区块
|
||||
|
||||
// 特性区块
|
||||
PROXIO_FEATURE_ENABLE: true, // 特性区块开关
|
||||
PROXIO_FEATURE_TITLE: '为什么选我',
|
||||
PROXIO_FEATURE_TEXT_1: '我能让您的项目焕发光彩',
|
||||
PROXIO_FEATURE_TEXT_2:
|
||||
'丰富的案例经验,专业的技术服务,优质的沟通效率',
|
||||
|
||||
// 特性1
|
||||
PROXIO_FEATURE_1_ICON_CLASS: 'fa-solid fa-stopwatch', // fas图标
|
||||
PROXIO_FEATURE_1_TITLE_1: '高效工作流程',
|
||||
PROXIO_FEATURE_1_TEXT_1: '精简的设计流程确保快速交付,在紧迫的工期下仍能保证品质与细节不打折扣。',
|
||||
|
||||
PROXIO_FEATURE_2_ICON_CLASS: 'fa-solid fa-comments',
|
||||
PROXIO_FEATURE_2_TITLE_1: '协作式流程',
|
||||
PROXIO_FEATURE_2_TEXT_1: '与你紧密合作,融合反馈意见,打造超越预期的设计',
|
||||
|
||||
PROXIO_FEATURE_3_ICON_CLASS: 'fa-solid fa-search',
|
||||
PROXIO_FEATURE_3_TITLE_1: '细节把控',
|
||||
PROXIO_FEATURE_3_TEXT_1: '精益求精雕琢每个元素,确保成品精致统一,令人过目难忘',
|
||||
|
||||
PROXIO_FEATURE_BUTTON_TEXT: '了解更多', // 按钮文字
|
||||
PROXIO_FEATURE_BUTTON_URL: 'https://github.com/tangly1024/NotionNext', // 按钮跳转
|
||||
|
||||
// 首页生涯区块
|
||||
PROXIO_CAREER_ENABLE: true, // 区块开关
|
||||
PROXIO_CAREER_TITLE: '生涯',
|
||||
PROXIO_CAREER_TEXT:
|
||||
'以下是我的职业生涯',
|
||||
|
||||
// 生涯内容卡牌 ,title是标题 ,bio是备注,text是详情
|
||||
PROXIO_CAREERS: [
|
||||
{ title: 'Freelance Architect', bio: '2016-2020', text: 'As a freelance architect, I worked on a range of residential and commercial projects, balancing form and function. I collaborated with clients and contractors to transform concepts into reality, ensuring each design was both aesthetically pleasing and structurally sound.' },
|
||||
{ title: 'Product Designer at Spotify', bio: '2020-2022', text: 'At Spotify, I helped shape innovative features for millions of users globally. My focus was on creating seamless music discovery experiences, enhancing user interfaces, and optimizing cross-platform navigation, which led to an improved product flow and increased user satisfaction.' },
|
||||
{ title: 'Freelance Product Designer', bio: '2022-Now', text: 'Now I design user-centric products that align with client visions. As a freelance product designer, I collaborate with startups and established companies, crafting solutions that elevate user experiences and increase engagement across both digital and physical interfaces.' }
|
||||
],
|
||||
|
||||
// 首页用户测评区块
|
||||
PROXIO_TESTIMONIALS_ENABLE: true, // 测评区块开关
|
||||
PROXIO_TESTIMONIALS_TITLE: '用户反馈',
|
||||
PROXIO_TESTIMONIALS_TEXT_1: '我们的用户怎么说',
|
||||
PROXIO_TESTIMONIALS_TEXT_2:
|
||||
'数千位站长选择用NotionNext搭建他们的网站,通过帮助手册、交流社群以及技术咨询,大家成功上线了自己的网站',
|
||||
|
||||
// 用户测评处的跳转按钮
|
||||
PROXIO_TESTIMONIALS_BUTTON_URL: '/about',
|
||||
PROXIO_TESTIMONIALS_BUTTON_TEXT: '联系我',
|
||||
|
||||
// 这里不支持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:
|
||||
'/avatar.png',
|
||||
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:
|
||||
'/avatar.png',
|
||||
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:
|
||||
'/avatar.png',
|
||||
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_FAQS: [
|
||||
{ q: 'NotionNext有帮助文档吗?', a: 'NotionNext提供了<a href="https://docs.tangly1024.com/about" className="underline">帮助文档</a>,操作<a href="https://www.bilibili.com/video/BV1fM4y1L7Qi/" className="underline">演示视频</a>,以及<a href="https://docs.tangly1024.com/article/chat-community" className="underline">交流社群</a>来协助您完成网站的搭建部署' },
|
||||
{ q: '部署后要如何编写文章?', a: '您可以在Notion中之间添加或修改类型为Post的页面,内容将被实时同步在站点中,详情参考<a className="underline" href="https://docs.tangly1024.com/article/start-to-write">《帮助文档》</a>' },
|
||||
{ q: '站点部署失败,更新失败?', a: '通常是配置修改错误导致,请检查配置或者重试操作步骤,或者通过Vercel后台的Deployments中找到错误日志,并向网友求助' },
|
||||
{ q: '文章没有实时同步?', a: '先检查Notion_Page_ID是否正确配置,其次由于博客的每个页面都有独立缓存,刷新网页后即可解决' },
|
||||
],
|
||||
|
||||
// 关于作者区块
|
||||
PROXIO_ABOUT_ENABLE: true, // 关于作者区块区块开关
|
||||
PROXIO_ABOUT_TITLE: '关于作者',
|
||||
PROXIO_ABOUT_TEXT_1: 'I am an Architect Turned Into a Product Designer',
|
||||
PROXIO_ABOUT_TEXT_2:
|
||||
'With a background in architecture, I now apply my expertise to product design, blending aesthetics, functionality, and innovation. My goal is to create modern, user-focused designs that bring your vision to life.',
|
||||
PROXIO_ABOUT_PHOTO_URL: '/avatar.png',
|
||||
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_BRANDS_ENABLE: true, // 滚动文字
|
||||
PROXIO_BRANDS: [
|
||||
'Web Design',
|
||||
'Logo Design',
|
||||
'Mobile App Design',
|
||||
'Product Design'
|
||||
],
|
||||
|
||||
PROXIO_FOOTER_SLOGAN: '我们通过技术为品牌和公司创造数字体验。',
|
||||
|
||||
// 页脚三列菜单组
|
||||
// 页脚菜单
|
||||
PROXIO_FOOTER_LINKS: [
|
||||
{
|
||||
name: '友情链接',
|
||||
menus: [
|
||||
{
|
||||
title: 'Tangly的学习笔记',
|
||||
href: 'https://blog.tangly1024.com'
|
||||
},
|
||||
{
|
||||
title: 'NotionNext',
|
||||
href: 'https://www.tangly1024.com'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: '开发者',
|
||||
menus: [
|
||||
{ title: 'Github', href: 'https://github.com/tangly1024/NotionNext' },
|
||||
{
|
||||
title: '开发帮助',
|
||||
href: 'https://docs.tangly1024.com/article/how-to-develop-with-notion-next'
|
||||
},
|
||||
{
|
||||
title: '功能反馈',
|
||||
href: 'https://github.com/tangly1024/NotionNext/issues/new/choose'
|
||||
},
|
||||
{
|
||||
title: '技术讨论',
|
||||
href: 'https://github.com/tangly1024/NotionNext/discussions'
|
||||
},
|
||||
{
|
||||
title: '关于作者',
|
||||
href: 'https://blog.tangly1024.com/about'
|
||||
}
|
||||
]
|
||||
}],
|
||||
|
||||
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:
|
||||
'/about',
|
||||
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
|
||||
555
themes/proxio/index.js
Normal file
555
themes/proxio/index.js
Normal file
@@ -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 { Career } from './components/Career'
|
||||
import { BackToTopButton } from './components/BackToTopButton'
|
||||
import { Blog } from './components/Blog'
|
||||
import { Brand } from './components/Brand'
|
||||
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'
|
||||
import CursorDot from '@/components/CursorDot'
|
||||
import LoadingCover from './components/LoadingCover'
|
||||
|
||||
/**
|
||||
* 布局框架
|
||||
* Landing-2 主题用作产品落地页展示
|
||||
* 结合Stripe或者lemonsqueezy插件可以成为saas支付订阅
|
||||
* https://play-tailwind.tailgrids.com/
|
||||
* @param {*} props
|
||||
* @returns
|
||||
*/
|
||||
const LayoutBase = props => {
|
||||
const { children } = props
|
||||
|
||||
// 加载wow动画
|
||||
useEffect(() => {
|
||||
loadWowJS()
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div
|
||||
id='theme-proxio'
|
||||
className={`${siteConfig('FONT_STYLE')} min-h-screen flex flex-col dark:bg-dark scroll-smooth`}>
|
||||
<Style />
|
||||
{/* 页头 */}
|
||||
<Header {...props} />
|
||||
|
||||
<div id='main-wrapper' className='grow'>
|
||||
{children}
|
||||
</div>
|
||||
|
||||
{/* 页脚 */}
|
||||
<Footer {...props} />
|
||||
|
||||
{/* 悬浮按钮 */}
|
||||
<BackToTopButton />
|
||||
|
||||
{/* 鼠标阻尼动画 */}
|
||||
<Lenis />
|
||||
{/* 鼠标跟随动画 */}
|
||||
<CursorDot />
|
||||
{/* <MadeWithButton/> */}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 首页布局
|
||||
* @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) && <Hero {...props} />}
|
||||
{/* 博文列表 */}
|
||||
{siteConfig('PROXIO_BLOG_ENABLE', true, CONFIG) && (
|
||||
<>
|
||||
<Blog posts={posts} />
|
||||
{/* 更多文章按钮 */}
|
||||
<div className='container mx-auto flex justify-end mb-4'>
|
||||
<Link className='text-lg underline' href={'/archive'}>
|
||||
<span>{locale.COMMON.MORE}</span>
|
||||
<i className='ml-2 fas fa-arrow-right' />
|
||||
</Link>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
|
||||
{/* 公告 */}
|
||||
{siteConfig('PROXIO_ANNOUNCEMENT_ENABLE', true, CONFIG) && <Announcement
|
||||
post={props?.notice}
|
||||
className={
|
||||
'announncement text-center py-16'
|
||||
} />
|
||||
}
|
||||
|
||||
{/* 团队介绍 */}
|
||||
{siteConfig('PROXIO_ABOUT_ENABLE', true, CONFIG) && <Team />}
|
||||
|
||||
{/* 合作伙伴 */}
|
||||
{siteConfig('PROXIO_BRANDS_ENABLE', true, CONFIG) && <Brand />}
|
||||
|
||||
|
||||
{/* 生涯 */}
|
||||
{siteConfig('PROXIO_CAREER_ENABLE', true, CONFIG) && <Career />}
|
||||
|
||||
{/* 产品特性 */}
|
||||
{siteConfig('PROXIO_FEATURE_ENABLE', true, CONFIG) && <Features />}
|
||||
|
||||
{/* 评价展示 */}
|
||||
{siteConfig('PROXIO_TESTIMONIALS_ENABLE', true, CONFIG) && (
|
||||
<Testimonials />
|
||||
)}
|
||||
{/* 常见问题 */}
|
||||
{siteConfig('PROXIO_FAQ_ENABLE', true, CONFIG) && <FAQ />}
|
||||
|
||||
|
||||
{/* 行动呼吁 */}
|
||||
{siteConfig('PROXIO_CTA_ENABLE', true, CONFIG) && <CTA />}
|
||||
|
||||
{siteConfig('PROXIO_WELCOME_COVER_ENABLE', false, CONFIG) && <LoadingCover />}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 文章详情页布局
|
||||
* @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 (
|
||||
<div id='theme-proxio'>
|
||||
<Loading />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Banner title={post?.title} description={post?.summary} />
|
||||
<div className='container grow'>
|
||||
<div className='flex flex-wrap justify-center -mx-4'>
|
||||
<div id='container-inner' className='w-full p-4'>
|
||||
{lock && <ArticleLock validPassword={validPassword} />}
|
||||
|
||||
{!lock && post && (
|
||||
<div id='article-wrapper' className='mx-auto'>
|
||||
<NotionPage {...props} />
|
||||
<Comment frontMatter={post} />
|
||||
<ShareBar post={post} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 仪表盘
|
||||
* @param {*} props
|
||||
* @returns
|
||||
*/
|
||||
const LayoutDashboard = props => {
|
||||
const { post } = props
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className='container grow'>
|
||||
<div className='flex flex-wrap justify-center -mx-4'>
|
||||
<div id='container-inner' className='w-full p-4'>
|
||||
{post && (
|
||||
<div id='article-wrapper' className='mx-auto'>
|
||||
<NotionPage {...props} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* 仪表盘 */}
|
||||
<DashboardHeader />
|
||||
<DashboardBody />
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
* @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 (
|
||||
<>
|
||||
<section className='max-w-7xl mx-auto bg-white pb-10 pt-20 dark:bg-dark lg:pb-20 lg:pt-[120px]'>
|
||||
<SearchInput {...props} />
|
||||
{currentSearch && <Blog {...props} />}
|
||||
</section>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 文章归档
|
||||
* @param {*} props
|
||||
* @returns
|
||||
*/
|
||||
const LayoutArchive = props => (
|
||||
<>
|
||||
{/* 博文列表 */}
|
||||
<Blog {...props} />
|
||||
</>
|
||||
)
|
||||
|
||||
/**
|
||||
* 404页面
|
||||
* @param {*} props
|
||||
* @returns
|
||||
*/
|
||||
const Layout404 = props => {
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== 404 Section Start --> */}
|
||||
<section className='bg-white py-20 dark:bg-dark-2 lg:py-[110px]'>
|
||||
<div className='container mx-auto'>
|
||||
<div className='flex flex-wrap items-center -mx-4'>
|
||||
<div className='w-full px-4 md:w-5/12 lg:w-6/12'>
|
||||
<div className='text-center'>
|
||||
<img
|
||||
src='/images/starter/404.svg'
|
||||
alt='image'
|
||||
className='max-w-full mx-auto'
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className='w-full px-4 md:w-7/12 lg:w-6/12 xl:w-5/12'>
|
||||
<div>
|
||||
<div className='mb-8'>
|
||||
<SVG404 />
|
||||
</div>
|
||||
<h3 className='mb-5 text-2xl font-semibold text-dark dark:text-white'>
|
||||
{siteConfig('PROXIO_404_TITLE')}
|
||||
</h3>
|
||||
<p className='mb-8 text-base text-body-color dark:text-dark-6'>
|
||||
{siteConfig('PROXIO_404_TEXT')}
|
||||
</p>
|
||||
<Link
|
||||
href='/'
|
||||
className='py-3 text-base font-medium text-white transition rounded-md bg-dark px-7 hover:bg-primary'>
|
||||
{siteConfig('PROXIO_404_BACK')}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== 404 Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 博客列表
|
||||
*/
|
||||
const LayoutPostList = props => {
|
||||
const { posts, category, tag } = props
|
||||
const slotTitle = category || tag
|
||||
|
||||
return (
|
||||
<>
|
||||
{/* <!-- ====== Blog Section Start --> */}
|
||||
<section className='bg-white pb-10 pt-20 dark:bg-dark lg:pb-20 lg:pt-[120px]'>
|
||||
<div className='container mx-auto'>
|
||||
{/* 区块标题文字 */}
|
||||
<div className='-mx-4 flex flex-wrap justify-center'>
|
||||
<div className='w-full px-4'>
|
||||
<div className='mx-auto mb-[60px] max-w-[485px] text-center'>
|
||||
{slotTitle && (
|
||||
<h2 className='mb-4 text-3xl font-bold text-dark dark:text-white sm:text-4xl md:text-[40px] md:leading-[1.2]'>
|
||||
{slotTitle}
|
||||
</h2>
|
||||
)}
|
||||
|
||||
{!slotTitle && (
|
||||
<>
|
||||
<span className='mb-2 block text-lg font-semibold text-primary'>
|
||||
{siteConfig('PROXIO_BLOG_TITLE')}
|
||||
</span>
|
||||
<h2 className='mb-4 text-3xl font-bold text-dark dark:text-white sm:text-4xl md:text-[40px] md:leading-[1.2]'>
|
||||
{siteConfig('PROXIO_BLOG_TEXT_1')}
|
||||
</h2>
|
||||
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/* 博客列表 此处优先展示4篇文章 */}
|
||||
<div className='-mx-4 flex flex-wrap'>
|
||||
{posts?.map((item, index) => {
|
||||
return (
|
||||
<div key={index} className='w-full px-4 md:w-1/2 lg:w-1/3'>
|
||||
<div
|
||||
className='wow fadeInUp group mb-10'
|
||||
data-wow-delay='.1s'>
|
||||
<div className='mb-8 overflow-hidden rounded-[5px]'>
|
||||
<Link href={item?.href} className='block'>
|
||||
<img
|
||||
src={item.pageCoverThumbnail}
|
||||
alt={item.title}
|
||||
className='w-full transition group-hover:rotate-6 group-hover:scale-125'
|
||||
/>
|
||||
</Link>
|
||||
</div>
|
||||
<div>
|
||||
<span className='mb-6 inline-block rounded-[5px] bg-primary px-4 py-0.5 text-center text-xs font-medium leading-loose text-white'>
|
||||
{item.publishDay}
|
||||
</span>
|
||||
<h3>
|
||||
<Link
|
||||
href={item?.href}
|
||||
className='mb-4 inline-block text-xl font-semibold text-dark hover:text-primary dark:text-white dark:hover:text-primary sm:text-2xl lg:text-xl xl:text-2xl'>
|
||||
{item.title}
|
||||
</Link>
|
||||
</h3>
|
||||
<p className='max-w-[370px] text-base text-body-color dark:text-dark-6'>
|
||||
{item.summary}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{/* <!-- ====== Blog Section End --> */}
|
||||
</>
|
||||
)
|
||||
}
|
||||
/**
|
||||
* 分类列表
|
||||
* @param {*} props
|
||||
* @returns
|
||||
*/
|
||||
const LayoutCategoryIndex = props => {
|
||||
const { categoryOptions } = props
|
||||
const { locale } = useGlobal()
|
||||
return (
|
||||
<section className='bg-white pb-10 pt-20 dark:bg-dark lg:pb-20 lg:pt-[120px]'>
|
||||
<div className='container mx-auto min-h-96'>
|
||||
<span className='mb-2 text-lg font-semibold text-primary flex justify-center items-center '>
|
||||
{locale.COMMON.CATEGORY}
|
||||
</span>
|
||||
<div
|
||||
id='category-list'
|
||||
className='duration-200 flex flex-wrap justify-center items-center '>
|
||||
{categoryOptions?.map(category => {
|
||||
return (
|
||||
<Link
|
||||
key={category.name}
|
||||
href={`/category/${category.name}`}
|
||||
passHref
|
||||
legacyBehavior>
|
||||
<h2
|
||||
className={
|
||||
'hover:text-black text-2xl font-semibold text-dark sm:text-4xl md:text-[40px] md:leading-[1.2] dark:hover:text-white dark:text-gray-300 dark:hover:bg-gray-600 px-5 cursor-pointer py-2 hover:bg-gray-100'
|
||||
}>
|
||||
<i className='mr-4 fas fa-folder' />
|
||||
{category.name}({category.count})
|
||||
</h2>
|
||||
</Link>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 标签列表
|
||||
* @param {*} props
|
||||
* @returns
|
||||
*/
|
||||
const LayoutTagIndex = props => {
|
||||
const { tagOptions } = props
|
||||
const { locale } = useGlobal()
|
||||
return (
|
||||
<section className='bg-white pb-10 pt-20 dark:bg-dark lg:pb-20 lg:pt-[120px]'>
|
||||
<div className='container mx-auto min-h-96'>
|
||||
<span className='mb-2 text-lg font-semibold text-primary flex justify-center items-center '>
|
||||
{locale.COMMON.TAGS}
|
||||
</span>
|
||||
<div
|
||||
id='tags-list'
|
||||
className='duration-200 flex flex-wrap justify-center items-center'>
|
||||
{tagOptions.map(tag => {
|
||||
return (
|
||||
<div key={tag.name} className='p-2'>
|
||||
<Link
|
||||
key={tag}
|
||||
href={`/tag/${encodeURIComponent(tag.name)}`}
|
||||
passHref
|
||||
className={`cursor-pointer inline-block rounded hover:bg-gray-500 hover:text-white duration-200 mr-2 py-1 px-2 text-md whitespace-nowrap dark:hover:text-white text-gray-600 hover:shadow-xl dark:border-gray-400 notion-${tag.color}_background dark:bg-gray-800`}>
|
||||
<div className='font-light dark:text-gray-400'>
|
||||
<i className='mr-1 fas fa-tag' />{' '}
|
||||
{tag.name + (tag.count ? `(${tag.count})` : '')}{' '}
|
||||
</div>
|
||||
</Link>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
/**
|
||||
* 登录页面
|
||||
* @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 (
|
||||
<>
|
||||
<div className='grow mt-20'>
|
||||
<Banner title={title} description={description} />
|
||||
{/* clerk预置表单 */}
|
||||
{enableClerk && (
|
||||
<div className='flex justify-center py-6'>
|
||||
<SignIn />
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 自定义登录表单 */}
|
||||
{!enableClerk && <SignInForm />}
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册页面
|
||||
* @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 (
|
||||
<>
|
||||
<div className='grow mt-20'>
|
||||
<Banner title={title} description={description} />
|
||||
|
||||
{/* clerk预置表单 */}
|
||||
{enableClerk && (
|
||||
<div className='flex justify-center py-6'>
|
||||
<SignUp />
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 自定义登录表单 */}
|
||||
{!enableClerk && <SignUpForm />}
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export {
|
||||
Layout404,
|
||||
LayoutArchive,
|
||||
LayoutBase,
|
||||
LayoutCategoryIndex,
|
||||
LayoutDashboard,
|
||||
LayoutIndex,
|
||||
LayoutPostList,
|
||||
LayoutSearch,
|
||||
LayoutSignIn,
|
||||
LayoutSignUp,
|
||||
LayoutSlug,
|
||||
LayoutTagIndex,
|
||||
CONFIG as THEME_CONFIG
|
||||
}
|
||||
257
themes/proxio/style.js
Normal file
257
themes/proxio/style.js
Normal file
@@ -0,0 +1,257 @@
|
||||
/* eslint-disable react/no-unknown-property */
|
||||
|
||||
/**
|
||||
* 此处样式只对当前主题生效
|
||||
* 此处不支持tailwindCSS的 @apply 语法
|
||||
* @returns
|
||||
*/
|
||||
const Style = () => {
|
||||
return <style jsx global>{`
|
||||
|
||||
#theme-proxio .bg-primary {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: #121212;
|
||||
}
|
||||
|
||||
@media (min-width: 540px) {
|
||||
#theme-proxio .container {
|
||||
max-width: 540px;
|
||||
}
|
||||
}
|
||||
@media (min-width: 720px) {
|
||||
#theme-proxio .container {
|
||||
max-width: 720px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 960px) {
|
||||
#theme-proxio .container {
|
||||
max-width: 960px;
|
||||
}
|
||||
}
|
||||
@media (min-width: 1140px) {
|
||||
#theme-proxio .container {
|
||||
max-width: 1140px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1536px) {
|
||||
#theme-proxio .container {
|
||||
max-width: 1140px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#theme-proxio .container {
|
||||
width: 100%;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
padding-right: 16px;
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
#theme-proxio .sticky{
|
||||
position: fixed;
|
||||
z-index: 20;
|
||||
background-color: rgb(255 255 255 / 0.8);
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
|
||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
transition-duration: 150ms;
|
||||
}
|
||||
|
||||
|
||||
.dark\:bg-dark:is(.dark *) {
|
||||
background-color: black!important;
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky){
|
||||
background-color: rgb(17 25 40 / 0.8);
|
||||
}
|
||||
|
||||
#theme-proxio .sticky {
|
||||
-webkit-backdrop-filter: blur(5px);
|
||||
backdrop-filter: blur(5px);
|
||||
box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
#theme-proxio .sticky .navbar-logo{
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
#theme-proxio .sticky #navbarToggler span{
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(17 25 40 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky #navbarToggler span){
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
#theme-proxio .sticky #navbarCollapse li > a{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(17 25 40 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
#theme-proxio .sticky #navbarCollapse li > a:hover{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(55 88 249 / var(--tw-text-opacity));
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#theme-proxio .sticky #navbarCollapse li > button{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(17 25 40 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky #navbarCollapse li > a){
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky #navbarCollapse li > a:hover){
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(55 88 249 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky #navbarCollapse li > button){
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
#navbarCollapse li .ud-menu-scroll.active{
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
#theme-proxio .sticky #navbarCollapse li .ud-menu-scroll.active{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(55 88 249 / var(--tw-text-opacity));
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#theme-proxio .sticky .loginBtn{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(17 25 40 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
#theme-proxio .sticky .loginBtn:hover{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(55 88 249 / var(--tw-text-opacity));
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky .loginBtn){
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky .loginBtn:hover){
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(55 88 249 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
#theme-proxio .sticky .signUpBtn{
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(55 88 249 / var(--tw-bg-opacity));
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
#theme-proxio .sticky .signUpBtn:hover{
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(27 68 200 / var(--tw-bg-opacity));
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
#theme-proxio .sticky #themeSwitcher ~ span{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(17 25 40 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
:is(.dark #theme-proxio .sticky #themeSwitcher ~ span){
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
.navbarTogglerActive > span:nth-child(1){
|
||||
top: 7px;
|
||||
--tw-rotate: 45deg;
|
||||
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
||||
}
|
||||
|
||||
.navbarTogglerActive > span:nth-child(2){
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.navbarTogglerActive > span:nth-child(3){
|
||||
top: -8px;
|
||||
--tw-rotate: 135deg;
|
||||
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
||||
}
|
||||
|
||||
.text-body-color{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(99 115 129 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
.text-body-secondary{
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(136 153 168 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
|
||||
.common-carousel .swiper-button-next:after,
|
||||
.common-carousel .swiper-button-prev:after{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.common-carousel .swiper-button-next,
|
||||
.common-carousel .swiper-button-prev{
|
||||
position: static !important;
|
||||
margin: 0px;
|
||||
height: 3rem;
|
||||
width: 3rem;
|
||||
border-radius: 0.5rem;
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(17 25 40 / var(--tw-text-opacity));
|
||||
--tw-shadow: 0px 8px 15px 0px rgba(72, 72, 138, 0.08);
|
||||
--tw-shadow-colored: 0px 8px 15px 0px var(--tw-shadow-color);
|
||||
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||
transition-duration: 200ms;
|
||||
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.common-carousel .swiper-button-next:hover,
|
||||
.common-carousel .swiper-button-prev:hover{
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(55 88 249 / var(--tw-bg-opacity));
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
--tw-shadow: 0 0 #0000;
|
||||
--tw-shadow-colored: 0 0 #0000;
|
||||
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||
}
|
||||
|
||||
:is(.dark .common-carousel .swiper-button-next),:is(.dark
|
||||
.common-carousel .swiper-button-prev){
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(17 25 40 / var(--tw-bg-opacity));
|
||||
--tw-text-opacity: 1;
|
||||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
.common-carousel .swiper-button-next svg,
|
||||
.common-carousel .swiper-button-prev svg{
|
||||
height: auto;
|
||||
width: auto;
|
||||
}
|
||||
`}</style>
|
||||
}
|
||||
|
||||
export { Style }
|
||||
Reference in New Issue
Block a user