Spec board · profile sheet

The profile sheet is a tool tray

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.

Danger ink marks irreversible destruction. Reporting protects someone, and a block is lifted from Settings › Blocked accounts. Neither destroys anything, so both stay ink. The sheet with no delete has no red in it.

01 The sheet

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.

Someone else's profile
Chau Test 1
@chautest1 · 1 follower · 1 following

Why these three

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.

  • Row anatomy is step-sheet.html verbatim: 24px line-icon, 14px gap, 16px w600 label, ~56px tap height, hairline rules between rows.
  • No section headers and no card chrome. Three rows do not need chapters.
  • No footnotes on any row: each label is already the whole promise.
The sheet is the app's store-required safety surface. Report and Block must be reachable in two taps from any profile, and they are: kebab, then row.

02 The block confirm

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.

After tapping Block
Chau Test 1
@chautest1
Block Chau Test 1?
You stop seeing each other's steps and journeys, and any follows between you are removed. You can unblock in Settings, but the follows will not come back.

Reversibility is stated, not implied

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.

  • Headline is Archivo w800, the name inside it, question mark and all.
  • The primary button says what happens ("Block"), never "Confirm".
  • The secondary is muted "Cancel" and never the primary. The legacy inversion, where the loud button backed out, is banned everywhere.

03 What the app shipped, and what changed

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.

Legacy → ruled
ShareKept
ReportRedrawn
BlockRedrawn

A grammar, not a rewrite

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.

  • Report gains the board's flag glyph and the fuller label "Report profile".
  • Block gains the board's person-and-cross glyph at the same stroke weight as its neighbours.
  • Row height goes 48 → 56, label 17 regular → 16 semibold, and the rows become full-bleed so the hairlines read edge to edge.

04 The moderation section staff only

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.

Someone else's profile · viewer is staff

The section header earns itself

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.

An active account has no red on it

Ink — reversible. Reading a report changes nothing, and a ban lifts cleanly from this same row.
Danger — irreversible, and absent here. It appears only once the account is already banned (section 05).

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.

  • Reports about them is the only row with a live count, because the count is the reason you would tap it. No reports, no row.
  • Ban this person carries the only footnote on the sheet. "Ban" alone does not say which ban this is, and that ambiguity is the dangerous kind.
  • Rows are ordered read, then act. Destroying is not on this page.
Your own profile never shows this section, and neither does a teammate's: nobody bans themselves, and no moderator can act on staff at or above their own tier.

05 Ban, and its way back

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.

After tapping Ban
Chau Test 1
@chautest1
Ban Chau Test 1?
They keep their account and can still post. Nobody else sees them or anything they make. You can lift this from their profile at any time.
Why you are banning them

The ladder is the safeguard

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.

06 The moderator's actual working order

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.

The ladder
1 · Something looks riskyBan, quietly
2 · Read the reports, look at the accountNo rush
3a · It was fineLift the ban
3b · It was notBan them for good

Step 1 costs nothing to be wrong about

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.

Step 3b is where the weight is

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.

Fast where it is reversible, slow where it is not. The ladder is the safeguard, not the distance.