This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / web / src / lib / components / repo / RepoCard.svelte
2.3 kB 75 lines
1<script lang="ts"> 2 import { resolve } from '$app/paths'; 3 import BookMarked from '$icon/book-marked'; 4 import Star from '$icon/star'; 5 import GitFork from '$icon/git-fork'; 6 import CircleDot from '$icon/circle-dot'; 7 import GitPullRequest from '$icon/git-pull-request'; 8 import StarButton from './StarButton.svelte'; 9 import type { RepoCardData } from '$lib/components/profile/types'; 10 let { 11 repo, 12 starButton = true, 13 showOwner = true 14 }: { repo: RepoCardData; starButton?: boolean; showOwner?: boolean } = $props(); 15 16 const stats = $derived( 17 [ 18 { value: repo.stars, Icon: Star }, 19 { value: repo.forks, Icon: GitFork }, 20 { value: repo.issues, Icon: CircleDot }, 21 { value: repo.pulls, Icon: GitPullRequest } 22 ].filter((s) => s.value !== undefined) 23 ); 24</script> 25 26<div 27 class="flex min-h-32 flex-col gap-1 rounded border border-border bg-surface px-6 py-4 shadow-sm" 28> 29 <div class="flex items-start justify-between font-medium text-fg-strong"> 30 <div class="mr-2 flex min-w-0 flex-1 items-center mt-1"> 31 <BookMarked class="mr-1.5 size-4 shrink-0 text-fg-subtle" aria-hidden="true" /> 32 <a 33 href={resolve(`/${repo.ownerHandle}/${repo.name}` as '/')} 34 class="min-w-0 truncate text-fg-strong no-underline hover:underline" 35 > 36 {showOwner ? `${repo.ownerHandle}/${repo.name}` : repo.name} 37 </a> 38 </div> 39 {#if starButton} 40 <div class="ml-4 shrink-0"> 41 <StarButton 42 repoDid={repo.repoDid} 43 repoOwnerHandle={repo.ownerHandle} 44 repoName={repo.name} 45 initialCount={repo.stars} 46 initialRkey={repo.viewerStarRkey} 47 /> 48 </div> 49 {/if} 50 </div> 51 52 {#if repo.description} 53 <p class="line-clamp-2 text-sm text-fg-muted">{repo.description}</p> 54 {/if} 55 56 {#if repo.language !== undefined || stats.length > 0} 57 <div class="mt-auto flex flex-wrap items-center gap-4 pt-2 font-mono text-xs text-fg-subtle"> 58 {#if repo.language} 59 <span class="flex items-center gap-2"> 60 <span 61 class="inline-block size-2.5 shrink-0 rounded-full" 62 style="background-color: var(--color-primary);" 63 ></span> 64 <span>{repo.language}</span> 65 </span> 66 {/if} 67 {#each stats as stat (stat.Icon)} 68 <span class="flex items-center gap-1"> 69 <stat.Icon class="size-3.5 shrink-0" aria-hidden="true" /> 70 <span>{stat.value}</span> 71 </span> 72 {/each} 73 </div> 74 {/if} 75</div>