this repo has no description
1{{ define "repo/fragments/diff" }}
2 <style>
3 #filesToggle:checked ~ div label[for="filesToggle"] .show-text { display: none; }
4 #filesToggle:checked ~ div label[for="filesToggle"] .hide-text { display: inline; }
5 #filesToggle:not(:checked) ~ div label[for="filesToggle"] .hide-text { display: none; }
6 #filesToggle:checked ~ div div#files { width: fit-content; max-width: 15vw; margin-right: 1rem; }
7 #filesToggle:not(:checked) ~ div div#files { width: 0; display: hidden; margin-right: 0; }
8 </style>
9
10 {{ template "diffTopbar" . }}
11 {{ block "diffLayout" . }} {{ end }}
12{{ end }}
13
14{{ define "diffTopbar" }}
15 {{ $diff := index . 0 }}
16 {{ $opts := index . 1 }}
17
18 {{ block "filesCheckbox" $ }} {{ end }}
19 {{ block "subsCheckbox" $ }} {{ end }}
20
21 <!-- top bar -->
22 <div class="sticky top-0 z-30 bg-slate-100 dark:bg-gray-900 flex items-center gap-2 col-span-full h-12 p-2">
23 <!-- left panel toggle -->
24 {{ template "filesToggle" . }}
25
26 <!-- stats -->
27 {{ $stat := $diff.Stats }}
28 {{ $count := len $diff.ChangedFiles }}
29 {{ template "repo/fragments/diffStatPill" $stat }}
30 {{ $count }} changed file{{ if ne $count 1 }}s{{ end }}
31
32 <!-- spacer -->
33 <div class="flex-grow"></div>
34
35 <!-- collapse diffs -->
36 {{ template "collapseToggle" }}
37
38 <!-- diff options -->
39 {{ template "repo/fragments/diffOpts" $opts }}
40
41 <!-- right panel toggle -->
42 {{ block "subsToggle" $ }} {{ end }}
43 </div>
44
45{{ end }}
46
47{{ define "diffLayout" }}
48 {{ $diff := index . 0 }}
49 {{ $opts := index . 1 }}
50
51 <div class="flex col-span-full flex-grow">
52 <!-- left panel -->
53 <div id="files" class="w-0 hidden md:block overflow-hidden sticky top-12 max-h-screen overflow-y-auto pb-12">
54 <section class="overflow-x-auto text-sm px-6 py-2 border border-gray-200 dark:border-gray-700 w-full mx-auto min-h-full rounded bg-white dark:bg-gray-800 drop-shadow-sm">
55 {{ template "repo/fragments/fileTree" $diff.FileTree }}
56 </section>
57 </div>
58
59 <!-- main content -->
60 <div class="flex-1 min-w-0 sticky top-12 pb-12">
61 {{ template "diffFiles" (list $diff $opts) }}
62 </div>
63
64 </div>
65{{ end }}
66
67{{ define "diffFiles" }}
68 {{ $diff := index . 0 }}
69 {{ $opts := index . 1 }}
70 {{ $files := $diff.ChangedFiles }}
71 {{ $isSplit := $opts.Split }}
72 <div class="flex flex-col gap-4">
73 {{ if eq (len $files) 0 }}
74 <div class="text-center text-gray-500 dark:text-gray-400 py-8">
75 <p>No differences found between the selected revisions.</p>
76 </div>
77 {{ else }}
78 {{ range $idx, $file := $files }}
79 {{ template "diffFile" (list $idx $file $isSplit) }}
80 {{ end }}
81 {{ end }}
82 </div>
83{{ end }}
84
85{{ define "diffFile" }}
86 {{ $idx := index . 0 }}
87 {{ $file := index . 1 }}
88 {{ $isSplit := index . 2 }}
89 {{ with $file }}
90 <details open id="file-{{ .Id }}" class="group border border-gray-200 dark:border-gray-700 w-full mx-auto rounded bg-white dark:bg-gray-800 drop-shadow-sm" tabindex="{{ add $idx 1 }}">
91 <summary class="list-none cursor-pointer sticky top-12 group-open:border-b border-gray-200 dark:border-gray-700">
92 <div id="diff-file-header" class="rounded cursor-pointer bg-white dark:bg-gray-800 flex justify-between">
93 <div id="left-side-items" class="p-2 flex gap-2 items-center overflow-x-auto">
94 <span class="group-open:hidden inline">{{ i "chevron-right" "w-4 h-4" }}</span>
95 <span class="hidden group-open:inline">{{ i "chevron-down" "w-4 h-4" }}</span>
96 {{ template "repo/fragments/diffStatPill" .Stats }}
97
98 <div class="flex gap-2 items-center overflow-x-auto">
99 {{ $n := .Names }}
100 {{ if and $n.New $n.Old (ne $n.New $n.Old)}}
101 {{ $n.Old }} {{ i "arrow-right" "w-4 h-4" }} {{ $n.New }}
102 {{ else if $n.New }}
103 {{ $n.New }}
104 {{ else }}
105 {{ $n.Old }}
106 {{ end }}
107 </div>
108 </div>
109 </div>
110 </summary>
111
112 <div class="transition-all duration-700 ease-in-out">
113 {{ $reason := .CanRender }}
114 {{ if $reason }}
115 <p class="text-center text-gray-400 dark:text-gray-500 p-4">{{ $reason }}</p>
116 {{ else }}
117 {{ if $isSplit }}
118 {{- template "repo/fragments/splitDiff" .Split -}}
119 {{ else }}
120 {{- template "repo/fragments/unifiedDiff" . -}}
121 {{ end }}
122 {{- end -}}
123 </div>
124 </details>
125 {{ end }}
126{{ end }}
127
128{{ define "filesCheckbox" }}
129 <input type="checkbox" id="filesToggle" class="peer/files hidden" checked/>
130{{ end }}
131
132{{ define "filesToggle" }}
133 <label title="Toggle filetree panel" for="filesToggle" class="hidden md:inline-flex items-center justify-center rounded cursor-pointer text-normal font-normal normalcase">
134 <span class="show-text">{{ i "panel-left-open" "size-4" }}</span>
135 <span class="hide-text">{{ i "panel-left-close" "size-4" }}</span>
136 </label>
137{{ end }}
138
139{{ define "collapseToggle" }}
140 <label
141 title="Expand/Collapse diffs"
142 for="collapseToggle"
143 class="btn font-normal normal-case p-2"
144 >
145 <input type="checkbox" id="collapseToggle" class="peer/collapse hidden" checked/>
146 <span class="peer-checked/collapse:hidden inline-flex items-center gap-2">
147 {{ i "fold-vertical" "w-4 h-4" }}
148 <span class="hidden md:inline">expand all</span>
149 </span>
150 <span class="peer-checked/collapse:inline-flex hidden flex items-center gap-2">
151 {{ i "unfold-vertical" "w-4 h-4" }}
152 <span class="hidden md:inline">collapse all</span>
153 </span>
154 </label>
155 <script>
156 document.addEventListener('DOMContentLoaded', function() {
157 const checkbox = document.getElementById('collapseToggle');
158 const details = document.querySelectorAll('details[id^="file-"]');
159
160 checkbox.addEventListener('change', function() {
161 details.forEach(detail => {
162 detail.open = checkbox.checked;
163 });
164 });
165
166 details.forEach(detail => {
167 detail.addEventListener('toggle', function() {
168 const allOpen = Array.from(details).every(d => d.open);
169 const allClosed = Array.from(details).every(d => !d.open);
170
171 if (allOpen) {
172 checkbox.checked = true;
173 } else if (allClosed) {
174 checkbox.checked = false;
175 }
176 });
177 });
178 });
179 </script>
180{{ end }}