This repository has no description
1{{ define "title" }}timeline{{ end }}
2
3{{ define "extrameta" }}
4 <meta property="og:title" content="timeline · tangled" />
5 <meta property="og:type" content="object" />
6 <meta property="og:url" content="https://tangled.org" />
7 <meta property="og:description" content="tightly-knit social coding" />
8{{ end }}
9
10{{ define "mainLayout" }}
11<div class="flex-grow">
12 <div class="max-w-screen-lg mx-auto flex flex-col gap-4">
13 <main>{{ block "content" . }}{{ end }}</main>
14 </div>
15</div>
16{{ end }}
17
18{{ define "content" }}
19<div id="timeline-grid" class="flex flex-col gap-4 lg:grid lg:grid-cols-3">
20
21 <div class="order-2 lg:order-none lg:col-span-2 lg:row-start-1">
22 {{ template "timeline/fragments/timeline" . }}
23 </div>
24
25 <div class="order-1 lg:order-none flex flex-col gap-6 lg:col-start-3 lg:row-start-1">
26 {{ if .ShowNewsletter }}
27 <div id="newsletter-col" class="order-first lg:order-last">
28 {{ template "timeline/fragments/newsletterWidget" . }}
29 </div>
30 {{ end }}
31 {{ template "timeline/fragments/trendingSidebar" . }}
32 </div>
33</div>
34
35{{ if .ShowNewsletter }}
36<script>
37 (function() {
38 var DISMISS_KEY = 'newsletter-dismissed';
39 var newsletterCol = document.getElementById('newsletter-col');
40 if (!newsletterCol) return;
41
42 // hide removes the widget from the DOM without persisting anything.
43 // Used when this browser's localStorage says we already dismissed in a
44 // past session — the server has already told us .ShowNewsletter is true
45 // (no DB row), so we deliberately do NOT re-POST /newsletter/dismiss
46 // here: that would clobber a 'subscribed' row created from another
47 // device after this localStorage entry was set.
48 function hide() {
49 newsletterCol.remove();
50 }
51
52 // dismiss is the user-initiated path. Persists both locally and (for
53 // logged-in users) server-side so the widget stays hidden on all their
54 // devices.
55 function dismiss() {
56 hide();
57 try { localStorage.setItem(DISMISS_KEY, '1'); } catch (e) {}
58 fetch('/newsletter/dismiss', { method: 'POST', credentials: 'same-origin' })
59 .catch(function () { /* localStorage is the fallback */ });
60 }
61
62 try {
63 if (localStorage.getItem(DISMISS_KEY) === '1') {
64 hide();
65 return;
66 }
67 } catch (e) { /* storage disabled; keep widget visible */ }
68
69 newsletterCol.addEventListener('click', function(e) {
70 if (e.target.closest('[data-newsletter-dismiss]')) dismiss();
71 });
72 })();
73</script>
74{{ end }}
75{{ end }}