list: replace thread hairlines with indent and whitespace
Assisted-by: Claude Opus 5.5 via Claude Code
change onsmvzttwtovyrztyszltuxzozxplmxk
commit 2e785341e76cafc660fd5c83a03db7ac1f0f419e
author Alpha Chen <alpha@kejadlen.dev>
date
parent ssxsqnyx
diff --git a/assets/docket.css b/assets/docket.css
index 8f4a845..221013a 100644
--- a/assets/docket.css
+++ b/assets/docket.css
@@ -47,23 +47,25 @@ button { font: inherit; color: inherit; }
 .who-name { font-weight: 600; }
 .who-login { text-transform: none; letter-spacing: 0; color: var(--gl-color-text-tertiary); }
 
-/* ── the list: one card holding ledgers ── */
+/* ── the list: one card; each thread hangs its messages off a rail ── */
 .list { background: var(--gl-color-surface-card); border-radius: 6px; padding: var(--gl-space-m) var(--gl-space-m) 0; display: flex; flex-direction: column; gap: var(--gl-space-m); min-height: 0; overflow-y: auto; }
 .list-head { display: flex; justify-content: space-between; align-items: baseline; }
 .list-head h1, .thread-head h2 { font: 600 var(--gl-step-0)/1.2 var(--gl-font-text); letter-spacing: -.01em; }
 .section-head { display: flex; justify-content: space-between; }
 .section-head .sub { color: var(--gl-color-text-tertiary); }
-.group { display: flex; flex-direction: column; padding: var(--gl-space-s) 0; }
-.group-head { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; padding-bottom: var(--gl-space-3xs); }
+.groups { display: flex; flex-direction: column; gap: var(--gl-space-m); padding: var(--gl-space-s) 0 var(--gl-space-m); }
+.group { display: flex; flex-direction: column; gap: var(--gl-space-3xs); }
+.group-head { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
 .subj { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
 .more { color: var(--gl-color-text-tertiary); white-space: nowrap; }
+.rail { display: flex; flex-direction: column; gap: 2px; padding-left: 6px; }
 .row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 10px; padding: 6px 8px 8px 10px; margin-right: -8px; border-radius: var(--gl-radius); color: var(--gl-color-text-secondary); text-decoration: none; transition: background var(--gl-dur-fast) var(--gl-ease); }
 .row:hover { background: var(--gl-color-surface-fill); color: var(--gl-color-text-secondary); }
 .row.sel { background: var(--gl-color-surface-fill); }
 .row .from { flex: 1 1 0; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
 .row.unread .from { font-weight: 500; color: var(--gl-color-text-primary); }
 .row .age { flex: none; width: 76px; text-align: right; font-size: var(--gl-step--2); white-space: nowrap; }
-.row .snip { flex: 0 0 100%; font-size: var(--gl-step--2); line-height: 1.5; color: var(--gl-color-text-tertiary); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
+.row .snip { flex: 0 0 100%; font-size: var(--gl-step--2); line-height: 1.5; color: var(--gl-color-text-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
 
 /* ── the thread: each email its own card, comments bare between them ── */
 .reader { min-height: 0; overflow-y: auto; }
diff --git a/src/views.rs b/src/views.rs
index 71205cc..6814425 100644
--- a/src/views.rs
+++ b/src/views.rs
@@ -198,7 +198,7 @@ fn list_section(p: &Page<'_>, section: &Section<'_>) -> Markup {
                     span.sub { (section.sub) }
                 }
             }
-            div.gl-ledger {
+            div.groups {
                 @for group in &section.groups {
                     div.group {
                         div.group-head {
@@ -207,8 +207,10 @@ fn list_section(p: &Page<'_>, section: &Section<'_>) -> Markup {
                                 span.type-label.more { (more) }
                             }
                         }
-                        @for m in &group.rows {
-                            (row(p, m, section.compact))
+                        div.rail {
+                            @for m in &group.rows {
+                                (row(p, m, section.compact))
+                            }
                         }
                     }
                 }