first commit
154
.gitea/workflows/deploy.yml
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
name: Deploy to Cloudflare Pages
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'deploy-*' # 只在推送 deploy-* 标签时触发
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: swr.cn-south-1.myhuaweicloud.com/bws/node:20.19.6-bookworm-slim-ci
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# 1. 拉取代码
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# 2. 设置 pnpm(使用 corepack,避免从 GitHub 拉取 action)
|
||||||
|
- name: Setup pnpm
|
||||||
|
run: |
|
||||||
|
corepack enable
|
||||||
|
corepack prepare pnpm@10.23.0 --activate
|
||||||
|
pnpm --version
|
||||||
|
|
||||||
|
- name: Parse tag to env
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# 获取 tag 名称(Gitea Actions 使用 GITHUB_REF_NAME)
|
||||||
|
TAG_NAME="${GITHUB_REF_NAME}"
|
||||||
|
echo "TAG_NAME=$TAG_NAME"
|
||||||
|
|
||||||
|
# Tag 格式: deploy-{project_name}-{deploymentId_no_dashes}
|
||||||
|
# 例如: deploy-b7ea026a-cf09-4e31-9f29-b55d7c652b71-123e4567e89b12d3a456426614174000
|
||||||
|
|
||||||
|
# 去掉 "deploy-" 前缀
|
||||||
|
PREFIX="deploy-"
|
||||||
|
REST="${TAG_NAME#$PREFIX}"
|
||||||
|
|
||||||
|
# deploymentId(无破折号)固定是最后32个字符
|
||||||
|
DEPLOYMENT_ID="${REST: -32}"
|
||||||
|
|
||||||
|
# project_name 是剩余部分(去掉最后的 "-" 和 deploymentId)
|
||||||
|
PROJECT_NAME="${REST%-${DEPLOYMENT_ID}}"
|
||||||
|
|
||||||
|
echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_ENV"
|
||||||
|
echo "DEPLOYMENT_ID=$DEPLOYMENT_ID" >> "$GITHUB_ENV"
|
||||||
|
#echo "DOMAIN=${PROJECT_NAME}-preview.turingflowai.com" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
# 调试输出
|
||||||
|
echo "Parsed PROJECT_NAME: $PROJECT_NAME"
|
||||||
|
echo "Parsed DEPLOYMENT_ID: $DEPLOYMENT_ID"
|
||||||
|
|
||||||
|
- name: Check toolchain (debug only, 可选)
|
||||||
|
run: |
|
||||||
|
node -v || echo "node not found"
|
||||||
|
pnpm -v || echo "pnpm not found"
|
||||||
|
curl --version || echo "curl not found"
|
||||||
|
|
||||||
|
- name: Use CN npm registry
|
||||||
|
run: |
|
||||||
|
pnpm config set registry http://repo.myhuaweicloud.com/repository/npm/
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm run build
|
||||||
|
|
||||||
|
- name: Deploy to Cloudflare Pages
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
PROJECT_NAME: ${{ env.PROJECT_NAME }}
|
||||||
|
DOMAIN: ${{ env.DOMAIN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
echo "[deploy] project: $PROJECT_NAME"
|
||||||
|
#echo "[deploy] domain: $DOMAIN"
|
||||||
|
|
||||||
|
# 部署到 Cloudflare Pages (假定构建产物在 dist/)
|
||||||
|
# 使用项目本地安装的 wrangler
|
||||||
|
npx wrangler pages deploy dist \
|
||||||
|
--project-name "$PROJECT_NAME" \
|
||||||
|
--branch main
|
||||||
|
|
||||||
|
# 绑定自定义域名:<project_name>-preview.turingflowai.com
|
||||||
|
#echo "[deploy] 正在绑定自定义域名..."
|
||||||
|
#DOMAIN_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
||||||
|
# "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/pages/projects/${PROJECT_NAME}/domains" \
|
||||||
|
# -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
|
||||||
|
# -H "Content-Type: application/json" \
|
||||||
|
# -d '{"name":"'"${DOMAIN}"'"}')
|
||||||
|
|
||||||
|
#HTTP_CODE=$(echo "$DOMAIN_RESPONSE" | tail -n1)
|
||||||
|
#RESPONSE_BODY=$(echo "$DOMAIN_RESPONSE" | sed '$d')
|
||||||
|
|
||||||
|
#if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "409" ]; then
|
||||||
|
# echo "[deploy] 域名绑定成功或已存在 (HTTP $HTTP_CODE)"
|
||||||
|
#else
|
||||||
|
# echo "[deploy] 警告: 域名绑定失败 (HTTP $HTTP_CODE)"
|
||||||
|
# echo "[deploy] 响应: $RESPONSE_BODY"
|
||||||
|
# echo "[deploy] 继续执行,但域名可能未绑定成功"
|
||||||
|
#fi
|
||||||
|
|
||||||
|
- name: Notify Deploy Service (success)
|
||||||
|
if: success()
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
DEPLOY_SERVICE_CALLBACK_URL: ${{ secrets.DEPLOY_SERVICE_CALLBACK_URL }}
|
||||||
|
DEPLOY_SERVICE_TOKEN: ${{ secrets.DEPLOY_SERVICE_TOKEN }}
|
||||||
|
DEPLOYMENT_ID: ${{ env.DEPLOYMENT_ID }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# 获取当前 commit SHA (Gitea Actions 使用 GITHUB_SHA)
|
||||||
|
COMMIT_SHA="${GITHUB_SHA}"
|
||||||
|
|
||||||
|
curl -X POST "$DEPLOY_SERVICE_CALLBACK_URL" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $DEPLOY_SERVICE_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"deploymentId": "'"${DEPLOYMENT_ID}"'",
|
||||||
|
"status": "deployed",
|
||||||
|
"commitSha": "'"${COMMIT_SHA}"'",
|
||||||
|
"cfDeploymentId": "",
|
||||||
|
"errorMessage": null
|
||||||
|
}'
|
||||||
|
|
||||||
|
- name: Notify Deploy Service (failure)
|
||||||
|
if: failure()
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
DEPLOY_SERVICE_CALLBACK_URL: ${{ secrets.DEPLOY_SERVICE_CALLBACK_URL }}
|
||||||
|
DEPLOY_SERVICE_TOKEN: ${{ secrets.DEPLOY_SERVICE_TOKEN }}
|
||||||
|
DEPLOYMENT_ID: ${{ env.DEPLOYMENT_ID }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# 获取当前 commit SHA
|
||||||
|
COMMIT_SHA="${GITHUB_SHA}"
|
||||||
|
|
||||||
|
curl -X POST "$DEPLOY_SERVICE_CALLBACK_URL" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer $DEPLOY_SERVICE_TOKEN" \
|
||||||
|
-d '{
|
||||||
|
"deploymentId": "'"${DEPLOYMENT_ID}"'",
|
||||||
|
"status": "failed",
|
||||||
|
"commitSha": "'"${COMMIT_SHA}"'",
|
||||||
|
"cfDeploymentId": "",
|
||||||
|
"errorMessage": "see Gitea Actions logs"
|
||||||
|
}'
|
||||||
157
.gitignore
vendored
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Dependencies
|
||||||
|
# ===================
|
||||||
|
node_modules/
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
package-lock.json
|
||||||
|
yarn.lock
|
||||||
|
pnpm-lock.yaml
|
||||||
|
bun.lockb
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Next.js
|
||||||
|
# ===================
|
||||||
|
/.next/
|
||||||
|
/out/
|
||||||
|
/build/
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Production
|
||||||
|
# ===================
|
||||||
|
/dist/
|
||||||
|
*.min.js
|
||||||
|
*.min.css
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Testing
|
||||||
|
# ===================
|
||||||
|
/coverage/
|
||||||
|
.nyc_output
|
||||||
|
*.lcov
|
||||||
|
jest-results.json
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# TypeScript
|
||||||
|
# ===================
|
||||||
|
*.tsbuildinfo
|
||||||
|
next-env.d.ts
|
||||||
|
tsconfig.tsbuildinfo
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Environment Variables
|
||||||
|
# ===================
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# IDE & Editors
|
||||||
|
# ===================
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.sublime-workspace
|
||||||
|
*.sublime-project
|
||||||
|
.project
|
||||||
|
.classpath
|
||||||
|
.c9/
|
||||||
|
*.launch
|
||||||
|
.settings/
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# OS Generated Files
|
||||||
|
# ===================
|
||||||
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
._*
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
ehthumbs.db
|
||||||
|
Thumbs.db
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Logs
|
||||||
|
# ===================
|
||||||
|
logs/
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Cache
|
||||||
|
# ===================
|
||||||
|
.cache/
|
||||||
|
.parcel-cache/
|
||||||
|
.eslintcache
|
||||||
|
.stylelintcache
|
||||||
|
*.cache
|
||||||
|
.turbo/
|
||||||
|
.pnpm-store/
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Vercel
|
||||||
|
# ===================
|
||||||
|
.vercel
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Debug
|
||||||
|
# ===================
|
||||||
|
*.pem
|
||||||
|
*.key
|
||||||
|
*.crt
|
||||||
|
*.p12
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Misc
|
||||||
|
# ===================
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
*.orig
|
||||||
|
.temp/
|
||||||
|
.tmp/
|
||||||
|
tmp/
|
||||||
|
temp/
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Storybook
|
||||||
|
# ===================
|
||||||
|
storybook-static/
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# PWA
|
||||||
|
# ===================
|
||||||
|
public/sw.js
|
||||||
|
public/workbox-*.js
|
||||||
|
public/sw.js.map
|
||||||
|
public/workbox-*.js.map
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Sentry
|
||||||
|
# ===================
|
||||||
|
.sentryclirc
|
||||||
|
|
||||||
|
# ===================
|
||||||
|
# Docker
|
||||||
|
# ===================
|
||||||
|
docker-compose.override.yml
|
||||||
78
NotFound/index.tsx
Normal file
264
README.md
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
# venus-nextjs
|
||||||
|
|
||||||
|
个人作品集/博客网站模板,适用于设计师、开发者、自由职业者展示作品和服务。
|
||||||
|
|
||||||
|
## 技术栈
|
||||||
|
|
||||||
|
- Next.js 15.5.9 (已锁定版本,App Router)
|
||||||
|
- React 19.2.3 (已锁定版本,修复 CVE-2025-55182 漏洞)
|
||||||
|
- TypeScript 5
|
||||||
|
- Tailwind CSS 4
|
||||||
|
- next-auth (身份认证)
|
||||||
|
- next-themes (深色/浅色主题切换)
|
||||||
|
- AOS (滚动动画)
|
||||||
|
- react-slick (轮播组件)
|
||||||
|
- Markdown/MDX (博客内容)
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## 目录结构
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/
|
||||||
|
├── app/ # Next.js App Router 入口
|
||||||
|
│ ├── layout.tsx # 根布局 (Header + Footer + 主题Provider)
|
||||||
|
│ ├── page.tsx # 首页
|
||||||
|
│ ├── not-found.tsx # 404 页面
|
||||||
|
│ ├── globals.css # 全局样式
|
||||||
|
│ ├── context/ # React Context
|
||||||
|
│ │ └── AuthDialogContext.tsx # 认证对话框状态管理
|
||||||
|
│ ├── api/ # API 路由和数据
|
||||||
|
│ │ ├── auth/[...nextauth]/route.ts # NextAuth 认证 API
|
||||||
|
│ │ ├── data.tsx # 静态数据 (菜单、计数器、服务、作品集)
|
||||||
|
│ │ └── contex/ToasetContex.tsx # Toast 通知 Context
|
||||||
|
│ └── (site)/ # 路由分组 (共享布局)
|
||||||
|
│ ├── about/page.tsx # 关于页面
|
||||||
|
│ ├── blog/page.tsx # 博客列表
|
||||||
|
│ ├── contact/page.tsx # 联系页面
|
||||||
|
│ ├── documentation/page.tsx # 文档页面
|
||||||
|
│ ├── portfolio/page.tsx # 作品集列表
|
||||||
|
│ └── services/page.tsx # 服务页面
|
||||||
|
├── components/ # 可复用组件
|
||||||
|
│ ├── Layout/ # 布局组件
|
||||||
|
│ │ ├── Header/index.tsx # 导航栏 (Logo + 菜单 + 主题切换)
|
||||||
|
│ │ └── Footer/index.tsx # 页脚
|
||||||
|
│ ├── Home/ # 首页专用组件
|
||||||
|
│ │ ├── Hero/index.tsx # Hero 区域
|
||||||
|
│ │ ├── Services/index.tsx # 服务展示
|
||||||
|
│ │ ├── Counter/index.tsx # 数据统计
|
||||||
|
│ │ ├── WorkProgress/index.tsx # 工作进度
|
||||||
|
│ │ └── Contact/index.tsx # 联系表单
|
||||||
|
│ ├── Auth/ # 认证相关
|
||||||
|
│ │ ├── SignIn/index.tsx # 登录组件
|
||||||
|
│ │ ├── SignUp/index.tsx # 注册组件
|
||||||
|
│ │ ├── SocialSignIn.tsx # 社交登录
|
||||||
|
│ │ └── AuthDialog/ # 认证对话框
|
||||||
|
│ ├── Blog/ # 博客组件
|
||||||
|
│ ├── Contact/ # 联系页组件
|
||||||
|
│ │ ├── Form/index.tsx # 联系表单
|
||||||
|
│ │ ├── ContactInfo/index.tsx # 联系信息
|
||||||
|
│ │ └── OfficeLocation/index.tsx # 办公地点
|
||||||
|
│ ├── Documentation/ # 文档组件
|
||||||
|
│ ├── portfolio/ # 作品集组件
|
||||||
|
│ ├── Common/ # 通用组件
|
||||||
|
│ ├── SharedComponent/ # 共享组件
|
||||||
|
│ ├── Breadcrumb/ # 面包屑
|
||||||
|
│ ├── ScrollToTop/ # 回到顶部按钮
|
||||||
|
│ ├── NotFound/ # 404 组件
|
||||||
|
│ └── nextauth/ # NextAuth Provider
|
||||||
|
├── types/ # TypeScript 类型定义
|
||||||
|
│ ├── blog.ts # 博客类型
|
||||||
|
│ ├── menu.ts # 菜单类型
|
||||||
|
│ └── breadcrumb.ts # 面包屑类型
|
||||||
|
├── utils/ # 工具函数
|
||||||
|
│ ├── image.ts # 图片路径处理
|
||||||
|
│ ├── aos.tsx # AOS 动画初始化
|
||||||
|
│ ├── markdown.ts # Markdown 解析
|
||||||
|
│ ├── markdownToHtml.ts # Markdown 转 HTML
|
||||||
|
│ ├── validateEmail.ts # 邮箱验证
|
||||||
|
│ └── extendedConfig.ts # 扩展配置
|
||||||
|
└── Style/ # 样式文件
|
||||||
|
└── style.css # 组件样式
|
||||||
|
|
||||||
|
markdown/ # 博客内容 (MDX 格式)
|
||||||
|
└── Blog/
|
||||||
|
├── Blog_1.mdx
|
||||||
|
├── Blog_2.mdx
|
||||||
|
└── ...
|
||||||
|
|
||||||
|
public/ # 静态资源
|
||||||
|
└── images/
|
||||||
|
├── logo/ # Logo 图片
|
||||||
|
├── hero/ # Hero 区域图片
|
||||||
|
├── blog/ # 博客封面图
|
||||||
|
├── portfolio/ # 作品集图片
|
||||||
|
├── services/ # 服务图标
|
||||||
|
├── contact/ # 联系页图片
|
||||||
|
├── counter/ # 计数器图标
|
||||||
|
├── testimonial/ # 评价图片
|
||||||
|
├── footer/ # 页脚图标
|
||||||
|
└── documentation/ # 文档图片
|
||||||
|
```
|
||||||
|
|
||||||
|
## 路由配置
|
||||||
|
|
||||||
|
| 路径 | 页面 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| `/` | Home | 首页 (Hero + 服务 + 作品集 + 评价 + 联系) |
|
||||||
|
| `/about` | About | 关于我 |
|
||||||
|
| `/services` | Services | 服务介绍 |
|
||||||
|
| `/portfolio` | Portfolio | 作品集列表 |
|
||||||
|
| `/blog` | Blog | 博客列表 |
|
||||||
|
| `/contact` | Contact | 联系方式 |
|
||||||
|
| `/documentation` | Documentation | 模板文档 |
|
||||||
|
|
||||||
|
## 数据结构
|
||||||
|
|
||||||
|
### 菜单数据 (src/app/api/data.tsx)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export const menuItems = [
|
||||||
|
{ name: "Home", href: "#home" },
|
||||||
|
{ name: "About", href: "#about" },
|
||||||
|
{ name: "Services", href: "#services" },
|
||||||
|
{ name: "Portfolio", href: "#portfolio" },
|
||||||
|
{ name: "Testimonials", href: "#testimonials" },
|
||||||
|
{ name: "Blog", href: "/#blog" },
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
### 服务数据 (src/app/api/data.tsx)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export const Servicebox = [
|
||||||
|
{
|
||||||
|
icon: '/images/services/ux-design-product_1.svg',
|
||||||
|
title: 'UX & Product Design',
|
||||||
|
description: '服务描述...',
|
||||||
|
},
|
||||||
|
// ...
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
### 作品集数据 (src/app/api/data.tsx)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export const portfolioinfo = [
|
||||||
|
{
|
||||||
|
image: '/images/portfolio/cozycasa.png',
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Cozycasa',
|
||||||
|
slug: 'Cozycasa',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-0' // 布局样式
|
||||||
|
},
|
||||||
|
// ...
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
### 博客类型 (src/types/blog.ts)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export type Blog = {
|
||||||
|
id?: number;
|
||||||
|
title?: string;
|
||||||
|
slug?: string;
|
||||||
|
excerpt?: string;
|
||||||
|
coverImage?: string;
|
||||||
|
date: string;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
## 核心组件说明
|
||||||
|
|
||||||
|
### 布局系统
|
||||||
|
|
||||||
|
- `RootLayout` (src/app/layout.tsx): 根布局,包含主题Provider、认证Provider、Header和Footer
|
||||||
|
- 使用 `next-themes` 实现深色/浅色模式切换
|
||||||
|
- 使用 `next-auth` 实现用户认证
|
||||||
|
|
||||||
|
### 主题切换
|
||||||
|
|
||||||
|
主题通过 `next-themes` 的 `ThemeProvider` 管理,支持:
|
||||||
|
|
||||||
|
- `light` - 浅色主题
|
||||||
|
- `dark` - 深色主题
|
||||||
|
- `system` - 跟随系统
|
||||||
|
|
||||||
|
### 动画效果
|
||||||
|
|
||||||
|
使用 AOS (Animate On Scroll) 库,在 `src/utils/aos.tsx` 初始化
|
||||||
|
|
||||||
|
### 认证系统
|
||||||
|
|
||||||
|
使用 `next-auth` v4,配置文件位于 `src/app/api/auth/[...nextauth]/route.ts`。
|
||||||
|
|
||||||
|
启用社交登录需要:
|
||||||
|
|
||||||
|
1. 在 `.env.local` 中配置环境变量:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NEXTAUTH_SECRET=your-secret-key
|
||||||
|
NEXTAUTH_URL=http://localhost:3000
|
||||||
|
|
||||||
|
# Google 登录
|
||||||
|
GOOGLE_CLIENT_ID=your-google-client-id
|
||||||
|
GOOGLE_CLIENT_SECRET=your-google-client-secret
|
||||||
|
|
||||||
|
# GitHub 登录
|
||||||
|
GITHUB_ID=your-github-id
|
||||||
|
GITHUB_SECRET=your-github-secret
|
||||||
|
```
|
||||||
|
|
||||||
|
1. 在 `route.ts` 中取消对应 provider 的注释
|
||||||
|
|
||||||
|
## 常见修改任务
|
||||||
|
|
||||||
|
### 修改网站信息
|
||||||
|
|
||||||
|
1. 修改 `src/components/Layout/Header/index.tsx` 中的 Logo
|
||||||
|
2. 修改 `src/components/Layout/Footer/index.tsx` 中的版权信息
|
||||||
|
3. 修改 `src/app/layout.tsx` 中的 metadata
|
||||||
|
|
||||||
|
### 修改导航菜单
|
||||||
|
|
||||||
|
编辑 `src/app/api/data.tsx` 中的 `menuItems` 数组
|
||||||
|
|
||||||
|
### 添加新页面
|
||||||
|
|
||||||
|
1. 在 `src/app/(site)/` 目录下创建新文件夹和 `page.tsx`
|
||||||
|
2. 在 `menuItems` 中添加导航项
|
||||||
|
|
||||||
|
### 添加博客文章
|
||||||
|
|
||||||
|
1. 在 `markdown/Blog/` 目录下创建新的 `.mdx` 文件
|
||||||
|
2. 使用 frontmatter 定义标题、日期、封面图等
|
||||||
|
|
||||||
|
### 修改样式主题
|
||||||
|
|
||||||
|
1. 编辑 `src/app/globals.css` 中的 CSS 变量
|
||||||
|
2. 或修改 `tailwind.config.ts` 中的主题配置
|
||||||
|
|
||||||
|
### 修改服务/作品集数据
|
||||||
|
|
||||||
|
编辑 `src/app/api/data.tsx` 中对应的数据数组
|
||||||
|
|
||||||
|
## 图片资源
|
||||||
|
|
||||||
|
- 存放在 `public/images/` 目录
|
||||||
|
- 使用 `getImgPath()` 工具函数获取路径 (src/utils/image.ts)
|
||||||
|
- 引用路径:`/images/xxx.jpg`
|
||||||
|
|
||||||
|
## 安全说明
|
||||||
|
|
||||||
|
以下依赖版本已锁定以修复安全漏洞:
|
||||||
|
|
||||||
|
- **Next.js 15.5.9** - 锁定版本,修复漏洞编号为:CVE-2025-66478
|
||||||
|
- **React 19.2.3** - 修复 React Server Components 远程代码执行漏洞 (CVE-2025-55182)
|
||||||
|
|
||||||
|
请勿使用 `^` 或 `~` 前缀以避免自动升级到有漏洞的版本。
|
||||||
50
markdown/Blog/Blog_1.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: Business from the brink of ruin by optimizing our website....
|
||||||
|
excerpt: Business from the brink of ruin by optimizing our website....
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_1.png
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_2.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: The work is top-notch and I consistently outrank all my...
|
||||||
|
excerpt: The work is top-notch and I consistently outrank all my...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_2.jpg
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_3.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: Grow my business through organic search and marketing...
|
||||||
|
excerpt: Grow my business through organic search and marketing...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_3.png
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_4.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: Tailored to your audience to enhance brand awareness...
|
||||||
|
excerpt: Tailored to your audience to enhance brand awareness...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_4.jpg
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_5.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: Uncover valuable insights for strategic business decisions...
|
||||||
|
excerpt: Uncover valuable insights for strategic business decisions...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_5.jpg
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_6.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: Drive growth and achieve your business objectives effectively...
|
||||||
|
excerpt: Drive growth and achieve your business objectives effectively...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_6.jpg
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_7.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: Free access to our global partner network and marketplace...
|
||||||
|
excerpt: Free access to our global partner network and marketplace...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_7.jpg
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_8.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: Define each stage of work to see whats important for you...
|
||||||
|
excerpt: Define each stage of work to see whats important for you...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_8.jpg
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
50
markdown/Blog/Blog_9.mdx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: We have a plan that aligns perfectly with your goal...
|
||||||
|
excerpt: We have a plan that aligns perfectly with your goal...
|
||||||
|
date: 2025-11-08
|
||||||
|
coverImage: /images/blog/blog_9.jpg
|
||||||
|
author: silicaman
|
||||||
|
authorImage: /images/blogdetail-page/silicaman.png
|
||||||
|
---
|
||||||
|
|
||||||
|
# Main Heading & Points
|
||||||
|
|
||||||
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
- Vivamus eu lacus scelerisque, placerat commodo lectus.
|
||||||
|
- Etiam et ante at ex porta fringilla.
|
||||||
|
- Nullam dignissim sem eu magna aliquet, sit amet volutpat tellus
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
We are a dedicated team of passionate product managers, developers, UX/UI designers, QA engineers experts helping businesses from new startups
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable making this the first true generator on the Internet. It uses a dictionary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- Trends
|
||||||
|
- Design
|
||||||
|
- Research
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
- [Facebook](#)
|
||||||
|
- [Twitter](#)
|
||||||
|
- [Linkedin](#)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join our newsletter
|
||||||
|
|
||||||
|
Email address: [Subscribe](#)
|
||||||
20
next.config.mjs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/** @type {import('next').NextConfig} */
|
||||||
|
|
||||||
|
// 如需部署到子路径(如 GitHub Pages),设置 basePath
|
||||||
|
// 例如:const basePath = "/your-repo-name";
|
||||||
|
const basePath = "";
|
||||||
|
|
||||||
|
const nextConfig = {
|
||||||
|
// output: "export", // 静态导出模式,部署时取消注释
|
||||||
|
basePath,
|
||||||
|
assetPrefix: basePath,
|
||||||
|
images: {
|
||||||
|
unoptimized: true,
|
||||||
|
},
|
||||||
|
trailingSlash: true,
|
||||||
|
env: {
|
||||||
|
NEXT_PUBLIC_BASE_PATH: basePath,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default nextConfig;
|
||||||
42
package.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"name": "venus_project",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "next dev -H 0.0.0.0 -p 3000",
|
||||||
|
"build": "next build",
|
||||||
|
"export": "next build",
|
||||||
|
"start": "next start -H 0.0.0.0 -p 3000",
|
||||||
|
"lint": "next lint"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@iconify/icons-ion": "^1.2.10",
|
||||||
|
"@iconify/react": "^5.0.1",
|
||||||
|
"aos": "^2.3.4",
|
||||||
|
"axios": "^1.7.2",
|
||||||
|
"date-fns": "^3.4.0",
|
||||||
|
"gray-matter": "^4.0.3",
|
||||||
|
"next": "15.5.9",
|
||||||
|
"next-auth": "^4.24.11",
|
||||||
|
"next-themes": "^0.3.0",
|
||||||
|
"nextjs-toploader": "^3.7.15",
|
||||||
|
"react": "19.2.3",
|
||||||
|
"react-dom": "19.2.3",
|
||||||
|
"react-hot-toast": "^2.4.1",
|
||||||
|
"react-slick": "^0.30.2",
|
||||||
|
"remark": "^15.0.1",
|
||||||
|
"remark-html": "^16.0.1",
|
||||||
|
"slick-carousel": "^1.8.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@tailwindcss/postcss": "^4.0.0",
|
||||||
|
"@types/aos": "^3.0.7",
|
||||||
|
"@types/node": "^20",
|
||||||
|
"@types/react": "^18",
|
||||||
|
"@types/react-dom": "^18",
|
||||||
|
"@types/react-slick": "^0.23.13",
|
||||||
|
"postcss": "^8",
|
||||||
|
"tailwindcss": "^4.0.0",
|
||||||
|
"typescript": "^5"
|
||||||
|
}
|
||||||
|
}
|
||||||
35
page.tsx
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// This is a mock data source. In a real app, you might fetch this
|
||||||
|
// from a headless CMS, a database, or a local JSON file.
|
||||||
|
const portfolioItems = [
|
||||||
|
{ slug: "project-alpha", title: "Project Alpha", content: "Details about project Alpha..." },
|
||||||
|
{ slug: "project-beta", title: "Project Beta", content: "Details about project Beta..." },
|
||||||
|
{ slug: "venus-nextjs", title: "Venus Next.js Theme", content: "Details about the Venus theme..." },
|
||||||
|
];
|
||||||
|
|
||||||
|
// This function tells Next.js which slugs to pre-render at build time.
|
||||||
|
export async function generateStaticParams() {
|
||||||
|
// We return an array of objects, where each object has a `slug` property
|
||||||
|
// matching the dynamic segment `[slug]`.
|
||||||
|
return portfolioItems.map((item) => ({
|
||||||
|
slug: item.slug,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is your page component.
|
||||||
|
export default function PortfolioPage({ params }: { params: { slug: string } }) {
|
||||||
|
// Find the specific portfolio item based on the slug from the URL.
|
||||||
|
const item = portfolioItems.find((p) => p.slug === params.slug);
|
||||||
|
|
||||||
|
if (!item) {
|
||||||
|
// Optionally, handle cases where the slug doesn't match any item.
|
||||||
|
// In a static export, this would typically lead to a 404.
|
||||||
|
return <div>Project not found.</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1>{item.title}</h1>
|
||||||
|
<p>{item.content}</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
8
postcss.config.mjs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/** @type {import('postcss-load-config').Config} */
|
||||||
|
const config = {
|
||||||
|
plugins: {
|
||||||
|
'@tailwindcss/postcss': {},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default config;
|
||||||
BIN
public/images/blog/blog_1.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
public/images/blog/blog_2.jpg
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
public/images/blog/blog_3.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
public/images/blog/blog_4.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/images/blog/blog_5.jpg
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
public/images/blog/blog_6.jpg
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
public/images/blog/blog_7.jpg
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
public/images/blog/blog_8.jpg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
public/images/blog/blog_9.jpg
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
public/images/blogdetail-page/silicaman.png
Normal file
|
After Width: | Height: | Size: 9.9 KiB |
8
public/images/contact-page/Career.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<svg width="38" height="32" viewBox="0 0 38 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M21.625 3.69373H16.375C16.201 3.69373 16.034 3.62952 15.911 3.51524C15.7879 3.40096 15.7188 3.24597 15.7188 3.08435V0.646851C15.7188 0.485234 15.7879 0.330237 15.911 0.215958C16.034 0.101678 16.201 0.0374756 16.375 0.0374756H21.625C21.799 0.0374756 21.966 0.101678 22.089 0.215958C22.2121 0.330237 22.2812 0.485234 22.2812 0.646851V3.08435C22.2812 3.24597 22.2121 3.40096 22.089 3.51524C21.966 3.62952 21.799 3.69373 21.625 3.69373ZM17.0312 2.47498H20.9688V1.25623H17.0312V2.47498Z" fill="white"/>
|
||||||
|
<path d="M21.625 9.78746C21.6244 10.2721 21.4168 10.7368 21.0477 11.0796C20.6786 11.4223 20.1782 11.6151 19.6562 11.6156H18.3438C17.8218 11.6151 17.3214 11.4223 16.9523 11.0796C16.5832 10.7368 16.3756 10.2721 16.375 9.78746H13.75C12.8105 9.78776 11.8938 9.51881 11.125 9.01733V15.2718C11.125 15.4335 11.1941 15.5885 11.3172 15.7027C11.4403 15.817 11.6072 15.8812 11.7812 15.8812H26.2188C26.3928 15.8812 26.5597 15.817 26.6828 15.7027C26.8059 15.5885 26.875 15.4335 26.875 15.2718V9.01733C26.1062 9.51877 25.1895 9.78772 24.25 9.78746H21.625Z" fill="white"/>
|
||||||
|
<path d="M26.875 2.47498H11.125C10.951 2.47498 10.784 2.53918 10.661 2.65346C10.5379 2.76774 10.4688 2.92273 10.4688 3.08435V5.52185C10.4698 6.32964 10.8158 7.10407 11.4309 7.67527C12.0461 8.24646 12.8801 8.56777 13.75 8.56873H16.375C16.3756 8.08404 16.5832 7.61936 16.9523 7.27663C17.3214 6.93391 17.8218 6.74113 18.3438 6.7406H19.6562C20.1782 6.74113 20.6786 6.93391 21.0477 7.27663C21.4168 7.61936 21.6244 8.08404 21.625 8.56873H24.25C25.1199 8.56777 25.9539 8.24646 26.5691 7.67527C27.1842 7.10407 27.5302 6.32964 27.5312 5.52185V3.08435C27.5312 2.92273 27.4621 2.76774 27.339 2.65346C27.216 2.53918 27.049 2.47498 26.875 2.47498Z" fill="white"/>
|
||||||
|
<path d="M19.6562 7.95935H18.3438C17.9813 7.95935 17.6875 8.23218 17.6875 8.56873V9.78748C17.6875 10.124 17.9813 10.3969 18.3438 10.3969H19.6562C20.0187 10.3969 20.3125 10.124 20.3125 9.78748V8.56873C20.3125 8.23218 20.0187 7.95935 19.6562 7.95935Z" fill="white"/>
|
||||||
|
<path d="M6.53125 18.1562H1.28125C0.918813 18.1562 0.625 18.4291 0.625 18.7656V30.9531C0.625 31.2897 0.918813 31.5625 1.28125 31.5625H6.53125C6.89369 31.5625 7.1875 31.2897 7.1875 30.9531V18.7656C7.1875 18.4291 6.89369 18.1562 6.53125 18.1562Z" fill="#2F73F2"/>
|
||||||
|
<path d="M36.6643 14.8064C35.9713 14.1605 35.0455 13.7756 34.0652 13.7256C33.0848 13.6757 32.1192 13.9644 31.3544 14.536L24.7558 19.4376C25.4191 19.9512 25.9527 20.5939 26.3189 21.3202C26.6851 22.0465 26.8749 22.8386 26.875 23.6406C26.874 24.4484 26.5279 25.2228 25.9128 25.794C25.2977 26.3652 24.4637 26.6865 23.5938 26.6875H15.7188C15.5447 26.6875 15.3778 26.6233 15.2547 26.509C15.1316 26.3947 15.0625 26.2397 15.0625 26.0781C15.0625 25.9165 15.1316 25.7615 15.2547 25.6472C15.3778 25.5329 15.5447 25.4687 15.7188 25.4687H23.5938C24.1157 25.4682 24.6161 25.2754 24.9852 24.9327C25.3543 24.59 25.5619 24.1253 25.5625 23.6406C25.5619 22.9643 25.3878 22.2979 25.0548 21.6965C24.7217 21.0951 24.2392 20.576 23.6472 20.1821C23.4838 20.071 23.3125 19.9703 23.1344 19.8808C23.0832 19.8552 23.0294 19.8341 22.9769 19.8103C22.8328 19.7448 22.6851 19.6865 22.5342 19.6357C22.4788 19.617 22.4246 19.596 22.3683 19.5792C22.1763 19.5229 21.9804 19.4784 21.7821 19.4462C21.729 19.4373 21.6752 19.4305 21.6215 19.4233C21.4054 19.393 21.1873 19.3769 20.9688 19.375H17.215C15.5454 18.5448 13.6748 18.1253 11.7812 18.1562C10.6726 18.1532 9.56867 18.2905 8.5 18.5645V30.3437H22.5044C23.3522 30.3439 24.1901 30.1744 24.961 29.8467C25.732 29.519 26.4177 29.0409 26.9716 28.4448L36.7896 17.8896C37.1892 17.4549 37.3981 16.8965 37.3749 16.3253C37.3517 15.7542 37.0981 15.212 36.6643 14.8064Z" fill="#2F73F2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.6 KiB |
BIN
public/images/contact-page/contact.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
14
public/images/contact-page/email.svg
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_19_63)">
|
||||||
|
<path d="M0.405078 12.1477L2.05859 10.9279V16.3499L0 15.3253V12.9493C0 12.6332 0.150078 12.3357 0.405078 12.1477Z" fill="#2F73F2"/>
|
||||||
|
<path d="M34 12.9493V15.3253L31.9414 16.3499V10.9279L33.5949 12.1477C33.8499 12.3357 34 12.6332 34 12.9493Z" fill="#2F73F2"/>
|
||||||
|
<path d="M34 17.5505V33.0039C34 33.5538 33.5537 34 33.0039 34H0.996094C0.44625 34 0 33.5538 0 33.0039V17.5505C0.998949 18.048 15.5813 25.309 16.5557 25.7942C16.6959 25.8639 16.8479 25.8985 17 25.8985C17.1521 25.8985 17.3041 25.8639 17.4443 25.7942C18.3919 25.3224 33.7767 17.6617 34 17.5505Z" fill="#2F73F2"/>
|
||||||
|
<path d="M19.9883 1.99219H14.0117L16.4023 0.199219C16.7563 -0.0664062 17.2437 -0.0664062 17.5977 0.199219L19.9883 1.99219Z" fill="#2F73F2"/>
|
||||||
|
<path d="M28.9531 3.98438H5.04688C4.49703 3.98438 4.05078 4.43063 4.05078 4.98047V17.342L17 23.79L29.9492 17.342V4.98047C29.9492 4.43063 29.503 3.98438 28.9531 3.98438ZM17 15.9375H11.0234C10.4736 15.9375 10.0273 15.4913 10.0273 14.9414C10.0273 14.3916 10.4736 13.9453 11.0234 13.9453H17C17.5498 13.9453 17.9961 14.3916 17.9961 14.9414C17.9961 15.4913 17.5498 15.9375 17 15.9375ZM22.9766 11.9531H11.0234C10.4736 11.9531 10.0273 11.5069 10.0273 10.957C10.0273 10.4072 10.4736 9.96094 11.0234 9.96094H22.9766C23.5264 9.96094 23.9727 10.4072 23.9727 10.957C23.9727 11.5069 23.5264 11.9531 22.9766 11.9531Z" fill="white"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_19_63">
|
||||||
|
<rect width="34" height="34" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/contact/form-line.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/contact/from-round-line.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
public/images/contact/google-pay.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
public/images/contact/play-juction.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
public/images/contact/stripe.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/images/contact/wise.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
9
public/images/counter/admin.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<rect width="30" height="30" fill="url(#pattern0_3_138)"/>
|
||||||
|
<defs>
|
||||||
|
<pattern id="pattern0_3_138" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||||
|
<use xlink:href="#image0_3_138" transform="scale(0.0333333)"/>
|
||||||
|
</pattern>
|
||||||
|
<image id="image0_3_138" width="30" height="30" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAC8ElEQVRIia2XO08UYRSGn71wURxFsFAjggQT43UpSMTOgkLtrCxt/AO6nbGxnsTW0l9gY7QiodLEiim8FAIaMBITLptdL+Cyu+aQd8jnuLvzLfAm28yceZ/vds75NnPlQRkPBcAxYADoB3qBhj7LABtACVgDVqIwqKRZpoGPAkPASeAgUHOA/3kBOeAX8A1YisJgvVOwGZwFzgAHBKz7LA2QdQbwBfgUhUGtWVBSPcAEcA7oBqodQFFsVT7mMVEoVnrSwBYwCZzocJatBlCT12QS7oJteca1r1t7ACa1Jc/xQrGSawYeA457Qs2gS7+cR/yWvMeSYEuR0TYnNlZG39hp/azfup5lUr4179FCsWIs8np4Wqe3mgK1j98DX4FNPbe9OwWcd2KaqS6GsUpZFYf4MKXN9gMw70CJwmAzCoN5vUub9fZhKxQrgYEHgb6UE5xTZVpqE7OkmHZ7XhdrMAanzTYr0z+tAqIwsHflFrXBVS0G93scKjwMfWWs/qwKfppsiQ6rkjVVoVjpVoxP0enNes62ppUZahMzpJi0bTM18h5BO8FKGdx0UimM08lnEtvKe6SAC7bYiwLFbe2wc058wZm8mnhfB/CGau+gntU9l9fVRl5pcshjtA2lU7UJKK7d3R4raO9LBl4FhtucxhhosZd0ORhIxKypbn9UQ2g3ABvkagz+qbRKwqsCXgduAiPa02Yq68bxCnitb7sScVmxtsF2MVtWy3LBG0qRe8DVlOVDA7qs3xvgKfBdTcSd7bJdBuNqtAj8dqpTVbN75AlN6hrwWFsYd7ysGIs4IDtgC9qXuEo9FHy3GpFHXM3MeyEKgxKJ+junJbegOxrtXjUsr7q859zNjmUpMgscAab2ARprSp6z7jU32XEsbaaBt/sINq9ptc0dNWt1K8At4IlTFnejsjxuRGFgnv+oVZOwBnAfeAHcBW6ruvnoB/AceBaFwUyrD3z/tFljsCJiK3GhReWyS+BLYCYKg3dt3YC/UtPP4bgc8QcAAAAASUVORK5CYII="/>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
9
public/images/counter/bag.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="30" height="30" viewBox="0 0 30 26" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<rect width="30" height="30" fill="url(#pattern0_3_142)"/>
|
||||||
|
<defs>
|
||||||
|
<pattern id="pattern0_3_142" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||||
|
<use xlink:href="#image0_3_142" transform="scale(0.0333333 0.0384615)"/>
|
||||||
|
</pattern>
|
||||||
|
<image id="image0_3_142" width="30" height="30" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAaCAYAAACgoey0AAABwElEQVRIie2WP0sDQRDFfxejqHBB/IMWVha2prKwCdbWfoeAlZhCQSxsBDn0syhYW9nKoZVgJ4igQkiIhqhRRmbDcca7uYRY+eDYvWVm39vZmWG9pa0aBvjAAbCWYnoG7ISBX0/bMm8g9YBdYMNgKzaNYqW+HQb+Z5JhzrDZKFA22DmU1ScRlhO3gULkfxVodhF3rvOC+qQSjwHjwG+hkU0vdWzq/DVmMxazmSpW6nFxDnJ1L5JcJWAmQaUIquno6Ym8Hmwc5Hof85qxrYQToxFxeO/DBhXk5yz3MQC0LVk9EPwT/xksDSQOycqh2NpHSlX8QFZiT0vlObY+oWLM5L2E+ga4cF8Y+DJeR5qHmdhsrDX/1GX9TsNthSfEDVXbyiDWstYNrkM2xCHUtrmoItK+HwLDwP8w+i4qVyjJVQUWgE3gIUWxEBwCty6zi5W6nGAEONYxCXPAURj4VZfVw8CkfmmY1azOR8TIWtEYbuHqOFvLQOyWgfvIXUvClTJk9Sc91vE6sBJbm85YHR3iLE5iO5+FpIt/J1xvfWyUFd+PBEd8ok1g0BCOU5m4UEvLk2fpvjzUBsQulbAXBv4VwBedGHeqzf4DeAAAAABJRU5ErkJggg=="/>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
9
public/images/counter/star.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<rect width="30" height="30" fill="url(#pattern0_3_134)"/>
|
||||||
|
<defs>
|
||||||
|
<pattern id="pattern0_3_134" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||||
|
<use xlink:href="#image0_3_134" transform="scale(0.0333333)"/>
|
||||||
|
</pattern>
|
||||||
|
<image id="image0_3_134" width="30" height="30" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACq0lEQVRIib2Wy2sUQRCHv30kGx/tI+hqfMSDgSUoZA455GAQRDSCGDE38ejNY+aQSw7idRAk4L8gehRE9OJFYgxGm4ig+EAxh6Dga3xikpUKNThMZsaZwc0PhmW6qvvrrumq2lLf6BcKaCNwTKfdtJ75nHeJchEqMAZc0WesyAJFwHVgOPQ+7Lh+fTXA+4He0HuvjrUcfDzj2H8FV4ChmPEhx/UrrQT3A42Y8YbaWgY+nTCnrLaWgDuAwRT7oOP6Ha0AH0wIc6CG+mRSFdipuZmkJvAVGAHWpviJbcRx/ZfAeqCU4vtOwH3AGgXE6TewGTiU4STicxf4CLQl+MiGuqr6sqhPnH4puDsDuFt951N8ltNOvvEs8D0YiJH47Es5QVht6pt0dyrKmhWHOWBK4q6G8CQJfy3PpVHfWuTTlXVtYUxZz8wFEOmN08BTDXlw+iVgB9CTA9yjc5ZCp1zUtaetZ5b7cDU0YUGNnzRcBvgJHMiZdmWd8wJoB3zgifXMfNQpKnGYBN4C64CBHNBA/RpuWWMyCo2eOKwfwAywCdhQALxLTms9M5Pk8K8QSrgm9DePpJjsTfNPA5e1osmlOw/cygkfcFy/VgQsu+7UC/JeT35JL18WyQXbUwTcqfCmwqXU3QDGgccZwPW0bpYG7grlIgqWtvcMuABci9jjdCovWJrG1pjGUdL8lgp0Vv9bv0oBH3Zcf3ce8Da1hcElfd4AD7Qw3AaOAlcT1pFPdDIPeHukaVS0Pcq3fQh8CwzWM5JqZ4BR3UxUJxzXX9Gb48DtWrGaekLpOB+AexrWFX3bembBeuYicAR4FDFL7d6SBSwFXSqXAAX8HLifJY2sZ6TLyd/fy6Hh1+EIBYormQK22i5lA5LDmWU9IxfvnOP61zUz7ljPSA/+K+APH/SU/oa5TVUAAAAASUVORK5CYII="/>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
20
public/images/documentation/Categories=Nextjs.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_23122_21590)">
|
||||||
|
<path d="M20 40C31.0457 40 40 31.0457 40 20C40 8.9543 31.0457 0 20 0C8.9543 0 0 8.9543 0 20C0 31.0457 8.9543 40 20 40Z" fill="black"/>
|
||||||
|
<path d="M33.2241 35.0044L15.3647 12H12V27.9934H14.6919V15.4184L31.1106 36.6322C31.8505 36.1372 32.5566 35.5934 33.2241 35.0044Z" fill="url(#paint0_linear_23122_21590)"/>
|
||||||
|
<path d="M25.5557 12H28.2222V28H25.5557V12Z" fill="url(#paint1_linear_23122_21590)"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_23122_21590" x1="24.2222" y1="25.8888" x2="32.1111" y2="35.6666" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_23122_21590" x1="26.8889" y1="12" x2="26.8442" y2="23.75" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="white"/>
|
||||||
|
<stop offset="1" stop-color="white" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip0_23122_21590">
|
||||||
|
<rect width="40" height="40" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
4
public/images/documentation/Categories=React.svg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M20 23.5625C21.9675 23.5625 23.5625 21.9675 23.5625 20C23.5625 18.0325 21.9675 16.4375 20 16.4375C18.0325 16.4375 16.4375 18.0325 16.4375 20C16.4375 21.9675 18.0325 23.5625 20 23.5625Z" fill="#61DAFB"/>
|
||||||
|
<path d="M33.5313 14.125C32.8438 13.875 32.125 13.625 31.375 13.4063C31.5625 12.6563 31.7187 11.9062 31.8438 11.1875C32.5 7.0625 31.7813 4.15625 29.7813 3.03125C29.1875 2.6875 28.5313 2.53125 27.7812 2.53125C25.5938 2.53125 22.8125 4.15625 20 6.875C17.1875 4.15625 14.4062 2.53125 12.2187 2.53125C11.4687 2.53125 10.8125 2.6875 10.2188 3.03125C8.21875 4.1875 7.5 7.09375 8.15625 11.1875C8.28125 11.9062 8.4375 12.6563 8.625 13.4063C7.875 13.625 7.15625 13.8437 6.46875 14.125C2.5625 15.625 0.4375 17.6875 0.4375 20C0.4375 22.3125 2.59375 24.375 6.46875 25.875C7.15625 26.125 7.875 26.375 8.625 26.5938C8.4375 27.3438 8.28125 28.0937 8.15625 28.8125C7.5 32.9375 8.21875 35.8438 10.2188 36.9688C10.8125 37.3125 11.4687 37.4688 12.2187 37.4688C14.4375 37.4688 17.2187 35.8438 20 33.125C22.8125 35.8438 25.5938 37.4688 27.7812 37.4688C28.5313 37.4688 29.1875 37.3125 29.7813 36.9688C31.7813 35.8125 32.5 32.9062 31.8438 28.8125C31.7187 28.0937 31.5625 27.3438 31.375 26.5938C32.125 26.375 32.8438 26.1563 33.5313 25.875C37.4375 24.375 39.5625 22.3125 39.5625 20C39.5625 17.6875 37.4375 15.625 33.5313 14.125ZM28.9062 4.59375C30.1875 5.34375 30.625 7.65625 30.0938 10.9375C30 11.5937 29.8438 12.2813 29.6562 13C28.0313 12.625 26.3125 12.375 24.5 12.2187C23.4375 10.7187 22.3437 9.375 21.25 8.15625C23.5625 5.875 25.9062 4.3125 27.8125 4.3125C28.2187 4.3125 28.5937 4.40625 28.9062 4.59375ZM25.4063 23.125C24.8438 24.125 24.1875 25.125 23.5 26.125C22.3437 26.2188 21.1875 26.25 20 26.25C18.7812 26.25 17.625 26.2188 16.5 26.125C15.8125 25.125 15.1875 24.125 14.625 23.125C14.0312 22.0938 13.4687 21.0313 12.9687 20C13.4687 18.9688 14.0312 17.9063 14.625 16.875C15.1875 15.875 15.8437 14.875 16.5312 13.875C17.6875 13.7813 18.8437 13.75 20.0312 13.75C21.25 13.75 22.4063 13.7813 23.5313 13.875C24.2188 14.875 24.8438 15.875 25.4063 16.875C26 17.9063 26.5625 18.9688 27.0625 20C26.5312 21.0313 26 22.0625 25.4063 23.125ZM28 22.0937C28.4687 23.1875 28.8437 24.25 29.1875 25.3125C28.125 25.5625 27 25.75 25.8125 25.9063C26.1875 25.3125 26.5937 24.6875 26.9375 24.0313C27.3125 23.375 27.6562 22.7187 28 22.0937ZM20 30.5625C19.25 29.75 18.5312 28.875 17.8437 27.9688C18.5625 28 19.2812 28.0312 20 28.0312C20.7187 28.0312 21.4375 28 22.1562 27.9688C21.4687 28.875 20.75 29.75 20 30.5625ZM14.1875 25.875C13 25.7188 11.875 25.5313 10.8125 25.2813C11.1562 24.25 11.5312 23.1562 12 22.0625C12.3438 22.6875 12.6875 23.3437 13.0625 23.9687C13.4375 24.6562 13.8125 25.25 14.1875 25.875ZM12 17.9062C11.5312 16.8125 11.1562 15.75 10.8125 14.6875C11.875 14.4375 13 14.25 14.1875 14.0938C13.8125 14.6875 13.4062 15.3125 13.0625 15.9688C12.6875 16.625 12.3438 17.2812 12 17.9062ZM20 9.4375C20.75 10.25 21.4687 11.125 22.1562 12.0312C21.4375 12 20.7187 11.9687 20 11.9687C19.2812 11.9687 18.5625 12 17.8437 12.0312C18.5312 11.125 19.25 10.25 20 9.4375ZM26.9375 16L25.8125 14.125C27 14.2812 28.125 14.4687 29.1875 14.7188C28.8437 15.75 28.4687 16.8438 28 17.9375C27.6562 17.2813 27.3125 16.625 26.9375 16ZM9.90625 10.9375C9.375 7.65625 9.8125 5.34375 11.0937 4.59375C11.4062 4.40625 11.7812 4.3125 12.1875 4.3125C14.0625 4.3125 16.4062 5.84375 18.75 8.15625C17.6562 9.34375 16.5625 10.7187 15.5 12.2187C13.6875 12.375 11.9687 12.6562 10.3437 13C10.1562 12.2813 10.0313 11.5937 9.90625 10.9375ZM2.1875 20C2.1875 18.5313 3.96875 16.9688 7.09375 15.8125C7.71875 15.5625 8.40625 15.3438 9.09375 15.1563C9.59375 16.7188 10.2187 18.375 10.9687 20.0312C10.2187 21.6875 9.5625 23.3125 9.09375 24.875C4.78125 23.625 2.1875 21.75 2.1875 20ZM11.0937 35.4063C9.8125 34.6563 9.375 32.3438 9.90625 29.0625C10 28.4063 10.1562 27.7188 10.3437 27C11.9687 27.375 13.6875 27.625 15.5 27.7813C16.5625 29.2813 17.6562 30.625 18.75 31.8438C16.4375 34.125 14.0937 35.6875 12.1875 35.6875C11.7812 35.6875 11.4062 35.5938 11.0937 35.4063ZM30.0938 29.0625C30.625 32.3438 30.1875 34.6563 28.9062 35.4063C28.5937 35.5938 28.2187 35.6875 27.8125 35.6875C25.9375 35.6875 23.5937 34.1563 21.25 31.8438C22.3437 30.6563 23.4375 29.2813 24.5 27.7813C26.3125 27.625 28.0313 27.3438 29.6562 27C29.8438 27.7188 29.9688 28.4063 30.0938 29.0625ZM32.9063 24.1875C32.2813 24.4375 31.5938 24.6563 30.9062 24.8438C30.4062 23.2813 29.7813 21.625 29.0312 19.9688C29.7813 18.3125 30.4375 16.6875 30.9062 15.125C35.2188 16.375 37.8125 18.25 37.8125 20C37.8125 21.4688 36 23.0313 32.9063 24.1875Z" fill="#61DAFB"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.5 KiB |
3
public/images/documentation/Categories=Tailwind.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="41" height="40" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1942 8.4375C14.8604 8.4375 11.5277 11.0883 10.1937 16.39C12.1939 13.7392 14.5273 12.7453 17.1938 13.4076C18.7152 13.7854 19.8031 14.8827 21.0063 16.0976C22.9673 18.076 25.2373 20.3655 30.194 20.3655C35.5271 20.3655 38.8606 17.7146 40.1938 12.4138C38.1944 15.0646 35.861 16.0585 33.1945 15.3954C31.6723 15.0176 30.5844 13.9202 29.3812 12.7061C27.4202 10.7262 25.151 8.4375 20.1942 8.4375ZM10.1937 20.3655C4.86063 20.3655 1.5271 23.0163 0.193848 28.318C2.19412 25.6671 4.52751 24.6733 7.19324 25.3356C8.71539 25.7134 9.80332 26.8107 11.0065 28.0256C12.9675 30.004 15.2367 32.2935 20.1942 32.2935C25.5273 32.2935 28.8608 29.6434 30.194 24.3417C28.1938 26.9926 25.8604 27.9864 23.1939 27.3241C21.6725 26.9455 20.5846 25.8482 19.3814 24.6341C17.4203 22.6558 15.1504 20.3655 10.1937 20.3655Z" fill="#38BDF8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 960 B |
11
public/images/documentation/Categories=Typescript.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_23122_21594)">
|
||||||
|
<path d="M7.08447 14.6875H38.2313V37.7094H7.08447V14.6875Z" fill="white"/>
|
||||||
|
<path d="M0.46875 19.9727V39.5039H39.5312V0.441406H0.46875V19.9727ZM31.9469 18.4102C32.8825 18.6273 33.7328 19.1166 34.3906 19.8164C34.7527 20.1935 35.0675 20.6132 35.3281 21.0664C35.3281 21.1164 33.6406 22.257 32.6125 22.8945C32.575 22.9195 32.425 22.757 32.2594 22.5102C32.0717 22.1863 31.805 21.9153 31.4842 21.7224C31.1635 21.5295 30.799 21.421 30.425 21.407C29.2406 21.3258 28.4781 21.9477 28.4844 22.9695C28.4749 23.2239 28.5331 23.4763 28.6531 23.7008C28.9125 24.2414 29.3969 24.5633 30.9156 25.2195C33.7125 26.4227 34.9094 27.2164 35.6531 28.3445C36.4844 29.5945 36.6688 31.6133 36.1063 33.107C35.4813 34.732 33.95 35.8352 31.7844 36.2008C30.7953 36.3141 29.7959 36.3036 28.8094 36.1695C27.2974 35.9203 25.9046 35.1944 24.8344 34.0977C24.475 33.7008 23.775 32.6664 23.8188 32.5914C23.9326 32.5064 24.0527 32.4301 24.1781 32.3633L25.625 31.5633L26.7469 30.9133L26.9812 31.2602C27.3769 31.8259 27.8803 32.308 28.4625 32.6789C29.7125 33.3352 31.4187 33.2445 32.2625 32.4852C32.5458 32.2069 32.7225 31.8381 32.7619 31.443C32.8013 31.0478 32.7009 30.6514 32.4781 30.3227C32.1656 29.8883 31.5406 29.5227 29.7937 28.7602C27.7781 27.8914 26.9094 27.3539 26.1156 26.4977C25.6203 25.9325 25.2544 25.2659 25.0437 24.5445C24.8867 23.7203 24.8635 22.8761 24.975 22.0445C25.3906 20.0977 26.85 18.7383 28.9812 18.3352C29.9683 18.2132 30.968 18.2406 31.9469 18.4164V18.4102ZM22.7781 20.0477V21.6477H17.7062V36.0945H14.1094V21.6445H9.025V20.082C9.00905 19.5432 9.02157 19.0039 9.0625 18.4664C9.0875 18.4383 12.1875 18.4383 15.9375 18.4383H22.7594L22.7781 20.0477Z" fill="#007ACC"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_23122_21594">
|
||||||
|
<rect width="40" height="40" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
8
public/images/documentation/axios.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<svg width="188" height="28" viewBox="0 0 188 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M93.295 3.65206L86.356 9.30495H90.8876V27.68L93.295 25.7411V3.65206Z" fill="#5A29E4"/>
|
||||||
|
<path d="M95.295 24.0997L102.356 18.305H97.6975V0.350052L95.295 2.02275V24.0997Z" fill="#5A29E4"/>
|
||||||
|
<path d="M182.695 6.95295C183.495 7.36895 184.071 7.72095 184.423 8.00895L186.919 3.25695C185.671 2.48895 184.167 1.80095 182.407 1.19295C180.679 0.584955 178.807 0.280952 176.791 0.280952C174.871 0.280952 173.095 0.600952 171.463 1.24095C169.863 1.88095 168.583 2.82495 167.623 4.07295C166.695 5.32095 166.231 6.87295 166.231 8.72895C166.231 10.809 166.887 12.409 168.199 13.529C169.543 14.617 171.591 15.513 174.343 16.217C176.551 16.793 178.327 17.321 179.671 17.801C181.047 18.249 181.735 19.001 181.735 20.057C181.735 21.625 180.263 22.409 177.319 22.409C175.847 22.409 174.455 22.233 173.143 21.881C171.831 21.529 170.679 21.097 169.687 20.585C168.727 20.073 168.039 19.609 167.623 19.193L165.031 24.233C166.695 25.289 168.599 26.121 170.743 26.729C172.887 27.337 175.047 27.641 177.223 27.641C179.111 27.641 180.871 27.385 182.503 26.873C184.135 26.329 185.447 25.465 186.439 24.281C187.463 23.065 187.975 21.4649 187.975 19.4809C187.975 17.8489 187.591 16.537 186.823 15.545C186.087 14.521 185.015 13.705 183.607 13.097C182.231 12.489 180.599 11.945 178.711 11.465C176.567 10.953 174.935 10.489 173.815 10.073C172.727 9.65695 172.183 8.95295 172.183 7.96095C172.183 6.26495 173.687 5.41695 176.695 5.41695C177.815 5.41695 178.903 5.57695 179.959 5.89695C181.015 6.18495 181.927 6.53695 182.695 6.95295Z" fill="#5A29E4"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M132.182 27.497C130.07 27.497 128.15 27.129 126.422 26.393C124.694 25.625 123.205 24.601 121.957 23.321C120.709 22.009 119.749 20.537 119.077 18.905C118.406 17.273 118.069 15.593 118.069 13.865C118.069 12.105 118.421 10.409 119.125 8.77695C119.829 7.14495 120.822 5.70496 122.102 4.45695C123.382 3.17695 124.885 2.16895 126.613 1.43295C128.341 0.696953 130.229 0.328949 132.277 0.328949C134.389 0.328949 136.31 0.728952 138.038 1.52895C139.766 2.29695 141.238 3.33695 142.454 4.64895C143.702 5.92895 144.661 7.38495 145.333 9.01695C146.005 10.649 146.342 12.3129 146.342 14.0089C146.342 15.7689 145.99 17.465 145.286 19.097C144.582 20.697 143.589 22.137 142.309 23.417C141.061 24.665 139.574 25.657 137.846 26.393C136.118 27.129 134.23 27.497 132.182 27.497ZM123.925 13.913C123.925 15.353 124.262 16.729 124.934 18.041C125.605 19.321 126.549 20.361 127.765 21.161C129.013 21.961 130.501 22.361 132.229 22.361C133.989 22.361 135.477 21.945 136.693 21.113C137.91 20.249 138.837 19.177 139.477 17.8969C140.117 16.5849 140.438 15.241 140.438 13.865C140.438 12.425 140.102 11.0649 139.43 9.78495C138.758 8.50495 137.798 7.48095 136.549 6.71295C135.333 5.91295 133.878 5.51295 132.182 5.51295C130.422 5.51295 128.917 5.92895 127.669 6.76095C126.453 7.59295 125.525 8.64896 124.885 9.92896C124.245 11.209 123.925 12.537 123.925 13.913Z" fill="#5A29E4"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 27.305L11.712 0.472954H16.464L28.128 27.305H21.984L19.296 21.017H8.88L6.192 27.305H0ZM14.112 7.52895L10.176 15.977H17.904L14.112 7.52895Z" fill="#5A29E4"/>
|
||||||
|
<path d="M50.8211 0.472954L58.2131 9.97695L65.6051 0.472954H71.8931L61.2851 14.057L71.5571 27.305H65.2691L58.2131 18.185L51.2051 27.305H44.8211L55.1411 14.057L44.4851 0.472954H50.8211Z" fill="#5A29E4"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
BIN
public/images/documentation/nextauth.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
3
public/images/footer/facebook.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="13" height="20" viewBox="0 0 13 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M0 7.77802V12.2225H3.33333V20.0002H7.77778V12.2225H11.1111L12.2222 7.77802H7.77778V5.5558C7.77778 5.26112 7.89484 4.9785 8.10322 4.77013C8.31159 4.56175 8.5942 4.44469 8.88889 4.44469H12.2222V0.000244141H8.88889C7.41546 0.000244141 6.00239 0.58556 4.96052 1.62743C3.91865 2.6693 3.33333 4.08238 3.33333 5.5558V7.77802H0Z" fill="#9DB7CE"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 451 B |
3
public/images/footer/linkedin.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.5 0.000244141H2.5C1.11929 0.000244141 0 1.11953 0 2.50024V17.5002C0 18.881 1.11929 20.0002 2.5 20.0002H17.5C18.8807 20.0002 20 18.881 20 17.5002V2.50024C20 1.11953 18.8807 0.000244141 17.5 0.000244141ZM5 7.75024C5.55228 7.75024 6 8.19796 6 8.75024V15.0002C6 15.5525 5.55228 16.0002 5 16.0002C4.44772 16.0002 4 15.5525 4 15.0002V8.75024C4 8.19796 4.44772 7.75024 5 7.75024ZM6 5.00024C6 4.44796 5.55228 4.00024 5 4.00024C4.44772 4.00024 4 4.44796 4 5.00024V5.01274C4 5.56503 4.44772 6.01274 5 6.01274C5.55228 6.01274 6 5.56503 6 5.01274V5.00024ZM10.821 8.17923C10.6404 7.91993 10.34 7.75024 10 7.75024C9.44771 7.75024 9 8.19796 9 8.75024V15.0002C9 15.5525 9.44771 16.0002 10 16.0002C10.5523 16.0002 11 15.5525 11 15.0002V11.2502C11 10.8524 11.158 10.4709 11.4393 10.1896C11.7206 9.90828 12.1022 9.75024 12.5 9.75024C12.8978 9.75024 13.2794 9.90828 13.5607 10.1896C13.842 10.4709 14 10.8524 14 11.2502V15.0002C14 15.5525 14.4477 16.0002 15 16.0002C15.5523 16.0002 16 15.5525 16 15.0002V11.2502C16 10.322 15.6313 9.43175 14.9749 8.77537C14.3185 8.11899 13.4283 7.75024 12.5 7.75024C11.9079 7.75024 11.3314 7.90026 10.821 8.17923Z" fill="#9DB7CE"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
3
public/images/footer/twitter.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="25" height="20" viewBox="0 0 25 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M24.9525 0.138231C23.7048 0.749566 22.4822 0.997843 21.2096 1.37338C19.811 -0.204866 17.7375 -0.2922 15.745 0.453879C13.7526 1.19996 12.4475 3.02398 12.4762 5.11625V6.36387C8.4277 6.46742 4.82206 4.62344 2.49525 1.37338C2.49525 1.37338 -2.72231 10.647 7.48574 15.0972C5.15019 16.653 2.82088 17.7023 0 17.5925C4.12714 19.8419 8.62482 20.6155 12.5187 19.4851C16.9851 18.1876 20.6557 14.8402 22.0642 9.82603C22.4844 8.30102 22.693 6.72551 22.6843 5.1437C22.6818 4.83304 24.5682 1.68528 24.9525 0.136983V0.138231Z" fill="#9DB7CE"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 640 B |
BIN
public/images/hero/hero-image.png
Normal file
|
After Width: | Height: | Size: 744 KiB |
BIN
public/images/hero/hero-profile-1.jpg
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/images/hero/hero-profile-2.jpg
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
public/images/hero/hero-profile-3.jpg
Normal file
|
After Width: | Height: | Size: 25 KiB |
9
public/images/hero/line-leyar.svg
Normal file
|
After Width: | Height: | Size: 30 KiB |
9
public/images/hero/round-leyar.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="101" height="101" viewBox="0 0 101 101" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<rect width="101" height="101" fill="url(#pattern0_3_161)"/>
|
||||||
|
<defs>
|
||||||
|
<pattern id="pattern0_3_161" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||||
|
<use xlink:href="#image0_3_161" transform="scale(0.00990099)"/>
|
||||||
|
</pattern>
|
||||||
|
<image id="image0_3_161" width="101" height="101" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABlCAYAAABUfC3PAAAF3ElEQVR4nO3da4gVZRzH8a9mZheLoqSiogIrySAiQoWii7vlVkZJVEgvgoJuSAm9Cbto7wLFhCjoQkS3F6YFdjHL3WwJwnpRQfnCVivKbnalshsbj/ufmM7OM/PMmedyzp7/Dw7uzP7nODMfzpnZmWeeZ1L/8ChdmMnAGuB6YBNwOfB3N25IUSZ33ipVxqzzo8AtwH7AJcDcioWmAo8AvwAPdsA2lKbbUDKQ63Lzvge2lSxjQJ6RT9VBwM3A8RHWte10E0oRyI9AP/CtZZkMZFFu3qfAV4HXtVG6BcUGMh94z7JMEYjBWADssSxzAPCkwN3qcf1rJQXKMtnolY71PkHOBz62LGNAXgCuBY4DVsn7RE9sFANxn2z0UuC0ivrYIH25eab2T8ft8pqYKCsFIstPwJcl9SlBdgIL3TbLf2KhtIL8BlwG7LbUpwY5V75ibetmzt72sfy+cWKgFIEMAG9a6jsZ5BBgENgBDAP7WuoaJTTKRAN5FThHpucAMy21jRISZSKCzMnN+xDYbqlvlFAoEx3kI3mPIGdnIVB6AcT8P19blmkc3yi9DnIgcA1wkuX3TpnSZOGW9DrIEcBmYDbwu/w7Yqktja9PioKMnSrPlun9gVMttZXxgaIgYyB5hHeA1yz1lWmKoiDjQbYCFwJ/WJapTBMUBSkG6ZPrem2nXRQFCQRCmygKUh9kGnCW6/2ZuigKUh/kWOB9OfgPuezzOigK0h7IUO6PSdPqZoal9r+4oihI+yAn5ua97NJowwVFQfyAmL/2r7TU/y9VKAriD+RS2X+VKUNRkAQglFyQvD8SyLPAFbl5PQ+C5ZMyC7gjN60g4UCmFc0sQvk1d0dNQcKAnAx8Ig3Ox7XELEL5TJp2rgbmKUgQkEFZxhw+lrQW2I4pm+Vli4I0AzkqN+/11qJ2rn0piD+Q9cBtrYV1URRkrB20L5Cri1rE1EFRkDGQwZAg1EBRkEggOKIoSEQQHFCKQH5QkHAgVKDYQPoUxDvIdOCUbMKGoiDxQM6QRntmHz2MBSUmyIsKsrdzhsNl2nTSMA4lNsj83LxeBTksN+9pWlAUJC3IE9nV+QxFQdKDmB4x/kEwFKSDQBCQVQrSOSAIyo25aQVJDIKgbJSfdytIehDkJtciaee6TbppKoqCRAJBUEyPcm/bChRkb6KB4HBBUkHigRwpHSdMKXsQVUHigZwNbAAOBtbaUBQkLsgr8ri3yYKiry8FSQdisroVRUHSgjwA3JVHUZD0ILcDoxmKgnQICHJKPElBOgcEQelXkHQH9VYQBGVX7o0mGsgbHQ6ytBUEuczygexk8+TqU8DnljfuRpCF3QZCrtX9kLxsUZBIIDi2kFSQiCA4oChIZBAqUBQkAQglKAqSCAQLioIkBMHSQnJdC8gOBYkHQgHKPOlqL4sBOU9BvIOYdTrT8rtxKNtzO2ZEQYKADMh+3iq149J659FcZjlddvRGaQdWFAVpH2R9roe8i4qKim4H75SXLQriB8TkoaLCuo9sK4g/kHvksv241EFREL8gKyz1zigKEgkER5TpDTrjV5CaIDii3NBgdIQsCuIIgiPKrtzPChIYBMfxU56TUdqOkUeKbS3zFcQDCI4oozKeblkUxBMInsZPURCPIHhAURDPIDREUZAAIDREWaEg/kFoiJIfN7fXQC4OBULDIQXvBP6Snboc+NlSNxFB1oUCoSHKN8BNFTUK0kZCDuisIG0mFMrRPQBybwgQAqIs6QGQ5Zb6xgmFkh+nXUFqxueAzvk8Jo0uDpXHK/ZY6hSkIKFQzIY+X1HTySBzU4EQ+OyrLDPkEk2ntly8KhUICVEG5AwtS6c1JX1J1sXULYsJQsCvr6psyR1z1gKLO6xt7yY5e5wqTXejJhXKiIwSegLwbsmOmpmwsfUXNWq9JhWKyXfyKsviNrpn2uCr9XuqpDqmuGaLdBJn8rhDB2azpHumLF0HQuJPikuym2jmhtqwQ/1bctJwAbAGuLvbQAD+BXIiJ4Yj0qjKAAAAAElFTkSuQmCC"/>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.5 KiB |
9
public/images/logo/logo-white.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="128" height="32" viewBox="0 0 128 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M121.757 24.3659C120.452 24.3659 119.306 24.1584 118.318 23.7433C117.329 23.3084 116.539 22.7155 115.946 21.9644C115.353 21.2133 114.997 20.3436 114.878 19.3553H118.703C118.822 19.9285 119.138 20.4226 119.652 20.8377C120.186 21.233 120.867 21.4307 121.698 21.4307C122.528 21.4307 123.131 21.2627 123.506 20.9266C123.902 20.5906 124.099 20.2052 124.099 19.7703C124.099 19.1378 123.823 18.7129 123.269 18.4954C122.716 18.2582 121.945 18.0309 120.956 17.8135C120.324 17.6751 119.682 17.5071 119.029 17.3095C118.377 17.1118 117.774 16.8647 117.221 16.5683C116.687 16.252 116.252 15.8567 115.916 15.3823C115.58 14.8882 115.412 14.2853 115.412 13.5737C115.412 12.2692 115.926 11.1722 116.954 10.2827C118.001 9.39322 119.464 8.94849 121.342 8.94849C123.081 8.94849 124.465 9.35369 125.493 10.1641C126.54 10.9745 127.163 12.0913 127.361 13.5144H123.773C123.556 12.4273 122.735 11.8837 121.312 11.8837C120.601 11.8837 120.047 12.0221 119.652 12.2988C119.276 12.5755 119.089 12.9214 119.089 13.3365C119.089 13.7714 119.375 14.1173 119.948 14.3742C120.522 14.6312 121.283 14.8684 122.231 15.0858C123.259 15.323 124.198 15.5898 125.048 15.8863C125.918 16.1631 126.61 16.588 127.123 17.1612C127.637 17.7147 127.894 18.5152 127.894 19.5628C127.914 20.472 127.677 21.2923 127.183 22.0237C126.689 22.755 125.977 23.3282 125.048 23.7433C124.119 24.1584 123.022 24.3659 121.757 24.3659Z" fill="#FFFFFF"/>
|
||||||
|
<path d="M103.778 24.3658C101.94 24.3658 100.517 23.7926 99.5086 22.6462C98.5203 21.4998 98.0261 19.8197 98.0261 17.6059V9.3042H101.792V17.2501C101.792 18.5151 102.048 19.4837 102.562 20.1557C103.076 20.8277 103.887 21.1638 104.994 21.1638C106.041 21.1638 106.901 20.7882 107.573 20.0371C108.265 19.286 108.611 18.2384 108.611 16.8943V9.3042H112.406V24.0101H109.056L108.759 21.5196C108.304 22.3893 107.642 23.0811 106.773 23.595C105.923 24.1089 104.924 24.3658 103.778 24.3658Z" fill="#FFFFFF"/>
|
||||||
|
<path d="M80.8477 24.0101V9.30427H84.198L84.4945 11.7948C84.9491 10.9251 85.6014 10.2333 86.4513 9.71936C87.321 9.20544 88.3389 8.94849 89.5051 8.94849C91.3236 8.94849 92.7369 9.5217 93.7449 10.6681C94.753 11.8145 95.257 13.4947 95.257 15.7084V24.0101H91.462V16.0642C91.462 14.7992 91.205 13.8307 90.6911 13.1586C90.1772 12.4866 89.3767 12.1506 88.2895 12.1506C87.2222 12.1506 86.3426 12.5261 85.6508 13.2772C84.9787 14.0283 84.6427 15.0759 84.6427 16.42V24.0101H80.8477Z" fill="#FFFFFF"/>
|
||||||
|
<path d="M70.8959 24.3659C69.4134 24.3659 68.099 24.0497 66.9526 23.4172C65.8062 22.7846 64.9068 21.8952 64.2545 20.7488C63.6023 19.6023 63.2761 18.278 63.2761 16.7758C63.2761 15.2538 63.5924 13.8999 64.2249 12.7139C64.8772 11.5279 65.7666 10.6088 66.8933 9.95655C68.0397 9.28451 69.3838 8.94849 70.9255 8.94849C72.3685 8.94849 73.6434 9.26474 74.7503 9.89725C75.8571 10.5298 76.717 11.3995 77.3297 12.5064C77.9622 13.5935 78.2785 14.8091 78.2785 16.1532C78.2785 16.3706 78.2686 16.5979 78.2488 16.8351C78.2488 17.0723 78.2389 17.3194 78.2192 17.5763H67.0415C67.1206 18.7227 67.5159 19.6221 68.2275 20.2744C68.9588 20.9266 69.8384 21.2528 70.8662 21.2528C71.6371 21.2528 72.2795 21.0848 72.7934 20.7488C73.3271 20.393 73.7224 19.9384 73.9794 19.3849H77.8337C77.557 20.3139 77.0925 21.1638 76.4402 21.9347C75.8077 22.6858 75.0171 23.2788 74.0683 23.7136C73.1393 24.1485 72.0818 24.3659 70.8959 24.3659ZM70.9255 12.032C69.9965 12.032 69.1763 12.2988 68.4647 12.8325C67.7531 13.3464 67.2985 14.137 67.1008 15.2044H74.4241C74.3648 14.2359 74.009 13.465 73.3568 12.8918C72.7045 12.3186 71.8941 12.032 70.9255 12.032Z" fill="#FFFFFF"/>
|
||||||
|
<path d="M52.6817 24.0101L47.2856 9.3042H51.2586L54.9944 20.4225L58.7301 9.3042H62.7031L57.2773 24.0101H52.6817Z" fill="#FFFFFF"/>
|
||||||
|
<path d="M9.07442 22.8077L13.3774 12.1963H3.65994C1.94741 12.1963 0.808858 14.0116 1.52019 15.6079L4.76246 22.884C5.61571 24.7988 8.28619 24.7516 9.07442 22.8077Z" fill="#46C4FF"/>
|
||||||
|
<path d="M32.4572 1H25.073C23.3354 1 21.7689 2.07281 21.1042 3.71802L11.4163 27.6986C10.0715 30.2249 8.56803 30.9522 7.98438 31H20.821C22.5493 31 24.1092 29.9386 24.7799 28.3064L34.6252 4.3458C35.278 2.75701 34.1395 1 32.4572 1Z" fill="#2F73F2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.1 KiB |
9
public/images/logo/logo.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="128" height="32" viewBox="0 0 128 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M121.757 24.3659C120.452 24.3659 119.306 24.1584 118.318 23.7433C117.329 23.3084 116.539 22.7155 115.946 21.9644C115.353 21.2133 114.997 20.3436 114.878 19.3553H118.703C118.822 19.9285 119.138 20.4226 119.652 20.8377C120.186 21.233 120.867 21.4307 121.698 21.4307C122.528 21.4307 123.131 21.2627 123.506 20.9266C123.902 20.5906 124.099 20.2052 124.099 19.7703C124.099 19.1378 123.823 18.7129 123.269 18.4954C122.716 18.2582 121.945 18.0309 120.956 17.8135C120.324 17.6751 119.682 17.5071 119.029 17.3095C118.377 17.1118 117.774 16.8647 117.221 16.5683C116.687 16.252 116.252 15.8567 115.916 15.3823C115.58 14.8882 115.412 14.2853 115.412 13.5737C115.412 12.2692 115.926 11.1722 116.954 10.2827C118.001 9.39322 119.464 8.94849 121.342 8.94849C123.081 8.94849 124.465 9.35369 125.493 10.1641C126.54 10.9745 127.163 12.0913 127.361 13.5144H123.773C123.556 12.4273 122.735 11.8837 121.312 11.8837C120.601 11.8837 120.047 12.0221 119.652 12.2988C119.276 12.5755 119.089 12.9214 119.089 13.3365C119.089 13.7714 119.375 14.1173 119.948 14.3742C120.522 14.6312 121.283 14.8684 122.231 15.0858C123.259 15.323 124.198 15.5898 125.048 15.8863C125.918 16.1631 126.61 16.588 127.123 17.1612C127.637 17.7147 127.894 18.5152 127.894 19.5628C127.914 20.472 127.677 21.2923 127.183 22.0237C126.689 22.755 125.977 23.3282 125.048 23.7433C124.119 24.1584 123.022 24.3659 121.757 24.3659Z" fill="#102D47"/>
|
||||||
|
<path d="M103.778 24.3658C101.94 24.3658 100.517 23.7926 99.5086 22.6462C98.5203 21.4998 98.0261 19.8197 98.0261 17.6059V9.3042H101.792V17.2501C101.792 18.5151 102.048 19.4837 102.562 20.1557C103.076 20.8277 103.887 21.1638 104.994 21.1638C106.041 21.1638 106.901 20.7882 107.573 20.0371C108.265 19.286 108.611 18.2384 108.611 16.8943V9.3042H112.406V24.0101H109.056L108.759 21.5196C108.304 22.3893 107.642 23.0811 106.773 23.595C105.923 24.1089 104.924 24.3658 103.778 24.3658Z" fill="#102D47"/>
|
||||||
|
<path d="M80.8477 24.0101V9.30427H84.198L84.4945 11.7948C84.9491 10.9251 85.6014 10.2333 86.4513 9.71936C87.321 9.20544 88.3389 8.94849 89.5051 8.94849C91.3236 8.94849 92.7369 9.5217 93.7449 10.6681C94.753 11.8145 95.257 13.4947 95.257 15.7084V24.0101H91.462V16.0642C91.462 14.7992 91.205 13.8307 90.6911 13.1586C90.1772 12.4866 89.3767 12.1506 88.2895 12.1506C87.2222 12.1506 86.3426 12.5261 85.6508 13.2772C84.9787 14.0283 84.6427 15.0759 84.6427 16.42V24.0101H80.8477Z" fill="#102D47"/>
|
||||||
|
<path d="M70.8959 24.3659C69.4134 24.3659 68.099 24.0497 66.9526 23.4172C65.8062 22.7846 64.9068 21.8952 64.2545 20.7488C63.6023 19.6023 63.2761 18.278 63.2761 16.7758C63.2761 15.2538 63.5924 13.8999 64.2249 12.7139C64.8772 11.5279 65.7666 10.6088 66.8933 9.95655C68.0397 9.28451 69.3838 8.94849 70.9255 8.94849C72.3685 8.94849 73.6434 9.26474 74.7503 9.89725C75.8571 10.5298 76.717 11.3995 77.3297 12.5064C77.9622 13.5935 78.2785 14.8091 78.2785 16.1532C78.2785 16.3706 78.2686 16.5979 78.2488 16.8351C78.2488 17.0723 78.2389 17.3194 78.2192 17.5763H67.0415C67.1206 18.7227 67.5159 19.6221 68.2275 20.2744C68.9588 20.9266 69.8384 21.2528 70.8662 21.2528C71.6371 21.2528 72.2795 21.0848 72.7934 20.7488C73.3271 20.393 73.7224 19.9384 73.9794 19.3849H77.8337C77.557 20.3139 77.0925 21.1638 76.4402 21.9347C75.8077 22.6858 75.0171 23.2788 74.0683 23.7136C73.1393 24.1485 72.0818 24.3659 70.8959 24.3659ZM70.9255 12.032C69.9965 12.032 69.1763 12.2988 68.4647 12.8325C67.7531 13.3464 67.2985 14.137 67.1008 15.2044H74.4241C74.3648 14.2359 74.009 13.465 73.3568 12.8918C72.7045 12.3186 71.8941 12.032 70.9255 12.032Z" fill="#102D47"/>
|
||||||
|
<path d="M52.6817 24.0101L47.2856 9.3042H51.2586L54.9944 20.4225L58.7301 9.3042H62.7031L57.2773 24.0101H52.6817Z" fill="#102D47"/>
|
||||||
|
<path d="M9.07442 22.8077L13.3774 12.1963H3.65994C1.94741 12.1963 0.808858 14.0116 1.52019 15.6079L4.76246 22.884C5.61571 24.7988 8.28619 24.7516 9.07442 22.8077Z" fill="#46C4FF"/>
|
||||||
|
<path d="M32.4572 1H25.073C23.3354 1 21.7689 2.07281 21.1042 3.71802L11.4163 27.6986C10.0715 30.2249 8.56803 30.9522 7.98438 31H20.821C22.5493 31 24.1092 29.9386 24.7799 28.3064L34.6252 4.3458C35.278 2.75701 34.1395 1 32.4572 1Z" fill="#2F73F2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.1 KiB |
BIN
public/images/portfolio/cozycasa.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
public/images/portfolio/humans.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
public/images/portfolio/mars.png
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
public/images/portfolio/panda-logo.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
public/images/portfolio/roket-squred.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
9
public/images/services/perfomance-optimization.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="41" height="36" viewBox="0 0 41 36" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<rect width="41" height="36" fill="url(#pattern0_3_93)"/>
|
||||||
|
<defs>
|
||||||
|
<pattern id="pattern0_3_93" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||||
|
<use xlink:href="#image0_3_93" transform="scale(0.0243902 0.0277778)"/>
|
||||||
|
</pattern>
|
||||||
|
<image id="image0_3_93" width="41" height="36" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAkCAYAAAAU/hMoAAACIUlEQVRYhc2YP04CQRTGPwlbQMKfhIaGgBRQYMLa2cENKDwA3EAS9wAcgIIjmHgBPYClPY2tsbSxcRNr83DWTMYd5s2bCfFLCDA7+/bHm33fvuFsevuJiGqqUOyg+23DOacaEXAMYKQ+vwB4jRW4EilOHcC59n2kxqIoFiRBJdr3RMtqsGJAdgD0SsZ76ti/gKR7UXKMrVBIV7ZsWT4ZJN13E8a8iXG/eisEcsi8eKLmnhyy7lm9QZYkheQsc4xzDpJAUjF0Bed1pZYkgbyUXCjkXF9IKoCa5EJKNUkR+UDGetSZj1CnfCC9g1vk/WO5kPVQrzM09LEkbj9J9vERg07TNYB7zkQOZFe9ngB8RQIcAHgGkAN4cE3mLPeFehebcYl2amjHmeyCHGuWIzZjQ3MACzXUT7N8EwKZGFsCaFkNkZm9dZrlbSlkWYvVDOwPVwCmxljLtew2yGMw0v6wfQRmmWZ5ajvRBnlsWaVPno3Kmk3WbJZBcjZQXmasLOfGMWeWZvmq7IAJmTg2Vrqsy1OiO+a8TVkRmZA+XU6HaUlkOTNmzD5VuzmoQ5r/QnDE6Q+5WSxEljSwQUqq1tUfrlV2fPTHkgpI6ZYAR1q4tqpoiRZpls9NyJAniW3/vXNYjku/2awoy2mKQ/3IjEGVvwyMOS0sqRKxu9FXg9XdMHSIU420JSAV9/WVh+W41KJKp0y+RwpIomzGyiLpcb9tvH0Dihw8HnhJw8EAAAAASUVORK5CYII="/>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
9
public/images/services/ux-design-product_1.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="38" height="40" viewBox="0 0 38 40" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<rect x="0.927734" width="36.2" height="40" fill="url(#pattern0_3_86)"/>
|
||||||
|
<defs>
|
||||||
|
<pattern id="pattern0_3_86" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||||
|
<use xlink:href="#image0_3_86" transform="matrix(0.0277778 0 0 0.0251389 0 -0.00277779)"/>
|
||||||
|
</pattern>
|
||||||
|
<image id="image0_3_86" width="36" height="40" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAACe0lEQVRYhe2YsW4TQRCGP9C5SCQ7kdy4cQFFUoBk16ngCcibAOIF8gCW4BF4hPAEQJOG5iKFwhRJJDc0kRIXSeEGbfQvOp/udmfvfK7yS6eTN7OTf2Znbmfm2eTTkhYYAod6O9wAc71NyGf9NbGsIZdd4BUwKq07YkfAX+A3cJ+qOJVQD3gJHETkRnr+AJfAqgtCY3mll7DHEX8hby02Rcgdw2tgkECkCGfAVJ69iMVXiJCLkwN5ZhMYKL4WOsrK+Koi5OPEudp6PA967xhkx4qvq6r4Kqf9WGlsUYyUXSnV0d5UQ+b5rP8/vjyhgeJkGNy+joWCtZxBPQV/ylG7uLrIZ/2lI+TP1mqV9eNX/mjG4Aw7y7TJQuZBREzpK8JnCWHgOBxmBgtWdQFoxEJfbkuiDLOIQOMroMIo792qK8ej9zygJAd+GcjsA1/07Edk76UzrxMIEbJ45QNwDbzXc621GGp1hwiF8EZWfgb2Cut7Wsslk4wmhE6B78AkIDORzOk2CL3rSLYxoU7xRCiGJ0IxNCH0rSPZRzQhdAy8Bc4DMueSOd4GIYcfKtw/AneF9TutTSWTjFiRHyvC3IX6FTjRb/e+NZDYrftDiJCzcmQoP26NFyqBjneN0CpQE41UwLUp0EjoZFaZjqWWsRT4/iylhPVI6WRuMv2ToaGu3tExjjss8ucuy5Yqxq0jFD/hmNYY4VvnowQyjw2Ba4N8UC8TOwRKHejGGsVylqV0CJTiiwYd72U+668lSlXaFzsE67DBSoQmwwYPtyGXgjbjGI9l23GMh1Pws+HACnl8owMrj2J8xUZ6Hp2O9BysHejWhp4evgNtPRZeA/APKBqreTqujiEAAAAASUVORK5CYII="/>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
9
public/images/services/ux-design-product_2.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<svg width="41" height="40" viewBox="0 0 41 40" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<rect width="41" height="40" fill="url(#pattern0_3_100)"/>
|
||||||
|
<defs>
|
||||||
|
<pattern id="pattern0_3_100" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||||
|
<use xlink:href="#image0_3_100" transform="scale(0.0243902 0.025)"/>
|
||||||
|
</pattern>
|
||||||
|
<image id="image0_3_100" width="41" height="40" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAoCAYAAABjPNNTAAACi0lEQVRYhdWYP4sTQRjGHyUpomwMCJLGQotrrsiWdt4nEFur8xt4YD7GFvoJvKuuPeztBQs3xTUW8SBNEIS7DcYihcccz7tMNm9mJvsniT8ILMnszi/PzLxvyL3B+ww1EAM4AfAawCM+7gbABYAPANJ1U6RJ5J39fgW/HoC3FPgO4NgSBK+P+VnKsb0yE5WRNKmdArgC8AnAIOCeAcde8d64CUlfaqGspBsPZ950fXtS22t1k+/dNInUvatJ9ih1EriUdTLiQbtIk+hak9xGaqEspSuSxv7djsXW8VEk/+2lHqlSJ7eGSI722HEkkkcAzrhh94UbOh21KHRtta1dlR9hpQy5ivk2S5KzoLf0e+6wfxS8ofBBzXI/mNq5XbyLuJJsA+gDeA6gy/fM9SsALwA8KCk2B/AVwGcAY76X8XqaJtEiRLJLmT5FNR5S1Ag/C5T7STEj+GfNGCM4NcJpEuVituTTQmqhuNLVUgslo+xEJGNKVkHSfcJn/PKkFsq0xSWtKgjKfKnhOUX6/01blM26r0ykTn6rcHCaIj84djGf8BVSgppCLUFax8nYbbRi3hTOYu5qi4uG01VT03BJ2tSZbp6aEQ35B6Mo2bbSmvDb2pRNN0+NkirxcCY1e2EvvUiaDw8LEx5aQr/XJOJLdyk1h9xjytlNZREPZ+a+S2mLLz3L95eTaenamN7dse6ZO8a2rbLXcYzLJEnf/uowWV+6c4+YQUvNRTf04NjIBKHpYoPUVERyzAdsQjHdKdMV4TZT61f8ATMWyUtOVLYWbrJ8ISzVUHu5d9FpiqidR9uTTXcabT5n5/EdnCbTdfbrTSSFutJd6Txl2mIIZdIN6jx1Sgq+dIP6tRcAt7XFAqR5O2dRAAAAAElFTkSuQmCC"/>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
66
public/images/svgs/404.svg
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="199" height="286" viewBox="0 0 199 286" fill="none">
|
||||||
|
<path opacity="0.42" d="M112.923 285.703C154.831 285.703 188.805 278.705 188.805 270.072C188.805 261.439 154.831 254.441 112.923 254.441C71.0145 254.441 37.041 261.439 37.041 270.072C37.041 278.705 71.0145 285.703 112.923 285.703Z" fill="#14143F"/>
|
||||||
|
<path d="M132.906 250.678C137.913 249.568 142.883 248.147 147.839 246.509L146.001 202.517C142.231 202.734 138.436 203.366 134.735 204.389L132.906 250.678Z" fill="#2196f3"/>
|
||||||
|
<path d="M135.726 179.315L134.735 204.389C138.436 203.367 142.231 202.735 146.001 202.517L145.201 183.362C145.201 183.362 144.365 176.151 135.726 179.315Z" fill="#177bcf"/>
|
||||||
|
<path d="M176.152 259.949C176.152 259.949 181.567 261.342 182.682 263.99C182.682 263.99 182.125 245.876 148.127 253.4L147.839 246.508C142.883 248.145 137.913 249.566 132.906 250.677L132.661 256.883C132.661 256.883 132.034 262.108 141.021 265.243C150.008 268.378 173.245 282.172 176.571 276.32C179.896 270.468 175.88 264.616 162.944 264.825C162.944 264.825 172.961 263.292 177.683 269.562C177.683 269.562 181.429 269.423 181.847 265.661C182.264 261.9 176.152 259.949 176.152 259.949Z" fill="#60e0fc"/>
|
||||||
|
<path d="M148.127 253.401C148.127 253.401 162.862 247.166 166.937 250.092C171.013 253.018 159.517 254.481 159.517 254.481C159.517 254.481 167.25 251.973 168.609 255.839C169.968 259.706 157.666 258.765 157.666 258.765C157.666 258.765 165.892 259.705 162.234 262.214C158.576 264.722 134.75 265.035 132.66 256.884L133.234 242.356L147.635 241.643L148.127 253.401Z" fill="#2196f3"/>
|
||||||
|
<path d="M162.944 264.826C162.944 264.826 176.15 263.731 177.5 271.071C177.5 271.071 181.39 263.009 162.944 264.826Z" fill="#2196f3"/>
|
||||||
|
<path d="M181.779 264.56C181.779 264.56 180.522 260.751 171.43 258.243C171.43 258.243 185.824 260.588 181.779 264.56Z" fill="#2196f3"/>
|
||||||
|
<path d="M96.993 250.678C91.986 249.568 87.016 248.147 82.06 246.509L83.898 202.517C87.668 202.734 91.463 203.366 95.164 204.389L96.993 250.678Z" fill="#2196f3"/>
|
||||||
|
<path d="M94.173 179.315L95.164 204.389C91.463 203.367 87.668 202.735 83.898 202.517L84.698 183.362C84.698 183.362 85.535 176.151 94.173 179.315Z" fill="#177bcf"/>
|
||||||
|
<path d="M53.747 259.949C53.747 259.949 48.332 261.342 47.217 263.99C47.217 263.99 47.774 245.876 81.772 253.4L82.06 246.508C87.016 248.145 91.986 249.566 96.993 250.677L97.238 256.883C97.238 256.883 97.865 262.108 88.878 265.243C79.891 268.378 56.654 282.172 53.329 276.32C50.004 270.468 54.02 264.616 66.956 264.825C66.956 264.825 56.939 263.292 52.217 269.562C52.217 269.562 48.471 269.423 48.053 265.661C47.635 261.9 53.747 259.949 53.747 259.949Z" fill="#60e0fc"/>
|
||||||
|
<path d="M81.772 253.401C81.772 253.401 67.037 247.166 62.962 250.092C58.886 253.018 70.382 254.481 70.382 254.481C70.382 254.481 62.649 251.973 61.29 255.839C59.931 259.706 72.233 258.765 72.233 258.765C72.233 258.765 64.007 259.705 67.665 262.214C71.323 264.722 95.149 265.035 97.239 256.884L96.665 242.356L82.264 241.643L81.772 253.401Z" fill="#2196f3"/>
|
||||||
|
<path d="M66.956 264.826C66.956 264.826 53.75 263.731 52.4 271.071C52.4 271.071 48.509 263.009 66.956 264.826Z" fill="#2196f3"/>
|
||||||
|
<path d="M48.12 264.56C48.12 264.56 49.377 260.751 58.469 258.243C58.469 258.243 44.075 260.588 48.12 264.56Z" fill="#2196f3"/>
|
||||||
|
<path d="M2.58002 201.148L37.051 195.537C37.051 195.537 37.297 193.988 37.337 192.145C25.033 193.66 12.733 195.148 0.528015 197.489C0.791015 198.728 1.38902 200.011 2.58002 201.148Z" fill="#9E4C15"/>
|
||||||
|
<path d="M34.241 186.118L1.14102 191.974C1.14102 191.974 0.75002 192.818 0.52002 194.072C12.885 192.822 25.003 190.832 37.041 188.6C36.661 187 35.854 185.832 34.241 186.118Z" fill="#CE7132"/>
|
||||||
|
<path d="M0.520011 194.071C0.344011 195.034 0.26201 196.239 0.52801 197.489C12.732 195.148 25.033 193.659 37.337 192.145C37.362 190.974 37.3 189.688 37.042 188.599C25.003 190.831 12.885 192.821 0.520011 194.071Z" fill="#B75D21"/>
|
||||||
|
<path d="M73.766 75.337C67.303 78.867 49.436 90.465 39.354 115.129C53.657 104.281 65.954 91.133 73.766 75.337Z" fill="#2189f3"/>
|
||||||
|
<path d="M39.354 115.129C35.042 125.676 32.151 138.607 32.19 154.326C32.19 154.326 31.692 191.857 38.595 197.517C38.595 197.517 40.42 198.28 42.16 197.211C42.16 197.211 44.495 197.809 46.534 195.572C46.534 195.572 50.557 197.034 52.877 193.748C52.877 193.748 49.744 184.051 54.883 182.165C54.883 182.165 56.136 178.716 52.022 177.847C52.022 177.847 42.094 132.3 64.602 111.949L76.185 74.117C76.185 74.117 75.293 74.502 73.766 75.336C65.954 91.133 53.657 104.281 39.354 115.129Z" fill="#2196f3"/>
|
||||||
|
<path d="M47.589 195.818C47.589 195.818 46.205 196.066 45.845 193.008C45.845 193.008 44.95 195.965 47.589 195.818Z" fill="#3f51b5"/>
|
||||||
|
<path d="M42.159 197.211C42.159 197.211 41.078 197.191 40.268 193.862C40.268 193.862 39.957 196.692 42.159 197.211Z" fill="#3f51b5"/>
|
||||||
|
<path d="M64.602 111.949C64.602 111.949 48.641 119.359 44.043 149.247C39.445 179.135 50.364 180.64 50.364 180.64L52.022 177.847C52.022 177.847 41.85 141.198 64.602 111.949Z" fill="#3f51b5"/>
|
||||||
|
<path d="M156.561 75.337C163.024 78.867 180.891 90.465 190.973 115.129C176.671 104.281 164.374 91.133 156.561 75.337Z" fill="#2189f3"/>
|
||||||
|
<path d="M178.306 177.847C178.306 177.847 188.234 132.3 165.726 111.949L154.143 74.117C154.143 74.117 155.035 74.502 156.562 75.336C164.374 91.133 176.671 104.28 190.974 115.128C195.286 125.675 198.177 138.606 198.138 154.325C198.138 154.325 198.845 186.518 192.575 195.436C192.575 195.436 186.784 204.911 181.598 204.354C176.412 203.797 183.518 196.83 182.821 195.158C182.124 193.486 178.362 204.215 174.182 203.379C170.002 202.543 180.173 190.024 178.501 188.69C176.829 187.356 174.739 196.552 170.002 196.273C165.265 195.994 177.413 181.018 178.306 177.847Z" fill="#2196f3"/>
|
||||||
|
<path d="M165.725 111.949C165.725 111.949 181.686 119.359 186.284 149.247C190.882 179.135 179.963 180.64 179.963 180.64L178.305 177.847C178.305 177.847 188.477 141.198 165.725 111.949Z" fill="#3f51b5"/>
|
||||||
|
<path d="M80.395 24.025C80.395 24.025 74.648 21.866 74.018 18.448C74.018 18.448 77.976 8.464 72.579 2.797C67.182 -2.87 56.299 4.956 56.029 13.411C56.029 13.411 49.913 17.189 44.426 9.903C44.426 9.903 40.918 23.305 57.378 28.432C57.378 28.432 63.69 40.845 76.185 43.813C76.185 43.813 75.798 30.771 80.395 24.025Z" fill="#60e0fc"/>
|
||||||
|
<path d="M84.668 22.048C84.668 22.048 80.524 19.228 78.485 24.969C76.446 30.71 72.804 46.458 78.283 48.307C83.762 50.157 86.893 23.942 84.668 22.048Z" fill="#3f51b5"/>
|
||||||
|
<path d="M70.78 8.914C70.78 8.914 72.164 19.785 79.163 23.479C79.163 23.479 70.6 21.327 70.78 8.914Z" fill="#2196f3"/>
|
||||||
|
<path d="M56.303 11.344C56.303 11.344 52.97 21.957 58.497 30.322C58.497 30.322 55.59 23.8 56.303 11.344Z" fill="#2196f3"/>
|
||||||
|
<path d="M148.97 24.025C148.97 24.025 154.717 21.866 155.347 18.448C155.347 18.448 151.389 8.464 156.786 2.797C162.183 -2.87 173.066 4.956 173.336 13.411C173.336 13.411 179.452 17.189 184.939 9.903C184.939 9.903 188.447 23.305 171.987 28.432C171.987 28.432 165.675 40.845 153.18 43.813C153.18 43.813 153.567 30.771 148.97 24.025Z" fill="#60e0fc"/>
|
||||||
|
<path d="M144.697 22.048C144.697 22.048 148.841 19.228 150.879 24.969C152.917 30.71 156.56 46.458 151.081 48.307C145.603 50.157 142.472 23.942 144.697 22.048Z" fill="#3f51b5"/>
|
||||||
|
<path d="M158.585 8.914C158.585 8.914 157.201 19.785 150.202 23.479C150.202 23.479 158.765 21.327 158.585 8.914Z" fill="#2196f3"/>
|
||||||
|
<path d="M173.062 11.344C173.062 11.344 176.394 21.957 170.868 30.322C170.868 30.322 173.775 23.8 173.062 11.344Z" fill="#2196f3"/>
|
||||||
|
<path d="M154.028 74.221L115.231 78.072L76.363 74.221C76.363 74.221 45.745 102.849 51.022 149.382C55.356 187.596 99.563 190.383 115.231 190.159C130.899 190.384 175.107 187.596 179.44 149.382C184.717 102.849 154.028 74.221 154.028 74.221Z" fill="#2196f3"/>
|
||||||
|
<path d="M150.466 64.591L150.439 64.605C150.986 62.347 151.283 59.995 151.283 57.576V40.306C151.283 31.46 147.406 23.479 141.27 17.968C141.185 18.045 141.106 18.125 141.02 18.201C124.918 31.375 101.127 33.015 85.915 20.317C81.152 25.636 78.245 32.646 78.245 40.305V57.575C78.245 60.054 78.555 62.463 79.128 64.771C78.111 65.19 76.453 66.579 76.206 71.187C75.846 77.903 79.924 80.422 79.924 80.422C79.924 80.422 93.596 92.175 114.763 91.335V87.617H115.625V91.335C136.793 92.174 150.465 80.422 150.465 80.422C150.465 80.422 154.543 77.903 154.183 71.187C153.824 64.471 150.466 64.591 150.466 64.591Z" fill="#2196f3"/>
|
||||||
|
<path d="M141.021 18.201C141.107 18.125 141.186 18.044 141.271 17.968C135.945 13.185 128.919 10.264 121.241 10.264H118.474C119.568 8.46101 120.316 6.08801 117.583 5.10701C113.103 3.49901 113.574 7.02501 113.622 7.32601C113.567 6.99501 112.827 2.72301 110.867 3.06901C108.828 3.42901 110.028 7.26701 110.028 7.26701C110.028 7.26701 102.233 -0.767992 102.233 3.30901C102.233 5.67701 105.145 8.40801 107.587 10.283C99.004 10.483 91.282 14.327 85.917 20.319C101.128 33.015 124.919 31.375 141.021 18.201Z" fill="#3f51b5"/>
|
||||||
|
<path d="M79.129 64.771C79.129 64.771 90.932 75.984 115.231 75.984C139.53 75.984 150.466 64.591 150.466 64.591C150.466 64.591 143.581 75.984 115.231 77.184C86.881 78.383 79.129 64.771 79.129 64.771Z" fill="#3f51b5"/>
|
||||||
|
<path d="M79.129 77.439C79.129 77.439 90.932 88.652 115.231 88.652C139.53 88.652 150.466 77.259 150.466 77.259C150.466 77.259 143.581 88.652 115.231 89.852C86.881 91.051 79.129 77.439 79.129 77.439Z" fill="#3f51b5"/>
|
||||||
|
<path d="M115.164 180.64C139.268 180.64 158.809 162.474 158.809 140.065C158.809 117.656 139.268 99.49 115.164 99.49C91.0595 99.49 71.519 117.656 71.519 140.065C71.519 162.474 91.0595 180.64 115.164 180.64Z" fill="#60e0fc"/>
|
||||||
|
<path opacity="0.4" d="M174.142 106.264C167.672 123.519 155.967 138.769 140.129 150.221C115.756 167.593 88.019 172.445 59.881 170.972C74.667 188.742 103.268 190.329 115.231 190.158C130.899 190.383 175.107 187.595 179.44 149.381C181.358 132.472 178.525 117.93 174.142 106.264Z" fill="#3f51b5"/>
|
||||||
|
<path d="M108.207 96.578C108.207 96.578 89.397 107.466 98.175 111.95C106.953 116.434 110.715 104.264 110.715 104.264C110.715 104.264 107.162 111.54 110.715 112.942C114.268 114.344 117.612 104.76 117.612 104.76C117.612 104.76 116.567 109.955 123.046 110.164C129.525 110.373 124.3 97.624 124.3 97.624C124.3 97.624 115.94 92.816 108.207 96.578Z" fill="#2196f3"/>
|
||||||
|
<path d="M69.018 82.668C72.034 78.617 74.191 76.478 74.191 76.478C72.353 78.137 70.629 80.242 69.018 82.668Z" fill="#3f51b5"/>
|
||||||
|
<path d="M48.777 144.866C48.777 144.866 54.5 104.786 67.384 85.391C60.12 95.149 47.872 116.01 48.777 144.866Z" fill="#3f51b5"/>
|
||||||
|
<path d="M181.55 144.866C181.55 144.866 175.827 104.786 162.943 85.391C170.208 95.149 182.455 116.01 181.55 144.866Z" fill="#3f51b5"/>
|
||||||
|
<path d="M96.305 215L83.711 188.69H81.309L96.305 215Z" fill="#878787"/>
|
||||||
|
<path d="M83.892 165.649C83.892 165.649 80.824 169.741 81.309 178.429L80.033 178.673C80.033 178.673 78.615 170.506 83.892 165.649Z" fill="#878787"/>
|
||||||
|
<path d="M51.965 190.272C52.149 191.298 52.443 192.451 52.876 193.748L65.273 191.254C65.273 191.254 64.754 190.21 64.395 188.406C60.257 189.094 56.113 189.705 51.965 190.272Z" fill="#9E4C15"/>
|
||||||
|
<path d="M64.553 180.64L54.882 182.164C54.882 182.164 52.618 182.64 51.922 185.748C55.992 184.951 60.061 184.15 64.134 183.362C64.206 182.504 64.334 181.599 64.553 180.64Z" fill="#CE7132"/>
|
||||||
|
<path d="M64.134 183.362C60.061 184.15 55.992 184.951 51.922 185.748C51.669 186.876 51.618 188.342 51.964 190.271C56.112 189.705 60.257 189.093 64.394 188.405C64.133 187.094 63.964 185.374 64.134 183.362Z" fill="#B75D21"/>
|
||||||
|
<path d="M58.887 167.868C58.887 167.868 64.374 171.49 64.554 180.64C64.554 180.64 62.935 185.677 65.274 191.254C65.274 191.254 70.491 206.725 62.081 216.079C62.081 216.079 79.935 223.815 96.306 215L82.094 190.169C82.094 190.169 78.199 184.27 80.238 178.634C80.238 178.634 78.616 170.926 83.893 165.649C83.893 165.649 71.539 162.531 58.887 167.868Z" fill="#BCBCBC"/>
|
||||||
|
<path d="M80.033 178.673L86.051 177.522C86.051 177.522 85.211 179.321 86.051 181.12L84.192 181.78L86.051 181.96C86.051 181.96 85.991 185.678 87.91 187.777L81.54 189.163C81.54 189.163 78.272 184.321 80.033 178.673Z" fill="#B75D21"/>
|
||||||
|
<path d="M89.233 182.345C89.641 185.192 88.895 187.655 87.566 187.845C86.237 188.035 84.829 185.882 84.421 183.035C84.013 180.188 84.759 177.725 86.088 177.535C87.417 177.344 88.825 179.497 89.233 182.345Z" fill="#CC7236"/>
|
||||||
|
<path d="M62.08 216.079C62.08 216.079 64.941 213.015 66.353 207.256C66.353 207.256 72.622 211.007 79.86 209.962L81.876 214.999V209.962C81.876 209.962 88.251 209.661 91.123 205.945L96.305 214.999C96.305 214.999 82.73 224.704 62.08 216.079Z" fill="#DDDDDD"/>
|
||||||
|
<path d="M66.615 191.605L80.967 190.169C80.967 190.169 74.766 192.58 66.615 191.605Z" fill="#878787"/>
|
||||||
|
<path d="M65.273 180.11L79.192 178.647C79.192 178.647 71.873 177.88 65.273 180.11Z" fill="#878787"/>
|
||||||
|
<path d="M58.887 167.868C58.887 167.868 61.906 170.239 62.907 173.048C62.907 173.048 66.703 171.471 72.233 171.68V167.152L73.791 171.82H80.409C80.409 171.82 81.592 167.491 83.892 165.65C83.892 165.65 70.108 162.104 58.887 167.868Z" fill="#DDDDDD"/>
|
||||||
|
<path d="M100.068 42.929C100.004 45.91 100.84 48.36 101.936 48.4C103.033 48.441 103.973 46.058 104.038 43.077C104.103 40.097 103.266 37.647 102.169 37.606C101.073 37.566 100.132 39.949 100.068 42.929Z" fill="#181818"/>
|
||||||
|
<path d="M123.09 42.929C123.026 45.909 123.863 48.359 124.958 48.4C126.055 48.441 126.996 46.058 127.06 43.077C127.124 40.097 126.287 37.647 125.191 37.606C124.096 37.566 123.155 39.949 123.09 42.929Z" fill="#181818"/>
|
||||||
|
<path d="M96.502 35.667C95.928 34.64 96.899 33.421 98.043 33.695C101.309 34.477 108.556 36.546 107.58 39.31C106.571 42.168 98.331 38.942 96.502 35.667Z" fill="#3f51b5"/>
|
||||||
|
<path d="M131.696 35.667C132.27 34.64 131.299 33.421 130.155 33.695C126.889 34.477 119.642 36.546 120.618 39.31C121.626 42.168 129.867 38.942 131.696 35.667Z" fill="#3f51b5"/>
|
||||||
|
<path d="M118.503 62.17C115.194 60.926 111.507 61.004 108.325 62.536C108.275 62.56 108.225 62.584 108.174 62.609C103.146 65.062 98.467 57.787 104.724 53.468C110.981 49.15 120.476 49.743 124.685 54.522C128.369 58.704 124.939 64.591 118.503 62.17Z" fill="#181818"/>
|
||||||
|
<path d="M114.547 67.177C119.934 67.177 124.301 64.9626 124.301 62.231C124.301 59.4994 119.934 57.285 114.547 57.285C109.16 57.285 104.793 59.4994 104.793 62.231C104.793 64.9626 109.16 67.177 114.547 67.177Z" fill="#D04642"/>
|
||||||
|
<path d="M108.625 64.591C108.625 64.591 113.955 62.074 119.493 64.591C119.493 64.591 114.791 60.611 108.625 64.591Z" fill="#3f51b5"/>
|
||||||
|
<path d="M124.3 63.707C124.3 63.707 127.801 62.771 128.219 59.009C128.219 59.009 129.212 63.389 124.3 63.707Z" fill="#3f51b5"/>
|
||||||
|
<path d="M103.719 63.707C103.719 63.707 100.218 62.771 99.8 59.009C99.8 59.009 98.808 63.389 103.719 63.707Z" fill="#3f51b5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 14 KiB |
BIN
public/images/testimonial/vector-smart.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
public/images/work-progress/progress-work.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
0
src/Style/style.css
Normal file
29
src/app/(site)/about/page.tsx
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
import React from "react";
|
||||||
|
import HeroSub from "@/components/SharedComponent/HeroSub";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
import Counter from "@/components/Home/Counter";
|
||||||
|
import Progresswork from "@/components/Home/WorkProgress";
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "About | Venus",
|
||||||
|
};
|
||||||
|
|
||||||
|
const page = () => {
|
||||||
|
const breadcrumbLinks = [
|
||||||
|
{ href: "/", text: "Home" },
|
||||||
|
{ href: "/about", text: "About" },
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<HeroSub
|
||||||
|
title="About Us"
|
||||||
|
description="Discover a wealth of insightful materials meticulously crafted to provide you with a comprehensive understanding of the latest trends."
|
||||||
|
breadcrumbLinks={breadcrumbLinks}
|
||||||
|
/>
|
||||||
|
<Counter isColorMode={true} />
|
||||||
|
<Progresswork isColorMode={true} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default page;
|
||||||
22
src/app/(site)/blog/page.tsx
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import BlogList from '@/components/Blog/BlogList'
|
||||||
|
import HeroSub from '@/components/SharedComponent/HeroSub'
|
||||||
|
|
||||||
|
const BlogPage = () => {
|
||||||
|
const breadcrumbLinks = [
|
||||||
|
{ href: '/', text: 'Home' },
|
||||||
|
{ href: '/blog', text: 'Blog' },
|
||||||
|
]
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<HeroSub
|
||||||
|
title='Blog'
|
||||||
|
description='Discover a wealth of insightful materials meticulously crafted to provide you with a comprehensive understanding of the latest trends.'
|
||||||
|
breadcrumbLinks={breadcrumbLinks}
|
||||||
|
/>
|
||||||
|
<BlogList />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default BlogPage
|
||||||
30
src/app/(site)/contact/page.tsx
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import ContactForm from "@/components/Contact/Form";
|
||||||
|
import ContactInfo from "@/components/Contact/ContactInfo";
|
||||||
|
import Location from "@/components/Contact/OfficeLocation";
|
||||||
|
import React from "react";
|
||||||
|
import HeroSub from "@/components/SharedComponent/HeroSub";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Contact | Venus",
|
||||||
|
};
|
||||||
|
|
||||||
|
const page = () => {
|
||||||
|
const breadcrumbLinks = [
|
||||||
|
{ href: "/", text: "Home" },
|
||||||
|
{ href: "/contact", text: "Contact" },
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<HeroSub
|
||||||
|
title="Contact Us"
|
||||||
|
description="Discover a wealth of insightful materials meticulously crafted to provide you with a comprehensive understanding of the latest trends."
|
||||||
|
breadcrumbLinks={breadcrumbLinks}
|
||||||
|
/>
|
||||||
|
<ContactInfo />
|
||||||
|
<ContactForm />
|
||||||
|
<Location />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default page;
|
||||||
14
src/app/(site)/documentation/page.tsx
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
import { Documentation } from "@/components/Documentation/Documentation";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Documentation | Venus",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Documentation/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
26
src/app/(site)/portfolio/page.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import React from "react";
|
||||||
|
import Portfolio from "@/components/portfolio/PortfolioList";
|
||||||
|
import HeroSub from "@/components/SharedComponent/HeroSub";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Portfolio | Venus",
|
||||||
|
};
|
||||||
|
|
||||||
|
const PortfolioList = () => {
|
||||||
|
const breadcrumbLinks = [
|
||||||
|
{ href: "/", text: "Home" },
|
||||||
|
{ href: "/portfolio", text: "Portfolio" },
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<HeroSub
|
||||||
|
title="Portfolio"
|
||||||
|
description="Dive into a curated collection of my finest work, showcasing expertise across various industries."
|
||||||
|
breadcrumbLinks={breadcrumbLinks}
|
||||||
|
/>
|
||||||
|
<Portfolio />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PortfolioList;
|
||||||
29
src/app/(site)/services/page.tsx
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
import React from "react";
|
||||||
|
import HeroSub from "@/components/SharedComponent/HeroSub";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
import Counter from "@/components/Home/Counter";
|
||||||
|
import Progresswork from "@/components/Home/WorkProgress";
|
||||||
|
import Services from "@/components/Home/Services";
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Services | Venus",
|
||||||
|
};
|
||||||
|
|
||||||
|
const page = () => {
|
||||||
|
const breadcrumbLinks = [
|
||||||
|
{ href: "/", text: "Home" },
|
||||||
|
{ href: "/services", text: "Services" },
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<HeroSub
|
||||||
|
title="Services"
|
||||||
|
description="Discover a wealth of insightful materials meticulously crafted to provide you with a comprehensive understanding of the latest trends."
|
||||||
|
breadcrumbLinks={breadcrumbLinks}
|
||||||
|
/>
|
||||||
|
<Services/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default page;
|
||||||
24
src/app/api/auth/[...nextauth]/route.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import NextAuth from "next-auth"
|
||||||
|
import type { NextAuthOptions } from "next-auth"
|
||||||
|
|
||||||
|
// 基础配置,如需启用社交登录请配置对应的 providers
|
||||||
|
// 参考: https://next-auth.js.org/providers/
|
||||||
|
export const authOptions: NextAuthOptions = {
|
||||||
|
providers: [
|
||||||
|
// 示例:启用 Google 登录
|
||||||
|
// GoogleProvider({
|
||||||
|
// clientId: process.env.GOOGLE_CLIENT_ID!,
|
||||||
|
// clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
|
||||||
|
// }),
|
||||||
|
// 示例:启用 GitHub 登录
|
||||||
|
// GithubProvider({
|
||||||
|
// clientId: process.env.GITHUB_ID!,
|
||||||
|
// clientSecret: process.env.GITHUB_SECRET!,
|
||||||
|
// }),
|
||||||
|
],
|
||||||
|
secret: process.env.NEXTAUTH_SECRET || "development-secret-change-in-production",
|
||||||
|
}
|
||||||
|
|
||||||
|
const handler = NextAuth(authOptions)
|
||||||
|
|
||||||
|
export { handler as GET, handler as POST }
|
||||||
13
src/app/api/contex/ToasetContex.tsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { Toaster } from "react-hot-toast";
|
||||||
|
|
||||||
|
const ToasterContext = () => {
|
||||||
|
return (
|
||||||
|
<div className="z-99999">
|
||||||
|
<Toaster />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ToasterContext;
|
||||||
136
src/app/api/data.tsx
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
import { getImgPath } from "@/utils/image";
|
||||||
|
|
||||||
|
export const menuItems = [
|
||||||
|
{ name: "Home", href: "#home" },
|
||||||
|
{ name: "About", href: "#about" },
|
||||||
|
{ name: "Services", href: "#services" },
|
||||||
|
{ name: "Portfolio", href: "#portfolio" },
|
||||||
|
{ name: "Testimonials", href: "#testimonials" },
|
||||||
|
{ name: "Blog", href: "/#blog" },
|
||||||
|
];
|
||||||
|
|
||||||
|
export const count = [
|
||||||
|
{
|
||||||
|
icon: getImgPath("/images/counter/star.svg"),
|
||||||
|
value: "4.86",
|
||||||
|
description: "Out of 5 stars from 3896 reviews on Google platform",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: getImgPath("/images/counter/admin.svg"),
|
||||||
|
value: "364",
|
||||||
|
description: "Client testimonials received in the year 2021",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: getImgPath("/images/counter/bag.svg"),
|
||||||
|
value: "45M+",
|
||||||
|
description: "Revenue generated through new projects & marketing",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const Progress = [
|
||||||
|
{ title: 'UX Research and Testing', Progress: 95 },
|
||||||
|
{ title: 'Product Management', Progress: 84 },
|
||||||
|
{ title: 'UI & Visual Design', Progress: 90 }
|
||||||
|
];
|
||||||
|
|
||||||
|
export const Servicebox = [
|
||||||
|
{
|
||||||
|
icon: getImgPath('/images/services/ux-design-product_1.svg'),
|
||||||
|
title: 'UX & Product Design',
|
||||||
|
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: getImgPath('/images/services/perfomance-optimization.svg'),
|
||||||
|
title: 'Performance Optimization',
|
||||||
|
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: getImgPath('/images/services/ux-design-product_2.svg'),
|
||||||
|
title: 'UX & Products Design',
|
||||||
|
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const portfolioinfo = [
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/cozycasa.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Cozycasa',
|
||||||
|
slug: 'Cozycasa',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-0'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/mars.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Mars',
|
||||||
|
slug: 'Mars',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-24'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/humans.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Everyday Humans',
|
||||||
|
slug: 'everyday-humans',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-0'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/roket-squred.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Rocket Squared',
|
||||||
|
slug: 'rocket-squared',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-24'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/panda-logo.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Panda Logo',
|
||||||
|
slug: 'panda-logo',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-0'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/humans.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Fusion Dynamics',
|
||||||
|
slug: 'fusion-dynamics',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-0'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/cozycasa.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'InnovateX Ventures',
|
||||||
|
slug: 'innovate-x-ventures',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-24'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/mars.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Nebula Holdings',
|
||||||
|
slug: 'nebula-holdings',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-0'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/panda-logo.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Summit Partners',
|
||||||
|
slug: 'summit-partners',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-24'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: getImgPath('/images/portfolio/roket-squred.png'),
|
||||||
|
alt: 'Portfolio',
|
||||||
|
title: 'Apex Strategies',
|
||||||
|
slug: 'apex-strategies',
|
||||||
|
info: 'Designation',
|
||||||
|
Class: 'md:mt-0'
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
36
src/app/context/AuthDialogContext.tsx
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
|
import React, { createContext, useState, ReactNode, Dispatch, SetStateAction } from "react";
|
||||||
|
|
||||||
|
// Define types for the context
|
||||||
|
interface AuthDialogContextType {
|
||||||
|
isSuccessDialogOpen: boolean;
|
||||||
|
isFailedDialogOpen: boolean;
|
||||||
|
isUserRegistered: boolean;
|
||||||
|
setIsSuccessDialogOpen: Dispatch<SetStateAction<boolean>>;
|
||||||
|
setIsFailedDialogOpen: Dispatch<SetStateAction<boolean>>;
|
||||||
|
setIsUserRegistered: Dispatch<SetStateAction<boolean>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create context with type or null
|
||||||
|
export const AuthDialogContext = createContext<AuthDialogContextType | null>(null);
|
||||||
|
|
||||||
|
// Define the provider props type
|
||||||
|
interface AuthDialogProviderProps {
|
||||||
|
children: ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a provider component
|
||||||
|
export const AuthDialogProvider: React.FC<AuthDialogProviderProps> = ({ children }) => {
|
||||||
|
const [isSuccessDialogOpen , setIsSuccessDialogOpen] = useState<boolean>(false);
|
||||||
|
const [isFailedDialogOpen , setIsFailedDialogOpen] = useState<boolean>(false);
|
||||||
|
const [isUserRegistered , setIsUserRegistered] = useState<boolean>(false);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<AuthDialogContext.Provider value={{ isSuccessDialogOpen ,isFailedDialogOpen, setIsSuccessDialogOpen, setIsFailedDialogOpen,isUserRegistered,setIsUserRegistered }}>
|
||||||
|
{children}
|
||||||
|
</AuthDialogContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AuthDialogContext;
|
||||||
BIN
src/app/favicon.ico
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
141
src/app/globals.css
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
@import 'tailwindcss';
|
||||||
|
|
||||||
|
@custom-variant dark (&:is(.dark *));
|
||||||
|
|
||||||
|
@theme {
|
||||||
|
--spacing-6xl: 75rem;
|
||||||
|
--container-screen-2xl: 83.75rem;
|
||||||
|
|
||||||
|
--shadow-service: 0px 3px 20px 0px #8e9ca90d;
|
||||||
|
--shadow-deatail_shadow: 0px 20px 80px 0px #68758d26;
|
||||||
|
--shadow-dark-md: rgba(145, 158, 171, 0.2) 0px 0px 2px 0px,
|
||||||
|
rgba(145, 158, 171, 0.12) 0px 12px 24px -4px;
|
||||||
|
|
||||||
|
--transition-duration-150: 150ms;
|
||||||
|
|
||||||
|
--spacing-25: 25rem;
|
||||||
|
--spacing-29: 28rem;
|
||||||
|
--spacing-45: 45rem;
|
||||||
|
--spacing-50: 50rem;
|
||||||
|
--spacing-94: 22.5rem;
|
||||||
|
--spacing-120: 120rem;
|
||||||
|
--spacing-6_25: 6.25rem;
|
||||||
|
--spacing-70\%: 70%;
|
||||||
|
--spacing-40\%: 40%;
|
||||||
|
--spacing-30\%: 30%;
|
||||||
|
--spacing-60\%: 60%;
|
||||||
|
--spacing-8_5: 8.5rem;
|
||||||
|
--spacing-3_75: 3.75rem;
|
||||||
|
|
||||||
|
--height-150: 750px;
|
||||||
|
--height-6_25: 6.25rem;
|
||||||
|
|
||||||
|
--leading-extra-loose: 2.5;
|
||||||
|
--leading-2_5: 2.5rem;
|
||||||
|
|
||||||
|
--inset-5\%: 5%;
|
||||||
|
--inset-35\%: 35%;
|
||||||
|
|
||||||
|
--z-index-1: 1;
|
||||||
|
--z-index-2: 2;
|
||||||
|
--z-index-999: 999;
|
||||||
|
|
||||||
|
--color-primary: #2f73f2;
|
||||||
|
--color-secondary: #547593;
|
||||||
|
--color-midnight_text: #102d47;
|
||||||
|
--color-grey: #668199;
|
||||||
|
--color-border: #ccd7e1;
|
||||||
|
--color-success: #3cd278;
|
||||||
|
--color-section: #f8fafc;
|
||||||
|
--color-darkmode: #081738;
|
||||||
|
--color-darklight: #000f30;
|
||||||
|
--color-dark_border: #224767;
|
||||||
|
--color-Sky-blue-mist: #c0d5fb;
|
||||||
|
|
||||||
|
--background-image-gradient-radial: radial-gradient(var(--tw-gradient-stops));
|
||||||
|
--background-image-gradient-conic: conic-gradient(
|
||||||
|
from 180deg at 50% 50%,
|
||||||
|
var(--tw-gradient-stops)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
The default border color has changed to `currentColor` in Tailwind CSS v4,
|
||||||
|
so we've added these compatibility styles to make sure everything still
|
||||||
|
looks the same as it did with Tailwind CSS v3.
|
||||||
|
|
||||||
|
If we ever want to remove these styles, we need to add an explicit border
|
||||||
|
color utility to any element that depends on these defaults.
|
||||||
|
*/
|
||||||
|
@layer base {
|
||||||
|
*,
|
||||||
|
::after,
|
||||||
|
::before,
|
||||||
|
::backdrop,
|
||||||
|
::file-selector-button {
|
||||||
|
border-color: var(--color-gray-200, currentColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
@apply overflow-x-hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
section {
|
||||||
|
@apply py-16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.margin_top {
|
||||||
|
@apply md:mt-[6.25rem] mt-0;
|
||||||
|
}
|
||||||
|
/* Slick Slider */
|
||||||
|
.slick-slide,
|
||||||
|
.portfolio_slide {
|
||||||
|
@apply focus-visible:outline-0!;
|
||||||
|
}
|
||||||
|
.slick-dots li.slick-active button:before {
|
||||||
|
@apply opacity-100! text-primary! w-4! h-4!;
|
||||||
|
}
|
||||||
|
.slick-dots li button:before {
|
||||||
|
@apply text-base! text-[#BBC8D5]! opacity-100!;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details p,
|
||||||
|
.blog-details hr {
|
||||||
|
@apply mb-8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details hr {
|
||||||
|
@apply border-border dark:border-dark_border;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details strong {
|
||||||
|
@apply font-bold dark:text-white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details ul {
|
||||||
|
@apply mb-8 list-inside list-disc space-y-3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details ol {
|
||||||
|
@apply mb-8 list-inside list-decimal space-y-3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details h1 {
|
||||||
|
@apply mb-8 text-3xl font-bold text-midnight_text dark:text-white sm:text-4xl md:text-[40px] md:leading-[1.28];
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details h2 {
|
||||||
|
@apply mb-8 text-2xl font-bold text-midnight_text dark:text-white sm:text-3xl md:text-[35px] md:leading-[1.28];
|
||||||
|
}
|
||||||
|
|
||||||
|
.blog-details h3 {
|
||||||
|
@apply mb-6 text-2xl font-bold dark:text-white sm:text-[28px] sm:leading-[40px];
|
||||||
|
}
|
||||||
44
src/app/layout.tsx
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import { Inter } from "next/font/google";
|
||||||
|
import "./globals.css";
|
||||||
|
import Header from "@/components/Layout/Header";
|
||||||
|
import Footer from "@/components/Layout/Footer";
|
||||||
|
import { ThemeProvider } from "next-themes";
|
||||||
|
import ScrollToTop from '@/components/ScrollToTop';
|
||||||
|
import Aoscompo from "@/utils/aos";
|
||||||
|
import NextTopLoader from 'nextjs-toploader';
|
||||||
|
import SessionProviderComp from "@/components/nextauth/SessionProvider";
|
||||||
|
import { AuthDialogProvider } from "./context/AuthDialogContext";
|
||||||
|
const inter = Inter({ subsets: ["latin"] });
|
||||||
|
|
||||||
|
|
||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
session,
|
||||||
|
}: Readonly<{
|
||||||
|
children: React.ReactNode;
|
||||||
|
session:any
|
||||||
|
}>) {
|
||||||
|
return (
|
||||||
|
<html lang="en" suppressHydrationWarning>
|
||||||
|
<body className={inter.className}>
|
||||||
|
<NextTopLoader />
|
||||||
|
<AuthDialogProvider>
|
||||||
|
<SessionProviderComp session={session}>
|
||||||
|
<ThemeProvider
|
||||||
|
attribute="class"
|
||||||
|
enableSystem={true}
|
||||||
|
defaultTheme="system"
|
||||||
|
>
|
||||||
|
<Aoscompo>
|
||||||
|
<Header />
|
||||||
|
{children}
|
||||||
|
<Footer />
|
||||||
|
</Aoscompo>
|
||||||
|
<ScrollToTop />
|
||||||
|
</ThemeProvider>
|
||||||
|
</SessionProviderComp>
|
||||||
|
</AuthDialogProvider>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
);
|
||||||
|
}
|
||||||
26
src/app/not-found.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import HeroSub from "@/components/SharedComponent/HeroSub";
|
||||||
|
import NotFound from "@/components/NotFound";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "404 Page | Venus ",
|
||||||
|
};
|
||||||
|
|
||||||
|
const ErrorPage = () => {
|
||||||
|
const breadcrumbLinks = [
|
||||||
|
{ href: "/", text: "Home" },
|
||||||
|
{ href: "/contact", text: "404" },
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<HeroSub
|
||||||
|
title="404"
|
||||||
|
description="We Can't Seem to Find The Page You're Looking For."
|
||||||
|
breadcrumbLinks={breadcrumbLinks}
|
||||||
|
/>
|
||||||
|
<NotFound />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ErrorPage;
|
||||||
28
src/app/page.tsx
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { Metadata } from "next";
|
||||||
|
import Hero from '@/components/Home/Hero';
|
||||||
|
import Counter from '@/components/Home/Counter'
|
||||||
|
import Progresswork from '@/components/Home/WorkProgress';
|
||||||
|
import Services from '@/components/Home/Services';
|
||||||
|
import Portfolio from '@/components/SharedComponent/portfollio'
|
||||||
|
import Testimonial from '@/components/SharedComponent/Testimonial'
|
||||||
|
import Blog from '@/components/SharedComponent/Blog'
|
||||||
|
import Contactform from '@/components/Home/Contact';
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Venus",
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function Home() {
|
||||||
|
return (
|
||||||
|
<main>
|
||||||
|
<Hero />
|
||||||
|
<Counter isColorMode={false} />
|
||||||
|
<Progresswork isColorMode={false} />
|
||||||
|
<Services />
|
||||||
|
<Portfolio />
|
||||||
|
<Testimonial />
|
||||||
|
<Blog />
|
||||||
|
<Contactform />
|
||||||
|
</main>
|
||||||
|
)
|
||||||
|
}
|
||||||
19
src/components/Auth/AuthDialog/FailedLogin.tsx
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import SocialSignIn from "@/components/Auth/SocialSignIn"
|
||||||
|
import Logo from "@/components/Layout/Header/Logo"
|
||||||
|
import { Icon } from "@iconify/react/dist/iconify.js"
|
||||||
|
import Link from "next/link"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export const FailedLogin = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mb-10 text-center mx-auto inline-block bg-error p-3 rounded-md text-white">
|
||||||
|
<div className="flex item-center gap-4">
|
||||||
|
<Icon icon="carbon:close-filled" className="text-xl bg-error" />
|
||||||
|
<p className="text-sm font-medium">Failed! Logged in failed.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
16
src/components/Auth/AuthDialog/SuccessfulLogin.tsx
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
import { Icon } from "@iconify/react/dist/iconify.js"
|
||||||
|
|
||||||
|
|
||||||
|
export const SuccessfullLogin = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mb-10 text-center mx-auto inline-block bg-green-500 p-3 rounded-md text-white">
|
||||||
|
<div className="flex item-center gap-4">
|
||||||
|
<Icon icon="ep:success-filled" className="text-xl bg-green-500" />
|
||||||
|
<p className="text-sm font-medium">Success! Logged in successfully.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
16
src/components/Auth/AuthDialog/UserRegistered.tsx
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
import { Icon } from "@iconify/react/dist/iconify.js"
|
||||||
|
|
||||||
|
|
||||||
|
export const UserRegistered = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mb-10 text-center mx-auto inline-block bg-green-500 p-3 rounded-md text-white">
|
||||||
|
<div className="flex item-center gap-4">
|
||||||
|
<Icon icon="ep:success-filled" className="text-xl bg-green-500" />
|
||||||
|
<p className="text-sm font-medium">Success! User Registered successfully.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
111
src/components/Auth/SignIn/index.tsx
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
"use client";
|
||||||
|
import { signIn, useSession } from "next-auth/react";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { useRouter } from "next/navigation";
|
||||||
|
import { useContext, useEffect, useState } from "react";
|
||||||
|
import SocialSignIn from "../SocialSignIn";
|
||||||
|
import Logo from "@/components/Layout/Header/Logo";
|
||||||
|
import Loader from "@/components/Common/Loader";
|
||||||
|
import toast, { Toaster } from "react-hot-toast";
|
||||||
|
import AuthDialogContext from "@/app/context/AuthDialogContext";
|
||||||
|
|
||||||
|
const Signin = ({ signInOpen }: { signInOpen?: any }) => {
|
||||||
|
const { data: session } = useSession();
|
||||||
|
const [username, setUsername] = useState("admin");
|
||||||
|
const [password, setPassword] = useState("admin123");
|
||||||
|
const [error, setError] = useState("");
|
||||||
|
const authDialog = useContext(AuthDialogContext);
|
||||||
|
|
||||||
|
const handleSubmit = async (e: any) => {
|
||||||
|
const notify = () => toast("Here is your toast.");
|
||||||
|
e.preventDefault();
|
||||||
|
const result = await signIn("credentials", {
|
||||||
|
redirect: false,
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
});
|
||||||
|
if (result?.error) {
|
||||||
|
// Handle successful sign-in
|
||||||
|
setError(result.error);
|
||||||
|
}
|
||||||
|
if (result?.status === 200) {
|
||||||
|
setTimeout(() => {
|
||||||
|
signInOpen(false);
|
||||||
|
}, 1200);
|
||||||
|
authDialog?.setIsSuccessDialogOpen(true);
|
||||||
|
setTimeout(() => {
|
||||||
|
authDialog?.setIsSuccessDialogOpen(false);
|
||||||
|
}, 1100);
|
||||||
|
} else {
|
||||||
|
authDialog?.setIsFailedDialogOpen(true);
|
||||||
|
setTimeout(() => {
|
||||||
|
authDialog?.setIsFailedDialogOpen(false);
|
||||||
|
}, 1100);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mb-10 text-center mx-auto inline-block max-w-[160px]">
|
||||||
|
<Logo />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<SocialSignIn />
|
||||||
|
|
||||||
|
<span className="z-1 relative my-8 block text-center">
|
||||||
|
<span className="-z-1 absolute left-0 top-1/2 block h-px w-full bg-border dark:bg-dark_border"></span>
|
||||||
|
<span className="text-body-secondary relative z-10 inline-block bg-white px-3 text-base dark:bg-darklight">
|
||||||
|
OR
|
||||||
|
</span>
|
||||||
|
<Toaster />
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<form>
|
||||||
|
<div className="mb-[22px]">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Username"
|
||||||
|
required
|
||||||
|
value={username}
|
||||||
|
onChange={(e) => setUsername(e.target.value)}
|
||||||
|
className="w-full rounded-md border placeholder:text-gray-400 border-border dark:border-dark_border border-solid bg-transparent px-5 py-3 text-base text-dark outline-hidden transition focus:border-primary focus-visible:shadow-none dark:border-border_color dark:text-white dark:focus:border-primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mb-[22px]">
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
required
|
||||||
|
value={password}
|
||||||
|
placeholder="Password"
|
||||||
|
onChange={(e) => setPassword(e.target.value)}
|
||||||
|
className="w-full rounded-md border border-border dark:border-dark_border border-solid bg-transparent px-5 py-3 text-base text-dark outline-hidden transition focus:border-primary focus-visible:shadow-none dark:border-border_color dark:text-white dark:focus:border-primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mb-9">
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
className="flex w-full cursor-pointer items-center justify-center rounded-md border border-primary bg-primary hover:bg-darkprimary dark:hover:bg-darkprimary! px-5 py-3 text-base text-white transition duration-300 ease-in-out "
|
||||||
|
>
|
||||||
|
Sign In
|
||||||
|
{/* {loading && <Loader />} */}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<Link
|
||||||
|
href="/"
|
||||||
|
className="mb-2 inline-block text-base text-dark hover:text-primary dark:text-white dark:hover:text-primary"
|
||||||
|
>
|
||||||
|
Forget Password?
|
||||||
|
</Link>
|
||||||
|
<p className="text-body-secondary text-base">
|
||||||
|
Not a member yet?{" "}
|
||||||
|
<Link href="/" className="text-primary hover:underline">
|
||||||
|
Sign Up
|
||||||
|
</Link>
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Signin;
|
||||||
128
src/components/Auth/SignUp/index.tsx
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
"use client";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { useRouter } from "next/navigation";
|
||||||
|
import toast from "react-hot-toast";
|
||||||
|
import SocialSignUp from "../SocialSignUp";
|
||||||
|
import Logo from "@/components/Layout/Header/Logo"
|
||||||
|
import { useContext, useState } from "react";
|
||||||
|
import Loader from "@/components/Common/Loader";
|
||||||
|
import AuthDialogContext from "@/app/context/AuthDialogContext";
|
||||||
|
const SignUp = ({signUpOpen}:{signUpOpen?:any}) => {
|
||||||
|
const router = useRouter();
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const authDialog = useContext(AuthDialogContext);
|
||||||
|
|
||||||
|
const handleSubmit = (e: any) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
setLoading(true);
|
||||||
|
const data = new FormData(e.currentTarget);
|
||||||
|
const value = Object.fromEntries(data.entries());
|
||||||
|
const finalData = { ...value };
|
||||||
|
|
||||||
|
fetch("/api/register", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify(finalData),
|
||||||
|
})
|
||||||
|
.then((res) => res.json())
|
||||||
|
.then((data) => {
|
||||||
|
toast.success("Successfully registered");
|
||||||
|
setLoading(false);
|
||||||
|
router.push("/");
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
toast.error(err.message);
|
||||||
|
setLoading(false);
|
||||||
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
signUpOpen(false);
|
||||||
|
}, 1200);
|
||||||
|
authDialog?.setIsUserRegistered(true);
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
authDialog?.setIsUserRegistered(false);
|
||||||
|
}, 1100);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mb-10 text-center mx-auto inline-block max-w-[160px]">
|
||||||
|
<Logo />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<SocialSignUp />
|
||||||
|
|
||||||
|
<span className="z-1 relative my-8 block text-center">
|
||||||
|
<span className="-z-1 absolute left-0 top-1/2 block h-px w-full bg-border dark:bg-dark_border"></span>
|
||||||
|
<span className="text-body-secondary relative z-10 inline-block bg-white px-3 text-base dark:bg-darklight">
|
||||||
|
OR
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<form onSubmit={handleSubmit}>
|
||||||
|
<div className="mb-[22px]">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Name"
|
||||||
|
name="name"
|
||||||
|
required
|
||||||
|
className="w-full rounded-md border border-border dark:border-dark_border border-solid bg-transparent px-5 py-3 text-base text-dark outline-hidden transition placeholder:text-gray-300 focus:border-primary focus-visible:shadow-none dark:text-white dark:focus:border-primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mb-[22px]">
|
||||||
|
<input
|
||||||
|
type="email"
|
||||||
|
placeholder="Email"
|
||||||
|
name="email"
|
||||||
|
required
|
||||||
|
className="w-full rounded-md border border-border dark:border-dark_border border-solid bg-transparent px-5 py-3 text-base text-dark outline-hidden transition placeholder:text-gray-300 focus:border-primary focus-visible:shadow-none dark:text-white dark:focus:border-primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mb-[22px]">
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
placeholder="Password"
|
||||||
|
name="password"
|
||||||
|
required
|
||||||
|
className="w-full rounded-md border border-border dark:border-dark_border border-solid bg-transparent px-5 py-3 text-base text-dark outline-hidden transition placeholder:text-gray-300 focus:border-primary focus-visible:shadow-none dark:text-white dark:focus:border-primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="mb-9">
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
className="flex w-full cursor-pointer items-center justify-center rounded-md bg-primary px-5 py-3 text-base text-white transition duration-300 ease-in-out hover:bg-darkprimary! dark:hover:bg-darkprimary!"
|
||||||
|
>
|
||||||
|
Sign Up {loading && <Loader />}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<p className="text-body-secondary mb-4 text-base">
|
||||||
|
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-body-secondary text-base">
|
||||||
|
Already have an account?
|
||||||
|
<Link
|
||||||
|
href="/"
|
||||||
|
className="pl-2 text-primary hover:bg-darkprimary hover:underline"
|
||||||
|
>
|
||||||
|
Sign In
|
||||||
|
</Link>
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SignUp;
|
||||||
81
src/components/Auth/SocialSignIn.tsx
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { signIn } from "next-auth/react";
|
||||||
|
|
||||||
|
|
||||||
|
const SocialSignIn = () => {
|
||||||
|
const handleGoogleSignIn = async () => {
|
||||||
|
await signIn("google");
|
||||||
|
};
|
||||||
|
const handleGithubSignIn = async () => {
|
||||||
|
await signIn("github");
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="flex gap-4">
|
||||||
|
<button
|
||||||
|
// onClick={handleGoogleSignIn}
|
||||||
|
className="flex w-full items-center justify-center gap-2.5 rounded-lg border border-solid hover:bg-stroke border-stroke p-3.5 text-dark duration-200 ease-in dark:border-dark_border dark:text-white dark:hover:bg-primary/10 hover:bg-primary/10!"
|
||||||
|
>
|
||||||
|
Sign In
|
||||||
|
<svg
|
||||||
|
width="23"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 23 22"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g clipPath="url(#clip0_709_8846)">
|
||||||
|
<path
|
||||||
|
d="M22.5001 11.2438C22.5134 10.4876 22.4338 9.73256 22.2629 8.995H11.7246V13.0771H17.9105C17.7933 13.7929 17.5296 14.478 17.1352 15.0914C16.7409 15.7047 16.224 16.2335 15.6158 16.646L15.5942 16.7827L18.9264 19.3124L19.1571 19.335C21.2772 17.4161 22.4997 14.5926 22.4997 11.2438"
|
||||||
|
fill="#4285F4"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M11.7245 22C14.755 22 17.2992 21.0221 19.1577 19.3355L15.6156 16.6464C14.6679 17.2944 13.3958 17.7467 11.7245 17.7467C10.3051 17.7385 8.92433 17.2926 7.77814 16.472C6.63195 15.6515 5.77851 14.4981 5.33892 13.1755L5.20737 13.1865L1.74255 15.8142L1.69727 15.9376C2.63043 17.7602 4.06252 19.2925 5.83341 20.3631C7.60429 21.4337 9.64416 22.0005 11.7249 22"
|
||||||
|
fill="#34A853"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M5.33889 13.1755C5.09338 12.4753 4.96669 11.7404 4.96388 11C4.9684 10.2608 5.09041 9.52685 5.32552 8.8245L5.31927 8.67868L1.81196 6.00867L1.69724 6.06214C0.910039 7.5938 0.5 9.28491 0.5 10.9999C0.5 12.7148 0.910039 14.406 1.69724 15.9376L5.33889 13.1755Z"
|
||||||
|
fill="#FBBC05"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M11.7249 4.25337C13.3333 4.22889 14.8888 4.8159 16.065 5.89121L19.2329 2.86003C17.2011 0.992106 14.5106 -0.0328008 11.7249 3.27798e-05C9.64418 -0.000452376 7.60433 0.566279 5.83345 1.63686C4.06256 2.70743 2.63046 4.23965 1.69727 6.06218L5.32684 8.82455C5.77077 7.50213 6.62703 6.34962 7.77491 5.5295C8.9228 4.70938 10.3044 4.26302 11.7249 4.25337Z"
|
||||||
|
fill="#EB4335"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_709_8846">
|
||||||
|
<rect
|
||||||
|
width="22"
|
||||||
|
height="22"
|
||||||
|
fill="white"
|
||||||
|
transform="translate(0.5)"
|
||||||
|
/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
// onClick={handleGithubSignIn}
|
||||||
|
className="flex w-full items-center justify-center gap-2.5 rounded-lg border border-solid hover:bg-stroke border-stroke p-3.5 text-dark duration-200 ease-in dark:border-dark_border dark:text-white dark:hover:bg-primary/10 hover:bg-primary/10"
|
||||||
|
>
|
||||||
|
Sign In
|
||||||
|
<svg
|
||||||
|
width="22"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 22 22"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M10.9997 1.83331C5.93773 1.83331 1.83301 6.04119 1.83301 11.232C1.83301 15.3847 4.45954 18.9077 8.10178 20.1505C8.55988 20.2375 8.72811 19.9466 8.72811 19.6983C8.72811 19.4743 8.71956 18.7338 8.71567 17.9485C6.16541 18.517 5.6273 16.8395 5.6273 16.8395C5.21032 15.7532 4.60951 15.4644 4.60951 15.4644C3.77785 14.8811 4.6722 14.893 4.6722 14.893C5.59272 14.9593 6.07742 15.8615 6.07742 15.8615C6.89499 17.2984 8.22184 16.883 8.74493 16.6429C8.82718 16.0353 9.06478 15.6208 9.32694 15.3861C7.2909 15.1484 5.15051 14.3425 5.15051 10.7412C5.15051 9.71509 5.5086 8.87661 6.09503 8.21844C5.99984 7.98167 5.68611 7.02577 6.18382 5.73115C6.18382 5.73115 6.95358 5.47855 8.70532 6.69458C9.43648 6.48627 10.2207 6.3819 10.9997 6.37836C11.7787 6.3819 12.5635 6.48627 13.2961 6.69458C15.0457 5.47855 15.8145 5.73115 15.8145 5.73115C16.3134 7.02577 15.9995 7.98167 15.9043 8.21844C16.4921 8.87661 16.8477 9.715 16.8477 10.7412C16.8477 14.351 14.7033 15.146 12.662 15.3786C12.9909 15.6702 13.2838 16.2423 13.2838 17.1191C13.2838 18.3766 13.2732 19.3888 13.2732 19.6983C13.2732 19.9485 13.4382 20.2415 13.9028 20.1492C17.5431 18.905 20.1663 15.3833 20.1663 11.232C20.1663 6.04119 16.0621 1.83331 10.9997 1.83331Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SocialSignIn;
|
||||||
75
src/components/Auth/SocialSignUp.tsx
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { signIn } from "next-auth/react";
|
||||||
|
|
||||||
|
|
||||||
|
const SocialSignUp = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="flex gap-4">
|
||||||
|
<button
|
||||||
|
// onClick={() => signIn("google")}
|
||||||
|
className="flex w-full items-center justify-center gap-2.5 rounded-lg border border-solid hover:bg-stroke border-stroke p-3.5 text-dark duration-200 ease-in dark:border-dark_border dark:text-white dark:hover:bg-primary/10 hover:bg-primary/10"
|
||||||
|
>
|
||||||
|
Sign Up
|
||||||
|
<svg
|
||||||
|
width="23"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 23 22"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g clipPath="url(#clip0_709_8846)">
|
||||||
|
<path
|
||||||
|
d="M22.5001 11.2438C22.5134 10.4876 22.4338 9.73256 22.2629 8.995H11.7246V13.0771H17.9105C17.7933 13.7929 17.5296 14.478 17.1352 15.0914C16.7409 15.7047 16.224 16.2335 15.6158 16.646L15.5942 16.7827L18.9264 19.3124L19.1571 19.335C21.2772 17.4161 22.4997 14.5926 22.4997 11.2438"
|
||||||
|
fill="#4285F4"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M11.7245 22C14.755 22 17.2992 21.0221 19.1577 19.3355L15.6156 16.6464C14.6679 17.2944 13.3958 17.7467 11.7245 17.7467C10.3051 17.7385 8.92433 17.2926 7.77814 16.472C6.63195 15.6515 5.77851 14.4981 5.33892 13.1755L5.20737 13.1865L1.74255 15.8142L1.69727 15.9376C2.63043 17.7602 4.06252 19.2925 5.83341 20.3631C7.60429 21.4337 9.64416 22.0005 11.7249 22"
|
||||||
|
fill="#34A853"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M5.33889 13.1755C5.09338 12.4753 4.96669 11.7404 4.96388 11C4.9684 10.2608 5.09041 9.52685 5.32552 8.8245L5.31927 8.67868L1.81196 6.00867L1.69724 6.06214C0.910039 7.5938 0.5 9.28491 0.5 10.9999C0.5 12.7148 0.910039 14.406 1.69724 15.9376L5.33889 13.1755Z"
|
||||||
|
fill="#FBBC05"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M11.7249 4.25337C13.3333 4.22889 14.8888 4.8159 16.065 5.89121L19.2329 2.86003C17.2011 0.992106 14.5106 -0.0328008 11.7249 3.27798e-05C9.64418 -0.000452376 7.60433 0.566279 5.83345 1.63686C4.06256 2.70743 2.63046 4.23965 1.69727 6.06218L5.32684 8.82455C5.77077 7.50213 6.62703 6.34962 7.77491 5.5295C8.9228 4.70938 10.3044 4.26302 11.7249 4.25337Z"
|
||||||
|
fill="#EB4335"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_709_8846">
|
||||||
|
<rect
|
||||||
|
width="22"
|
||||||
|
height="22"
|
||||||
|
fill="white"
|
||||||
|
transform="translate(0.5)"
|
||||||
|
/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
// onClick={() => signIn("github")}
|
||||||
|
className="flex w-full items-center justify-center gap-2.5 rounded-lg border border-solid hover:bg-stroke border-stroke p-3.5 text-dark duration-200 ease-in dark:border-dark_border dark:text-white dark:hover:bg-primary/10 hover:bg-primary/10"
|
||||||
|
>
|
||||||
|
Sign Up
|
||||||
|
<svg
|
||||||
|
width="22"
|
||||||
|
height="22"
|
||||||
|
viewBox="0 0 22 22"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M10.9997 1.83331C5.93773 1.83331 1.83301 6.04119 1.83301 11.232C1.83301 15.3847 4.45954 18.9077 8.10178 20.1505C8.55988 20.2375 8.72811 19.9466 8.72811 19.6983C8.72811 19.4743 8.71956 18.7338 8.71567 17.9485C6.16541 18.517 5.6273 16.8395 5.6273 16.8395C5.21032 15.7532 4.60951 15.4644 4.60951 15.4644C3.77785 14.8811 4.6722 14.893 4.6722 14.893C5.59272 14.9593 6.07742 15.8615 6.07742 15.8615C6.89499 17.2984 8.22184 16.883 8.74493 16.6429C8.82718 16.0353 9.06478 15.6208 9.32694 15.3861C7.2909 15.1484 5.15051 14.3425 5.15051 10.7412C5.15051 9.71509 5.5086 8.87661 6.09503 8.21844C5.99984 7.98167 5.68611 7.02577 6.18382 5.73115C6.18382 5.73115 6.95358 5.47855 8.70532 6.69458C9.43648 6.48627 10.2207 6.3819 10.9997 6.37836C11.7787 6.3819 12.5635 6.48627 13.2961 6.69458C15.0457 5.47855 15.8145 5.73115 15.8145 5.73115C16.3134 7.02577 15.9995 7.98167 15.9043 8.21844C16.4921 8.87661 16.8477 9.715 16.8477 10.7412C16.8477 14.351 14.7033 15.146 12.662 15.3786C12.9909 15.6702 13.2838 16.2423 13.2838 17.1191C13.2838 18.3766 13.2732 19.3888 13.2732 19.6983C13.2732 19.9485 13.4382 20.2415 13.9028 20.1492C17.5431 18.905 20.1663 15.3833 20.1663 11.232C20.1663 6.04119 16.0621 1.83331 10.9997 1.83331Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SocialSignUp;
|
||||||
111
src/components/Blog/BlogHeader/index.tsx
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
import { getAllPosts, getPostBySlug } from "@/utils/markdown";
|
||||||
|
import markdownToHtml from "@/utils/markdownToHtml";
|
||||||
|
import { format } from "date-fns";
|
||||||
|
import Image from "next/image";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
params: { slug: string };
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function generateMetadata({ params }: Props) {
|
||||||
|
const posts = getAllPosts(["title", "date", "excerpt", "coverImage", "slug"]);
|
||||||
|
const post = getPostBySlug(params.slug, [
|
||||||
|
"title",
|
||||||
|
"author",
|
||||||
|
"content",
|
||||||
|
"metadata",
|
||||||
|
]);
|
||||||
|
|
||||||
|
const siteName = process.env.SITE_NAME || "Your Site Name";
|
||||||
|
const authorName = process.env.AUTHOR_NAME || "Your Author Name";
|
||||||
|
|
||||||
|
if (post) {
|
||||||
|
const metadata = {
|
||||||
|
title: `${post.title || "Single Post Page"} | ${siteName}`,
|
||||||
|
author: authorName,
|
||||||
|
robots: {
|
||||||
|
index: true,
|
||||||
|
follow: true,
|
||||||
|
nocache: true,
|
||||||
|
googleBot: {
|
||||||
|
index: true,
|
||||||
|
follow: false,
|
||||||
|
"max-video-preview": -1,
|
||||||
|
"max-image-preview": "large",
|
||||||
|
"max-snippet": -1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return metadata;
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
title: "Not Found",
|
||||||
|
description: "No blog article has been found",
|
||||||
|
author: authorName,
|
||||||
|
robots: {
|
||||||
|
index: false,
|
||||||
|
follow: false,
|
||||||
|
nocache: false,
|
||||||
|
googleBot: {
|
||||||
|
index: false,
|
||||||
|
follow: false,
|
||||||
|
"max-video-preview": -1,
|
||||||
|
"max-image-preview": "large",
|
||||||
|
"max-snippet": -1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function BlogHead({ params }: Props) {
|
||||||
|
const posts = getAllPosts(["title", "date", "excerpt", "coverImage", "slug"]);
|
||||||
|
const post = getPostBySlug(params.slug, [
|
||||||
|
"title",
|
||||||
|
"author",
|
||||||
|
"authorImage",
|
||||||
|
"content",
|
||||||
|
"coverImage",
|
||||||
|
"date",
|
||||||
|
]);
|
||||||
|
|
||||||
|
const content = await markdownToHtml(post.content || "");
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className="pt-44">
|
||||||
|
<div className="container mx-auto max-w-[1200px]">
|
||||||
|
<div className="grid md:grid-cols-12 grid-cols-1 items-center">
|
||||||
|
<div className="col-span-8">
|
||||||
|
<div className="flex flex-col sm:flex-row">
|
||||||
|
<span className="text-base text-midnight_text pr-7 border-r border-solid border-white w-fit">
|
||||||
|
{format(new Date(post.date), "dd MMM yyyy")}
|
||||||
|
</span>
|
||||||
|
<span className="text-base text-midnight_text sm:pl-7 pl-0 w-fit">13 Comments</span>
|
||||||
|
</div>
|
||||||
|
<h2 className="text-midnight_text pt-7 text-[40px] leading-tight font-bold">
|
||||||
|
{post.title}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
<div className="flex gap-6 col-span-4 pt-4 md:pt-0">
|
||||||
|
<Image
|
||||||
|
src={post.authorImage}
|
||||||
|
alt="image"
|
||||||
|
className="rounded-full"
|
||||||
|
width={84}
|
||||||
|
height={84}
|
||||||
|
quality={100}
|
||||||
|
style={{ width: 'auto', height: 'auto' }}
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<span className="text-[22px] leading-tight text-midnight_text">Silicaman</span>
|
||||||
|
<p className="text-xl text-midnight_text">Author</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
30
src/components/Blog/BlogList/index.tsx
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import BlogCard from '@/components/SharedComponent/Blog/blogCard'
|
||||||
|
import { getAllPosts } from '@/utils/markdown'
|
||||||
|
|
||||||
|
const BlogList: React.FC = () => {
|
||||||
|
const posts = getAllPosts(['title', 'date', 'excerpt', 'coverImage', 'slug'])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section
|
||||||
|
className='flex flex-wrap justify-center pt-8 md:pb-24 pb-16 dark:bg-darkmode'
|
||||||
|
id='blog'>
|
||||||
|
<div className='container mx-auto max-w-6xl'>
|
||||||
|
<div className='grid grid-cols-12 gap-7'>
|
||||||
|
{posts.map((blog, i) => (
|
||||||
|
<div
|
||||||
|
key={i}
|
||||||
|
className='w-full lg:col-span-4 md:col-span-6 col-span-12'
|
||||||
|
data-aos='fade-up'
|
||||||
|
data-aos-delay='200'
|
||||||
|
data-aos-duration='1000'>
|
||||||
|
<BlogCard blog={blog} />
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default BlogList
|
||||||
31
src/components/Breadcrumb/index.tsx
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import React, { FC } from 'react'
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
interface BreadcrumbProps {
|
||||||
|
links: { href: string; text: string }[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const Breadcrumb: FC<BreadcrumbProps> = ({ links }) => {
|
||||||
|
const lastIndex = links.length - 1
|
||||||
|
return (
|
||||||
|
<div className='flex items-baseline flex-wrap justify-center my-[0.9375rem] mx-0'>
|
||||||
|
{links.map((link, index) => (
|
||||||
|
<React.Fragment key={index}>
|
||||||
|
{index !== lastIndex ? (
|
||||||
|
<Link
|
||||||
|
href={link.href}
|
||||||
|
className="no-underline flex items-center text-midnight_text dark:text-white/70 font-normal md:text-xl text-lg hover:underline after:relative after:content-[''] after:ml-2.5 after:mr-[0.8125rem] after:my-0 after:inline-block after:top-[0.0625rem] after:w-2 after:h-2 after:border-r-2 after:border-solid after:border-b-2 after:border-midnight_text dark:after:border-white after:-rotate-45">
|
||||||
|
{link.text}
|
||||||
|
</Link>
|
||||||
|
) : (
|
||||||
|
<span className='dark:text-white text-midnight_text md:text-xl text-lg mx-2.5'>
|
||||||
|
{link.text}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</React.Fragment>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Breadcrumb
|
||||||
46
src/components/Common/Breadcrumb.tsx
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import Link from "next/link";
|
||||||
|
import { BreadcrumbProps } from "../../types/breadcrumb"; // Adjust the import path based on your project structure
|
||||||
|
|
||||||
|
const Breadcrumb: React.FC<BreadcrumbProps> = ({
|
||||||
|
pageName,
|
||||||
|
pageDescription,
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<div className="dark:bg-darkmode relative z-10 overflow-hidden pb-[60px] pt-[120px] md:pt-[130px] lg:pt-[160px]">
|
||||||
|
<div className="from-stroke/0 via-stroke to-stroke/0 dark:via-dark-3 absolute bottom-0 left-0 h-px w-full bg-linear-to-r"></div>
|
||||||
|
<div className="container mx-auto">
|
||||||
|
<div className="-mx-4 flex flex-wrap items-center">
|
||||||
|
<div className="w-full px-4">
|
||||||
|
<div className="text-center">
|
||||||
|
<h1 className="text-black mb-4 text-3xl font-bold sm:text-4xl md:text-[40px] md:leading-[1.2] dark:text-white">
|
||||||
|
{pageName}
|
||||||
|
</h1>
|
||||||
|
<p className="text-black dark:text-black-6 mb-5 text-base">
|
||||||
|
{pageDescription}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul className="flex items-center justify-center gap-[10px]">
|
||||||
|
<li>
|
||||||
|
<Link
|
||||||
|
href="/"
|
||||||
|
className="text-black flex items-center gap-[10px] text-base font-medium dark:text-white dark:text-opacity-50"
|
||||||
|
>
|
||||||
|
Home
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p className="text-body-color flex items-center gap-[10px] text-base font-medium">
|
||||||
|
<span className="text-body-color dark:text-white dark:text-opacity-50"> / </span>
|
||||||
|
{pageName}
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Breadcrumb;
|
||||||
11
src/components/Common/Loader.tsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
const Loader = () => {
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
className={`ml-1.5 h-4 w-4 animate-spin rounded-full border-2 border-solid border-white border-t-transparent dark:border-t-transparent`}
|
||||||
|
></span>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Loader;
|
||||||
11
src/components/Common/PreLoader.tsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
const PreLoader = () => {
|
||||||
|
return (
|
||||||
|
<div className="fixed left-0 top-0 z-999999 flex h-screen w-screen items-center justify-center bg-white">
|
||||||
|
<div className="h-16 w-16 animate-spin rounded-full border-4 border-solid border-primary border-t-transparent"></div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PreLoader;
|
||||||
9
src/components/Common/ScrollUp.tsx
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useEffect } from "react";
|
||||||
|
|
||||||
|
export default function ScrollUp() {
|
||||||
|
useEffect(() => window.document.scrollingElement?.scrollTo(0, 0), []);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
91
src/components/Contact/ContactInfo/index.tsx
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
const ContactInfo = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className='dark:bg-darkmode pt-8 md:pb-24 pb-16'>
|
||||||
|
<div className='container mx-auto max-w-6xl px-4'>
|
||||||
|
<div className='flex md:flex-row flex-col md:items-center items-start justify-center md:gap-28 gap-8'>
|
||||||
|
<div className='flex sm:flex-row flex-col items-start sm:gap-8 gap-4'>
|
||||||
|
<div className='bg-primary/20 w-3.75 h-3.75 flex items-center justify-center rounded-full'>
|
||||||
|
<i className="bg-[url('/images/contact-page/email.svg')] bg-no-repeat bg-contain w-8 h-8 inline-block"></i>
|
||||||
|
</div>
|
||||||
|
<div className='flex md:flex-col sm:flex-row flex-col md:items-start sm:items-center items-start h-full justify-between'>
|
||||||
|
<div>
|
||||||
|
<span className='text-midnight_text dark:text-white text-xl font-bold'>
|
||||||
|
Email US
|
||||||
|
</span>
|
||||||
|
<p className='text-DeepOcean font-normal text-lg max-w-80 pt-3 pb-7 dark:text-white/50'>
|
||||||
|
Please feel free to drop us a line. We will respond as soon
|
||||||
|
as possible.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Link
|
||||||
|
href='#'
|
||||||
|
className='text-primary text-base font-medium flex items-center gap-3 group hover:text-midnight_text dark:hover:text-white'>
|
||||||
|
Leave a message
|
||||||
|
<svg
|
||||||
|
width='23'
|
||||||
|
height='17'
|
||||||
|
viewBox='0 0 23 17'
|
||||||
|
fill='#2F73F2'
|
||||||
|
xmlns='http://www.w3.org/2000/svg'
|
||||||
|
className='group-hover:fill-midnight_text dark:group-hover:fill-white'>
|
||||||
|
<path d='M22.653 7.76352L15.3613 0.471852C15.1648 0.282104 14.9017 0.177109 14.6286 0.179483C14.3555 0.181856 14.0942 0.291407 13.9011 0.484541C13.7079 0.677674 13.5984 0.938937 13.596 1.21206C13.5936 1.48518 13.6986 1.74831 13.8884 1.94477L19.4019 7.45831H1.08317C0.806904 7.45831 0.541951 7.56806 0.346601 7.76341C0.151251 7.95876 0.0415039 8.22371 0.0415039 8.49998C0.0415039 8.77625 0.151251 9.0412 0.346601 9.23655C0.541951 9.4319 0.806904 9.54165 1.08317 9.54165H19.4019L13.8884 15.0552C13.7889 15.1513 13.7095 15.2662 13.6549 15.3933C13.6003 15.5204 13.5716 15.6571 13.5704 15.7954C13.5692 15.9337 13.5956 16.0709 13.6479 16.1989C13.7003 16.3269 13.7777 16.4432 13.8755 16.541C13.9733 16.6388 14.0896 16.7162 14.2176 16.7685C14.3456 16.8209 14.4828 16.8473 14.6211 16.8461C14.7594 16.8449 14.8961 16.8161 15.0232 16.7615C15.1503 16.707 15.2652 16.6276 15.3613 16.5281L22.653 9.23644C22.8482 9.0411 22.958 8.77619 22.958 8.49998C22.958 8.22377 22.8482 7.95886 22.653 7.76352Z' />
|
||||||
|
</svg>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex sm:flex-row flex-col items-start sm:gap-8 gap-4'>
|
||||||
|
<div className='bg-primary/20 w-3.75 h-3.75 flex sm:items-center items-start justify-center rounded-full'>
|
||||||
|
<i className="bg-[url('/images/contact-page/Career.svg')] bg-no-repeat bg-contain w-9 h-9 inline-block"></i>
|
||||||
|
</div>
|
||||||
|
<div className='flex md:flex-col sm:flex-row flex-col md:items-start sm:items-center items-start h-full justify-between'>
|
||||||
|
<div>
|
||||||
|
<span className='text-midnight_text dark:text-white text-xl font-bold'>
|
||||||
|
Careers
|
||||||
|
</span>
|
||||||
|
<p className='text-DeepOcean font-normal text-lg max-w-80 pt-3 pb-7 dark:text-white/50'>
|
||||||
|
Sit ac ipsum leo lorem magna nunc mattis maecenas non
|
||||||
|
vestibulum
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Link
|
||||||
|
href='#'
|
||||||
|
className='text-primary text-base font-medium flex items-center gap-3 group hover:text-midnight_text dark:hover:text-white'>
|
||||||
|
Send an application
|
||||||
|
<svg
|
||||||
|
width='23'
|
||||||
|
height='17'
|
||||||
|
viewBox='0 0 23 17'
|
||||||
|
fill='#2F73F2'
|
||||||
|
xmlns='http://www.w3.org/2000/svg'
|
||||||
|
className='group-hover:fill-midnight_text dark:group-hover:fill-white'>
|
||||||
|
<path d='M22.653 7.76352L15.3613 0.471852C15.1648 0.282104 14.9017 0.177109 14.6286 0.179483C14.3555 0.181856 14.0942 0.291407 13.9011 0.484541C13.7079 0.677674 13.5984 0.938937 13.596 1.21206C13.5936 1.48518 13.6986 1.74831 13.8884 1.94477L19.4019 7.45831H1.08317C0.806904 7.45831 0.541951 7.56806 0.346601 7.76341C0.151251 7.95876 0.0415039 8.22371 0.0415039 8.49998C0.0415039 8.77625 0.151251 9.0412 0.346601 9.23655C0.541951 9.4319 0.806904 9.54165 1.08317 9.54165H19.4019L13.8884 15.0552C13.7889 15.1513 13.7095 15.2662 13.6549 15.3933C13.6003 15.5204 13.5716 15.6571 13.5704 15.7954C13.5692 15.9337 13.5956 16.0709 13.6479 16.1989C13.7003 16.3269 13.7777 16.4432 13.8755 16.541C13.9733 16.6388 14.0896 16.7162 14.2176 16.7685C14.3456 16.8209 14.4828 16.8473 14.6211 16.8461C14.7594 16.8449 14.8961 16.8161 15.0232 16.7615C15.1503 16.707 15.2652 16.6276 15.3613 16.5281L22.653 9.23644C22.8482 9.0411 22.958 8.77619 22.958 8.49998C22.958 8.22377 22.8482 7.95886 22.653 7.76352Z' />
|
||||||
|
</svg>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='md:pt-32 pt-11 md:pb-28 pb-8'>
|
||||||
|
<iframe
|
||||||
|
src='https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d195173.65975543985!2d116.23134074687499!3d39.99929045!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x35f05296e7142cb9%3A0xb9625620af0fa98a!2sBeijing%2C%20China!5e0!3m2!1sen!2s!4v1703000000000!5m2!1sen!2s'
|
||||||
|
width='1114'
|
||||||
|
height='477'
|
||||||
|
loading='lazy'
|
||||||
|
referrerPolicy='no-referrer-when-downgrade'
|
||||||
|
className='rounded-lg w-full'></iframe>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='border-b border-solid border-border dark:border-dark_border'></div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ContactInfo
|
||||||
124
src/components/Contact/Form/index.tsx
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import Image from 'next/image'
|
||||||
|
import { getImgPath } from '@/utils/image'
|
||||||
|
|
||||||
|
const ContactForm = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className='dark:bg-darkmode md:pb-24 pb-16'>
|
||||||
|
<div className='container mx-auto max-w-6xl px-4'>
|
||||||
|
<div className='grid md:grid-cols-12 grid-cols-1 gap-8'>
|
||||||
|
<div className='col-span-6'>
|
||||||
|
<h2 className='max-w-72 text-[40px] leading-tight font-bold mb-9 text-midnight_text dark:text-white'>
|
||||||
|
Get Online Consultation
|
||||||
|
</h2>
|
||||||
|
<form className='flex flex-wrap w-full m-auto justify-between'>
|
||||||
|
<div className='sm:flex gap-3 w-full'>
|
||||||
|
<div className='mx-0 my-2.5 flex-1'>
|
||||||
|
<label
|
||||||
|
htmlFor='first-name'
|
||||||
|
className='pb-3 inline-block text-base'>
|
||||||
|
First Name*
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
className='w-full text-base px-4 rounded-lg py-2.5 border-border dark:border-dark_border border-solid dark:text-white dark:bg-darkmode border transition-all duration-500 focus:border-primary dark:focus:border-primary focus:border-solid focus:outline-0'
|
||||||
|
type='text'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className='mx-0 my-2.5 flex-1'>
|
||||||
|
<label
|
||||||
|
htmlFor='last-name'
|
||||||
|
className='pb-3 inline-block text-base'>
|
||||||
|
Last Name*
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
className='w-full text-base px-4 py-2.5 rounded-lg border-border dark:border-dark_border border-solid dark:text-white dark:bg-darkmode border transition-all duration-500 focus:border-primary dark:focus:border-primary focus:border-solid focus:outline-0'
|
||||||
|
type='text'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='sm:flex gap-3 w-full'>
|
||||||
|
<div className='mx-0 my-2.5 flex-1'>
|
||||||
|
<label
|
||||||
|
htmlFor='email'
|
||||||
|
className='pb-3 inline-block text-base'>
|
||||||
|
Email address*
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type='email'
|
||||||
|
className='w-full text-base px-4 py-2.5 rounded-lg border-border dark:border-dark_border border-solid dark:text-white dark:bg-darkmode border transition-all duration-500 focus:border-primary dark:focus:border-primary focus:border-solid focus:outline-0'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className='mx-0 my-2.5 flex-1'>
|
||||||
|
<label
|
||||||
|
htmlFor='Specialist'
|
||||||
|
className='pb-3 inline-block text-base'>
|
||||||
|
Specialist*
|
||||||
|
</label>
|
||||||
|
<select className='w-full text-base px-4 py-2.5 rounded-lg border-border dark:text-white border-solid dark:bg-darkmode border transition-all duration-500 focus:border-primary dark:focus:border-primary dark:border-dark_border focus:border-solid focus:outline-0'>
|
||||||
|
<option value=''>Choose a specialist</option>
|
||||||
|
<option value='Baking & Pastry'>
|
||||||
|
Choose a specialist
|
||||||
|
</option>
|
||||||
|
<option value='Exotic Cuisine'>Exotic Cuisine</option>
|
||||||
|
<option value='French Desserts'>French Desserts</option>
|
||||||
|
<option value='Seafood & Wine'>
|
||||||
|
Choose a specialist
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='sm:flex gap-3 w-full'>
|
||||||
|
<div className='mx-0 my-2.5 flex-1'>
|
||||||
|
<label
|
||||||
|
htmlFor='date'
|
||||||
|
className='pb-3 inline-block text-base'>
|
||||||
|
Date*
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
className='w-full text-base px-4 rounded-lg py-2.5 outline-hidden dark:text-white dark:bg-darkmode border-border border-solid border transition-all duration-500 focus:border-primary dark:focus:border-primary dark:border-dark_border focus:border-solid focus:outline-0'
|
||||||
|
type='date'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className='mx-0 my-2.5 flex-1'>
|
||||||
|
<label
|
||||||
|
htmlFor='time'
|
||||||
|
className='pb-3 inline-block text-base'>
|
||||||
|
Time*
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
className='w-full text-base px-4 rounded-lg py-2.5 border-border outline-hidden dark:text-white dark:bg-darkmode border-solid border transition-all duration-500 focus:border-primary dark:focus:border-primary dark:border-dark_border focus:border-solid focus:outline-0'
|
||||||
|
type='time'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='mx-0 my-2.5 w-full'>
|
||||||
|
<Link
|
||||||
|
href='#'
|
||||||
|
className='bg-primary rounded-lg text-white py-4 px-8 mt-4 inline-block hover:bg-blue-700'
|
||||||
|
type='submit'>
|
||||||
|
Make an appointment
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div className='col-span-6'>
|
||||||
|
<Image
|
||||||
|
src={getImgPath('/images/contact-page/contact.jpg')}
|
||||||
|
alt='Contact'
|
||||||
|
width={1300}
|
||||||
|
height={0}
|
||||||
|
quality={100}
|
||||||
|
style={{ width: '100%', height: 'auto' }}
|
||||||
|
className='bg-no-repeat bg-contain'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ContactForm
|
||||||