Signed-off-by: oppiliappan me@oppi.li
+18
appview/pages/pages.go
+18
appview/pages/pages.go
···
202
return p.parse(stack...)
203
}
204
205
func (p *Pages) executePlain(name string, w io.Writer, params any) error {
206
tpl, err := p.parse(name)
207
if err != nil {
···
229
return tpl.ExecuteTemplate(w, "layouts/base", params)
230
}
231
232
func (p *Pages) Favicon(w io.Writer) error {
233
return p.executePlain("favicon", w, nil)
234
}
···
202
return p.parse(stack...)
203
}
204
205
+
func (p *Pages) parseProfileBase(top string) (*template.Template, error) {
206
+
stack := []string{
207
+
"layouts/base",
208
+
"layouts/profilebase",
209
+
top,
210
+
}
211
+
return p.parse(stack...)
212
+
}
213
+
214
func (p *Pages) executePlain(name string, w io.Writer, params any) error {
215
tpl, err := p.parse(name)
216
if err != nil {
···
238
return tpl.ExecuteTemplate(w, "layouts/base", params)
239
}
240
241
+
func (p *Pages) executeProfile(name string, w io.Writer, params any) error {
242
+
tpl, err := p.parseProfileBase(name)
243
+
if err != nil {
244
+
return err
245
+
}
246
+
247
+
return tpl.ExecuteTemplate(w, "layouts/base", params)
248
+
}
249
+
250
func (p *Pages) Favicon(w io.Writer) error {
251
return p.executePlain("favicon", w, nil)
252
}
+104
appview/pages/templates/layouts/profilebase.html
+104
appview/pages/templates/layouts/profilebase.html
···
···
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 }}?tab={{ .Active }}" />
7
+
<meta property="og:description" content="{{ or .Card.Profile.Description .Card.UserHandle .Card.UserDid }}" />
8
+
{{ end }}
9
+
10
+
{{ define "content" }}
11
+
{{ template "profileTabs" . }}
12
+
<section class="bg-white dark:bg-gray-800 p-6 rounded w-full dark:text-white">
13
+
<div class="grid grid-cols-1 md:grid-cols-11 gap-4">
14
+
<div class="md:col-span-3 order-1 md:order-1">
15
+
<div class="flex flex-col gap-4">
16
+
{{ template "user/fragments/profileCard" .Card }}
17
+
{{ block "punchcard" .Card.Punchcard }} {{ end }}
18
+
</div>
19
+
</div>
20
+
{{ block "profileContent" . }} {{ end }}
21
+
</div>
22
+
</section>
23
+
{{ end }}
24
+
25
+
{{ define "profileTabs" }}
26
+
<nav class="w-full pl-4 overflow-x-auto overflow-y-hidden">
27
+
<div class="flex z-60">
28
+
{{ $activeTabStyles := "-mb-px bg-white dark:bg-gray-800" }}
29
+
{{ $tabs := .Card.GetTabs }}
30
+
{{ $tabmeta := dict "x" "y" }}
31
+
{{ range $item := $tabs }}
32
+
{{ $key := index $item 0 }}
33
+
{{ $value := index $item 1 }}
34
+
{{ $icon := index $item 2 }}
35
+
{{ $meta := index $tabmeta $key }}
36
+
<a
37
+
href="?tab={{ $value }}"
38
+
class="relative -mr-px group no-underline hover:no-underline"
39
+
hx-boost="true">
40
+
<div
41
+
class="px-4 py-1 mr-1 text-black dark:text-white min-w-[80px] text-center relative rounded-t whitespace-nowrap
42
+
{{ if eq $.Active $key }}
43
+
{{ $activeTabStyles }}
44
+
{{ else }}
45
+
group-hover:bg-gray-100/25 group-hover:dark:bg-gray-700/25
46
+
{{ end }}
47
+
">
48
+
<span class="flex items-center justify-center">
49
+
{{ i $icon "w-4 h-4 mr-2" }}
50
+
{{ $key }}
51
+
{{ if not (isNil $meta) }}
52
+
<span class="bg-gray-200 dark:bg-gray-700 rounded py-1/2 px-1 text-sm ml-1">{{ $meta }}</span>
53
+
{{ end }}
54
+
</span>
55
+
</div>
56
+
</a>
57
+
{{ end }}
58
+
</div>
59
+
</nav>
60
+
{{ end }}
61
+
62
+
{{ define "punchcard" }}
63
+
{{ $now := now }}
64
+
<div>
65
+
<p class="px-2 pb-4 flex gap-2 text-sm font-bold dark:text-white">
66
+
PUNCHCARD
67
+
<span class="font-mono font-normal text-sm text-gray-500 dark:text-gray-400 ">
68
+
{{ .Total | int64 | commaFmt }} commits
69
+
</span>
70
+
</p>
71
+
<div class="grid grid-cols-28 md:grid-cols-14 gap-y-3 w-full h-full">
72
+
{{ range .Punches }}
73
+
{{ $count := .Count }}
74
+
{{ $theme := "bg-gray-200 dark:bg-gray-700 size-[4px]" }}
75
+
{{ if lt $count 1 }}
76
+
{{ $theme = "bg-gray-200 dark:bg-gray-700 size-[4px]" }}
77
+
{{ else if lt $count 2 }}
78
+
{{ $theme = "bg-green-200 dark:bg-green-900 size-[5px]" }}
79
+
{{ else if lt $count 4 }}
80
+
{{ $theme = "bg-green-300 dark:bg-green-800 size-[5px]" }}
81
+
{{ else if lt $count 8 }}
82
+
{{ $theme = "bg-green-400 dark:bg-green-700 size-[6px]" }}
83
+
{{ else }}
84
+
{{ $theme = "bg-green-500 dark:bg-green-600 size-[7px]" }}
85
+
{{ end }}
86
+
87
+
{{ if .Date.After $now }}
88
+
{{ $theme = "border border-gray-200 dark:border-gray-700 size-[4px]" }}
89
+
{{ end }}
90
+
<div class="w-full h-full flex justify-center items-center">
91
+
<div
92
+
class="aspect-square rounded-full transition-all duration-300 {{ $theme }} max-w-full max-h-full"
93
+
title="{{ .Date.Format "2006-01-02" }}: {{ .Count }} commits">
94
+
</div>
95
+
</div>
96
+
{{ end }}
97
+
</div>
98
+
</div>
99
+
{{ end }}
100
+
101
+
{{ define "layouts/profilebase" }}
102
+
{{ template "layouts/base" . }}
103
+
{{ end }}
104
+