tour-navigator
Version:
Streamline website tours with Tour Navigator: Customizable and intuitive.
217 lines (186 loc) • 25.1 kB
Markdown
# Tour Navigator
Tour Navigator is a React package designed to facilitate the creation of customizable tours for React websites.
## Installation
To install Tour Navigator, you can use npm or yarn:
```bash
npm install tour-navigator
# or
yarn add tour-navigator
```
## Usage
```javascript
import TourNavigator from 'tour-navigator';
import { Align, Position } from "tour-navigator/lib/TourNavigator/types";
// Define your steps
const steps = [
{
selector: '.step1',
data: { /* Step data */ },
position: Position.LEFT,
align: Align.START
},
{
selector: '.step2',
data: { /* Step data */ },
position: Position.BOTTOM,
align: Align.CENTER
},
// Add more steps as needed
];
// Set up Tour Navigator with your steps
<TourNavigator
id="my-tour"
steps={steps}
/>
```
## Demo
Check out the live demo [here](https://leafy-malasada-f02c9a.netlify.app/).
## CodeSandbox Example
For a live interactive example, you can check out this [CodeSandbox](https://codesandbox.io/p/sandbox/tour-navigator-9hvm54?file=%2Fsrc%2Findex.tsx&layout=%257B%2522sidebarPanel%2522%253A%2522EXPLORER%2522%252C%2522rootPanelGroup%2522%253A%257B%2522direction%2522%253A%2522horizontal%2522%252C%2522contentType%2522%253A%2522UNKNOWN%2522%252C%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522id%2522%253A%2522ROOT_LAYOUT%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522UNKNOWN%2522%252C%2522direction%2522%253A%2522vertical%2522%252C%2522id%2522%253A%2522clvcpvjpc0006356i3zk5alfq%2522%252C%2522sizes%2522%253A%255B100%252C0%255D%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522EDITOR%2522%252C%2522direction%2522%253A%2522horizontal%2522%252C%2522id%2522%253A%2522EDITOR%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL%2522%252C%2522contentType%2522%253A%2522EDITOR%2522%252C%2522id%2522%253A%2522clvcpvjpc0002356i1n9dlstw%2522%257D%255D%257D%252C%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522SHELLS%2522%252C%2522direction%2522%253A%2522horizontal%2522%252C%2522id%2522%253A%2522SHELLS%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL%2522%252C%2522contentType%2522%253A%2522SHELLS%2522%252C%2522id%2522%253A%2522clvcpvjpc0003356i9pagn38n%2522%257D%255D%252C%2522sizes%2522%253A%255B100%255D%257D%255D%257D%252C%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522DEVTOOLS%2522%252C%2522direction%2522%253A%2522vertical%2522%252C%2522id%2522%253A%2522DEVTOOLS%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL%2522%252C%2522contentType%2522%253A%2522DEVTOOLS%2522%252C%2522id%2522%253A%2522clvcpvjpc0005356i5ne28jfr%2522%257D%255D%252C%2522sizes%2522%253A%255B100%255D%257D%255D%252C%2522sizes%2522%253A%255B50%252C50%255D%257D%252C%2522tabbedPanels%2522%253A%257B%2522clvcpvjpc0002356i1n9dlstw%2522%253A%257B%2522tabs%2522%253A%255B%257B%2522id%2522%253A%2522clvcpvjpc0001356i6giznvew%2522%252C%2522mode%2522%253A%2522permanent%2522%252C%2522type%2522%253A%2522FILE%2522%252C%2522filepath%2522%253A%2522%252Fsrc%252Findex.tsx%2522%252C%2522state%2522%253A%2522IDLE%2522%257D%255D%252C%2522id%2522%253A%2522clvcpvjpc0002356i1n9dlstw%2522%252C%2522activeTabId%2522%253A%2522clvcpvjpc0001356i6giznvew%2522%257D%252C%2522clvcpvjpc0005356i5ne28jfr%2522%253A%257B%2522id%2522%253A%2522clvcpvjpc0005356i5ne28jfr%2522%252C%2522tabs%2522%253A%255B%255D%257D%252C%2522clvcpvjpc0003356i9pagn38n%2522%253A%257B%2522tabs%2522%253A%255B%255D%252C%2522id%2522%253A%2522clvcpvjpc0003356i9pagn38n%2522%257D%257D%252C%2522showDevtools%2522%253Atrue%252C%2522showShells%2522%253Afalse%252C%2522showSidebar%2522%253Atrue%252C%2522sidebarPanelSize%2522%253A15%257D).
| Prop | Type | Description | Default |
|------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|------------------------------|
| id | string | Unique identifier for the tour. | ___tournavigator-${Date.now()} |
| maskRadius | number | Radius of the mask around highlighted elements. | 5 |
| maskPadding | number | Padding around the mask. | 5 |
| maskOpacity | number | Opacity of the mask. | 1 |
| maskStyle | CSSProperties | Custom CSS styles for the mask. | |
| maskStyleDuringScroll | CSSProperties | Custom CSS styles for the mask during scroll. | |
| startAt | number | Index of the step to start the tour at. | 0 |
| maskHelperDistance | number | Distance between the mask and the helper element. | 10 |
| screenHelperDistance | number | Distance between the screen and the helper element. | 10 |
| onAfterOpen | (() => void) \| null | Callback function triggered after the tour starts. | null |
| onBeforeClose | (() => void) \| null | Callback function triggered before the tour ends. | null |
| steps | Step[] | Array of steps defining the tour. | [] |
| helper | ((props: HelperProps) => ReactNode) \| null | Custom helper component for each step. | null |
| isOpen | boolean | Flag to control the visibility of the tour. | true |
| onRequestClose | ((params: {event: MouseEvent \| PointerEvent, isMask: boolean, isOverlay: boolean}) => void) \| null | Callback function triggered when the tour is closed. | null |
| onNext | ((props: HelperProps) => void) \| null | Callback function triggered when the "Next" button is clicked. | null |
| onPrev | ((props: HelperProps) => void) \| null | Callback function triggered when the "Prev" button is clicked. | null |
| onMove | ((props: HelperProps) => void) \| null | Callback function triggered when the tour moves to the next step. | null |
| scrollBehavior | 'smooth' \| 'auto' | Defines the scroll behavior when moving to a new step. | 'auto' |
| resizeListener | boolean | Flag to enable/disable resize listener. | true |
| scrollListener | boolean | Flag to enable/disable scroll listener. | true |
| mutationObserve | MutationObserverConfig | Configuration for mutation observer to watch changes in DOM. | |
| overlayFill | string | Fill color of the overlay. | 'black' |
| overlayOpacity | number | Opacity of the overlay. | 0.5 |
| overlay | ((props: OverlayProps) => ReactNode) \| null | Custom overlay component. | null |
| className | string | Custom CSS class for the Tour Navigator component. | |
| style | CSSProperties | Custom CSS styles for the Tour Navigator component. | |
| renderOverlay | boolean | Flag to enable/disable rendering of the overlay. | true |
| renderHelper | boolean | Flag to enable/disable rendering of the helper component. | true |
| renderElement | HTMLElement \| string | The element in which the Tour Navigator will be rendered. | |
| scrollingElement | HTMLElement \| Document \| Element \| string | The element used for scrolling. | |
| waitForElementRendered | boolean | Works only when mutationObserver provided, |
### Step
```typescript
Tour Navigator
Tour Navigator is a React package designed to facilitate the creation of customizable tours for React websites.
## Installation
To install Tour Navigator, you can use npm or yarn:
```bash
npm install tour-navigator
# or
yarn add tour-navigator
```
## Usage
```javascript
import TourNavigator from 'tour-navigator';
import { Align, Position } from "tour-navigator/lib/TourNavigator/types";
// Define your steps
const steps = [
{
selector: '.step1',
data: { /* Step data */ },
position: Position.LEFT,
align: Align.START
},
{
selector: '.step2',
data: { /* Step data */ },
position: Position.BOTTOM,
align: Align.CENTER
},
// Add more steps as needed
];
// Set up Tour Navigator with your steps
<TourNavigator
id="my-tour"
steps={steps}
/>
```
## Demo
Check out the live demo [here](https://leafy-malasada-f02c9a.netlify.app/).
## CodeSandbox Example
For a live interactive example, you can check out this [CodeSandbox](https://codesandbox.io/p/sandbox/tour-navigator-9hvm54?file=%2Fsrc%2Findex.tsx&layout=%257B%2522sidebarPanel%2522%253A%2522EXPLORER%2522%252C%2522rootPanelGroup%2522%253A%257B%2522direction%2522%253A%2522horizontal%2522%252C%2522contentType%2522%253A%2522UNKNOWN%2522%252C%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522id%2522%253A%2522ROOT_LAYOUT%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522UNKNOWN%2522%252C%2522direction%2522%253A%2522vertical%2522%252C%2522id%2522%253A%2522clvcpvjpc0006356i3zk5alfq%2522%252C%2522sizes%2522%253A%255B100%252C0%255D%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522EDITOR%2522%252C%2522direction%2522%253A%2522horizontal%2522%252C%2522id%2522%253A%2522EDITOR%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL%2522%252C%2522contentType%2522%253A%2522EDITOR%2522%252C%2522id%2522%253A%2522clvcpvjpc0002356i1n9dlstw%2522%257D%255D%257D%252C%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522SHELLS%2522%252C%2522direction%2522%253A%2522horizontal%2522%252C%2522id%2522%253A%2522SHELLS%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL%2522%252C%2522contentType%2522%253A%2522SHELLS%2522%252C%2522id%2522%253A%2522clvcpvjpc0003356i9pagn38n%2522%257D%255D%252C%2522sizes%2522%253A%255B100%255D%257D%255D%257D%252C%257B%2522type%2522%253A%2522PANEL_GROUP%2522%252C%2522contentType%2522%253A%2522DEVTOOLS%2522%252C%2522direction%2522%253A%2522vertical%2522%252C%2522id%2522%253A%2522DEVTOOLS%2522%252C%2522panels%2522%253A%255B%257B%2522type%2522%253A%2522PANEL%2522%252C%2522contentType%2522%253A%2522DEVTOOLS%2522%252C%2522id%2522%253A%2522clvcpvjpc0005356i5ne28jfr%2522%257D%255D%252C%2522sizes%2522%253A%255B100%255D%257D%255D%252C%2522sizes%2522%253A%255B50%252C50%255D%257D%252C%2522tabbedPanels%2522%253A%257B%2522clvcpvjpc0002356i1n9dlstw%2522%253A%257B%2522tabs%2522%253A%255B%257B%2522id%2522%253A%2522clvcpvjpc0001356i6giznvew%2522%252C%2522mode%2522%253A%2522permanent%2522%252C%2522type%2522%253A%2522FILE%2522%252C%2522filepath%2522%253A%2522%252Fsrc%252Findex.tsx%2522%252C%2522state%2522%253A%2522IDLE%2522%257D%255D%252C%2522id%2522%253A%2522clvcpvjpc0002356i1n9dlstw%2522%252C%2522activeTabId%2522%253A%2522clvcpvjpc0001356i6giznvew%2522%257D%252C%2522clvcpvjpc0005356i5ne28jfr%2522%253A%257B%2522id%2522%253A%2522clvcpvjpc0005356i5ne28jfr%2522%252C%2522tabs%2522%253A%255B%255D%257D%252C%2522clvcpvjpc0003356i9pagn38n%2522%253A%257B%2522tabs%2522%253A%255B%255D%252C%2522id%2522%253A%2522clvcpvjpc0003356i9pagn38n%2522%257D%257D%252C%2522showDevtools%2522%253Atrue%252C%2522showShells%2522%253Afalse%252C%2522showSidebar%2522%253Atrue%252C%2522sidebarPanelSize%2522%253A15%257D).
| Prop | Type | Description | Default |
|------------------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|------------------------------|
| id | string | Unique identifier for the tour. | ___tournavigator-${Date.now()} |
| maskRadius | number | Radius of the mask around highlighted elements. | 5 |
| maskPadding | number | Padding around the mask. | 5 |
| maskOpacity | number | Opacity of the mask. | 1 |
| maskStyle | CSSProperties | Custom CSS styles for the mask. | |
| maskStyleDuringScroll | CSSProperties | Custom CSS styles for the mask during scroll. | |
| startAt | number | Index of the step to start the tour at. | 0 |
| maskHelperDistance | number | Distance between the mask and the helper element. | 10 |
| screenHelperDistance | number | Distance between the screen and the helper element. | 10 |
| onAfterOpen | (() => void) \| null | Callback function triggered after the tour starts. | null |
| onBeforeClose | (() => void) \| null | Callback function triggered before the tour ends. | null |
| steps | Step[] | Array of steps defining the tour. | [] |
| helper | ((props: HelperProps) => ReactNode) \| null | Custom helper component for each step. | null |
| isOpen | boolean | Flag to control the visibility of the tour. | true |
| onRequestClose | ((params: {event: MouseEvent \| PointerEvent, isMask: boolean, isOverlay: boolean}) => void) \| null | Callback function triggered when the tour is closed. | null |
| onNext | ((props: HelperProps) => void) \| null | Callback function triggered when the "Next" button is clicked. | null |
| onPrev | ((props: HelperProps) => void) \| null | Callback function triggered when the "Prev" button is clicked. | null |
| onMove | ((props: HelperProps) => void) \| null | Callback function triggered when the tour moves to the next step. | null |
| scrollBehavior | 'smooth' \| 'auto' | Defines the scroll behavior when moving to a new step. | 'auto' |
| resizeListener | boolean | Flag to enable/disable resize listener. | true |
| scrollListener | boolean | Flag to enable/disable scroll listener. | true |
| mutationObserve | MutationObserverConfig | Configuration for mutation observer to watch changes in DOM. | |
| overlayFill | string | Fill color of the overlay. | 'black' |
| overlayOpacity | number | Opacity of the overlay. | 0.5 |
| overlay | ((props: OverlayProps) => ReactNode) \| null | Custom overlay component. | null |
| className | string | Custom CSS class for the Tour Navigator component. | |
| style | CSSProperties | Custom CSS styles for the Tour Navigator component. | |
| renderOverlay | boolean | Flag to enable/disable rendering of the overlay. | true |
| renderHelper | boolean | Flag to enable/disable rendering of the helper component. | true |
| renderElement | HTMLElement \| string | The element in which the Tour Navigator will be rendered. | |
| scrollingElement | HTMLElement \| Document \| Element \| string | The element used for scrolling. | |
| waitForElementRendered | boolean | Works only when mutationObserver provided, |
### Step
```typescript
type IntersectionOption = {
root?: Element | Document | string | null; // Default: null
rootMargin?: string; // Default: dynamically adjusted
threshold?: number; // Default: dynamically adjusted
}
type Step = {
selector: string;
align?: Align,
position?: Position | [Position, Position, Position, Position];
data: any,
scrollIntoView?: boolean; // Default: true (Whether scroll to view element or not)
intersectionOption?: IntersectionOption | (intersectionOption: IntersectionOption) => IntersectionOption;
}
```
### HelperProps
```typescript
type HelperProps = {
id?: string;
currentStep: Step | null;
target: HTMLElement | null;
currentStepIndex: number;
previousStepIndex: number;
steps: Step[];
isScrollingIntoView: boolean; // Whether scrolling element into view or not
focus: (scrollBehavior?: 'auto' | 'smooth') => void; // programmatically focus current targe, In case it loses
goto: (stepIndex: number) => void; // goto any specific steps
next: () => void;
prev: () => void;
onRequestClose: ((params: {event: MouseEvent | PointerEvent, isMask: boolean, isOverlay: boolean}) => void) | null
}
```
### Passing Ref to TourNavigator
Since TourNavigator is a class component, you can use ref to access various built-in methods directly for enhanced customization.
This README provides an overview of the package, its usage, props, and default props. Let me know if you need further modifications or additions!
### License
This project is licensed under the [MIT](LICENSE).