Skip to content

feat(snapshot): put the Snapshot control on the real status moments - #6603

Draft
tomeredlich wants to merge 2 commits into
snapshot-status-momentsfrom
snapshot-in-product
Draft

feat(snapshot): put the Snapshot control on the real status moments#6603
tomeredlich wants to merge 2 commits into
snapshot-status-momentsfrom
snapshot-in-product

Conversation

@tomeredlich

@tomeredlich tomeredlich commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Stacked on #6581 — base retargets to main once that merges.

#6581 draws the status moments on a review page and argues where the Snapshot control belongs. This puts it on the real surfaces.

Changes

Behind snapshot_share, default false, so control hides it entirely.

  • NewStreakModal — labelled Primary under the freeze upsell.
  • AchievementCard — XSmall icon beside the points, on unlocked cards only. The flag is evaluated with shouldEvaluate={isUnlocked}, so locked cards never enroll a viewer.
  • UserTopList — XSmall Float on the row, revealed on hover or keyboard focus.
  • posts/[id]/analytics — labelled Primary under the discovery stats, where the numbers have just made the case. Not in the header, per the review.
  • New features/snapshot/: SnapshotButton and the useSnapshotShare gate.

Not in this PR

Capture is not built. Rasterizing a surface to an image lands with #6426, which is still open, so SnapshotButton takes an onClick seam and does nothing when pressed. This PR is the placement and the flag; the payload plugs into that seam.

ListAwardsModal is left alone. The review argues for a control in its header, but the file fails typecheck:strict:changed on pre-existing errors the moment it is touched (never types around the awards query, a nullable header element). Fixing those is unrelated to this change — worth its own PR.

One design caveat worth a decision: the leaderboard control is hover-gated, so it does not exist on touch. #6581 flags this in its own copy. A rank band above the board would work everywhere; that is a design call, not a code one.

Events

None yet — the control has no action to log until capture lands.

Experiment

snapshot_share, default false. Flip it in GrowthBook to preview.

Testing

  • eslint clean on shared and webapp.
  • typecheck:strict:changed clean.
  • shared: 368 suites / 2,682 tests. webapp: 81 / 648. extension: 6 / 52.

🤖 Generated with Claude Code

Preview domain

Not published for review — run Storybook locally instead.

The control existed only on the /dev/status-moments review page. This wires
it into the surfaces that page argues for, behind snapshot_share (default
off, control hides it entirely).

- NewStreakModal: labelled Primary under the freeze upsell.
- AchievementCard: XSmall icon beside the points, unlocked cards only.
- UserTopList: XSmall Float on the row, revealed on hover or focus.
- posts/[id]/analytics: labelled Primary under the discovery stats, where
  the numbers have just made the case.

Capture is not built — rasterizing a surface lands with #6426 — so the
button takes an onClick seam and does nothing until that arrives.

ListAwardsModal is left alone: it fails the strict-mode guard on its own
pre-existing errors as soon as it is touched, and fixing those is unrelated
to this change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
daily-webapp Ready Ready Preview Sep 8, 2026 9:47am UTC
1 Skipped Deployment
Project Deployment Actions Updated
storybook Ignored Ignored Sep 8, 2026 9:47am UTC

Request Review

The Snapshot control had no payload — pressing it did nothing. This brings
the share-image cards across from #6544, including the layout that lands
there now: the surface label rides the logo row on the far right via the
frame's logoAside slot, rather than sitting above the content as a headline.

- StreakSnapshotCard on the streak milestone popup.
- AchievementSnapshotCard on an unlocked achievement.
- LeaderboardSnapshotCard on a leaderboard row.
- SnapshotButton rasterizes the card off-screen on press, then hands the PNG
  to the native share sheet, the clipboard, or a download.

Only the three cards these surfaces use are copied, with the frame, eyebrow,
identity, level ring, stats and gradient they depend on. The other eleven
cards on #6544 have no surface here.

Adds @zumer/snapdom and lib/imageShare, also from #6544.

The post analytics control goes: #6544 has no card for that surface, so
there is nothing for it to capture yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant