se-design 1.0.93 → 1.0.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/style.css +1 -1
- package/dist/components/OnboardingTour/index.d.ts +1 -0
- package/dist/index210.js.map +1 -1
- package/dist/index214.js +3 -3
- package/dist/index214.js.map +1 -1
- package/dist/index33.js +11 -10
- package/dist/index43.js +8 -7
- package/dist/index44.js +2 -1
- package/dist/index60.js +17 -16
- package/dist/index67.js +80 -70
- package/dist/index67.js.map +1 -1
- package/dist/index7.js +8 -7
- package/dist/index70.js +2 -1
- package/package.json +1 -1
package/dist/index214.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const f = /* @__PURE__ */
|
|
1
|
+
import { createContext as u, useRef as o, useCallback as s, useContext as c, useEffect as a } from "react";
|
|
2
|
+
const f = /* @__PURE__ */ u(null);
|
|
3
3
|
function l() {
|
|
4
4
|
const r = o(/* @__PURE__ */ new Set()), t = o([]);
|
|
5
5
|
return {
|
|
6
|
-
register:
|
|
6
|
+
register: s((n) => (r.current.add(n), t.current = Array.from(r.current), () => {
|
|
7
7
|
r.current.delete(n), t.current = Array.from(r.current);
|
|
8
8
|
}), []),
|
|
9
9
|
portalContainerRefs: t
|
package/dist/index214.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index214.js","sources":["../src/utils/a11y/FocusTrapPortalContext.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useRef } from 'react';\n\ntype RegisterPortal = (ref: React.RefObject<HTMLElement | null>) => () => void;\n\n/**\n * Context for portal content to register with the nearest focus trap.\n * When a Modal (or any focus trap owner) provides this context, portal-rendered\n * content (e.g., Popover with isWithPortal) can register its container ref so\n * the focus trap's safety net allows focus to move into it.\n */\nexport const FocusTrapPortalContext = createContext<RegisterPortal | null>(null);\n\n/**\n * Hook for the focus trap owner (Modal) to create a portal registration function\n * and a stable ref to the current list of portal container refs.\n *\n * Usage in Modal:\n * ```tsx\n * const { register, portalContainerRefs } = useFocusTrapPortalRegistry();\n * // Pass portalContainerRefs.current to useModalA11y\n * // Wrap children with <FocusTrapPortalContext.Provider value={register}>\n * ```\n */\nexport function useFocusTrapPortalRegistry() {\n const portalRefsSet = useRef<Set<React.RefObject<HTMLElement | null>>>(new Set());\n const portalContainerRefs = useRef<React.RefObject<HTMLElement | null>[]>([]);\n\n const register: RegisterPortal = useCallback((ref) => {\n portalRefsSet.current.add(ref);\n portalContainerRefs.current = Array.from(portalRefsSet.current);\n return () => {\n portalRefsSet.current.delete(ref);\n portalContainerRefs.current = Array.from(portalRefsSet.current);\n };\n }, []);\n\n return { register, portalContainerRefs };\n}\n\n/**\n * Hook for portal content (Popover) to register its container ref with the\n * nearest ancestor focus trap. No-op if there is no focus trap ancestor.\n *\n * @param portalRef - Ref to the portal's root DOM element\n * @param isActive - Whether the portal is currently mounted and should be registered\n */\nexport function useRegisterPortalWithFocusTrap(\n portalRef: React.RefObject<HTMLElement | null>,\n isActive: boolean\n) {\n const register = useContext(FocusTrapPortalContext);\n\n useEffect(() => {\n if (!register || !isActive) return;\n return register(portalRef);\n }, [register, isActive, portalRef]);\n}\n"],"names":["
|
|
1
|
+
{"version":3,"file":"index214.js","sources":["../src/utils/a11y/FocusTrapPortalContext.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useRef } from 'react';\n\ntype RegisterPortal = (ref: React.RefObject<HTMLElement | null>) => () => void;\n\n/**\n * Context for portal content to register with the nearest focus trap.\n * When a Modal (or any focus trap owner) provides this context, portal-rendered\n * content (e.g., Popover with isWithPortal) can register its container ref so\n * the focus trap's safety net allows focus to move into it.\n */\nexport const FocusTrapPortalContext = createContext<RegisterPortal | null>(null);\n\n/**\n * Hook for the focus trap owner (Modal) to create a portal registration function\n * and a stable ref to the current list of portal container refs.\n *\n * Usage in Modal:\n * ```tsx\n * const { register, portalContainerRefs } = useFocusTrapPortalRegistry();\n * // Pass portalContainerRefs.current to useModalA11y\n * // Wrap children with <FocusTrapPortalContext.Provider value={register}>\n * ```\n */\nexport function useFocusTrapPortalRegistry() {\n const portalRefsSet = useRef<Set<React.RefObject<HTMLElement | null>>>(new Set());\n const portalContainerRefs = useRef<React.RefObject<HTMLElement | null>[]>([]);\n\n const register: RegisterPortal = useCallback((ref) => {\n portalRefsSet.current.add(ref);\n portalContainerRefs.current = Array.from(portalRefsSet.current);\n return () => {\n portalRefsSet.current.delete(ref);\n portalContainerRefs.current = Array.from(portalRefsSet.current);\n };\n }, []);\n\n return { register, portalContainerRefs };\n}\n\n/**\n * Hook for portal content (Popover) to register its container ref with the\n * nearest ancestor focus trap. No-op if there is no focus trap ancestor.\n *\n * @param portalRef - Ref to the portal's root DOM element\n * @param isActive - Whether the portal is currently mounted and should be registered\n */\nexport function useRegisterPortalWithFocusTrap(\n portalRef: React.RefObject<HTMLElement | null>,\n isActive: boolean\n) {\n const register = useContext(FocusTrapPortalContext);\n\n useEffect(() => {\n if (!register || !isActive) return;\n return register(portalRef);\n }, [register, isActive, portalRef]);\n}\n"],"names":["createContext","useRef","useCallback","useContext","useEffect","FocusTrapPortalContext","useFocusTrapPortalRegistry","portalRefsSet","Set","portalContainerRefs","register","ref","current","add","Array","from","delete","useRegisterPortalWithFocusTrap","portalRef","isActive"],"mappings":"AAUO,SAAA,iBAAAA,GAAA,UAAAC,GAAA,eAAAC,GAAA,cAAAC,GAAA,aAAAC,SAAA;AAAA,MAAMC,sBAA8D,IAAI;AAaxE,SAASC,IAA6B;AAC3C,QAAMC,IAAgBN,EAAiD,oBAAIO,KAAK,GAC1EC,IAAsBR,EAA8C,EAAE;AAW5E,SAAO;AAAA,IAAES,UATwBR,EAAaS,CAAAA,OAC5CJ,EAAcK,QAAQC,IAAIF,CAAG,GAC7BF,EAAoBG,UAAUE,MAAMC,KAAKR,EAAcK,OAAO,GACvD,MAAM;AACXL,MAAAA,EAAcK,QAAQI,OAAOL,CAAG,GAChCF,EAAoBG,UAAUE,MAAMC,KAAKR,EAAcK,OAAO;AAAA,IAChE,IACC,CAAA,CAAE;AAAA,IAEcH,qBAAAA;AAAAA,EAAAA;AACrB;AASO,SAASQ,EACdC,GACAC,GACA;AACA,QAAMT,IAAWP,EAAWE,CAAsB;AAElDD,EAAAA,EAAU,MAAM;AACd,QAAI,GAACM,KAAY,CAACS;AAClB,aAAOT,EAASQ,CAAS;AAAA,EAC3B,GAAG,CAACR,GAAUS,GAAUD,CAAS,CAAC;AACpC;"}
|
package/dist/index33.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import e from "react";
|
|
2
2
|
import { Button as N } from "./index4.js";
|
|
3
3
|
import { Badge as I } from "./index10.js";
|
|
4
|
-
import { Icon as
|
|
4
|
+
import { Icon as d } from "./index6.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
const t = {
|
|
7
7
|
widgetCtn: "flex flex-col gap-[2px] align-center border border-[var(--color-gray-200)] rounded-[12px] w-[385px]",
|
|
@@ -21,16 +21,16 @@ const t = {
|
|
|
21
21
|
requestFeatureImageCtn: "w-[48px] h-[48px] border border-[var(--color-gray-200)] rounded-[50%] flex items-center flex-shrink-0 bg-[var(--color-red-50)]",
|
|
22
22
|
requestFeatureDescriptionCtn: "flex flex-col"
|
|
23
23
|
}, B = ({
|
|
24
|
-
widgetClassName:
|
|
24
|
+
widgetClassName: g = "",
|
|
25
25
|
widgetType: a = "general",
|
|
26
26
|
widgetTitle: r = "",
|
|
27
27
|
widgetDescription: l = "",
|
|
28
28
|
widgetImage: p,
|
|
29
|
-
hasImage:
|
|
29
|
+
hasImage: f = !1,
|
|
30
30
|
hasButtonCta: n = !1,
|
|
31
31
|
hasLinkCta: i = !1,
|
|
32
32
|
ctaText: o = "",
|
|
33
|
-
hasBadge:
|
|
33
|
+
hasBadge: x = !1,
|
|
34
34
|
badgeText: w = "",
|
|
35
35
|
buttonBgColor: u = "secondary",
|
|
36
36
|
onCtaClick: b,
|
|
@@ -38,7 +38,7 @@ const t = {
|
|
|
38
38
|
webinarDateInfo: c,
|
|
39
39
|
webinarSpeaker: s
|
|
40
40
|
}) => {
|
|
41
|
-
const E =
|
|
41
|
+
const E = x && /* @__PURE__ */ e.createElement(I, {
|
|
42
42
|
label: w,
|
|
43
43
|
className: t.widgetBadge,
|
|
44
44
|
bgColor: "var(--color-yellow-50)",
|
|
@@ -52,14 +52,14 @@ const t = {
|
|
|
52
52
|
label: o,
|
|
53
53
|
className: `${t.widgetButtonCta} mt-[4px]`,
|
|
54
54
|
onClick: b
|
|
55
|
-
})), C =
|
|
55
|
+
})), C = f && /* @__PURE__ */ e.createElement("div", {
|
|
56
56
|
className: `${t.widgetImageCtn} widget-image-ctn`
|
|
57
57
|
}, /* @__PURE__ */ e.createElement("img", {
|
|
58
58
|
src: p,
|
|
59
59
|
alt: "widget-image"
|
|
60
60
|
}));
|
|
61
61
|
return /* @__PURE__ */ e.createElement("div", {
|
|
62
|
-
className: `${t.widgetCtn} ${
|
|
62
|
+
className: `${t.widgetCtn} ${g} widget-ctn`,
|
|
63
63
|
onClick: v
|
|
64
64
|
}, a !== "general" && C, /* @__PURE__ */ e.createElement("div", {
|
|
65
65
|
className: t.descriptionCtn
|
|
@@ -71,14 +71,14 @@ const t = {
|
|
|
71
71
|
className: t.webinarInfoCtn
|
|
72
72
|
}, s && /* @__PURE__ */ e.createElement("div", {
|
|
73
73
|
className: `${t.webinarDescriptionInfo} align-baseline`
|
|
74
|
-
}, /* @__PURE__ */ e.createElement(
|
|
74
|
+
}, /* @__PURE__ */ e.createElement(d, {
|
|
75
75
|
name: "people",
|
|
76
76
|
className: "relative top-[2px]"
|
|
77
77
|
}), /* @__PURE__ */ e.createElement("span", {
|
|
78
78
|
className: t.webinarSpeaker
|
|
79
79
|
}, s)), c && /* @__PURE__ */ e.createElement("div", {
|
|
80
80
|
className: `${t.webinarTimeInfo} align-baseline mb-[4px]`
|
|
81
|
-
}, /* @__PURE__ */ e.createElement(
|
|
81
|
+
}, /* @__PURE__ */ e.createElement(d, {
|
|
82
82
|
name: "clock",
|
|
83
83
|
className: "relative top-[2px]"
|
|
84
84
|
}), /* @__PURE__ */ e.createElement("span", {
|
|
@@ -96,6 +96,7 @@ const t = {
|
|
|
96
96
|
}, l), m)) : m));
|
|
97
97
|
};
|
|
98
98
|
export {
|
|
99
|
-
B as Widget
|
|
99
|
+
B as Widget,
|
|
100
|
+
B as default
|
|
100
101
|
};
|
|
101
102
|
//# sourceMappingURL=index33.js.map
|
package/dist/index43.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import e, { useState as g, useRef as p } from "react";
|
|
2
2
|
import { Icon as c } from "./index6.js";
|
|
3
|
-
import { ProgressBar as
|
|
3
|
+
import { ProgressBar as f } from "./index42.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
const r = {
|
|
6
6
|
gettingStartedWidgetCtn: "border border-[var(--color-gray-200)] rounded-[12px] w-[385px] p-4",
|
|
@@ -14,7 +14,7 @@ const r = {
|
|
|
14
14
|
}) => {
|
|
15
15
|
const [n, l] = g(!1), o = p(null), i = () => {
|
|
16
16
|
l(!n);
|
|
17
|
-
},
|
|
17
|
+
}, d = (t) => t ? "var(--color-green-500)" : "var(--color-gray-200)";
|
|
18
18
|
return /* @__PURE__ */ e.createElement("div", {
|
|
19
19
|
className: `${r.gettingStartedWidgetCtn} ${s} getting-started-widget-ctn`
|
|
20
20
|
}, /* @__PURE__ */ e.createElement("div", {
|
|
@@ -27,7 +27,7 @@ const r = {
|
|
|
27
27
|
onClick: i
|
|
28
28
|
})), /* @__PURE__ */ e.createElement("div", {
|
|
29
29
|
className: "mt-[12px]"
|
|
30
|
-
}, /* @__PURE__ */ e.createElement(
|
|
30
|
+
}, /* @__PURE__ */ e.createElement(f, {
|
|
31
31
|
totalTasks: a.length,
|
|
32
32
|
completedTasks: a.filter((t) => t.isComplete).length,
|
|
33
33
|
progressBarCtnClassName: "get-started-progress-bar-ctn"
|
|
@@ -37,18 +37,19 @@ const r = {
|
|
|
37
37
|
style: {
|
|
38
38
|
maxHeight: n ? `${o.current?.scrollHeight}px` : "0px"
|
|
39
39
|
}
|
|
40
|
-
}, a.map((t,
|
|
41
|
-
key:
|
|
40
|
+
}, a.map((t, m) => /* @__PURE__ */ e.createElement("div", {
|
|
41
|
+
key: m,
|
|
42
42
|
className: r.actionItemCtn
|
|
43
43
|
}, /* @__PURE__ */ e.createElement(c, {
|
|
44
44
|
name: "checked-circle",
|
|
45
|
-
stroke:
|
|
45
|
+
stroke: d(t.isComplete)
|
|
46
46
|
}), /* @__PURE__ */ e.createElement("span", {
|
|
47
47
|
className: t.isComplete ? "text-[var(--color-gray-500)]" : "text-[var(--color-gray-900)] cursor-pointer",
|
|
48
48
|
onClick: t?.handleActionItemClick
|
|
49
49
|
}, t.label)))));
|
|
50
50
|
};
|
|
51
51
|
export {
|
|
52
|
-
E as GetStartedWidget
|
|
52
|
+
E as GetStartedWidget,
|
|
53
|
+
E as default
|
|
53
54
|
};
|
|
54
55
|
//# sourceMappingURL=index43.js.map
|
package/dist/index44.js
CHANGED
package/dist/index60.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import t from "react";
|
|
2
2
|
/* empty css */
|
|
3
3
|
const n = ({
|
|
4
4
|
element: e,
|
|
@@ -15,12 +15,12 @@ const n = ({
|
|
|
15
15
|
"--shimmer-base-color": s,
|
|
16
16
|
"--shimmer-highlight-color": m
|
|
17
17
|
}, r = `se-design-shimmer-element se-design-shimmer-${e.type}`;
|
|
18
|
-
return /* @__PURE__ */
|
|
18
|
+
return /* @__PURE__ */ t.createElement("div", {
|
|
19
19
|
className: r,
|
|
20
20
|
style: i
|
|
21
|
-
}, e.children && e.children.map((
|
|
21
|
+
}, e.children && e.children.map((a, p) => /* @__PURE__ */ t.createElement(n, {
|
|
22
22
|
key: p,
|
|
23
|
-
element:
|
|
23
|
+
element: a,
|
|
24
24
|
animationDuration: d,
|
|
25
25
|
baseColor: s,
|
|
26
26
|
highlightColor: m
|
|
@@ -40,48 +40,48 @@ const n = ({
|
|
|
40
40
|
alignItems: e.alignItems,
|
|
41
41
|
flex: e.flex
|
|
42
42
|
};
|
|
43
|
-
return /* @__PURE__ */
|
|
43
|
+
return /* @__PURE__ */ t.createElement("div", {
|
|
44
44
|
className: `se-design-shimmer-container ${e.className || ""}`,
|
|
45
45
|
style: i
|
|
46
|
-
}, e.children.map((r,
|
|
47
|
-
key:
|
|
46
|
+
}, e.children.map((r, a) => r.type === "container" ? /* @__PURE__ */ t.createElement(y, {
|
|
47
|
+
key: a,
|
|
48
48
|
container: r,
|
|
49
49
|
animationDuration: d,
|
|
50
50
|
baseColor: s,
|
|
51
51
|
highlightColor: m
|
|
52
|
-
}) : /* @__PURE__ */
|
|
53
|
-
key:
|
|
52
|
+
}) : /* @__PURE__ */ t.createElement(n, {
|
|
53
|
+
key: a,
|
|
54
54
|
element: r,
|
|
55
55
|
animationDuration: d,
|
|
56
56
|
baseColor: s,
|
|
57
57
|
highlightColor: m
|
|
58
58
|
})));
|
|
59
|
-
},
|
|
59
|
+
}, l = ({
|
|
60
60
|
structure: e,
|
|
61
61
|
className: d = "",
|
|
62
62
|
animationDuration: s = 3,
|
|
63
63
|
baseColor: m = "var(--color-gray-700)",
|
|
64
64
|
highlightColor: i = "var(--color-gray-600)",
|
|
65
65
|
width: r,
|
|
66
|
-
height:
|
|
66
|
+
height: a
|
|
67
67
|
}) => {
|
|
68
68
|
const p = {
|
|
69
69
|
width: r ? typeof r == "number" ? `${r}px` : r : "100%",
|
|
70
|
-
height:
|
|
70
|
+
height: a ? typeof a == "number" ? `${a}px` : a : "auto",
|
|
71
71
|
"--shimmer-duration": `${s}s`,
|
|
72
72
|
"--shimmer-base-color": m,
|
|
73
73
|
"--shimmer-highlight-color": i
|
|
74
74
|
};
|
|
75
|
-
return /* @__PURE__ */
|
|
75
|
+
return /* @__PURE__ */ t.createElement("div", {
|
|
76
76
|
className: `se-design-shimmer-loader ${d}`,
|
|
77
77
|
style: p
|
|
78
|
-
}, e.map((c, o) => c.type === "container" ? /* @__PURE__ */
|
|
78
|
+
}, e.map((c, o) => c.type === "container" ? /* @__PURE__ */ t.createElement(y, {
|
|
79
79
|
key: o,
|
|
80
80
|
container: c,
|
|
81
81
|
animationDuration: s,
|
|
82
82
|
baseColor: m,
|
|
83
83
|
highlightColor: i
|
|
84
|
-
}) : /* @__PURE__ */
|
|
84
|
+
}) : /* @__PURE__ */ t.createElement(n, {
|
|
85
85
|
key: o,
|
|
86
86
|
element: c,
|
|
87
87
|
animationDuration: s,
|
|
@@ -90,6 +90,7 @@ const n = ({
|
|
|
90
90
|
})));
|
|
91
91
|
};
|
|
92
92
|
export {
|
|
93
|
-
|
|
93
|
+
l as ShimmerLoader,
|
|
94
|
+
l as default
|
|
94
95
|
};
|
|
95
96
|
//# sourceMappingURL=index60.js.map
|
package/dist/index67.js
CHANGED
|
@@ -1,33 +1,35 @@
|
|
|
1
|
-
import o, { useState as
|
|
2
|
-
import { Button as
|
|
3
|
-
import { Tooltip as
|
|
1
|
+
import o, { useState as U, useRef as P, useCallback as m, useEffect as k } from "react";
|
|
2
|
+
import { Button as M } from "./index4.js";
|
|
3
|
+
import { Tooltip as Y } from "./index16.js";
|
|
4
|
+
import { Icon as K } from "./index6.js";
|
|
4
5
|
/* empty css */
|
|
5
|
-
const
|
|
6
|
+
const f = {
|
|
6
7
|
gotIt: "got_it",
|
|
7
8
|
finish: "finish",
|
|
8
9
|
next: "next",
|
|
9
10
|
back: "back"
|
|
10
|
-
},
|
|
11
|
-
steps:
|
|
11
|
+
}, te = ({
|
|
12
|
+
steps: t = [],
|
|
12
13
|
screenBaseElementSelector: T = "",
|
|
13
14
|
handleCloseProductTour: d,
|
|
14
15
|
tourType: g = "",
|
|
15
|
-
automationId:
|
|
16
|
-
highlightBorderRadius:
|
|
17
|
-
customClassName:
|
|
18
|
-
|
|
16
|
+
automationId: h = "onboarding-tour",
|
|
17
|
+
highlightBorderRadius: w = 6,
|
|
18
|
+
customClassName: W = "",
|
|
19
|
+
showSkipCTA: v = !1,
|
|
20
|
+
labels: A
|
|
19
21
|
}) => {
|
|
20
|
-
const [
|
|
21
|
-
next:
|
|
22
|
-
gotIt:
|
|
23
|
-
finish:
|
|
24
|
-
skip:
|
|
25
|
-
stepInfo:
|
|
26
|
-
} =
|
|
22
|
+
const [e, y] = U(0), c = P(null), l = P(null), {
|
|
23
|
+
next: O = "Next",
|
|
24
|
+
gotIt: V = "Got It",
|
|
25
|
+
finish: z = "Finish",
|
|
26
|
+
skip: $ = "Skip tour",
|
|
27
|
+
stepInfo: F = "Step {step} of {total}"
|
|
28
|
+
} = A || {}, s = document.querySelector(T), x = m(() => {
|
|
27
29
|
let n;
|
|
28
|
-
if (
|
|
30
|
+
if (e >= t.length)
|
|
29
31
|
return n;
|
|
30
|
-
const i = document.querySelector(e
|
|
32
|
+
const i = document.querySelector(t[e]?.targetElementContainerSelector ? t[e].targetElementContainerSelector : t[e]?.targetElementSelector);
|
|
31
33
|
if (!i)
|
|
32
34
|
return n;
|
|
33
35
|
const r = i.getBoundingClientRect();
|
|
@@ -38,56 +40,56 @@ const u = {
|
|
|
38
40
|
behavior: "auto",
|
|
39
41
|
block: "end"
|
|
40
42
|
})), n = setTimeout(() => {
|
|
41
|
-
const
|
|
42
|
-
if (!
|
|
43
|
+
const I = document.querySelector(t[e]?.targetElementSelector);
|
|
44
|
+
if (!I || !c.current || !l.current)
|
|
43
45
|
return;
|
|
44
|
-
const a =
|
|
45
|
-
c.current.style.height = `${
|
|
46
|
-
const
|
|
46
|
+
const a = I.getBoundingClientRect(), p = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);
|
|
47
|
+
c.current.style.height = `${p}px`;
|
|
48
|
+
const u = t[e]?.targetElementGap || {
|
|
47
49
|
horizontal: 0,
|
|
48
50
|
vertical: 0
|
|
49
|
-
},
|
|
50
|
-
<svg width="${
|
|
51
|
+
}, C = w * 2, R = a.left - u.horizontal, _ = a.top + window.scrollY - u.vertical, G = a.right + u.horizontal, q = a.bottom + window.scrollY + u.vertical, B = G - R, D = q - _, L = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth), H = encodeURIComponent(`
|
|
52
|
+
<svg width="${L}" height="${p}" xmlns="http://www.w3.org/2000/svg">
|
|
51
53
|
<defs>
|
|
52
|
-
<mask id="highlight-mask-${
|
|
53
|
-
<rect x="0" y="0" width="${
|
|
54
|
-
<rect x="${
|
|
54
|
+
<mask id="highlight-mask-${e}">
|
|
55
|
+
<rect x="0" y="0" width="${L}" height="${p}" fill="white"/>
|
|
56
|
+
<rect x="${R}" y="${_}" width="${B}" height="${D}" rx="${C}" ry="${C}" fill="black"/>
|
|
55
57
|
</mask>
|
|
56
58
|
</defs>
|
|
57
59
|
</svg>
|
|
58
60
|
`);
|
|
59
|
-
c.current.style.maskImage = `url("data:image/svg+xml,${
|
|
61
|
+
c.current.style.maskImage = `url("data:image/svg+xml,${H}#highlight-mask-${e}")`, c.current.style.webkitMaskImage = `url("data:image/svg+xml,${H}#highlight-mask-${e}")`, l.current.style.top = `${a.top}px`, l.current.style.left = `${a.left}px`, l.current.style.width = `${a.width}px`, l.current.style.height = `${a.height}px`, l.current.style.borderRadius = `${w}px`;
|
|
60
62
|
}, 50), n;
|
|
61
|
-
}, [
|
|
63
|
+
}, [e, t]), N = m(() => {
|
|
62
64
|
d(), s && s.scrollTo({
|
|
63
65
|
top: 0,
|
|
64
66
|
behavior: "smooth"
|
|
65
67
|
});
|
|
66
|
-
}, [d, s]),
|
|
67
|
-
n?.preventDefault(), n?.stopPropagation(),
|
|
68
|
+
}, [d, s]), b = m((n) => {
|
|
69
|
+
n?.preventDefault(), n?.stopPropagation(), e < t.length - 1 ? y((i) => i + 1) : (d(n), s && s.scrollTo({
|
|
68
70
|
top: 0,
|
|
69
71
|
behavior: "smooth"
|
|
70
|
-
})), e
|
|
72
|
+
})), t[e]?.tourMixPanelHandler?.({
|
|
71
73
|
user_path: g,
|
|
72
|
-
action_type: `clicked_${
|
|
74
|
+
action_type: `clicked_${e === t.length - 1 ? t.length === 1 ? f.gotIt : f.finish : f.next}`
|
|
73
75
|
});
|
|
74
|
-
}, [
|
|
75
|
-
|
|
76
|
+
}, [e, t, d, g, s]), S = m(() => {
|
|
77
|
+
e > 0 && y((n) => n - 1), t[e]?.tourMixPanelHandler?.({
|
|
76
78
|
user_path: g,
|
|
77
|
-
action_type: `clicked_${
|
|
79
|
+
action_type: `clicked_${f.back}`
|
|
78
80
|
});
|
|
79
|
-
}, [
|
|
80
|
-
(n.keyCode === 37 || n.key === "ArrowLeft") &&
|
|
81
|
-
}, [
|
|
82
|
-
return
|
|
83
|
-
window.removeEventListener("keydown",
|
|
84
|
-
}), [
|
|
81
|
+
}, [e, t, g]), E = m((n) => {
|
|
82
|
+
(n.keyCode === 37 || n.key === "ArrowLeft") && e > 0 && S(), (n.keyCode === 39 || n.key === "ArrowRight") && b();
|
|
83
|
+
}, [e, b, S]);
|
|
84
|
+
return k(() => (window.addEventListener("keydown", E), () => {
|
|
85
|
+
window.removeEventListener("keydown", E);
|
|
86
|
+
}), [E]), k(() => {
|
|
85
87
|
let n;
|
|
86
|
-
return
|
|
88
|
+
return e < t.length && (n = x()), () => {
|
|
87
89
|
n && clearTimeout(n);
|
|
88
90
|
};
|
|
89
|
-
}, [
|
|
90
|
-
if (
|
|
91
|
+
}, [e, t, x]), k(() => {
|
|
92
|
+
if (e < t.length && c.current) {
|
|
91
93
|
const n = c.current, i = (r) => {
|
|
92
94
|
r.preventDefault(), r.stopPropagation();
|
|
93
95
|
};
|
|
@@ -101,49 +103,57 @@ const u = {
|
|
|
101
103
|
n.removeEventListener("wheel", i), n.removeEventListener("touchmove", i), n.removeEventListener("scroll", i);
|
|
102
104
|
};
|
|
103
105
|
}
|
|
104
|
-
}, [
|
|
106
|
+
}, [e]), !t || t.length === 0 ? null : /* @__PURE__ */ o.createElement(o.Fragment, null, /* @__PURE__ */ o.createElement("div", {
|
|
105
107
|
className: "se-design-onboarding-tour-overlay",
|
|
106
108
|
ref: c,
|
|
107
|
-
"data-automation-id": `${
|
|
108
|
-
}), /* @__PURE__ */ o.createElement(
|
|
109
|
+
"data-automation-id": `${h}-overlay`
|
|
110
|
+
}), /* @__PURE__ */ o.createElement(Y, {
|
|
109
111
|
content: /* @__PURE__ */ o.createElement("div", {
|
|
110
|
-
className: `se-design-onboarding-tour-tooltip-content ${
|
|
111
|
-
}, e
|
|
112
|
-
src: e
|
|
112
|
+
className: `se-design-onboarding-tour-tooltip-content ${W}`
|
|
113
|
+
}, t[e]?.content?.illustration && /* @__PURE__ */ o.createElement("img", {
|
|
114
|
+
src: t[e].content.illustration,
|
|
113
115
|
className: "se-design-onboarding-tour-illustration",
|
|
114
116
|
alt: "illustration"
|
|
115
117
|
}), /* @__PURE__ */ o.createElement("div", {
|
|
116
118
|
className: "se-design-onboarding-tour-content"
|
|
117
|
-
}, e
|
|
118
|
-
className:
|
|
119
|
-
},
|
|
120
|
-
className: `se-design-onboarding-tour-
|
|
121
|
-
}, e
|
|
119
|
+
}, (t[e]?.content?.title || !v) && /* @__PURE__ */ o.createElement("div", {
|
|
120
|
+
className: "se-design-onboarding-tour-header"
|
|
121
|
+
}, t[e]?.content?.title && /* @__PURE__ */ o.createElement("p", {
|
|
122
|
+
className: `se-design-onboarding-tour-title ${t[e].content.titleClassName || ""}`
|
|
123
|
+
}, t[e].content.title), !v && /* @__PURE__ */ o.createElement(K, {
|
|
124
|
+
name: "close",
|
|
125
|
+
onClick: N,
|
|
126
|
+
ariaLabel: $,
|
|
127
|
+
className: "se-design-onboarding-tour-close-icon cursor-pointer",
|
|
128
|
+
automationId: `${h}-skip-button`
|
|
129
|
+
})), t[e]?.content?.description && /* @__PURE__ */ o.createElement("p", {
|
|
130
|
+
className: `se-design-onboarding-tour-description ${t[e].content.descriptionClassName || ""}`
|
|
131
|
+
}, t[e].content.description)), /* @__PURE__ */ o.createElement("div", {
|
|
122
132
|
className: "se-design-onboarding-tour-actions"
|
|
123
|
-
},
|
|
133
|
+
}, t.length > 1 && /* @__PURE__ */ o.createElement("span", {
|
|
124
134
|
className: "steps"
|
|
125
|
-
},
|
|
135
|
+
}, F.replace("{step}", `${e + 1}`).replace("{total}", `${t.length}`)), /* @__PURE__ */ o.createElement("div", {
|
|
126
136
|
className: "btns-container"
|
|
127
|
-
},
|
|
137
|
+
}, v && e !== t.length - 1 && /* @__PURE__ */ o.createElement(M, {
|
|
128
138
|
theme: "white",
|
|
129
139
|
type: "link",
|
|
130
|
-
label:
|
|
131
|
-
automationId: `${
|
|
132
|
-
onClick:
|
|
133
|
-
}), /* @__PURE__ */ o.createElement(
|
|
140
|
+
label: $,
|
|
141
|
+
automationId: `${h}-skip-button`,
|
|
142
|
+
onClick: N
|
|
143
|
+
}), /* @__PURE__ */ o.createElement(M, {
|
|
134
144
|
theme: "white",
|
|
135
145
|
type: "primary",
|
|
136
146
|
size: "sm",
|
|
137
|
-
label:
|
|
138
|
-
automationId: `${
|
|
139
|
-
onClick:
|
|
147
|
+
label: e === t.length - 1 ? t.length === 1 ? V : z : O,
|
|
148
|
+
automationId: `${h}-next-button`,
|
|
149
|
+
onClick: b
|
|
140
150
|
})))),
|
|
141
151
|
tooltipSrc: /* @__PURE__ */ o.createElement("div", {
|
|
142
152
|
className: "blocker",
|
|
143
153
|
ref: l
|
|
144
154
|
}),
|
|
145
155
|
tooltipSrcRef: l,
|
|
146
|
-
position: e
|
|
156
|
+
position: t[e]?.tooltipPosition || "bottom-center",
|
|
147
157
|
tooltipOffset: 16,
|
|
148
158
|
displayOn: "always-on",
|
|
149
159
|
isWithPortal: !0,
|
|
@@ -151,6 +161,6 @@ const u = {
|
|
|
151
161
|
}));
|
|
152
162
|
};
|
|
153
163
|
export {
|
|
154
|
-
|
|
164
|
+
te as OnboardingTour
|
|
155
165
|
};
|
|
156
166
|
//# sourceMappingURL=index67.js.map
|
package/dist/index67.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index67.js","sources":["../src/components/OnboardingTour/index.tsx"],"sourcesContent":["import React, { FC, useEffect, useRef, useState, useCallback } from 'react';\n\nimport { Button } from 'components/Button';\nimport { Tooltip } from 'components/Tooltip';\n\nimport './style.scss';\n\nconst TOUR_NAVIGATION_STEPS = {\n gotIt: 'got_it',\n finish: 'finish',\n next: 'next',\n back: 'back'\n};\n\nexport interface TourStep {\n targetElementSelector: string;\n targetElementContainerSelector?: string;\n targetElementGap?: {\n horizontal: number;\n vertical: number;\n };\n tooltipPosition?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'left-top'\n | 'left-center'\n | 'left-bottom'\n | 'right-top'\n | 'right-center'\n | 'right-bottom';\n content: {\n title?: string;\n description?: string;\n illustration?: any;\n titleClassName?: string;\n descriptionClassName?: string;\n };\n tourMixPanelHandler?: (data: { user_path: string; action_type: string }) => void;\n}\n\nexport interface OnboardingTourProps {\n steps: TourStep[];\n screenBaseElementSelector: string;\n handleCloseProductTour: (e?: React.MouseEvent<HTMLButtonElement>) => void;\n tourType?: string;\n highlightBorderRadius?: number;\n automationId?: string;\n customClassName?: string;\n labels?: {\n next: string;\n gotIt: string;\n finish: string;\n skip: string;\n stepInfo: string;\n };\n}\n\nexport const OnboardingTour: FC<OnboardingTourProps> = ({\n steps = [],\n screenBaseElementSelector = '',\n handleCloseProductTour,\n tourType = '',\n automationId = 'onboarding-tour',\n highlightBorderRadius = 6,\n customClassName = '',\n labels\n}) => {\n const [currentStep, setCurrentStep] = useState(0);\n const overlayRef = useRef<HTMLDivElement>(null);\n const blockerRef = useRef<HTMLDivElement>(null);\n\n const {\n next = 'Next',\n gotIt = 'Got It',\n finish = 'Finish',\n skip = 'Skip tour',\n stepInfo = 'Step {step} of {total}'\n } = labels || {};\n\n const parentScreenElement = document.querySelector(screenBaseElementSelector) as HTMLElement | null;\n\n const clipTargetElementAndPositionTooltip = useCallback(() => {\n let timerId: any;\n\n if (currentStep >= steps.length) {\n return timerId;\n }\n\n // get the target element\n const initialTargetElement = document.querySelector(\n steps[currentStep]?.targetElementContainerSelector\n ? steps[currentStep].targetElementContainerSelector\n : steps[currentStep]?.targetElementSelector\n ) as HTMLElement | null;\n\n if (!initialTargetElement) {\n return timerId;\n }\n\n const initialTargetArea = initialTargetElement.getBoundingClientRect();\n\n // check whether target element is fully visible in viewport\n const isFullyVisible =\n initialTargetArea.top >= 0 &&\n initialTargetArea.left >= 0 &&\n initialTargetArea.bottom <= window.innerHeight &&\n initialTargetArea.right <= window.innerWidth;\n\n if (!isFullyVisible) {\n if (initialTargetArea.top < 0) {\n initialTargetElement.scrollIntoView({ behavior: 'auto', block: 'start' });\n } else if (initialTargetArea.bottom > window.innerHeight) {\n initialTargetElement.scrollIntoView({ behavior: 'auto', block: 'end' });\n }\n }\n\n // if the target element is visible, then clip the target element and position the tooltip\n timerId = setTimeout(() => {\n const targetElement = document.querySelector(steps[currentStep]?.targetElementSelector) as HTMLElement | null;\n\n if (!targetElement || !overlayRef.current || !blockerRef.current) {\n return;\n }\n\n const targetArea = targetElement.getBoundingClientRect();\n\n const documentHeight = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n\n // Update overlay dimensions and calculate target element area to focus\n overlayRef.current.style.height = `${documentHeight}px`;\n\n // Providing gap around target element\n const targetElementGap = steps[currentStep]?.targetElementGap || { horizontal: 0, vertical: 0 };\n\n // clip the target element with rounded corners\n const borderRadius = highlightBorderRadius * 2;\n const left = targetArea.left - targetElementGap.horizontal;\n const top = targetArea.top + window.scrollY - targetElementGap.vertical;\n const right = targetArea.right + targetElementGap.horizontal;\n const bottom = targetArea.bottom + window.scrollY + targetElementGap.vertical;\n const width = right - left;\n const height = bottom - top;\n const documentWidth = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth);\n\n // Create SVG mask with rounded rectangle hole\n const svgMask = encodeURIComponent(`\n <svg width=\"${documentWidth}\" height=\"${documentHeight}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <mask id=\"highlight-mask-${currentStep}\">\n <rect x=\"0\" y=\"0\" width=\"${documentWidth}\" height=\"${documentHeight}\" fill=\"white\"/>\n <rect x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" rx=\"${borderRadius}\" ry=\"${borderRadius}\" fill=\"black\"/>\n </mask>\n </defs>\n </svg>\n `);\n\n // Apply created mask to the overlay\n overlayRef.current.style.maskImage = `url(\"data:image/svg+xml,${svgMask}#highlight-mask-${currentStep}\")`;\n overlayRef.current.style.webkitMaskImage = `url(\"data:image/svg+xml,${svgMask}#highlight-mask-${currentStep}\")`;\n\n // Position blocker over clipped area to avoid clicks on the target element\n blockerRef.current.style.top = `${targetArea.top}px`;\n blockerRef.current.style.left = `${targetArea.left}px`;\n blockerRef.current.style.width = `${targetArea.width}px`;\n blockerRef.current.style.height = `${targetArea.height}px`;\n blockerRef.current.style.borderRadius = `${highlightBorderRadius}px`;\n }, 50);\n\n return timerId;\n }, [currentStep, steps]);\n\n const handleSkipTour = useCallback(() => {\n handleCloseProductTour();\n if (parentScreenElement) {\n parentScreenElement.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }, [handleCloseProductTour, parentScreenElement]);\n\n const handleNextClick = useCallback(\n (e?: React.MouseEvent<HTMLButtonElement>) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n } else {\n handleCloseProductTour(e);\n if (parentScreenElement) {\n parentScreenElement.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }\n steps[currentStep]?.tourMixPanelHandler?.({\n user_path: tourType,\n action_type: `clicked_${\n currentStep === steps.length - 1\n ? steps.length === 1\n ? TOUR_NAVIGATION_STEPS.gotIt\n : TOUR_NAVIGATION_STEPS.finish\n : TOUR_NAVIGATION_STEPS.next\n }`\n });\n },\n [currentStep, steps, handleCloseProductTour, tourType, parentScreenElement]\n );\n\n const handlePrevClick = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n steps[currentStep]?.tourMixPanelHandler?.({\n user_path: tourType,\n action_type: `clicked_${TOUR_NAVIGATION_STEPS.back}`\n });\n }, [currentStep, steps, tourType]);\n\n const handleKeyPress = useCallback(\n (e: KeyboardEvent) => {\n if (e.keyCode === 37 || e.key === 'ArrowLeft') {\n // for previous navigation\n if (currentStep > 0) {\n handlePrevClick();\n }\n }\n if (e.keyCode === 39 || e.key === 'ArrowRight') {\n // for next navigation\n handleNextClick();\n }\n },\n [currentStep, handleNextClick, handlePrevClick]\n );\n\n useEffect(() => {\n // Adding event listener for keydown\n window.addEventListener('keydown', handleKeyPress);\n\n return () => {\n window.removeEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n useEffect(() => {\n let timerId: any;\n if (currentStep < steps.length) {\n timerId = clipTargetElementAndPositionTooltip();\n }\n\n return () => {\n if (timerId) {\n clearTimeout(timerId);\n }\n };\n }, [currentStep, steps, clipTargetElementAndPositionTooltip]);\n\n // To prevent scroll when tour is active\n useEffect(() => {\n if (currentStep < steps.length && overlayRef.current) {\n const overlay = overlayRef.current;\n\n const preventScroll = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n overlay.addEventListener('wheel', preventScroll, { passive: false });\n overlay.addEventListener('touchmove', preventScroll, { passive: false });\n overlay.addEventListener('scroll', preventScroll, { passive: false });\n\n return () => {\n overlay.removeEventListener('wheel', preventScroll);\n overlay.removeEventListener('touchmove', preventScroll);\n overlay.removeEventListener('scroll', preventScroll);\n };\n }\n }, [currentStep]);\n\n if (!steps || steps.length === 0) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"se-design-onboarding-tour-overlay\"\n ref={overlayRef}\n data-automation-id={`${automationId}-overlay`}\n />\n\n <Tooltip\n content={\n <div className={`se-design-onboarding-tour-tooltip-content ${customClassName}`}>\n {steps[currentStep]?.content?.illustration && (\n <img\n src={steps[currentStep].content.illustration}\n className=\"se-design-onboarding-tour-illustration\"\n alt=\"illustration\"\n />\n )}\n <div className=\"se-design-onboarding-tour-content\">\n {steps[currentStep]?.content?.title && (\n <p\n className={`se-design-onboarding-tour-title ${steps[currentStep].content.titleClassName || ''}`}\n >\n {steps[currentStep].content.title}\n </p>\n )}\n {steps[currentStep]?.content?.description && (\n <p\n className={`se-design-onboarding-tour-description ${\n steps[currentStep].content.descriptionClassName || ''\n }`}\n >\n {steps[currentStep].content.description}\n </p>\n )}\n </div>\n\n <div className=\"se-design-onboarding-tour-actions\">\n {steps.length > 1 && (\n <span className=\"steps\">\n {stepInfo.replace('{step}', `${currentStep + 1}`).replace('{total}', `${steps.length}`)}\n </span>\n )}\n <div className=\"btns-container\">\n {currentStep !== steps.length - 1 && (\n <Button\n theme=\"white\"\n type=\"link\"\n label={skip}\n automationId={`${automationId}-skip-button`}\n onClick={handleSkipTour}\n />\n )}\n <Button\n theme=\"white\"\n type=\"primary\"\n size=\"sm\"\n label={currentStep === steps.length - 1 ? (steps.length === 1 ? gotIt : finish) : next}\n automationId={`${automationId}-next-button`}\n onClick={handleNextClick}\n />\n </div>\n </div>\n </div>\n }\n tooltipSrc={<div className=\"blocker\" ref={blockerRef} />}\n tooltipSrcRef={blockerRef as React.RefObject<HTMLDivElement>}\n position={steps[currentStep]?.tooltipPosition || 'bottom-center'}\n tooltipOffset={16}\n displayOn=\"always-on\"\n isWithPortal={true}\n maxWidth={384}\n />\n </>\n );\n};\n"],"names":["React__default","useState","useRef","useCallback","useEffect","Button","Tooltip","TOUR_NAVIGATION_STEPS","gotIt","finish","next","back","OnboardingTour","steps","screenBaseElementSelector","handleCloseProductTour","tourType","automationId","highlightBorderRadius","customClassName","labels","currentStep","setCurrentStep","overlayRef","blockerRef","skip","stepInfo","parentScreenElement","document","querySelector","clipTargetElementAndPositionTooltip","timerId","length","initialTargetElement","targetElementContainerSelector","targetElementSelector","initialTargetArea","getBoundingClientRect","top","left","bottom","window","innerHeight","right","innerWidth","scrollIntoView","behavior","block","setTimeout","targetElement","current","targetArea","documentHeight","Math","max","documentElement","scrollHeight","body","style","height","targetElementGap","horizontal","vertical","borderRadius","scrollY","width","documentWidth","scrollWidth","svgMask","encodeURIComponent","maskImage","webkitMaskImage","handleSkipTour","scrollTo","handleNextClick","e","preventDefault","stopPropagation","prev","tourMixPanelHandler","user_path","action_type","handlePrevClick","handleKeyPress","keyCode","key","addEventListener","removeEventListener","clearTimeout","overlay","preventScroll","passive","createElement","React","Fragment","className","ref","content","illustration","src","alt","title","titleClassName","description","descriptionClassName","replace","theme","type","label","onClick","size","tooltipSrc","tooltipSrcRef","position","tooltipPosition","tooltipOffset","displayOn","isWithPortal","maxWidth"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index67.js","sources":["../src/components/OnboardingTour/index.tsx"],"sourcesContent":["import React, { FC, useEffect, useRef, useState, useCallback } from 'react';\n\nimport { Button } from 'components/Button';\nimport { Tooltip } from 'components/Tooltip';\nimport { Icon } from 'components/Icon';\n\nimport './style.scss';\n\nconst TOUR_NAVIGATION_STEPS = {\n gotIt: 'got_it',\n finish: 'finish',\n next: 'next',\n back: 'back'\n};\n\nexport interface TourStep {\n targetElementSelector: string;\n targetElementContainerSelector?: string;\n targetElementGap?: {\n horizontal: number;\n vertical: number;\n };\n tooltipPosition?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'left-top'\n | 'left-center'\n | 'left-bottom'\n | 'right-top'\n | 'right-center'\n | 'right-bottom';\n content: {\n title?: string;\n description?: string;\n illustration?: any;\n titleClassName?: string;\n descriptionClassName?: string;\n };\n tourMixPanelHandler?: (data: { user_path: string; action_type: string }) => void;\n}\n\nexport interface OnboardingTourProps {\n steps: TourStep[];\n screenBaseElementSelector: string;\n handleCloseProductTour: (e?: React.MouseEvent<HTMLButtonElement>) => void;\n tourType?: string;\n highlightBorderRadius?: number;\n automationId?: string;\n customClassName?: string;\n showSkipCTA?: boolean;\n labels?: {\n next: string;\n gotIt: string;\n finish: string;\n skip: string;\n stepInfo: string;\n };\n}\n\nexport const OnboardingTour: FC<OnboardingTourProps> = ({\n steps = [],\n screenBaseElementSelector = '',\n handleCloseProductTour,\n tourType = '',\n automationId = 'onboarding-tour',\n highlightBorderRadius = 6,\n customClassName = '',\n showSkipCTA = false,\n labels\n}) => {\n const [currentStep, setCurrentStep] = useState(0);\n const overlayRef = useRef<HTMLDivElement>(null);\n const blockerRef = useRef<HTMLDivElement>(null);\n\n const {\n next = 'Next',\n gotIt = 'Got It',\n finish = 'Finish',\n skip = 'Skip tour',\n stepInfo = 'Step {step} of {total}'\n } = labels || {};\n\n const parentScreenElement = document.querySelector(screenBaseElementSelector) as HTMLElement | null;\n\n const clipTargetElementAndPositionTooltip = useCallback(() => {\n let timerId: any;\n\n if (currentStep >= steps.length) {\n return timerId;\n }\n\n // get the target element\n const initialTargetElement = document.querySelector(\n steps[currentStep]?.targetElementContainerSelector\n ? steps[currentStep].targetElementContainerSelector\n : steps[currentStep]?.targetElementSelector\n ) as HTMLElement | null;\n\n if (!initialTargetElement) {\n return timerId;\n }\n\n const initialTargetArea = initialTargetElement.getBoundingClientRect();\n\n // check whether target element is fully visible in viewport\n const isFullyVisible =\n initialTargetArea.top >= 0 &&\n initialTargetArea.left >= 0 &&\n initialTargetArea.bottom <= window.innerHeight &&\n initialTargetArea.right <= window.innerWidth;\n\n if (!isFullyVisible) {\n if (initialTargetArea.top < 0) {\n initialTargetElement.scrollIntoView({ behavior: 'auto', block: 'start' });\n } else if (initialTargetArea.bottom > window.innerHeight) {\n initialTargetElement.scrollIntoView({ behavior: 'auto', block: 'end' });\n }\n }\n\n // if the target element is visible, then clip the target element and position the tooltip\n timerId = setTimeout(() => {\n const targetElement = document.querySelector(steps[currentStep]?.targetElementSelector) as HTMLElement | null;\n\n if (!targetElement || !overlayRef.current || !blockerRef.current) {\n return;\n }\n\n const targetArea = targetElement.getBoundingClientRect();\n\n const documentHeight = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n\n // Update overlay dimensions and calculate target element area to focus\n overlayRef.current.style.height = `${documentHeight}px`;\n\n // Providing gap around target element\n const targetElementGap = steps[currentStep]?.targetElementGap || { horizontal: 0, vertical: 0 };\n\n // clip the target element with rounded corners\n const borderRadius = highlightBorderRadius * 2;\n const left = targetArea.left - targetElementGap.horizontal;\n const top = targetArea.top + window.scrollY - targetElementGap.vertical;\n const right = targetArea.right + targetElementGap.horizontal;\n const bottom = targetArea.bottom + window.scrollY + targetElementGap.vertical;\n const width = right - left;\n const height = bottom - top;\n const documentWidth = Math.max(document.documentElement.scrollWidth, document.body.scrollWidth);\n\n // Create SVG mask with rounded rectangle hole\n const svgMask = encodeURIComponent(`\n <svg width=\"${documentWidth}\" height=\"${documentHeight}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <mask id=\"highlight-mask-${currentStep}\">\n <rect x=\"0\" y=\"0\" width=\"${documentWidth}\" height=\"${documentHeight}\" fill=\"white\"/>\n <rect x=\"${left}\" y=\"${top}\" width=\"${width}\" height=\"${height}\" rx=\"${borderRadius}\" ry=\"${borderRadius}\" fill=\"black\"/>\n </mask>\n </defs>\n </svg>\n `);\n\n // Apply created mask to the overlay\n overlayRef.current.style.maskImage = `url(\"data:image/svg+xml,${svgMask}#highlight-mask-${currentStep}\")`;\n overlayRef.current.style.webkitMaskImage = `url(\"data:image/svg+xml,${svgMask}#highlight-mask-${currentStep}\")`;\n\n // Position blocker over clipped area to avoid clicks on the target element\n blockerRef.current.style.top = `${targetArea.top}px`;\n blockerRef.current.style.left = `${targetArea.left}px`;\n blockerRef.current.style.width = `${targetArea.width}px`;\n blockerRef.current.style.height = `${targetArea.height}px`;\n blockerRef.current.style.borderRadius = `${highlightBorderRadius}px`;\n }, 50);\n\n return timerId;\n }, [currentStep, steps]);\n\n const handleSkipTour = useCallback(() => {\n handleCloseProductTour();\n if (parentScreenElement) {\n parentScreenElement.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }, [handleCloseProductTour, parentScreenElement]);\n\n const handleNextClick = useCallback(\n (e?: React.MouseEvent<HTMLButtonElement>) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n } else {\n handleCloseProductTour(e);\n if (parentScreenElement) {\n parentScreenElement.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }\n steps[currentStep]?.tourMixPanelHandler?.({\n user_path: tourType,\n action_type: `clicked_${\n currentStep === steps.length - 1\n ? steps.length === 1\n ? TOUR_NAVIGATION_STEPS.gotIt\n : TOUR_NAVIGATION_STEPS.finish\n : TOUR_NAVIGATION_STEPS.next\n }`\n });\n },\n [currentStep, steps, handleCloseProductTour, tourType, parentScreenElement]\n );\n\n const handlePrevClick = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n steps[currentStep]?.tourMixPanelHandler?.({\n user_path: tourType,\n action_type: `clicked_${TOUR_NAVIGATION_STEPS.back}`\n });\n }, [currentStep, steps, tourType]);\n\n const handleKeyPress = useCallback(\n (e: KeyboardEvent) => {\n if (e.keyCode === 37 || e.key === 'ArrowLeft') {\n // for previous navigation\n if (currentStep > 0) {\n handlePrevClick();\n }\n }\n if (e.keyCode === 39 || e.key === 'ArrowRight') {\n // for next navigation\n handleNextClick();\n }\n },\n [currentStep, handleNextClick, handlePrevClick]\n );\n\n useEffect(() => {\n // Adding event listener for keydown\n window.addEventListener('keydown', handleKeyPress);\n\n return () => {\n window.removeEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n useEffect(() => {\n let timerId: any;\n if (currentStep < steps.length) {\n timerId = clipTargetElementAndPositionTooltip();\n }\n\n return () => {\n if (timerId) {\n clearTimeout(timerId);\n }\n };\n }, [currentStep, steps, clipTargetElementAndPositionTooltip]);\n\n // To prevent scroll when tour is active\n useEffect(() => {\n if (currentStep < steps.length && overlayRef.current) {\n const overlay = overlayRef.current;\n\n const preventScroll = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n overlay.addEventListener('wheel', preventScroll, { passive: false });\n overlay.addEventListener('touchmove', preventScroll, { passive: false });\n overlay.addEventListener('scroll', preventScroll, { passive: false });\n\n return () => {\n overlay.removeEventListener('wheel', preventScroll);\n overlay.removeEventListener('touchmove', preventScroll);\n overlay.removeEventListener('scroll', preventScroll);\n };\n }\n }, [currentStep]);\n\n if (!steps || steps.length === 0) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"se-design-onboarding-tour-overlay\"\n ref={overlayRef}\n data-automation-id={`${automationId}-overlay`}\n />\n\n <Tooltip\n content={\n <div className={`se-design-onboarding-tour-tooltip-content ${customClassName}`}>\n {steps[currentStep]?.content?.illustration && (\n <img\n src={steps[currentStep].content.illustration}\n className=\"se-design-onboarding-tour-illustration\"\n alt=\"illustration\"\n />\n )}\n <div className=\"se-design-onboarding-tour-content\">\n {(steps[currentStep]?.content?.title || !showSkipCTA) && (\n <div className=\"se-design-onboarding-tour-header\">\n {steps[currentStep]?.content?.title && (\n <p\n className={`se-design-onboarding-tour-title ${steps[currentStep].content.titleClassName || ''}`}\n >\n {steps[currentStep].content.title}\n </p>\n )}\n {!showSkipCTA && (\n <Icon\n name=\"close\"\n onClick={handleSkipTour}\n ariaLabel={skip}\n className=\"se-design-onboarding-tour-close-icon cursor-pointer\"\n automationId={`${automationId}-skip-button`}\n />\n )}\n </div>\n )}\n {steps[currentStep]?.content?.description && (\n <p\n className={`se-design-onboarding-tour-description ${\n steps[currentStep].content.descriptionClassName || ''\n }`}\n >\n {steps[currentStep].content.description}\n </p>\n )}\n </div>\n\n <div className=\"se-design-onboarding-tour-actions\">\n {steps.length > 1 && (\n <span className=\"steps\">\n {stepInfo.replace('{step}', `${currentStep + 1}`).replace('{total}', `${steps.length}`)}\n </span>\n )}\n <div className=\"btns-container\">\n {showSkipCTA && currentStep !== steps.length - 1 && (\n <Button\n theme=\"white\"\n type=\"link\"\n label={skip}\n automationId={`${automationId}-skip-button`}\n onClick={handleSkipTour}\n />\n )}\n <Button\n theme=\"white\"\n type=\"primary\"\n size=\"sm\"\n label={currentStep === steps.length - 1 ? (steps.length === 1 ? gotIt : finish) : next}\n automationId={`${automationId}-next-button`}\n onClick={handleNextClick}\n />\n </div>\n </div>\n </div>\n }\n tooltipSrc={<div className=\"blocker\" ref={blockerRef} />}\n tooltipSrcRef={blockerRef as React.RefObject<HTMLDivElement>}\n position={steps[currentStep]?.tooltipPosition || 'bottom-center'}\n tooltipOffset={16}\n displayOn=\"always-on\"\n isWithPortal={true}\n maxWidth={384}\n />\n </>\n );\n};\n"],"names":["React__default","useState","useRef","useCallback","useEffect","Button","Tooltip","Icon","TOUR_NAVIGATION_STEPS","gotIt","finish","next","back","OnboardingTour","steps","screenBaseElementSelector","handleCloseProductTour","tourType","automationId","highlightBorderRadius","customClassName","showSkipCTA","labels","currentStep","setCurrentStep","overlayRef","blockerRef","skip","stepInfo","parentScreenElement","document","querySelector","clipTargetElementAndPositionTooltip","timerId","length","initialTargetElement","targetElementContainerSelector","targetElementSelector","initialTargetArea","getBoundingClientRect","top","left","bottom","window","innerHeight","right","innerWidth","scrollIntoView","behavior","block","setTimeout","targetElement","current","targetArea","documentHeight","Math","max","documentElement","scrollHeight","body","style","height","targetElementGap","horizontal","vertical","borderRadius","scrollY","width","documentWidth","scrollWidth","svgMask","encodeURIComponent","maskImage","webkitMaskImage","handleSkipTour","scrollTo","handleNextClick","e","preventDefault","stopPropagation","prev","tourMixPanelHandler","user_path","action_type","handlePrevClick","handleKeyPress","keyCode","key","addEventListener","removeEventListener","clearTimeout","overlay","preventScroll","passive","createElement","React","Fragment","className","ref","content","illustration","src","alt","title","titleClassName","name","onClick","ariaLabel","description","descriptionClassName","replace","theme","type","label","size","tooltipSrc","tooltipSrcRef","position","tooltipPosition","tooltipOffset","displayOn","isWithPortal","maxWidth"],"mappings":"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"}
|