Monorepo for Tangled tangled.org
1

Configure Feed

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

core / web / src / lib / components / repo / RepoCard.svelte
2.4 kB 77 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-default bg-background-default px-6 py-4 shadow-sm" 28> 29 <div class="flex items-start justify-between font-medium text-foreground-default"> 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-foreground-subtle" aria-hidden="true" /> 32 <a 33 href={resolve(`/${repo.ownerHandle}/${repo.name}` as "/")} 34 class="min-w-0 truncate text-foreground-default 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-foreground-muted">{repo.description}</p> 54 {/if} 55 56 {#if repo.language !== undefined || stats.length > 0} 57 <div 58 class="mt-auto flex flex-wrap items-center gap-4 pt-2 font-mono text-xs text-foreground-subtle" 59 > 60 {#if repo.language} 61 <span class="flex items-center gap-2"> 62 <span 63 class="inline-block size-2.5 shrink-0 rounded-full" 64 style="background-color: var(--color-background-success-emphasis);" 65 ></span> 66 <span>{repo.language}</span> 67 </span> 68 {/if} 69 {#each stats as stat (stat.Icon)} 70 <span class="flex items-center gap-1"> 71 <stat.Icon class="size-3.5 shrink-0" aria-hidden="true" /> 72 <span>{stat.value}</span> 73 </span> 74 {/each} 75 </div> 76 {/if} 77</div>