Updated portfolio
This commit is contained in:
@@ -0,0 +1,291 @@
|
||||
@keyframes move {
|
||||
100% {
|
||||
transform: translate3d(0, 0, 1px) rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.background {
|
||||
position: absolute;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: #000000;
|
||||
overflow: hidden;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.background span {
|
||||
width: 24vmin;
|
||||
height: 24vmin;
|
||||
border-radius: 24vmin;
|
||||
backface-visibility: hidden;
|
||||
position: absolute;
|
||||
animation: move;
|
||||
animation-duration: 6;
|
||||
animation-timing-function: linear;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
|
||||
.background span:nth-child(0) {
|
||||
color: #f5304c;
|
||||
top: 24%;
|
||||
left: 18%;
|
||||
animation-duration: 220s;
|
||||
animation-delay: -272s;
|
||||
transform-origin: -5vw -4vh;
|
||||
box-shadow: 48vmin 0 6.421535280295322vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(1) {
|
||||
color: #f5304c;
|
||||
top: 86%;
|
||||
left: 77%;
|
||||
animation-duration: 91s;
|
||||
animation-delay: -322s;
|
||||
transform-origin: 14vw 0vh;
|
||||
box-shadow: -48vmin 0 6.323515398437237vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(2) {
|
||||
color: #f5304c;
|
||||
top: 17%;
|
||||
left: 44%;
|
||||
animation-duration: 248s;
|
||||
animation-delay: -181s;
|
||||
transform-origin: 0vw -7vh;
|
||||
box-shadow: -48vmin 0 6.116084464270985vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(3) {
|
||||
color: #f5304c;
|
||||
top: 43%;
|
||||
left: 15%;
|
||||
animation-duration: 98s;
|
||||
animation-delay: -211s;
|
||||
transform-origin: -21vw 8vh;
|
||||
box-shadow: 48vmin 0 6.907246782805462vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(4) {
|
||||
color: #f5304c;
|
||||
top: 66%;
|
||||
left: 60%;
|
||||
animation-duration: 241s;
|
||||
animation-delay: -75s;
|
||||
transform-origin: 15vw -9vh;
|
||||
box-shadow: -48vmin 0 6.832728853871303vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(5) {
|
||||
color: #f5304c;
|
||||
top: 79%;
|
||||
left: 87%;
|
||||
animation-duration: 207s;
|
||||
animation-delay: -234s;
|
||||
transform-origin: -19vw 4vh;
|
||||
box-shadow: -48vmin 0 6.062609002101319vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(6) {
|
||||
color: #f5304c;
|
||||
top: 45%;
|
||||
left: 79%;
|
||||
animation-duration: 243s;
|
||||
animation-delay: -285s;
|
||||
transform-origin: 11vw 25vh;
|
||||
box-shadow: -48vmin 0 6.42616777258573vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(7) {
|
||||
color: #f5304c;
|
||||
top: 43%;
|
||||
left: 51%;
|
||||
animation-duration: 227s;
|
||||
animation-delay: -181s;
|
||||
transform-origin: -23vw 1vh;
|
||||
box-shadow: 48vmin 0 6.831515741167314vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(8) {
|
||||
color: #f5304c;
|
||||
top: 21%;
|
||||
left: 59%;
|
||||
animation-duration: 228s;
|
||||
animation-delay: -196s;
|
||||
transform-origin: -23vw 23vh;
|
||||
box-shadow: 48vmin 0 6.824335114512845vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(9) {
|
||||
color: #f5304c;
|
||||
top: 95%;
|
||||
left: 81%;
|
||||
animation-duration: 202s;
|
||||
animation-delay: -141s;
|
||||
transform-origin: 17vw 24vh;
|
||||
box-shadow: 48vmin 0 6.5732268320821685vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(10) {
|
||||
color: #f5304c;
|
||||
top: 23%;
|
||||
left: 90%;
|
||||
animation-duration: 43s;
|
||||
animation-delay: -406s;
|
||||
transform-origin: -7vw -12vh;
|
||||
box-shadow: 48vmin 0 6.1955583991481vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(11) {
|
||||
color: #f5304c;
|
||||
top: 6%;
|
||||
left: 94%;
|
||||
animation-duration: 422s;
|
||||
animation-delay: -38s;
|
||||
transform-origin: -5vw 16vh;
|
||||
box-shadow: 48vmin 0 6.212234588070589vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(12) {
|
||||
color: #f5304c;
|
||||
top: 76%;
|
||||
left: 22%;
|
||||
animation-duration: 258s;
|
||||
animation-delay: -58s;
|
||||
transform-origin: -23vw -6vh;
|
||||
box-shadow: 48vmin 0 6.165111619626152vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(13) {
|
||||
color: #f5304c;
|
||||
top: 20%;
|
||||
left: 80%;
|
||||
animation-duration: 363s;
|
||||
animation-delay: -411s;
|
||||
transform-origin: 22vw 25vh;
|
||||
box-shadow: -48vmin 0 6.179675889584371vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(14) {
|
||||
color: #f5304c;
|
||||
top: 88%;
|
||||
left: 36%;
|
||||
animation-duration: 12s;
|
||||
animation-delay: -69s;
|
||||
transform-origin: -11vw -4vh;
|
||||
box-shadow: -48vmin 0 6.07188338021629vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(15) {
|
||||
color: #f5304c;
|
||||
top: 97%;
|
||||
left: 11%;
|
||||
animation-duration: 351s;
|
||||
animation-delay: -130s;
|
||||
transform-origin: -16vw -18vh;
|
||||
box-shadow: 48vmin 0 6.558182158209241vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(16) {
|
||||
color: #f5304c;
|
||||
top: 60%;
|
||||
left: 99%;
|
||||
animation-duration: 193s;
|
||||
animation-delay: -67s;
|
||||
transform-origin: 10vw 25vh;
|
||||
box-shadow: 48vmin 0 6.570051729134467vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(17) {
|
||||
color: #f5304c;
|
||||
top: 12%;
|
||||
left: 8%;
|
||||
animation-duration: 166s;
|
||||
animation-delay: -69s;
|
||||
transform-origin: 7vw -1vh;
|
||||
box-shadow: -48vmin 0 6.742868690500271vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(18) {
|
||||
color: #f5304c;
|
||||
top: 44%;
|
||||
left: 38%;
|
||||
animation-duration: 96s;
|
||||
animation-delay: -279s;
|
||||
transform-origin: 11vw 1vh;
|
||||
box-shadow: -48vmin 0 6.261014277195781vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(19) {
|
||||
color: #f5304c;
|
||||
top: 96%;
|
||||
left: 77%;
|
||||
animation-duration: 122s;
|
||||
animation-delay: -355s;
|
||||
transform-origin: 6vw 3vh;
|
||||
box-shadow: -48vmin 0 6.438018625575824vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(20) {
|
||||
color: #f5304c;
|
||||
top: 2%;
|
||||
left: 81%;
|
||||
animation-duration: 331s;
|
||||
animation-delay: -355s;
|
||||
transform-origin: 11vw -18vh;
|
||||
box-shadow: -48vmin 0 6.555921470976377vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(21) {
|
||||
color: #f5304c;
|
||||
top: 42%;
|
||||
left: 9%;
|
||||
animation-duration: 439s;
|
||||
animation-delay: -233s;
|
||||
transform-origin: -20vw -24vh;
|
||||
box-shadow: -48vmin 0 6.570997236391078vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(22) {
|
||||
color: #f5304c;
|
||||
top: 69%;
|
||||
left: 23%;
|
||||
animation-duration: 400s;
|
||||
animation-delay: -390s;
|
||||
transform-origin: -18vw -21vh;
|
||||
box-shadow: 48vmin 0 6.279087258882428vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(23) {
|
||||
color: #f5304c;
|
||||
top: 33%;
|
||||
left: 95%;
|
||||
animation-duration: 18s;
|
||||
animation-delay: -98s;
|
||||
transform-origin: 22vw 8vh;
|
||||
box-shadow: -48vmin 0 6.088381708804739vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(24) {
|
||||
color: #f5304c;
|
||||
top: 39%;
|
||||
left: 69%;
|
||||
animation-duration: 337s;
|
||||
animation-delay: -83s;
|
||||
transform-origin: 15vw -5vh;
|
||||
box-shadow: -48vmin 0 6.515991392427649vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(25) {
|
||||
color: #f5304c;
|
||||
top: 57%;
|
||||
left: 17%;
|
||||
animation-duration: 126s;
|
||||
animation-delay: -93s;
|
||||
transform-origin: -7vw 9vh;
|
||||
box-shadow: 48vmin 0 6.431063119719202vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(26) {
|
||||
color: #f5304c;
|
||||
top: 91%;
|
||||
left: 76%;
|
||||
animation-duration: 131s;
|
||||
animation-delay: -256s;
|
||||
transform-origin: -4vw 23vh;
|
||||
box-shadow: 48vmin 0 6.370776053425152vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(27) {
|
||||
color: #f5304c;
|
||||
top: 44%;
|
||||
left: 65%;
|
||||
animation-duration: 160s;
|
||||
animation-delay: -235s;
|
||||
transform-origin: -23vw 12vh;
|
||||
box-shadow: 48vmin 0 6.34935032141241vmin currentColor;
|
||||
}
|
||||
.background span:nth-child(28) {
|
||||
color: #f5304c;
|
||||
top: 89%;
|
||||
left: 36%;
|
||||
animation-duration: 298s;
|
||||
animation-delay: -400s;
|
||||
transform-origin: -7vw 2vh;
|
||||
box-shadow: -48vmin 0 6.935061205772426vmin currentColor;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
import './Background.css';
|
||||
|
||||
const Background = () => {
|
||||
return (
|
||||
<div className="background blur-2xl">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Background;
|
||||
@@ -0,0 +1,26 @@
|
||||
const Navbar = () => {
|
||||
return (
|
||||
<nav className="p-4 flex items-center justify-center">
|
||||
<div className="max-w-7xl mx-auto flex items-center justify-between">
|
||||
<div
|
||||
className="space-x-4 text-white block font-bold"
|
||||
>
|
||||
<a href="/" className="hover:text-red transition-colors duration-300">
|
||||
Home
|
||||
</a>
|
||||
<a href="/contact" className="hover:text-red transition-colors duration-300">
|
||||
Contact
|
||||
</a>
|
||||
<a href="/services" className="hover:text-red transition-colors duration-300">
|
||||
Pricing
|
||||
</a>
|
||||
<a href="/blog" className="hover:text-red transition-colors duration-300">
|
||||
Blog
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
);
|
||||
};
|
||||
|
||||
export default Navbar;
|
||||
@@ -0,0 +1,135 @@
|
||||
type PinnedRepo = {
|
||||
author: string,
|
||||
name: string,
|
||||
description: string,
|
||||
language: string,
|
||||
stars: number,
|
||||
forks: number,
|
||||
href?: string,
|
||||
};
|
||||
|
||||
export function Repo({name, description: desc, language: lang, stars, forks, href}: PinnedRepo) {
|
||||
return (
|
||||
<div
|
||||
className={`
|
||||
group
|
||||
relative
|
||||
flex
|
||||
size-full
|
||||
overflow-hidden
|
||||
rounded-xl
|
||||
h-full border
|
||||
border-red
|
||||
hover:shadow-md
|
||||
transition-shadow
|
||||
duration-300
|
||||
bg-transparent
|
||||
backdrop-blur-xl
|
||||
`}
|
||||
>
|
||||
<div className="w-full">
|
||||
<div className="rounded-xl border text-card-foreground shadow h-full bg-transparent border-none flex flex-col">
|
||||
<div className="flex flex-col space-y-1.5 p-6 flex-grow">
|
||||
<h3 className="tracking-tight text-base sm:text-lg font-semibold text-red-400">
|
||||
<a
|
||||
href={href}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="hover:underline"
|
||||
style={{ cursor: 'pointer' }}
|
||||
>
|
||||
{name}
|
||||
</a>
|
||||
</h3>
|
||||
<p className="text-xs sm:text-sm text-gray-400 line-clamp-2 mt-1">
|
||||
{desc}
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-6 pt-0 mt-auto">
|
||||
<div className="flex flex-wrap justify-between items-center gap-2">
|
||||
<div className="flex items-center gap-2 sm:gap-4">
|
||||
<div className="flex items-center gap-1 text-xs sm:text-sm" data-state="closed">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
className="lucide lucide-star text-yellow-500 h-3 w-3 sm:h-4 sm:w-4"
|
||||
>
|
||||
<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" />
|
||||
</svg>
|
||||
<span className="text-gray-400">{stars}</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-1 text-xs sm:text-sm" data-state="closed">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
className="lucide lucide-git-fork text-gray-500 h-3 w-3 sm:h-4 sm:w-4"
|
||||
>
|
||||
<circle cx="12" cy="18" r="3" />
|
||||
<circle cx="6" cy="6" r="3" />
|
||||
<circle cx="18" cy="6" r="3" />
|
||||
<path d="M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9" />
|
||||
<path d="M12 12v3" />
|
||||
</svg>
|
||||
<span className="text-gray-400">{forks}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="inline-flex items-center rounded-md border px-2.5 py-0.5 font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 text-foreground text-xs bg-red-600/10 border-red-600" data-sentry-component="Badge" data-sentry-source-file="badge.tsx">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
strokeWidth="2"
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
className="lucide lucide-code-xml h-3 w-3 mr-1"
|
||||
>
|
||||
<path d="m18 16 4-4-4-4" />
|
||||
<path d="m6 8-4 4 4 4" />
|
||||
<path d="m14.5 4-5 16" />
|
||||
</svg>
|
||||
{lang}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default async function PinnedRepos() {
|
||||
const pinned: PinnedRepo[] = await (await fetch('https://pinned.berrysauce.dev/get/kleo-dev')).json();
|
||||
|
||||
return (
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 sm:gap-6 bg-transparent">
|
||||
{pinned.map((repo, i) => (
|
||||
<Repo
|
||||
key={i}
|
||||
author={repo.author}
|
||||
name={repo.name}
|
||||
description={repo.description}
|
||||
language={repo.language}
|
||||
stars={repo.stars}
|
||||
forks={repo.forks}
|
||||
href={`https://github.com/${repo.author}/${repo.name}`}/>
|
||||
))}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user