Interaction

Every step decides what the user can touch while it is showing.

{ id: "post", target: "post-ride", interaction: "advance-on-press" }
Mode The target The rest of the screen Advances when
block (default) not pressable not pressable the user presses Next
passthrough fully interactive not pressable the user presses Next
advance-on-press press is caught by the tour not pressable the user presses the highlighted area

block

The safe default. A full-screen shield absorbs everything, including presses inside the hole, so the highlight is purely visual and nobody can wander off mid-tour.

Use it for anything explanatory.

passthrough

The shield is removed and the real element works normally. The tour does not advance by itself, so pair it with a step the user can leave through Next, or with a gate that resolves once they have done the thing.

{
  id: "try-filter",
  target: "filter",
  title: "Try a filter",
  interaction: "passthrough",
  gate: ({ context }) => context.hasFiltered,
  gateTimeoutMs: 30000,
  onGateTimeout: "skip",
}

Note what that costs you: the user's real press runs your real handler. If that handler navigates or mutates data, it happens mid-tour.

advance-on-press

The rest of the screen stays blocked, and a catcher sits over the hole. Pressing it advances the tour. The underlying element is not pressed.

That last part is deliberate and it is the same on both platforms. Letting the real press through would mean a tour step could fire a navigation or a mutation as a side effect, and it cannot be made to behave identically on React Native, where the library cannot attach a listener to your element. One behaviour everywhere beats a slightly richer one on web only.

On web the catcher is a real <button> with an accessible name, so a keyboard or screen-reader user can advance the same way.

The rule that matters

Never ask a user to press something that produces no visible change.

This is the reason action-driven tour steps get abandoned, and it is not a limitation of any mechanism. An early version of the tour this library grew out of said "Tap Find Pool" while Find Pool was already the selected segment. Pressing it did nothing visible, so the user could not tell whether the tour was broken or waiting on them. The step was correct, the copy was correct, and the experience was still bad.

Before you write an advance-on-press step, check that pressing it changes something the user can see. Advancing the tour itself counts, as long as the card visibly moves on.

Choosing

Reach for block unless you have a reason not to. Use advance-on-press when the gesture is the lesson, like "swipe here" or "tap the plus button". Use passthrough when the user genuinely needs to operate the app, and accept that their real handler runs.