fix: link collection source avatars, and fix profile horizontal strips - #6381
Merged
tsahimatsliah merged 4 commits intoJul 29, 2026
Merged
Conversation
Collection/brief source avatars rendered as bare images, so clicking one fell through to the post link. They now navigate to the source page, like the single source avatar on article cards. The profile achievement showcase strip had no overflow handling, so a full showcase made the whole profile page scroll horizontally on mobile. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The page wraps every section in p-6, so the achievement showcase, the activity feed and the mobile Highlights row all clipped 24px short of the page edge — the content read as abruptly cut off rather than continuing off-screen. Each scroll container now cancels that padding and re-applies it inside, so it clips at the card edge while its items stay aligned with the section heading. Activity's overflow-hidden guard is gone: the feed grid scrolls itself, and the guard would have clipped the bleed straight back. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- SourceAvatarLink forwards its ref in the no-permalink branch. Radix's hover card trigger composes a ref onto it, and the discarded ref left the trigger without an anchor node. Props are typed against HTMLElement so the spread is valid on both the anchor and the span. - Scope the feed bleed to .grid.snap-x. As plain .grid it matched every descendant grid, including the bare `grid` class on list cards' metadata row, where negative margins would be visible. - Restore an overflow guard on the replies tab only. The posts/upvoted feeds scroll themselves, but replies are plain content, so wide markdown could widen the page again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
capJavert
reviewed
Jul 28, 2026
capJavert
left a comment
Contributor
There was a problem hiding this comment.
First-pass review is clear: I found no blocking code issue, and the current CI checks are green. Holding the formal approval for the final reviewer.
capJavert
approved these changes
Jul 28, 2026
capJavert
left a comment
Contributor
There was a problem hiding this comment.
Approved after first-pass review; no blocking code issues found and CI was green.
tsahimatsliah
deleted the
claude/source-images-achievements-scroll-09f901
branch
July 29, 2026 06:27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changes
Two unrelated bug fixes.
1. Collection/brief source avatars are not clickable
Article cards render their source avatar through
SourceButton→ProfileImageLink, i.e. a real<a href={source.permalink}>. The collection and brief stacks rendered a bare<img>inside adiv, so clicking a source circle fell through to the card's post link instead of going to the source.SourceAvatarLink(components/profile/source/SourceAvatarLink.tsx) — aforwardRefanchor wrappingSourceAvatar, pointing atsource.permalink(correct for squads too, whose permalink is/squads/…, not/sources/…).forwardRefis required because Radix'sHoverCard.Trigger asChildclones it, so the existing hover cards keep working. Falls back to a bare avatar when the source has nopermalink.CollectionSourceStack(collection grid + list cards, brief card) andCollectionPillSources(brief card, brief/digest post pages).POST_BY_ID_QUERY/POST_BY_ID_STATIC_FIELDS_QUERYonly selectedcollectionSources { handle image }, so post-page avatars had no URL to link to — addednameandpermalink. The feed fragment already selected both.No double navigation: the card's own link is an
absolute inset-0sibling overlay andCard.module.cssgives descendant anchorsz-index: 1, so the avatar wins — the same mechanism article cards already rely on.2. Achievement showcase makes the whole profile page scroll horizontally
ProfileAchievementShowcaserendered its tiles as a plainflex gap-3ofshrink-064px items. A full showcase (5 tiles = 368px) is wider than the content column at mobile widths, and with nothing clipping it the overflow propagated to the document — the entire profile page scrolled sideways.no-scrollbar … overflow-x-auto(the pattern already used byArchiveEntryCard,RelatedEntities,SquadsList), plusmin-w-0on the section root. Nooverflow: hiddenanywhere on the page — only the strip scrolls.overflow-x-autoclips both axes, which would have cut the rarity glow andRaritySparklesthat deliberately escape each tile.px-2 py-2gives them room and-mx-2 -my-2cancels it, so nothing shifts visually.3. Horizontal strips clip short of the page edge
The profile page wraps every section in
p-6, so each horizontally scrolling strip clipped 24px short of the page edge — the content read as abruptly cut off rather than continuing off-screen. Measured on the preview at 390px, all three strips ended at x=373/365 against a 390px viewport.New
profileStripBleed(features/profile/common.ts) cancels that padding and re-applies it inside the scroll container, so a strip clips at the card edge while its items stay aligned with the section heading. Applied to:ProfileAchievementShowcase— the showcase strip.Activity→HORIZONTAL_FEED_CLASSES— the posts/upvoted feed, scoped to the feed's own.gridscroll container, plusscroll-px-6so snapped cards still align with the heading.Activity'soverflow-hiddenguard is removed: the feed grid scrolls itself, and the guard would have clipped the bleed straight back.ProfileWidgets— the mobile "Highlights" row, reset withlaptop:mx-0 laptop:px-0because at laptop the same component is the sidebar column, not a strip.Events
No new tracking events.
Experiment
No new experiments.
Manual Testing
Measured the old vs. new markup against the app's compiled CSS at 375px: the old markup gives the container a
scrollWidthof 392 against a 375px viewport (the reported bug); the new markup stays at 375 with the strip itself scrolling (343px visible / 384px content) and the hidden scrollbar taking 0 height.The profile page can't be loaded on a local dev server —
/joudawadis SSG and fails on "Failed to load static props" without the backend — so the layout was verified on the preview deploy instead. Still worth a click-through on a collection card's source circles.On the preview deploy at 390px, all three strips now span x=1→389 (the full card width) with the page itself still not scrolling horizontally (
document.scrollWidth390 = viewport). At 1280px the activity feed spans the card's inner edges (175→845) and the sidebar widgets are unchanged (862→1146, margin/padding 0).CollectionGridtest asserting the avatar renders as an<a href>to the source permalink.packages/shared: 39 suites / 235 tests pass (cards + post).packages/webapp: 44 suites / 297 tests pass.scripts/typecheck-strict-changed.jsclean.🤖 Generated with Claude Code
Preview domain
https://claude-source-images-achievement.preview.app.daily.dev