rin
Публичный Open-source lightweight git hosting.
repo.html · 218 строк · 10.9 KB
Raw
1 {{define "content"}}
2 <div class="container">
3 {{template "repo_header" .}}
4
5 {{if .IsEmpty}}
6 <div class="card">
7 <div class="card-header">
8 <span class="font-semibold flex items-center gap-2">{{icon "terminal" "size-4"}} {{t .Lang "repo.empty.title"}}</span>
9 <a href="/settings#tokens" class="btn btn-outline btn-sm">
10 {{icon "key" "size-3.5"}}
11 <span>{{t .Lang "settings.tokens"}}</span>
12 </a>
13 </div>
14 <div class="card-body flex flex-col gap-4">
15 <div>
16 <div class="flex items-center justify-between mb-1.5">
17 <span class="text-xs font-semibold">1. {{t .Lang "repo.empty.new_cmd"}}</span>
18 <button type="button" class="btn btn-ghost btn-sm" data-copy="{{.QuickStartNew}}">
19 {{icon "copy" "size-3.5"}}
20 <span>{{t .Lang "common.copy"}}</span>
21 </button>
22 </div>
23 <pre class="card p-3 font-mono text-xs" style="margin:0;background:hsl(var(--muted)/0.4);overflow-x:auto;"><code>{{.QuickStartNew}}</code></pre>
24 </div>
25
26 <div>
27 <div class="flex items-center justify-between mb-1.5">
28 <span class="text-xs font-semibold">2. {{t .Lang "repo.empty.push_cmd"}}</span>
29 <button type="button" class="btn btn-ghost btn-sm" data-copy="{{.QuickStartExisting}}">
30 {{icon "copy" "size-3.5"}}
31 <span>{{t .Lang "common.copy"}}</span>
32 </button>
33 </div>
34 <pre class="card p-3 font-mono text-xs" style="margin:0;background:hsl(var(--muted)/0.4);overflow-x:auto;"><code>{{.QuickStartExisting}}</code></pre>
35 </div>
36 </div>
37 </div>
38 {{else}}
39 <div class="repo-layout">
40 <div class="repo-main">
41 <!-- Controls Bar: Branch/Tag Switcher + Breadcrumb + File Filter -->
42 <div class="flex items-center justify-between flex-wrap gap-2 mb-3">
43 <div class="flex items-center gap-2 flex-wrap">
44 <div class="dropdown" data-dropdown>
45 <button type="button" class="btn btn-outline btn-sm font-mono" data-dropdown-trigger aria-haspopup="true" aria-expanded="false">
46 {{icon "git-branch" "size-3.5"}}
47 <span>{{.Ref}}</span>
48 {{icon "chevron-down" "size-3.5"}}
49 </button>
50 <div class="dropdown-menu" data-dropdown-menu role="menu" style="min-width:13rem;">
51 <div class="palette-group-title">{{t .Lang "repo.branches"}} ({{len .Branches}})</div>
52 {{range .Branches}}
53 <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/tree/{{.}}{{if $.SubPath}}/{{$.SubPath}}{{end}}" class="dropdown-item font-mono {{if eq . $.Ref}}active{{end}}" role="menuitem">
54 <span class="flex items-center gap-2">{{icon "git-branch" "size-3.5"}} {{.}}</span>
55 {{if eq . $.Ref}}{{icon "check" "size-3.5"}}{{end}}
56 </a>
57 {{end}}
58 {{if .Tags}}
59 <hr class="separator" style="margin:0.25rem 0;">
60 <div class="palette-group-title">{{t .Lang "repo.tags"}} ({{len .Tags}})</div>
61 {{range .Tags}}
62 <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/tree/{{.}}{{if $.SubPath}}/{{$.SubPath}}{{end}}" class="dropdown-item font-mono {{if eq . $.Ref}}active{{end}}" role="menuitem">
63 <span class="flex items-center gap-2">{{icon "tag" "size-3.5"}} {{.}}</span>
64 {{if eq . $.Ref}}{{icon "check" "size-3.5"}}{{end}}
65 </a>
66 {{end}}
67 {{end}}
68 </div>
69 </div>
70
71 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/branches" class="btn btn-ghost btn-sm font-mono" title="{{t .Lang "repo.tab.branches"}}">
72 {{icon "git-branch" "size-3.5"}}
73 <span class="text-xs">{{len .Branches}}</span>
74 </a>
75 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/commits/{{.Ref}}" class="btn btn-ghost btn-sm font-mono" title="{{t .Lang "repo.tab.commits"}}">
76 {{icon "history" "size-3.5"}}
77 <span class="text-xs">{{t .Lang "repo.tab.commits"}}</span>
78 </a>
79
80 {{if .Breadcrumbs}}
81 <nav class="breadcrumb font-mono text-xs" aria-label="Directory path">
82 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/tree/{{.Ref}}" class="text-muted">{{.Repo.Name}}</a>
83 {{range .Breadcrumbs}}
84 <span class="breadcrumb-sep">/</span>
85 {{if .IsLast}}
86 <span class="font-semibold">{{.Name}}</span>
87 {{else}}
88 <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/tree/{{$.Ref}}/{{.Path}}" class="text-muted">{{.Name}}</a>
89 {{end}}
90 {{end}}
91 </nav>
92 {{end}}
93 </div>
94
95 <div class="flex items-center" style="position:relative;">
96 <input type="text" class="input" style="height:1.75rem;width:13rem;padding-right:1.75rem;font-size:0.78rem;" placeholder="{{t .Lang "repo.find_file"}}" data-file-filter>
97 <kbd class="kbd" style="position:absolute;right:0.35rem;pointer-events:none;">t</kbd>
98 </div>
99 </div>
100
101 <!-- Unified Repository Card: Latest Commit Header + File List -->
102 <div class="card mb-4">
103 {{if .LatestCommit}}
104 <div class="card-header text-xs" style="padding:0.5rem 0.8rem;background:hsl(var(--muted)/0.3);">
105 <div class="flex items-center gap-2 min-w-0">
106 <span class="avatar" style="width:1.25rem;height:1.25rem;font-size:0.62rem;">{{avatarInitial .LatestCommit.AuthorName}}</span>
107 <span class="font-medium">{{.LatestCommit.AuthorName}}</span>
108 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/commit/{{.LatestCommit.Hash}}" class="text-muted truncate">{{.LatestCommit.Subject}}</a>
109 </div>
110 <div class="flex items-center gap-2 text-muted font-mono">
111 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/commit/{{.LatestCommit.Hash}}" class="badge badge-outline font-mono">{{.LatestCommit.ShortHash}}</a>
112 <span>{{timeAgo .LatestCommit.AuthoredAt .Lang}}</span>
113 </div>
114 </div>
115 {{end}}
116
117 <div class="dense-list">
118 {{if .SubPath}}
119 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/tree/{{.Ref}}{{if ne .ParentPath "."}}/{{.ParentPath}}{{end}}" class="dense-row font-mono text-xs text-muted">
120 <span class="flex items-center gap-2">{{icon "arrow-left" "size-3.5"}} ..</span>
121 </a>
122 {{end}}
123 {{range .Entries}}
124 <div class="dense-row" data-tree-row data-tree-name="{{.Name}}">
125 <div class="flex items-center gap-2 min-w-0" style="flex:1 1 40%;">
126 {{if eq .Type "tree"}}
127 {{icon "folder" "size-4"}}
128 <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/tree/{{$.Ref}}/{{.Path}}" class="font-medium truncate">{{.Name}}</a>
129 {{else}}
130 {{icon "file" "size-4"}}
131 <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/blob/{{$.Ref}}/{{.Path}}" class="truncate">{{.Name}}</a>
132 {{end}}
133 </div>
134 <div class="hidden md-flex text-xs text-muted truncate" style="flex:1 1 45%;">
135 {{if .CommitHash}}
136 <a href="/{{$.Repo.OwnerUsername}}/{{$.Repo.Name}}/commit/{{.CommitHash}}" class="truncate text-muted">{{.CommitMsg}}</a>
137 {{end}}
138 </div>
139 <div class="text-xs text-muted font-mono" style="text-align:right;min-width:5rem;">
140 {{if not .CommitTime.IsZero}}
141 {{timeAgo .CommitTime $.Lang}}
142 {{else if eq .Type "blob"}}
143 {{formatSize .Size}}
144 {{end}}
145 </div>
146 </div>
147 {{end}}
148 </div>
149 </div>
150
151 {{if .ReadmeHTML}}
152 <section class="card">
153 <div class="card-header" style="padding:0.55rem 0.85rem;">
154 <span class="font-semibold text-xs flex items-center gap-2 font-mono">
155 {{icon "book-open" "size-3.5"}}
156 <span>{{.ReadmeName}}</span>
157 </span>
158 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/blob/{{.Ref}}/{{.ReadmeName}}" class="text-xs text-muted">{{t .Lang "repo.view_file"}}</a>
159 </div>
160 <div class="card-body markdown-body">
161 {{.ReadmeHTML}}
162 </div>
163 </section>
164 {{end}}
165 </div>
166
167 <aside class="repo-side">
168 <div class="side-card">
169 <div class="side-card-header">{{icon "info" "size-3.5"}} {{t .Lang "repo.about"}}</div>
170 <div class="side-card-body">
171 {{if .Repo.Description}}
172 <p style="margin:0;">{{.Repo.Description}}</p>
173 {{end}}
174 {{if .Repo.ForkedFromRepoID}}
175 <div class="meta-row">
176 <span>{{t .Lang "fork.forked_from"}}</span>
177 <a href="/{{.Repo.ForkedFromOwner}}/{{.Repo.ForkedFromName}}" class="font-medium font-mono">{{.Repo.ForkedFromOwner}}/{{.Repo.ForkedFromName}}</a>
178 </div>
179 {{end}}
180 <div class="meta-row">
181 <span>{{t .Lang "repo.default_branch"}}</span>
182 <span class="badge badge-outline font-mono">{{.Repo.DefaultBranch}}</span>
183 </div>
184 <div class="meta-row">
185 <span>{{t .Lang "fork.forks"}}</span>
186 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/forks" class="font-mono">{{.Repo.ForkCount}}</a>
187 </div>
188 <div class="meta-row">
189 <span>{{t .Lang "repo.created"}}</span>
190 <span class="font-mono">{{formatDate .Repo.CreatedAt}}</span>
191 </div>
192 <div class="meta-row">
193 <span>{{t .Lang "repo.updated"}}</span>
194 <span class="font-mono">{{formatDate .Repo.UpdatedAt}}</span>
195 </div>
196 </div>
197 </div>
198
199 <div class="side-card">
200 <div class="side-card-header">{{icon "terminal" "size-3.5"}} {{t .Lang "repo.clone_title"}}</div>
201 <div class="side-card-body">
202 <div class="clone-box">
203 <code>{{.CloneURL}}</code>
204 <button type="button" class="btn btn-ghost btn-icon" style="width:1.6rem;height:1.6rem;" data-copy="{{.CloneURL}}" title="{{t .Lang "common.copy"}}">
205 {{icon "copy" "size-3.5"}}
206 </button>
207 </div>
208 <a href="/{{.Repo.OwnerUsername}}/{{.Repo.Name}}/archive/{{.Ref}}.zip" class="btn btn-outline btn-sm w-full justify-center">
209 {{icon "download" "size-3.5"}}
210 <span>{{t .Lang "repo.download_zip"}}</span>
211 </a>
212 </div>
213 </div>
214 </aside>
215 </div>
216 {{end}}
217 </div>
218 {{end}}