-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProjectCard.astro
More file actions
82 lines (76 loc) · 3.41 KB
/
ProjectCard.astro
File metadata and controls
82 lines (76 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
---
import { Image } from 'astro:assets';
import type { ImageMetadata } from 'astro';
import TechStackBadges from './TechStackBadges.astro';
import { formatCount } from '../lib/projects';
interface Props {
title: string;
slug: string;
description: string;
techStack: string[];
repoUrl: string;
image?: ImageMetadata;
stars?: number;
downloads?: number;
category?: string;
}
const { title, slug, description, techStack, repoUrl, image, stars, downloads, category } = Astro.props;
---
<article class="project-card bg-background-2 rounded-lg overflow-hidden hover:bg-background-3 transition-colors relative flex flex-col" data-category={category}>
{image && (
<a href={`/projects/${slug}/`} class="block aspect-video overflow-hidden">
<Image
src={image}
alt={title}
width={1920}
height={1080}
quality={80}
format="webp"
class="w-full h-full object-cover hover:scale-105 transition-transform duration-300"
loading="lazy"
/>
</a>
)}
<div class="p-6 flex flex-col flex-1">
<h2 class="text-xl font-heading mb-2">
<a href={`/projects/${slug}/`} class="text-text hover:text-primary no-underline">
{title}
</a>
</h2>
<p class="text-text-muted text-sm mb-4 line-clamp-3 flex-1">{description}</p>
<div class="mb-4">
<TechStackBadges techStack={techStack} limit={4} />
</div>
<div class="flex items-center justify-between mt-auto pt-4 border-t border-border">
<div class="flex items-center gap-4 text-text-muted text-sm">
{stars !== undefined && (
<span class="flex items-center gap-1" title="GitHub Stars">
<svg class="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/>
</svg>
{formatCount(stars)}
</span>
)}
{downloads !== undefined && (
<span class="flex items-center gap-1" title="Downloads">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"/>
</svg>
{formatCount(downloads)}
</span>
)}
</div>
<a
href={repoUrl}
target="_blank"
rel="noopener noreferrer"
class="text-text-muted hover:text-primary"
aria-label="View on GitHub"
>
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"/>
</svg>
</a>
</div>
</div>
</article>