feat: Hero Section
This commit is contained in:
parent
765cc0c7cf
commit
26fb506ba7
13 changed files with 2687 additions and 2684 deletions
|
|
@ -1,9 +1,16 @@
|
||||||
import "styles/tailwind.css"
|
import "styles/tailwind.css"
|
||||||
|
import "styles/custom.css"
|
||||||
|
import Navbar from "components/Navbar/Navbar"
|
||||||
|
|
||||||
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
||||||
return (
|
return (
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<body>{children}</body>
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<Navbar logoSrc="/images/image-removebg-preview (1).png" />
|
||||||
|
|
||||||
|
{children}</body>
|
||||||
</html>
|
</html>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
74
app/page.tsx
74
app/page.tsx
|
|
@ -1,65 +1,51 @@
|
||||||
import { Metadata } from "next"
|
import { Metadata } from "next"
|
||||||
import { Button } from "components/Button/Button"
|
import { Button } from "components/Button/Button"
|
||||||
|
import { InfiniteSlider } from "components/Slider/Slider";
|
||||||
|
import Navbar from "components/Navbar/Navbar"
|
||||||
import { LP_GRID_ITEMS } from "lp-items"
|
import { LP_GRID_ITEMS } from "lp-items"
|
||||||
|
import { FaArrowRight } from "react-icons/fa";
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: "Next.js Enterprise Boilerplate",
|
|
||||||
twitter: {
|
|
||||||
card: "summary_large_image",
|
|
||||||
},
|
|
||||||
openGraph: {
|
|
||||||
url: "https://next-enterprise.vercel.app/",
|
|
||||||
images: [
|
|
||||||
{
|
|
||||||
width: 1200,
|
|
||||||
height: 630,
|
|
||||||
url: "https://raw.githubusercontent.com/Blazity/next-enterprise/main/.github/assets/project-logo.png",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Web() {
|
export default function Web() {
|
||||||
return (
|
return (
|
||||||
<>
|
<section className="bg-[#0f172a] pl-[15%] pr-[15%] h-[100vh] " >
|
||||||
<section className="bg-white dark:bg-gray-900">
|
<div className=" rounded-[3rem] h-[60%] pt-[10%]" style={{
|
||||||
|
backgroundImage: `url('/images/glow-bottom.svg')`,
|
||||||
|
backgroundSize: 'cover',
|
||||||
|
backgroundPosition: 'center',
|
||||||
|
backgroundRepeat: 'no-repeat'
|
||||||
|
}}>
|
||||||
<div className="mx-auto grid max-w-screen-xl px-4 py-8 text-center lg:py-16">
|
<div className="mx-auto grid max-w-screen-xl px-4 py-8 text-center lg:py-16">
|
||||||
<div className="mx-auto place-self-center">
|
<div className="mx-auto place-self-center">
|
||||||
<h1 className="mb-4 max-w-2xl text-4xl font-extrabold leading-none tracking-tight dark:text-white md:text-5xl xl:text-6xl">
|
<h1 className="mb-4 max-w-2xl text-4xl font-extrabold leading-none tracking-tight text-white md:text-5xl xl:text-6xl">
|
||||||
Next.js Enterprise Boilerplate
|
Experience the next dimension
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mb-6 max-w-2xl font-light text-gray-500 dark:text-gray-400 md:text-lg lg:mb-8 lg:text-xl">
|
<p className="mb-6 max-w-2xl font-light text-slate-100 text-gray-200 md:text-lg lg:mb-8 lg:text-xl">
|
||||||
Jumpstart your enterprise project with our feature-packed, high-performance Next.js boilerplate!
|
Let us transform your vision into reality with cutting-edge VR/AR experiences and custom software solutions powered by AI.
|
||||||
Experience rapid UI development, AI-powered code reviews, and an extensive suite of tools for a smooth and
|
|
||||||
enjoyable development process.
|
|
||||||
</p>
|
</p>
|
||||||
<Button href="https://github.com/Blazity/next-enterprise" className="mr-3">
|
<Button href="https://github.com/Blazity/next-enterprise" className="mr-3" intent="hero1" size="hero1">
|
||||||
Get started
|
Get started
|
||||||
|
<div className="ml-2">
|
||||||
|
<FaArrowRight />
|
||||||
|
</div>
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
href="https://vercel.com/new/git/external?repository-url=https://github.com/Blazity/next-enterprise"
|
href="https://vercel.com/new/git/external?repository-url=https://github.com/Blazity/next-enterprise"
|
||||||
intent="secondary"
|
intent="secondary" size="hero1"
|
||||||
>
|
>
|
||||||
Deploy Now
|
Deploy Now
|
||||||
|
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
<section className="bg-white dark:bg-gray-900">
|
<div className="pt-20">
|
||||||
<div className="mx-auto max-w-screen-xl px-4 py-8 sm:py-16 lg:px-6">
|
<InfiniteSlider/>
|
||||||
<div className="justify-center space-y-8 md:grid md:grid-cols-2 md:gap-12 md:space-y-0 lg:grid-cols-3">
|
</div>
|
||||||
{LP_GRID_ITEMS.map((singleItem) => (
|
</section>
|
||||||
<div key={singleItem.title} className="flex flex-col items-center justify-center text-center">
|
|
||||||
<div className="mb-4 flex h-10 w-10 items-center justify-center rounded-full bg-primary-100 p-1.5 text-blue-700 dark:bg-primary-900 lg:h-12 lg:w-12">
|
|
||||||
{singleItem.icon}
|
|
||||||
</div>
|
|
||||||
<h3 className="mb-2 text-xl font-bold dark:text-white">{singleItem.title}</h3>
|
|
||||||
<p className="text-gray-500 dark:text-gray-400">{singleItem.description}</p>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,11 @@ const meta: Meta<typeof Button> = {
|
||||||
},
|
},
|
||||||
argTypes: {
|
argTypes: {
|
||||||
intent: {
|
intent: {
|
||||||
options: ["primary", "secondary"],
|
options: ["primary", "secondary", "hero1"],
|
||||||
control: { type: "select" },
|
control: { type: "select" },
|
||||||
},
|
},
|
||||||
size: {
|
size: {
|
||||||
options: ["sm", "lg"],
|
options: ["sm", "lg", "hero1"],
|
||||||
control: { type: "select" },
|
control: { type: "select" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,6 @@ const button = cva(
|
||||||
"items-center",
|
"items-center",
|
||||||
"rounded-xl",
|
"rounded-xl",
|
||||||
"text-center",
|
"text-center",
|
||||||
"border",
|
|
||||||
"border-blue-400",
|
|
||||||
"transition-colors",
|
"transition-colors",
|
||||||
"delay-50",
|
"delay-50",
|
||||||
],
|
],
|
||||||
|
|
@ -18,11 +16,13 @@ const button = cva(
|
||||||
variants: {
|
variants: {
|
||||||
intent: {
|
intent: {
|
||||||
primary: ["bg-blue-400", "text-white", "hover:enabled:bg-blue-700"],
|
primary: ["bg-blue-400", "text-white", "hover:enabled:bg-blue-700"],
|
||||||
secondary: ["bg-transparent", "text-blue-400", "hover:enabled:bg-blue-400", "hover:enabled:text-white"],
|
secondary: ["bg-transparent", "text-white", "hover:bg-slate-100", "rounded-3xl", "hover:text-vizoleG2", "border-solid", "border-2", "border-slate-100"],
|
||||||
|
hero1:["text-white", "bg-gradient-to-br", "from-vizoleG1", "via-vizole-G2", "to-vizoleG3", "hover:bg-gradient-to-bl", "focus:ring-4", "focus:outline-none", "focus:ring-green-200", "dark:focus:ring-green-800", "font-medium", "rounded-3xl", "text-sm", "text-center", "me-2", "mb-2"]
|
||||||
},
|
},
|
||||||
size: {
|
size: {
|
||||||
sm: ["min-w-20", "h-full", "min-h-10", "text-sm", "py-1.5", "px-4"],
|
sm: ["min-w-20", "h-full", "min-h-10", "text-sm", "py-1.5", "px-4"],
|
||||||
lg: ["min-w-32", "h-full", "min-h-12", "text-lg", "py-2.5", "px-6"],
|
lg: ["min-w-32", "h-full", "min-h-12", "text-lg", "py-2.5", "px-6"],
|
||||||
|
hero1:["min-w-15", "h-full", "min-h-5" , "text-sm","px-5", "py-2"]
|
||||||
},
|
},
|
||||||
underline: { true: ["underline"], false: [] },
|
underline: { true: ["underline"], false: [] },
|
||||||
},
|
},
|
||||||
|
|
|
||||||
50
components/Navbar/Navbar.tsx
Normal file
50
components/Navbar/Navbar.tsx
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
interface NavbarProps {
|
||||||
|
logoSrc: string; // Path to your logo image
|
||||||
|
}
|
||||||
|
|
||||||
|
const Navbar: React.FC<NavbarProps> = ({ logoSrc }) => {
|
||||||
|
return (
|
||||||
|
<nav className="fixed top-0 left-0 w-full h-20 bg-transparent flex items-center justify-between px-4 z-50">
|
||||||
|
<a href="/">
|
||||||
|
<img src={logoSrc} alt="Your Logo" className="h-20" />
|
||||||
|
</a>
|
||||||
|
<ul className="hidden md:flex space-x-4 text-lg font-medium">
|
||||||
|
<li>
|
||||||
|
<a href="/" className="hover:text-gray-700">
|
||||||
|
Home
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/services" className="hover:text-gray-700">
|
||||||
|
Services
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/portfolio" className="hover:text-gray-700">
|
||||||
|
Portfolio
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/about-us" className="hover:text-gray-700">
|
||||||
|
About Us
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/contact-us" className="hover:text-gray-700">
|
||||||
|
Contact Us
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div className="flex md:hidden items-center">
|
||||||
|
<button className="px-4 py-2 text-white bg-blue-500 hover:bg-blue-700 rounded-md">
|
||||||
|
Sign In
|
||||||
|
</button>
|
||||||
|
<button className="px-4 py-2 ml-2 text-white bg-green-500 hover:bg-green-700 rounded-md">
|
||||||
|
Sign Up
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Navbar;
|
||||||
50
components/Slider/Slider.tsx
Normal file
50
components/Slider/Slider.tsx
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
import {
|
||||||
|
FigmaLogoIcon,
|
||||||
|
FramerLogoIcon,
|
||||||
|
SketchLogoIcon,
|
||||||
|
TwitterLogoIcon,
|
||||||
|
GitHubLogoIcon,
|
||||||
|
VercelLogoIcon,
|
||||||
|
NotionLogoIcon,
|
||||||
|
DiscordLogoIcon,
|
||||||
|
InstagramLogoIcon,
|
||||||
|
LinkedInLogoIcon,
|
||||||
|
} from "@radix-ui/react-icons";
|
||||||
|
|
||||||
|
const LOGOS = [
|
||||||
|
<FigmaLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<FramerLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<SketchLogoIcon width={50} height={50} className=" text-white" />,
|
||||||
|
<TwitterLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<GitHubLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<VercelLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<NotionLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<DiscordLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<InstagramLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
<LinkedInLogoIcon width={50} height={50} className="text-white" />,
|
||||||
|
];
|
||||||
|
|
||||||
|
export const InfiniteSlider = () => {
|
||||||
|
return (
|
||||||
|
<div className="relative m-auto w-full overflow-hidden bg-transparent before:absolute before:left-0 before:top-0 before:z-[2] before:h-full before:w-[100px] before:bg-[linear-gradient(to_right,homeBg_0%,rgba(255,255,255,0)_100%)] before:content-[''] after:absolute after:right-0 after:top-0 after:z-[2] after:h-full after:w-[100px] after:-scale-x-100 after:bg-[linear-gradient(to_right,homeBg_0%,rgba(0,0,0,120)_100%)] after:content-['']">
|
||||||
|
<div className="animate-infinite-slider flex w-[calc(250px*10)]">
|
||||||
|
{LOGOS.map((logo, index) => (
|
||||||
|
<div
|
||||||
|
className="slide flex w-[125px] items-center justify-center"
|
||||||
|
key={index}
|
||||||
|
>
|
||||||
|
{logo}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
{LOGOS.map((logo, index) => (
|
||||||
|
<div
|
||||||
|
className="slide flex w-[125px] items-center justify-center"
|
||||||
|
key={index}
|
||||||
|
>
|
||||||
|
{logo}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
"@radix-ui/react-dialog": "^1.0.5",
|
"@radix-ui/react-dialog": "^1.0.5",
|
||||||
"@radix-ui/react-dropdown-menu": "^2.0.6",
|
"@radix-ui/react-dropdown-menu": "^2.0.6",
|
||||||
"@radix-ui/react-form": "^0.0.3",
|
"@radix-ui/react-form": "^0.0.3",
|
||||||
|
"@radix-ui/react-icons": "^1.3.0",
|
||||||
"@radix-ui/react-label": "^2.0.2",
|
"@radix-ui/react-label": "^2.0.2",
|
||||||
"@radix-ui/react-popover": "^1.0.7",
|
"@radix-ui/react-popover": "^1.0.7",
|
||||||
"@radix-ui/react-radio-group": "^1.1.3",
|
"@radix-ui/react-radio-group": "^1.1.3",
|
||||||
|
|
@ -53,7 +54,10 @@
|
||||||
"next-compose-plugins": "^2.2.1",
|
"next-compose-plugins": "^2.2.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
|
"react-icons": "^5.0.1",
|
||||||
|
"react-tsparticles": "^2.12.2",
|
||||||
"tailwind-merge": "^2.0.0",
|
"tailwind-merge": "^2.0.0",
|
||||||
|
"tsparticles": "^3.3.0",
|
||||||
"zod": "^3.22.4"
|
"zod": "^3.22.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
||||||
1
public/images/glow-bottom.svg
Normal file
1
public/images/glow-bottom.svg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="2146" height="744"><defs><linearGradient id="d" x1="43.176%" x2="50%" y1="12.436%" y2="97.744%"><stop offset="0%" stop-color="#A855F7"/><stop offset="100%" stop-color="#6366F1"/></linearGradient><linearGradient id="f" x1="19.609%" x2="50%" y1="14.544%" y2="100%"><stop offset="0%" stop-color="#6366F1"/><stop offset="100%" stop-color="#6366F1" stop-opacity="0"/></linearGradient><filter id="e" width="145.2%" height="187%" x="-22.6%" y="-43.5%" filterUnits="objectBoundingBox"><feGaussianBlur in="SourceGraphic" stdDeviation="50"/></filter><filter id="g" width="165.1%" height="170.3%" x="-32.5%" y="-35.1%" filterUnits="objectBoundingBox"><feGaussianBlur in="SourceGraphic" stdDeviation="50"/></filter><radialGradient id="c" cx="50%" cy="100%" r="77.678%" fx="50%" fy="100%" gradientTransform="matrix(0 -1 .37746 0 .123 1.5)"><stop offset="0%" stop-color="#E9D5FF"/><stop offset="22.35%" stop-color="#A855F7"/><stop offset="100%" stop-color="#0F172A" stop-opacity="0"/></radialGradient><path id="a" d="M0 0h2440v921H0z"/></defs><g fill="none" fill-rule="evenodd" transform="translate(-140 -177)"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g mask="url(#b)"><path fill="url(#c)" d="M0 0h2440v921H0z"/><path fill="url(#d)" fill-rule="nonzero" d="M1975.72 781.763c-3.682-3-8.757-3.61-13.042-1.568a12.323 12.323 0 0 0-7.014 11.129v98.57h-430.368c-6.79 0-12.296 5.516-12.296 12.321v98.57c0 6.805 5.505 12.321 12.296 12.321h430.368v98.57a12.323 12.323 0 0 0 7.014 11.129 12.276 12.276 0 0 0 13.042-1.568l196.74-160.176a12.33 12.33 0 0 0 4.54-9.561 12.33 12.33 0 0 0-4.54-9.561l-196.74-160.176Z" filter="url(#e)"/><path fill="url(#f)" d="m913 274 461 369-284 58z" filter="url(#g)"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/images/image-removebg-preview (1).png
Normal file
BIN
public/images/image-removebg-preview (1).png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
1
public/images/nextlogo.svg
Normal file
1
public/images/nextlogo.svg
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
4
styles/custom.css
Normal file
4
styles/custom.css
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
.bg-illustration {
|
||||||
|
background-image: url('/images/glow-bottom.svg');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -29,6 +29,10 @@ module.exports = {
|
||||||
800: "#1e40af",
|
800: "#1e40af",
|
||||||
900: "#1e3a8a",
|
900: "#1e3a8a",
|
||||||
},
|
},
|
||||||
|
vizoleG1: "#F0B37D",
|
||||||
|
vizoleG2: "#F5887A",
|
||||||
|
vizoleG3: "#F5887A",
|
||||||
|
homeBg: "#0f172a"
|
||||||
},
|
},
|
||||||
fontFamily: {
|
fontFamily: {
|
||||||
body: [
|
body: [
|
||||||
|
|
@ -81,6 +85,17 @@ module.exports = {
|
||||||
minWidth: {
|
minWidth: {
|
||||||
...defaultTheme.width,
|
...defaultTheme.width,
|
||||||
},
|
},
|
||||||
|
animation: {
|
||||||
|
["infinite-slider"]: "infiniteSlider 20s linear infinite",
|
||||||
|
},
|
||||||
|
keyframes: {
|
||||||
|
infiniteSlider: {
|
||||||
|
"0%": { transform: "translateX(0)" },
|
||||||
|
"100%": {
|
||||||
|
transform: "translateX(calc(-250px * 2))",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [],
|
plugins: [],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue