@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.
144 lines (140 loc) • 5.22 kB
JavaScript
'use client';
'use strict';
var React = require('react');
var core = require('@mantine/core');
var OnboardingTourPopoverContent_module = require('./OnboardingTourPopoverContent.module.css.cjs');
const defaultProps = {
withPrevButton: true,
withNextButton: true,
withSkipButton: true,
withStepper: true,
nextStepNavigation: "Next",
endStepNavigation: "End",
prevStepNavigation: "Prev",
skipNavigation: "Skip",
stepperStepProps: {
allowStepClick: true
}
};
const OnboardingTourPopoverContent = core.factory(
(_props, ref) => {
const props = core.useProps("OnboardingTourPopoverContent", defaultProps, _props);
const {
tourController,
loop,
header,
title,
content,
footer,
withPrevButton,
withNextButton,
withSkipButton,
withStepper,
nextStepNavigation,
endStepNavigation,
prevStepNavigation,
skipNavigation,
stepper,
stepperStepProps,
stepperProps,
onOnboardingTourClose,
classNames,
style,
styles,
unstyled,
vars,
className,
...others
} = props;
const getStyles = core.useStyles({
name: "OnboardingTourPopoverContent",
props,
classes: OnboardingTourPopoverContent_module,
className,
style,
classNames,
styles,
unstyled,
vars
//varsResolver,
});
const {
tour,
currentStep,
currentStepIndex,
setCurrentStepIndex: setCurrentStep,
endTour,
nextStep: nextTour,
prevStep: prevTour
} = tourController;
if (!tourController || !currentStep) {
return null;
}
const {
header: headerTourStep,
title: titleTourStep,
content: contentTourStep,
footer: footerTourStep
} = currentStep;
const withFunction = (prop, wrapper) => {
if (typeof prop === "function") {
return prop(tourController);
} else if (typeof prop === "string" && wrapper) {
return wrapper(prop);
}
return prop;
};
const skipNavigationComponent = withSkipButton && withFunction(skipNavigation, (label) => /* @__PURE__ */ React.createElement(
core.Anchor,
{
size: "xs",
onClick: () => {
endTour();
onOnboardingTourClose?.();
}
},
label
)) || /* @__PURE__ */ React.createElement("div", null);
const headerComponent = withFunction(header || headerTourStep);
const titleComponent = withFunction(
title || titleTourStep,
(label) => /* @__PURE__ */ React.createElement(core.Text, { fw: 800, size: "xl" }, label)
);
const contentComponent = withFunction(content || contentTourStep);
const footerComponent = withFunction(footer || footerTourStep);
const prevNavigationComponent = withPrevButton && (currentStepIndex > 0 || loop) ? withFunction(prevStepNavigation, (label) => /* @__PURE__ */ React.createElement(core.Button, { variant: "light", size: "xs", onClick: prevTour }, label)) : /* @__PURE__ */ React.createElement("div", null);
const nextNavigationComponent = withNextButton && (currentStepIndex < tour.length - 1 || loop) && withFunction(nextStepNavigation, (label) => /* @__PURE__ */ React.createElement(core.Button, { variant: "light", size: "xs", onClick: nextTour }, label));
const endNavigationComponent = withNextButton && currentStepIndex === tour.length - 1 && !loop && withFunction(endStepNavigation, (label) => /* @__PURE__ */ React.createElement(core.Button, { size: "xs", onClick: nextTour }, label));
const stepperComponent = withStepper && (withFunction(stepper) || /* @__PURE__ */ React.createElement(core.Group, { grow: true }, /* @__PURE__ */ React.createElement(
core.Stepper,
{
...stepperProps,
onStepClick: setCurrentStep,
classNames: {
stepIcon: OnboardingTourPopoverContent_module.stepIcon,
separator: OnboardingTourPopoverContent_module.separator
},
active: currentStepIndex,
size: "xs"
},
tour.map((step) => /* @__PURE__ */ React.createElement(core.Stepper.Step, { ...stepperStepProps, key: step.id, value: step.id }))
)));
return React.useMemo(
() => /* @__PURE__ */ React.createElement(core.Box, { ref, ...getStyles("popoverContent"), ...others }, /* @__PURE__ */ React.createElement(core.Stack, null, headerComponent, titleComponent, contentComponent, /* @__PURE__ */ React.createElement(core.Group, { justify: "space-between" }, skipNavigationComponent, /* @__PURE__ */ React.createElement(core.Group, { justify: "space-between" }, prevNavigationComponent, nextNavigationComponent, endNavigationComponent)), stepperComponent, footerComponent)),
[
withSkipButton,
withPrevButton,
withNextButton,
withStepper,
nextStepNavigation,
prevStepNavigation,
endStepNavigation,
skipNavigation
]
);
}
);
OnboardingTourPopoverContent.displayName = "OnboardingTourPopoverContent";
exports.OnboardingTourPopoverContent = OnboardingTourPopoverContent;
exports.defaultProps = defaultProps;
//# sourceMappingURL=OnboardingTourPopoverContent.cjs.map