Diffdown is a real-time collaborative Markdown editor/previewer built on the AT Protocol
diffdown.com
1{{template "base" .}}
2{{define "content"}}
3<div class="dashboard">
4 <div class="dashboard-header">
5 <h2>Your Documents</h2>
6 <div style="display:flex;align-items:center;gap:1rem">
7 <div class="view-toggle">
8 <button id="btn-cards" title="Card view" onclick="setView('cards')">⊞</button>
9 <button id="btn-list" title="List view" onclick="setView('list')">≡</button>
10 </div>
11 <a href="/docs/new" class="btn">New Document</a>
12 </div>
13 </div>
14 <div class="repo-list" id="doc-list">
15 {{range .Content.OwnDocs}}
16 <a href="/docs/{{.RKey}}" class="repo-card">
17 <h3>{{.Title}}</h3>
18 {{if .UpdatedAt}}
19 <time>Updated {{.UpdatedAt | fmtdate}}</time>
20 {{else}}
21 <time>Created {{.CreatedAt | fmtdate}}</time>
22 {{end}}
23 </a>
24 {{else}}
25 <div class="empty-state">
26 <p>No documents yet.</p>
27 <a href="/docs/new" class="btn">Create your first document</a>
28 </div>
29 {{end}}
30 </div>
31
32 {{if .Content.SharedDocs}}
33 <div class="dashboard-header" style="margin-top:2rem">
34 <h2>Documents Shared with You</h2>
35 </div>
36 <div class="repo-list" id="shared-list">
37 {{range .Content.SharedDocs}}
38 <a href="/docs/{{.OwnerDID}}/{{.RKey}}" class="repo-card">
39 <h3>{{.Title}}</h3>
40 {{if .UpdatedAt}}
41 <time>Updated {{.UpdatedAt | fmtdate}}</time>
42 {{else}}
43 <time>Created {{.CreatedAt | fmtdate}}</time>
44 {{end}}
45 </a>
46 {{end}}
47 </div>
48 {{end}}
49</div>
50{{end}}
51{{define "scripts"}}
52<script>
53(function() {
54 function setView(v) {
55 var lists = [document.getElementById('doc-list'), document.getElementById('shared-list')];
56 var btnCards = document.getElementById('btn-cards');
57 var btnList = document.getElementById('btn-list');
58 lists.forEach(function(list) {
59 if (!list) return;
60 if (v === 'list') {
61 list.classList.add('list-view');
62 } else {
63 list.classList.remove('list-view');
64 }
65 });
66 if (v === 'list') {
67 btnList.classList.add('active');
68 btnCards.classList.remove('active');
69 } else {
70 btnCards.classList.add('active');
71 btnList.classList.remove('active');
72 }
73 localStorage.setItem('docView', v);
74 }
75 window.setView = setView;
76 setView(localStorage.getItem('docView') || 'cards');
77})();
78</script>
79{{end}}