first commit

This commit is contained in:
“dongming”
2025-12-19 12:19:14 +08:00
commit 400b1177c0
145 changed files with 5939 additions and 0 deletions

View 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;

View 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

View 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;

View 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/>
</>
);
};

View 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;

View 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;

View 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 }

View 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
View 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'
},
]

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

141
src/app/globals.css Normal file
View 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
View 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
View 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
View 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>
)
}