@fbaconversio/onborda
Version:
The ultimate product tour library for Next.js
218 lines (217 loc) • 9.03 kB
TypeScript
import { Transition } from "framer-motion";
import { defaultBreakpoints } from "../Onborda";
export interface OnbordaProviderProps {
/** The children elements to be rendered inside the OnbordaProvider component */
children: React.ReactNode;
/** An array of tours, each containing multiple steps */
tours: Tour[];
/** Active Tour */
activeTour?: string;
/** Initial isOnbordaVisible state */
defaultIsOnbordaVisible?: boolean;
}
export interface OnbordaContextType {
/** array of tours */
tours: Tour[];
/** current step index */
currentStep: number;
/** current tour name */
currentTour: string | null;
/** current tour steps */
currentTourSteps: Step[];
/** function to set the current step */
setCurrentStep: (step: number | string, delay?: number) => void;
/** function to close Onborda */
closeOnborda: () => void;
/** function to start Onborda */
startOnborda: (tourName: string, visible?: boolean, step?: number | string) => void;
/** flag to check if Onborda is visible */
isOnbordaVisible: boolean;
/** function to set the visibility of Onborda */
setOnbordaVisible: (visible: boolean) => void;
/** default completed steps */
completedSteps: Set<number>;
/** setstate function to set the completed steps */
setCompletedSteps: React.Dispatch<React.SetStateAction<Set<number>>>;
/** flag to check if the step is changing, can be used to prevent multiple clicks on the same step by disabling the button for instance */
isStepChanging: boolean;
/** function to set the step changing */
setIsStepChanging: (isStepChanging: boolean) => void;
}
export type Breakpoint = keyof typeof defaultBreakpoints | "default";
export type Side = "top" | "bottom" | "left" | "right" | "top-left" | "top-right" | "bottom-left" | "bottom-right" | "left-top" | "left-bottom" | "right-top" | "right-bottom";
export type ExtendedBreakpoint = Breakpoint | (string & {});
export type ExtendedSide = Side | (string & {});
export interface Step {
/** The unique identifier for the step */
id?: string;
/** The title of the step */
title?: string;
/** The content to be displayed in the step */
content: React.ReactNode;
/** The icon to be displayed in the step */
icon?: React.ReactNode | string | null;
/** The CSS selector for the element to highlight. Takes precedence over customQuerySelector if both are provided. */
selector?: string;
/** A custom function to query the target element. Ignored if selector is provided. */
customQuerySelector?: () => Element | null;
/** The CSS selector for the element to click on the next step. */
clickElementOnNext?: string;
/** The CSS selector for the element to click on the previous step. */
clickElementOnPrev?: string;
/** The CSS selector for the element to click on when the step is unset with the setStep function. */
clickElementOnUnset?: string;
/** The CSS selector for the element to click on when the step is set with the setStep function. */
clickElementOnSet?: string;
/** The side where the step should be displayed for each breakpoint, setting the default will apply to all breakpoints, setting a specific breakpoint will override the default */
side?: Partial<Record<ExtendedBreakpoint, ExtendedSide>>;
/** Flag to show or hide the controls */
showControls?: boolean;
/** Padding around the pointer */
pointerPadding?: number;
/** Radius of the pointer */
pointerRadius?: number;
/** Flag to make the step interactable */
interactable?: boolean;
/** Conditions to be met before the next step can be triggered. Function is bound to on observer on the focused element, or observerSelector element if set. */
isCompleteConditions?: (element: Element | null) => boolean;
/** Selector for Element/s that an observer is attached to listen for changes. Upon each observation, isCompleteConditions is triggered. */
observerSelector?: string;
/** Override the scroll container for the step with a custom CSS selector. If not set, scroll will be calculated based on the viewport. Only used if tour.scrollContainer is set. */
scrollContainerOveride?: string;
/** The route for this step */
route?: string;
/** The route to navigate to for the next step */
/** @deprecated Use `route` instead */
nextRoute?: string;
/** The route to navigate to for the previous step */
/** @deprecated Use `route` instead */
prevRoute?: string;
/** Callback function to be called when the step is completed */
onComplete?: (tour: Tour) => Promise<void>;
/** Any additional data for custom use */
[key: string]: any;
}
export interface Tour {
/** The tour ID */
tour: string;
/** Tour Title */
title?: string;
/** Tour Description */
description?: string;
/** An array of steps in the tour */
steps: Step[];
/** Complete Callback */
onComplete?: (tour: Tour) => void;
/** Tour can be dismissed. */
dismissible?: boolean;
/** Any additional data for custom use */
[key: string]: any;
/** Initial completed steps state of the tour. an async function called on tour started. Can be a Server Action e.g. Promise.all([]) on API calls. */
initialCompletedStepsState?: () => Promise<boolean[]>;
/** If the tour is in a scroll container, set the CSS selector of the scroll container. If not set, scroll will be calculated based on the viewport. */
scrollContainer?: string;
}
export interface OnbordaProps {
/** The children elements to be rendered inside the Onborda component */
children: React.ReactNode;
/** An array of tours, each containing multiple steps */
/** @deprecated Use `OnbordaProvider.tours` instead */
steps?: Tour[];
/** Flag to show or hide the Onborda component */
/** @deprecated Use `OnbordaProvider.defaultIsOnbordaVisible` instead */
showOnborda?: boolean;
/** RGB value for the shadow color */
shadowRgb?: string;
/** Opacity value for the shadow */
shadowOpacity?: string;
/** Transition settings for the card component */
cardTransition?: Transition;
/** Custom card component to be used in the Onborda */
cardComponent?: React.ComponentType<CardComponentProps>;
/** Custom tour component to be used in the Onborda */
tourComponent?: React.ComponentType<TourComponentProps>;
/**
* Breakpoints for the Onborda.
* @default
* {
* xs: 480,
* sm: 640,
* md: 768,
* lg: 1024,
* xl: 1280,
* "2xl": 1536,
* "3xl": 1920
* }
*/
breakpoints?: Partial<Record<Breakpoint, number>> & {
[key: string]: number;
};
/** Extend the default sides of the Onborda with custom CSS.
* @example
* {
* customSide: {
* transform: "translate(-50%, 0)",
* left: "50%",
* bottom: "100%",
* marginBottom: "25px",
* },
* }
*
* and then use it in the side prop in the step:
* {
* side: {
* default: "customSide",
* },
* }
*/
extendSides?: {
[key: string]: React.CSSProperties;
};
/** Flag to enable or disable debug mode */
debug?: boolean;
/** Timeout value for the observer when observing for the target element */
observerTimeout?: number;
}
export interface CardComponentProps {
/** The current step object containing details of the step */
step: Step;
/** The current tour object containing details of the tour */
tour: Tour;
/** All tours */
tours: Tour[];
/** The index of the current step */
currentStep: number;
/** The total number of steps in the tour */
totalSteps: number;
/** Function to set the current step by step index or step.id */
setStep: (step: number | string) => void;
/** Function to navigate to the next step */
nextStep: () => void;
/** Function to navigate to the previous step */
prevStep: () => void;
/** Function to close the Onborda */
closeOnborda: () => void;
/** Function to set the tour visibility */
setOnbordaVisible: (visible: boolean) => void;
/** The arrow element to be displayed in the card */
arrow: JSX.Element;
/** Array of completed steps */
completedSteps: (string | number)[];
/** Is waiting for Route change */
pendingRouteChange: boolean;
}
export interface TourComponentProps {
/** The current tour name */
currentTour: string | null;
/** The index of the current step */
currentStep: number;
/** The current Tour object containing details of the tour */
tour: Tour;
/** Function to set the current step by step index or step.id */
setStep: (step: number | string) => void;
/** Array of completed steps */
completedSteps: (string | number)[];
/** Function to close the Onborda */
closeOnborda: () => void;
}