The "···" on someone else's profile. Three rows, each doing one real thing: Share, Report profile, Block. It inherits the step sheet's grammar exactly, because it is the same kind of object. What it adds is a ruling on ink: neither Report nor Block is danger ink. This sheet spends none.
Always someone else's profile: your own profile carries the settings gear instead, so there is no owner variant of this sheet. Rows sit in the order you would reach for them, which is also least-consequential first.
Share posts the public stepo.app/@username link through the
system sheet. It is the only row here that is about wanting more of someone.
Report profile opens the categorised report sheet (report.html),
which is anonymous and says so. Never "Report user" — Stepo has people, and the
thing being reported is the profile in front of you.
Block asks once, then leaves the profile it has just made unreachable. Landing back on a page you can no longer see is the bug this avoids.
One question, one honest consequence, then the ink CTA. The confirm grammar is the step sheet's, with the primary in carbon rather than danger, for the same reason the row is ink.
The second sentence is load-bearing. It is what makes carbon the right ink: the person is told, in the moment of deciding, that the door reopens. It also refuses the easy half-truth, because unblocking does not restore the follows the block severed.
The legacy body promised blocking would stop someone tagging you. Stepo has no tagging, and never has. Copy on a safety surface has to be checkable against the code; this one was not.
The legacy sheet was never drawn, so it drifted: a different row component
(OptionWidget, 48px pill rows with 17px regular labels) and asset icons
instead of the board's line-icons. The rows themselves were right.
No row was cut and none was added: this sheet already earned all three. What changed is that it now speaks the same visual language as the step sheet, from one shared component rather than two drifting copies.