Skip to content

feat(snapshot): status moments review page - #6581

Open
tomeredlich wants to merge 11 commits into
mainfrom
snapshot-status-moments
Open

feat(snapshot): status moments review page#6581
tomeredlich wants to merge 11 commits into
mainfrom
snapshot-status-moments

Conversation

@tomeredlich

@tomeredlich tomeredlich commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Updates the Features/Snapshot/Surfaces/Status moments story with the latest iteration of the Status moments review. Storybook only: no production code changes.

Background

This started as a /dev/status-moments page in the webapp, split out of #6544. Since then #6556 removed the pages/dev review surfaces, and #6544 shipped the same section as a Storybook story. After merging main, the branch was a second, newer copy of that story living in production code, so the page is gone and its later iterations now live in the existing story instead.

What changes in the story

  • Reading streak: the milestone popup redrawn on the milestone-rewards design: Inferno tier art over the ember wash, tier chip, day count, week strip, then Snapshot and No thanks. It reuses FlameBadge, TierName, DayStrip, EmberPanel and NoThanks from the milestone-rewards stories, and the Inferno milestone from its ladder, instead of copying their gradients.
  • Streak tier milestones: the same celebration panel with a single Snapshot under it.
  • Achievements: the real "Can't spend it all" achievement with its production description and points.
  • Leaderboard and awards: drawn with the real ProfilePicture and TopRankBadge, on fictional readers.
  • Top reader badge: the modal's real title and Download button, with Snapshot beside it.
  • Awards: the awards screen adds an icon control beside close.
  • Copy: no em dashes, and no claim about how the audience splits across devices.

No fake stats or placeholder copy

The page shows no invented numbers about daily.dev's audience or reach, and no copy standing in for copy the product doesn't have.

  • Streak popup: no invented heading, sponsor line or reward rows.
  • Achievement card: no invented progress.
  • Leaderboard and awards: no real people's names, no invented level scores.
  • Top reader badge: no "Top N% of readers" line.
  • Post analytics: removed. The screen existed only to show invented reach numbers.
  • The story doesn't read rarity, subhead or partner offers from milestone-rewards/data.ts, so it keeps compiling if those fields are removed there.

What to look at

  • The story in Storybook: Features/Snapshot/Surfaces/Status moments.
  • Every control on the page is inert on purpose. This is a placement review, not a feature: no capture, no data wiring.

