This repository has no description
1<script lang="ts">
2 import GitBranch from "$icon/git-branch";
3 import Logs from "$icon/logs";
4 import Tags from "$icon/tags";
5 import TriangleAlert from "$icon/triangle-alert";
6 import BranchList from "./BranchList.svelte";
7 import CommitList from "./CommitList.svelte";
8 import EmptyRepo from "./EmptyRepo.svelte";
9 import FileTree from "./FileTree.svelte";
10 import LanguageBar from "./LanguageBar.svelte";
11 import PanelHeader from "./PanelHeader.svelte";
12 import Readme from "./Readme.svelte";
13 import RepoToolbar from "./RepoToolbar.svelte";
14 import TagList from "./TagList.svelte";
15 import type { loadRepoIndex } from "$lib/api/repoIndex";
16 import type { RepoInfo } from "./types";
17
18 interface Props {
19 repo: RepoInfo;
20 data: Awaited<ReturnType<typeof loadRepoIndex>>;
21 bobbinUrl: string;
22 }
23
24 let { repo, data, bobbinUrl }: Props = $props();
25
26 const base = $derived(`/${repo.ownerHandle}/${repo.name}`);
27 const encodedRef = $derived(encodeURIComponent(data.ref));
28 const refsCapped = $derived(data.refs.capped);
29</script>
30
31<section
32 class="relative mx-auto w-full rounded bg-background-default px-6 py-4 text-foreground-default"
33>
34 {#if data.needsUpgrade}
35 <div class="flex h-96 items-center justify-center text-center text-foreground-danger">
36 <div>
37 <span class="flex items-center justify-center gap-2">
38 <TriangleAlert class="size-5 shrink-0" aria-hidden="true" />
39 The knot hosting this repository needs an upgrade.
40 </span>
41 <p class="mt-2">
42 This repository is currently unavailable.
43 <a
44 href="https://docs.tangled.org/migrating-knots-and-spindles.html"
45 rel="external noopener noreferrer"
46 class="underline">Read the upgrade guide</a
47 >
48 </p>
49 </div>
50 </div>
51 {:else if data.knotUnreachable}
52 <div class="flex h-96 items-center justify-center text-center text-foreground-danger">
53 <span class="flex items-center gap-2">
54 <TriangleAlert class="size-5 shrink-0" aria-hidden="true" />
55 The knot hosting this repository is unreachable.
56 </span>
57 </div>
58 {:else if data.isEmpty}
59 <EmptyRepo {repo} />
60 {:else}
61 {#if data.languages.length > 0}
62 <LanguageBar languages={data.languages} />
63 {/if}
64
65 <RepoToolbar
66 {repo}
67 ref={data.ref}
68 refs={data.refs}
69 totalCommits={data.totalCommits}
70 totalBranches={data.totalBranches}
71 totalTags={data.totalTags}
72 {bobbinUrl}
73 />
74
75 <div class="grid grid-cols-1 gap-2 md:grid-cols-2">
76 <div class="min-w-0 md:border-r md:border-border-default md:pr-2">
77 <FileTree
78 ownerHandle={repo.ownerHandle}
79 repoName={repo.name}
80 ref={data.ref}
81 entries={data.files}
82 />
83 </div>
84
85 <div class="hidden md:block">
86 {#if data.commits.length > 0}
87 <div class="px-2 pb-4">
88 <PanelHeader
89 title="Commits"
90 icon={Logs}
91 href={`${base}/commits/${encodedRef}`}
92 count={data.totalCommits}
93 />
94 <CommitList
95 ownerHandle={repo.ownerHandle}
96 repoName={repo.name}
97 commits={data.commits}
98 tagsByCommit={data.tagsByCommit}
99 />
100 </div>
101 {/if}
102
103 {#if data.branches.length > 0}
104 <div class="border-t border-border-default px-2 py-4">
105 <PanelHeader
106 title="Branches"
107 icon={GitBranch}
108 href={`${base}/branches`}
109 count={data.totalBranches}
110 approximate={refsCapped}
111 />
112 <BranchList
113 ownerHandle={repo.ownerHandle}
114 repoName={repo.name}
115 currentRef={data.ref}
116 branches={data.branches}
117 />
118 </div>
119 {/if}
120
121 {#if data.tags.length > 0}
122 <div class="border-t border-border-default px-2 py-4">
123 <PanelHeader
124 title="Tags"
125 icon={Tags}
126 href={`${base}/tags`}
127 count={data.totalTags}
128 approximate={refsCapped}
129 />
130 <TagList ownerHandle={repo.ownerHandle} repoName={repo.name} tags={data.tags} />
131 </div>
132 {/if}
133 </div>
134 </div>
135 {/if}
136</section>
137
138{#if data.readme}
139 <Readme filename={data.readme.filename} contents={data.readme.contents} html={data.readmeHtml} />
140{/if}