Command Palette

Search for a command to run...

Guided Tour

shadcn/ui

A component for creating interactive guided tours that walk users through your application step by step. Includes forward and backward navigation, dark overlay, and customizable content for each step.

Guided Tour

import { GuidedTour, GuidedTourOverlay, GuidedTourProvider, GuidedTourStep, GuidedTourTrigger } from "@/components/optics/guided-tour";import { Button } from "@/components/optics/button";import { Input } from "@/components/optics/input";import { Label } from "@/components/optics/label";import { HelpCircle } from "lucide-react";<GuidedTourProvider>  <GuidedTour>    <GuidedTourOverlay />    <div className="flex flex-col items-center gap-4 w-full max-w-md">      <GuidedTourTrigger        render={<Button><CircleQuestionMark className="mr-2" />Start Demo Tour</Button>}        tourId="demo-tour"      />      <div className="w-full flex items-stretch justify-center gap-8">        <GuidedTourStep          content={<div><h3 className="font-semibold mb-2 text-base">Welcome to the Tour</h3><p className="text-sm text-muted-foreground">This is the first step. Here you can see how the guided tour component works.</p></div>}          step={1}          tourId="demo-tour"        >          <div className="p-4 border rounded-lg bg-background space-y-2">            <Label>              Step 1: Input Field            </Label>            <Input placeholder="Type something here..." />          </div>        </GuidedTourStep>        <GuidedTourStep          content={<div><h3 className="font-semibold mb-2 text-base">Second Step</h3><p className="text-sm text-muted-foreground">This is the second element of the tour. You can continue navigating between steps.</p></div>}          step={2}          tourId="demo-tour"        >          <div className="p-4 border rounded-lg bg-background space-y-2">            <Label>              Step 2: Action Button            </Label>            <Button className="w-full">              Click Here            </Button>          </div>        </GuidedTourStep>        <GuidedTourStep          content={<div><h3 className="font-semibold mb-2 text-base">Last Step</h3><p className="text-sm text-muted-foreground">This is the last step of the tour. Press "Finish" to complete the tour.</p></div>}          step={3}          tourId="demo-tour"        >          <div className="p-4 border rounded-lg bg-background space-y-2">            <Label>              Step 3: Completion            </Label>            <Button              className="w-full"              variant="secondary"            >              Complete            </Button>          </div>        </GuidedTourStep>      </div>    </div>  </GuidedTour></GuidedTourProvider>

Installation

pnpm dlx shadcn@latest add @optics/guided-tour

Props

<GuidedTourProvider />
Name
Type
defaultOpen
boolean
open
boolean
onOpenChange
(...args) => void
onOpenChangeComplete
((open: boolean) => void)
modal
boolean | "trap-focus"
triggerId
string
defaultTriggerId
string
nativeButton
boolean
render
React.ReactElement
payload
object
openOnHover
boolean
delay
number
closeDelay
number
keepMounted
boolean
container
HTMLElement | RefObject<HTMLElement>
anchor
(...args) => Element
positionMethod
"absolute" | "fixed"
sideOffset
number
alignOffset
number
sticky
boolean
arrowPadding
number
disableAnchorTracking
boolean
initialFocus
boolean | HTMLElement
finalFocus
boolean | HTMLElement

<GuidedTour />
Name
Type
defaultOpen
boolean
open
boolean
onOpenChange
(...args) => void
onOpenChangeComplete
((open: boolean) => void)
modal
boolean | "trap-focus"
triggerId
string
defaultTriggerId
string
nativeButton
boolean
render
React.ReactElement
payload
object
openOnHover
boolean
delay
number
closeDelay
number
keepMounted
boolean
container
HTMLElement | RefObject<HTMLElement>
anchor
(...args) => Element
positionMethod
"absolute" | "fixed"
sideOffset
number
alignOffset
number
sticky
boolean
arrowPadding
number
disableAnchorTracking
boolean
initialFocus
boolean | HTMLElement
finalFocus
boolean | HTMLElement
<GuidedTourTrigger />
Name
Type
tourId
any
render
ReactNode(default: null)
defaultOpen
boolean
open
boolean
onOpenChange
(...args) => void
onOpenChangeComplete
((open: boolean) => void)
modal
boolean | "trap-focus"
triggerId
string
defaultTriggerId
string
nativeButton
boolean
payload
object
openOnHover
boolean
delay
number
closeDelay
number
keepMounted
boolean
container
HTMLElement | RefObject<HTMLElement>
anchor
(...args) => Element
positionMethod
"absolute" | "fixed"
sideOffset
number
alignOffset
number
sticky
boolean
arrowPadding
number
disableAnchorTracking
boolean
initialFocus
boolean | HTMLElement
finalFocus
boolean | HTMLElement
<GuidedTourContent />
Name
Type
onSkip
string(default: undefined)
onNext
string(default: undefined)
onBack
string(default: undefined)
onFinish
string(default: undefined)
isLastStep
boolean(default: false)
isFirstStep
boolean(default: false)
align
string(default: start)
alignOffset
number(default: 0)
side
string(default: bottom)
sideOffset
number(default: 8)
defaultOpen
boolean
open
boolean
onOpenChange
(...args) => void
onOpenChangeComplete
((open: boolean) => void)
modal
boolean | "trap-focus"
triggerId
string
defaultTriggerId
string
nativeButton
boolean
render
React.ReactElement
payload
object
openOnHover
boolean
delay
number
closeDelay
number
keepMounted
boolean
container
HTMLElement | RefObject<HTMLElement>
anchor
(...args) => Element
positionMethod
"absolute" | "fixed"
sticky
boolean
arrowPadding
number
disableAnchorTracking
boolean
initialFocus
boolean | HTMLElement
finalFocus
boolean | HTMLElement
<GuidedTourPopover />
Name
Type
defaultOpen
boolean
open
boolean
onOpenChange
(...args) => void
onOpenChangeComplete
((open: boolean) => void)
modal
boolean | "trap-focus"
triggerId
string
defaultTriggerId
string
nativeButton
boolean
render
React.ReactElement
payload
object
openOnHover
boolean
delay
number
closeDelay
number
keepMounted
boolean
container
HTMLElement | RefObject<HTMLElement>
anchor
(...args) => Element
positionMethod
"absolute" | "fixed"
sideOffset
number
alignOffset
number
sticky
boolean
arrowPadding
number
disableAnchorTracking
boolean
initialFocus
boolean | HTMLElement
finalFocus
boolean | HTMLElement