Every step in Stepo carries media — a photo or a video; the composer requires it. Today a step carries one; if steps ever carry several, this viewer becomes a horizontal pager with faint page dots and nothing else changes — the contract below is per-media. Cards are navigation — tapping a feed card, chapter card, or grid tile (media included) opens the step detail, which shows the media whole; only the detail's media tap opens this viewer. Glance-crop → whole media → zoom: each tap earns more of the image. This is that viewer, and its whole discipline is restraint: it is a lightbox, not a surface. It adds nothing to the media, carries zero social actions, and leaves exactly the way it came. Media sits on carbon — the app's dark video surface — shown whole and letterboxed, never cropped. No context travels in at all: the note, the date and every social act stayed on the step, one dismiss away — and step detail, the only screen that opens this one, still has them.
The default on open. A photo centered at its natural aspect, letterboxed by carbon — never cropped, never stretched. Chrome is two things only: a round X hit-area top-left on a faint dark disc. Top-right is nothing, and so is the bottom edge.
Nothing is carried in. Who posted, the note, the date, hearts, comments, the journey — all of it stayed on the step, which is the only screen that can open this one. Entering is a shared-element move: the media fades and scales up from the tapped media; leaving reverses it back into place.
The same stage, the same photo, zero chrome — pure carbon and media. A single tap toggles the chrome away and back. The viewer opens chrome-visible every time and remembers nothing about the last state.
Chrome is a veil you can lift and drop with a single tap. It is state, not memory — reopen the viewer and it is chrome-visible again. Zoom hides chrome too: pinch or double-tap to enlarge, and while zoomed a swipe pans the photo rather than dismissing.
A step's video, on the same carbon stage. A centered play / pause glyph, and a thin transport at the bottom: a 2px line where the played portion is --w and the rest is --wline, a small round scrub handle, and elapsed / remaining times below it. No fullscreen button — it already is.
The feed autoplays muted; the viewer is where you chose to watch, so it plays with sound on. Tap toggles play / pause; the thin line scrubs. There is no fullscreen button because the viewer already is fullscreen, and the transport fades away with the rest of the chrome on a tap.
Caught mid-drag. Swipe down and the media follows your finger — translating down, scaling toward 0.82 — while the carbon scrim thins and the paper step screen fades back in behind it. Chrome is already gone. The X is there for the tap-minded; the gesture is the real door.
Swipe-down dismisses from anywhere, at any zoom level — the media tracks your finger and the carbon scrim thins to reveal the step screen you came from. Release past the threshold and it completes; release short and it springs back. The X exists for people who'd rather tap, but the gesture is the primary way out.
The rules that keep the viewer a lightbox instead of another feed surface. Every social act, every affordance that would turn the media into a place, lives elsewhere — on the step, one dismiss away.
The viewer's job is to disappear.