UNPKG

@gfazioli/mantine-onboarding-tour

Version:

A Mantine component enables you to create a onboarding-tour effect using overlays, popovers, and onboarding tours, which enhances element visibility and interactivity.

118 lines (115 loc) 3.99 kB
'use client'; import React, { useEffect } from 'react'; import { useProps, useStyles, useResolvedStylesApi } from '@mantine/core'; import { useOnboardingTour } from './hooks/use-onboarding-tour/use-onboarding-tour.mjs'; import { _OnboardingTourProvider } from './OnboardingTour.context.mjs'; import { OnboardingTourFocusReveal } from './OnboardingTourFocusReveal/OnboardingTourFocusReveal.mjs'; import { OnboardingTourPopoverContent } from './OnboardingTourPopoverContent/OnboardingTourPopoverContent.mjs'; import { OnboardingTourTarget } from './OnboardingTourTarget/OnboardingTourTarget.mjs'; import classes from './OnboardingTour.module.css.mjs'; const defaultProps = {}; function OnboardingTour(_props) { const props = useProps("OnboardingTour", defaultProps, _props); const { tour, started, loop, focusRevealProps: _focusRevealProps, onOnboardingTourStart, onOnboardingTourEnd, onOnboardingTourClose, onOnboardingTourChange, classNames, styles, unstyled, children, ...others } = props; const getStyles = useStyles({ name: "OnboardingTour", classes, props, classNames, styles, unstyled }); const onboardingTour = useOnboardingTour(tour, { loop, onOnboardingTourStart, onOnboardingTourEnd, onOnboardingTourChange }); const focusRevealProps = _focusRevealProps ? typeof _focusRevealProps === "function" ? _focusRevealProps(onboardingTour) : _focusRevealProps : {}; const value = { ...onboardingTour, ...others, focusRevealProps, onOnboardingTourClose, getStyles, unstyled }; const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi({ classNames, styles, props }); const { selectedStepId: selectedTourId, startTour } = onboardingTour; useEffect(() => { if (started) { startTour(); } }, [started]); const wrapChildren = (children2) => { if (!started || !selectedTourId) { return children2; } return React.Children.map(children2, (child) => { if (React.isValidElement(child)) { const tourId = child.props["data-onboarding-tour-id"]; if (tourId) { const mergedFocusRevealProps = { ...focusRevealProps, ...typeof onboardingTour.currentStep?.focusRevealProps === "function" ? onboardingTour.currentStep.focusRevealProps(onboardingTour) : onboardingTour.currentStep?.focusRevealProps }; return /* @__PURE__ */ React.createElement( OnboardingTourFocusReveal, { ...mergedFocusRevealProps, classNames: resolvedClassNames, key: `onboarding-tour-${tourId}`, popoverContent: /* @__PURE__ */ React.createElement( OnboardingTour.PopoverContent, { classNames: resolvedClassNames, styles: resolvedStyles, unstyled, tourController: onboardingTour, onOnboardingTourClose, ...others, key: `onboarding-tour-content-${tourId}` } ), focused: tourId === selectedTourId, transitionProps: { duration: 0, exitDuration: 0 } }, React.cloneElement(child) ); } if (child.props.children) { return React.cloneElement(child, { children: wrapChildren(child.props.children) }); } } return child; }); }; return /* @__PURE__ */ React.createElement(_OnboardingTourProvider, { value }, wrapChildren(children)); } OnboardingTour.displayName = "OnboardingTour"; OnboardingTour.classes = classes; OnboardingTour.FocusReveal = OnboardingTourFocusReveal; OnboardingTour.PopoverContent = OnboardingTourPopoverContent; OnboardingTour.Target = OnboardingTourTarget; export { OnboardingTour, defaultProps }; //# sourceMappingURL=OnboardingTour.mjs.map