this repo has no description
1{{ define "title" }}{{ or .Card.UserHandle .Card.UserDid }}{{ end }}
2
3{{ define "extrameta" }}
4 <meta property="og:title" content="{{ or .Card.UserHandle .Card.UserDid }}" />
5 <meta property="og:type" content="profile" />
6 <meta property="og:url" content="https://tangled.sh/{{ or .Card.UserHandle .Card.UserDid }}" />
7 <meta property="og:description" content="{{ or .Card.Profile.Description .Card.UserHandle .Card.UserDid }}" />
8{{ end }}
9
10{{ define "content" }}
11<div class="grid grid-cols-1 md:grid-cols-8 gap-4">
12 <div class="md:col-span-2 order-1 md:order-1">
13 <div class="grid grid-cols-1 gap-4">
14 {{ template "user/fragments/profileCard" .Card }}
15 {{ block "punchcard" .Punchcard }} {{ end }}
16 </div>
17 </div>
18 <div id="all-repos" class="md:col-span-3 order-2 md:order-2">
19 <div class="grid grid-cols-1 gap-4">
20 {{ block "ownRepos" . }}{{ end }}
21 {{ block "collaboratingRepos" . }}{{ end }}
22 </div>
23 </div>
24 <div class="md:col-span-3 order-3 md:order-3">
25 {{ block "profileTimeline" . }}{{ end }}
26 </div>
27</div>
28{{ end }}
29
30{{ define "profileTimeline" }}
31 <p class="text-sm font-bold p-2 dark:text-white">ACTIVITY</p>
32 <div class="flex flex-col gap-4 relative">
33 {{ with .ProfileTimeline }}
34 {{ range $idx, $byMonth := .ByMonth }}
35 {{ with $byMonth }}
36 <div class="bg-white dark:bg-gray-800 px-6 py-4 rounded drop-shadow-sm">
37 {{ if eq $idx 0 }}
38
39 {{ else }}
40 {{ $s := "s" }}
41 {{ if eq $idx 1 }}
42 {{ $s = "" }}
43 {{ end }}
44 <p class="text-sm font-bold dark:text-white mb-2">{{$idx}} month{{$s}} ago</p>
45 {{ end }}
46
47 {{ if .IsEmpty }}
48 <div class="text-gray-500 dark:text-gray-400">
49 No activity for this month
50 </div>
51 {{ else }}
52 <div class="flex flex-col gap-1">
53 {{ block "repoEvents" (list .RepoEvents $.DidHandleMap) }} {{ end }}
54 {{ block "issueEvents" (list .IssueEvents $.DidHandleMap) }} {{ end }}
55 {{ block "pullEvents" (list .PullEvents $.DidHandleMap) }} {{ end }}
56 </div>
57 {{ end }}
58 </div>
59
60 {{ end }}
61 {{ else }}
62 <p class="dark:text-white">This user does not have any activity yet.</p>
63 {{ end }}
64 {{ end }}
65 </div>
66{{ end }}
67
68{{ define "repoEvents" }}
69 {{ $items := index . 0 }}
70 {{ $handleMap := index . 1 }}
71
72 {{ if gt (len $items) 0 }}
73 <details>
74 <summary class="list-none cursor-pointer hover:text-gray-500 hover:dark:text-gray-400">
75 <div class="flex flex-wrap items-center gap-2">
76 {{ i "book-plus" "w-4 h-4" }}
77 created {{ len $items }} {{if eq (len $items) 1 }}repository{{else}}repositories{{end}}
78 </div>
79 </summary>
80 <div class="py-2 text-sm flex flex-col gap-3 mb-2">
81 {{ range $items }}
82 <div class="flex flex-wrap items-center gap-2">
83 <span class="text-gray-500 dark:text-gray-400">
84 {{ if .Source }}
85 {{ i "git-fork" "w-4 h-4" }}
86 {{ else }}
87 {{ i "book-plus" "w-4 h-4" }}
88 {{ end }}
89 </span>
90 <a href="/{{ index $handleMap .Repo.Did }}/{{ .Repo.Name }}" class="no-underline hover:underline">
91 {{- .Repo.Name -}}
92 </a>
93 </div>
94 {{ end }}
95 </div>
96 </details>
97 {{ end }}
98{{ end }}
99
100{{ define "issueEvents" }}
101 {{ $i := index . 0 }}
102 {{ $items := $i.Items }}
103 {{ $stats := $i.Stats }}
104 {{ $handleMap := index . 1 }}
105
106 {{ if gt (len $items) 0 }}
107 <details>
108 <summary class="list-none cursor-pointer hover:text-gray-500 hover:dark:text-gray-400">
109 <div class="flex flex-wrap items-center gap-2">
110 {{ i "circle-dot" "w-4 h-4" }}
111
112 <div>
113 created {{ len $items }} {{if eq (len $items) 1 }}issue{{else}}issues{{end}}
114 </div>
115
116 {{ if gt $stats.Open 0 }}
117 <span class="px-2 py-1/2 text-sm rounded text-white bg-green-600 dark:bg-green-700">
118 {{$stats.Open}} open
119 </span>
120 {{ end }}
121
122 {{ if gt $stats.Closed 0 }}
123 <span class="px-2 py-1/2 text-sm rounded text-white bg-gray-800 dark:bg-gray-700">
124 {{$stats.Closed}} closed
125 </span>
126 {{ end }}
127
128 </div>
129 </summary>
130 <div class="py-2 text-sm flex flex-col gap-3 mb-2">
131 {{ range $items }}
132 {{ $repoOwner := index $handleMap .Metadata.Repo.Did }}
133 {{ $repoName := .Metadata.Repo.Name }}
134 {{ $repoUrl := printf "%s/%s" $repoOwner $repoName }}
135
136 <div class="flex gap-2 text-gray-600 dark:text-gray-300">
137 {{ if .Open }}
138 <span class="text-green-600 dark:text-green-500">
139 {{ i "circle-dot" "w-4 h-4" }}
140 </span>
141 {{ else }}
142 <span class="text-gray-500 dark:text-gray-400">
143 {{ i "ban" "w-4 h-4" }}
144 </span>
145 {{ end }}
146 <div class="flex-none min-w-8 text-right">
147 <span class="text-gray-500 dark:text-gray-400">#{{ .IssueId }}</span>
148 </div>
149 <div class="break-words max-w-full">
150 <a href="/{{$repoUrl}}/issues/{{ .IssueId }}" class="no-underline hover:underline">
151 {{ .Title -}}
152 </a>
153 on
154 <a href="/{{$repoUrl}}" class="no-underline hover:underline whitespace-nowrap">
155 {{$repoUrl}}
156 </a>
157 </div>
158 </div>
159 {{ end }}
160 </div>
161 </details>
162 {{ end }}
163{{ end }}
164
165{{ define "pullEvents" }}
166 {{ $i := index . 0 }}
167 {{ $items := $i.Items }}
168 {{ $stats := $i.Stats }}
169 {{ $handleMap := index . 1 }}
170 {{ if gt (len $items) 0 }}
171 <details>
172 <summary class="list-none cursor-pointer hover:text-gray-500 hover:dark:text-gray-400">
173 <div class="flex flex-wrap items-center gap-2">
174 {{ i "git-pull-request" "w-4 h-4" }}
175
176 <div>
177 created {{ len $items }} {{if eq (len $items) 1 }}pull request{{else}}pull requests{{end}}
178 </div>
179
180 {{ if gt $stats.Open 0 }}
181 <span class="px-2 py-1/2 text-sm rounded text-white bg-green-600 dark:bg-green-700">
182 {{$stats.Open}} open
183 </span>
184 {{ end }}
185
186 {{ if gt $stats.Merged 0 }}
187 <span class="px-2 py-1/2 text-sm rounded text-white bg-purple-600 dark:bg-purple-700">
188 {{$stats.Merged}} merged
189 </span>
190 {{ end }}
191
192
193 {{ if gt $stats.Closed 0 }}
194 <span class="px-2 py-1/2 text-sm rounded text-white bg-gray-800 dark:bg-gray-700">
195 {{$stats.Closed}} closed
196 </span>
197 {{ end }}
198
199 </div>
200 </summary>
201 <div class="py-2 text-sm flex flex-col gap-3 mb-2">
202 {{ range $items }}
203 {{ $repoOwner := index $handleMap .Repo.Did }}
204 {{ $repoName := .Repo.Name }}
205 {{ $repoUrl := printf "%s/%s" $repoOwner $repoName }}
206
207 <div class="flex gap-2 text-gray-600 dark:text-gray-300">
208 {{ if .State.IsOpen }}
209 <span class="text-green-600 dark:text-green-500">
210 {{ i "git-pull-request" "w-4 h-4" }}
211 </span>
212 {{ else if .State.IsMerged }}
213 <span class="text-purple-600 dark:text-purple-500">
214 {{ i "git-merge" "w-4 h-4" }}
215 </span>
216 {{ else }}
217 <span class="text-gray-600 dark:text-gray-300">
218 {{ i "git-pull-request-closed" "w-4 h-4" }}
219 </span>
220 {{ end }}
221 <div class="flex-none min-w-8 text-right">
222 <span class="text-gray-500 dark:text-gray-400">#{{ .PullId }}</span>
223 </div>
224 <div class="break-words max-w-full">
225 <a href="/{{$repoUrl}}/pulls/{{ .PullId }}" class="no-underline hover:underline">
226 {{ .Title -}}
227 </a>
228 on
229 <a href="/{{$repoUrl}}" class="no-underline hover:underline whitespace-nowrap">
230 {{$repoUrl}}
231 </a>
232 </div>
233 </div>
234 {{ end }}
235 </div>
236 </details>
237 {{ end }}
238{{ end }}
239
240{{ define "ownRepos" }}
241 <div>
242 <div class="text-sm font-bold p-2 pr-0 dark:text-white flex items-center justify-between gap-2">
243 <a href="/@{{ or $.Card.UserHandle $.Card.UserDid }}?tab=repos"
244 class="flex text-black dark:text-white items-center gap-2 no-underline hover:no-underline group">
245 <span>PINNED REPOS</span>
246 <span class="flex gap-1 items-center font-normal text-sm text-gray-500 dark:text-gray-400 ">
247 view all {{ i "chevron-right" "w-4 h-4" }}
248 </span>
249 </a>
250 {{ if and .LoggedInUser (eq .LoggedInUser.Did .Card.UserDid) }}
251 <button
252 hx-get="profile/edit-pins"
253 hx-target="#all-repos"
254 class="btn py-0 font-normal text-sm flex gap-2 items-center group">
255 {{ i "pencil" "w-3 h-3" }}
256 edit
257 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
258 </button>
259 {{ end }}
260 </div>
261 <div id="repos" class="grid grid-cols-1 gap-4">
262 {{ range .Repos }}
263 <div
264 id="repo-card"
265 class="py-4 px-6 drop-shadow-sm rounded bg-white dark:bg-gray-800">
266 <div id="repo-card-name" class="font-medium">
267 <a href="/@{{ or $.Card.UserHandle $.Card.UserDid }}/{{ .Name }}"
268 >{{ .Name }}</a
269 >
270 </div>
271 {{ if .Description }}
272 <div class="text-gray-600 dark:text-gray-300 text-sm">
273 {{ .Description }}
274 </div>
275 {{ end }}
276 <div class="text-gray-400 pt-1 text-sm font-mono inline-flex gap-4 mt-auto">
277 {{ if .RepoStats.StarCount }}
278 <div class="flex gap-1 items-center text-sm">
279 {{ i "star" "w-3 h-3 fill-current" }}
280 <span>{{ .RepoStats.StarCount }}</span>
281 </div>
282 {{ end }}
283 </div>
284 </div>
285 {{ else }}
286 <p class="px-6 dark:text-white">This user does not have any repos yet.</p>
287 {{ end }}
288 </div>
289 </div>
290{{ end }}
291
292{{ define "collaboratingRepos" }}
293 {{ if gt (len .CollaboratingRepos) 0 }}
294 <div>
295 <p class="text-sm font-bold p-2 dark:text-white">COLLABORATING ON</p>
296 <div id="collaborating" class="grid grid-cols-1 gap-4">
297 {{ range .CollaboratingRepos }}
298 <div
299 id="repo-card"
300 class="py-4 px-6 drop-shadow-sm rounded bg-white dark:bg-gray-800">
301 <div id="repo-card-name" class="font-medium dark:text-white">
302 <a href="/{{ index $.DidHandleMap .Did }}/{{ .Name }}">
303 {{ index $.DidHandleMap .Did }}/{{ .Name }}
304 </a>
305 </div>
306 {{ if .Description }}
307 <div class="text-gray-600 dark:text-gray-300 text-sm">
308 {{ .Description }}
309 </div>
310 {{ end }}
311 <div class="text-gray-400 pt-1 text-sm font-mono inline-flex gap-4 mt-auto">
312 {{ if .RepoStats.StarCount }}
313 <div class="flex gap-1 items-center text-sm">
314 {{ i "star" "w-3 h-3 fill-current" }}
315 <span>{{ .RepoStats.StarCount }}</span>
316 </div>
317 {{ end }}
318 </div>
319 </div>
320 {{ else }}
321 <p class="px-6 dark:text-white">This user is not collaborating.</p>
322 {{ end }}
323 </div>
324 </div>
325 {{ end }}
326{{ end }}
327
328{{ define "punchcard" }}
329 {{ $now := now }}
330 <div>
331 <p class="p-2 flex gap-2 text-sm font-bold dark:text-white">
332 PUNCHCARD
333 <span class="font-normal text-sm text-gray-500 dark:text-gray-400 ">
334 {{ .Total | int64 | commaFmt }} commits
335 </span>
336 </p>
337 <div class="bg-white dark:bg-gray-800 px-6 py-4 rounded drop-shadow-sm">
338 <div class="grid grid-cols-28 md:grid-cols-14 gap-y-2 w-full h-full">
339 {{ range .Punches }}
340 {{ $count := .Count }}
341 {{ $theme := "bg-gray-200 dark:bg-gray-700 size-[4px]" }}
342 {{ if lt $count 1 }}
343 {{ $theme = "bg-gray-200 dark:bg-gray-700 size-[4px]" }}
344 {{ else if lt $count 2 }}
345 {{ $theme = "bg-green-200 dark:bg-green-900 size-[5px]" }}
346 {{ else if lt $count 4 }}
347 {{ $theme = "bg-green-300 dark:bg-green-800 size-[5px]" }}
348 {{ else if lt $count 8 }}
349 {{ $theme = "bg-green-400 dark:bg-green-700 size-[6px]" }}
350 {{ else }}
351 {{ $theme = "bg-green-500 dark:bg-green-600 size-[7px]" }}
352 {{ end }}
353
354 {{ if .Date.After $now }}
355 {{ $theme = "border border-gray-200 dark:border-gray-700 size-[4px]" }}
356 {{ end }}
357 <div class="w-full h-full flex justify-center items-center">
358 <div
359 class="aspect-square rounded-full transition-all duration-300 {{ $theme }} max-w-full max-h-full"
360 title="{{ .Date.Format "2006-01-02" }}: {{ .Count }} commits">
361 </div>
362 </div>
363 {{ end }}
364 </div>
365 </div>
366 </div>
367{{ end }}