1{{ define "title" }}{{ .String.Filename }} · by {{ didOrHandle .Owner.DID.String .Owner.Handle.String }}{{ end }}
2
3{{ define "extrameta" }}
4 {{ $ownerId := didOrHandle .Owner.DID.String .Owner.Handle.String }}
5 <meta property="og:title" content="{{ .String.Filename }} · by {{ $ownerId }}" />
6 <meta property="og:type" content="object" />
7 <meta property="og:url" content="https://tangled.org/strings/{{ $ownerId }}/{{ .String.Rkey }}" />
8 <meta property="og:description" content="{{ .String.Description }}" />
9{{ end }}
10
11{{ define "content" }}
12{{ $ownerId := didOrHandle .Owner.DID.String .Owner.Handle.String }}
13 <section id="string-header" class="mb-4 py-2 px-6 dark:text-white">
14 <div class="text-lg flex items-center justify-between">
15 <div>
16 <a href="/strings/{{ $ownerId }}">{{ $ownerId }}</a>
17 <span class="select-none">/</span>
18 <a href="/strings/{{ $ownerId }}/{{ .String.Rkey }}" class="font-bold">{{ .String.Filename }}</a>
19 </div>
20 <div class="flex gap-2 text-base">
21 {{ if and .LoggedInUser (eq .LoggedInUser.Did .String.Did) }}
22 <a class="btn flex items-center gap-2 no-underline hover:no-underline p-2 group"
23 hx-boost="true"
24 href="/strings/{{ .String.Did }}/{{ .String.Rkey }}/edit">
25 {{ i "pencil" "size-4" }}
26 <span class="hidden md:inline">edit</span>
27 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
28 </a>
29 <button
30 class="btn text-red-500 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300 gap-2 group p-2"
31 title="Delete string"
32 hx-delete="/strings/{{ .String.Did }}/{{ .String.Rkey }}/"
33 hx-swap="none"
34 hx-confirm="Are you sure you want to delete the string `{{ .String.Filename }}`?"
35 >
36 {{ i "trash-2" "size-4" }}
37 <span class="hidden md:inline">delete</span>
38 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }}
39 </button>
40 {{ end }}
41 {{ template "fragments/starBtn"
42 (dict "SubjectAt" .String.AtUri
43 "IsStarred" .IsStarred
44 "StarCount" .StarCount) }}
45 </div>
46 </div>
47 <span>
48 {{ with .String.Description }}
49 {{ . }}
50 {{ end }}
51 </span>
52 </section>
53 <section class="bg-white dark:bg-gray-800 px-6 py-4 rounded relative w-full dark:text-white">
54 <div class="flex flex-col md:flex-row md:justify-between md:items-center text-gray-500 dark:text-gray-400 text-sm md:text-base pb-2 mb-3 text-base border-b border-gray-200 dark:border-gray-700">
55 <span>
56 {{ .String.Filename }}
57 <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span>
58 <span>
59 {{ with .String.Edited }}
60 edited {{ template "repo/fragments/shortTimeAgo" . }}
61 {{ else }}
62 {{ template "repo/fragments/shortTimeAgo" .String.Created }}
63 {{ end }}
64 </span>
65 </span>
66 <div>
67 <span>{{ .Stats.LineCount }} lines</span>
68 <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span>
69 <span>{{ byteFmt .Stats.ByteCount }}</span>
70 <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span>
71 <a href="/strings/{{ $ownerId }}/{{ .String.Rkey }}/raw">view raw</a>
72 {{ if .RenderToggle }}
73 <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span>
74 <a href="?code={{ .ShowRendered }}" hx-boost="true">
75 view {{ if .ShowRendered }}code{{ else }}rendered{{ end }}
76 </a>
77 {{ end }}
78 </div>
79 </div>
80 <div class="overflow-x-auto overflow-y-hidden relative">
81 {{ if .ShowRendered }}
82 <div id="blob-contents" class="prose dark:prose-invert">{{ .String.Contents | readme }}</div>
83 {{ else }}
84 <div id="blob-contents" class="whitespace-pre peer-target:bg-yellow-200 dark:peer-target:bg-yellow-900">{{ code .String.Contents .String.Filename | escapeHtml }}</div>
85 {{ end }}
86 </div>
87 {{ template "fragments/multiline-select" }}
88 </section>
89{{ end }}