Tour
Creates guided tours of a user interface.@coinbase/cds-web@8.13.6
ImportSourceView source codeStorybookView Storybook
import { Tour, TourStep } from '@coinbase/cds-web/tour'
Related components
Basic usage
Loading...
Live Codefunction Example() { const [activeTourStep, setActiveTourStep] = useState(null); const StepOne = () => { const [checked, setChecked] = useState(false); const { goNextTourStep, stopTour } = useTourContext(); return ( <Coachmark action={ <Button compact onClick={goNextTourStep}> Next </Button> } checkbox={ <Checkbox checked={checked} onChange={setChecked}> Don't show again </Checkbox> } content="Add up to 3 lines of body copy. Deliver your message with clarity and impact" onClose={stopTour} title="My first step" /> ); }; const StepTwo = () => { const { goNextTourStep, goPreviousTourStep, stopTour } = useTourContext(); return ( <Coachmark action={ <HStack gap={1}> <Button compact onClick={goPreviousTourStep} variant="secondary"> Back </Button> <Button compact onClick={goNextTourStep}> Next </Button> </HStack> } content={ <VStack gap={2}> <TextCaption as="p" color="fgMuted"> 50% </TextCaption> <ProgressBar progress={0.5} /> <TextBody as="p"> Add up to 3 lines of body copy. Deliver your message with clarity and impact </TextBody> </VStack> } media={<RemoteImage height={150} source={ethBackground} width="100%" />} onClose={stopTour} title="My second step" /> ); }; const StepThree = () => { const { stopTour, goNextTourStep, goPreviousTourStep } = useTourContext(); return ( <Coachmark action={ <HStack gap={1}> <Button compact onClick={goPreviousTourStep} variant="secondary"> Back </Button> <Button compact onClick={stopTour}> Done </Button> </HStack> } content="Add up to 3 lines of body copy. Deliver your message with clarity and impact" title="My third step" width={350} /> ); }; const tourSteps = [ { id: 'step1', onBeforeActive: () => console.log('step1 before'), Component: StepOne, }, { id: 'step2', onBeforeActive: () => console.log('step2 before'), Component: StepTwo, }, { id: 'step3', onBeforeActive: () => console.log('step3 before'), Component: StepThree, }, ]; const TourExample = ({ spacerWidthIncrement = 0, spacerHeightIncrement = 500 }) => { const { startTour } = useTourContext(); const handleClick = useCallback(() => startTour(), [startTour]); return ( <VStack flexGrow={1} gap={2} justifyContent="space-between"> <Button compact onClick={handleClick}> Start tour </Button> <TourStep id="step1"> <Box background="bgAlternate" padding={4}> <TextBody as="p">This is step 1</TextBody> </Box> </TourStep> <Box height={spacerHeightIncrement} /> <HStack justifyContent="flex-end"> <Box flexShrink={0} width={spacerWidthIncrement} /> <TourStep id="step2"> <Box background="bgAlternate" padding={4} width={150}> <TextBody as="p">This is step 2</TextBody> </Box> </TourStep> </HStack> <Box height={spacerHeightIncrement} /> <HStack> <Box flexShrink={0} width={spacerWidthIncrement * 2} /> <TourStep id="step3"> <VStack background="bgAlternate" padding={4} width={150}> <TextBody as="p">This is step 3</TextBody> </VStack> </TourStep> </HStack> </VStack> ); }; return ( <Tour activeTourStep={activeTourStep} onChange={setActiveTourStep} steps={tourSteps}> <TourExample /> </Tour> ); }