Removed from the branch

  • packages/webapp/pages/dev/status-moments.tsx and its host gate. pages/dev review pages don't ship.
  • packages/webapp/public/streak-tiers/inferno.png. Storybook already serves the identical file from packages/storybook/public/streak-tiers/.
  • The Snapshot icon this PR added originally is already on main (feat(snapshot): share placements for the post page #6556), byte for byte, so the branch no longer touches shared.

Events

None.

Experiment

None.

Testing

  • Storybook tsc: no errors in the story or milestone-rewards (the package has an unrelated backlog, and Storybook has no CI or strict typecheck).
  • Prettier clean on the story.
  • node ./scripts/typecheck-strict-changed.js origin/main: passes.
  • Rendered the story in local Storybook: all six screens draw, tier art loads, no console errors.
  • No shared, webapp or extension code changes, so no jest or webapp tsc run was needed.

Preview domain

Not published for review. Run Storybook locally instead.

Splits the "Status moments" section out of #6544 so it can be reviewed on its
own. Seven win moments that end in a dismiss — reading streak, achievements,
leaderboard rank, top reader badge, streak tiers, being awarded, and post
analytics — each drawn today / recommended / push.

Lives at /dev/status-moments alongside the existing /dev/buttons and
/dev/checkbox-radio review surfaces, so it renders in the real app shell
rather than in Storybook. Gated to non-production builds and noindex.

Adds the Snapshot icon the control needs. Everything on the page is inert:
no data wiring, no capture, no feature flag.

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

vercel Bot commented Sep 2, 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 10, 2026 1:12pm UTC
1 Skipped Deployment
Project Deployment Actions Updated
storybook Ignored Ignored Sep 10, 2026 1:12pm UTC

Request Review

The six surface docblocks walked through the JSX beneath them, and two
restated copy that the page already renders in its own `note` and `verdict`
props. The achievement block also described hover behaviour this page does
not implement. Replaced with the one-line source reference the analytics
screen already used, so each screen names the real component it redraws and
nothing else.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The screens hand-rolled five parts the design system already ships: the
reminder toggle, the opt-out checkbox, the achievement progress bar, the
leaderboard avatars and the rank badges were raw spans with styling typed
in directly.

Swapped for Switch, Checkbox, ProgressBar, ProfilePicture and TopRankBadge.
The rank column changes visibly and deliberately: TopRankBadge draws the
gold/silver/bronze medals the real leaderboard draws, replacing a 🥇 emoji
and "#2"/"#3" text.

Mockup-to-eng-pass: 1

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tomeredlich added a commit that referenced this pull request Sep 3, 2026
…o choose from

The Snapshot button becomes a Share button: the icon and label are the ones
people already recognise, and pressing it opens a menu that previews the
designed 1080² card before offering it.

The menu opens immediately with a skeleton rather than waiting on the render.
Rasterizing takes a second or two, and a control that does nothing visible for
that long reads as broken — so the capture is deferred a tick, letting the menu
paint first, and Copy link stays usable while the card is still rendering.

Seven layouts are up for review in Features/Snapshot/Menu styles, all live
against the same card: rows, rows-centred, an overlay pill on the card, a
compact no-preview variant, Tsahi's split button from #6369, and the two ways
the image can sit in the share modal — its own section or a single tile. The
`menuVariant` prop exists to serve that page and comes out with the losers.

The image is one action, not a mode over the sheet's other targets. A link needs
a destination, which is why there are twenty of them; an image does not, because
the OS share sheet and the clipboard are the destinations, and no web share
intent takes an image anyway. So the image owns its own action and the squads
and external tiles keep sharing the link — which is what keeps this on one
screen instead of two.

Pressing it hands the PNG to the native sheet where the platform takes files,
copies it to the clipboard otherwise (with a toast, since the clipboard has no
UI of its own), and downloads it only as a last resort.

Capture moves into `useSnapshotCapture` so the dropdown and the modal section
render from one implementation. Its `isActive` gate matters twice: a feed never
carries a 1080px card per item until someone asks to share, and because the
modal pre-renders on open, the click handler reaches `clipboard.write` with no
await in front of it — still inside the user gesture the clipboard requires.

Two surfaces had no card at all, from the #6579 and #6581 reviews:

- `FeedSnapshotCard` carries a shared feed's recipe — tags and source count —
  rather than its posts, which are a standing filter and would go stale.
- `AwardSnapshotCard` names the sender. It is the only status moment that comes
  from someone else, and a gift with no giver reads as self-congratulation.

Tsahi's `SplitShareButton` and `CopyStateIcon` come across from #6369 unchanged
apart from four additive props — `onOpenChange`, `header`, `menuLayout` and a
width override — so his grid is untouched when nobody passes them.

`SocialShareList`, `SocialShareButton` and `SocialShareContainer` gain optional
size and compact props, defaulting to today's values, so the dropdown can
tighten without moving anything else in the app.

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

The streak screens were drawn from the old popup: a 🔥 emoji with the count
overlaid, a text tier pill and a hand-built day row. The milestone-rewards
review (claude/milestone-rewards-storybook-764fa6, Milestone Rewards/Final
review) supersedes it.

Both screens now use that celebration panel — the Inferno tier artwork over
an ember wash, the tier chip, a tabular day count and the week strip — with
the first-party decision column under it: Cores and freezes as option rows,
then No thanks.

The streak popup no longer has a reminder toggle or a "never show this
again" checkbox, so Switch and Checkbox are gone with them.

Not brought over: the sponsored-gift half of that review (partner offers,
claim sheet, gift vault) and the ember and entrance animations. This page
compares control placement across eleven screens.

Mockup-to-eng-pass: 2

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every moment was drawn as a triplet — the surface as it ships, the
placement we want, and a louder push option — plus three moments listed
without a drawing at all. That made a page about a decision read as a
menu of decisions still open.

Each moment now shows the placement it argues for and nothing else. The
props that switched between the three states go with them, as does the
rail that only existed to sit before/after pairs side by side.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The screen drew the control twice: an icon in the header and a labelled
control under the stats. The header placement asks before the numbers have
made the case, so it goes; the control under the stats stays.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
An icon-only Tertiary control beside the close button, matching its weight,
so the moment can be captured from the header as well as from the cores row.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page gated on isDevelopment, so the Vercel preview showed the gate
message instead of the screens it exists to review. It now blocks the
canonical production hosts only, matching /dev/snapshot-happening-now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page lived at /dev/status-moments in the webapp. #6556 removed the
pages/dev review surfaces it sat next to, and #6544 shipped this same
section as the Features/Snapshot/Surfaces/Status moments story, so the
branch was a second, newer copy of that story served from production
code.

The designer's later iterations now replace the story instead: the
streak screens on the milestone-rewards design, one placement per
moment, the real ProgressBar, ProfilePicture and TopRankBadge, a single
control on post analytics, and the header control on awards. The
celebration panel reuses FlameBadge, TierName, DayStrip, EmberPanel and
NoThanks from the milestone-rewards stories rather than copying their
gradients, and the Inferno milestone comes from its ladder. The story
gets a QueryClientProvider like its siblings, since ProfilePicture
needs one outside the app shell.

The page, its host gate and the webapp copy of inferno.png are deleted;
Storybook already serves the same PNG from its public folder. Copy drops
the em dashes and a claim about the audience's device split.
…ments

The review page is now held to one rule: no invented statistics and no
copy standing in for copy the product doesn't have.

- Streak popup: remove the invented "Day 30 unlocked" heading, the
  "Nothing sponsored today" line and the made-up Cores and freeze reward
  rows. Snapshot now sits under the celebration, above No thanks.
- Achievement card: use the real "Can't spend it all" achievement, its
  description ("Spend 10000 Cores") and its 25 points, and drop the
  invented 8/10 progress bar, which the product only shows on locked
  achievements.
- Leaderboard and awards: fictional readers instead of real people, and
  no invented level scores next to them.
- Top reader badge: remove the "Top 1% of readers in #typescript" line.
- Post analytics: remove the screen. It existed only to show invented
  reach numbers, and its note argued from a "41k developers" claim.

The story reads only day, tier, label and headline from the milestone
ladder, so it keeps compiling whether or not the rarity and subhead
fields survive in milestone-rewards/data.ts.
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.

2 participants