UNPKG

@gfazioli/mantine-onboarding-tour

Version:

A Mantine 9 onboarding tour component with focus-reveal overlays, cutout highlights, step-by-step popover navigation, and compound components for guided user experiences.

185 lines (181 loc) 7.2 kB
'use client'; 'use strict'; var core = require('@mantine/core'); var React = require('react'); var useCutoutRect = require('./hooks/use-cutout-rect/use-cutout-rect.cjs'); var useOnboardingTour = require('./hooks/use-onboarding-tour/use-onboarding-tour.cjs'); var OnboardingTour_context = require('./OnboardingTour.context.cjs'); var OnboardingTourFocusReveal = require('./OnboardingTourFocusReveal/OnboardingTourFocusReveal.cjs'); var OnboardingTourPopoverContent = require('./OnboardingTourPopoverContent/OnboardingTourPopoverContent.cjs'); var OnboardingTourTarget = require('./OnboardingTourTarget/OnboardingTourTarget.cjs'); var OnboardingTour_module = require('./OnboardingTour.module.css.cjs'); const DEFAULT_CUTOUT_PADDING = 8; const DEFAULT_CUTOUT_RADIUS = 8; const defaultProps = {}; const OnboardingTour = core.factory((_props) => { const props = core.useProps("OnboardingTour", defaultProps, _props); const { tour, started, loop, focusRevealProps: _focusRevealProps, cutoutPadding: _cutoutPadding, cutoutRadius: _cutoutRadius, onOnboardingTourStart, onOnboardingTourEnd, onOnboardingTourComplete, onOnboardingTourSkip, onOnboardingTourChange, classNames, styles, unstyled, children, ...others } = props; const getStyles = core.useStyles({ name: "OnboardingTour", classes: OnboardingTour_module, props, classNames, styles, unstyled }); const onboardingTour = useOnboardingTour.useOnboardingTour(tour, { loop, onOnboardingTourStart, onOnboardingTourEnd, onOnboardingTourComplete, onOnboardingTourSkip, onOnboardingTourChange }); const focusRevealProps = _focusRevealProps ? typeof _focusRevealProps === "function" ? _focusRevealProps(onboardingTour) : _focusRevealProps : {}; const value = { ...onboardingTour, ...others, focusRevealProps, getStyles, unstyled }; const { resolvedClassNames, resolvedStyles } = core.useResolvedStylesApi({ classNames, styles, props }); const { selectedStepId: selectedTourId, startTour } = onboardingTour; React.useEffect(() => { if (started) { startTour(); } }, [started]); const currentStepFocusRevealProps = (() => { const stepProps = onboardingTour.currentStep?.focusRevealProps; if (!stepProps) { return void 0; } return typeof stepProps === "function" ? stepProps(onboardingTour) : stepProps; })(); const overlayColor = currentStepFocusRevealProps?.overlayProps?.color ?? focusRevealProps?.overlayProps?.color ?? "#000"; const overlayOpacity = currentStepFocusRevealProps?.overlayProps?.backgroundOpacity ?? focusRevealProps?.overlayProps?.backgroundOpacity ?? 0.5; const overlayBlur = currentStepFocusRevealProps?.overlayProps?.blur ?? focusRevealProps?.overlayProps?.blur ?? 2; const overlayZIndex = currentStepFocusRevealProps?.overlayProps?.zIndex ?? focusRevealProps?.overlayProps?.zIndex ?? 200; const isTourActive = started && onboardingTour.currentStepIndex !== void 0; const cutoutState = useCutoutRect.useCutoutRect(isTourActive, selectedTourId); React.useEffect(() => { if (isTourActive) { const prev = document.documentElement.style.overflowX; document.documentElement.style.overflowX = "hidden"; return () => { document.documentElement.style.overflowX = prev; }; } return void 0; }, [isTourActive]); const wrapChildren = (children2) => { if (!started || !selectedTourId) { return children2; } return React.Children.map(children2, (child) => { if (React.isValidElement(child)) { const childProps = child.props; const tourId = childProps["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.OnboardingTourFocusReveal, { ...mergedFocusRevealProps, withOverlay: false, popoverProps: { ...mergedFocusRevealProps.popoverProps, withinPortal: true }, classNames: resolvedClassNames, key: `onboarding-tour-${tourId}`, popoverContent: /* @__PURE__ */ React.createElement( OnboardingTour.PopoverContent, { classNames: resolvedClassNames, styles: resolvedStyles, unstyled, ...others, tourController: onboardingTour, key: `onboarding-tour-content-${tourId}` } ), focused: tourId === selectedTourId, transitionProps: { duration: 0, exitDuration: 0 } }, React.cloneElement(child) ); } if (childProps.children) { return React.cloneElement(child, { children: wrapChildren(childProps.children) }); } } return child; }); }; const rawCutoutPadding = onboardingTour.currentStep?.cutoutPadding ?? _cutoutPadding ?? DEFAULT_CUTOUT_PADDING; const rawCutoutRadius = onboardingTour.currentStep?.cutoutRadius ?? _cutoutRadius ?? DEFAULT_CUTOUT_RADIUS; const resolvedCutoutPadding = Number.isFinite(rawCutoutPadding) ? Math.max(0, rawCutoutPadding) : DEFAULT_CUTOUT_PADDING; const resolvedCutoutRadius = Number.isFinite(rawCutoutRadius) ? Math.max(0, rawCutoutRadius) : DEFAULT_CUTOUT_RADIUS; const cssClipPath = cutoutState ? `path(evenodd, "${useCutoutRect.buildCutoutPath( cutoutState.vw, cutoutState.vh, cutoutState.rect, resolvedCutoutPadding, resolvedCutoutRadius )}")` : void 0; return /* @__PURE__ */ React.createElement(core.Box, null, isTourActive && /* @__PURE__ */ React.createElement( core.Box, { "data-onboarding-tour-overlay": true, className: OnboardingTour_module.tourOverlay, style: { backgroundColor: core.rgba(overlayColor, overlayOpacity), ...Number(overlayBlur) > 0 && { backdropFilter: `blur(${overlayBlur}px)`, WebkitBackdropFilter: `blur(${overlayBlur}px)` }, ...cssClipPath && { clipPath: cssClipPath, WebkitClipPath: cssClipPath }, zIndex: overlayZIndex } } ), /* @__PURE__ */ React.createElement(OnboardingTour_context._OnboardingTourProvider, { value }, wrapChildren(children))); }); OnboardingTour.displayName = "OnboardingTour"; OnboardingTour.classes = OnboardingTour_module; OnboardingTour.FocusReveal = OnboardingTourFocusReveal.OnboardingTourFocusReveal; OnboardingTour.PopoverContent = OnboardingTourPopoverContent.OnboardingTourPopoverContent; OnboardingTour.Target = OnboardingTourTarget.OnboardingTourTarget; exports.OnboardingTour = OnboardingTour; exports.defaultProps = defaultProps; //# sourceMappingURL=OnboardingTour.cjs.map