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.
An account carrying a role sees everything above, unchanged, plus a labelled section beneath it. Admin mode's ruling is one surface, rows cut by role — moderators work on the phone, on the same screens everyone else uses, so the moderator's profile is the visitor's profile with a tray appended. There is no moderator-only profile screen.
Section 01 rules that three rows do not need chapters. Six do, and this one carries a specific risk the label exists to defuse: Block and Ban sit inches apart and mean completely different things. Block is personal and yours alone. Ban is the platform speaking. A moderator who confuses them at speed does real damage, so the tray is fenced and named.
This is the doctrine doing real work rather than decorating. Standing in front of a working account, a moderator is offered nothing they cannot take back, and can see that at a glance without reading a label.
The tray's ban is the quiet one: the account keeps working from the inside and reaches nobody from the outside. It is reversible on purpose, and the same row that applied it lifts it.
The row reads the account's real standing before it draws itself, so a moderator never guesses whether a ban is already in place. Once banned it becomes Lift the ban — a verb, like Close is for journeys — and its footnote carries the record that matters when you are deciding whether to reverse: when, who, and why.
And a fourth row appears that was not there a moment ago. Ban them for good is reachable only from an account that is already quietly banned. That is the whole safety model: the destructive act is never one tap from a profile, it is one tap from a decision you already made and a review you have already done.
Risk arrives faster than certainty. The tray is shaped around that: stop the harm first, decide afterwards, and never let the deciding step be one you cannot take back.
A quiet ban takes effect instantly for everyone else and is invisible to the account it lands on. Nothing is destroyed, no session is killed, no file leaves the CDN. If the moderator called it wrong, lifting it puts the person back exactly as they were, and they never knew. That is what makes it safe to be fast.
Banning for good closes the session and permanently deletes every photo and video the account ever uploaded. That is the right answer to an account farm and a terrible thing to reach by accident, on a product whose whole promise is looking back. It sits behind step 1 so it can never be the first thing a moderator does.