Asia/Kolkata
ProjectsSeptember 18, 2025

Just a Walkthrough

image

npm versionBundlephobiaLicenseFormatted with BiomeLinted with BiomeChecked with Biome

Framework‑agnostic, zero‑dependency product tour / onboarding walkthrough with optional React helpers.
  • Spotlight highlight & darkened backdrop (3 panel overlay + focus ring)
  • Accessible keyboard navigation (Esc / Enter / ← →) + focus trap
  • Auto scroll + responsive reposition on scroll/resize/mutations
  • Step hooks (beforeStep / afterStep) & lifecycle callbacks
  • Chain multiple tours with persistence-aware skipping
  • LocalStorage progress persistence & resume support
  • Optional once‑per‑session logic via orchestrator helper
  • Custom tooltip renderer + theming (default, tailwind, unstyled)
  • Works with any DOM (vanilla, React, shadcn, portals)
  • Tiny, tree‑shakeable (no external deps)
startWalkthrough(steps, options) – convenience wrapper returning a Walkthrough instance. Walkthrough key methods:
  • start(index?) – begin tour (auto called by helper)
  • next()/prev()
  • finish() – mark completed & cleanup
  • skip(reason?)
  • destroy() – cleanup without marking completed
Use theme: 'tailwind' to rely on your Tailwind stack (supply utility classes) or unstyled to supply all styling manually. Completed persistent tours are skipped automatically.
  • Use waitMs: 0 (or global stepWaitMs: 0) for elements that are guaranteed to be present to avoid unnecessary polling.
  • Prefer chaining tours when you have progressive disclosure flows; persistent tours auto-skip if already completed, keeping chains idempotent.
  • When dynamically removing highlighted elements mid-step (e.g. route transitions), the MutationObserver repositions but if the element disappears the next navigation call will resolve again. Consider guarding with required steps if element is critical.
  • Focus ring container traps tab order (unless disableFocusTrap: true)
  • Live region announces step titles (aria-live="polite")
  • Esc always available (when keyboard: true)
Specify stepWaitMs: 0 and/or per-step waitMs: 0 to disable polling for elements (single lookup). stepPollIntervalMs is clamped to a minimum of 1ms internally when waiting.
Contributions welcome. Open an issue or PR with ideas / improvements.

Recent projects

The Eden Project

The Eden Project

Avatar
What if music wasn't so inaccessible..
Run over a Deer

Run over a Deer

Avatar
A Silly little game based on the hit movie Over The Hedge
Daily Planner App

Daily Planner App

Avatar
A simple daily planner with a tasks list. cool onboarding tho. WIP
Suvan GSgreeenboiGreenArcadeSuvan GSgreeenboiGreenArcadeSuvan GSgreeenboi
Suvan GSgreeenboiGreenArcadeSuvan GSgreeenboiGreenArcadeSuvan GSgreeenboi