fix(repo-appearance): unify spine header height and fold dot into icon
Spines with a repo icon were rendering 20pt taller than icon-less
spines (icon 14pt + 6pt vstack spacing), so the rotated titles drifted
out of alignment across the shelf row — the most visible artifact in
the screenshot from manual QA.
Restructure `ShelfSpineHeader` around a constant-sized 18pt slot at
the top of every spine:
- **Reserved slot**: a `ZStack` with `Color.clear.frame(18×18)` always
rendered, so the slot occupies the same space whether or not it
hosts content. Header height becomes constant
(8 top + 18 slot + 8 vstack + 160 title = 194pt) and titles
realign across spines.
- **Notification folded into icon**: when an icon is set and there's
an unseen notification, the orange dot renders as a 6pt corner
badge at the icon's top-trailing (offset 3,-3) with a thin
`black.opacity(0.25)` stroke for contrast on tinted spines —
macOS app-icon style. The badge sits inside the 18pt slot and
doesn't push layout.
- **Standalone dot retained**: when there's no icon but a
notification exists, fall back to the original standalone
`aggregatedDotSize` orange dot centered in the slot. Behavior for
appearance-less repos is unchanged.
- **More breathing room**: VStack spacing 6 → 8, top padding 0 → 8,
so the slot sits a bit lower from the spine's top edge and reads
less crowded against the header. The two extra pixels around the
icon ring (slot 18pt vs icon 14pt) give the icon and badge their
own margin.