Signed-off-by: oppiliappan me@oppi.li
+34
-19
appview/pages/templates/timeline/fragments/preview.html
+34
-19
appview/pages/templates/timeline/fragments/preview.html
···
1
{{ define "timeline/fragments/preview" }}
2
<div class="flex flex-col gap-4 overflow-hidden">
3
-
<div class="relative h-80 w-full">
4
<!-- left fade overlay (fixed on left edge) -->
5
<div class="absolute left-0 top-0 h-full w-16 pointer-events-none z-10 bg-gradient-to-r from-white to-transparent dark:from-gray-900"></div>
6
···
78
{{ $repo := $event.Repo }}
79
{{ $source := $event.Source }}
80
{{ $userHandle := resolve $repo.Did }}
81
-
<div class="px-6 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex w-max items-center gap-2 text-sm">
82
-
{{ template "user/fragments/picHandleLink" $repo.Did }}
83
-
{{ with $source }}
84
-
{{ $sourceDid := resolve .Did }}
85
-
forked
86
-
<a href="/{{ $sourceDid }}/{{ .Name }}"class="no-underline hover:underline">
87
-
{{ $sourceDid }}/{{ .Name }}
88
-
</a>
89
-
to
90
-
<a href="/{{ $userHandle }}/{{ $repo.Name }}" class="no-underline hover:underline">{{ $repo.Name }}</a>
91
-
{{ else }}
92
-
created
93
-
<a href="/{{ $userHandle }}/{{ $repo.Name }}" class="no-underline hover:underline">
94
-
{{ $repo.Name }}
95
-
</a>
96
-
{{ end }}
97
</div>
98
{{ end }}
99
···
104
{{ with $star }}
105
{{ $starrerHandle := resolve .Did }}
106
{{ $repoOwnerHandle := resolve .Repo.Did }}
107
-
<div class="px-6 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex w-max items-center gap-2 text-sm">
108
{{ template "user/fragments/picHandleLink" $starrerHandle }}
109
starred
110
{{ template "user/fragments/pic" (list $repoOwnerHandle "size-6") }}
111
<a href="/{{ $repoOwnerHandle }}/{{ .Repo.Name }}" class="no-underline hover:underline">
112
{{ $repoOwnerHandle | truncateAt30 }}/{{ .Repo.Name }}
113
</a>
114
</div>
115
{{ end }}
116
{{ end }}
···
125
126
{{ $userHandle := resolve $follow.UserDid }}
127
{{ $subjectHandle := resolve $follow.SubjectDid }}
128
-
<div class="px-6 py-2 bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex w-max items-center gap-2 text-sm">
129
{{ template "user/fragments/picHandleLink" $userHandle }}
130
followed
131
{{ template "user/fragments/picHandleLink" $subjectHandle }}
132
</div>
133
{{ end }}
···
1
{{ define "timeline/fragments/preview" }}
2
<div class="flex flex-col gap-4 overflow-hidden">
3
+
<div class="relative h-96 w-full">
4
<!-- left fade overlay (fixed on left edge) -->
5
<div class="absolute left-0 top-0 h-full w-16 pointer-events-none z-10 bg-gradient-to-r from-white to-transparent dark:from-gray-900"></div>
6
···
78
{{ $repo := $event.Repo }}
79
{{ $source := $event.Source }}
80
{{ $userHandle := resolve $repo.Did }}
81
+
<div class="bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex w-max items-stretch divide-x divide-gray-200 dark:divide-gray-700 text-sm">
82
+
<div class="p-4 bg-gray-100 dark:bg-gray-900/50 h-full">
83
+
{{ i "folder-plus" "size-4" }}
84
+
</div>
85
+
<div class="px-4 flex items-center gap-2">
86
+
{{ template "user/fragments/picHandleLink" $repo.Did }}
87
+
{{ with $source }}
88
+
{{ $sourceDid := resolve .Did }}
89
+
forked
90
+
<a href="/{{ $sourceDid }}/{{ .Name }}"class="no-underline hover:underline">
91
+
{{ $sourceDid }}/{{ .Name }}
92
+
</a>
93
+
to
94
+
<a href="/{{ $userHandle }}/{{ $repo.Name }}" class="no-underline hover:underline">{{ $repo.Name }}</a>
95
+
{{ else }}
96
+
created
97
+
<a href="/{{ $userHandle }}/{{ $repo.Name }}" class="no-underline hover:underline">
98
+
{{ $repo.Name }}
99
+
</a>
100
+
{{ end }}
101
+
</div>
102
</div>
103
{{ end }}
104
···
109
{{ with $star }}
110
{{ $starrerHandle := resolve .Did }}
111
{{ $repoOwnerHandle := resolve .Repo.Did }}
112
+
<div class="bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex w-max items-stretch divide-x divide-gray-200 dark:divide-gray-700 text-sm">
113
+
<div class="p-4 bg-gray-100 dark:bg-gray-900/50 h-full">
114
+
{{ i "star" "size-4" }}
115
+
</div>
116
+
<div class="px-4 flex items-center gap-2">
117
{{ template "user/fragments/picHandleLink" $starrerHandle }}
118
starred
119
{{ template "user/fragments/pic" (list $repoOwnerHandle "size-6") }}
120
<a href="/{{ $repoOwnerHandle }}/{{ .Repo.Name }}" class="no-underline hover:underline">
121
{{ $repoOwnerHandle | truncateAt30 }}/{{ .Repo.Name }}
122
</a>
123
+
</div>
124
</div>
125
{{ end }}
126
{{ end }}
···
135
136
{{ $userHandle := resolve $follow.UserDid }}
137
{{ $subjectHandle := resolve $follow.SubjectDid }}
138
+
<div class="bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 flex w-max items-stretch divide-x divide-gray-200 dark:divide-gray-700 text-sm">
139
+
<div class="p-4 bg-gray-100 dark:bg-gray-900/50 h-full">
140
+
{{ i "user-plus" "size-4" }}
141
+
</div>
142
+
<div class="px-4 flex items-center gap-2">
143
{{ template "user/fragments/picHandleLink" $userHandle }}
144
followed
145
{{ template "user/fragments/picHandleLink" $subjectHandle }}
146
+
</div>
147
</div>
148
{{ end }}
+98
-193
appview/pages/templates/timeline/home.html
+98
-193
appview/pages/templates/timeline/home.html
···
23
24
25
{{ define "content" }}
26
-
<div class="flex flex-col gap-24 md:gap-40 my-24 md:my-32">
27
{{ template "timeline/fragments/hero" . }}
28
{{ template "timeline/fragments/preview" . }}
29
{{ template "features1" . }}
···
81
{{ $labelStyle := "normal-case cursor-pointer w-auto md:w-full p-4 md:px-6 rounded bg-white dark:bg-gray-800 font-medium text-base md:text-lg opacity-50 border border-gray-200 dark:border-gray-700 relative overflow-hidden" }}
82
{{ $spanStyle := "z-10 items-center justify-between gap-2 w-full" }}
83
{{ $connectorStyle := "w-0.5 h-6 bg-gray-300 dark:bg-gray-600 opacity-0 mx-auto" }}
84
-
{{ $contentStyle := "hidden bg-white dark:bg-gray-800 rounded shadow-sm p-6 border border-gray-200 dark:border-gray-700 grid-cols-1 md:grid-cols-2" }}
85
{{ $progressOverlayStyle := "absolute inset-0 bg-gray-600/10 dark:bg-gray-100/10 w-0 transition-none" }}
86
87
<style>
···
138
<div class="{{ $connectorStyle }} peer-checked/knots:opacity-100"></div>
139
<div class="{{ $connectorStyle }} peer-checked/spindles:opacity-100"></div>
140
141
-
{{ $titleStyle := "text-xl md:text-2xl font-bold my-2 text-gray-900 dark:text-gray-100" }}
142
-
{{ $textContentStyle := "pb-6 md:p-6 md:pr-12 md:text-lg" }}
143
-
{{ $imgContentStyle := "w-full p-6 min-h-96 min-h-[400px] md:min-h-[500px] rounded overflow-hidden place-content-center bg-gradient-to-b from-slate-50 to-slate-100 dark:from-gray-800 dark:to-gray-900 border border-gray-200 dark:border-gray-700" }}
144
145
-
<div class="col-span-3 {{ $contentStyle }} peer-checked/prs:grid ">
146
-
<div class="{{ $textContentStyle }} flex flex-col gap-4 md:gap-8 place-self-center">
147
-
<section>
148
-
<h1 class="{{ $titleStyle }}">Stacked PRs</h1>
149
-
<p>
150
Break down large features into small, reviewable chunks. Stack pull
151
requests on top of each other and ship faster with better code
152
-
reviews. Tangled natively supports stacking using Jujutsu <a
153
-
href="https://docs.jj-vcs.dev/latest/glossary/#change-id"
154
-
class="underline">Change-Ids</a>.
155
-
</p>
156
-
</section>
157
-
<section>
158
-
<h1 class="{{ $titleStyle }}">Round-based review</h1>
159
-
<p>
160
-
Pull-requests in Tangled are round-based, which means, each
161
-
submission is "immutable". To update a PR, the author must start a
162
-
second revision or "round". As a reviewer, you never have to worry
163
-
about a PR changing <em>during</em> a review!
164
</p>
165
</section>
166
</div>
167
-
<div class="{{ $imgContentStyle }} pl-24 md:pl-40">
168
-
<div class="flex flex-col" style="transform: perspective(1000px) rotateX(15deg)">
169
-
{{ $mockPRs := list
170
-
(dict "Id" 941 "Title" "spindle/nixery: update setup command docs" "State" "open" )
171
-
(dict "Id" 940 "Title" "appview/pulls: fix search not updating count of pull requests" "State" "open" )
172
-
(dict "Id" 939 "Title" "appview/pages: improved seo tags for home, repo and profile" "State" "open" )
173
-
(dict "Id" 938 "Title" "appview/state: update robots.txt" "State" "merged" )
174
-
(dict "Id" 937 "Title" "appview/profile: show dummy profile when no tangled profile" "State" "merged" )
175
-
(dict "Id" 936 "Title" "appview/pipelines: fix incorrect totals" "State" "merged" )
176
-
}}
177
-
{{ range $index, $pr := $mockPRs }}
178
-
{{ $scale := 1.4 }}
179
-
{{ if gt $index 0 }}
180
-
{{ $scale = subf64 1.4 (mulf64 (f64 $index) 0.04) }}
181
-
{{ if lt $scale 1.0 }}{{ $scale = 1.0 }}{{ end }}
182
-
{{ end }}
183
-
{{ $zIndex := sub 100 $index }}
184
-
{{ template "mockPRRow" (dict "PR" $pr "Scale" $scale "ZIndex" $zIndex) }}
185
-
{{ end }}
186
</div>
187
</div>
188
</div>
189
190
<div class="col-span-3 {{ $contentStyle }} peer-checked/knots:grid">
191
-
<div class="{{ $textContentStyle }} flex flex-col gap-4 md:gap-8 place-self-center">
192
-
<section>
193
-
<h1 class="{{ $titleStyle }}">Knots</h1>
194
-
<p>
195
-
Host your repositories on your own infrastructure with <a
196
-
href="https://docs.tangled.org/knot-self-hosting-guide.html#knot-self-hosting-guide" class="underline">knots</a>.
197
-
Knots are lightweight git repository hosts that syndicate git
198
-
operations across the network. You can setup a knot server on a
199
-
machine as small as a Raspberry Pi!
200
-
<br>
201
-
<br>
202
-
If you want to try Tangled without self-hosting, fear not! All users
203
-
are added to our hosted knot by default.
204
-
</p>
205
-
</section>
206
-
<section>
207
-
<h1 class="{{ $titleStyle }}">Spindles</h1>
208
-
<p>
209
-
Host CI runners on your own infrastructure with <a
210
-
href="https://docs.tangled.org/spindles.html#self-hosting-guide" class="underline">spindles</a>.
211
-
Spindles are responsible for queuing up CI jobs and syndicating
212
-
pipeline statuses to the network. Presently, the task of sandboxing
213
-
workflows and caching dependencies is delegated to Docker.
214
</p>
215
</section>
216
-
</div>
217
-
{{ $planetWrapperStyle := "absolute left-1/2 bottom-0 flex items-start justify-center -translate-x-1/2 translate-y-1/2" }}
218
-
{{ $orbitStyle := "absolute left-1/2 bottom-0 rounded-full border-2 border-gray-200 dark:border-gray-700 -translate-x-1/2 translate-y-1/2 shadow-lg" }}
219
-
{{ $planetStyle := "-mt-8 size-16 md:-mt-10 md:size-20 rounded-full shadow-sm border flex items-center justify-center" }}
220
-
<div class="{{ $imgContentStyle }} min-h-[500px] relative">
221
-
<div class="size-[250px] {{ $orbitStyle }}"></div>
222
-
<div class="size-[500px] {{ $orbitStyle }}"></div>
223
-
<div class="size-[750px] {{ $orbitStyle }}"></div>
224
-
225
-
<!-- planets on inner orbit -->
226
-
<div class="{{ $planetWrapperStyle }} size-[250px] rotate-[12deg]">
227
-
<div class="{{ $planetStyle }} -rotate-[12deg] bg-blue-100 dark:bg-blue-900 border-blue-500 dark:border-blue-500">
228
-
{{ i "server" "size-8" "text-blue-500" "dark:text-blue-500" }}
229
-
</div>
230
-
</div>
231
-
232
-
<!-- Planets on middle orbit -->
233
-
<div class="{{ $planetWrapperStyle }} size-[500px] -rotate-[32deg]">
234
-
<div class="{{ $planetStyle }} rotate-[32deg] bg-green-100 dark:bg-green-900 border-green-500 dark:border-green-500">
235
-
{{ i "hard-drive" "size-8" "text-green-500" "dark:text-green-500" }}
236
-
</div>
237
-
</div>
238
-
<div class="{{ $planetWrapperStyle }} size-[500px] rotate-[24deg]">
239
-
<div class="{{ $planetStyle }} -rotate-[24deg] bg-amber-100 dark:bg-amber-900 border-amber-500 dark:border-amber-500">
240
-
{{ i "server" "size-8" "text-amber-500" "dark:text-amber-500" }}
241
-
</div>
242
-
</div>
243
-
244
-
<!-- Planets on outer orbit -->
245
-
<div class="{{ $planetWrapperStyle }} size-[750px] -rotate-[40deg]">
246
-
<div class="{{ $planetStyle }} rotate-[40deg] bg-blue-100 dark:bg-blue-900 border-blue-500 dark:border-blue-500">
247
-
{{ i "server" "size-8" "text-blue-500" "dark:text-blue-500" }}
248
</div>
249
-
</div>
250
-
<div class="{{ $planetWrapperStyle }} size-[750px] rotate-[3deg]">
251
-
<div class="{{ $planetStyle }} -rotate-[3deg] bg-green-100 dark:bg-green-900 border-green-500 dark:border-green-500">
252
-
{{ i "router" "size-8" "text-green-500" "dark:text-green-500" }}
253
</div>
254
</div>
255
-
<div class="{{ $planetWrapperStyle }} size-[750px] rotate-[44deg]">
256
-
<div class="{{ $planetStyle }} -rotate-[44deg] bg-amber-100 dark:bg-amber-900 border-amber-500 dark:border-amber-500">
257
-
{{ i "database" "size-8" "text-amber-500" "dark:text-amber-500" }}
258
-
</div>
259
</div>
260
</div>
261
</div>
262
263
<div class="col-span-3 {{ $contentStyle }} peer-checked/spindles:grid">
264
-
<div class="{{ $textContentStyle }} flex flex-col gap-4 md:gap-8 place-self-center">
265
-
<section>
266
<h1 class="{{ $titleStyle }}">Nix-powered CI</h1>
267
-
<p>
268
-
Pick and choose dependencies for your CI pipelines from <a
269
-
href="https://docs.tangled.org/spindles.html#dependencies"
270
-
class="underline"><code>nixpkgs</code></a>, one of the biggest
271
-
package repositories.
272
-
<br>
273
-
<br>
274
-
All dependencies and workflow images are cached using <a
275
-
href="https://nixery.dev/">nixery</a>. Subsuquent runs of your CI
276
-
pipeline will load all dependencies almost instantly.
277
-
</p>
278
-
</section>
279
-
<section>
280
-
<div class="flex items-center gap-2 my-4">
281
-
<h1 class="{{ $titleStyle }}">Customizable Engines</h1>
282
-
<span class="text-sm text-blue-500 dark:text-blue-300 bg-blue-100 dark:bg-blue-900/50 rounded p-1">coming soon</span>
283
-
</div>
284
-
<p>
285
-
We know nix is not for everybody! Spindles are built to have
286
-
swappable engines, on our roadmap are Docker and Firecracker based
287
-
engines.
288
</p>
289
</section>
290
-
</div>
291
-
<div class="{{ $imgContentStyle }} flex items-end pb-0">
292
-
<div class="w-full mx-auto border-t border-l border-r border-gray-200 dark:border-gray-700 rounded-t overflow-hidden shadow-lg">
293
-
<div class="bg-white dark:bg-gray-800 px-4 py-2 border-b border-gray-200 dark:border-gray-700 flex items-center gap-2 justify-between">
294
-
<span class="font-mono text-gray-600 dark:text-gray-400 text-sm md:text-lg">.tangled/workflows/test.yml</span>
295
-
<div class="flex items-center gap-2">
296
-
<div class="size-3 rounded-full bg-red-500"></div>
297
-
<div class="size-3 rounded-full bg-yellow-500"></div>
298
-
<div class="size-3 rounded-full bg-green-500"></div>
299
-
</div>
300
</div>
301
-
<div class="bg-white dark:bg-gray-800 p-4 overflow-x-auto text-sm md:text-lg">
302
-
{{ $yamlContent := `when:
303
-
- event: push
304
-
branch: main
305
-
306
-
dependencies:
307
-
nixpkgs:
308
-
- go
309
-
- gcc
310
-
311
-
environment:
312
-
CGO_ENABLED: 1
313
-
314
-
steps:
315
-
- name: run all tests
316
-
command: go test -v ./...` }}
317
-
<div class="whitespace-pre">{{ code $yamlContent ".tangled/workflows/test.yml" | escapeHtml }}</div>
318
</div>
319
</div>
320
</div>
321
</div>
322
</div>
323
···
365
</script>
366
{{ end }}
367
368
-
{{ define "mockPRRow" }}
369
-
{{ $pr := .PR }}
370
-
<div class="flex text-sm items-center justify-between w-full bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded p-3 shadow relative" style="transform: scale({{ .Scale }}); transform-origin: top center; z-index: {{ .ZIndex }};">
371
-
<div class="flex items-center gap-2 min-w-0 flex-1 pr-2">
372
-
<div class="flex-shrink-0">
373
-
{{ if eq $pr.State "open" }}
374
-
{{ i "git-pull-request" "size-4 text-green-500" }}
375
-
{{ else }}
376
-
{{ i "git-merge" "size-4 text-purple-500" }}
377
-
{{ end }}
378
-
</div>
379
-
<span class="truncate text-sm text-gray-800 dark:text-gray-200">
380
-
<span class="text-gray-500 dark:text-gray-400">#{{ $pr.Id }}</span>
381
-
{{ $pr.Title }}
382
-
</span>
383
-
</div>
384
-
</div>
385
-
{{ end }}
386
-
387
{{ define "features2" }}
388
{{ $cardStyle := "bg-white dark:bg-gray-800 rounded shadow-sm border border-gray-200 dark:border-gray-700" }}
389
{{ $cardInnerStyle := "flex flex-row items-center gap-4 md:gap-6 p-4 md:p-6 md:pt-8 relative" }}
390
{{ $contentStyle := "flex-1 flex flex-col" }}
391
{{ $titleStyle := "text-xl md:text-2xl font-bold mb-2 md:mb-3 text-gray-900 dark:text-gray-100" }}
392
-
{{ $descriptionStyle := "text-gray-600 dark:text-gray-300 text-sm md:text-base leading-relaxed mb-3 md:mb-0" }}
393
-
{{ $linkMobileStyle := "hover:no-underline inline-flex md:hidden items-center gap-2 text-sm text-gray-700 dark:text-gray-300 font-medium" }}
394
{{ $iconContainerStyle := "relative shrink-0 w-24 h-24 md:w-48 md:h-48" }}
395
-
{{ $iconCircleStyle := "w-full h-full rounded-full flex items-center justify-center" }}
396
{{ $linkDesktopStyle := "hover:no-underline hidden md:inline-flex absolute -bottom-10 -right-14 items-center gap-2 p-3 text-base btn" }}
397
398
<div class="w-full flex flex-col gap-6 md:gap-40 max-w-5xl mx-auto px-2">
399
<div class="{{ $cardStyle }} md:mr-32">
400
<div class="{{ $cardInnerStyle }}">
401
<div class="{{ $contentStyle }}">
402
<h3 class="{{ $titleStyle }}">Built on AT Protocol</h3>
403
<p class="{{ $descriptionStyle }}">
···
408
<br>
409
Bring an existing AT Protocol account (such as your Bluesky
410
account), or signup for one with us.
411
-
<a class="underline" href="https://docs.tangled.org/quick-start-guide.html#login-or-sign-up">Read the docs to know more.</a>
412
</p>
413
-
<a href="TODO" class="{{ $linkMobileStyle }}">
414
Learn more
415
{{ i "arrow-right" "size-4" }}
416
</a>
417
</div>
418
<div class="{{ $iconContainerStyle }}">
419
-
<div class="{{ $iconCircleStyle }} bg-blue-100 dark:bg-blue-900/50">
420
{{ i "at-sign" "size-12 md:size-24" "text-blue-500 dark:text-blue-500" "rotate-12" }}
421
</div>
422
-
<a href="TODO" class="{{ $linkDesktopStyle }}">
423
Learn more
424
{{ i "arrow-right" "size-4" }}
425
</a>
···
429
430
<div class="{{ $cardStyle }} md:ml-32">
431
<div class="{{ $cardInnerStyle }}">
432
<div class="{{ $contentStyle }}">
433
<h3 class="{{ $titleStyle }}">Free and Open-source</h3>
434
<p class="{{ $descriptionStyle }}">
···
439
We welcome contributions however big or small. You can start contributing by picking up a
440
<a class="underline" href="https://tangled.org/tangled.org/core/issues">good-first-issue</a>.
441
</p>
442
-
<a href="TODO" class="{{ $linkMobileStyle }}">
443
-
Learn more
444
{{ i "arrow-right" "size-4" }}
445
</a>
446
</div>
447
<div class="{{ $iconContainerStyle }}">
448
-
<div class="{{ $iconCircleStyle }} bg-green-100 dark:bg-green-900/50">
449
{{ i "package-open" "size-12 md:size-24" "text-green-500 dark:text-green-500" "-rotate-12" }}
450
</div>
451
-
<a href="TODO" class="{{ $linkDesktopStyle }}">
452
-
Learn more
453
{{ i "arrow-right" "size-4" }}
454
</a>
455
</div>
···
458
459
<div class="{{ $cardStyle }} md:mr-32">
460
<div class="{{ $cardInnerStyle }}">
461
<div class="{{ $contentStyle }}">
462
<h3 class="{{ $titleStyle }}">Social coding is back</h3>
463
<p class="{{ $descriptionStyle }}">
···
468
friends on Bluesky, you will find them on Tangled with the same
469
handle.
470
</p>
471
-
<a href="TODO" class="{{ $linkMobileStyle }}">
472
-
Learn more
473
{{ i "arrow-right" "size-4" }}
474
</a>
475
</div>
476
<div class="{{ $iconContainerStyle }}">
477
-
<div class="{{ $iconCircleStyle }} bg-amber-100 dark:bg-amber-900/50">
478
{{ i "message-circle-heart" "size-12 md:size-24" "text-amber-500 dark:text-amber-500" "rotate-12" }}
479
</div>
480
-
<a href="TODO" class="{{ $linkDesktopStyle }}">
481
-
Learn more
482
{{ i "arrow-right" "size-4" }}
483
</a>
484
</div>
···
581
<span>{{ .RepostCount }}</span>
582
</div>
583
<div class="flex items-center gap-1">
584
-
{{ i "reply" "size-4 -scale-x-1" }}
585
<span>{{ add64 .ReplyCount .QuoteCount }}</span>
586
</div>
587
</div>
···
600
<br>
601
<a href="https://docs.tangled.org/quick-start-guide.html#login-or-sign-up">Read more on the docs.</a>
602
</p>
603
-
<form class="flex gap-2 items-stretch w-full md:max-w-md mx-auto p-2 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 rounded shadow-sm">
604
<input
605
type="email"
606
id="email"
607
-
name="email"
608
tabindex="4"
609
required
610
placeholder="Enter your email"
···
23
24
25
{{ define "content" }}
26
+
<div class="flex flex-col gap-20 md:gap-40 my-20 md:my-32">
27
{{ template "timeline/fragments/hero" . }}
28
{{ template "timeline/fragments/preview" . }}
29
{{ template "features1" . }}
···
81
{{ $labelStyle := "normal-case cursor-pointer w-auto md:w-full p-4 md:px-6 rounded bg-white dark:bg-gray-800 font-medium text-base md:text-lg opacity-50 border border-gray-200 dark:border-gray-700 relative overflow-hidden" }}
82
{{ $spanStyle := "z-10 items-center justify-between gap-2 w-full" }}
83
{{ $connectorStyle := "w-0.5 h-6 bg-gray-300 dark:bg-gray-600 opacity-0 mx-auto" }}
84
+
{{ $contentStyle := "hidden bg-white dark:bg-gray-800 rounded shadow-sm p-6 md:p-8 border border-gray-200 dark:border-gray-700 grid-cols-1 animate-fadein" }}
85
{{ $progressOverlayStyle := "absolute inset-0 bg-gray-600/10 dark:bg-gray-100/10 w-0 transition-none" }}
86
87
<style>
···
138
<div class="{{ $connectorStyle }} peer-checked/knots:opacity-100"></div>
139
<div class="{{ $connectorStyle }} peer-checked/spindles:opacity-100"></div>
140
141
+
{{ $titleStyle := "text-2xl md:text-6xl my-2 md:mb-4 text-black dark:text-white font-medium" }}
142
+
{{ $textContentStyle := "pb-6 md:text-xl" }}
143
+
{{ $imgContentStyle := "w-full min-h-96 min-h-[400px] md:min-h-[500px] rounded overflow-hidden place-content-center bg-gradient-to-b from-slate-50 to-slate-100 dark:from-gray-800 dark:to-gray-900 border border-gray-200 dark:border-gray-700" }}
144
+
{{ $linkDesktopStyle := "hover:no-underline items-center gap-2 p-3 text-base btn" }}
145
146
+
<div class="col-span-3 {{ $contentStyle }} peer-checked/prs:grid relative">
147
+
<div class="{{ $textContentStyle }} flex gap-4 md:gap-8">
148
+
<section class="space-y-4">
149
+
<h1 class="{{ $titleStyle }}">Pull requests, reimagined</h1>
150
+
<p class="text-gray-600 dark:text-gray-400">
151
Break down large features into small, reviewable chunks. Stack pull
152
requests on top of each other and ship faster with better code
153
+
reviews. Tangled natively supports stacking using Jujutsu.
154
</p>
155
+
<a href="https://blog.tangled.org/stacking" class="hover:no-underline inline-flex md:hidden items-center gap-2 text-sm text-black dark:text-white font-medium">
156
+
Learn more
157
+
{{ i "arrow-right" "size-4" }}
158
+
</a>
159
</section>
160
+
<div class="w-fit hidden md:flex items-center">
161
+
<div class="size-32 rounded-full flex items-center justify-center bg-green-100 dark:bg-green-900 -mr-4" >
162
+
{{ i "wand-sparkles" "size-16 text-green-500 dark:text-green-500" }}
163
+
</div>
164
+
<div class="size-40 rounded-full flex items-center justify-center bg-indigo-100 dark:bg-indigo-900 z-10">
165
+
{{ i "git-pull-request" "size-24 text-indigo-500 dark:text-indigo-500 rotate-12" }}
166
+
</div>
167
+
</div>
168
</div>
169
+
<div class="{{ $imgContentStyle }} min-h-[500px] relative overflow-hidden">
170
+
<div class="w-full h-full relative overflow-hidden">
171
+
<img src="https://assets.tangled.network/home-page-prs.png" class="h-full w-[200%] md:w-full object-cover object-left" />
172
</div>
173
</div>
174
+
<a href="https://blog.tangled.org/stacking" class="hover:no-underline hidden md:inline-flex absolute -bottom-6 -right-12 items-center gap-2 p-3 text-base btn">
175
+
Learn more
176
+
{{ i "arrow-right" "size-4" }}
177
+
</a>
178
</div>
179
180
<div class="col-span-3 {{ $contentStyle }} peer-checked/knots:grid">
181
+
<div class="{{ $textContentStyle }} flex place-content-between gap-4 md:gap-8">
182
+
<section class="space-y-4">
183
+
<h1 class="{{ $titleStyle }}">Run it at home</h1>
184
+
<p class="text-gray-600 dark:text-gray-400">
185
+
Host your repositories on your own infrastructure with <a href="https://docs.tangled.org/knot-self-hosting-guide.html#knot-self-hosting-guide" class="no-underline">knots</a>.
186
+
Run CI on your own machines with <a href="https://docs.tangled.org/spindles.html#self-hosting-guide" class="no-underline">spindles</a>.
187
+
<br>
188
+
Don't want to self-host? All are welcome on our hosted instances.
189
</p>
190
</section>
191
+
<div class="w-fit hidden md:flex items-center">
192
+
<div class="size-32 rounded-full flex items-center justify-center bg-green-100 dark:bg-green-900 -mr-4" >
193
+
{{ i "workflow" "size-16 text-green-500 dark:text-green-500" }}
194
</div>
195
+
<div class="size-40 rounded-full flex items-center justify-center bg-indigo-100 dark:bg-indigo-900 z-10">
196
+
{{ i "server" "size-24 text-indigo-500 dark:text-indigo-500" }}
197
</div>
198
</div>
199
+
</div>
200
+
<div class="{{ $imgContentStyle }} min-h-[500px] relative overflow-hidden">
201
+
<div class="w-full h-full relative overflow-hidden">
202
+
<img src="https://assets.tangled.network/home-page-self-host.png" class="h-full w-[200%] md:w-full object-cover object-center" />
203
</div>
204
</div>
205
</div>
206
207
<div class="col-span-3 {{ $contentStyle }} peer-checked/spindles:grid">
208
+
<div class="{{ $textContentStyle }} flex place-content-between gap-4 md:gap-8">
209
+
<section class="space-y-4">
210
<h1 class="{{ $titleStyle }}">Nix-powered CI</h1>
211
+
<p class="text-gray-600 dark:text-gray-400">
212
+
Pick and choose dependencies for your CI pipelines from <a
213
+
href="https://docs.tangled.org/spindles.html#dependencies"
214
+
class="no-underline"><code>nixpkgs</code></a>, one of the biggest
215
+
package repositories.
216
+
<br>
217
+
Support for Docker and MicroVM based runners coming soon!
218
</p>
219
</section>
220
+
<div class="w-fit hidden md:flex items-center">
221
+
<div class="size-32 rounded-full flex items-center justify-center bg-green-100 dark:bg-green-900 -mr-4" >
222
+
{{ i "package" "size-16 text-green-500 dark:text-green-500" }}
223
</div>
224
+
<div class="size-40 rounded-full flex items-center justify-center bg-indigo-100 dark:bg-indigo-900 z-10">
225
+
{{ i "snowflake" "size-24 text-indigo-500 dark:text-indigo-500 rotate-12" }}
226
</div>
227
</div>
228
</div>
229
+
<div class="{{ $imgContentStyle }} flex items-end pb-0 overflow-hidden">
230
+
<div class="w-full h-full relative overflow-hidden">
231
+
<img src="https://assets.tangled.network/home-page-ci.png" class="h-full w-[200%] md:w-full object-cover object-left md:object-center" />
232
+
</div>
233
+
</div>
234
</div>
235
</div>
236
···
278
</script>
279
{{ end }}
280
281
{{ define "features2" }}
282
{{ $cardStyle := "bg-white dark:bg-gray-800 rounded shadow-sm border border-gray-200 dark:border-gray-700" }}
283
{{ $cardInnerStyle := "flex flex-row items-center gap-4 md:gap-6 p-4 md:p-6 md:pt-8 relative" }}
284
{{ $contentStyle := "flex-1 flex flex-col" }}
285
{{ $titleStyle := "text-xl md:text-2xl font-bold mb-2 md:mb-3 text-gray-900 dark:text-gray-100" }}
286
+
{{ $descriptionStyle := "text-gray-600 dark:text-gray-300 text-sm md:text-base leading-relaxed mb-5 md:mb-0" }}
287
+
{{ $linkMobileStyle := "hover:no-underline inline-flex md:hidden items-center gap-2 text-sm text-black dark:text-white font-medium" }}
288
{{ $iconContainerStyle := "relative shrink-0 w-24 h-24 md:w-48 md:h-48" }}
289
+
{{ $iconCircleStyle := "rounded-full flex items-center justify-center border border-gray-200 dark:border-gray-700" }}
290
{{ $linkDesktopStyle := "hover:no-underline hidden md:inline-flex absolute -bottom-10 -right-14 items-center gap-2 p-3 text-base btn" }}
291
292
<div class="w-full flex flex-col gap-6 md:gap-40 max-w-5xl mx-auto px-2">
293
<div class="{{ $cardStyle }} md:mr-32">
294
<div class="{{ $cardInnerStyle }}">
295
+
{{ $moreLink := "https://docs.tangled.org/quick-start-guide.html#login-or-sign-up" }}
296
<div class="{{ $contentStyle }}">
297
<h3 class="{{ $titleStyle }}">Built on AT Protocol</h3>
298
<p class="{{ $descriptionStyle }}">
···
303
<br>
304
Bring an existing AT Protocol account (such as your Bluesky
305
account), or signup for one with us.
306
</p>
307
+
<a href="{{ $moreLink }}" class="{{ $linkMobileStyle }}">
308
Learn more
309
{{ i "arrow-right" "size-4" }}
310
</a>
311
</div>
312
<div class="{{ $iconContainerStyle }}">
313
+
<div class="{{ $iconCircleStyle }} w-full h-full bg-blue-100 dark:bg-blue-900/50">
314
{{ i "at-sign" "size-12 md:size-24" "text-blue-500 dark:text-blue-500" "rotate-12" }}
315
</div>
316
+
<div class="{{ $iconCircleStyle }} absolute -top-2 -left-2 w-10 h-10 md:w-16 md:h-16 rounded-full bg-white dark:bg-gray-800 -rotate-12">
317
+
{{ i "globe" "size-4 md:size-8" "text-blue-500 dark:text-blue-500" }}
318
+
</div>
319
+
<a href="{{ $moreLink }}" class="{{ $linkDesktopStyle }}">
320
Learn more
321
{{ i "arrow-right" "size-4" }}
322
</a>
···
326
327
<div class="{{ $cardStyle }} md:ml-32">
328
<div class="{{ $cardInnerStyle }}">
329
+
{{ $moreLink := "https://tangled.org/core" }}
330
<div class="{{ $contentStyle }}">
331
<h3 class="{{ $titleStyle }}">Free and Open-source</h3>
332
<p class="{{ $descriptionStyle }}">
···
337
We welcome contributions however big or small. You can start contributing by picking up a
338
<a class="underline" href="https://tangled.org/tangled.org/core/issues">good-first-issue</a>.
339
</p>
340
+
<a href="{{ $moreLink }}" class="{{ $linkMobileStyle }}">
341
+
View source
342
{{ i "arrow-right" "size-4" }}
343
</a>
344
</div>
345
<div class="{{ $iconContainerStyle }}">
346
+
<div class="{{ $iconCircleStyle }} w-full h-full bg-green-100 dark:bg-green-900/50">
347
{{ i "package-open" "size-12 md:size-24" "text-green-500 dark:text-green-500" "-rotate-12" }}
348
</div>
349
+
<div class="absolute -top-2 -left-2 w-10 h-10 md:w-16 md:h-16 rounded-full bg-white dark:bg-gray-800 flex items-center justify-center border border-gray-200 dark:border-gray-700 rotate-12">
350
+
{{ i "heart" "size-4 md:size-8" "text-green-500 dark:text-green-500" }}
351
+
</div>
352
+
<a href="{{ $moreLink }}" class="{{ $linkDesktopStyle }}">
353
+
View source
354
{{ i "arrow-right" "size-4" }}
355
</a>
356
</div>
···
359
360
<div class="{{ $cardStyle }} md:mr-32">
361
<div class="{{ $cardInnerStyle }}">
362
+
{{ $moreLink := "/timeline" }}
363
<div class="{{ $contentStyle }}">
364
<h3 class="{{ $titleStyle }}">Social coding is back</h3>
365
<p class="{{ $descriptionStyle }}">
···
370
friends on Bluesky, you will find them on Tangled with the same
371
handle.
372
</p>
373
+
<a href="{{ $moreLink }}" class="{{ $linkMobileStyle }}">
374
+
Explore timeline
375
{{ i "arrow-right" "size-4" }}
376
</a>
377
</div>
378
<div class="{{ $iconContainerStyle }}">
379
+
<div class="{{ $iconCircleStyle }} w-full h-full bg-amber-100 dark:bg-amber-900/50">
380
{{ i "message-circle-heart" "size-12 md:size-24" "text-amber-500 dark:text-amber-500" "rotate-12" }}
381
</div>
382
+
<div class="absolute -top-2 -left-2 w-10 h-10 md:w-16 md:h-16 rounded-full bg-white dark:bg-gray-800 flex items-center justify-center border border-gray-200 dark:border-gray-700 -rotate-12">
383
+
{{ i "users" "size-4 md:size-8" "text-amber-500 dark:text-amber-500" }}
384
+
</div>
385
+
<a href="{{ $moreLink }}" class="{{ $linkDesktopStyle }}">
386
+
Explore timeline
387
{{ i "arrow-right" "size-4" }}
388
</a>
389
</div>
···
486
<span>{{ .RepostCount }}</span>
487
</div>
488
<div class="flex items-center gap-1">
489
+
{{ i "message-square" "size-4 -scale-x-1" }}
490
<span>{{ add64 .ReplyCount .QuoteCount }}</span>
491
</div>
492
</div>
···
505
<br>
506
<a href="https://docs.tangled.org/quick-start-guide.html#login-or-sign-up">Read more on the docs.</a>
507
</p>
508
+
<form class="flex gap-2 items-stretch w-full md:max-w-md mx-auto p-2 border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 rounded shadow-sm" method="get" action="/signup">
509
<input
510
type="email"
511
id="email"
512
+
name="id"
513
tabindex="4"
514
required
515
placeholder="Enter your email"
+19
-1
input.css
+19
-1
input.css
···
288
}
289
290
.animate-marquee {
291
+
animation: scroll 60s linear infinite;
292
}
293
294
.animate-marquee:hover {
···
310
.animate-progress {
311
animation: progress 5s linear forwards;
312
}
313
+
314
+
@keyframes fadeIn {
315
+
from { opacity: 0; }
316
+
to { opacity: 1; }
317
+
}
318
+
319
+
@keyframes fadeOut {
320
+
from { opacity: 1; }
321
+
to { opacity: 0; }
322
+
}
323
+
324
+
.animate-fadein {
325
+
animation: fadeIn 0.25s ease-in forwards;
326
+
}
327
+
328
+
.animate-fadeout {
329
+
animation: fadeOut 0.25s ease-out forwards;
330
+
}
331
}
332
333
}
History
5 rounds
1 comment
1 commit
expand
collapse
appview/pages: add icons to timeline preview
Signed-off-by: oppiliappan <me@oppi.li>
1/3 failed, 2/3 success
expand
collapse
expand 0 comments
pull request successfully merged
1 commit
expand
collapse
appview/pages: add icons to timeline preview
Signed-off-by: oppiliappan <me@oppi.li>
1/3 failed, 2/3 success
expand
collapse
expand 0 comments
1 commit
expand
collapse
appview/pages: add icons to timeline preview
Signed-off-by: oppiliappan <me@oppi.li>
re-author commit?