@guided-tour-s4marth/react 0.1.0
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/LICENSE +21 -0
- package/dist/ReleaseSidebar.d.ts +8 -0
- package/dist/ReleaseSidebar.d.ts.map +1 -0
- package/dist/ReleaseSidebar.js +40 -0
- package/dist/ReleaseSidebar.js.map +1 -0
- package/dist/TourProvider.d.ts +34 -0
- package/dist/TourProvider.d.ts.map +1 -0
- package/dist/TourProvider.js +110 -0
- package/dist/TourProvider.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/useTour.d.ts +3 -0
- package/dist/useTour.d.ts.map +1 -0
- package/dist/useTour.js +10 -0
- package/dist/useTour.js.map +1 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DataGenie
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Tour } from '@guided-tour-s4marth/core';
|
|
3
|
+
export interface ReleaseSidebarProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
renderTourRow?: (tour: Tour, onPlay: () => void) => React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function ReleaseSidebar({ className, renderTourRow }: ReleaseSidebarProps): React.JSX.Element;
|
|
8
|
+
//# sourceMappingURL=ReleaseSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReleaseSidebar.d.ts","sourceRoot":"","sources":["../src/ReleaseSidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;CACrE;AAgDD,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,mBAAmB,qBA2C/E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useTour } from './useTour.js';
|
|
3
|
+
function DefaultTourRow({ tour, onPlay }) {
|
|
4
|
+
return (_jsxs("div", { style: {
|
|
5
|
+
display: 'flex',
|
|
6
|
+
alignItems: 'center',
|
|
7
|
+
justifyContent: 'space-between',
|
|
8
|
+
padding: '10px 16px',
|
|
9
|
+
borderBottom: '1px solid #1e293b',
|
|
10
|
+
}, children: [_jsxs("div", { children: [_jsx("div", { style: { fontWeight: 600, fontSize: '14px', color: '#000' }, children: tour.title ?? tour.id }), tour.version && (_jsxs("div", { style: { fontSize: '12px', color: '#000', marginTop: 2 }, children: ["v", tour.version] })), tour.status !== 'active' && (_jsx("div", { style: { fontSize: '11px', color: '#f59e0b', marginTop: 2 }, children: tour.status }))] }), _jsx("button", { onClick: onPlay, disabled: tour.status === 'archived', style: {
|
|
11
|
+
padding: '6px 14px',
|
|
12
|
+
borderRadius: '6px',
|
|
13
|
+
border: 'none',
|
|
14
|
+
background: tour.status === 'archived' ? '#334155' : 'var(--tour-primary, #6366f1)',
|
|
15
|
+
color: tour.status === 'archived' ? '#64748b' : '#fff',
|
|
16
|
+
cursor: tour.status === 'archived' ? 'not-allowed' : 'pointer',
|
|
17
|
+
fontSize: '13px',
|
|
18
|
+
fontWeight: 500,
|
|
19
|
+
}, children: tour.status === 'archived' ? 'Archived' : '▶ Play' })] }));
|
|
20
|
+
}
|
|
21
|
+
export function ReleaseSidebar({ className, renderTourRow }) {
|
|
22
|
+
const { tours, startTour, activeTourId } = useTour();
|
|
23
|
+
const releaseTours = tours.filter(t => t.type === 'release');
|
|
24
|
+
if (!releaseTours.length) {
|
|
25
|
+
return (_jsx("div", { className: className, style: { padding: '24px 16px', color: '#64748b', fontSize: '14px', textAlign: 'center' }, children: "No release tours yet." }));
|
|
26
|
+
}
|
|
27
|
+
return (_jsxs("div", { className: className, style: { fontFamily: 'var(--tour-font, inherit)' }, children: [_jsx("div", { style: {
|
|
28
|
+
padding: '12px 16px',
|
|
29
|
+
borderBottom: '1px solid #1e293b',
|
|
30
|
+
fontSize: '13px',
|
|
31
|
+
fontWeight: 600,
|
|
32
|
+
color: '#94a3b8',
|
|
33
|
+
textTransform: 'uppercase',
|
|
34
|
+
letterSpacing: '0.05em',
|
|
35
|
+
}, children: "Release Tours" }), releaseTours.map(tour => {
|
|
36
|
+
const onPlay = () => void startTour(tour.id);
|
|
37
|
+
return (_jsx("div", { style: { opacity: activeTourId === tour.id ? 0.6 : 1 }, children: renderTourRow ? renderTourRow(tour, onPlay) : _jsx(DefaultTourRow, { tour: tour, onPlay: onPlay }) }, tour.id));
|
|
38
|
+
})] }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ReleaseSidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReleaseSidebar.js","sourceRoot":"","sources":["../src/ReleaseSidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type Tour, type ThemeOverrides, type SeenStore, type AnchorMetaMap } from '@guided-tour-s4marth/core';
|
|
3
|
+
export interface TourProviderProps {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
fetchTours: () => Promise<unknown[]>;
|
|
6
|
+
appVersion: string;
|
|
7
|
+
userContext: {
|
|
8
|
+
userId?: string;
|
|
9
|
+
role?: string;
|
|
10
|
+
flags?: Record<string, boolean>;
|
|
11
|
+
};
|
|
12
|
+
theme?: ThemeOverrides;
|
|
13
|
+
seenStore?: SeenStore;
|
|
14
|
+
anchorMeta?: AnchorMetaMap;
|
|
15
|
+
customPredicates?: Record<string, () => boolean>;
|
|
16
|
+
navigate?: (route: string) => void | Promise<void>;
|
|
17
|
+
waitForElement?: (selector: string, timeoutMs?: number) => Promise<Element | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Auto-start the tour the backend marked `autoplay: true` (the newest unseen
|
|
20
|
+
* release for this user), once per session. Set false to disable. Default true.
|
|
21
|
+
*/
|
|
22
|
+
autoPlay?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface TourContextValue {
|
|
25
|
+
tours: Tour[];
|
|
26
|
+
eligibleTours: Tour[];
|
|
27
|
+
activeTourId: string | null;
|
|
28
|
+
currentStepIndex: number;
|
|
29
|
+
startTour: (tourId: string) => Promise<void>;
|
|
30
|
+
stopTour: () => void;
|
|
31
|
+
}
|
|
32
|
+
export declare const TourContext: React.Context<TourContextValue | null>;
|
|
33
|
+
export declare function TourProvider({ children, fetchTours, appVersion, userContext, theme, seenStore, anchorMeta, customPredicates, navigate, waitForElement, autoPlay, }: TourProviderProps): React.JSX.Element;
|
|
34
|
+
//# sourceMappingURL=TourProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TourProvider.d.ts","sourceRoot":"","sources":["../src/TourProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AACf,OAAO,EAKL,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,aAAa,EAEnB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;IACF,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACnF;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAGD,eAAO,MAAM,WAAW,wCAA+C,CAAC;AAExE,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,KAAK,EACL,SAA0B,EAC1B,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,QAAe,GAChB,EAAE,iBAAiB,qBAmHnB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
3
|
+
import { parseTours, isTourEligible, playTour, localSeenStore, } from '@guided-tour-s4marth/core';
|
|
4
|
+
// eslint-disable-next-line react-refresh/only-export-components
|
|
5
|
+
export const TourContext = createContext(null);
|
|
6
|
+
export function TourProvider({ children, fetchTours, appVersion, userContext, theme, seenStore = localSeenStore, anchorMeta, customPredicates, navigate, waitForElement, autoPlay = true, }) {
|
|
7
|
+
const [tours, setTours] = useState([]);
|
|
8
|
+
const [seenTours, setSeenTours] = useState(new Set());
|
|
9
|
+
const [activeTourId, setActiveTourId] = useState(null);
|
|
10
|
+
const [currentStepIndex, setCurrentStepIndex] = useState(0);
|
|
11
|
+
const userId = userContext.userId ?? 'anonymous';
|
|
12
|
+
const stopRef = useRef(null);
|
|
13
|
+
// autoPlayedRef: prevents replaying the auto-play tour in the same session.
|
|
14
|
+
// initialLoadRef: ensures auto-play only evaluates on the first non-empty tours
|
|
15
|
+
// fetch — subsequent changes (e.g. cache invalidation after recorder create) are ignored.
|
|
16
|
+
const autoPlayedRef = useRef(false);
|
|
17
|
+
const initialLoadRef = useRef(false);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
fetchTours()
|
|
20
|
+
.then(raw => setTours(parseTours(raw)))
|
|
21
|
+
.catch(err => console.error('[tour] failed to fetch tours:', err));
|
|
22
|
+
}, [fetchTours]);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
seenStore.getAll(userId).then(seen => setSeenTours(new Set(seen)));
|
|
25
|
+
}, [seenStore, userId]);
|
|
26
|
+
const runtimeCtx = useMemo(() => {
|
|
27
|
+
const ctx = {
|
|
28
|
+
route: typeof window !== 'undefined' ? window.location.pathname : '/',
|
|
29
|
+
appVersion,
|
|
30
|
+
flags: userContext.flags ?? {},
|
|
31
|
+
seenTours,
|
|
32
|
+
};
|
|
33
|
+
if (userContext.role)
|
|
34
|
+
ctx.role = userContext.role;
|
|
35
|
+
if (customPredicates)
|
|
36
|
+
ctx.customPredicates = customPredicates;
|
|
37
|
+
return ctx;
|
|
38
|
+
}, [appVersion, userContext.role, userContext.flags, seenTours, customPredicates]);
|
|
39
|
+
const eligibleTours = useMemo(() => tours.filter(t => isTourEligible(t, runtimeCtx)), [tours, runtimeCtx]);
|
|
40
|
+
const stopTour = useCallback(() => {
|
|
41
|
+
stopRef.current?.();
|
|
42
|
+
setActiveTourId(null);
|
|
43
|
+
setCurrentStepIndex(0);
|
|
44
|
+
}, []);
|
|
45
|
+
const startTour = useCallback(async (tourId) => {
|
|
46
|
+
const tour = tours.find(t => t.id === tourId);
|
|
47
|
+
if (!tour) {
|
|
48
|
+
console.warn(`[tour] tour not found: "${tourId}"`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
stopTour();
|
|
52
|
+
setActiveTourId(tourId);
|
|
53
|
+
setCurrentStepIndex(0);
|
|
54
|
+
let stopped = false;
|
|
55
|
+
stopRef.current = () => { stopped = true; };
|
|
56
|
+
const opts = { tour };
|
|
57
|
+
if (anchorMeta)
|
|
58
|
+
opts.anchorMeta = anchorMeta;
|
|
59
|
+
if (theme)
|
|
60
|
+
opts.theme = theme;
|
|
61
|
+
if (navigate)
|
|
62
|
+
opts.navigate = navigate;
|
|
63
|
+
if (waitForElement)
|
|
64
|
+
opts.waitForElement = waitForElement;
|
|
65
|
+
// Completing and cancelling both mark the tour seen so it won't
|
|
66
|
+
// auto-play again. Manual replays via startTour() still work.
|
|
67
|
+
const finalize = async () => {
|
|
68
|
+
await seenStore.markSeen(userId, tourId);
|
|
69
|
+
setSeenTours(prev => new Set([...prev, tourId]));
|
|
70
|
+
setActiveTourId(null);
|
|
71
|
+
setCurrentStepIndex(0);
|
|
72
|
+
};
|
|
73
|
+
opts.onComplete = () => { if (!stopped)
|
|
74
|
+
void finalize(); };
|
|
75
|
+
opts.onSkip = () => { if (!stopped)
|
|
76
|
+
void finalize(); };
|
|
77
|
+
opts.onStepChange = (index) => { if (!stopped)
|
|
78
|
+
setCurrentStepIndex(index); };
|
|
79
|
+
// No step could render (all anchors missing) — clear state but DON'T mark
|
|
80
|
+
// seen, so the tour can show once the anchors are fixed/deployed.
|
|
81
|
+
opts.onUnavailable = () => {
|
|
82
|
+
if (!stopped) {
|
|
83
|
+
setActiveTourId(null);
|
|
84
|
+
setCurrentStepIndex(0);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
await playTour(opts);
|
|
88
|
+
}, [tours, anchorMeta, theme, navigate, waitForElement, seenStore, userId, stopTour]);
|
|
89
|
+
// Auto-play the backend-designated tour (autoplay: true) once per session,
|
|
90
|
+
// evaluated only on the first non-empty tours load. Subsequent tours changes
|
|
91
|
+
// (e.g. cache invalidation after the recorder creates a new tour) are ignored.
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (!autoPlay || activeTourId || autoPlayedRef.current || tours.length === 0)
|
|
94
|
+
return;
|
|
95
|
+
if (initialLoadRef.current)
|
|
96
|
+
return;
|
|
97
|
+
initialLoadRef.current = true;
|
|
98
|
+
// Pick from eligibleTours (not all tours) so the autoplay tour still has to
|
|
99
|
+
// satisfy its conditions (route/role/version/flag) — the backend `autoplay`
|
|
100
|
+
// flag only encodes newest/active/unseen, not eligibility.
|
|
101
|
+
const candidate = eligibleTours.find(t => t.autoplay && !seenTours.has(t.id));
|
|
102
|
+
if (candidate) {
|
|
103
|
+
autoPlayedRef.current = true;
|
|
104
|
+
void startTour(candidate.id);
|
|
105
|
+
}
|
|
106
|
+
}, [autoPlay, activeTourId, tours, eligibleTours, seenTours, startTour]);
|
|
107
|
+
const value = useMemo(() => ({ tours, eligibleTours, activeTourId, currentStepIndex, startTour, stopTour }), [tours, eligibleTours, activeTourId, currentStepIndex, startTour, stopTour]);
|
|
108
|
+
return _jsx(TourContext.Provider, { value: value, children: children });
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=TourProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TourProvider.js","sourceRoot":"","sources":["../src/TourProvider.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { TourProvider } from './TourProvider.js';
|
|
2
|
+
export type { TourProviderProps, TourContextValue } from './TourProvider.js';
|
|
3
|
+
export { TourContext } from './TourProvider.js';
|
|
4
|
+
export { useTour } from './useTour.js';
|
|
5
|
+
export { ReleaseSidebar } from './ReleaseSidebar.js';
|
|
6
|
+
export type { ReleaseSidebarProps } from './ReleaseSidebar.js';
|
|
7
|
+
export type { Tour, Step, Condition, ThemeOverrides, TourEvent, TelemetryHandler, SeenStore, AnchorMetaMap, } from '@guided-tour-s4marth/core';
|
|
8
|
+
export { setTelemetryHandler, PREVIEW_TOUR_ID, localSeenStore, createBackendSeenStore, parseTour, parseTours, } from '@guided-tour-s4marth/core';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,YAAY,EACV,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,aAAa,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,UAAU,GACX,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Note: import 'driver.js/dist/driver.css' in your app entry point.
|
|
2
|
+
export { TourProvider } from './TourProvider.js';
|
|
3
|
+
export { TourContext } from './TourProvider.js';
|
|
4
|
+
export { useTour } from './useTour.js';
|
|
5
|
+
export { ReleaseSidebar } from './ReleaseSidebar.js';
|
|
6
|
+
export { setTelemetryHandler, PREVIEW_TOUR_ID, localSeenStore, createBackendSeenStore, parseTour, parseTours, } from '@guided-tour-s4marth/core';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAcrD,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,UAAU,GACX,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTour.d.ts","sourceRoot":"","sources":["../src/useTour.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,wBAAgB,OAAO,IAAI,gBAAgB,CAM1C"}
|
package/dist/useTour.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { TourContext } from './TourProvider.js';
|
|
3
|
+
export function useTour() {
|
|
4
|
+
const ctx = useContext(TourContext);
|
|
5
|
+
if (!ctx) {
|
|
6
|
+
throw new Error('useTour must be used inside <TourProvider>');
|
|
7
|
+
}
|
|
8
|
+
return ctx;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=useTour.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTour.js","sourceRoot":"","sources":["../src/useTour.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AAEvE,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@guided-tour-s4marth/react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "React bindings for the guided tour runtime",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "DataGenie",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"guided-tour",
|
|
9
|
+
"onboarding",
|
|
10
|
+
"product-tour",
|
|
11
|
+
"react"
|
|
12
|
+
],
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/samarthrgb/guided-tour",
|
|
16
|
+
"directory": "packages/tour-react"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"type": "module",
|
|
22
|
+
"sideEffects": false,
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"main": "./dist/index.js",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@guided-tour-s4marth/core": "0.1.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": ">=18.0.0",
|
|
39
|
+
"react-dom": ">=18.0.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/react": "^18.3.12",
|
|
43
|
+
"@types/react-dom": "^18.3.1",
|
|
44
|
+
"react": "^18.3.1",
|
|
45
|
+
"react-dom": "^18.3.1",
|
|
46
|
+
"typescript": "^5.7.2"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsc -p tsconfig.build.json",
|
|
50
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
51
|
+
"typecheck": "tsc --noEmit",
|
|
52
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
53
|
+
}
|
|
54
|
+
}
|