contacts: each letter beside its card, not over it
A heading row between every pair of cards spread the list out. The
letter now sits in a narrow column at the card's left, on the first
row's name line, and the cards close up to the s step.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfL6MhttDTmvaQkrMSCska
change
commit d051a766933228d04ef534c34be286feedfba177
author Claude <noreply@anthropic.com>
date
parent 92ff2c51
diff --git a/public/admin.css b/public/admin.css
index 3b41fe9..dd41bca 100644
--- a/public/admin.css
+++ b/public/admin.css
@@ -649,17 +649,29 @@ section > h2 {
 }
 
 /* /contacts' rows, one card per first letter (ContactsIndex's
-   letter_groups). The letter is a caption for its card the way a
-   section's heading is for its list, so it keeps a tighter step to
-   its own card than the cards keep to each other: each letter reads
-   as the head of the card under it, not the foot of the one above. */
+   letter_groups), the letter in a narrow column at the card's left
+   rather than a heading over it: a heading row between every pair of
+   cards spread the list out, and at the side the letter still marks
+   where its card starts. The column fits "#" and a W alike. The
+   letter sits on the first row's name line: the row's own top
+   padding, then a line box as tall as the row's (Gloss's .card > li
+   sets step--1, the body's 1.55 carries), so the label's text
+   centers where the name's does. */
 .letter-groups {
   display: flex;
   flex-direction: column;
-  gap: var(--gl-space-m);
+  gap: var(--gl-space-s);
+}
+.letter-groups > section {
+  display: grid;
+  grid-template-columns: 1.5rem minmax(0, 1fr);
+  column-gap: var(--gl-space-xs);
+  align-items: start;
 }
 .letter-groups h3 {
-  margin-bottom: var(--gl-space-2xs);
+  margin: 0;
+  padding-block-start: var(--gl-space-xs);
+  line-height: calc(var(--gl-step--1) * 1.55);
 }
 
 /* base/typography.css's `li + li { margin-top: var(--gl-space-3xs); }`