@burdenoff/microfe-tours 2026.519.1 → 2026.523.1
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/index.js +2 -1
- package/dist/tours/ToursAdminRoot.d.ts.map +1 -1
- package/dist/tours/ToursAdminRoot.js +23 -20
- package/dist/tours/ToursAdminRoot.js.map +1 -1
- package/dist/tours/ToursUserRoot.d.ts.map +1 -1
- package/dist/tours/ToursUserRoot.js +25 -22
- package/dist/tours/ToursUserRoot.js.map +1 -1
- package/dist/tours/hooks/useMediaLibrary.js +3 -3
- package/dist/tours/hooks/useTourBuilder.js +10 -10
- package/dist/tours/hooks/useTourLifecycle.js +3 -3
- package/dist/tours/i18n.d.ts +5 -1
- package/dist/tours/i18n.d.ts.map +1 -1
- package/dist/tours/i18n.js +4 -0
- package/dist/tours/i18n.js.map +1 -1
- package/dist/tours/index.d.ts +1 -0
- package/dist/tours/index.d.ts.map +1 -1
- package/dist/tours/index.js +1 -0
- package/dist/tours/pages/AnalyticsDashboardPage.d.ts.map +1 -1
- package/dist/tours/pages/AnalyticsDashboardPage.js +5 -5
- package/dist/tours/pages/AnalyticsDashboardPage.js.map +1 -1
- package/dist/tours/pages/MediaLibraryPage.d.ts.map +1 -1
- package/dist/tours/pages/MediaLibraryPage.js +97 -96
- package/dist/tours/pages/MediaLibraryPage.js.map +1 -1
- package/dist/tours/pages/SchedulerPage.d.ts.map +1 -1
- package/dist/tours/pages/SchedulerPage.js +129 -126
- package/dist/tours/pages/SchedulerPage.js.map +1 -1
- package/dist/tours/pages/StepEditorPage.d.ts.map +1 -1
- package/dist/tours/pages/StepEditorPage.js +133 -128
- package/dist/tours/pages/StepEditorPage.js.map +1 -1
- package/dist/tours/pages/SystemAnalyticsPage.d.ts.map +1 -1
- package/dist/tours/pages/SystemAnalyticsPage.js +3 -3
- package/dist/tours/pages/SystemAnalyticsPage.js.map +1 -1
- package/dist/tours/pages/TemplateLibraryPage.d.ts.map +1 -1
- package/dist/tours/pages/TemplateLibraryPage.js +97 -94
- package/dist/tours/pages/TemplateLibraryPage.js.map +1 -1
- package/dist/tours/pages/TourBuilderPage.d.ts.map +1 -1
- package/dist/tours/pages/TourBuilderPage.js +232 -230
- package/dist/tours/pages/TourBuilderPage.js.map +1 -1
- package/dist/tours/pages/TourPreviewPage.d.ts.map +1 -1
- package/dist/tours/pages/TourPreviewPage.js +20 -18
- package/dist/tours/pages/TourPreviewPage.js.map +1 -1
- package/dist/tours/pages/ToursListPage.js +14 -14
- package/dist/tours/pages/ToursListPage.js.map +1 -1
- package/dist/tours/store/toursStore.d.ts +1 -0
- package/dist/tours/store/toursStore.d.ts.map +1 -1
- package/dist/tours/store/toursStore.js +14 -0
- package/dist/tours/store/toursStore.js.map +1 -1
- package/dist/tours/telemetry.d.ts +9 -0
- package/dist/tours/telemetry.d.ts.map +1 -0
- package/dist/tours/telemetry.js +19 -0
- package/dist/tours/telemetry.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,5 +2,6 @@ import { useToursContext as e } from "./tours/providers/ToursProvider.js";
|
|
|
2
2
|
import { useToursStore as t } from "./tours/store/toursStore.js";
|
|
3
3
|
import { ToursAdminRoot as n } from "./tours/ToursAdminRoot.js";
|
|
4
4
|
import { ToursUserRoot as r } from "./tours/ToursUserRoot.js";
|
|
5
|
+
import { TOURS_RYBBIT_ALLOWLIST as i } from "./tours/telemetry.js";
|
|
5
6
|
import "./tours/index.js";
|
|
6
|
-
export { n as ToursAdminRoot, n as ToursRoot, r as ToursUserRoot, e as useToursContext, t as useToursStore };
|
|
7
|
+
export { i as TOURS_RYBBIT_ALLOWLIST, n as ToursAdminRoot, n as ToursRoot, r as ToursUserRoot, e as useToursContext, t as useToursStore };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToursAdminRoot.d.ts","sourceRoot":"","sources":["../../src/tours/ToursAdminRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ToursAdminRoot.d.ts","sourceRoot":"","sources":["../../src/tours/ToursAdminRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAQhC,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,SAAS,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,cAAc,CA8C7C,CAAC"}
|
|
@@ -1,42 +1,45 @@
|
|
|
1
1
|
import { ToursAdminNavRegistrar as e } from "./components/ToursAdminNavRegistrar.js";
|
|
2
2
|
import { ToursProvider as t } from "./providers/ToursProvider.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
3
|
+
import { useToursStore as n } from "./store/toursStore.js";
|
|
4
|
+
import { ToursAdminRoutes as r } from "./ToursAdminRoutes.js";
|
|
5
|
+
import { useEffect as i } from "react";
|
|
6
|
+
import { ErrorBoundary as a } from "@burdenoff/fe-libs/shared/components";
|
|
7
|
+
import { FeatureFlagProvider as o } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
8
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
8
9
|
//#region src/tours/ToursAdminRoot.tsx
|
|
9
|
-
var
|
|
10
|
-
let { basePath:
|
|
11
|
-
return
|
|
12
|
-
|
|
10
|
+
var l = (l) => {
|
|
11
|
+
let { basePath: u = "/", registerNavItems: d, registerFooterItems: f, workspaceId: p } = l, m = n((e) => e.resetTransientState);
|
|
12
|
+
return i(() => () => {
|
|
13
|
+
m();
|
|
14
|
+
}, [m]), i(() => {
|
|
15
|
+
if (f) return f([{
|
|
13
16
|
id: "tours-status",
|
|
14
17
|
label: "Product Tours Ready",
|
|
15
18
|
type: "status",
|
|
16
19
|
order: 10,
|
|
17
20
|
section: "left"
|
|
18
21
|
}]);
|
|
19
|
-
}, [
|
|
20
|
-
workspaceId:
|
|
22
|
+
}, [f]), /* @__PURE__ */ s(o, {
|
|
23
|
+
workspaceId: p ?? null,
|
|
21
24
|
gateway: "global",
|
|
22
25
|
defaultEnabled: !1,
|
|
23
|
-
children: /* @__PURE__ */
|
|
24
|
-
fallback: /* @__PURE__ */
|
|
26
|
+
children: /* @__PURE__ */ c(a, {
|
|
27
|
+
fallback: /* @__PURE__ */ s("div", {
|
|
25
28
|
className: "p-6 text-center text-text-secondary",
|
|
26
29
|
children: "Something went wrong loading this module. Please refresh the page."
|
|
27
30
|
}),
|
|
28
|
-
children: [
|
|
29
|
-
basePath:
|
|
30
|
-
registerNavItems:
|
|
31
|
-
}), /* @__PURE__ */
|
|
32
|
-
...
|
|
31
|
+
children: [d && /* @__PURE__ */ s(e, {
|
|
32
|
+
basePath: u,
|
|
33
|
+
registerNavItems: d
|
|
34
|
+
}), /* @__PURE__ */ s(t, {
|
|
35
|
+
...l,
|
|
33
36
|
variant: "admin",
|
|
34
|
-
children: /* @__PURE__ */
|
|
37
|
+
children: /* @__PURE__ */ s(r, {})
|
|
35
38
|
})]
|
|
36
39
|
})
|
|
37
40
|
});
|
|
38
41
|
};
|
|
39
42
|
//#endregion
|
|
40
|
-
export {
|
|
43
|
+
export { l as ToursAdminRoot };
|
|
41
44
|
|
|
42
45
|
//# sourceMappingURL=ToursAdminRoot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToursAdminRoot.js","names":[],"sources":["../../src/tours/ToursAdminRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { ToursAdminNavRegistrar } from './components/ToursAdminNavRegistrar';\nimport { ToursProvider } from './providers/ToursProvider';\nimport { ToursAdminRoutes } from './ToursAdminRoutes';\nimport type { FooterItem, ToursRootProps } from './types';\n\n/**\n * Admin-facing root component for the Tours microfrontend.\n *\n * Mounts the full authoring suite (CRUD, builder, step editor, media\n * library, analytics, templates, scheduler, preview). Nav-item registration\n * lives in `ToursAdminNavRegistrar` so it can consult feature flags from\n * inside the provider subtree; only items whose flags are enabled are\n * registered with the shell. Consumed by `admin-app`.\n *\n * Pair with `ToursUserRoot` for user shells.\n */\nexport const ToursAdminRoot: FC<ToursRootProps> = (props) => {\n const { basePath = '/', registerNavItems, registerFooterItems, workspaceId } = props;\n\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems: FooterItem[] = [\n {\n id: 'tours-status',\n label: 'Product Tours Ready',\n type: 'status',\n order: 10,\n section: 'left',\n },\n ];\n\n return registerFooterItems(footerItems);\n }, [registerFooterItems]);\n\n return (\n <FeatureFlagProvider workspaceId={workspaceId ?? null} gateway=\"global\" defaultEnabled={false}>\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n {registerNavItems && (\n <ToursAdminNavRegistrar basePath={basePath} registerNavItems={registerNavItems} />\n )}\n <ToursProvider {...props} variant=\"admin\">\n <ToursAdminRoutes />\n </ToursProvider>\n </ErrorBoundary>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ToursAdminRoot.js","names":[],"sources":["../../src/tours/ToursAdminRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { ToursAdminNavRegistrar } from './components/ToursAdminNavRegistrar';\nimport { ToursProvider } from './providers/ToursProvider';\nimport { useToursStore } from './store/toursStore';\nimport { ToursAdminRoutes } from './ToursAdminRoutes';\nimport type { FooterItem, ToursRootProps } from './types';\n\n/**\n * Admin-facing root component for the Tours microfrontend.\n *\n * Mounts the full authoring suite (CRUD, builder, step editor, media\n * library, analytics, templates, scheduler, preview). Nav-item registration\n * lives in `ToursAdminNavRegistrar` so it can consult feature flags from\n * inside the provider subtree; only items whose flags are enabled are\n * registered with the shell. Consumed by `admin-app`.\n *\n * Pair with `ToursUserRoot` for user shells.\n */\nexport const ToursAdminRoot: FC<ToursRootProps> = (props) => {\n const { basePath = '/', registerNavItems, registerFooterItems, workspaceId } = props;\n const resetTransientState = useToursStore((state) => state.resetTransientState);\n\n useEffect(() => {\n // Reset only when the MFE unmounts. Including shell props here would run\n // cleanup on prop changes and could silently discard in-progress drafts.\n return () => {\n resetTransientState();\n };\n }, [resetTransientState]);\n\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems: FooterItem[] = [\n {\n id: 'tours-status',\n label: 'Product Tours Ready',\n type: 'status',\n order: 10,\n section: 'left',\n },\n ];\n\n return registerFooterItems(footerItems);\n }, [registerFooterItems]);\n\n return (\n <FeatureFlagProvider workspaceId={workspaceId ?? null} gateway=\"global\" defaultEnabled={false}>\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n {registerNavItems && (\n <ToursAdminNavRegistrar basePath={basePath} registerNavItems={registerNavItems} />\n )}\n <ToursProvider {...props} variant=\"admin\">\n <ToursAdminRoutes />\n </ToursProvider>\n </ErrorBoundary>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;;AAqBA,IAAa,KAAsC,MAAU;CAC3D,IAAM,EAAE,cAAW,KAAK,qBAAkB,wBAAqB,mBAAgB,GACzE,IAAsB,GAAe,MAAU,EAAM,oBAAoB;AA0B/E,QAxBA,cAGe;AACX,KAAqB;IAEtB,CAAC,EAAoB,CAAC,EAEzB,QAAgB;AACT,QAYL,QAAO,EAV2B,CAChC;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAEsC;IACtC,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EAAqB,aAAa,KAAe;EAAM,SAAQ;EAAS,gBAAgB;YACtF,kBAAC,GAAD;GACE,UACE,kBAAC,OAAD;IAAK,WAAU;cAAsC;IAE/C,CAAA;aAJV,CAOG,KACC,kBAAC,GAAD;IAAkC;IAA4B;IAAoB,CAAA,EAEpF,kBAAC,GAAD;IAAe,GAAI;IAAO,SAAQ;cAChC,kBAAC,GAAD,EAAoB,CAAA;IACN,CAAA,CACF;;EACI,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToursUserRoot.d.ts","sourceRoot":"","sources":["../../src/tours/ToursUserRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ToursUserRoot.d.ts","sourceRoot":"","sources":["../../src/tours/ToursUserRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAQhC,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,SAAS,CAAC;AAGvD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,cAAc,CAkD5C,CAAC"}
|
|
@@ -1,48 +1,51 @@
|
|
|
1
1
|
import { joinPath as e } from "./utils/joinPath.js";
|
|
2
2
|
import { ToursProvider as t } from "./providers/ToursProvider.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { useToursStore as n } from "./store/toursStore.js";
|
|
4
|
+
import { ToursUserRoutes as r } from "./ToursUserRoutes.js";
|
|
5
|
+
import { useEffect as i } from "react";
|
|
6
|
+
import { ErrorBoundary as a } from "@burdenoff/fe-libs/shared/components";
|
|
7
|
+
import { FeatureFlagProvider as o } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
8
|
+
import { Compass as s, ListChecks as c } from "lucide-react";
|
|
9
|
+
import { jsx as l } from "react/jsx-runtime";
|
|
9
10
|
//#region src/tours/ToursUserRoot.tsx
|
|
10
|
-
var
|
|
11
|
-
let { basePath:
|
|
12
|
-
return
|
|
13
|
-
|
|
11
|
+
var u = (u) => {
|
|
12
|
+
let { basePath: d = "/", registerNavItems: f, workspaceId: p } = u, m = n((e) => e.resetTransientState);
|
|
13
|
+
return i(() => () => {
|
|
14
|
+
m();
|
|
15
|
+
}, [m]), i(() => {
|
|
16
|
+
if (f) return f([{
|
|
14
17
|
id: "tours-my",
|
|
15
18
|
label: "My Tours",
|
|
16
|
-
path:
|
|
17
|
-
icon: /* @__PURE__ */
|
|
19
|
+
path: d,
|
|
20
|
+
icon: /* @__PURE__ */ l(s, { size: 20 }),
|
|
18
21
|
order: 10,
|
|
19
22
|
group: "tours"
|
|
20
23
|
}, {
|
|
21
24
|
id: "tours-my-progress",
|
|
22
25
|
label: "My Progress",
|
|
23
|
-
path: e(
|
|
24
|
-
icon: /* @__PURE__ */ c
|
|
26
|
+
path: e(d, "progress"),
|
|
27
|
+
icon: /* @__PURE__ */ l(c, { size: 20 }),
|
|
25
28
|
order: 20,
|
|
26
29
|
group: "tours"
|
|
27
30
|
}]);
|
|
28
|
-
}, [
|
|
29
|
-
workspaceId:
|
|
31
|
+
}, [f, d]), /* @__PURE__ */ l(o, {
|
|
32
|
+
workspaceId: p ?? null,
|
|
30
33
|
gateway: "global",
|
|
31
34
|
defaultEnabled: !0,
|
|
32
|
-
children: /* @__PURE__ */
|
|
33
|
-
fallback: /* @__PURE__ */
|
|
35
|
+
children: /* @__PURE__ */ l(a, {
|
|
36
|
+
fallback: /* @__PURE__ */ l("div", {
|
|
34
37
|
className: "p-6 text-center text-text-secondary",
|
|
35
38
|
children: "Something went wrong loading this module. Please refresh the page."
|
|
36
39
|
}),
|
|
37
|
-
children: /* @__PURE__ */
|
|
38
|
-
...
|
|
40
|
+
children: /* @__PURE__ */ l(t, {
|
|
41
|
+
...u,
|
|
39
42
|
variant: "user",
|
|
40
|
-
children: /* @__PURE__ */
|
|
43
|
+
children: /* @__PURE__ */ l(r, {})
|
|
41
44
|
})
|
|
42
45
|
})
|
|
43
46
|
});
|
|
44
47
|
};
|
|
45
48
|
//#endregion
|
|
46
|
-
export {
|
|
49
|
+
export { u as ToursUserRoot };
|
|
47
50
|
|
|
48
51
|
//# sourceMappingURL=ToursUserRoot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToursUserRoot.js","names":[],"sources":["../../src/tours/ToursUserRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { Compass, ListChecks } from 'lucide-react';\nimport { ToursProvider } from './providers/ToursProvider';\nimport { ToursUserRoutes } from './ToursUserRoutes';\nimport type { NavItem, ToursRootProps } from './types';\nimport { joinPath } from './utils/joinPath';\n\n/**\n * User-facing root component for the Tours microfrontend.\n *\n * Mounts the read-only \"My Tours\" + \"My Progress\" surface for product\n * user shells (vibecontrols-app, and later workspaces-app / bigconsole-app).\n * Registers exactly two nav items; never exposes authoring or governance\n * pages.\n *\n * Pair with `ToursAdminRoot` for the admin shell.\n */\nexport const ToursUserRoot: FC<ToursRootProps> = (props) => {\n const { basePath = '/', registerNavItems, workspaceId } = props;\n\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'tours-my',\n label: 'My Tours',\n path: basePath,\n icon: <Compass size={20} />,\n order: 10,\n group: 'tours',\n },\n {\n id: 'tours-my-progress',\n label: 'My Progress',\n path: joinPath(basePath, 'progress'),\n icon: <ListChecks size={20} />,\n order: 20,\n group: 'tours',\n },\n ];\n\n return registerNavItems(navItems);\n }, [registerNavItems, basePath]);\n\n return (\n <FeatureFlagProvider workspaceId={workspaceId ?? null} gateway=\"global\" defaultEnabled={true}>\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n <ToursProvider {...props} variant=\"user\">\n <ToursUserRoutes />\n </ToursProvider>\n </ErrorBoundary>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ToursUserRoot.js","names":[],"sources":["../../src/tours/ToursUserRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { Compass, ListChecks } from 'lucide-react';\nimport { ToursProvider } from './providers/ToursProvider';\nimport { useToursStore } from './store/toursStore';\nimport { ToursUserRoutes } from './ToursUserRoutes';\nimport type { NavItem, ToursRootProps } from './types';\nimport { joinPath } from './utils/joinPath';\n\n/**\n * User-facing root component for the Tours microfrontend.\n *\n * Mounts the read-only \"My Tours\" + \"My Progress\" surface for product\n * user shells (vibecontrols-app, and later workspaces-app / bigconsole-app).\n * Registers exactly two nav items; never exposes authoring or governance\n * pages.\n *\n * Pair with `ToursAdminRoot` for the admin shell.\n */\nexport const ToursUserRoot: FC<ToursRootProps> = (props) => {\n const { basePath = '/', registerNavItems, workspaceId } = props;\n const resetTransientState = useToursStore((state) => state.resetTransientState);\n\n useEffect(() => {\n return () => {\n resetTransientState();\n };\n }, [resetTransientState]);\n\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'tours-my',\n label: 'My Tours',\n path: basePath,\n icon: <Compass size={20} />,\n order: 10,\n group: 'tours',\n },\n {\n id: 'tours-my-progress',\n label: 'My Progress',\n path: joinPath(basePath, 'progress'),\n icon: <ListChecks size={20} />,\n order: 20,\n group: 'tours',\n },\n ];\n\n return registerNavItems(navItems);\n }, [registerNavItems, basePath]);\n\n return (\n <FeatureFlagProvider workspaceId={workspaceId ?? null} gateway=\"global\" defaultEnabled={true}>\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n <ToursProvider {...props} variant=\"user\">\n <ToursUserRoutes />\n </ToursProvider>\n </ErrorBoundary>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;;;AAqBA,IAAa,KAAqC,MAAU;CAC1D,IAAM,EAAE,cAAW,KAAK,qBAAkB,mBAAgB,GACpD,IAAsB,GAAe,MAAU,EAAM,oBAAoB;AAiC/E,QA/BA,cACe;AACX,KAAqB;IAEtB,CAAC,EAAoB,CAAC,EAEzB,QAAgB;AACT,QAqBL,QAAO,EAnBqB,CAC1B;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;GAC3B,OAAO;GACP,OAAO;GACR,EACD;GACE,IAAI;GACJ,OAAO;GACP,MAAM,EAAS,GAAU,WAAW;GACpC,MAAM,kBAAC,GAAD,EAAY,MAAM,IAAM,CAAA;GAC9B,OAAO;GACP,OAAO;GACR,CACF,CAEgC;IAChC,CAAC,GAAkB,EAAS,CAAC,EAG9B,kBAAC,GAAD;EAAqB,aAAa,KAAe;EAAM,SAAQ;EAAS,gBAAgB;YACtF,kBAAC,GAAD;GACE,UACE,kBAAC,OAAD;IAAK,WAAU;cAAsC;IAE/C,CAAA;aAGR,kBAAC,GAAD;IAAe,GAAI;IAAO,SAAQ;cAChC,kBAAC,GAAD,EAAmB,CAAA;IACL,CAAA;GACF,CAAA;EACI,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { useToursStore as e } from "../store/toursStore.js";
|
|
2
|
+
import { useAttachMediaToStepMutation as t, useDeleteTourMediaMutation as n, useGetTourMediaQuery as r, useUploadTourMediaMutation as i } from "../../generated/global-operations.js";
|
|
3
3
|
import { useCallback as a, useMemo as o } from "react";
|
|
4
4
|
//#region src/tours/hooks/useMediaLibrary.ts
|
|
5
5
|
function s() {
|
|
6
|
-
let { selectedMedia: s, uploadProgress: l, selectMedia: u, unselectMedia: d, clearSelectedMedia: f, updateUploadProgress: p, removeUploadProgress: m } =
|
|
6
|
+
let { selectedMedia: s, uploadProgress: l, selectMedia: u, unselectMedia: d, clearSelectedMedia: f, updateUploadProgress: p, removeUploadProgress: m } = e(), { data: h, loading: g, error: _, refetch: v } = r(), [y] = i(), [b] = n(), [x] = t();
|
|
7
7
|
return {
|
|
8
8
|
media: o(() => h?.tourMedia ? h.tourMedia.map((e) => ({
|
|
9
9
|
id: e.id,
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { useToursContext as e } from "../providers/ToursProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { useToursStore as t } from "../store/toursStore.js";
|
|
3
|
+
import { CreateTourDocument as n, DeleteTourDocument as r, GetTourDocument as i, SyncTourStepsDocument as a, UpdateTourDocument as o } from "../../generated/global-operations.js";
|
|
4
4
|
import { useCallback as s, useState as c } from "react";
|
|
5
5
|
import { useNavigate as l } from "react-router-dom";
|
|
6
6
|
import { useGatewayClient as u } from "@burdenoff/fe-libs/shared/graphql";
|
|
7
7
|
//#region src/tours/hooks/useTourBuilder.ts
|
|
8
8
|
function d(d) {
|
|
9
|
-
let p = u("global"), m = l(), { basePath: h = "/" } = e(), [g, _] = c(null), [v, y] = c(!1), [b, x] = c(!1), [S, C] = c(!1), { selectedTour: w, stepSequence: T, isDirty: E, validationErrors: D, setSelectedTour: O, updateStepSequence: k, validateTour: A, setDirty: j, notifyToursListChanged: M } =
|
|
9
|
+
let p = u("global"), m = l(), { basePath: h = "/" } = e(), [g, _] = c(null), [v, y] = c(!1), [b, x] = c(!1), [S, C] = c(!1), { selectedTour: w, stepSequence: T, isDirty: E, validationErrors: D, setSelectedTour: O, updateStepSequence: k, validateTour: A, setDirty: j, notifyToursListChanged: M } = t(), N = s(async (e) => {
|
|
10
10
|
y(!0), _(null);
|
|
11
11
|
try {
|
|
12
12
|
let t = await p.query({
|
|
13
|
-
query:
|
|
13
|
+
query: i,
|
|
14
14
|
variables: { id: e },
|
|
15
15
|
fetchPolicy: "network-only"
|
|
16
16
|
});
|
|
@@ -29,9 +29,9 @@ function d(d) {
|
|
|
29
29
|
]), P = s(async (e) => {
|
|
30
30
|
x(!0), _(null);
|
|
31
31
|
try {
|
|
32
|
-
let
|
|
32
|
+
let t = e.slug || (e.name || "tour").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), r = {
|
|
33
33
|
name: e.name || "",
|
|
34
|
-
slug:
|
|
34
|
+
slug: t,
|
|
35
35
|
productId: e.productId || "workspaces",
|
|
36
36
|
description: f(e.description),
|
|
37
37
|
moduleId: f(e.moduleId),
|
|
@@ -48,7 +48,7 @@ function d(d) {
|
|
|
48
48
|
tabletConfig: e.tabletConfig,
|
|
49
49
|
desktopConfig: e.desktopConfig
|
|
50
50
|
}, i = (await p.mutate({
|
|
51
|
-
mutation:
|
|
51
|
+
mutation: n,
|
|
52
52
|
variables: { input: r }
|
|
53
53
|
})).data;
|
|
54
54
|
return i?.createTour ? (O(i.createTour), M(), m(`${h}/${i.createTour.id}/steps`), i.createTour) : null;
|
|
@@ -85,7 +85,7 @@ function d(d) {
|
|
|
85
85
|
tabletConfig: t.tabletConfig,
|
|
86
86
|
desktopConfig: t.desktopConfig
|
|
87
87
|
}, r = (await p.mutate({
|
|
88
|
-
mutation:
|
|
88
|
+
mutation: o,
|
|
89
89
|
variables: {
|
|
90
90
|
id: e,
|
|
91
91
|
input: n
|
|
@@ -101,7 +101,7 @@ function d(d) {
|
|
|
101
101
|
C(!0), _(null);
|
|
102
102
|
try {
|
|
103
103
|
let t = (await p.mutate({
|
|
104
|
-
mutation:
|
|
104
|
+
mutation: r,
|
|
105
105
|
variables: { id: e }
|
|
106
106
|
})).data;
|
|
107
107
|
return t?.deleteTour && M(), t?.deleteTour ?? !1;
|
|
@@ -131,7 +131,7 @@ function d(d) {
|
|
|
131
131
|
waitForTimeout: e.waitForTimeout,
|
|
132
132
|
skipConditions: e.skipConditions
|
|
133
133
|
})), r = (await p.mutate({
|
|
134
|
-
mutation:
|
|
134
|
+
mutation: a,
|
|
135
135
|
variables: {
|
|
136
136
|
tourId: e,
|
|
137
137
|
steps: n
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { useToursStore as e } from "../store/toursStore.js";
|
|
2
|
+
import { useArchiveTourMutation as t, useDuplicateTourMutation as n, usePublishTourMutation as r, useSaveTourAsTemplateMutation as i, useUnpublishTourMutation as a } from "../../generated/global-operations.js";
|
|
3
3
|
import { useCallback as o } from "react";
|
|
4
4
|
//#region src/tours/hooks/useTourLifecycle.ts
|
|
5
5
|
function s() {
|
|
6
|
-
let s =
|
|
6
|
+
let s = e((e) => e.notifyToursListChanged), [c, { loading: l }] = r(), [u, { loading: d }] = a(), [f, { loading: p }] = t(), [m, { loading: h }] = n(), [g, { loading: _ }] = i();
|
|
7
7
|
return {
|
|
8
8
|
publishTour: o(async (e) => {
|
|
9
9
|
let t = await c({ variables: { id: e } });
|
package/dist/tours/i18n.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ declare const toursTranslationFallbacks: {
|
|
|
2
2
|
readonly 'stepEditor.addFirstStep': "Add First Step";
|
|
3
3
|
readonly 'stepEditor.addStep': "Add Step";
|
|
4
4
|
readonly 'stepEditor.clickAddStep': "Click \"Add Step\" to create one";
|
|
5
|
+
readonly 'stepEditor.closeSteps': "Close steps";
|
|
5
6
|
readonly 'stepEditor.content': "Content";
|
|
6
7
|
readonly 'stepEditor.contentPlaceholder': "Enter step content or instructions";
|
|
7
8
|
readonly 'stepEditor.createFirstStep': "Create your first step to get started";
|
|
@@ -19,12 +20,14 @@ declare const toursTranslationFallbacks: {
|
|
|
19
20
|
readonly 'stepEditor.noStepSelected': "No step selected";
|
|
20
21
|
readonly 'stepEditor.noStepsYet': "No steps yet";
|
|
21
22
|
readonly 'stepEditor.of': "of";
|
|
23
|
+
readonly 'stepEditor.nextStep': "Next step";
|
|
22
24
|
readonly 'stepEditor.placementAuto': "Auto (recommended)";
|
|
23
25
|
readonly 'stepEditor.placementBottom': "Bottom";
|
|
24
26
|
readonly 'stepEditor.placementCenter': "Center (modal style)";
|
|
25
27
|
readonly 'stepEditor.placementLeft': "Left";
|
|
26
28
|
readonly 'stepEditor.placementRight': "Right";
|
|
27
29
|
readonly 'stepEditor.placementTop': "Top";
|
|
30
|
+
readonly 'stepEditor.previousStep': "Previous step";
|
|
28
31
|
readonly 'stepEditor.save': "Save";
|
|
29
32
|
readonly 'stepEditor.saving': "Saving...";
|
|
30
33
|
readonly 'stepEditor.selectStepToEdit': "Select a step from the list to edit it";
|
|
@@ -47,6 +50,7 @@ declare const toursTranslationFallbacks: {
|
|
|
47
50
|
readonly 'templateLibrary.categoryHelp': "Help";
|
|
48
51
|
readonly 'templateLibrary.categoryOnboarding': "Onboarding";
|
|
49
52
|
readonly 'templateLibrary.deleteConfirm': "Delete this template?";
|
|
53
|
+
readonly 'templateLibrary.deleteTemplate': "Delete template";
|
|
50
54
|
readonly 'templateLibrary.loading': "Loading templates...";
|
|
51
55
|
readonly 'templateLibrary.noTemplatesFound': "No templates found";
|
|
52
56
|
readonly 'templateLibrary.publicOnly': "Public only";
|
|
@@ -167,6 +171,6 @@ export declare function useToursI18n(): {
|
|
|
167
171
|
isLoading: boolean;
|
|
168
172
|
error: string | null;
|
|
169
173
|
};
|
|
170
|
-
export declare function getToursTranslationFallback(key: ToursTranslationKey): "steps" | "Create Tour" | "Analytics" | "Tour" | "Add First Step" | "Add Step" | "Click \"Add Step\" to create one" | "Content" | "Enter step content or instructions" | "Create your first step to get started" | "CSS Selector" | "[data-tour='element-name'] or #id or .class" | "Use data-tour attributes like [data-tour='sidenav'] for best results" | "Delete step" | "Desktop Selector" | "Override the default selector for specific device types" | "Device-Specific Selectors (Advanced)" | "Edit Step" | "Go back" | "Leave empty to use default" | "Mobile Selector" | "No step selected" | "No steps yet" | "of" | "Auto (recommended)" | "Bottom" | "Center (modal style)" | "Left" | "Right" | "Top" | "Save" | "Saving..." | "Select a step from the list to edit it" | "Step" | "Steps" | "Step Title" | "Enter step title" | "Tablet Selector" | "target element" | "Tooltip Placement" | "Tour Steps" | "Untitled" | "Try adjusting your filters or search query" | "All Categories" | "Custom" | "Feature Announcement" | "Help" | "Onboarding" | "Delete this template?" | "Loading templates..." | "No templates found" | "Public only" | "Search templates..." | "Browse and use pre-built tour templates" | "times" | "Tour Templates" | "Use Template" | "Used" | "Create & Add Steps" | "Edit Steps" | "Error" | "Description" | "Tour Name *" | "Priority (1-100)" | "Product ID *" | "Trigger Type" | "Preview" | "Basic Information" | "Trigger Settings" | "Configure tour details and settings" | "Edit Tour" | "Auto (Always)" | "Auto (First Visit)" | "Manual" | "On Event" | "Scheduled" | "Update Tour" | "Validation Errors" | "You do not have permission to preview this tour." | "Access Denied" | "Desktop preview" | "Mobile preview" | "Tablet preview" | "Finish" | "Loading tour..." | "Next" | "Previous" | "Click \"Start Preview\" to begin" | "Preview ready" | "Start Preview" | "Stop Preview" | "Warnings" | "You do not have permission to view product tours." | "Archive" | "Delete" | "Duplicate" | "Publish" | "Unpublish" | "Are you sure you want to delete this tour?" | "Create your first tour to get started" | "No tours found" | "Failed to archive tour" | "Failed to delete tour" | "Failed to duplicate tour" | "Failed to publish tour" | "Failed to unpublish tour" | "Grid view" | "List view" | "Loading tours..." | "More actions" | "Preview Tour" | "Search tours..." | "Settings" | "All Statuses" | "Archived" | "Draft" | "Published" | "Create and manage interactive product tours" | "Product Tours" | "views" | "My Tours" | "Walkthroughs available in this product. Take a tour to learn a feature." | "Loading..." | "No tours are available in this context yet." | "Completed" | "In progress" | "Skipped" | "Not started" | "Page not found" | "That tour page isn't available — returning to My Tours." | "My Progress" | "Tours you have started, completed, or skipped." | "Skipped or dismissed" | "No tours in progress." | "No completed tours yet." | "No skipped tours." | "Other" | "No tours in other states.";
|
|
174
|
+
export declare function getToursTranslationFallback(key: ToursTranslationKey): "steps" | "Create Tour" | "Analytics" | "Tour" | "Add First Step" | "Add Step" | "Click \"Add Step\" to create one" | "Close steps" | "Content" | "Enter step content or instructions" | "Create your first step to get started" | "CSS Selector" | "[data-tour='element-name'] or #id or .class" | "Use data-tour attributes like [data-tour='sidenav'] for best results" | "Delete step" | "Desktop Selector" | "Override the default selector for specific device types" | "Device-Specific Selectors (Advanced)" | "Edit Step" | "Go back" | "Leave empty to use default" | "Mobile Selector" | "No step selected" | "No steps yet" | "of" | "Next step" | "Auto (recommended)" | "Bottom" | "Center (modal style)" | "Left" | "Right" | "Top" | "Previous step" | "Save" | "Saving..." | "Select a step from the list to edit it" | "Step" | "Steps" | "Step Title" | "Enter step title" | "Tablet Selector" | "target element" | "Tooltip Placement" | "Tour Steps" | "Untitled" | "Try adjusting your filters or search query" | "All Categories" | "Custom" | "Feature Announcement" | "Help" | "Onboarding" | "Delete this template?" | "Delete template" | "Loading templates..." | "No templates found" | "Public only" | "Search templates..." | "Browse and use pre-built tour templates" | "times" | "Tour Templates" | "Use Template" | "Used" | "Create & Add Steps" | "Edit Steps" | "Error" | "Description" | "Tour Name *" | "Priority (1-100)" | "Product ID *" | "Trigger Type" | "Preview" | "Basic Information" | "Trigger Settings" | "Configure tour details and settings" | "Edit Tour" | "Auto (Always)" | "Auto (First Visit)" | "Manual" | "On Event" | "Scheduled" | "Update Tour" | "Validation Errors" | "You do not have permission to preview this tour." | "Access Denied" | "Desktop preview" | "Mobile preview" | "Tablet preview" | "Finish" | "Loading tour..." | "Next" | "Previous" | "Click \"Start Preview\" to begin" | "Preview ready" | "Start Preview" | "Stop Preview" | "Warnings" | "You do not have permission to view product tours." | "Archive" | "Delete" | "Duplicate" | "Publish" | "Unpublish" | "Are you sure you want to delete this tour?" | "Create your first tour to get started" | "No tours found" | "Failed to archive tour" | "Failed to delete tour" | "Failed to duplicate tour" | "Failed to publish tour" | "Failed to unpublish tour" | "Grid view" | "List view" | "Loading tours..." | "More actions" | "Preview Tour" | "Search tours..." | "Settings" | "All Statuses" | "Archived" | "Draft" | "Published" | "Create and manage interactive product tours" | "Product Tours" | "views" | "My Tours" | "Walkthroughs available in this product. Take a tour to learn a feature." | "Loading..." | "No tours are available in this context yet." | "Completed" | "In progress" | "Skipped" | "Not started" | "Page not found" | "That tour page isn't available — returning to My Tours." | "My Progress" | "Tours you have started, completed, or skipped." | "Skipped or dismissed" | "No tours in progress." | "No completed tours yet." | "No skipped tours." | "Other" | "No tours in other states.";
|
|
171
175
|
export {};
|
|
172
176
|
//# sourceMappingURL=i18n.d.ts.map
|
package/dist/tours/i18n.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/tours/i18n.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,yBAAyB
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/tours/i18n.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoKrB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,yBAAyB,CAAC;AAEzE,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAEzD,wBAAgB,YAAY;cAQlB,mBAAmB,WAAW,iBAAiB,KAAG,MAAM;;;;qCA5KhE,CAAA,kDAAkD,CAAC;;;EA+LpD;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,mBAAmB,y/FAEnE"}
|
package/dist/tours/i18n.js
CHANGED
|
@@ -5,6 +5,7 @@ var n = {
|
|
|
5
5
|
"stepEditor.addFirstStep": "Add First Step",
|
|
6
6
|
"stepEditor.addStep": "Add Step",
|
|
7
7
|
"stepEditor.clickAddStep": "Click \"Add Step\" to create one",
|
|
8
|
+
"stepEditor.closeSteps": "Close steps",
|
|
8
9
|
"stepEditor.content": "Content",
|
|
9
10
|
"stepEditor.contentPlaceholder": "Enter step content or instructions",
|
|
10
11
|
"stepEditor.createFirstStep": "Create your first step to get started",
|
|
@@ -22,12 +23,14 @@ var n = {
|
|
|
22
23
|
"stepEditor.noStepSelected": "No step selected",
|
|
23
24
|
"stepEditor.noStepsYet": "No steps yet",
|
|
24
25
|
"stepEditor.of": "of",
|
|
26
|
+
"stepEditor.nextStep": "Next step",
|
|
25
27
|
"stepEditor.placementAuto": "Auto (recommended)",
|
|
26
28
|
"stepEditor.placementBottom": "Bottom",
|
|
27
29
|
"stepEditor.placementCenter": "Center (modal style)",
|
|
28
30
|
"stepEditor.placementLeft": "Left",
|
|
29
31
|
"stepEditor.placementRight": "Right",
|
|
30
32
|
"stepEditor.placementTop": "Top",
|
|
33
|
+
"stepEditor.previousStep": "Previous step",
|
|
31
34
|
"stepEditor.save": "Save",
|
|
32
35
|
"stepEditor.saving": "Saving...",
|
|
33
36
|
"stepEditor.selectStepToEdit": "Select a step from the list to edit it",
|
|
@@ -50,6 +53,7 @@ var n = {
|
|
|
50
53
|
"templateLibrary.categoryHelp": "Help",
|
|
51
54
|
"templateLibrary.categoryOnboarding": "Onboarding",
|
|
52
55
|
"templateLibrary.deleteConfirm": "Delete this template?",
|
|
56
|
+
"templateLibrary.deleteTemplate": "Delete template",
|
|
53
57
|
"templateLibrary.loading": "Loading templates...",
|
|
54
58
|
"templateLibrary.noTemplatesFound": "No templates found",
|
|
55
59
|
"templateLibrary.publicOnly": "Public only",
|
package/dist/tours/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","names":[],"sources":["../../src/tours/i18n.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nconst toursTranslationFallbacks = {\n 'stepEditor.addFirstStep': 'Add First Step',\n 'stepEditor.addStep': 'Add Step',\n 'stepEditor.clickAddStep': 'Click \"Add Step\" to create one',\n 'stepEditor.content': 'Content',\n 'stepEditor.contentPlaceholder': 'Enter step content or instructions',\n 'stepEditor.createFirstStep': 'Create your first step to get started',\n 'stepEditor.cssSelector': 'CSS Selector',\n 'stepEditor.cssSelectorPlaceholder': \"[data-tour='element-name'] or #id or .class\",\n 'stepEditor.dataTourHint': \"Use data-tour attributes like [data-tour='sidenav'] for best results\",\n 'stepEditor.deleteStep': 'Delete step',\n 'stepEditor.desktopSelector': 'Desktop Selector',\n 'stepEditor.deviceSelectorHint': 'Override the default selector for specific device types',\n 'stepEditor.deviceSpecificSelectors': 'Device-Specific Selectors (Advanced)',\n 'stepEditor.editStep': 'Edit Step',\n 'stepEditor.goBack': 'Go back',\n 'stepEditor.leaveEmptyDefault': 'Leave empty to use default',\n 'stepEditor.mobileSelector': 'Mobile Selector',\n 'stepEditor.noStepSelected': 'No step selected',\n 'stepEditor.noStepsYet': 'No steps yet',\n 'stepEditor.of': 'of',\n 'stepEditor.placementAuto': 'Auto (recommended)',\n 'stepEditor.placementBottom': 'Bottom',\n 'stepEditor.placementCenter': 'Center (modal style)',\n 'stepEditor.placementLeft': 'Left',\n 'stepEditor.placementRight': 'Right',\n 'stepEditor.placementTop': 'Top',\n 'stepEditor.save': 'Save',\n 'stepEditor.saving': 'Saving...',\n 'stepEditor.selectStepToEdit': 'Select a step from the list to edit it',\n 'stepEditor.stepNumber': 'Step',\n 'stepEditor.steps': 'Steps',\n 'stepEditor.stepsCount': 'steps',\n 'stepEditor.stepsLabel': 'Steps',\n 'stepEditor.stepTitle': 'Step Title',\n 'stepEditor.stepTitlePlaceholder': 'Enter step title',\n 'stepEditor.tabletSelector': 'Tablet Selector',\n 'stepEditor.targetElement': 'target element',\n 'stepEditor.tooltipPlacement': 'Tooltip Placement',\n 'stepEditor.tourFallback': 'Tour',\n 'stepEditor.tourSteps': 'Tour Steps',\n 'stepEditor.untitled': 'Untitled',\n 'templateLibrary.adjustFilters': 'Try adjusting your filters or search query',\n 'templateLibrary.allCategories': 'All Categories',\n 'templateLibrary.categoryCustom': 'Custom',\n 'templateLibrary.categoryFeatureAnnouncement': 'Feature Announcement',\n 'templateLibrary.categoryHelp': 'Help',\n 'templateLibrary.categoryOnboarding': 'Onboarding',\n 'templateLibrary.deleteConfirm': 'Delete this template?',\n 'templateLibrary.loading': 'Loading templates...',\n 'templateLibrary.noTemplatesFound': 'No templates found',\n 'templateLibrary.publicOnly': 'Public only',\n 'templateLibrary.searchPlaceholder': 'Search templates...',\n 'templateLibrary.subtitle': 'Browse and use pre-built tour templates',\n 'templateLibrary.times': 'times',\n 'templateLibrary.title': 'Tour Templates',\n 'templateLibrary.useTemplate': 'Use Template',\n 'templateLibrary.usedTimes': 'Used',\n 'tourBuilder.analytics': 'Analytics',\n 'tourBuilder.createAndAddSteps': 'Create & Add Steps',\n 'tourBuilder.editSteps': 'Edit Steps',\n 'tourBuilder.errorTitle': 'Error',\n 'tourBuilder.goBack': 'Go back',\n 'tourBuilder.labelDescription': 'Description',\n 'tourBuilder.labelName': 'Tour Name *',\n 'tourBuilder.labelPriority': 'Priority (1-100)',\n 'tourBuilder.labelProductId': 'Product ID *',\n 'tourBuilder.labelTriggerType': 'Trigger Type',\n 'tourBuilder.preview': 'Preview',\n 'tourBuilder.saving': 'Saving...',\n 'tourBuilder.sectionBasicInfo': 'Basic Information',\n 'tourBuilder.sectionTriggerSettings': 'Trigger Settings',\n 'tourBuilder.subtitle': 'Configure tour details and settings',\n 'tourBuilder.titleCreate': 'Create Tour',\n 'tourBuilder.titleEdit': 'Edit Tour',\n 'tourBuilder.triggerAutoAlways': 'Auto (Always)',\n 'tourBuilder.triggerAutoFirstVisit': 'Auto (First Visit)',\n 'tourBuilder.triggerManual': 'Manual',\n 'tourBuilder.triggerOnEvent': 'On Event',\n 'tourBuilder.triggerScheduled': 'Scheduled',\n 'tourBuilder.updateTour': 'Update Tour',\n 'tourBuilder.validationErrorsTitle': 'Validation Errors',\n 'tourPreview.accessDeniedMessage': 'You do not have permission to preview this tour.',\n 'tourPreview.accessDeniedTitle': 'Access Denied',\n 'tourPreview.deviceDesktop': 'Desktop preview',\n 'tourPreview.deviceMobile': 'Mobile preview',\n 'tourPreview.deviceTablet': 'Tablet preview',\n 'tourPreview.finish': 'Finish',\n 'tourPreview.loading': 'Loading tour...',\n 'tourPreview.next': 'Next',\n 'tourPreview.nextFooter': 'Next',\n 'tourPreview.previewSuffix': 'Preview',\n 'tourPreview.previous': 'Previous',\n 'tourPreview.readyHint': 'Click \"Start Preview\" to begin',\n 'tourPreview.readyTitle': 'Preview ready',\n 'tourPreview.startPreview': 'Start Preview',\n 'tourPreview.stepOf': 'Step',\n 'tourPreview.stepOfConnector': 'of',\n 'tourPreview.stopPreview': 'Stop Preview',\n 'tourPreview.validationErrorsTitle': 'Validation Errors',\n 'tourPreview.warningsTitle': 'Warnings',\n 'toursList.accessDeniedMessage': 'You do not have permission to view product tours.',\n 'toursList.accessDeniedTitle': 'Access Denied',\n 'toursList.actionArchive': 'Archive',\n 'toursList.actionDelete': 'Delete',\n 'toursList.actionDuplicate': 'Duplicate',\n 'toursList.actionPublish': 'Publish',\n 'toursList.actionUnpublish': 'Unpublish',\n 'toursList.confirmDelete': 'Are you sure you want to delete this tour?',\n 'toursList.createTour': 'Create Tour',\n 'toursList.editStepsTitle': 'Edit Steps',\n 'toursList.emptySubtitle': 'Create your first tour to get started',\n 'toursList.emptyTitle': 'No tours found',\n 'toursList.errorArchive': 'Failed to archive tour',\n 'toursList.errorDelete': 'Failed to delete tour',\n 'toursList.errorDuplicate': 'Failed to duplicate tour',\n 'toursList.errorPublish': 'Failed to publish tour',\n 'toursList.errorUnpublish': 'Failed to unpublish tour',\n 'toursList.gridView': 'Grid view',\n 'toursList.listView': 'List view',\n 'toursList.loading': 'Loading tours...',\n 'toursList.moreActionsTitle': 'More actions',\n 'toursList.previewButton': 'Preview',\n 'toursList.previewTitle': 'Preview Tour',\n 'toursList.searchPlaceholder': 'Search tours...',\n 'toursList.settingsTitle': 'Settings',\n 'toursList.statusAll': 'All Statuses',\n 'toursList.statusArchived': 'Archived',\n 'toursList.statusDraft': 'Draft',\n 'toursList.statusPublished': 'Published',\n 'toursList.statusScheduled': 'Scheduled',\n 'toursList.steps': 'steps',\n 'toursList.stepsButton': 'Steps',\n 'toursList.subtitle': 'Create and manage interactive product tours',\n 'toursList.title': 'Product Tours',\n 'toursList.views': 'views',\n\n // User-facing surface (BOFF-2391: My Tours + My Progress).\n 'myTours.title': 'My Tours',\n 'myTours.subtitle': 'Walkthroughs available in this product. Take a tour to learn a feature.',\n 'myTours.loading': 'Loading...',\n 'myTours.empty': 'No tours are available in this context yet.',\n 'myTours.status.completed': 'Completed',\n 'myTours.status.inProgress': 'In progress',\n 'myTours.status.skipped': 'Skipped',\n 'myTours.status.notStarted': 'Not started',\n 'myTours.notFoundTitle': 'Page not found',\n 'myTours.notFoundBody': \"That tour page isn't available — returning to My Tours.\",\n\n 'myToursProgress.title': 'My Progress',\n 'myToursProgress.subtitle': 'Tours you have started, completed, or skipped.',\n 'myToursProgress.loading': 'Loading...',\n 'myToursProgress.inProgress': 'In progress',\n 'myToursProgress.completed': 'Completed',\n 'myToursProgress.skipped': 'Skipped or dismissed',\n 'myToursProgress.emptyInProgress': 'No tours in progress.',\n 'myToursProgress.emptyCompleted': 'No completed tours yet.',\n 'myToursProgress.emptySkipped': 'No skipped tours.',\n 'myToursProgress.other': 'Other',\n 'myToursProgress.emptyOther': 'No tours in other states.',\n} as const;\n\nexport type ToursTranslationKey = keyof typeof toursTranslationFallbacks;\n\ntype TranslationParams = Record<string, string | number>;\n\nexport function useToursI18n() {\n const i18n = useI18n();\n // The installed fe-libs typings still expose the older 2-argument shape, but the\n // runtime provider supports fallback strings. Narrow locally so this MFE can rely\n // on fallback-backed translations without changing the shared package here.\n const translateWithFallback = i18n.t as (key: string, fallback?: string) => string;\n\n const tr = useCallback(\n (key: ToursTranslationKey, params?: TranslationParams): string => {\n const resolved = translateWithFallback(key, toursTranslationFallbacks[key]);\n\n if (!params) {\n return resolved;\n }\n\n return Object.entries(params).reduce(\n (value, [paramKey, paramValue]) => value.replace(`{{${paramKey}}}`, String(paramValue)),\n resolved\n );\n },\n [translateWithFallback]\n );\n\n return {\n ...i18n,\n tr,\n };\n}\n\nexport function getToursTranslationFallback(key: ToursTranslationKey) {\n return toursTranslationFallbacks[key];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"i18n.js","names":[],"sources":["../../src/tours/i18n.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\nconst toursTranslationFallbacks = {\n 'stepEditor.addFirstStep': 'Add First Step',\n 'stepEditor.addStep': 'Add Step',\n 'stepEditor.clickAddStep': 'Click \"Add Step\" to create one',\n 'stepEditor.closeSteps': 'Close steps',\n 'stepEditor.content': 'Content',\n 'stepEditor.contentPlaceholder': 'Enter step content or instructions',\n 'stepEditor.createFirstStep': 'Create your first step to get started',\n 'stepEditor.cssSelector': 'CSS Selector',\n 'stepEditor.cssSelectorPlaceholder': \"[data-tour='element-name'] or #id or .class\",\n 'stepEditor.dataTourHint': \"Use data-tour attributes like [data-tour='sidenav'] for best results\",\n 'stepEditor.deleteStep': 'Delete step',\n 'stepEditor.desktopSelector': 'Desktop Selector',\n 'stepEditor.deviceSelectorHint': 'Override the default selector for specific device types',\n 'stepEditor.deviceSpecificSelectors': 'Device-Specific Selectors (Advanced)',\n 'stepEditor.editStep': 'Edit Step',\n 'stepEditor.goBack': 'Go back',\n 'stepEditor.leaveEmptyDefault': 'Leave empty to use default',\n 'stepEditor.mobileSelector': 'Mobile Selector',\n 'stepEditor.noStepSelected': 'No step selected',\n 'stepEditor.noStepsYet': 'No steps yet',\n 'stepEditor.of': 'of',\n 'stepEditor.nextStep': 'Next step',\n 'stepEditor.placementAuto': 'Auto (recommended)',\n 'stepEditor.placementBottom': 'Bottom',\n 'stepEditor.placementCenter': 'Center (modal style)',\n 'stepEditor.placementLeft': 'Left',\n 'stepEditor.placementRight': 'Right',\n 'stepEditor.placementTop': 'Top',\n 'stepEditor.previousStep': 'Previous step',\n 'stepEditor.save': 'Save',\n 'stepEditor.saving': 'Saving...',\n 'stepEditor.selectStepToEdit': 'Select a step from the list to edit it',\n 'stepEditor.stepNumber': 'Step',\n 'stepEditor.steps': 'Steps',\n 'stepEditor.stepsCount': 'steps',\n 'stepEditor.stepsLabel': 'Steps',\n 'stepEditor.stepTitle': 'Step Title',\n 'stepEditor.stepTitlePlaceholder': 'Enter step title',\n 'stepEditor.tabletSelector': 'Tablet Selector',\n 'stepEditor.targetElement': 'target element',\n 'stepEditor.tooltipPlacement': 'Tooltip Placement',\n 'stepEditor.tourFallback': 'Tour',\n 'stepEditor.tourSteps': 'Tour Steps',\n 'stepEditor.untitled': 'Untitled',\n 'templateLibrary.adjustFilters': 'Try adjusting your filters or search query',\n 'templateLibrary.allCategories': 'All Categories',\n 'templateLibrary.categoryCustom': 'Custom',\n 'templateLibrary.categoryFeatureAnnouncement': 'Feature Announcement',\n 'templateLibrary.categoryHelp': 'Help',\n 'templateLibrary.categoryOnboarding': 'Onboarding',\n 'templateLibrary.deleteConfirm': 'Delete this template?',\n 'templateLibrary.deleteTemplate': 'Delete template',\n 'templateLibrary.loading': 'Loading templates...',\n 'templateLibrary.noTemplatesFound': 'No templates found',\n 'templateLibrary.publicOnly': 'Public only',\n 'templateLibrary.searchPlaceholder': 'Search templates...',\n 'templateLibrary.subtitle': 'Browse and use pre-built tour templates',\n 'templateLibrary.times': 'times',\n 'templateLibrary.title': 'Tour Templates',\n 'templateLibrary.useTemplate': 'Use Template',\n 'templateLibrary.usedTimes': 'Used',\n 'tourBuilder.analytics': 'Analytics',\n 'tourBuilder.createAndAddSteps': 'Create & Add Steps',\n 'tourBuilder.editSteps': 'Edit Steps',\n 'tourBuilder.errorTitle': 'Error',\n 'tourBuilder.goBack': 'Go back',\n 'tourBuilder.labelDescription': 'Description',\n 'tourBuilder.labelName': 'Tour Name *',\n 'tourBuilder.labelPriority': 'Priority (1-100)',\n 'tourBuilder.labelProductId': 'Product ID *',\n 'tourBuilder.labelTriggerType': 'Trigger Type',\n 'tourBuilder.preview': 'Preview',\n 'tourBuilder.saving': 'Saving...',\n 'tourBuilder.sectionBasicInfo': 'Basic Information',\n 'tourBuilder.sectionTriggerSettings': 'Trigger Settings',\n 'tourBuilder.subtitle': 'Configure tour details and settings',\n 'tourBuilder.titleCreate': 'Create Tour',\n 'tourBuilder.titleEdit': 'Edit Tour',\n 'tourBuilder.triggerAutoAlways': 'Auto (Always)',\n 'tourBuilder.triggerAutoFirstVisit': 'Auto (First Visit)',\n 'tourBuilder.triggerManual': 'Manual',\n 'tourBuilder.triggerOnEvent': 'On Event',\n 'tourBuilder.triggerScheduled': 'Scheduled',\n 'tourBuilder.updateTour': 'Update Tour',\n 'tourBuilder.validationErrorsTitle': 'Validation Errors',\n 'tourPreview.accessDeniedMessage': 'You do not have permission to preview this tour.',\n 'tourPreview.accessDeniedTitle': 'Access Denied',\n 'tourPreview.deviceDesktop': 'Desktop preview',\n 'tourPreview.deviceMobile': 'Mobile preview',\n 'tourPreview.deviceTablet': 'Tablet preview',\n 'tourPreview.finish': 'Finish',\n 'tourPreview.loading': 'Loading tour...',\n 'tourPreview.next': 'Next',\n 'tourPreview.nextFooter': 'Next',\n 'tourPreview.previewSuffix': 'Preview',\n 'tourPreview.previous': 'Previous',\n 'tourPreview.readyHint': 'Click \"Start Preview\" to begin',\n 'tourPreview.readyTitle': 'Preview ready',\n 'tourPreview.startPreview': 'Start Preview',\n 'tourPreview.stepOf': 'Step',\n 'tourPreview.stepOfConnector': 'of',\n 'tourPreview.stopPreview': 'Stop Preview',\n 'tourPreview.validationErrorsTitle': 'Validation Errors',\n 'tourPreview.warningsTitle': 'Warnings',\n 'toursList.accessDeniedMessage': 'You do not have permission to view product tours.',\n 'toursList.accessDeniedTitle': 'Access Denied',\n 'toursList.actionArchive': 'Archive',\n 'toursList.actionDelete': 'Delete',\n 'toursList.actionDuplicate': 'Duplicate',\n 'toursList.actionPublish': 'Publish',\n 'toursList.actionUnpublish': 'Unpublish',\n 'toursList.confirmDelete': 'Are you sure you want to delete this tour?',\n 'toursList.createTour': 'Create Tour',\n 'toursList.editStepsTitle': 'Edit Steps',\n 'toursList.emptySubtitle': 'Create your first tour to get started',\n 'toursList.emptyTitle': 'No tours found',\n 'toursList.errorArchive': 'Failed to archive tour',\n 'toursList.errorDelete': 'Failed to delete tour',\n 'toursList.errorDuplicate': 'Failed to duplicate tour',\n 'toursList.errorPublish': 'Failed to publish tour',\n 'toursList.errorUnpublish': 'Failed to unpublish tour',\n 'toursList.gridView': 'Grid view',\n 'toursList.listView': 'List view',\n 'toursList.loading': 'Loading tours...',\n 'toursList.moreActionsTitle': 'More actions',\n 'toursList.previewButton': 'Preview',\n 'toursList.previewTitle': 'Preview Tour',\n 'toursList.searchPlaceholder': 'Search tours...',\n 'toursList.settingsTitle': 'Settings',\n 'toursList.statusAll': 'All Statuses',\n 'toursList.statusArchived': 'Archived',\n 'toursList.statusDraft': 'Draft',\n 'toursList.statusPublished': 'Published',\n 'toursList.statusScheduled': 'Scheduled',\n 'toursList.steps': 'steps',\n 'toursList.stepsButton': 'Steps',\n 'toursList.subtitle': 'Create and manage interactive product tours',\n 'toursList.title': 'Product Tours',\n 'toursList.views': 'views',\n\n // User-facing surface (BOFF-2391: My Tours + My Progress).\n 'myTours.title': 'My Tours',\n 'myTours.subtitle': 'Walkthroughs available in this product. Take a tour to learn a feature.',\n 'myTours.loading': 'Loading...',\n 'myTours.empty': 'No tours are available in this context yet.',\n 'myTours.status.completed': 'Completed',\n 'myTours.status.inProgress': 'In progress',\n 'myTours.status.skipped': 'Skipped',\n 'myTours.status.notStarted': 'Not started',\n 'myTours.notFoundTitle': 'Page not found',\n 'myTours.notFoundBody': \"That tour page isn't available — returning to My Tours.\",\n\n 'myToursProgress.title': 'My Progress',\n 'myToursProgress.subtitle': 'Tours you have started, completed, or skipped.',\n 'myToursProgress.loading': 'Loading...',\n 'myToursProgress.inProgress': 'In progress',\n 'myToursProgress.completed': 'Completed',\n 'myToursProgress.skipped': 'Skipped or dismissed',\n 'myToursProgress.emptyInProgress': 'No tours in progress.',\n 'myToursProgress.emptyCompleted': 'No completed tours yet.',\n 'myToursProgress.emptySkipped': 'No skipped tours.',\n 'myToursProgress.other': 'Other',\n 'myToursProgress.emptyOther': 'No tours in other states.',\n} as const;\n\nexport type ToursTranslationKey = keyof typeof toursTranslationFallbacks;\n\ntype TranslationParams = Record<string, string | number>;\n\nexport function useToursI18n() {\n const i18n = useI18n();\n // The installed fe-libs typings still expose the older 2-argument shape, but the\n // runtime provider supports fallback strings. Narrow locally so this MFE can rely\n // on fallback-backed translations without changing the shared package here.\n const translateWithFallback = i18n.t as (key: string, fallback?: string) => string;\n\n const tr = useCallback(\n (key: ToursTranslationKey, params?: TranslationParams): string => {\n const resolved = translateWithFallback(key, toursTranslationFallbacks[key]);\n\n if (!params) {\n return resolved;\n }\n\n return Object.entries(params).reduce(\n (value, [paramKey, paramValue]) => value.replace(`{{${paramKey}}}`, String(paramValue)),\n resolved\n );\n },\n [translateWithFallback]\n );\n\n return {\n ...i18n,\n tr,\n };\n}\n\nexport function getToursTranslationFallback(key: ToursTranslationKey) {\n return toursTranslationFallbacks[key];\n}\n"],"mappings":"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"}
|
package/dist/tours/index.d.ts
CHANGED
|
@@ -18,4 +18,5 @@ export { ToursUserRoot } from './ToursUserRoot';
|
|
|
18
18
|
export type { ToursRootProps, ToursVariant } from './types';
|
|
19
19
|
export { useToursContext } from './providers/ToursProvider';
|
|
20
20
|
export { useToursStore } from './store/toursStore';
|
|
21
|
+
export { TOURS_RYBBIT_ALLOWLIST } from './telemetry';
|
|
21
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tours/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tours/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/tours/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/tours/pages/AnalyticsDashboardPage.tsx"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"AnalyticsDashboardPage.d.ts","sourceRoot":"","sources":["../../../src/tours/pages/AnalyticsDashboardPage.tsx"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,sBAAsB,4CAkMrC"}
|
|
@@ -20,7 +20,7 @@ function g() {
|
|
|
20
20
|
b,
|
|
21
21
|
x
|
|
22
22
|
]), !b && !x ? /* @__PURE__ */ f("div", {
|
|
23
|
-
className: "flex items-center justify-center h-full p-6",
|
|
23
|
+
className: "flex items-center justify-center h-full p-3 sm:p-6",
|
|
24
24
|
children: /* @__PURE__ */ p("div", {
|
|
25
25
|
className: "text-center",
|
|
26
26
|
children: [/* @__PURE__ */ f("h2", {
|
|
@@ -38,10 +38,10 @@ function g() {
|
|
|
38
38
|
children: _("analyticsDashboard.loading", "Loading analytics...")
|
|
39
39
|
})
|
|
40
40
|
}) : S ? /* @__PURE__ */ p("div", {
|
|
41
|
-
className: "space-y-6 p-6",
|
|
41
|
+
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
42
42
|
children: [
|
|
43
43
|
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
|
|
44
|
-
className: "text-2xl font-bold",
|
|
44
|
+
className: "text-xl sm:text-2xl font-bold",
|
|
45
45
|
children: _("analyticsDashboard.title", "Tour Analytics")
|
|
46
46
|
}), /* @__PURE__ */ f("p", {
|
|
47
47
|
className: "text-sm text-muted-foreground",
|
|
@@ -129,7 +129,7 @@ function g() {
|
|
|
129
129
|
]
|
|
130
130
|
}),
|
|
131
131
|
/* @__PURE__ */ p("div", {
|
|
132
|
-
className: "border border-border rounded-md p-6 bg-card",
|
|
132
|
+
className: "border border-border rounded-md p-4 sm:p-6 bg-card",
|
|
133
133
|
children: [/* @__PURE__ */ f("h2", {
|
|
134
134
|
className: "text-lg font-semibold mb-4",
|
|
135
135
|
children: _("analyticsDashboard.deviceBreakdown", "Device Breakdown")
|
|
@@ -159,7 +159,7 @@ function g() {
|
|
|
159
159
|
})]
|
|
160
160
|
}),
|
|
161
161
|
S.stepAnalytics && S.stepAnalytics.length > 0 && /* @__PURE__ */ p("div", {
|
|
162
|
-
className: "border border-border rounded-md p-6 bg-card",
|
|
162
|
+
className: "border border-border rounded-md p-4 sm:p-6 bg-card",
|
|
163
163
|
children: [/* @__PURE__ */ f("h2", {
|
|
164
164
|
className: "text-lg font-semibold mb-4",
|
|
165
165
|
children: _("analyticsDashboard.stepPerformance", "Step Performance")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsDashboardPage.js","names":[],"sources":["../../../src/tours/pages/AnalyticsDashboardPage.tsx"],"sourcesContent":["import { useCallback, useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { BarChart3, TrendingUp, Users, Timer } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useTourAnalytics } from '../hooks/useTourAnalytics';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport { formatNumber, formatPercentage, formatDuration } from '../utils';\n\n/**\n * Analytics dashboard page\n * Display tour performance metrics and charts\n */\nexport function AnalyticsDashboardPage() {\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const { tourId } = useParams();\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const canViewAnalytics = hasPermission(TOUR_PERMISSIONS.TOUR_ANALYTICS_READ);\n\n const { analytics, loading, fetchAnalytics, getCompletionRate, getSkipRate } =\n useTourAnalytics(tourId);\n\n useEffect(() => {\n if (permissionsLoading || !canViewAnalytics) return;\n fetchAnalytics();\n }, [fetchAnalytics, permissionsLoading, canViewAnalytics]);\n\n if (!permissionsLoading && !canViewAnalytics) {\n return (\n <div className=\"flex items-center justify-center h-full p-6\">\n <div className=\"text-center\">\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">\n {tr('analyticsDashboard.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'analyticsDashboard.noPermission',\n 'You do not have permission to view tour analytics.'\n )}\n </p>\n </div>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-muted-foreground\">\n {tr('analyticsDashboard.loading', 'Loading analytics...')}\n </p>\n </div>\n );\n }\n\n if (!analytics) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-muted-foreground\">\n {tr('analyticsDashboard.noData', 'No analytics data available')}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div>\n <h1 className=\"text-2xl font-bold\">{tr('analyticsDashboard.title', 'Tour Analytics')}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.subtitle', 'Performance metrics and insights')}\n </p>\n </div>\n\n {/* Summary Cards */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-primary/10 rounded-md\">\n <Users className=\"text-primary\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.totalViews', 'Total Views')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatNumber(analytics.totalViews)}</div>\n </div>\n\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-success/10 rounded-md\">\n <TrendingUp className=\"text-success\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.completionRate', 'Completion Rate')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatPercentage(getCompletionRate())}</div>\n </div>\n\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-warning/10 rounded-md\">\n <BarChart3 className=\"text-warning\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.skipRate', 'Skip Rate')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatPercentage(getSkipRate())}</div>\n </div>\n\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-info/10 rounded-md\">\n <Timer className=\"text-info\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.avgDuration', 'Avg Duration')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatDuration(analytics.averageDuration)}</div>\n </div>\n </div>\n\n {/* Device Breakdown */}\n <div className=\"border border-border rounded-md p-6 bg-card\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {tr('analyticsDashboard.deviceBreakdown', 'Device Breakdown')}\n </h2>\n <div className=\"space-y-3\">\n {analytics.byDeviceType.map((device) => (\n <div key={device.deviceType}>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm capitalize\">{device.deviceType}</span>\n <span className=\"text-sm text-muted-foreground\">\n {formatNumber(device.count)} views ({formatPercentage(device.completionRate)})\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full\"\n style={{ width: `${device.completionRate}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Step Analytics */}\n {analytics.stepAnalytics && analytics.stepAnalytics.length > 0 && (\n <div className=\"border border-border rounded-md p-6 bg-card\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {tr('analyticsDashboard.stepPerformance', 'Step Performance')}\n </h2>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border\">\n <th className=\"text-left py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableStep', 'Step')}\n </th>\n <th className=\"text-right py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableViews', 'Views')}\n </th>\n <th className=\"text-right py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableCompletions', 'Completions')}\n </th>\n <th className=\"text-right py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableDropOffRate', 'Drop-off Rate')}\n </th>\n </tr>\n </thead>\n <tbody>\n {analytics.stepAnalytics.map((step) => (\n <tr key={step.stepId} className=\"border-b border-border\">\n <td className=\"py-2 px-4 text-sm\">\n {tr('analyticsDashboard.stepLabel', 'Step')} {step.stepOrder}\n </td>\n <td className=\"text-right py-2 px-4 text-sm\">{formatNumber(step.views)}</td>\n <td className=\"text-right py-2 px-4 text-sm\">\n {formatNumber(step.completions)}\n </td>\n <td className=\"text-right py-2 px-4 text-sm\">\n {formatPercentage(step.dropOffRate)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,IAAyB;CACvC,IAAM,EAAE,SAAM,GAAS,EACjB,IAAK,GACR,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAE,CACJ,EAEK,EAAE,cAAW,GAAW,EACxB,EAAE,kBAAe,WAAW,MAAuB,GAA0B,EAC7E,IAAmB,EAAc,EAAiB,oBAAoB,EAEtE,EAAE,cAAW,YAAS,mBAAgB,sBAAmB,mBAC7D,EAAiB,EAAO;AA6C1B,QA3CA,QAAgB;AACV,OAAsB,CAAC,KAC3B,GAAgB;IACf;EAAC;EAAgB;EAAoB;EAAiB,CAAC,EAEtD,CAAC,KAAsB,CAAC,IAExB,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAG,mCAAmC,gBAAgB;IACpD,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,mCACA,qDACD;IACC,CAAA,CACA;;EACF,CAAA,GAIN,IAEA,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,KAAD;GAAG,WAAU;aACV,EAAG,8BAA8B,uBAAuB;GACvD,CAAA;EACA,CAAA,GAIL,IAWH,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAsB,EAAG,4BAA4B,iBAAiB;IAAM,CAAA,EAC1F,kBAAC,KAAD;IAAG,WAAU;cACV,EAAG,+BAA+B,mCAAmC;IACpE,CAAA,CACA,EAAA,CAAA;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD;SAAO,WAAU;SAAe,MAAM;SAAM,CAAA;QACxC,CAAA,EACN,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG,iCAAiC,cAAc;QAC9C,CAAA,CACH;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAsB,EAAa,EAAU,WAAW;OAAO,CAAA,CAC1E;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD;SAAY,WAAU;SAAe,MAAM;SAAM,CAAA;QAC7C,CAAA,EACN,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG,qCAAqC,kBAAkB;QACtD,CAAA,CACH;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAsB,EAAiB,GAAmB,CAAC;OAAO,CAAA,CAC7E;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD;SAAW,WAAU;SAAe,MAAM;SAAM,CAAA;QAC5C,CAAA,EACN,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG,+BAA+B,YAAY;QAC1C,CAAA,CACH;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAsB,EAAiB,GAAa,CAAC;OAAO,CAAA,CACvE;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD;SAAO,WAAU;SAAY,MAAM;SAAM,CAAA;QACrC,CAAA,EACN,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG,kCAAkC,eAAe;QAChD,CAAA,CACH;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAsB,EAAe,EAAU,gBAAgB;OAAO,CAAA,CACjF;;KACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAG,sCAAsC,mBAAmB;KAC1D,CAAA,EACL,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAU,aAAa,KAAK,MAC3B,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAsB,EAAO;OAAkB,CAAA,EAC/D,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACG,EAAa,EAAO,MAAM;QAAC;QAAS,EAAiB,EAAO,eAAe;QAAC;QACxE;SACH;SACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OACE,WAAU;OACV,OAAO,EAAE,OAAO,GAAG,EAAO,eAAe,IAAI;OAC7C,CAAA;MACE,CAAA,CACF,EAAA,EAbI,EAAO,WAaX,CACN;KACE,CAAA,CACF;;GAGL,EAAU,iBAAiB,EAAU,cAAc,SAAS,KAC3D,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAG,sCAAsC,mBAAmB;KAC1D,CAAA,EACL,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAG,gCAAgC,OAAO;SACxC,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAG,iCAAiC,QAAQ;SAC1C,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAG,uCAAuC,cAAc;SACtD,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAG,uCAAuC,gBAAgB;SACxD,CAAA;QACF;UACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAU,cAAc,KAAK,MAC5B,kBAAC,MAAD;OAAsB,WAAU;iBAAhC;QACE,kBAAC,MAAD;SAAI,WAAU;mBAAd;UACG,EAAG,gCAAgC,OAAO;UAAC;UAAE,EAAK;UAChD;;QACL,kBAAC,MAAD;SAAI,WAAU;mBAAgC,EAAa,EAAK,MAAM;SAAM,CAAA;QAC5E,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAa,EAAK,YAAY;SAC5B,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAiB,EAAK,YAAY;SAChC,CAAA;QACF;SAXI,EAAK,OAWT,CACL,EACI,CAAA,CACF;;KACJ,CAAA,CACF;;GAEJ;MA1IJ,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,KAAD;GAAG,WAAU;aACV,EAAG,6BAA6B,8BAA8B;GAC7D,CAAA;EACA,CAAA"}
|
|
1
|
+
{"version":3,"file":"AnalyticsDashboardPage.js","names":[],"sources":["../../../src/tours/pages/AnalyticsDashboardPage.tsx"],"sourcesContent":["import { useCallback, useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { BarChart3, TrendingUp, Users, Timer } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useTourAnalytics } from '../hooks/useTourAnalytics';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport { formatNumber, formatPercentage, formatDuration } from '../utils';\n\n/**\n * Analytics dashboard page\n * Display tour performance metrics and charts\n */\nexport function AnalyticsDashboardPage() {\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const { tourId } = useParams();\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const canViewAnalytics = hasPermission(TOUR_PERMISSIONS.TOUR_ANALYTICS_READ);\n\n const { analytics, loading, fetchAnalytics, getCompletionRate, getSkipRate } =\n useTourAnalytics(tourId);\n\n useEffect(() => {\n if (permissionsLoading || !canViewAnalytics) return;\n fetchAnalytics();\n }, [fetchAnalytics, permissionsLoading, canViewAnalytics]);\n\n if (!permissionsLoading && !canViewAnalytics) {\n return (\n <div className=\"flex items-center justify-center h-full p-3 sm:p-6\">\n <div className=\"text-center\">\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">\n {tr('analyticsDashboard.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'analyticsDashboard.noPermission',\n 'You do not have permission to view tour analytics.'\n )}\n </p>\n </div>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-muted-foreground\">\n {tr('analyticsDashboard.loading', 'Loading analytics...')}\n </p>\n </div>\n );\n }\n\n if (!analytics) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <p className=\"text-muted-foreground\">\n {tr('analyticsDashboard.noData', 'No analytics data available')}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div>\n <h1 className=\"text-xl sm:text-2xl font-bold\">\n {tr('analyticsDashboard.title', 'Tour Analytics')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.subtitle', 'Performance metrics and insights')}\n </p>\n </div>\n\n {/* Summary Cards */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-primary/10 rounded-md\">\n <Users className=\"text-primary\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.totalViews', 'Total Views')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatNumber(analytics.totalViews)}</div>\n </div>\n\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-success/10 rounded-md\">\n <TrendingUp className=\"text-success\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.completionRate', 'Completion Rate')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatPercentage(getCompletionRate())}</div>\n </div>\n\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-warning/10 rounded-md\">\n <BarChart3 className=\"text-warning\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.skipRate', 'Skip Rate')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatPercentage(getSkipRate())}</div>\n </div>\n\n <div className=\"border border-border rounded-md p-4 bg-card\">\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"p-2 bg-info/10 rounded-md\">\n <Timer className=\"text-info\" size={20} />\n </div>\n <span className=\"text-sm text-muted-foreground\">\n {tr('analyticsDashboard.avgDuration', 'Avg Duration')}\n </span>\n </div>\n <div className=\"text-2xl font-bold\">{formatDuration(analytics.averageDuration)}</div>\n </div>\n </div>\n\n {/* Device Breakdown */}\n <div className=\"border border-border rounded-md p-4 sm:p-6 bg-card\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {tr('analyticsDashboard.deviceBreakdown', 'Device Breakdown')}\n </h2>\n <div className=\"space-y-3\">\n {analytics.byDeviceType.map((device) => (\n <div key={device.deviceType}>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm capitalize\">{device.deviceType}</span>\n <span className=\"text-sm text-muted-foreground\">\n {formatNumber(device.count)} views ({formatPercentage(device.completionRate)})\n </span>\n </div>\n <div className=\"w-full bg-muted rounded-full h-2\">\n <div\n className=\"bg-primary h-2 rounded-full\"\n style={{ width: `${device.completionRate}%` }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Step Analytics */}\n {analytics.stepAnalytics && analytics.stepAnalytics.length > 0 && (\n <div className=\"border border-border rounded-md p-4 sm:p-6 bg-card\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {tr('analyticsDashboard.stepPerformance', 'Step Performance')}\n </h2>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border\">\n <th className=\"text-left py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableStep', 'Step')}\n </th>\n <th className=\"text-right py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableViews', 'Views')}\n </th>\n <th className=\"text-right py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableCompletions', 'Completions')}\n </th>\n <th className=\"text-right py-2 px-4 text-sm font-medium\">\n {tr('analyticsDashboard.tableDropOffRate', 'Drop-off Rate')}\n </th>\n </tr>\n </thead>\n <tbody>\n {analytics.stepAnalytics.map((step) => (\n <tr key={step.stepId} className=\"border-b border-border\">\n <td className=\"py-2 px-4 text-sm\">\n {tr('analyticsDashboard.stepLabel', 'Step')} {step.stepOrder}\n </td>\n <td className=\"text-right py-2 px-4 text-sm\">{formatNumber(step.views)}</td>\n <td className=\"text-right py-2 px-4 text-sm\">\n {formatNumber(step.completions)}\n </td>\n <td className=\"text-right py-2 px-4 text-sm\">\n {formatPercentage(step.dropOffRate)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaLibraryPage.d.ts","sourceRoot":"","sources":["../../../src/tours/pages/MediaLibraryPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MediaLibraryPage.d.ts","sourceRoot":"","sources":["../../../src/tours/pages/MediaLibraryPage.tsx"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,gBAAgB,4CA2L/B"}
|