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.