Monorepo for Tangled
at e949a86d926b049287187fad78915dbc05492253 547 lines 21 kB view raw
1{{ define "title" }} 2 {{ .Pull.Title }} &middot; pull #{{ .Pull.PullId }} &middot; {{ .RepoInfo.FullName }} 3{{ end }} 4 5{{ define "extrameta" }} 6 {{ template "repo/pulls/fragments/og" (dict "RepoInfo" .RepoInfo "Pull" .Pull) }} 7{{ end }} 8 9{{ define "mainLayout" }} 10 <div class="px-1 flex-grow flex flex-col gap-4"> 11 <div class="max-w-screen-lg mx-auto"> 12 {{ block "contentLayout" . }} 13 {{ block "content" . }}{{ end }} 14 {{ end }} 15 </div> 16 {{ block "contentAfterLayout" . }} 17 <main> 18 {{ block "contentAfter" . }}{{ end }} 19 </main> 20 {{ end }} 21 </div> 22 <script> 23 (function() { 24 const details = document.getElementById('bottomSheet'); 25 const isDesktop = () => window.matchMedia('(min-width: 768px)').matches; 26 27 // close on mobile initially 28 if (!isDesktop()) { 29 details.open = false; 30 } 31 32 // prevent closing on desktop 33 details.addEventListener('toggle', function(e) { 34 if (isDesktop() && !this.open) { 35 this.open = true; 36 } 37 }); 38 39 const mediaQuery = window.matchMedia('(min-width: 768px)'); 40 mediaQuery.addEventListener('change', function(e) { 41 if (e.matches) { 42 // switched to desktop - keep open 43 details.open = true; 44 } else { 45 // switched to mobile - close 46 details.open = false; 47 } 48 }); 49 })(); 50 </script> 51{{ end }} 52 53{{ define "repoContentLayout" }} 54 <div class="grid grid-cols-1 md:grid-cols-10 gap-4"> 55 <section class="bg-white col-span-1 md:col-span-8 dark:bg-gray-800 p-6 rounded relative w-full mx-auto dark:text-white h-full flex-shrink"> 56 {{ block "repoContent" . }}{{ end }} 57 </section> 58 <div class="flex flex-col gap-6 col-span-1 md:col-span-2"> 59 {{ template "repo/fragments/labelPanel" 60 (dict "RepoInfo" $.RepoInfo 61 "Defs" $.LabelDefs 62 "Subject" $.Pull.AtUri 63 "State" $.Pull.Labels) }} 64 {{ template "repo/fragments/participants" $.Pull.Participants }} 65 {{ template "repo/fragments/backlinks" 66 (dict "RepoInfo" $.RepoInfo 67 "Backlinks" $.Backlinks) }} 68 {{ template "repo/fragments/externalLinkPanel" $.Pull.AtUri }} 69 </div> 70 </div> 71{{ end }} 72 73{{ define "contentAfter" }} 74 {{ template "repo/fragments/diff" (list .Diff .DiffOpts $) }} 75{{ end }} 76 77{{ define "repoContent" }} 78 {{ template "repo/pulls/fragments/pullHeader" . }} 79 {{ if .Pull.IsStacked }} 80 <div class="mt-8"> 81 {{ template "repo/pulls/fragments/pullStack" . }} 82 </div> 83 {{ end }} 84{{ end }} 85 86{{ define "diffLayout" }} 87 {{ $diff := index . 0 }} 88 {{ $opts := index . 1 }} 89 {{ $root := index . 2 }} 90 91 <div class="flex col-span-full"> 92 <!-- left panel --> 93 <div id="files" class="w-0 hidden md:block overflow-hidden sticky top-12 max-h-screen overflow-y-auto pb-12"> 94 <section class="overflow-x-auto text-sm px-6 py-2 border-b border-x border-gray-200 dark:border-gray-700 w-full mx-auto min-h-full rounded-b rounded-t-none bg-white dark:bg-gray-800 drop-shadow-sm"> 95 {{ template "repo/fragments/fileTree" $diff.FileTree }} 96 </section> 97 </div> 98 99 <!-- main content --> 100 <div class="flex-1 min-w-0 sticky top-12 pb-12"> 101 {{ template "diffFiles" (list $diff $opts) }} 102 </div> 103 104 <!-- right panel --> 105 {{ template "subsPanel" $ }} 106 </div> 107{{ end }} 108 109{{ define "subsPanel" }} 110 {{ $root := index . 2 }} 111 {{ $pull := $root.Pull }} 112 113 <!-- backdrop overlay - only visible on mobile when open --> 114 <div class=" 115 fixed inset-0 bg-black/50 z-50 md:hidden opacity-0 116 pointer-events-none transition-opacity duration-300 117 has-[~#subs_details[open]]:opacity-100 has-[~#subs_details[open]]:pointer-events-auto"> 118 </div> 119 <!-- right panel - bottom sheet on mobile, side panel on desktop --> 120 <div id="subs" class="fixed bottom-0 left-0 right-0 z-50 w-full md:static md:z-auto md:max-h-screen md:sticky md:top-12 overflow-hidden"> 121 <details open id="bottomSheet" class="group rounded-t-2xl md:rounded-t drop-shadow-lg md:drop-shadow-none"> 122 <summary class=" 123 flex gap-4 items-center justify-between 124 rounded-t-2xl md:rounded-t cursor-pointer list-none p-4 md:h-12 125 text-white md:text-black md:dark:text-white 126 bg-green-600 dark:bg-green-700 127 md:bg-white md:dark:bg-gray-800 128 drop-shadow-sm 129 border-t md:border-x md:border-t-0 border-gray-200 dark:border-gray-700"> 130 <h2 class="">Submissions</h2> 131 {{ template "subsPanelSummary" $ }} 132 </summary> 133 <div class="max-h-[85vh] md:max-h-[calc(100vh-3rem-3rem)] w-full flex flex-col-reverse gap-4 overflow-y-auto bg-slate-100 dark:bg-gray-900 md:bg-transparent"> 134 {{ template "submissions" $root }} 135 </div> 136 </details> 137 </div> 138{{ end }} 139 140{{ define "subsPanelSummary" }} 141 {{ $root := index . 2 }} 142 {{ $pull := $root.Pull }} 143 {{ $latest := $pull.LastRoundNumber }} 144 <div class="flex items-center gap-2 text-sm"> 145 {{ if $root.IsInterdiff }} 146 <span> 147 viewing interdiff of 148 <span class="font-mono">#{{ $root.ActiveRound }}</span> 149 and 150 <span class="font-mono">#{{ sub $root.ActiveRound 1 }}</span> 151 </span> 152 {{ else }} 153 <span> 154 viewing round 155 <span class="font-mono">#{{ $root.ActiveRound }}</span> 156 </span> 157 {{ if ne $root.ActiveRound $latest }} 158 <span>(outdated)</span> 159 <span class="before:content-['·']"></span> 160 <a class="underline" href="/{{ $root.RepoInfo.FullName }}/pulls/{{ $root.Pull.PullId }}/round/{{ $latest }}?{{ safeUrl $root.DiffOpts.Encode }}"> 161 view latest 162 </a> 163 {{ end }} 164 {{ end }} 165 <span class="md:hidden inline"> 166 <span class="inline group-open:hidden">{{ i "chevron-up" "size-4" }}</span> 167 <span class="hidden group-open:inline">{{ i "chevron-down" "size-4" }}</span> 168 </span> 169 </div> 170{{ end }} 171 172{{ define "subsCheckbox" }} 173 <input type="checkbox" id="subsToggle" class="peer/subs hidden" checked/> 174{{ end }} 175 176{{ define "subsToggle" }} 177 <style> 178 /* Mobile: full width */ 179 #subsToggle:checked ~ div div#subs { 180 width: 100%; 181 margin-left: 0; 182 } 183 #subsToggle:checked ~ div label[for="subsToggle"] .show-toggle { display: none; } 184 #subsToggle:checked ~ div label[for="subsToggle"] .hide-toggle { display: flex; } 185 #subsToggle:not(:checked) ~ div label[for="subsToggle"] .hide-toggle { display: none; } 186 187 /* Desktop: 25vw with left margin */ 188 @media (min-width: 768px) { 189 #subsToggle:checked ~ div div#subs { 190 width: 25vw; 191 margin-left: 1rem; 192 } 193 /* Unchecked state */ 194 #subsToggle:not(:checked) ~ div div#subs { 195 width: 0; 196 display: none; 197 margin-left: 0; 198 } 199 } 200 </style> 201 <label title="Toggle review panel" for="subsToggle" class="hidden md:flex items-center justify-end rounded cursor-pointer"> 202 <span class="show-toggle">{{ i "message-square-more" "size-4" }}</span> 203 <span class="hide-toggle w-[25vw] flex justify-end">{{ i "message-square" "size-4" }}</span> 204 </label> 205{{ end }} 206 207 208{{ define "submissions" }} 209 {{ $lastIdx := sub (len .Pull.Submissions) 1 }} 210 {{ range $ridx, $item := reverse .Pull.Submissions }} 211 {{ $idx := sub $lastIdx $ridx }} 212 {{ template "submission" (list $item $idx $lastIdx $) }} 213 {{ end }} 214{{ end }} 215 216{{ define "submission" }} 217 {{ $item := index . 0 }} 218 {{ $idx := index . 1 }} 219 {{ $lastIdx := index . 2 }} 220 {{ $root := index . 3 }} 221 <div class="{{ if eq $item.RoundNumber 0 }}rounded-b border-t-0{{ else }}rounded{{ end }} border border-gray-200 dark:border-gray-700 w-full shadow-sm bg-gray-50 dark:bg-gray-800/50"> 222 {{ template "submissionHeader" $ }} 223 {{ template "submissionComments" $ }} 224 225 {{ if eq $lastIdx $item.RoundNumber }} 226 {{ block "mergeStatus" $root }} {{ end }} 227 {{ block "resubmitStatus" $root }} {{ end }} 228 {{ end }} 229 230 {{ if $root.LoggedInUser }} 231 {{ template "repo/pulls/fragments/pullActions" 232 (dict 233 "LoggedInUser" $root.LoggedInUser 234 "Pull" $root.Pull 235 "RepoInfo" $root.RepoInfo 236 "RoundNumber" $item.RoundNumber 237 "MergeCheck" $root.MergeCheck 238 "ResubmitCheck" $root.ResubmitCheck 239 "BranchDeleteStatus" $root.BranchDeleteStatus 240 "Stack" $root.Stack) }} 241 {{ else }} 242 {{ template "loginPrompt" $ }} 243 {{ end }} 244 </div> 245{{ end }} 246 247{{ define "submissionHeader" }} 248 {{ $item := index . 0 }} 249 {{ $lastIdx := index . 2 }} 250 {{ $root := index . 3 }} 251 {{ $round := $item.RoundNumber }} 252 <div class="{{ if eq $round 0 }}rounded-b{{ else }}rounded{{ end }} px-6 py-4 pr-2 pt-2 {{ if eq $root.ActiveRound $round }}bg-blue-100 dark:bg-blue-900/50 border-b border-blue-200 dark:border-blue-700{{ else }}bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700{{ end }} flex gap-2 sticky top-0 z-20"> 253 <!-- left column: just profile picture --> 254 <div class="flex-shrink-0 pt-2"> 255 <img 256 src="{{ tinyAvatar $root.Pull.OwnerDid }}" 257 alt="" 258 class="rounded-full size-8 mr-1 border-2 border-gray-100 dark:border-gray-900" 259 /> 260 </div> 261 <!-- right column --> 262 <div class="flex-1 min-w-0 flex flex-col gap-1"> 263 {{ template "submissionInfo" $ }} 264 {{ template "submissionCommits" $ }} 265 {{ template "submissionPipeline" $ }} 266 {{ if eq $lastIdx $round }} 267 {{ block "mergeCheck" $root }} {{ end }} 268 {{ end }} 269 </div> 270 </div> 271{{ end }} 272 273{{ define "submissionInfo" }} 274 {{ $item := index . 0 }} 275 {{ $idx := index . 1 }} 276 {{ $root := index . 3 }} 277 {{ $round := $item.RoundNumber }} 278 <div class="flex gap-2 items-center justify-between mb-1"> 279 <span class="inline-flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 pt-2"> 280 {{ resolve $root.Pull.OwnerDid }} submitted 281 <span class="px-2 py-0.5 {{ if eq $root.ActiveRound $round }}text-white bg-blue-600 dark:bg-blue-500 border-blue-700 dark:border-blue-600{{ else }}text-black dark:text-white bg-gray-100 dark:bg-gray-700 border-gray-300 dark:border-gray-600{{ end }} rounded font-mono text-xs border"> 282 #{{ $round }} 283 </span> 284 <span class="select-none before:content-['\00B7']"></span> 285 <a class="text-gray-500 dark:text-gray-400 hover:text-gray-500" href="#round-#{{ $round }}"> 286 {{ template "repo/fragments/shortTimeAgo" $item.Created }} 287 </a> 288 </span> 289 <div class="flex gap-2 items-center"> 290 {{ if ne $root.ActiveRound $round }} 291 <a class="btn-flat flex items-center gap-2 no-underline hover:no-underline text-sm" 292 href="/{{ $root.RepoInfo.FullName }}/pulls/{{ $root.Pull.PullId }}/round/{{ $round }}?{{ safeUrl $root.DiffOpts.Encode }}"> 293 {{ i "diff" "w-4 h-4" }} 294 diff 295 </a> 296 {{ end }} 297 {{ if ne $idx 0 }} 298 <a class="btn-flat flex items-center gap-2 no-underline hover:no-underline text-sm" 299 href="/{{ $root.RepoInfo.FullName }}/pulls/{{ $root.Pull.PullId }}/round/{{ $round }}/interdiff?{{ safeUrl $root.DiffOpts.Encode }}"> 300 {{ i "chevrons-left-right-ellipsis" "w-4 h-4 rotate-90" }} 301 interdiff 302 </a> 303 {{ end }} 304 </div> 305 </div> 306{{ end }} 307 308{{ define "submissionCommits" }} 309 {{ $item := index . 0 }} 310 {{ $root := index . 3 }} 311 {{ $round := $item.RoundNumber }} 312 {{ $patches := $item.AsFormatPatch }} 313 {{ if $patches }} 314 <details class="group/commit"> 315 <summary class="list-none cursor-pointer flex items-center gap-2"> 316 <span>{{ i "git-commit-horizontal" "w-4 h-4" }}</span> 317 {{ len $patches }} commit{{ if ne (len $patches) 1 }}s{{ end }} 318 <div class="text-sm text-gray-500 dark:text-gray-400"> 319 <span class="group-open/commit:hidden inline">expand</span> 320 <span class="hidden group-open/commit:inline">collapse</span> 321 </div> 322 </summary> 323 {{ range $patches }} 324 {{ template "submissionCommit" (list . $item $root) }} 325 {{ end }} 326 </details> 327 {{ end }} 328{{ end }} 329 330{{ define "submissionCommit" }} 331 {{ $patch := index . 0 }} 332 {{ $item := index . 1 }} 333 {{ $root := index . 2 }} 334 {{ $round := $item.RoundNumber }} 335 {{ with $patch }} 336 <div id="commit-{{.SHA}}" class="py-1 relative w-full md:max-w-3/5 md:w-fit flex flex-col text-gray-600 dark:text-gray-300"> 337 <div class="flex items-baseline gap-2"> 338 <div class="text-xs"> 339 <!-- attempt to resolve $fullRepo: this is possible only on non-deleted forks and branches --> 340 {{ $fullRepo := "" }} 341 {{ if and $root.Pull.IsForkBased $root.Pull.PullSource.Repo }} 342 {{ $fullRepo = printf "%s/%s" $root.Pull.OwnerDid $root.Pull.PullSource.Repo.Name }} 343 {{ else if $root.Pull.IsBranchBased }} 344 {{ $fullRepo = $root.RepoInfo.FullName }} 345 {{ end }} 346 347 <!-- if $fullRepo was resolved, link to it, otherwise just span without a link --> 348 {{ if $fullRepo }} 349 <a href="/{{ $fullRepo }}/commit/{{ .SHA }}" class="font-mono text-gray-600 dark:text-gray-300">{{ slice .SHA 0 8 }}</a> 350 {{ else }} 351 <span class="font-mono">{{ slice .SHA 0 8 }}</span> 352 {{ end }} 353 </div> 354 355 <div> 356 <span>{{ .Title | description }}</span> 357 {{ if gt (len .Body) 0 }} 358 <button 359 class="py-1/2 px-1 mx-2 bg-gray-200 hover:bg-gray-400 rounded dark:bg-gray-700 dark:hover:bg-gray-600" 360 hx-on:click="document.getElementById('body-{{$round}}-{{.SHA}}').classList.toggle('hidden')" 361 > 362 {{ i "ellipsis" "w-3 h-3" }} 363 </button> 364 {{ end }} 365 {{ if gt (len .Body) 0 }} 366 <p id="body-{{$round}}-{{.SHA}}" class="hidden mt-1 pb-2">{{ nl2br .Body }}</p> 367 {{ end }} 368 </div> 369 </div> 370 </div> 371 {{ end }} 372{{ end }} 373 374{{ define "mergeCheck" }} 375 {{ $isOpen := .Pull.State.IsOpen }} 376 {{ if and $isOpen .MergeCheck .MergeCheck.Error }} 377 <div class="flex items-center gap-2"> 378 {{ i "triangle-alert" "w-4 h-4 text-red-600 dark:text-red-500" }} 379 {{ .MergeCheck.Error }} 380 </div> 381 {{ else if and $isOpen .MergeCheck .MergeCheck.IsConflicted }} 382 <details class="group/conflict"> 383 <summary class="flex items-center justify-between cursor-pointer list-none"> 384 <div class="flex items-center gap-2 "> 385 {{ i "triangle-alert" "text-red-600 dark:text-red-500 w-4 h-4" }} 386 <span class="font-medium">merge conflicts detected</span> 387 <div class="text-sm text-gray-500 dark:text-gray-400"> 388 <span class="group-open/conflict:hidden inline">expand</span> 389 <span class="hidden group-open/conflict:inline">collapse</span> 390 </div> 391 </div> 392 </summary> 393 {{ if gt (len .MergeCheck.Conflicts) 0 }} 394 <ul class="space-y-1 mt-2 overflow-x-auto"> 395 {{ range .MergeCheck.Conflicts }} 396 {{ if .Filename }} 397 <li class="flex items-center whitespace-nowrap"> 398 {{ i "file-warning" "inline-flex w-4 h-4 mr-1.5 text-red-600 dark:text-red-500 flex-shrink-0" }} 399 <span class="font-mono">{{ .Filename }}</span> 400 </li> 401 {{ else if .Reason }} 402 <li class="flex items-center whitespace-nowrap"> 403 {{ i "file-warning" "w-4 h-4 mr-1.5 text-red-600 dark:text-red-500 " }} 404 <span>{{.Reason}}</span> 405 </li> 406 {{ end }} 407 {{ end }} 408 </ul> 409 {{ end }} 410 </details> 411 {{ else if and $isOpen .MergeCheck }} 412 <div class="flex items-center gap-2"> 413 {{ i "check" "w-4 h-4 text-green-600 dark:text-green-500" }} 414 <span>no conflicts, ready to merge</span> 415 </div> 416 {{ end }} 417{{ end }} 418 419{{ define "mergeStatus" }} 420 {{ if .Pull.State.IsClosed }} 421 <div class="bg-gray-50 dark:bg-gray-700 border border-black dark:border-gray-500 rounded drop-shadow-sm px-6 py-2 relative"> 422 <div class="flex items-center gap-2 text-black dark:text-white"> 423 {{ i "ban" "w-4 h-4" }} 424 <span class="font-medium">closed without merging</span 425 > 426 </div> 427 </div> 428 {{ else if .Pull.State.IsMerged }} 429 <div class="bg-purple-50 dark:bg-purple-900 border border-purple-500 rounded drop-shadow-sm px-6 py-2 relative"> 430 <div class="flex items-center gap-2 text-purple-500 dark:text-purple-300"> 431 {{ i "git-merge" "w-4 h-4" }} 432 <span class="font-medium">pull request successfully merged</span 433 > 434 </div> 435 </div> 436 {{ else if .Pull.State.IsDeleted }} 437 <div class="bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-6 py-2 relative"> 438 <div class="flex items-center gap-2 text-red-500 dark:text-red-300"> 439 {{ i "git-pull-request-closed" "w-4 h-4" }} 440 <span class="font-medium">This pull has been deleted (possibly by jj abandon or jj squash)</span> 441 </div> 442 </div> 443 {{ end }} 444{{ end }} 445 446{{ define "resubmitStatus" }} 447 {{ if .ResubmitCheck.Yes }} 448 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm px-6 py-2 relative"> 449 <div class="flex items-center gap-2 text-amber-500 dark:text-amber-300"> 450 {{ i "triangle-alert" "w-4 h-4" }} 451 <span class="font-medium">this branch has been updated, consider resubmitting</span> 452 </div> 453 </div> 454 {{ end }} 455{{ end }} 456 457{{ define "submissionPipeline" }} 458 {{ $item := index . 0 }} 459 {{ $root := index . 3 }} 460 {{ $pipeline := index $root.Pipelines $item.SourceRev }} 461 {{ with $pipeline }} 462 {{ $id := .Id }} 463 {{ if .Statuses }} 464 <details class="group/pipeline"> 465 <summary class="cursor-pointer list-none flex items-center gap-2"> 466 {{ template "repo/pipelines/fragments/pipelineSymbol" (dict "Pipeline" $pipeline "ShortSummary" false) }} 467 <div class="text-sm text-gray-500 dark:text-gray-400"> 468 <span class="group-open/pipeline:hidden inline">expand</span> 469 <span class="hidden group-open/pipeline:inline">collapse</span> 470 </div> 471 </summary> 472 <div class="my-2 grid grid-cols-1 bg-white dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 divide-y divide-gray-200 dark:divide-gray-700"> 473 {{ range $name, $all := .Statuses }} 474 <a href="/{{ $root.RepoInfo.FullName }}/pipelines/{{ $id }}/workflow/{{ $name }}" class="no-underline hover:no-underline hover:bg-gray-100/25 hover:dark:bg-gray-700/25"> 475 <div 476 class="flex gap-2 items-center justify-between p-2"> 477 {{ $lastStatus := $all.Latest }} 478 {{ $kind := $lastStatus.Status.String }} 479 480 <div id="left" class="flex items-center gap-2 flex-shrink-0"> 481 {{ template "repo/pipelines/fragments/workflowSymbol" $all }} 482 {{ $name }} 483 </div> 484 <div id="right" class="flex items-center gap-2 flex-shrink-0"> 485 <span class="font-bold">{{ $kind }}</span> 486 {{ if .TimeTaken }} 487 {{ template "repo/fragments/duration" .TimeTaken }} 488 {{ else }} 489 {{ template "repo/fragments/shortTimeAgo" $lastStatus.Created }} 490 {{ end }} 491 </div> 492 </div> 493 </a> 494 {{ end }} 495 </div> 496 </details> 497 {{ end }} 498 {{ end }} 499{{ end }} 500 501{{ define "submissionComments" }} 502 {{ $item := index . 0 }} 503 <div class="relative ml-10 border-l-2 border-gray-200 dark:border-gray-700"> 504 {{ range $item.Comments }} 505 {{ template "submissionComment" . }} 506 {{ end }} 507 </div> 508{{ end }} 509 510{{ define "submissionComment" }} 511 <div id="comment-{{.ID}}" class="flex gap-2 -ml-4 py-4 w-full mx-auto"> 512 <!-- left column: profile picture --> 513 <div class="flex-shrink-0"> 514 <img 515 src="{{ tinyAvatar .OwnerDid }}" 516 alt="" 517 class="rounded-full size-8 mr-1 border-2 border-gray-100 dark:border-gray-900" 518 /> 519 </div> 520 <!-- right column: name and body in two rows --> 521 <div class="flex-1 min-w-0"> 522 <!-- Row 1: Author and timestamp --> 523 <div class="text-sm text-gray-500 dark:text-gray-400 flex items-center gap-1"> 524 <span>{{ resolve .OwnerDid }}</span> 525 <span class="before:content-['·']"></span> 526 <a class="text-gray-500 dark:text-gray-400 hover:text-gray-500 dark:hover:text-gray-300" href="#comment-{{.ID}}"> 527 {{ template "repo/fragments/time" .Created }} 528 </a> 529 </div> 530 <!-- Row 2: Body text --> 531 <div class="prose dark:prose-invert mt-1"> 532 {{ .Body | markdown }} 533 </div> 534 </div> 535 </div> 536{{ end }} 537 538{{ define "loginPrompt" }} 539 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm p-2 relative flex gap-2 items-center"> 540 <a href="/signup" class="btn-create py-0 hover:no-underline hover:text-white flex items-center gap-2"> 541 sign up 542 </a> 543 <span class="text-gray-500 dark:text-gray-400">or</span> 544 <a href="/login" class="underline">login</a> 545 to add to the discussion 546 </div> 547{{ end }}