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 }}